ZGlmZiAtLWdpdCBhL0RvYy9FUFBsdXNEb2Muc2hmYnByb2ogYi9Eb2MvRVBQbHVzRG9jLnNoZmJwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjYwMzY0Li4wMDAwMDAwCi0tLSBhL0RvYy9FUFBsdXNEb2Muc2hmYnByb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgVG9vbHNWZXJzaW9uPSI0LjAiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8IS0tIFRoZSBjb25maWd1cmF0aW9uIGFuZCBwbGF0Zm9ybSB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoCi0gICAgICAgICBhc3NlbWJsaWVzIHRvIGluY2x1ZGUgZnJvbSBzb2x1dGlvbiBhbmQgcHJvamVjdCBkb2N1bWVudGF0aW9uCi0gICAgICAgICBzb3VyY2VzIC0tPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+Ci0gICAgPFByb2plY3RHdWlkPns5YjNjZjkzMC1hMmJhLTRkOGUtYWIyMC05OTc1MDNiODAyNGJ9PC9Qcm9qZWN0R3VpZD4KLSAgICA8U0hGQlNjaGVtYVZlcnNpb24+MS45LjkuMDwvU0hGQlNjaGVtYVZlcnNpb24+Ci0gICAgPCEtLSBBc3NlbWJseU5hbWUsIE5hbWUsIGFuZCBSb290TmFtZXNwYWNlIGFyZSBub3QgdXNlZCBieSBTSEZCIGJ1dCBWaXN1YWwKLSAgICAgICAgIFN0dWRpbyBhZGRzIHRoZW0gYW55d2F5IC0tPgotICAgIDxBc3NlbWJseU5hbWU+RG9jdW1lbnRhdGlvbjwvQXNzZW1ibHlOYW1lPgotICAgIDxSb290TmFtZXNwYWNlPkRvY3VtZW50YXRpb248L1Jvb3ROYW1lc3BhY2U+Ci0gICAgPE5hbWU+RG9jdW1lbnRhdGlvbjwvTmFtZT4KLSAgICA8IS0tIFNIRkIgcHJvcGVydGllcyAtLT4KLSAgICA8T3V0cHV0UGF0aD4uXEhlbHBcPC9PdXRwdXRQYXRoPgotICAgIDxIdG1sSGVscE5hbWU+RVBQbHVzIDQuMDwvSHRtbEhlbHBOYW1lPgotICAgIDxGcmFtZXdvcmtWZXJzaW9uPi5ORVQgRnJhbWV3b3JrIDMuNTwvRnJhbWV3b3JrVmVyc2lvbj4KLSAgICA8RG9jdW1lbnRhdGlvblNvdXJjZXM+Ci0gICAgICA8RG9jdW1lbnRhdGlvblNvdXJjZSBzb3VyY2VGaWxlPSIuLlxFUFBsdXNcYmluXFJlbGVhc2VcRVBQbHVzLmRsbCIgLz4KLSAgICAgIDxEb2N1bWVudGF0aW9uU291cmNlIHNvdXJjZUZpbGU9Ii4uXEVQUGx1c1xiaW5cUmVsZWFzZVxFUFBsdXMuWE1MIiAvPgotICAgIDwvRG9jdW1lbnRhdGlvblNvdXJjZXM+Ci0gICAgPFByb2plY3RTdW1tYXJ5PkVQUGx1cyBpcyBhIC5uZXQgbGlicmFyeSB0aGF0IHJlYWRzIGFuZCB3cml0ZXMgRXhjZWwgZmlsZXMgdXNpbmcgdGhlIE9wZW4gT2ZmaWNlIFhtbCBmb3JtYXQuIAotRVBQbHVzIHN1cHBvcnRzIHJhbmdlcywgY2VsbCBzdHlsaW5nLCBjaGFydHMsIHBpY3R1cmUsIHNoYXBlcywgbmFtZWQgcmFuZ2VzLCBjb21tZW50cyx0YWJsZXMgYW5kIGEgbG90IG9mIG90aGVyIHN0dWZmLgotRVBQbHVzIHN0YXJ0ZWQgd2l0aCB0aGUgc291cmNlIGZyb20gdGhlIEV4Y2VsUGFja2FnZSBwcm9qZWN0IGhvc3RlZCBvbiBDb2RlUGxleC48L1Byb2plY3RTdW1tYXJ5PgotICAgIDxOYW1lc3BhY2VTdW1tYXJpZXM+Ci0gICAgICA8TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbCIgaXNEb2N1bWVudGVkPSJUcnVlIj5UaGlzIGlzIHRoZSBtYWluIG5hbWVzcGFjZSBmb3IgRVBQbHVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkRyYXdpbmciIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgYWxsIGNsYXNzZXMgcmVsYXRlZCB0byBkcmF3aW5ncy4gRHJhd2luZyBvYmplY3RzIGFyZSBDaGFydHMsIFNoYXBlcyBhbmQgUGljdHVyZXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydCIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBjaGFydCBjbGFzc2VzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlN0eWxlIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgZm9yIGNlbGwgc3R5bGluZyBhbmQgbmFtZWQgc3R5bGVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyB0aGUgY2xhc3NlcyB0aGF0IHdyaXRlIHRoZSBzdHlsZSB4bWw8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyB1c2VkIGZvciBWbWwgZHJhd2luZ3MuIFZtbCBkcmF3aW5ncyBhcmUgdXNlZCBmb3IgY29tbWVudHMgYW5kIGJhY2tncm91bmQgaW1hZ2VzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlRhYmxlIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIHRoZSBjbGFzc2VzIHVzZWQgZm9yIEV4Y2VsIHRhYmxlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbiIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBjbGFzc2VzIGZvciBEYXRhdmFsaWRhdGlvbjwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGNsYXNzZXMgZm9yIEV4Y2VsIFBpdm90dGFibGVzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlV0aWxzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkludGVybmFsIHV0aWxpdHkgY2xhc3NlczwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmciIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0dGluZzwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyBmb3IgZGlmZmVyZW50aWFsIHN0eWxpbmcuIEVQUGx1cyBvbmx5IHN1cHBvcnQgZHhmIHN0eWxpbmcgaW4gY29uZGl0aW9uYWwgZm9ybWF0dGluZyBhdCB0aGlzIHBvaW50PC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlZCQSIgaXNEb2N1bWVudGVkPSJUcnVlIj5Db250YWlucyBjbGFzc2VzIGZvciBFeGNlbCBWQkEgc3VwcG9ydDwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGludGVyZmFjZXMgZm9yIENvbmRpdGlvbmFsIGZvcm1hdHRpbmc8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkNvbnRhaW5zIGludGVyZmFjZXMgZm9yIGRhdGEgdmFsaWRhdGlvbjwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHMiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgaW50ZXJmYWNlcyBmb3IgZGF0YSB2YWxpZGF0aW9uIGZvcm11bGFzPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJJb25pYy5aaXAiIGlzRG9jdW1lbnRlZD0iRmFsc2UiPkludGVybmFsIHppcCBoYW5kbGluZyBmb3IgcGFja2FnaW5nLiBUaGlzIGlzIGNvZGUgY29tZXMgZnJvbSB0aGUgRG90TmV0WmlwIGxpYnJhcnkuLi4gaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb208L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9IklvbmljLlpsaWIiIGlzRG9jdW1lbnRlZD0iRmFsc2UiPkludGVybmFsIHppcCBoYW5kbGluZyBmb3IgcGFja2FnaW5nLiBUaGlzIGlzIGNvZGUgY29tZXMgZnJvbSB0aGUgRG90TmV0WmlwIGxpYnJhcnkuLi4gaHR0cDovL2RvdG5ldHppcC5jb2RlcGxleC5jb208L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmciIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+VG9wIG5hbWVzc3BhY2UgZm9yIGZvcm11bGEgcGFyc2luZzwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmciIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Q29udGFpbnMgY2xhc3NlcyB0byBoYW5kbGUgT09YTUwgcGFja2FnaW5nLiBVc2VzIHRoZSBEb3ROZXRaaXAgbGlicmFyeSB0byBoYW5kbGUgY29tcHJlc3Npb24uPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5aaXAiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+SW50ZXJuYWwgemlwIGhhbmRsaW5nIGZvciBwYWNrYWdpbmcuIFRoaXMgaXMgY29kZSBjb21lcyBmcm9tIHRoZSBEb3ROZXRaaXAgbGlicmFyeS4uLiBodHRwOi8vZG90bmV0emlwLmNvZGVwbGV4LmNvbTwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYiIgaXNEb2N1bWVudGVkPSJUcnVlIj5JbnRlcm5hbCB6aXAgaGFuZGxpbmcgZm9yIHBhY2thZ2luZy4gVGhpcyBpcyBjb2RlIGNvbWVzIGZyb20gdGhlIERvdE5ldFppcCBsaWJyYXJ5Li4uIGh0dHA6Ly9kb3RuZXR6aXAuY29kZXBsZXguY29tPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgYnVpbGRpbiBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBidWlsZGluIGRhdGUgYW5kIHRpbWUgZnVuY3Rpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbiIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgYnVpbGRpbiBpbmZvcm1hdGlvbiBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWwiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gbG9naWNhbCBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gbWF0aCBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk51bWVyaWMiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gbnVtZXJpYyBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cCIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgYnVpbGRpbiByZWZlcmVuY2UgYW5kIGxvb2t1cCBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQiIGlzRG9jdW1lbnRlZD0iVHJ1ZSI+Rm9ybXVsYSBwYXJzaW5nIGJ1aWxkaW4gdGV4dCBmdW5jdGlvbnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBvcGVyYXRvcnM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMiIGlzRG9jdW1lbnRlZD0iRmFsc2UiPkZvcm11bGEgcGFyc2luZyBpbnRlcm5hbCB1dGlsaXRpZXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9ucyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgZXhlcHRpb25zPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaCIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgZXhwcmVzc2lvbiBncmFwaDwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5IiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBleHByZXNzaW9uIGdyYXBoPC9OYW1lc3BhY2VTdW1tYXJ5SXRlbT4KLTxOYW1lc3BhY2VTdW1tYXJ5SXRlbSBuYW1lPSJPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVycyIgaXNEb2N1bWVudGVkPSJUcnVlIj5Gb3JtdWxhIHBhcnNpbmcgZXhwcmVzc2lvbiBncmFwaDwvTmFtZXNwYWNlU3VtbWFyeUl0ZW0+Ci08TmFtZXNwYWNlU3VtbWFyeUl0ZW0gbmFtZT0iT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMiIGlzRG9jdW1lbnRlZD0iRmFsc2UiPkZvcm11bGEgcGFyc2luZyBsZXhpYWwgYW5hbHlzaXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPgotPE5hbWVzcGFjZVN1bW1hcnlJdGVtIG5hbWU9Ik9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzIiBpc0RvY3VtZW50ZWQ9IlRydWUiPkZvcm11bGEgcGFyc2luZyBpbnRlcm5hbCB1dGlsaXRpZXM8L05hbWVzcGFjZVN1bW1hcnlJdGVtPjwvTmFtZXNwYWNlU3VtbWFyaWVzPgotICAgIDxIZWxwVGl0bGU+RVBQbHVzIDQuMDwvSGVscFRpdGxlPgotICAgIDxWaXNpYmxlSXRlbXM+SW5oZXJpdGVkTWVtYmVycywgSW5oZXJpdGVkRnJhbWV3b3JrTWVtYmVyczwvVmlzaWJsZUl0ZW1zPgotICAgIDxCdWlsZExvZ0ZpbGUgLz4KLSAgICA8SHRtbEhlbHAxeENvbXBpbGVyUGF0aCAvPgotICAgIDxIdG1sSGVscDJ4Q29tcGlsZXJQYXRoIC8+Ci0gICAgPFNhbmRjYXN0bGVQYXRoIC8+Ci0gICAgPFdvcmtpbmdQYXRoIC8+Ci0gICAgPE1heGltdW1Hcm91cFBhcnRzPjI8L01heGltdW1Hcm91cFBhcnRzPgotICAgIDxOYW1lc3BhY2VHcm91cGluZz5GYWxzZTwvTmFtZXNwYWNlR3JvdXBpbmc+Ci0gICAgPFN5bnRheEZpbHRlcnM+U3RhbmRhcmQ8L1N5bnRheEZpbHRlcnM+Ci0gICAgPFNka0xpbmtUYXJnZXQ+Qmxhbms8L1Nka0xpbmtUYXJnZXQ+Ci0gICAgPFJvb3ROYW1lc3BhY2VDb250YWluZXI+RmFsc2U8L1Jvb3ROYW1lc3BhY2VDb250YWluZXI+Ci0gICAgPFByZXNlbnRhdGlvblN0eWxlPlZTMjAxMDwvUHJlc2VudGF0aW9uU3R5bGU+Ci0gICAgPFByZWxpbWluYXJ5PkZhbHNlPC9QcmVsaW1pbmFyeT4KLSAgICA8TmFtaW5nTWV0aG9kPkd1aWQ8L05hbWluZ01ldGhvZD4KLSAgICA8TGFuZ3VhZ2U+ZW4tVVM8L0xhbmd1YWdlPgotICAgIDxDb250ZW50UGxhY2VtZW50PkFib3ZlTmFtZXNwYWNlczwvQ29udGVudFBsYWNlbWVudD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8IS0tIFRoZXJlIGFyZSBubyBwcm9wZXJ0aWVzIGZvciB0aGVzZSBncm91cHMuICBBbnlDUFUgbmVlZHMgdG8gYXBwZWFyIGluCi0gICAgICAgb3JkZXIgZm9yIFZpc3VhbCBTdHVkaW8gdG8gcGVyZm9ybSB0aGUgYnVpbGQuICBUaGUgb3RoZXJzIGFyZSBvcHRpb25hbAotICAgICAgIGNvbW1vbiBwbGF0Zm9ybSB0eXBlcyB0aGF0IG1heSBhcHBlYXIuIC0tPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8eDg2JyAiPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3x4NjQnICI+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfHg2NCcgIj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfFdpbjMyJyAiPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxXaW4zMicgIj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8IS0tIEltcG9ydCB0aGUgU0hGQiBidWlsZCB0YXJnZXRzIC0tPgotICA8SW1wb3J0IFByb2plY3Q9IiQoU0hGQlJPT1QpXFNhbmRjYXN0bGVIZWxwRmlsZUJ1aWxkZXIudGFyZ2V0cyIgLz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMudGVzdHNldHRpbmdzIGIvRVBQbHVzLnRlc3RzZXR0aW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MjdlMC4uMDAwMDAwMAotLS0gYS9FUFBsdXMudGVzdHNldHRpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3RTZXR0aW5ncwotICBpZD0iNjU4MzYwMGMtYTU5Yy00OTNiLWFkM2EtZTMyYjQ3Zjc2ZDljIgotICBuYW1lPSJFUFBsdXMiCi0gIGVuYWJsZURlZmF1bHREYXRhQ29sbGVjdG9ycz0iZmFsc2UiCi0gIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KLSAgPERlc2NyaXB0aW9uPjwhLS1fbG9jSURfdGV4dD0iRGVzY3JpcHRpb24xIi0tPlRoZXNlIGFyZSBkZWZhdWx0IHRlc3Qgc2V0dGluZ3MgZm9yIGEgbG9jYWwgdGVzdCBydW4uPC9EZXNjcmlwdGlvbj4KLSAgPERlcGxveW1lbnQgZW5hYmxlZD0iZmFsc2UiIC8+Ci08L1Rlc3RTZXR0aW5ncz4KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvQXBwLmNvbmZpZyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvQXBwLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxNTY0Ni4uMDAwMDAwMAotLS0gYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0FwcC5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgotPGNvbmZpZ3VyYXRpb24+Ci0gICAgPHN0YXJ0dXA+IAotICAgICAgICA8c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC41IiAvPgotICAgIDwvc3RhcnR1cD4KLTwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0NvbnZlcnRVdGlsLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Db252ZXJ0VXRpbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxM2RjNy4uMDAwMDAwMAotLS0gYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0NvbnZlcnRVdGlsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwotCi1uYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtbwotewotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBDb252ZXJ0VXRpbAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNOdW1lcmljKG9iamVjdCBjYW5kaWRhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIChjYW5kaWRhdGUuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IGNhbmRpZGF0ZSBpcyBkb3VibGUgfHwgY2FuZGlkYXRlIGlzIGRlY2ltYWwgfHwgY2FuZGlkYXRlIGlzIERhdGVUaW1lIHx8IGNhbmRpZGF0ZSBpcyBUaW1lU3BhbiB8fCBjYW5kaWRhdGUgaXMgbG9uZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc051bWVyaWNTdHJpbmcob2JqZWN0IGNhbmRpZGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBSZWdleC5Jc01hdGNoKGNhbmRpZGF0ZS5Ub1N0cmluZygpLCBAIl5bXGRdKyhcLFtcZF0pPyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydCBhbiBvYmplY3QgdmFsdWUgdG8gYSBkb3VibGUgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVCb29sIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZG91YmxlIEdldFZhbHVlRG91YmxlKG9iamVjdCB2LCBib29sIGlnbm9yZUJvb2wgPSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaWdub3JlQm9vbCAmJiB2IGlzIGJvb2wpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYyh2KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIERhdGVUaW1lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkID0gKChEYXRlVGltZSl2KS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaXMgVGltZVNwYW4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKDApLkFkZCgoVGltZVNwYW4pdikuVG9PQURhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBDb252ZXJ0LlRvRG91YmxlKHYsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uRGVtby5jc3Byb2ogYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25EZW1vLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyN2E1ZS4uMDAwMDAwMAotLS0gYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25EZW1vLmNzcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMnKSIgLz4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgotICAgIDxQcm9qZWN0R3VpZD57OTRDQkNFRkMtRERCRi00RjU0LThBRUEtNEM0MEJCRDI4ODFCfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+V2luRXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5FUFBsdXNFeGNlbEZvcm1EZW1vPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+RVBQbHVzRXhjZWxGb3JtRGVtbzwvQXNzZW1ibHlOYW1lPgotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZSA0LjB8QW55Q1BVJyI+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2UgNC4wXDwvT3V0cHV0UGF0aD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EZXBsb3ltZW50IiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cy5Gb3JtcyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbnZlcnRVdGlsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkV4Y2VsRm9ybS5jcyI+Ci0gICAgICA8U3ViVHlwZT5Gb3JtPC9TdWJUeXBlPgotICAgIDwvQ29tcGlsZT4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlbEZvcm0uRGVzaWduZXIuY3MiPgotICAgICAgPERlcGVuZGVudFVwb24+RXhjZWxGb3JtLmNzPC9EZXBlbmRlbnRVcG9uPgotICAgIDwvQ29tcGlsZT4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGdW5jdGlvbnMuY3MiPgotICAgICAgPFN1YlR5cGU+Rm9ybTwvU3ViVHlwZT4KLSAgICA8L0NvbXBpbGU+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRnVuY3Rpb25zLkRlc2lnbmVyLmNzIj4KLSAgICAgIDxEZXBlbmRlbnRVcG9uPkZ1bmN0aW9ucy5jczwvRGVwZW5kZW50VXBvbj4KLSAgICA8L0NvbXBpbGU+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJFeGNlbEZvcm0ucmVzeCI+Ci0gICAgICA8RGVwZW5kZW50VXBvbj5FeGNlbEZvcm0uY3M8L0RlcGVuZGVudFVwb24+Ci0gICAgPC9FbWJlZGRlZFJlc291cmNlPgotICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IkZ1bmN0aW9ucy5yZXN4Ij4KLSAgICAgIDxEZXBlbmRlbnRVcG9uPkZ1bmN0aW9ucy5jczwvRGVwZW5kZW50VXBvbj4KLSAgICA8L0VtYmVkZGVkUmVzb3VyY2U+Ci0gICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iUHJvcGVydGllc1xSZXNvdXJjZXMucmVzeCI+Ci0gICAgICA8R2VuZXJhdG9yPlJlc1hGaWxlQ29kZUdlbmVyYXRvcjwvR2VuZXJhdG9yPgotICAgICAgPExhc3RHZW5PdXRwdXQ+UmVzb3VyY2VzLkRlc2lnbmVyLmNzPC9MYXN0R2VuT3V0cHV0PgotICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+Ci0gICAgPC9FbWJlZGRlZFJlc291cmNlPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcUmVzb3VyY2VzLkRlc2lnbmVyLmNzIj4KLSAgICAgIDxBdXRvR2VuPlRydWU8L0F1dG9HZW4+Ci0gICAgICA8RGVwZW5kZW50VXBvbj5SZXNvdXJjZXMucmVzeDwvRGVwZW5kZW50VXBvbj4KLSAgICA8L0NvbXBpbGU+Ci0gICAgPE5vbmUgSW5jbHVkZT0iUHJvcGVydGllc1xTZXR0aW5ncy5zZXR0aW5ncyI+Ci0gICAgICA8R2VuZXJhdG9yPlNldHRpbmdzU2luZ2xlRmlsZUdlbmVyYXRvcjwvR2VuZXJhdG9yPgotICAgICAgPExhc3RHZW5PdXRwdXQ+U2V0dGluZ3MuRGVzaWduZXIuY3M8L0xhc3RHZW5PdXRwdXQ+Ci0gICAgPC9Ob25lPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcU2V0dGluZ3MuRGVzaWduZXIuY3MiPgotICAgICAgPEF1dG9HZW4+VHJ1ZTwvQXV0b0dlbj4KLSAgICAgIDxEZXBlbmRlbnRVcG9uPlNldHRpbmdzLnNldHRpbmdzPC9EZXBlbmRlbnRVcG9uPgotICAgICAgPERlc2lnblRpbWVTaGFyZWRJbnB1dD5UcnVlPC9EZXNpZ25UaW1lU2hhcmVkSW5wdXQ+Ci0gICAgPC9Db21waWxlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Tm9uZSBJbmNsdWRlPSJBcHAuY29uZmlnIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxFUFBsdXNcRVBQbHVzLmNzcHJvaiI+Ci0gICAgICA8UHJvamVjdD57N2IyODgwMjYtNTUwMi00YTM5LWJmNDEtNzdlMDg2ZjNlNGEzfTwvUHJvamVjdD4KLSAgICAgIDxOYW1lPkVQUGx1czwvTmFtZT4KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgotICA8L1RhcmdldD4KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIC0tPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLkRlc2lnbmVyLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uRGVzaWduZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmE5YTMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uRGVzaWduZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAot77u/bmFtZXNwYWNlIEVQUGx1c0V4Y2VsRm9ybURlbW8KLXsKLSAgICBwYXJ0aWFsIGNsYXNzIEV4Y2VsRm9ybQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVxdWlyZWQgZGVzaWduZXIgdmFyaWFibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgU3lzdGVtLkNvbXBvbmVudE1vZGVsLklDb250YWluZXIgY29tcG9uZW50cyA9IG51bGw7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2xlYW4gdXAgYW55IHJlc291cmNlcyBiZWluZyB1c2VkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpc3Bvc2luZyI+dHJ1ZSBpZiBtYW5hZ2VkIHJlc291cmNlcyBzaG91bGQgYmUgZGlzcG9zZWQ7IG90aGVyd2lzZSwgZmFsc2UuPC9wYXJhbT4KLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpc3Bvc2luZyAmJiAoY29tcG9uZW50cyAhPSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBXaW5kb3dzIEZvcm0gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXF1aXJlZCBtZXRob2QgZm9yIERlc2lnbmVyIHN1cHBvcnQgLSBkbyBub3QgbW9kaWZ5Ci0gICAgICAgIC8vLyB0aGUgY29udGVudHMgb2YgdGhpcyBtZXRob2Qgd2l0aCB0aGUgY29kZSBlZGl0b3IuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplQ29tcG9uZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q2VsbFN0eWxlIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q2VsbFN0eWxlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDZWxsU3R5bGUgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNCA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdDZWxsU3R5bGUoKTsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX1NhdmUgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uKCk7Ci0gICAgICAgICAgICB0aGlzLnNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbCA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5TYXZlRmlsZURpYWxvZygpOwotICAgICAgICAgICAgdGhpcy50YWJQYWdlMSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UYWJQYWdlKCk7Ci0gICAgICAgICAgICB0aGlzLnRleHRCb3hfZnggPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGV4dEJveCgpOwotICAgICAgICAgICAgdGhpcy5sYWJlbDEgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwoKTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXcoKTsKLSAgICAgICAgICAgIHRoaXMuRSA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uKCk7Ci0gICAgICAgICAgICB0aGlzLkQgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbigpOwotICAgICAgICAgICAgdGhpcy5DID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4oKTsKLSAgICAgICAgICAgIHRoaXMuQiA9IG5ldyBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uKCk7Ci0gICAgICAgICAgICB0aGlzLkEgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbigpOwotICAgICAgICAgICAgdGhpcy5idXR0b25fQXBwbHlGb3JtdWxhID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbigpOwotICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuVGFiQ29udHJvbCgpOwotICAgICAgICAgICAgdGhpcy5idXR0b24xID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbigpOwotICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5TdXNwZW5kTGF5b3V0KCk7Ci0gICAgICAgICAgICAoKFN5c3RlbS5Db21wb25lbnRNb2RlbC5JU3VwcG9ydEluaXRpYWxpemUpKHRoaXMuZGF0YUdyaWRWaWV3X1dzMSkpLkJlZ2luSW5pdCgpOwotICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuU3VzcGVuZExheW91dCgpOwotICAgICAgICAgICAgdGhpcy5TdXNwZW5kTGF5b3V0KCk7Ci0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIGJ1dHRvbl9TYXZlCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX1NhdmUuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTcsIDEyKTsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX1NhdmUuTmFtZSA9ICJidXR0b25fU2F2ZSI7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NSwgMjMpOwotICAgICAgICAgICAgdGhpcy5idXR0b25fU2F2ZS5UYWJJbmRleCA9IDE7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlLlRleHQgPSAiU2F2ZSBFeGNlbGZpbGUiOwotICAgICAgICAgICAgdGhpcy5idXR0b25fU2F2ZS5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbl9TYXZlLkNsaWNrICs9IG5ldyBTeXN0ZW0uRXZlbnRIYW5kbGVyKHRoaXMuYnV0dG9uX1NhdmVfQ2xpY2spOwotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyB0YWJQYWdlMQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLkNvbnRyb2xzLkFkZCh0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEpOwotICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5Db250cm9scy5BZGQodGhpcy5kYXRhR3JpZFZpZXdfV3MxKTsKLSAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuQ29udHJvbHMuQWRkKHRoaXMubGFiZWwxKTsKLSAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuQ29udHJvbHMuQWRkKHRoaXMudGV4dEJveF9meCk7Ci0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDQsIDIyKTsKLSAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuTmFtZSA9ICJ0YWJQYWdlMSI7Ci0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlBhZGRpbmcgPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuUGFkZGluZygzKTsKLSAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDU3NSwgMzYwKTsKLSAgICAgICAgICAgIHRoaXMudGFiUGFnZTEuVGFiSW5kZXggPSAwOwotICAgICAgICAgICAgdGhpcy50YWJQYWdlMS5UZXh0ID0gIlNoZWV0MSI7Ci0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlVzZVZpc3VhbFN0eWxlQmFja0NvbG9yID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gdGV4dEJveF9meAotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLnRleHRCb3hfZnguTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoOTQsIDE2KTsKLSAgICAgICAgICAgIHRoaXMudGV4dEJveF9meC5OYW1lID0gInRleHRCb3hfZngiOwotICAgICAgICAgICAgdGhpcy50ZXh0Qm94X2Z4LlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSgzNTYsIDIwKTsKLSAgICAgICAgICAgIHRoaXMudGV4dEJveF9meC5UYWJJbmRleCA9IDA7Ci0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIGxhYmVsMQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLmxhYmVsMS5BdXRvU2l6ZSA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsMS5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCg3MywgMTYpOwotICAgICAgICAgICAgdGhpcy5sYWJlbDEuTmFtZSA9ICJsYWJlbDEiOwotICAgICAgICAgICAgdGhpcy5sYWJlbDEuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDE1LCAxMyk7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsMS5UYWJJbmRleCA9IDE7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsMS5UZXh0ID0gImZ4IjsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gZGF0YUdyaWRWaWV3X1dzMQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQWxsb3dVc2VyVG9BZGRSb3dzID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQWxsb3dVc2VyVG9EZWxldGVSb3dzID0gZmFsc2U7Ci0gICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzLkFsaWdubWVudCA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NvbnRlbnRBbGlnbm1lbnQuTWlkZGxlQ2VudGVyOwotICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlMy5CYWNrQ29sb3IgPSBTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnMuQ29udHJvbDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMuRm9udCA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Gb250KCJUaW1lcyBOZXcgUm9tYW4iLCA5Ljc1RiwgU3lzdGVtLkRyYXdpbmcuRm9udFN0eWxlLlJlZ3VsYXIsIFN5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdC5Qb2ludCwgKChieXRlKSgwKSkpOwotICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlMy5Gb3JlQ29sb3IgPSBTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnMuV2luZG93VGV4dDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMuU2VsZWN0aW9uQmFja0NvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkhpZ2hsaWdodDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTMuU2VsZWN0aW9uRm9yZUNvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkhpZ2hsaWdodFRleHQ7Ci0gICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGUzLldyYXBNb2RlID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VHJpU3RhdGUuVHJ1ZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5Db2x1bW5IZWFkZXJzRGVmYXVsdENlbGxTdHlsZSA9IGRhdGFHcmlkVmlld0NlbGxTdHlsZTM7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQ29sdW1uSGVhZGVyc0hlaWdodFNpemVNb2RlID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q29sdW1uSGVhZGVyc0hlaWdodFNpemVNb2RlLkF1dG9TaXplOwotICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkNvbHVtbnMuQWRkUmFuZ2UobmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NvbHVtbltdIHsKLSAgICAgICAgICAgIHRoaXMuQSwKLSAgICAgICAgICAgIHRoaXMuQiwKLSAgICAgICAgICAgIHRoaXMuQywKLSAgICAgICAgICAgIHRoaXMuRCwKLSAgICAgICAgICAgIHRoaXMuRX0pOwotICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDYsIDQzKTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5NdWx0aVNlbGVjdCA9IGZhbHNlOwotICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLk5hbWUgPSAiZGF0YUdyaWRWaWV3X1dzMSI7Ci0gICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0LkFsaWdubWVudCA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NvbnRlbnRBbGlnbm1lbnQuTWlkZGxlTGVmdDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTQuQmFja0NvbG9yID0gU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzLkNvbnRyb2w7Ci0gICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0LkZvbnQgPSBuZXcgU3lzdGVtLkRyYXdpbmcuRm9udCgiVGltZXMgTmV3IFJvbWFuIiwgMTJGLCBTeXN0ZW0uRHJhd2luZy5Gb250U3R5bGUuUmVndWxhciwgU3lzdGVtLkRyYXdpbmcuR3JhcGhpY3NVbml0LlBvaW50LCAoKGJ5dGUpKDApKSk7Ci0gICAgICAgICAgICBkYXRhR3JpZFZpZXdDZWxsU3R5bGU0LkZvcmVDb2xvciA9IFN5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9ycy5XaW5kb3dUZXh0OwotICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNC5TZWxlY3Rpb25CYWNrQ29sb3IgPSBTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnMuSGlnaGxpZ2h0OwotICAgICAgICAgICAgZGF0YUdyaWRWaWV3Q2VsbFN0eWxlNC5TZWxlY3Rpb25Gb3JlQ29sb3IgPSBTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnMuSGlnaGxpZ2h0VGV4dDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld0NlbGxTdHlsZTQuV3JhcE1vZGUgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUcmlTdGF0ZS5GYWxzZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5Sb3dIZWFkZXJzRGVmYXVsdENlbGxTdHlsZSA9IGRhdGFHcmlkVmlld0NlbGxTdHlsZTQ7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuU2Nyb2xsQmFycyA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlNjcm9sbEJhcnMuTm9uZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5TaG93Q2VsbEVycm9ycyA9IGZhbHNlOwotICAgICAgICAgICAgdGhpcy5kYXRhR3JpZFZpZXdfV3MxLlNob3dDZWxsVG9vbFRpcHMgPSBmYWxzZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5TaG93RWRpdGluZ0ljb24gPSBmYWxzZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5TaG93Um93RXJyb3JzID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDU2MywgMzExKTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUdyaWRWaWV3X1dzMS5UYWJJbmRleCA9IDI7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQ2VsbEJlZ2luRWRpdCArPSBuZXcgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3Q2VsbENhbmNlbEV2ZW50SGFuZGxlcih0aGlzLmRhdGFHcmlkVmlld19XczFfQ2VsbEJlZ2luRWRpdCk7Ci0gICAgICAgICAgICB0aGlzLmRhdGFHcmlkVmlld19XczEuQ2VsbFZhbGlkYXRpbmcgKz0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld0NlbGxWYWxpZGF0aW5nRXZlbnRIYW5kbGVyKHRoaXMuZGF0YUdyaWRWaWV3X1dzMV9DZWxsVmFsaWRhdGluZyk7Ci0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIEUKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgdGhpcy5FLkhlYWRlclRleHQgPSAiRSI7Ci0gICAgICAgICAgICB0aGlzLkUuTmFtZSA9ICJFIjsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gRAotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLkQuSGVhZGVyVGV4dCA9ICJEIjsKLSAgICAgICAgICAgIHRoaXMuRC5OYW1lID0gIkQiOwotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBDCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIHRoaXMuQy5IZWFkZXJUZXh0ID0gIkMiOwotICAgICAgICAgICAgdGhpcy5DLk5hbWUgPSAiQyI7Ci0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIEIKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgdGhpcy5CLkhlYWRlclRleHQgPSAiQiI7Ci0gICAgICAgICAgICB0aGlzLkIuTmFtZSA9ICJCIjsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gQQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLkEuSGVhZGVyVGV4dCA9ICJBIjsKLSAgICAgICAgICAgIHRoaXMuQS5OYW1lID0gIkEiOwotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBidXR0b25fQXBwbHlGb3JtdWxhCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5Mb2NhdGlvbiA9IG5ldyBTeXN0ZW0uRHJhd2luZy5Qb2ludCg0NTYsIDE0KTsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5OYW1lID0gImJ1dHRvbl9BcHBseUZvcm11bGEiOwotICAgICAgICAgICAgdGhpcy5idXR0b25fQXBwbHlGb3JtdWxhLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg2NCwgMjMpOwotICAgICAgICAgICAgdGhpcy5idXR0b25fQXBwbHlGb3JtdWxhLlRhYkluZGV4ID0gMzsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5UZXh0ID0gIkFwcGx5IjsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uX0FwcGx5Rm9ybXVsYS5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbl9BcHBseUZvcm11bGEuQ2xpY2sgKz0gbmV3IFN5c3RlbS5FdmVudEhhbmRsZXIodGhpcy5idXR0b25fQXBwbHlGb3JtdWxhX0NsaWNrKTsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gdGFiQ29udHJvbF9Xb3Jrc2hlZXRzCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzLkNvbnRyb2xzLkFkZCh0aGlzLnRhYlBhZ2UxKTsKLSAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEzLCA2Myk7Ci0gICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5OYW1lID0gInRhYkNvbnRyb2xfV29ya3NoZWV0cyI7Ci0gICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5TZWxlY3RlZEluZGV4ID0gMDsKLSAgICAgICAgICAgIHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzLlNpemUgPSBuZXcgU3lzdGVtLkRyYXdpbmcuU2l6ZSg1ODMsIDM4Nik7Ci0gICAgICAgICAgICB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5UYWJJbmRleCA9IDA7Ci0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIGJ1dHRvbjEKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgdGhpcy5idXR0b24xLkxvY2F0aW9uID0gbmV3IFN5c3RlbS5EcmF3aW5nLlBvaW50KDQxNSwgMTIpOwotICAgICAgICAgICAgdGhpcy5idXR0b24xLk5hbWUgPSAiYnV0dG9uMSI7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbjEuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDE3MSwgMjMpOwotICAgICAgICAgICAgdGhpcy5idXR0b24xLlRhYkluZGV4ID0gMjsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uMS5UZXh0ID0gIlZpZXcgSW1wbGVtZW50ZWQgRnVuY3Rpb25zIjsKLSAgICAgICAgICAgIHRoaXMuYnV0dG9uMS5Vc2VWaXN1YWxTdHlsZUJhY2tDb2xvciA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmJ1dHRvbjEuQ2xpY2sgKz0gbmV3IFN5c3RlbS5FdmVudEhhbmRsZXIodGhpcy5idXR0b24xX0NsaWNrKTsKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gRXhjZWxGb3JtCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIHRoaXMuQXV0b1NjYWxlRGltZW5zaW9ucyA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplRig2RiwgMTNGKTsKLSAgICAgICAgICAgIHRoaXMuQXV0b1NjYWxlTW9kZSA9IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkF1dG9TY2FsZU1vZGUuRm9udDsKLSAgICAgICAgICAgIHRoaXMuQ2xpZW50U2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDYxMCwgNDU2KTsKLSAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMuYnV0dG9uMSk7Ci0gICAgICAgICAgICB0aGlzLkNvbnRyb2xzLkFkZCh0aGlzLmJ1dHRvbl9TYXZlKTsKLSAgICAgICAgICAgIHRoaXMuQ29udHJvbHMuQWRkKHRoaXMudGFiQ29udHJvbF9Xb3Jrc2hlZXRzKTsKLSAgICAgICAgICAgIHRoaXMuRm9ybUJvcmRlclN0eWxlID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuRm9ybUJvcmRlclN0eWxlLkZpeGVkM0Q7Ci0gICAgICAgICAgICB0aGlzLk1heGltaXplQm94ID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLk1pbmltaXplQm94ID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLk5hbWUgPSAiRXhjZWxGb3JtIjsKLSAgICAgICAgICAgIHRoaXMuVGV4dCA9ICJFUFBsdXMgRXhjZWwgZGVtbyI7Ci0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlJlc3VtZUxheW91dChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLnRhYlBhZ2UxLlBlcmZvcm1MYXlvdXQoKTsKLSAgICAgICAgICAgICgoU3lzdGVtLkNvbXBvbmVudE1vZGVsLklTdXBwb3J0SW5pdGlhbGl6ZSkodGhpcy5kYXRhR3JpZFZpZXdfV3MxKSkuRW5kSW5pdCgpOwotICAgICAgICAgICAgdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuUmVzdW1lTGF5b3V0KGZhbHNlKTsKLSAgICAgICAgICAgIHRoaXMuUmVzdW1lTGF5b3V0KGZhbHNlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uIGJ1dHRvbl9TYXZlOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlNhdmVGaWxlRGlhbG9nIHNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbDsKLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UYWJQYWdlIHRhYlBhZ2UxOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbiBidXR0b25fQXBwbHlGb3JtdWxhOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlldyBkYXRhR3JpZFZpZXdfV3MxOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4gQTsKLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uIEI7Ci0gICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuRGF0YUdyaWRWaWV3VGV4dEJveENvbHVtbiBDOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLkRhdGFHcmlkVmlld1RleHRCb3hDb2x1bW4gRDsKLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EYXRhR3JpZFZpZXdUZXh0Qm94Q29sdW1uIEU7Ci0gICAgICAgIHByaXZhdGUgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwgbGFiZWwxOwotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRCb3ggdGV4dEJveF9meDsKLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UYWJDb250cm9sIHRhYkNvbnRyb2xfV29ya3NoZWV0czsKLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24gYnV0dG9uMTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMGNkYzUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9FeGNlbEZvcm0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uQ29tcG9uZW50TW9kZWw7Ci11c2luZyBTeXN0ZW0uRGF0YTsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKLXVzaW5nIFN5c3RlbS5XaW5kb3dzLkZvcm1zOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c0V4Y2VsRm9ybURlbW8KLXsKLSAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBFeGNlbEZvcm0gOiBGb3JtCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBEYXRhR3JpZFZpZXdDZWxsIF9jdXJyZW50Q2VsbDsKLSAgICAgICAgcHJpdmF0ZSBGb250IF9pbmFjdGl2ZUNlbGxGb250OwotICAgICAgICBwcml2YXRlIEZvbnQgX2FjdGl2ZUNlbGxGb250OwotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBOdW1iZXJPZkNvbHVtbnMgPSA1OwotCi0gICAgICAgIHB1YmxpYyBFeGNlbEZvcm0oKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbml0aWFsaXplQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBJbml0aWFsaXplUGFja2FnZSgpOwotICAgICAgICAgICAgSW5pdFBhY2thZ2VUb1VJKCk7Ci0gICAgICAgICAgICB0aGlzLkNsb3NpbmcgKz0gKHNlbmRlciwgYXJncykgPT4gX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICAgICAgZGF0YUdyaWRWaWV3X1dzMS5Sb3dIZWFkZXJzV2lkdGggPSA1MDsKLSAgICAgICAgICAgIGRhdGFHcmlkVmlld19XczEuU2VsZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZVBhY2thZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIHZhciB3czEgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiV29ya3NoZWV0MSIpOwotICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMjsgY29sIDwgTnVtYmVyT2ZDb2x1bW5zOyBjb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCA5OyByb3crKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdzMS5DZWxsc1tyb3csIGNvbF0uVmFsdWUgPSByb3cqY29sOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdzMS5DZWxsc1s3LCAxXS5WYWx1ZSA9ICJTVU0iOwotICAgICAgICAgICAgd3MxLkNlbGxzWzcsIDJdLkZvcm11bGEgPSAiU1VNKEIxOkI2KSI7Ci0gICAgICAgICAgICB3czEuQ2VsbHNbNywgM10uRm9ybXVsYSA9ICJTVU0oQzE6QzYpIjsKLSAgICAgICAgICAgIHdzMS5DZWxsc1s3LCA0XS5Gb3JtdWxhID0gIlNVTShEMTpENikiOwotCi0gICAgICAgICAgICB3czEuQ2VsbHNbOCwgMV0uVmFsdWUgPSAiU1RERVYiOwotICAgICAgICAgICAgd3MxLkNlbGxzWzgsIDJdLkZvcm11bGEgPSAiU1RERVYoQjE6QjYpIjsKLSAgICAgICAgICAgIHdzMS5DZWxsc1s4LCAzXS5Gb3JtdWxhID0gIlNUREVWKEMxOkM2KSI7Ci0gICAgICAgICAgICB3czEuQ2VsbHNbOCwgNF0uRm9ybXVsYSA9ICJTVERFVihEMTpENikiOwotICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdEZvbnRzKERhdGFHcmlkVmlldyBncmlkVmlldykKLSAgICAgICAgewotICAgICAgICAgICAgX2FjdGl2ZUNlbGxGb250ID0gbmV3IEZvbnQoZ3JpZFZpZXcuRm9udCwgRm9udFN0eWxlLkJvbGQpOwotICAgICAgICAgICAgX2luYWN0aXZlQ2VsbEZvbnQgPSBncmlkVmlldy5Gb250OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRFdmVudHMoRGF0YUdyaWRWaWV3IGdyaWRWaWV3KQotICAgICAgICB7Ci0gICAgICAgICAgICBncmlkVmlldy5DZWxsRW50ZXIgKz0gRGF0YUdyaWQxT25DZWxsRW50ZXI7Ci0gICAgICAgICAgICBncmlkVmlldy5DZWxsTGVhdmUgKz0gRGF0YUdyaWQxT25DZWxsTGVhdmU7IAotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQmluZHMgdGhlIEVQUGx1cyBwYWNrYWdlIChvciBhY3R1YWxseSBvbmx5IGl0cyBmaXJzdCB3b3Jrc2hlZXQpCi0gICAgICAgIC8vLyB0byB0aGUgRGF0YUdyaWRWaWV3LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFBhY2thZ2VUb1VJKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOwotICAgICAgICAgICAgdmFyIHBhZ2UxID0gdGhpcy50YWJDb250cm9sX1dvcmtzaGVldHMuQ29udHJvbHNbMF0gYXMgVGFiUGFnZTsKLSAgICAgICAgICAgIHBhZ2UxLlRleHQgPSB3cy5OYW1lOwotICAgICAgICAgICAgdmFyIGdyaWRWaWV3ID0gR2V0R3JpZCgpOwotICAgICAgICAgICAgSW5pdEZvbnRzKGdyaWRWaWV3KTsKLSAgICAgICAgICAgIEluaXRFdmVudHMoZ3JpZFZpZXcpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCB3cy5EaW1lbnNpb24uUm93czsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGdyaWRSb3cgPSBuZXcgRGF0YUdyaWRWaWV3Um93IHtIZWFkZXJDZWxsID0ge1ZhbHVlID0gKHJvdyArIDEpLlRvU3RyaW5nKCl9fTsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBOdW1iZXJPZkNvbHVtbnM7IGNvbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSB3cy5DZWxsc1tyb3cgKyAxLCBjb2wgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuVmFsdWUhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgdWlDZWxsID0gbmV3IERhdGFHcmlkVmlld1RleHRCb3hDZWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDZWxsLlZhbHVlID0gY2VsbC5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkUm93LkNlbGxzLkFkZCh1aUNlbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdyaWRWaWV3LlJvd3MuQWRkKGdyaWRSb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JpZFZpZXcuUmVmcmVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEJpbmRQYWNrYWdlVG9VSSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7Ci0gICAgICAgICAgICBmb3IgKHZhciByb3cgPSAxOyByb3cgPCBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuRGltZW5zaW9uLlJvd3MgKyAxOyByb3crKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAxOyBjb2wgPD0gTnVtYmVyT2ZDb2x1bW5zOyBjb2wrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBleGNlbENlbGwgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbcm93LCBjb2xdOwotICAgICAgICAgICAgICAgICAgICB2YXIgZ3JpZFZpZXdDZWxsID0gZGF0YUdyaWQxLlJvd3Nbcm93IC0gMV0uQ2VsbHNbY29sIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5WYWx1ZSA9IGV4Y2VsQ2VsbC5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhR3JpZDEuUmVmcmVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBvYmplY3QgQ2VsbFZhbHVlVG9PYmplY3Qoc3RyaW5nIGNlbGxWYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoY2VsbFZhbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShjZWxsVmFsLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjZWxsVmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIERhdGFHcmlkMU9uQ2VsbExlYXZlKG9iamVjdCBzZW5kZXIsIERhdGFHcmlkVmlld0NlbGxFdmVudEFyZ3MgZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGFHcmlkMSA9IEdldEdyaWQoKTsKLSAgICAgICAgICAgIHZhciBncmlkVmlld0NlbGwgPSBkYXRhR3JpZDEuUm93c1tlLlJvd0luZGV4XS5DZWxsc1tlLkNvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIHZhciBleGNlbENlbGwgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXTsKLSAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5Gb3JlQ29sb3IgPSBDb2xvci5CbGFjazsKLSAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5CYWNrQ29sb3IgPSBDb2xvci5XaGl0ZTsKLSAgICAgICAgICAgIGdyaWRWaWV3Q2VsbC5TdHlsZS5Gb250ID0gX2luYWN0aXZlQ2VsbEZvbnQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByaXZhdGUgRGF0YUdyaWRWaWV3IEdldEdyaWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFnZTEgPSB0aGlzLnRhYkNvbnRyb2xfV29ya3NoZWV0cy5Db250cm9sc1swXSBhcyBUYWJQYWdlOwotICAgICAgICAgICAgdmFyIGRhdGFHcmlkMSA9IHBhZ2UxLkNvbnRyb2xzWyJkYXRhR3JpZFZpZXdfV3MxIl0gYXMgRGF0YUdyaWRWaWV3OwotICAgICAgICAgICAgcmV0dXJuIGRhdGFHcmlkMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBEYXRhR3JpZDFPbkNlbGxFbnRlcihvYmplY3Qgc2VuZGVyLCBEYXRhR3JpZFZpZXdDZWxsRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7Ci0gICAgICAgICAgICBkYXRhR3JpZDEuUmVmcmVzaCgpOwotICAgICAgICAgICAgQmluZFBhY2thZ2VUb1VJKCk7Ci0gICAgICAgICAgICB2YXIgY2VsbCA9IGRhdGFHcmlkMS5Sb3dzW2UuUm93SW5kZXhdLkNlbGxzW2UuQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgdmFyIGV4Y2VsQ2VsbCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleGNlbENlbGwuRm9ybXVsYSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGV4dEJveF9meC5UZXh0ID0gIj0iICsgZXhjZWxDZWxsLkZvcm11bGE7Ci0gICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9ICI9IiArIGV4Y2VsQ2VsbC5Gb3JtdWxhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihleGNlbENlbGwuVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZXh0Qm94X2Z4LlRleHQgPSBleGNlbENlbGwuVmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNlbGwuU3R5bGUuRm9yZUNvbG9yID0gQ29sb3IuQmx1ZTsKLSAgICAgICAgICAgIGNlbGwuU3R5bGUuQmFja0NvbG9yID0gQ29sb3IuR2FpbnNib3JvOwotICAgICAgICAgICAgY2VsbC5TdHlsZS5Gb250ID0gX2FjdGl2ZUNlbGxGb250OwotICAgICAgICAgICAgX2N1cnJlbnRDZWxsID0gY2VsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBidXR0b25fU2F2ZV9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKLSAgICAgICAgewotICAgICAgICAgICAgc2F2ZUZpbGVEaWFsb2dfU2F2ZUV4Y2VsLkZpbHRlciA9ICJFeGNlbCBmaWxlcyAoKi54bHN4KXwqLnhsc3giOwotICAgICAgICAgICAgdmFyIGRpYWxvZ1Jlc3VsdCA9IHNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbC5TaG93RGlhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nUmVzdWx0ID09IERpYWxvZ1Jlc3VsdC5PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKHNhdmVGaWxlRGlhbG9nX1NhdmVFeGNlbC5GaWxlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGJ1dHRvbl9BcHBseUZvcm11bGFfQ2xpY2sob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByb3cgPSBfY3VycmVudENlbGwuUm93SW5kZXg7Ci0gICAgICAgICAgICB2YXIgY29sID0gX2N1cnJlbnRDZWxsLkNvbHVtbkluZGV4OwotICAgICAgICAgICAgdmFyIHR4dCA9IHRleHRCb3hfZnguVGV4dDsKLSAgICAgICAgICAgIGlmICh0eHQuU3RhcnRzV2l0aCgiPSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tyb3cgKyAxLCBjb2wgKyAxXS5Gb3JtdWxhID0gdHh0LlN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbcm93ICsgMSwgY29sICsgMV0uRm9ybXVsYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpLkNlbGxzW3JvdyArIDEsIGNvbCArIDFdLlZhbHVlID0gQ2VsbFZhbHVlVG9PYmplY3QodHh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQm94LlNob3coZXguTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCaW5kUGFja2FnZVRvVUkoKTsKLSAgICAgICAgICAgIHRoaXMuUmVmcmVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRhdGFHcmlkVmlld19XczFfQ2VsbEJlZ2luRWRpdChvYmplY3Qgc2VuZGVyLCBEYXRhR3JpZFZpZXdDZWxsQ2FuY2VsRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRhR3JpZDEgPSBHZXRHcmlkKCk7Ci0gICAgICAgICAgICB2YXIgY2VsbCA9IGRhdGFHcmlkMS5Sb3dzW2UuUm93SW5kZXhdLkNlbGxzW2UuQ29sdW1uSW5kZXhdOwotICAgICAgICAgICAgdmFyIGV4Y2VsQ2VsbCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleGNlbENlbGwuRm9ybXVsYSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9ICI9IiArIGV4Y2VsQ2VsbC5Gb3JtdWxhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YUdyaWQxLlJlZnJlc2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkYXRhR3JpZFZpZXdfV3MxX0NlbGxWYWxpZGF0aW5nKG9iamVjdCBzZW5kZXIsIERhdGFHcmlkVmlld0NlbGxWYWxpZGF0aW5nRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmID0gZS5Gb3JtYXR0ZWRWYWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGYuU3RhcnRzV2l0aCgiPSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKS5DZWxsc1tlLlJvd0luZGV4ICsgMSwgZS5Db2x1bW5JbmRleCArIDFdLkZvcm11bGEgPSBmLlN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXS5Gb3JtdWxhID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2VsbHNbZS5Sb3dJbmRleCArIDEsIGUuQ29sdW1uSW5kZXggKyAxXS5WYWx1ZSA9IENlbGxWYWx1ZVRvT2JqZWN0KGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3guU2hvdyhleC5NZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJpbmRQYWNrYWdlVG9VSSgpOwotICAgICAgICAgICAgdGhpcy5SZWZyZXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYnV0dG9uMV9DbGljayhvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZybSA9IG5ldyBmcm1GdW5jdGlvbnMoX3BhY2thZ2UuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkuVG9MaXN0KCkpOwotICAgICAgICAgICAgZnJtLlNob3dEaWFsb2codGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLnJlc3ggYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0V4Y2VsRm9ybS5yZXN4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY0YWJhLi4wMDAwMDAwCi0tLSBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRXhjZWxGb3JtLnJlc3gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyb290PgotICA8IS0tIAotICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKLSAgICAKLSAgICBWZXJzaW9uIDIuMAotICAgIAotICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCi0gICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKLSAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KLSAgICAKLSAgICBFeGFtcGxlOgotICAgIAotICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KLSAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgotICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KLSAgICA8L2RhdGE+Ci0gICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KLSAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgotICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KLSAgICA8L2RhdGE+Ci0gICAgICAgICAgICAgICAgCi0gICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAotICAgIG5hbWUvdmFsdWUgcGFpcnMuCi0gICAgCi0gICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCi0gICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAotICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCi0gICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAotICAgIG1pbWV0eXBlIHNldC4KLSAgICAKLSAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAotICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKLSAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6Ci0gICAgCi0gICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAotICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAotICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KLSAgICAKLSAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ci0gICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCi0gICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5CaW5hcnkuQmluYXJ5Rm9ybWF0dGVyCi0gICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCi0gICAgCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3Quc29hcC5iYXNlNjQKLSAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKLSAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NAotICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZSBhcnJheSAKLSAgICAgICAgICAgIDogdXNpbmcgYSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotICAgIC0tPgotICA8eHNkOnNjaGVtYSBpZD0icm9vdCIgeG1sbnM9IiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPgotICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIj4KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGEiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KLSAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICA8L3hzZDpzY2hlbWE+Ci0gIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgotICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHZhbHVlPjIuMDwvdmFsdWU+Ci0gIDwvcmVzaGVhZGVyPgotICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+Ci0gICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgotICA8L3Jlc2hlYWRlcj4KLSAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgotICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxtZXRhZGF0YSBuYW1lPSJzYXZlRmlsZURpYWxvZ19TYXZlRXhjZWwuVHJheUxvY2F0aW9uIiB0eXBlPSJTeXN0ZW0uRHJhd2luZy5Qb2ludCwgU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIj4KLSAgICA8dmFsdWU+MTcsIDE3PC92YWx1ZT4KLSAgPC9tZXRhZGF0YT4KLSAgPG1ldGFkYXRhIG5hbWU9IkEuVXNlckFkZGVkQ29sdW1uIiB0eXBlPSJTeXN0ZW0uQm9vbGVhbiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Ij4KLSAgICA8dmFsdWU+VHJ1ZTwvdmFsdWU+Ci0gIDwvbWV0YWRhdGE+Ci0gIDxtZXRhZGF0YSBuYW1lPSJCLlVzZXJBZGRlZENvbHVtbiIgdHlwZT0iU3lzdGVtLkJvb2xlYW4sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSI+Ci0gICAgPHZhbHVlPlRydWU8L3ZhbHVlPgotICA8L21ldGFkYXRhPgotICA8bWV0YWRhdGEgbmFtZT0iQy5Vc2VyQWRkZWRDb2x1bW4iIHR5cGU9IlN5c3RlbS5Cb29sZWFuLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkiPgotICAgIDx2YWx1ZT5UcnVlPC92YWx1ZT4KLSAgPC9tZXRhZGF0YT4KLSAgPG1ldGFkYXRhIG5hbWU9IkQuVXNlckFkZGVkQ29sdW1uIiB0eXBlPSJTeXN0ZW0uQm9vbGVhbiwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5Ij4KLSAgICA8dmFsdWU+VHJ1ZTwvdmFsdWU+Ci0gIDwvbWV0YWRhdGE+Ci0gIDxtZXRhZGF0YSBuYW1lPSJFLlVzZXJBZGRlZENvbHVtbiIgdHlwZT0iU3lzdGVtLkJvb2xlYW4sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSI+Ci0gICAgPHZhbHVlPlRydWU8L3ZhbHVlPgotICA8L21ldGFkYXRhPgotPC9yb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLkRlc2lnbmVyLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuRGVzaWduZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZDQ4Y2UuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuRGVzaWduZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi3vu79uYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtbwotewotICAgIHBhcnRpYWwgY2xhc3MgZnJtRnVuY3Rpb25zCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXF1aXJlZCBkZXNpZ25lciB2YXJpYWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuSUNvbnRhaW5lciBjb21wb25lbnRzID0gbnVsbDsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGJlaW5nIHVzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlzcG9zaW5nIj50cnVlIGlmIG1hbmFnZWQgcmVzb3VyY2VzIHNob3VsZCBiZSBkaXNwb3NlZDsgb3RoZXJ3aXNlLCBmYWxzZS48L3BhcmFtPgotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlzcG9zaW5nICYmIChjb21wb25lbnRzICE9IG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuRGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAjcmVnaW9uIFdpbmRvd3MgRm9ybSBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlcXVpcmVkIG1ldGhvZCBmb3IgRGVzaWduZXIgc3VwcG9ydCAtIGRvIG5vdCBtb2RpZnkKLSAgICAgICAgLy8vIHRoZSBjb250ZW50cyBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoZSBjb2RlIGVkaXRvci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemVDb21wb25lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnRleHRCb3gxID0gbmV3IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRCb3goKTsKLSAgICAgICAgICAgIHRoaXMuU3VzcGVuZExheW91dCgpOwotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyB0ZXh0Qm94MQotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICB0aGlzLnRleHRCb3gxLkRvY2sgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Eb2NrU3R5bGUuRmlsbDsKLSAgICAgICAgICAgIHRoaXMudGV4dEJveDEuTG9jYXRpb24gPSBuZXcgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMCwgMCk7Ci0gICAgICAgICAgICB0aGlzLnRleHRCb3gxLk11bHRpbGluZSA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLnRleHRCb3gxLk5hbWUgPSAidGV4dEJveDEiOwotICAgICAgICAgICAgdGhpcy50ZXh0Qm94MS5TY3JvbGxCYXJzID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuU2Nyb2xsQmFycy5WZXJ0aWNhbDsKLSAgICAgICAgICAgIHRoaXMudGV4dEJveDEuU2l6ZSA9IG5ldyBTeXN0ZW0uRHJhd2luZy5TaXplKDYwNiwgNjc5KTsKLSAgICAgICAgICAgIHRoaXMudGV4dEJveDEuVGFiSW5kZXggPSAwOwotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBmcm1GdW5jdGlvbnMKLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgdGhpcy5BdXRvU2NhbGVEaW1lbnNpb25zID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemVGKDZGLCAxM0YpOwotICAgICAgICAgICAgdGhpcy5BdXRvU2NhbGVNb2RlID0gU3lzdGVtLldpbmRvd3MuRm9ybXMuQXV0b1NjYWxlTW9kZS5Gb250OwotICAgICAgICAgICAgdGhpcy5DbGllbnRTaXplID0gbmV3IFN5c3RlbS5EcmF3aW5nLlNpemUoNjA2LCA2NzkpOwotICAgICAgICAgICAgdGhpcy5Db250cm9scy5BZGQodGhpcy50ZXh0Qm94MSk7Ci0gICAgICAgICAgICB0aGlzLk5hbWUgPSAiZnJtRnVuY3Rpb25zIjsKLSAgICAgICAgICAgIHRoaXMuVGV4dCA9ICJGdW5jdGlvbnMiOwotICAgICAgICAgICAgdGhpcy5SZXN1bWVMYXlvdXQoZmFsc2UpOwotICAgICAgICAgICAgdGhpcy5QZXJmb3JtTGF5b3V0KCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBwcml2YXRlIFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRleHRCb3ggdGV4dEJveDE7Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9GdW5jdGlvbnMuY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNGU1Ny4uMDAwMDAwMAotLS0gYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5jcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwotdXNpbmcgU3lzdGVtLkRhdGE7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwotdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNFeGNlbEZvcm1EZW1vCi17Ci0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgZnJtRnVuY3Rpb25zIDogRm9ybQotICAgIHsKLSAgICAgICAgcHVibGljIGZybUZ1bmN0aW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZnJtRnVuY3Rpb25zKExpc3Q8c3RyaW5nPiBmdW5jdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsKLQotICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmIGluIGZ1bmN0aW9ucykKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2IuQXBwZW5kTGluZShmLlRvVXBwZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0Qm94MS5UZXh0ID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLnJlc3ggYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL0Z1bmN0aW9ucy5yZXN4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWY3ZGUxLi4wMDAwMDAwCi0tLSBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvRnVuY3Rpb25zLnJlc3gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyb290PgotICA8IS0tIAotICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKLSAgICAKLSAgICBWZXJzaW9uIDIuMAotICAgIAotICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCi0gICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKLSAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KLSAgICAKLSAgICBFeGFtcGxlOgotICAgIAotICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KLSAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgotICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KLSAgICA8L2RhdGE+Ci0gICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KLSAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgotICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KLSAgICA8L2RhdGE+Ci0gICAgICAgICAgICAgICAgCi0gICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAotICAgIG5hbWUvdmFsdWUgcGFpcnMuCi0gICAgCi0gICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCi0gICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAotICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCi0gICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAotICAgIG1pbWV0eXBlIHNldC4KLSAgICAKLSAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAotICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKLSAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6Ci0gICAgCi0gICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAotICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAotICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KLSAgICAKLSAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ci0gICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCi0gICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5CaW5hcnkuQmluYXJ5Rm9ybWF0dGVyCi0gICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCi0gICAgCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3Quc29hcC5iYXNlNjQKLSAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKLSAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NAotICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZSBhcnJheSAKLSAgICAgICAgICAgIDogdXNpbmcgYSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotICAgIC0tPgotICA8eHNkOnNjaGVtYSBpZD0icm9vdCIgeG1sbnM9IiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPgotICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIj4KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGEiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KLSAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICA8L3hzZDpzY2hlbWE+Ci0gIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgotICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHZhbHVlPjIuMDwvdmFsdWU+Ci0gIDwvcmVzaGVhZGVyPgotICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+Ci0gICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgotICA8L3Jlc2hlYWRlcj4KLSAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgotICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci08L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9ncmFtLmNzIGIvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc2ZDRlLi4wMDAwMDAwCi0tLSBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwotdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNFeGNlbEZvcm1EZW1vCi17Ci0gICAgc3RhdGljIGNsYXNzIFByb2dyYW0KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtTVEFUaHJlYWRdCi0gICAgICAgIHN0YXRpYyB2b2lkIE1haW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbi5FbmFibGVWaXN1YWxTdHlsZXMoKTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uLlNldENvbXBhdGlibGVUZXh0UmVuZGVyaW5nRGVmYXVsdChmYWxzZSk7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbi5SdW4obmV3IEV4Y2VsRm9ybSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU5NGU1Li4wMDAwMDAwCi0tLSBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi3vu791c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFUFBsdXNFeGNlbEZvcm1EZW1vIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1c0V4Y2VsRm9ybURlbW8iKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAxNCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQotCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KLVthc3NlbWJseTogR3VpZCgiMWRlMjU0NDgtZmVjYi00OTNkLWFkOGQtZDAzZTY4NTNjZWU1IildCi0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6Ci0vLwotLy8gICAgICBNYWpvciBWZXJzaW9uCi0vLyAgICAgIE1pbm9yIFZlcnNpb24gCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIAotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcyBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9SZXNvdXJjZXMuRGVzaWduZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTNkODEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLe+7vy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyA8YXV0by1nZW5lcmF0ZWQ+Ci0vLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLgotLy8gICAgIFJ1bnRpbWUgVmVyc2lvbjo0LjAuMzAzMTkuMTg0MDgKLS8vCi0vLyAgICAgQ2hhbmdlcyB0byB0aGlzIGZpbGUgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmCi0vLyAgICAgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuCi0vLyA8L2F1dG8tZ2VuZXJhdGVkPgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIEVQUGx1c0V4Y2VsRm9ybURlbW8uUHJvcGVydGllcwotewotCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICAgQSBzdHJvbmdseS10eXBlZCByZXNvdXJjZSBjbGFzcywgZm9yIGxvb2tpbmcgdXAgbG9jYWxpemVkIHN0cmluZ3MsIGV0Yy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBTdHJvbmdseVR5cGVkUmVzb3VyY2VCdWlsZGVyCi0gICAgLy8gY2xhc3MgdmlhIGEgdG9vbCBsaWtlIFJlc0dlbiBvciBWaXN1YWwgU3R1ZGlvLgotICAgIC8vIFRvIGFkZCBvciByZW1vdmUgYSBtZW1iZXIsIGVkaXQgeW91ciAuUmVzWCBmaWxlIHRoZW4gcmVydW4gUmVzR2VuCi0gICAgLy8gd2l0aCB0aGUgL3N0ciBvcHRpb24sIG9yIHJlYnVpbGQgeW91ciBWUyBwcm9qZWN0LgotICAgIFtnbG9iYWw6OlN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGVBdHRyaWJ1dGUoIlN5c3RlbS5SZXNvdXJjZXMuVG9vbHMuU3Ryb25nbHlUeXBlZFJlc291cmNlQnVpbGRlciIsICI0LjAuMC4wIildCi0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzLkNvbXBpbGVyR2VuZXJhdGVkQXR0cmlidXRlKCldCi0gICAgaW50ZXJuYWwgY2xhc3MgUmVzb3VyY2VzCi0gICAgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW47Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyByZXNvdXJjZUN1bHR1cmU7Ci0KLSAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkNvZGVBbmFseXNpcy5TdXBwcmVzc01lc3NhZ2VBdHRyaWJ1dGUoIk1pY3Jvc29mdC5QZXJmb3JtYW5jZSIsICJDQTE4MTE6QXZvaWRVbmNhbGxlZFByaXZhdGVDb2RlIildCi0gICAgICAgIGludGVybmFsIFJlc291cmNlcygpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgUmV0dXJucyB0aGUgY2FjaGVkIFJlc291cmNlTWFuYWdlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUoZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuQWR2YW5jZWQpXQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciBSZXNvdXJjZU1hbmFnZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXNvdXJjZU1hbiA9PSBudWxsKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgdGVtcCA9IG5ldyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyKCJFUFBsdXNFeGNlbEZvcm1EZW1vLlByb3BlcnRpZXMuUmVzb3VyY2VzIiwgdHlwZW9mKFJlc291cmNlcykuQXNzZW1ibHkpOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1hbiA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU1hbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAgT3ZlcnJpZGVzIHRoZSBjdXJyZW50IHRocmVhZCdzIEN1cnJlbnRVSUN1bHR1cmUgcHJvcGVydHkgZm9yIGFsbAotICAgICAgICAvLy8gICByZXNvdXJjZSBsb29rdXBzIHVzaW5nIHRoaXMgc3Ryb25nbHkgdHlwZWQgcmVzb3VyY2UgY2xhc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUoZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuQWR2YW5jZWQpXQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyBDdWx0dXJlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUN1bHR1cmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUN1bHR1cmUgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeCBiL0VQUGx1c0V4Y2VsQ2FsY3VsYXRpb25TYW1wbGUvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3ZGJlYi4uMDAwMDAwMAotLS0gYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvUmVzb3VyY2VzLnJlc3gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyb290PgotICA8IS0tIAotICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKLSAgICAKLSAgICBWZXJzaW9uIDIuMAotICAgIAotICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCi0gICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKLSAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KLSAgICAKLSAgICBFeGFtcGxlOgotICAgIAotICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KLSAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgotICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KLSAgICA8L2RhdGE+Ci0gICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KLSAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgotICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KLSAgICA8L2RhdGE+Ci0gICAgICAgICAgICAgICAgCi0gICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAotICAgIG5hbWUvdmFsdWUgcGFpcnMuCi0gICAgCi0gICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCi0gICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAotICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCi0gICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAotICAgIG1pbWV0eXBlIHNldC4KLSAgICAKLSAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAotICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKLSAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6Ci0gICAgCi0gICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAotICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAotICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KLSAgICAKLSAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ci0gICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCi0gICAgICAgICAgICA6IFN5c3RlbS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuQmluYXJ5LkJpbmFyeUZvcm1hdHRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotICAgIAotICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LnNvYXAuYmFzZTY0Ci0gICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCi0gICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5Tb2FwLlNvYXBGb3JtYXR0ZXIKLSAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KLQotICAgIG1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQKLSAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW50byBhIGJ5dGUgYXJyYXkgCi0gICAgICAgICAgICA6IHVzaW5nIGEgU3lzdGVtLkNvbXBvbmVudE1vZGVsLlR5cGVDb252ZXJ0ZXIKLSAgICAgICAgICAgIDogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KLSAgICAtLT4KLSAgPHhzZDpzY2hlbWEgaWQ9InJvb3QiIHhtbG5zPSIiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdCIgbXNkYXRhOklzRGF0YVNldD0idHJ1ZSI+Ci0gICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGFkYXRhIj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KLSAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzaGVhZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gIDwveHNkOnNjaGVtYT4KLSAgPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+Ci0gICAgPHZhbHVlPnRleHQvbWljcm9zb2Z0LXJlc3g8L3ZhbHVlPgotICA8L3Jlc2hlYWRlcj4KLSAgPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4KLSAgICA8dmFsdWU+Mi4wPC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj4KLSAgICA8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+Ci0gIDwvcmVzaGVhZGVyPgotICA8cmVzaGVhZGVyIG5hbWU9IndyaXRlciI+Ci0gICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgotICA8L3Jlc2hlYWRlcj4KLTwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3MuRGVzaWduZXIuY3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3MuRGVzaWduZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDhmYTIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1NldHRpbmdzLkRlc2lnbmVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAot77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDxhdXRvLWdlbmVyYXRlZD4KLS8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCi0vLyAgICAgUnVudGltZSBWZXJzaW9uOjQuMC4zMDMxOS4xODQwOAotLy8KLS8vICAgICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYKLS8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4KLS8vIDwvYXV0by1nZW5lcmF0ZWQ+Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgRVBQbHVzRXhjZWxGb3JtRGVtby5Qcm9wZXJ0aWVzCi17Ci0KLQotICAgIFtnbG9iYWw6OlN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMuQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUoKV0KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlQXR0cmlidXRlKCJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLkVkaXRvcnMuU2V0dGluZ3NEZXNpZ25lci5TZXR0aW5nc1NpbmdsZUZpbGVHZW5lcmF0b3IiLCAiMTEuMC4wLjAiKV0KLSAgICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZXR0aW5ncyA6IGdsb2JhbDo6U3lzdGVtLkNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25TZXR0aW5nc0Jhc2UKLSAgICB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0dGluZ3MgZGVmYXVsdEluc3RhbmNlID0gKChTZXR0aW5ncykoZ2xvYmFsOjpTeXN0ZW0uQ29uZmlndXJhdGlvbi5BcHBsaWNhdGlvblNldHRpbmdzQmFzZS5TeW5jaHJvbml6ZWQobmV3IFNldHRpbmdzKCkpKSk7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXR0aW5ncyBEZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3Muc2V0dGluZ3MgYi9FUFBsdXNFeGNlbENhbGN1bGF0aW9uU2FtcGxlL1Byb3BlcnRpZXMvU2V0dGluZ3Muc2V0dGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjQ1NjUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzRXhjZWxDYWxjdWxhdGlvblNhbXBsZS9Qcm9wZXJ0aWVzL1NldHRpbmdzLnNldHRpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PgotPFNldHRpbmdzRmlsZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vMjAwNC8wMS9zZXR0aW5ncyIgQ3VycmVudFByb2ZpbGU9IihEZWZhdWx0KSI+Ci0gIDxQcm9maWxlcz4KLSAgICA8UHJvZmlsZSBOYW1lPSIoRGVmYXVsdCkiIC8+Ci0gIDwvUHJvZmlsZXM+Ci0gIDxTZXR0aW5ncyAvPgotPC9TZXR0aW5nc0ZpbGU+CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0LnJ1bnNldHRpbmdzIGIvRVBQbHVzVGVzdC5ydW5zZXR0aW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1NWJhOS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0LnJ1bnNldHRpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFJ1blNldHRpbmdzPgotICA8IS0tIENvbmZpZ3VyYXRpb25zIHRoYXQgYWZmZWN0IHRoZSBUZXN0IEZyYW1ld29yayAtLT4KLSAgPE1TVGVzdD4KLSAgICA8RGVsZXRlRGVwbG95bWVudERpcmVjdG9yeUFmdGVyVGVzdFJ1bklzQ29tcGxldGU+ZmFsc2U8L0RlbGV0ZURlcGxveW1lbnREaXJlY3RvcnlBZnRlclRlc3RSdW5Jc0NvbXBsZXRlPgotICA8L01TVGVzdD4KLQotCi08L1J1blNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQWRkcmVzcy5jcyBiL0VQUGx1c1Rlc3QvQWRkcmVzcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwOGQxYS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0FkZHJlc3MuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU3VtbWFyeSBkZXNjcmlwdGlvbiBmb3IgQWRkcmVzcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQWRkcmVzcwotICAgIHsKLSAgICAgICAgcHVibGljIEFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNvbnN0cnVjdG9yIGxvZ2ljIGhlcmUKLSAgICAgICAgICAgIC8vCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRlc3RDb250ZXh0IHRlc3RDb250ZXh0SW5zdGFuY2U7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy9HZXRzIG9yIHNldHMgdGhlIHRlc3QgY29udGV4dCB3aGljaCBwcm92aWRlcwotICAgICAgICAvLy9pbmZvcm1hdGlvbiBhYm91dCBhbmQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlIGN1cnJlbnQgdGVzdCBydW4uCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFRlc3RDb250ZXh0IFRlc3RDb250ZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0Q29udGV4dEluc3RhbmNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVzdENvbnRleHRJbnN0YW5jZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBBZGRpdGlvbmFsIHRlc3QgYXR0cmlidXRlcwotICAgICAgICAvLwotICAgICAgICAvLyBZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcyB5b3Ugd3JpdGUgeW91ciB0ZXN0czoKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVXNlIENsYXNzSW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY2xhc3MKLSAgICAgICAgLy8gW0NsYXNzSW5pdGlhbGl6ZSgpXQotICAgICAgICAvLyBwdWJsaWMgc3RhdGljIHZvaWQgTXlDbGFzc0luaXRpYWxpemUoVGVzdENvbnRleHQgdGVzdENvbnRleHQpIHsgfQotICAgICAgICAvLwotICAgICAgICAvLyBVc2UgQ2xhc3NDbGVhbnVwIHRvIHJ1biBjb2RlIGFmdGVyIGFsbCB0ZXN0cyBpbiBhIGNsYXNzIGhhdmUgcnVuCi0gICAgICAgIC8vIFtDbGFzc0NsZWFudXAoKV0KLSAgICAgICAgLy8gcHVibGljIHN0YXRpYyB2b2lkIE15Q2xhc3NDbGVhbnVwKCkgeyB9Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFVzZSBUZXN0SW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyBlYWNoIHRlc3QgCi0gICAgICAgIC8vIFtUZXN0SW5pdGlhbGl6ZSgpXQotICAgICAgICAvLyBwdWJsaWMgdm9pZCBNeVRlc3RJbml0aWFsaXplKCkgeyB9Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFVzZSBUZXN0Q2xlYW51cCB0byBydW4gY29kZSBhZnRlciBlYWNoIHRlc3QgaGFzIHJ1bgotICAgICAgICAvLyBbVGVzdENsZWFudXAoKV0KLSAgICAgICAgLy8gcHVibGljIHZvaWQgTXlUZXN0Q2xlYW51cCgpIHsgfQotICAgICAgICAvLwotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluc2VydERlbGV0ZVRlc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJBMTpCMyIpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5BZGRSb3coMiwgNCkuQWRkcmVzcywgIkExOkI3Iik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5BZGRDb2x1bW4oMiwgNCkuQWRkcmVzcywgIkExOkYzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVDb2x1bW4oMiwgMSkuQWRkcmVzcywgIkExOkEzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVSb3coMiwgMikuQWRkcmVzcywgIkExOkIxIik7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhZGRyLkRlbGV0ZVJvdygxLCAzKSwgbnVsbCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5EZWxldGVDb2x1bW4oMSwgMiksIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTcGxpdEFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJDMzpGOCIpOwotCi0gICAgICAgICAgICBhZGRyLkluc2VydChuZXcgRXhjZWxBZGRyZXNzQmFzZSgiRzkiKSwgRXhjZWxBZGRyZXNzQmFzZS5lU2hpZnRUeXBlLlJpZ2h0KTsKLSAgICAgICAgICAgIGFkZHIuSW5zZXJ0KG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJHMyIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOwotICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIkM5IiksIEV4Y2VsQWRkcmVzc0Jhc2UuZVNoaWZ0VHlwZS5SaWdodCk7Ci0gICAgICAgICAgICBhZGRyLkluc2VydChuZXcgRXhjZWxBZGRyZXNzQmFzZSgiQjIiKSwgRXhjZWxBZGRyZXNzQmFzZS5lU2hpZnRUeXBlLlJpZ2h0KTsKLSAgICAgICAgICAgIGFkZHIuSW5zZXJ0KG5ldyBFeGNlbEFkZHJlc3NCYXNlKCJCMyIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOwotICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIkQ6RCIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuUmlnaHQpOwotICAgICAgICAgICAgYWRkci5JbnNlcnQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoIjU6NSIpLCBFeGNlbEFkZHJlc3NCYXNlLmVTaGlmdFR5cGUuRG93bik7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhMSA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkSyQ0NDUiKTsKLSAgICAgICAgICAgIHZhciBhMiA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkSyQ0NDU6JE0kNDQ5LFNhbGVzRGF0YSEkTiQ0NDg6JFEkNDU0LFNhbGVzRGF0YSEkTCQ0NTg6JE8kNDY0Iik7Ci0gICAgICAgICAgICB2YXIgYTMgPSBuZXcgRXhjZWxBZGRyZXNzKCJTYWxlc0RhdGEhJEskNDQ1OiRMJDQ0OCIpOwotICAgICAgICAgICAgLy92YXIgYTQgPSBuZXcgRXhjZWxBZGRyZXNzKCInWzFdUmlza11UYXRUV1JGb3JtX1RXUldFRUtMWTIwMTMwOTI2MDkwJyEkTiQ1MjciKTsKLSAgICAgICAgICAgIHZhciBhNSA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVtbI0FsbF0sW1RpdGxlXV0iKTsKLSAgICAgICAgICAgIHZhciBhNiA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVsjQWxsXSIpOwotICAgICAgICAgICAgdmFyIGE3ID0gbmV3IEV4Y2VsQWRkcmVzcygiVGFibGUxW1sjSGVhZGVyc10sW0ZpcnN0TmFtZV06W0xhc3ROYW1lXV0iKTsKLSAgICAgICAgICAgIHZhciBhOCA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVsjSGVhZGVyc10iKTsKLSAgICAgICAgICAgIHZhciBhOSA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMltbI0FsbF0sW1N1YlRvdGFsXV0iKTsKLSAgICAgICAgICAgIHZhciBhMTAgPSBuZXcgRXhjZWxBZGRyZXNzKCJUYWJsZTJbI0FsbF0iKTsKLSAgICAgICAgICAgIHZhciBhMTEgPSBuZXcgRXhjZWxBZGRyZXNzKCJUYWJsZTFbWyNBbGxdLFtGcmVpZ2h0XV0iKTsKLSAgICAgICAgICAgIHZhciBhMTIgPSBuZXcgRXhjZWxBZGRyZXNzKCJbMV0hVGFibGUxW1tMYXN0TmFtZV06W05hbWVdXSIpOwotICAgICAgICAgICAgdmFyIGExMyA9IG5ldyBFeGNlbEFkZHJlc3MoIlRhYmxlMVtbI0FsbF0sW0ZyZWlnaHRdXSIpOwotICAgICAgICAgICAgdmFyIGExNCA9IG5ldyBFeGNlbEFkZHJlc3MoIlNhbGVzRGF0YSEkTiQ1Kyd0ZXN0JycxJyEkSiQzMyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzVmFsaWRDZWxsQWRyZXNzKCkKLSAgICAgICAgewotICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExIikpOwotICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExMDQ4NTc2IikpOwotICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRDEiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzVHJ1ZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiWEZEMTA0ODU3NiIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNUcnVlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJUYWJsZTEhQTEiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzVHJ1ZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExMDQ4NTc2IikpOwotICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxIikpOwotICAgICAgICAgIEFzc2VydC5Jc1RydWUoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxMDQ4NTc2IikpOwotICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJBIikpOwotICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJBIikpOwotICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJYRkQiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRCIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMSIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMTA0ODU3NiIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMSIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiMTA0ODU3NiIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiQTE6QTEwNDg1NzYiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExOlhGRDEiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIkExMDQ4NTc2OlhGRDEwNDg1NzYiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlhGRDE6WEZEMTA0ODU3NiIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExOkExMDQ4NTc2IikpOwotICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZENlbGxBZGRyZXNzKCJUYWJsZTEhQTE6WEZEMSIpKTsKLSAgICAgICAgICBBc3NlcnQuSXNGYWxzZShFeGNlbENlbGxCYXNlLklzVmFsaWRDZWxsQWRkcmVzcygiVGFibGUxIUExMDQ4NTc2OlhGRDEwNDg1NzYiKSk7Ci0gICAgICAgICAgQXNzZXJ0LklzRmFsc2UoRXhjZWxDZWxsQmFzZS5Jc1ZhbGlkQ2VsbEFkZHJlc3MoIlRhYmxlMSFYRkQxOlhGRDEwNDg1NzYiKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQ2FsY3VsYXRpb24uY3MgYi9FUFBsdXNUZXN0L0NhbGN1bGF0aW9uLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA5ZTA3Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvQ2FsY3VsYXRpb24uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtEZXBsb3ltZW50SXRlbSgiV29ya2Jvb2tzIiwgInRhcmdldEZvbGRlciIpXQotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIENhbGN1bGF0aW9uCi0gICAgewotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIENhbHVsYXRpb24oKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY2hhaW4ueGxzeCIpKTsKLSAgICAgICAgLy8gICAgcGNrLldvcmtib29rLkNhbGN1bGF0ZSgpOwotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoNTBELCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQzEiXS5WYWx1ZSk7Ci0gICAgICAgIC8vfQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIENhbHVsYXRpb24yKCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXGNoYWluVGVzdC54bHN4IikpOwotICAgICAgICAvLyAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgxMTI0OTk5OTYwMzgyRCwgcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkMxIl0uVmFsdWUpOwotICAgICAgICAvL30KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBDYWx1bGF0aW9uMygpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxuYW1lcy54bHN4IikpOwotICAgICAgICAvLyAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgIC8vICAgIC8vQXNzZXJ0LkFyZUVxdWFsKDExMjQ5OTk5NjAzODJELCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQzEiXS5WYWx1ZSk7Ci0gICAgICAgIC8vfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsdWxhdGlvblRlc3REYXRhdHlwZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzPXBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsYzEiKTsKLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBMSIsIChzaG9ydCkxKTsKLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBMiIsIChsb25nKTIpOwotICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkEzIiwgKFNpbmdsZSkzKTsKLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBNCIsIChkb3VibGUpNCk7Ci0gICAgICAgICAgICB3cy5TZXRWYWx1ZSgiQTUiLCAoRGVjaW1hbCk1KTsKLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBNiIsIChieXRlKTYpOwotICAgICAgICAgICAgd3MuU2V0VmFsdWUoIkE3IiwgbnVsbCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEwIl0uRm9ybXVsYSA9ICJTdW0oQTE6QTgpIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTEiXS5Gb3JtdWxhID0gIlN1YlRvdGFsKDksQTE6QTgpIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTIiXS5Gb3JtdWxhID0gIkF2ZXJhZ2UoQTE6QTgpIjsKLQotICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjFELCB3cy5DZWxsc1siYTEwIl0uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxRCwgd3MuQ2VsbHNbImExMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMUQvNiwgd3MuQ2VsbHNbImExMiJdLlZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsY3VsYXRlVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0KLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBMSIsKCBzaG9ydCkxKTsKLSAgICAgICAgICAgIHZhciB2PXdzLkNhbGN1bGF0ZSgiMi41LUExK0FCUygtMy4wKS1TSU4oMykiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LjM1ODksIE1hdGguUm91bmQoKGRvdWJsZSl2LCA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHdzLlJvdygxKS5IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgdiA9IHdzLkNhbGN1bGF0ZSgic3VidG90YWwoMTA5LGExOmExMCkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwRCwgdik7Ci0KLSAgICAgICAgICAgIHYgPSB3cy5DYWxjdWxhdGUoIi1zdWJ0b3RhbCg5LGExOmEzKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xRCwgdik7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0ZVRlc3RJc0Z1bmN0aW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0KLSAgICAgICAgICAgIHdzLlNldFZhbHVlKDEsIDEsIDEuMEQpOwotICAgICAgICAgICAgd3MuU2V0Rm9ybXVsYSgxLCAyLCAiaXNibGFuayhBMTpBNSkiKTsKLSAgICAgICAgICAgIHdzLlNldEZvcm11bGEoMSwgMywgImNvbmNhdGVuYXRlKGExLGEyLGEzKSIpOwotICAgICAgICAgICAgd3MuU2V0Rm9ybXVsYSgxLCA0LCAiUm93KCkiKTsKLSAgICAgICAgICAgIHdzLlNldEZvcm11bGEoMSwgNSwgIlJvdyhhMykiKTsKLSAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDYWx1bGF0aW9uNCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vQzpcRGV2ZWxvcG1lbnRcZXBwbHVzIGZvcm11bGFzXEVQUGx1c1Rlc3RcV29ya2Jvb2tzXEZvcm11bGFUZXN0Lnhsc3gKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XERldmVsb3BtZW50XGVwcGx1cyBmb3JtdWxhc1xFUFBsdXNUZXN0XFdvcmtib29rc1xGb3JtdWxhVGVzdC54bHN4IikpOwotICAgICAgICAgICAgLy92YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQXBwRG9tYWluLkN1cnJlbnREb21haW4uQmFzZURpcmVjdG9yeSArICIuLlxcLi5cXC4uXFwuLlxcRVBQbHVzVGVzdFxcd29ya2Jvb2tzXFxGb3JtdWxhVGVzdC54bHN4IikpOwotICAgICAgICAgICAgcGNrLldvcmtib29rLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQ5MEQsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJENSJdLlZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsdWxhdGlvblZhbGlkYXRpb25FeGNlbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkaXIgPSBBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5OwotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShkaXIsICJXb3JrYm9va3MiLCAiRm9ybXVsYVRlc3QueGxzeCIpKSk7Ci0KLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJWYWxpZGF0ZUZvcm11bGFzIl07Ci0gICAgICAgICAgICB2YXIgZnIgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHdzLkNlbGxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY2VsbC5Gb3JtdWxhKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyLkFkZChjZWxsLkFkZHJlc3MsIGNlbGwuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciBuRXJyb3JzID0gMDsKLSAgICAgICAgICAgIHZhciBlcnJvcnMgPSBuZXcgTGlzdDxUdXBsZTxzdHJpbmcsIG9iamVjdCwgb2JqZWN0Pj4oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhZHIgaW4gZnIuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmclthZHJdIGlzIGRvdWJsZSAmJiB3cy5DZWxsc1thZHJdLlZhbHVlIGlzIGRvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQxID0gQ29udmVydC5Ub0RvdWJsZShmclthZHJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkMiA9IENvbnZlcnQuVG9Eb3VibGUod3MuQ2VsbHNbYWRyXS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5BYnMoZDEgLSBkMikgPCAwLjAwMDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZyW2Fkcl0sIHdzLkNlbGxzW2Fkcl0uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZyW2Fkcl0sIHdzLkNlbGxzW2Fkcl0uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvcnMuQWRkKG5ldyBUdXBsZTxzdHJpbmcsIG9iamVjdCwgb2JqZWN0PihhZHIsIGZyW2Fkcl0sIHdzLkNlbGxzW2Fkcl0uVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgbkVycm9ycysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdE9uZUNlbGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXEVQUGx1c1Rlc3RhcmtcVGVzdDQueGxzbSIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7IAotICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtzaGVldHNbIlLDpG50ZWLDpHJhbmRlIGZvcm1hdGVyYXQgdXRsYW5kIl0uQ2VsbHNbIk0xMyJdLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBkLCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUsOkbnRlYsOkcmFuZGUgZm9ybWF0ZXJhdCB1dGxhbmQiXS5DZWxsc1siTTEzIl0uVmFsdWUpOyAgCi0gICAgICAgIH0KLQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdFByZWNlZGVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXEVQUGx1c1Rlc3RhcmtcUHJlY2VkZW5jZS54bHN4IikpOwotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuTGFzdCgpOwotICAgICAgICAgICAgcGNrLldvcmtib29rLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE1MGQsIHdzLkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdERhdGFUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxFUFBsdXNUZXN0YXJrXGNhbGNfYW1vdW50Lnhsc3giKSk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIC8vd3MuTmFtZXMuQWRkKCJOYW1lMSIsd3MuQ2VsbHNbIkExIl0pOwotICAgICAgICAgICAgLy93cy5OYW1lcy5BZGQoIk5hbWUyIiwgd3MuQ2VsbHNbIkEyIl0pOwotICAgICAgICAgICAgd3MuTmFtZXNbIlBSSUNFIl0uVmFsdWUgPSAzMDsKLSAgICAgICAgICAgIHdzLk5hbWVzWyJRVUFOVElUWSJdLlZhbHVlID0gMTA7Ci0KLSAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICB3cy5OYW1lc1siUFJJQ0UiXS5WYWx1ZSA9IDQwOwotICAgICAgICAgICAgd3MuTmFtZXNbIlFVQU5USVRZIl0uVmFsdWUgPSAyMDsKLQotICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGNUd2ljZUVycm9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ2FsY1Rlc3QiKTsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZFZhbHVlKCJQUklDRSIsIDEwKTsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZFZhbHVlKCJRVUFOVElUWSIsIDExKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkZvcm11bGE9IlBSSUNFKlFVQU5USVRZIjsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZEZvcm11bGEoIkFNT1VOVCIsICJQUklDRSpRVUFOVElUWSIpOwotCi0gICAgICAgICAgICB3cy5OYW1lc1siUFJJQ0UiXS5WYWx1ZSA9IDMwOwotICAgICAgICAgICAgd3MuTmFtZXNbIlFVQU5USVRZIl0uVmFsdWUgPSAxMDsKLQotICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAwRCwgd3MuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMwMEQsIHdzLk5hbWVzWyJBTU9VTlQiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB3cy5OYW1lc1siUFJJQ0UiXS5WYWx1ZSA9IDQwOwotICAgICAgICAgICAgd3MuTmFtZXNbIlFVQU5USVRZIl0uVmFsdWUgPSAyMDsKLQotICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoODAwRCwgd3MuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDgwMEQsIHdzLk5hbWVzWyJBTU9VTlQiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElmRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjVGVzdCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAidGVzdDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkE1Il0uVmFsdWUgPSAidGVzdDIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiU2FudCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTMiXS5WYWx1ZSA9ICJGYWxza3QiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJpZihBMT49QTUsdHJ1ZSxBMykiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJpc1RleHQoYTEpIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMiJdLkZvcm11bGEgPSAiaXNUZXh0KFwiVGVzdFwiKSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjMiXS5Gb3JtdWxhID0gImlzVGV4dCgxKSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjQiXS5Gb3JtdWxhID0gImlzVGV4dCh0cnVlKSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siYzEiXS5Gb3JtdWxhID0gIm1pZChhMSw0LDE1KSI7Ci0KLSAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3RBbGxXb3JrYm9va3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiPW5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAvL0FkZCBzaGVldHMgdG8gdGVzdCBpbiB0aGlzIGRpcmVjdG9yeSBvciBjaGFuZ2UgaXQgdG8geW91ciB0ZXN0cGF0aC4KLSAgICAgICAgICAgIHN0cmluZyBwYXRoID0gQCJDOlx0ZW1wXEVQUGx1c1Rlc3Rhcmtcd29ya2Jvb2tzIjsKLSAgICAgICAgICAgIGlmKCFEaXJlY3RvcnkuRXhpc3RzKHBhdGgpKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhwYXRoLCAiKi54bHMqIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuQXBwZW5kKEdldE91dHB1dChmaWxlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYi5MZW5ndGggPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHN0cmluZy5Gb3JtYXQoIlRlc3RBbGxXb3Jrb29rc3swfS50eHQiLCBEYXRlVGltZS5Ob3cuVG9TaG9ydERhdGVTdHJpbmcoKSArICIgIiArIERhdGVUaW1lLk5vdy5Ub1Nob3J0RGF0ZVN0cmluZygpKSwgc2IuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiVGVzdCBmYWlsZWQgd2l0aFxyXG5cclxuIiArIHNiLlRvU3RyaW5nKCkpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0T3V0cHV0KHN0cmluZyBmaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKGZpbGUpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZnIgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gcGNrLldvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiB3cy5DZWxscykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNlbGwuRm9ybXVsYSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmci5BZGQod3MuUG9zaXRpb25JRC5Ub1N0cmluZygpICsgIiwiICsgY2VsbC5BZGRyZXNzLCBjZWxsLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuX3ZhbHVlcy5TZXRWYWx1ZShjZWxsLlN0YXJ0LlJvdywgY2VsbC5TdGFydC5Db2x1bW4sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgbkVycm9ycyA9IDA7Ci0gICAgICAgICAgICAgICAgdmFyIGVycm9ycyA9IG5ldyBMaXN0PFR1cGxlPHN0cmluZywgb2JqZWN0LCBvYmplY3Q+PigpOwotICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHNoZWV0PW51bGw7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGFkcj0iIjsKLSAgICAgICAgICAgICAgICB2YXIgZmlsZUVyciA9IG5ldyBTeXN0ZW0uSU8uU3RyZWFtV3JpdGVyKCJjOlxcdGVtcFxcZXJyLnR4dCIpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGZyLktleXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwbCA9IGNlbGwuU3BsaXQoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpeCA9IGludC5QYXJzZShzcGxbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1tpeF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHIgPSBzcGxbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJbY2VsbF0gaXMgZG91YmxlICYmIChzaGVldC5DZWxsc1thZHJdLlZhbHVlIGlzIGRvdWJsZSB8fCBzaGVldC5DZWxsc1thZHJdLlZhbHVlIGlzIGRlY2ltYWwgIHx8IHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWUuR2V0VHlwZSgpLklzUHJpbWl0aXZlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZDEgPSBDb252ZXJ0LlRvRG91YmxlKGZyW2NlbGxdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZDIgPSBDb252ZXJ0LlRvRG91YmxlKHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKE1hdGguQWJzKGQxIC0gZDIpIDwgZG91YmxlLkVwc2lsb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG91YmxlLkVxdWFscyhkMSxkMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJvcnMuQWRkKG5ldyBUdXBsZTxzdHJpbmcsIG9iamVjdCwgb2JqZWN0PihhZHIsIGZyW2NlbGxdLCBzaGVldC5DZWxsc1thZHJdLlZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFcnIuV3JpdGVMaW5lKCJEaWZmIGNlbGwgIiArIHNoZWV0Lk5hbWUgKyAiISIgKyBhZHIgKyJcdCIgKyBkMS5Ub1N0cmluZygiUjE1IikgKyAiXHQiICsgZDIuVG9TdHJpbmcoIlIxNSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmcltjZWxsXT8/IiIpLlRvU3RyaW5nKCkgIT0gKHNoZWV0LkNlbGxzW2Fkcl0uVmFsdWU/PyIiKS5Ub1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVyci5Xcml0ZUxpbmUoIlN0cmluZz8gIGNlbGwgIiArIHNoZWV0Lk5hbWUgKyAiISIgKyBhZHIgKyAiXHQiICsgKGZyW2NlbGxdID8/ICIiKS5Ub1N0cmluZygpICsgIlx0IiArIChzaGVldC5DZWxsc1thZHJdLlZhbHVlPz8iIikuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXJyb3JzLkFkZChuZXcgVHVwbGU8c3RyaW5nLCBvYmplY3QsIG9iamVjdD4oYWRyLCBmcltjZWxsXSwgc2hlZXQuQ2VsbHNbYWRyXS5WYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVyci5Xcml0ZUxpbmUoIkV4Y2VwdGlvbiBjZWxsICIgKyBzaGVldC5OYW1lICsgIiEiICsgYWRyICsgIlx0IiArIGZyW2NlbGxdLlRvU3RyaW5nKCkgKyAiXHQiICsgc2hlZXQuQ2VsbHNbYWRyXS5WYWx1ZSArICAiXHQiICsgZS5NZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFcnIuV3JpdGVMaW5lKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFcnIuV3JpdGVMaW5lKGUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuRXJyb3JzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsZUVyci5DbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuRXJyb3JzLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0NlbGxTdG9yZVRlc3QuY3MgYi9FUFBsdXNUZXN0L0NlbGxTdG9yZVRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODM5YTUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9DZWxsU3RvcmVUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDZWxsU3RvcmVUZXN0IDogVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIAotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSW5zZXJ0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cz1fcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJbnNlcnQxIik7Ci0gICAgICAgICAgICBMb2FkRGF0YSh3cyk7Ci0KLSAgICAgICAgICAgIHdzLkluc2VydFJvdygyLCAxMDAwKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgxMDAyLDEpLCIxLDAiKTsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdygxMDAzLCAxMDAwKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgyMDAzLCAxKSwgIjIsMCIpOwotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDIwMDQsIDEwMDApOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDMwMDQsIDEpLCAiMywwIik7Ci0gICAgICAgICAgICB3cy5JbnNlcnRSb3coMjAwNiwgMTAwMCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoNDAwNSwgMSksICI0LDAiKTsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdyg0NTAwLCA1MDApOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDUwMDAsIDEpLCAiNDk5LDAiKTsKLQotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDEsIDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDEwMDMsIDEpLCAiMSwwIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoNTAwMSwgMSksICI0OTksMCIpOwotCi0gICAgICAgICAgICB3cy5JbnNlcnRSb3coMSwgMTUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDQwMjAsIDEpLCAiMywwIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoNTAxNiwgMSksICI0OTksMCIpOwotICAgCi0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluc2VydDIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJbnNlcnQyLTEiKTsKLSAgICAgICAgICAgIExvYWREYXRhKHdzKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkluc2VydFJvdygxLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZSgzMywxKSwiMCwwIik7Ci0KLSAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0Mi0yIik7Ci0gICAgICAgICAgICBMb2FkRGF0YSh3cyk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3coMTUsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlKDEsIDEpLCAiMCwwIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWUoNDcsIDEpLCAiMTQsMCIpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnQzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0MyIpOwotICAgICAgICAgICAgTG9hZERhdGEod3MpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSs9NCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cy5JbnNlcnRSb3coaSsxLCAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnRSYW5kb21UZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0NC0xIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDAwKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDUwMDA7IGkgPiAwOyBpLT0yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkluc2VydFJvdyhpLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRW51bUNlbGxzdG9yZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImVudW0iKTsKLQotICAgICAgICAgICAgTG9hZERhdGEod3MsIDUwMDApOwotCi0gICAgICAgICAgICB2YXIgbyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIDIsIDEsIDUsIDMpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGkgaW4gbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQ2VsbHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEZWxldGUiKTsKLSAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDAwKTsKLQotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIsIDIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIzLDAiLHdzLkdldFZhbHVlKDIsMSkpOwotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDEwLCAxMCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIxLDAiLCB3cy5HZXRWYWx1ZSgxMCwgMSkpOwotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDUwLCA0MCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEwMSwwIiwgd3MuR2V0VmFsdWUoNTAsIDEpKTsKLSAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxMDAsIDEwMCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjI1MSwwIiwgd3MuR2V0VmFsdWUoMTAwLCAxKSk7Ci0gICAgICAgICAgICB3cy5EZWxldGVSb3coMSwgMzEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI0MywwIiwgd3MuR2V0VmFsdWUoMSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDZWxsc0ZpcnN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGVsZXRlRmlyc3QiKTsKLSAgICAgICAgICAgIExvYWREYXRhKHdzLCA1MDAwKTsKLQotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDMyLCAzMCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDUwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3MuRGVsZXRlUm93KDEsMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUluc2VydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlbGV0ZUluc2VydCIpOwotICAgICAgICAgICAgTG9hZERhdGEod3MsIDUwMDApOwotCi0gICAgICAgICAgICB3cy5EZWxldGVSb3coMiwgMzMpOwotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDIsIDM4KTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKGkgKyAyLDEsIGkgKyAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgTG9hZERhdGEoRXhjZWxXb3Jrc2hlZXQgd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvYWREYXRhKHdzLCAxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgTG9hZERhdGEoRXhjZWxXb3Jrc2hlZXQgd3MsIGludCByb3dzLCBpbnQgY29scz0xKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJvd3M7IHIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvbHM7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKHIrMSwgYysxLCByLlRvU3RyaW5nKCkrIiwiK2MuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGaWxsSW5zZXJ0VGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZpbGxJbnNlcnQiKTsKLQotICAgICAgICAgICAgTG9hZERhdGEod3MsIDUwMCk7Ci0KLSAgICAgICAgICAgIHZhciByPTE7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MTtpPD01MDA7aSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkluc2VydFJvdyhyLGkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoaS0xKS5Ub1N0cmluZygpKyIsMCIsIHdzLkdldFZhbHVlKHIraSwxKS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByKz1pKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0NvbW1lbnRzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvQ29tbWVudHNUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJhODE1Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvQ29tbWVudHNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQ29tbWVudHNUZXN0Ci0gICAgewotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEV4Y2VsQ29tbWVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZmkgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGdvb2dsZUNvbW1lbnRzXENvbW1lbnRzLmV4Y2VsLnhsc3giKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0MSA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHNoZWV0MS5Db21tZW50cy5Db3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRHb29nbGVDb21tZW50cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZ29vZ2xlQ29tbWVudHNcQ29tbWVudHMuZ29vZ2xlLnhsc3giKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0MSA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHNoZWV0MS5Db21tZW50cy5Db3VudCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOb3RlIGZvciBjb2x1bW4gJ0FkZHJlc3MnLiIsIHNoZWV0MS5Db21tZW50c1swXS5UZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbmRpdGlvbmFsRm9ybWF0dGluZy5jcyBiL0VQUGx1c1Rlc3QvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbmRpdGlvbmFsRm9ybWF0dGluZy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkOTM4My4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db25kaXRpb25hbEZvcm1hdHRpbmcuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gVGVzdCB0aGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBmZWF0dXJlCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtUZXN0Q2xhc3NdCi0gIHB1YmxpYyBjbGFzcyBDb25kaXRpb25hbEZvcm1hdHRpbmcKLSAgewotICAgIHByaXZhdGUgVGVzdENvbnRleHQgdGVzdENvbnRleHRJbnN0YW5jZTsKLSAgICBwcml2YXRlIHN0YXRpYyBFeGNlbFBhY2thZ2UgX3BjazsKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy9HZXRzIG9yIHNldHMgdGhlIHRlc3QgY29udGV4dCB3aGljaCBwcm92aWRlcwotICAgIC8vL2luZm9ybWF0aW9uIGFib3V0IGFuZCBmdW5jdGlvbmFsaXR5IGZvciB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLSAgICAvLy88L3N1bW1hcnk+Ci0gICAgcHVibGljIFRlc3RDb250ZXh0IFRlc3RDb250ZXh0Ci0gICAgewotICAgICAgZ2V0Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiB0ZXN0Q29udGV4dEluc3RhbmNlOwotICAgICAgfQotICAgICAgc2V0Ci0gICAgICB7Ci0gICAgICAgIHRlc3RDb250ZXh0SW5zdGFuY2UgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjcmVnaW9uIEFkZGl0aW9uYWwgdGVzdCBhdHRyaWJ1dGVzCi0gICAgLy8gWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXMgeW91IHdyaXRlIHlvdXIgdGVzdHM6Ci0gICAgLy8gVXNlIENsYXNzSW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCBpbiB0aGUgY2xhc3MKLSAgICBbQ2xhc3NJbml0aWFsaXplKCldCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIE15Q2xhc3NJbml0aWFsaXplKFRlc3RDb250ZXh0IHRlc3RDb250ZXh0KQotICAgIHsKLSAgICAgIGlmICghRGlyZWN0b3J5LkV4aXN0cygiVGVzdCIpKQotICAgICAgewotICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3Rvcnkoc3RyaW5nLkZvcm1hdCgiVGVzdCIpKTsKLSAgICAgIH0KLQotICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiVGVzdFxDb25kaXRpb25hbEZvcm1hdHRpbmcueGxzeCIpKTsKLSAgICB9Ci0KLSAgICAvLyBVc2UgQ2xhc3NDbGVhbnVwIHRvIHJ1biBjb2RlIGFmdGVyIGFsbCB0ZXN0cyBpbiBhIGNsYXNzIGhhdmUgcnVuCi0gICAgW0NsYXNzQ2xlYW51cCgpXQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNeUNsYXNzQ2xlYW51cCgpCi0gICAgewotICAgICAgICBfcGNrID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyAvL1VzZSBUZXN0SW5pdGlhbGl6ZSB0byBydW4gY29kZSBiZWZvcmUgcnVubmluZyBlYWNoIHRlc3QgCi0gICAgLy8gW1Rlc3RJbml0aWFsaXplKCldCi0gICAgLy8gcHVibGljIHZvaWQgTXlUZXN0SW5pdGlhbGl6ZSgpIAotICAgIC8vIHsKLSAgICAvLyB9Ci0KLSAgICAvLy8vIFVzZSBUZXN0Q2xlYW51cCB0byBydW4gY29kZSBhZnRlciBlYWNoIHRlc3QgaGFzIHJ1bgotICAgIC8vIFtUZXN0Q2xlYW51cCgpXQotICAgIC8vIHB1YmxpYyB2b2lkIE15VGVzdENsZWFudXAoKSAKLSAgICAvLyB7Ci0gICAgLy8gfQotICAgICNlbmRyZWdpb24KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbVGVzdE1ldGhvZF0KLSAgICBwdWJsaWMgdm9pZCBUd29Db2xvclNjYWxlKCkKLSAgICB7Ci0gICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb2xvclNjYWxlIik7Ci0gICAgICB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVHdvQ29sb3JTY2FsZSh3cy5DZWxsc1siQTE6QTUiXSk7Ci0gICAgICB3cy5TZXRWYWx1ZSgxLCAxLCAxKTsKLSAgICAgIHdzLlNldFZhbHVlKDIsIDEsIDIpOwotICAgICAgd3MuU2V0VmFsdWUoMywgMSwgMyk7Ci0gICAgICB3cy5TZXRWYWx1ZSg0LCAxLCA0KTsKLSAgICAgIHdzLlNldFZhbHVlKDUsIDEsIDUpOyAgICAgIAotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbVGVzdE1ldGhvZF0KLSAgICBbSWdub3JlXQotICAgIHB1YmxpYyB2b2lkIFJlYWRDb25kaXRpb25hbEZvcm1hdHRpbmcoKQotICAgIHsKLSAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2YueGxzeCIpKTsKLQotICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICBBc3NlcnQuSXNUcnVlKHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db3VudCA9PSA2KTsKLSAgICAgIEFzc2VydC5Jc1RydWUod3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nWzBdLlR5cGU9PWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXIpOwotCi0gICAgICB2YXIgY2YxID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVxdWFsKHdzLkNlbGxzWyJDMyJdKTsKLSAgICAgIC8vY2YxLkZvcm11bGEgPSAiVFJVRSI7Ci0gICAgICB2YXIgY2YyID0gd3MuQ2VsbHNbIkM4OkMxMiJdLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRFeHByZXNzaW9uKCk7Ci0gICAgICB2YXIgY2YzID0gd3MuQ2VsbHNbImQxMjpEMjIsSDEyOkgyMiJdLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRGb3VySWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlLlJlZFRvQmxhY2spOwotICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNmMi54bHN4IikpOwotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW1Rlc3RNZXRob2RdCi0gICAgW0lnbm9yZV0KLSAgICBwdWJsaWMgdm9pZCBSZWFkQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXJyb3IoKQotICAgIHsKLSAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcQ29mQ1RlbXBsYXRlLnhsc3giKSk7Ci0KLSAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNmMi54bHN4IikpOwotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW1Rlc3RNZXRob2RdCi0gICAgcHVibGljIHZvaWQgVHdvQmFja0NvbG9yKCkKLSAgICB7Ci0gICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlR3b0JhY2tDb2xvciIpOwotICAgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCBjb25kaXRpb24xID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVxdWFsKHdzLkNlbGxzWyJBMSJdKTsKLSAgICAgICAgY29uZGl0aW9uMS5TdG9wSWZUcnVlID0gdHJ1ZTsKLSAgICAgICAgY29uZGl0aW9uMS5Qcmlvcml0eSA9IDE7Ci0gICAgICAgIGNvbmRpdGlvbjEuRm9ybXVsYSA9ICJUUlVFIjsKLSAgICAgICAgY29uZGl0aW9uMS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5Db2xvciA9IENvbG9yLkdyZWVuOwotICAgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCBjb25kaXRpb24yID0gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVxdWFsKHdzLkNlbGxzWyJBMiJdKTsKLSAgICAgICAgY29uZGl0aW9uMi5TdG9wSWZUcnVlID0gdHJ1ZTsKLSAgICAgICAgY29uZGl0aW9uMi5Qcmlvcml0eSA9IDI7Ci0gICAgICAgIGNvbmRpdGlvbjIuRm9ybXVsYSA9ICJGQUxTRSI7Ci0gICAgICAgIGNvbmRpdGlvbjIuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuQ29sb3IgPSBDb2xvci5SZWQ7Ci0gICAgfQotICAgIFtUZXN0TWV0aG9kXQotICAgIHB1YmxpYyB2b2lkIERhdGFiYXIoKQotICAgIHsKLSAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGF0YWJhciIpOwotICAgICAgICB2YXIgY2YgPSB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRGF0YWJhcih3cy5DZWxsc1siQTE6QTUiXSwgQ29sb3IuQmx1ZVZpb2xldCk7Ci0gICAgICAgIHdzLlNldFZhbHVlKDEsIDEsIDEpOwotICAgICAgICB3cy5TZXRWYWx1ZSgyLCAxLCAyKTsKLSAgICAgICAgd3MuU2V0VmFsdWUoMywgMSwgMyk7Ci0gICAgICAgIHdzLlNldFZhbHVlKDQsIDEsIDQpOwotICAgICAgICB3cy5TZXRWYWx1ZSg1LCAxLCA1KTsKLSAgICB9Ci0gICAgW1Rlc3RNZXRob2RdCi0gICAgcHVibGljIHZvaWQgSWNvblNldCgpCi0gICAgewotICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJY29uU2V0Iik7Ci0gICAgICAgIHZhciBjZiA9IHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaHJlZUljb25TZXQod3MuQ2VsbHNbIkExOkEzIl0sIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUuU3ltYm9scyk7Ci0gICAgICAgIHdzLlNldFZhbHVlKDEsIDEsIDEpOwotICAgICAgICB3cy5TZXRWYWx1ZSgyLCAxLCAyKTsKLSAgICAgICAgd3MuU2V0VmFsdWUoMywgMSwgMyk7Ci0KLSAgICAgICAgdmFyIGNmNCA9IHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRGb3VySWNvblNldCh3cy5DZWxsc1siQjE6QjQiXSwgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZS5SYXRpbmcpOwotICAgICAgICBjZjQuSWNvbjEuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOwotICAgICAgICBjZjQuSWNvbjEuRm9ybXVsYSA9ICIwIjsKLSAgICAgICAgY2Y0Lkljb24yLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYTsKLSAgICAgICAgY2Y0Lkljb24yLkZvcm11bGEgPSAiMS8zIjsKLSAgICAgICAgY2Y0Lkljb24zLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYTsKLSAgICAgICAgY2Y0Lkljb24zLkZvcm11bGEgPSAiMi8zIjsKLSAgICAgICAgd3MuU2V0VmFsdWUoMSwgMiwgMSk7Ci0gICAgICAgIHdzLlNldFZhbHVlKDIsIDIsIDIpOwotICAgICAgICB3cy5TZXRWYWx1ZSgzLCAyLCAzKTsKLSAgICAgICAgd3MuU2V0VmFsdWUoNCwgMiwgNCk7Ci0KLSAgICAgICAgdmFyIGNmNSA9IHdzLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRGaXZlSWNvblNldCh3cy5DZWxsc1siQzE6QzUiXSxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlLlF1YXJ0ZXJzKTsKLSAgICAgICAgY2Y1Lkljb24xLlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOwotICAgICAgICBjZjUuSWNvbjEuVmFsdWUgPSAxOwotICAgICAgICBjZjUuSWNvbjIuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07Ci0gICAgICAgIGNmNS5JY29uMi5WYWx1ZSA9IDI7Ci0gICAgICAgIGNmNS5JY29uMy5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bTsKLSAgICAgICAgY2Y1Lkljb24zLlZhbHVlID0gMzsKLSAgICAgICAgY2Y1Lkljb240LlR5cGUgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOwotICAgICAgICBjZjUuSWNvbjQuVmFsdWUgPSA0OwotICAgICAgICBjZjUuSWNvbjUuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07Ci0gICAgICAgIGNmNS5JY29uNS5WYWx1ZSA9IDU7Ci0gICAgICAgIGNmNS5TaG93VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgY2Y1LlJldmVyc2UgPSB0cnVlOwotCi0gICAgICAgIHdzLlNldFZhbHVlKDEsIDMsIDEpOwotICAgICAgICB3cy5TZXRWYWx1ZSgyLCAzLCAyKTsKLSAgICAgICAgd3MuU2V0VmFsdWUoMywgMywgMyk7Ci0gICAgICAgIHdzLlNldFZhbHVlKDQsIDMsIDQpOwotICAgICAgICB3cy5TZXRWYWx1ZSg1LCAzLCA1KTsgICAgCi0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EVFNfRmFpbGluZ1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9EVFNfRmFpbGluZ1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliMjdiLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRFRTX0ZhaWxpbmdUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLe+7v3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBEVFNfRmFpbGluZ1Rlc3RzCi0gICAgewotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVXb3Jrc2hlZXRXaXRoUmVmZXJlbmNlZEltYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJvcmlnaW5hbCIpOwotICAgICAgICAgICAgICAgIHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBQcm9wZXJ0aWVzLlJlc291cmNlcy5UZXN0MSk7Ci0gICAgICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtzaGVldHMuQ29weSgib3JpZ2luYWwiLCAiY29weSIpOwotICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXMuUG9zaXRpb24gPSAwOwotCi0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobXMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJvcmlnaW5hbCJdOwotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSh3cyk7Ci0gICAgICAgICAgICAgICAgcGNrLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5QW5kRGVsZXRlV29ya3NoZWV0V2l0aEltYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJvcmlnaW5hbCIpOwotICAgICAgICAgICAgICAgIHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBQcm9wZXJ0aWVzLlJlc291cmNlcy5UZXN0MSk7Ci0gICAgICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtzaGVldHMuQ29weSgib3JpZ2luYWwiLCAiY29weSIpOwotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSh3cyk7Ci0gICAgICAgICAgICAgICAgcGNrLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vQ3VzdG9tVmFsaWRhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9DdXN0b21WYWxpZGF0aW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTIxZTguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9DdXN0b21WYWxpZGF0aW9uVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24KLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDdXN0b21WYWxpZGF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDdXN0b21WYWxpZGF0aW9uX0Zvcm11bGFJc1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEN1c3RvbVZhbGlkYXRpb24oIkExIik7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbCh2YWxpZGF0aW9uLkZvcm11bGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEN1c3RvbVZhbGlkYXRpb25fU2hvdWxkVGhyb3dFeGNlcHRpb25JZkZvcm11bGFJc1Rvb0xvbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCAyNTc7IHgrKykgc2IuQXBwZW5kKCJ4Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEN1c3RvbVZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGF0YVZhbGlkYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRGF0YVZhbGlkYXRpb25UZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkMWM5YS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0RhdGFWYWxpZGF0aW9uVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24KLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBEYXRhVmFsaWRhdGlvblRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFNldE9wZXJhdG9yRnJvbUV4aXN0aW5nWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICJncmVhdGVyVGhhbk9yRXF1YWwiLCAiMSIpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5ncmVhdGVyVGhhbk9yRXF1YWwsIHZhbGlkYXRpb24uT3BlcmF0b3IpOwotICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1Nob3VsZFRocm93SWZPcGVyYXRvcklzRXF1YWxBbmRGb3JtdWxhMUlzRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbnMgPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICAgICAgdmFsaWRhdGlvbnMuT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuZXF1YWw7Ci0gICAgICAgICAgICB2YWxpZGF0aW9ucy5WYWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRTaG93RXJyb3JNZXNzYWdlRnJvbUV4aXN0aW5nWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICIxIiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPz8gZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRTaG93SW5wdXRNZXNzYWdlRnJvbUV4aXN0aW5nWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICIxIiwgZmFsc2UsIHRydWUpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSh2YWxpZGF0aW9uLlNob3dJbnB1dE1lc3NhZ2UgPz8gZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRQcm9tcHRGcm9tRXhpc3RpbmdYbWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgIndob2xlIiwgIjEiLCAiUHJvbXB0IiwgIlByb21wdFRpdGxlIiwgIkVycm9yIiwgIkVycm9yVGl0bGUiKTsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkludChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiUHJvbXB0IiwgdmFsaWRhdGlvbi5Qcm9tcHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRQcm9tcHRUaXRsZUZyb21FeGlzdGluZ1htbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAid2hvbGUiLCAiMSIsICJQcm9tcHQiLCAiUHJvbXB0VGl0bGUiLCAiRXJyb3IiLCAiRXJyb3JUaXRsZSIpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJQcm9tcHRUaXRsZSIsIHZhbGlkYXRpb24uUHJvbXB0VGl0bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRFcnJvckZyb21FeGlzdGluZ1htbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAid2hvbGUiLCAiMSIsICJQcm9tcHQiLCAiUHJvbXB0VGl0bGUiLCAiRXJyb3IiLCAiRXJyb3JUaXRsZSIpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJFcnJvciIsIHZhbGlkYXRpb24uRXJyb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRTZXRFcnJvclRpdGxlRnJvbUV4aXN0aW5nWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ3aG9sZSIsICIxIiwgIlByb21wdCIsICJQcm9tcHRUaXRsZSIsICJFcnJvciIsICJFcnJvclRpdGxlIik7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkVycm9yVGl0bGUiLCB2YWxpZGF0aW9uLkVycm9yVGl0bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRUaHJvd0lmT3BlcmF0b3JJc0JldHdlZW5BbmRGb3JtdWxhMklzRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUgPSAxOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5iZXR3ZWVuOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5WYWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19TaG91bGRBY2NlcHRPbmVJdGVtT25seSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZXMuQWRkKCIxIik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbl9TaG91bGRSZXBsYWNlTGFzdFBhcnRJbldob2xlQ29sdW1uUmFuZ2VXaXRoTWF4TnVtYmVyT2ZSb3dzT25lQ29sdW1uKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkE6QSIpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QSIgKyBFeGNlbFBhY2thZ2UuTWF4Um93cy5Ub1N0cmluZygpLCB2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbl9TaG91bGRSZXBsYWNlTGFzdFBhcnRJbldob2xlQ29sdW1uUmFuZ2VXaXRoTWF4TnVtYmVyT2ZSb3dzRGlmZmVyZW50Q29sdW1ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBOkIiKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc3RyaW5nLkZvcm1hdCgiQTE6QnswfSIsIEV4Y2VsUGFja2FnZS5NYXhSb3dzKSwgdmFsaWRhdGlvbi5BZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0RlY2ltYURhdGFWYWxpZGF0aW9uVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0RlY2ltYURhdGFWYWxpZGF0aW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmJjNmYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9EZWNpbWFEYXRhVmFsaWRhdGlvblRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRGVjaW1hRGF0YVZhbGlkYXRpb25UZXN0cyA6IFZhbGlkYXRpb25UZXN0QmFzZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwgX3ZhbGlkYXRpb247Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldHVwVGVzdERhdGEoKTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9uID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EYXRhVmFsaWRhdGlvbnMuQWRkRGVjaW1hbFZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9uID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWNpbWFsRGF0YVZhbGlkYXRpb25fRm9ybXVsYTFJc1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoX3ZhbGlkYXRpb24uRm9ybXVsYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVjaW1hbERhdGFWYWxpZGF0aW9uX0Zvcm11bGEySXNTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKF92YWxpZGF0aW9uLkZvcm11bGEyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRXhjZWxUaW1lVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0V4Y2VsVGltZVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmVjNjVjLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRXhjZWxUaW1lVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEV4Y2VsVGltZVRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsVGltZSBfdGltZTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJIb3VyID0gMzYwMDsKLSAgICAgICAvLyBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWwgSG91cnNQZXJEYXkgPSAyNDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJEYXkgPSAzNjAwICogMjQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBkZWNpbWFsIFJvdW5kKGRlY2ltYWwgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLlJvdW5kKHZhbHVlLCBFeGNlbFRpbWUuTnVtYmVyT2ZEZWNpbWFscyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3RpbWUgPSBuZXcgRXhjZWxUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdGltZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX0NvbnN0cnVjdG9yV2l0aFZhbHVlX1Nob3VsZFRocm93SWZWYWx1ZUlzTGVzc1RoYW4wKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEV4Y2VsVGltZSgtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX0NvbnN0cnVjdG9yV2l0aFZhbHVlX1Nob3VsZFRocm93SWZWYWx1ZUlzRXF1YWxUb09yR3JlYXRlclRoYW4xKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEV4Y2VsVGltZSgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Ib3VyX1Nob3VsZFRocm93SWZOZWdhdGl2ZVZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3RpbWUuSG91ciA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX01pbnV0ZV9TaG91bGRUaHJvd0lmTmVnYXRpdmVWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX01pbnV0ZV9TaG91bGRUaHJvd0lWYWx1ZUlzR3JlYXRlclRoYW41OSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IDYwOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1NlY29uZF9TaG91bGRUaHJvd0lmTmVnYXRpdmVWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1NlY29uZF9TaG91bGRUaHJvd0lWYWx1ZUlzR3JlYXRlclRoYW41OSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IDYwOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsVGltZVRlc3RzX1RvRXhjZWxUaW1lX0hvdXJJc1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3RpbWUuSG91ciA9IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFJvdW5kKFNlY29uZHNQZXJIb3VyL1NlY29uZHNQZXJEYXkpLCBfdGltZS5Ub0V4Y2VsVGltZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Ub0V4Y2VsVGltZV9NaW51dGVJc1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIGRlY2ltYWwgZXhwZWN0ZWQgPSBTZWNvbmRzUGVySG91ciArICgyME0gKiA2ME0pOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfdGltZS5Ib3VyID0gMTsKLSAgICAgICAgICAgIF90aW1lLk1pbnV0ZSA9IDIwOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChSb3VuZChleHBlY3RlZC9TZWNvbmRzUGVyRGF5KSwgX3RpbWUuVG9FeGNlbFRpbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxUaW1lVGVzdHNfVG9FeGNlbFRpbWVfU2Vjb25kSXNTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBkZWNpbWFsIGV4cGVjdGVkID0gU2Vjb25kc1BlckhvdXIgKyAoMjBNICogNjBNKSArIDEwTTsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3RpbWUuSG91ciA9IDE7Ci0gICAgICAgICAgICBfdGltZS5NaW51dGUgPSAyMDsKLSAgICAgICAgICAgIF90aW1lLlNlY29uZCA9IDEwOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChSb3VuZChleHBlY3RlZCAvIFNlY29uZHNQZXJEYXkpLCBfdGltZS5Ub0V4Y2VsVGltZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRIb3VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgZGVjaW1hbCB2YWx1ZSA9IDM2NjBNLyhkZWNpbWFsKVNlY29uZHNQZXJEYXk7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKHZhbHVlKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdGltZS5Ib3VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRNaW51dGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBkZWNpbWFsIHZhbHVlID0gMzY2ME0gLyAoZGVjaW1hbClTZWNvbmRzUGVyRGF5OwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRpbWUuTWludXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbFRpbWVUZXN0c19Db25zdHJ1Y3RvcldpdGhWYWx1ZV9TaG91bGRTZXRTZWNvbmQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBkZWNpbWFsIHZhbHVlID0gMzY2Mk0gLyAoZGVjaW1hbClTZWNvbmRzUGVyRGF5OwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRpbWUuU2Vjb25kKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ3VzdG9tRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9DdXN0b21Gb3JtdWxhVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjQ3NDIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9DdXN0b21Gb3JtdWxhVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQ3VzdG9tRm9ybXVsYVRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7Ci0gICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDdXN0b21Gb3JtdWxhX0Zvcm11bGFzRm9ybXVsYUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIkExIik7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkN1c3RvbSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRGF0ZVRpbWVGb3JtdWxhVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0RhdGVUaW1lRm9ybXVsYVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdkODk3Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRGF0ZVRpbWVGb3JtdWxhVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIERhdGVUaW1lRm9ybXVsYVRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7Ci0gICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRlVGltZUZvcm11bGFfRm9ybXVsYVZhbHVlSXNTZXRGcm9tWG1sTm9kZUluQ29uc3RydWN0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICB2YXIgZGF0ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTAxLTA4Iik7Ci0gICAgICAgICAgICB2YXIgZGF0ZUFzU3RyaW5nID0gZGF0ZS5Ub09BRGF0ZSgpLlRvU3RyaW5nKF9jdWx0dXJlSW5mbyk7Ci0gICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgImRlY2ltYWwiLCBkYXRlQXNTdHJpbmcpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlLCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGVUaW1lRm9ybXVsYV9Gb3JtdWxhc0Zvcm11bGFJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3RvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciBkYXRlID0gRGF0ZVRpbWUuUGFyc2UoIjIwMTEtMDEtMDgiKTsKLSAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAiZGVjaW1hbCIsICJBMSIpOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWwsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgdmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0RlY2ltYWxGb3JtdWxhVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0RlY2ltYWxGb3JtdWxhVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNzI5MWIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9EZWNpbWFsRm9ybXVsYVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRGVjaW1hbEZvcm11bGFUZXN0cyA6IFZhbGlkYXRpb25UZXN0QmFzZQotICAgIHsKLQotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlY2ltYWxGb3JtdWxhX0Zvcm11bGFWYWx1ZUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIjEuMyIpOwotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWwsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjNELCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlY2ltYWxGb3JtdWxhX0Zvcm11bGFzRm9ybXVsYUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJkZWNpbWFsIiwgIkExIik7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9JbnRlZ2VyRm9ybXVsYVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9JbnRlZ2VyRm9ybXVsYVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDlmZjEwLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvSW50ZWdlckZvcm11bGFUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBJbnRlZ2VyRm9ybXVsYVRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7Ci0gICAgICAgICAgICBfZGF0YVZhbGlkYXRpb25Ob2RlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnRlZ2VyRm9ybXVsYV9Gb3JtdWxhVmFsdWVJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3RvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIExvYWRYbWxUZXN0RGF0YSgiQTEiLCAiZGVjaW1hbCIsICIxIik7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSW50ZWdlckZvcm11bGFfRm9ybXVsYXNGb3JtdWxhSXNTZXRGcm9tWG1sTm9kZUluQ29uc3RydWN0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgImRlY2ltYWwiLCAiQTEiKTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgdmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0xpc3RGb3JtdWxhVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0xpc3RGb3JtdWxhVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmY2YWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9MaXN0Rm9ybXVsYVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIExpc3RGb3JtdWxhVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExpc3RGb3JtdWxhX0Zvcm11bGFWYWx1ZUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJsaXN0IiwgIlwiMSwyXCIiKTsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5MaXN0LCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzLkNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMaXN0Rm9ybXVsYV9Gb3JtdWxhVmFsdWVJc1NldEZyb21YbWxOb2RlSW5Db25zdHJ1Y3Rvck9yZGVySXNDb3JyZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJsaXN0IiwgIlwiMSwyXCIiKTsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5MaXN0LCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1aXZhbGVudChuZXcgTGlzdDxzdHJpbmc+eyAiMSIsICIyIn0sIChJQ29sbGVjdGlvbil2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMaXN0Rm9ybXVsYV9Gb3JtdWxhc0V4Y2VsRm9ybXVsYUlzU2V0RnJvbVhtbE5vZGVJbkNvbnN0cnVjdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJsaXN0IiwgIkExIik7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KF9zaGVldCwgIkExIiwgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCwgX2RhdGFWYWxpZGF0aW9uTm9kZSwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgdmFsaWRhdGlvbi5Gb3JtdWxhLkV4Y2VsRm9ybXVsYSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL1RpbWVGb3JtdWxhVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL1RpbWVGb3JtdWxhVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTMyMzIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9UaW1lRm9ybXVsYVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFRpbWVGb3JtdWxhVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUaW1lRm9ybXVsYV9WYWx1ZUlzU2V0RnJvbUNvbnN0cnVjdG9yVmFsaWRhdGVIb3VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKDAuNjc1TSk7Ci0gICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgInRpbWUiLCAiMC42NzUiKTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgZm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGltZS5Ib3VyLCBmb3JtdWxhLkZvcm11bGEuVmFsdWUuSG91cik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGltZUZvcm11bGFfVmFsdWVJc1NldEZyb21Db25zdHJ1Y3RvclZhbGlkYXRlTWludXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRXhjZWxUaW1lKDAuMzk1TSk7Ci0gICAgICAgICAgICBMb2FkWG1sVGVzdERhdGEoIkExIiwgInRpbWUiLCAiMC4zOTUiKTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgZm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZShfc2hlZXQsICJBMSIsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUsIF9kYXRhVmFsaWRhdGlvbk5vZGUsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGltZS5NaW51dGUsIGZvcm11bGEuRm9ybXVsYS5WYWx1ZS5NaW51dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRpbWVGb3JtdWxhX1ZhbHVlSXNTZXRGcm9tQ29uc3RydWN0b3JWYWxpZGF0ZVNlY29uZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IEV4Y2VsVGltZSgwLjgxMk0pOwotICAgICAgICAgICAgTG9hZFhtbFRlc3REYXRhKCJBMSIsICJ0aW1lIiwgIjAuODEyIik7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIGZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoX3NoZWV0LCAiQTEiLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5UaW1lLCBfZGF0YVZhbGlkYXRpb25Ob2RlLCBfbmFtZXNwYWNlTWFuYWdlcik7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRpbWUuU2Vjb25kLlZhbHVlLCBmb3JtdWxhLkZvcm11bGEuVmFsdWUuU2Vjb25kLlZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vSW50ZWdyYXRpb25UZXN0cy9JbnRlZ3JhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9JbnRlZ3JhdGlvblRlc3RzL0ludGVncmF0aW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGFjYjcuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9JbnRlZ3JhdGlvblRlc3RzL0ludGVncmF0aW9uVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRGF0YVZhbGlkYXRpb24uSW50ZWdyYXRpb25UZXN0cwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVtb3ZlIHRoZSBJZ25vcmUgYXR0cmlidXRlcyBmcm9tIHRoZSB0ZXN0bWV0aG9kcyBpZiB5b3Ugd2FudCB0byBydW4gYW55IG9mIHRoZXNlIHRlc3RzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBJbnRlZ3JhdGlvblRlc3RzIDogVmFsaWRhdGlvblRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xlYW51cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRhVmFsaWRhdGlvbnNfQWRkT25lVmFsaWRhdGlvbk9mVHlwZVdob2xlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yU3R5bGUgPSBFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLnN0b3A7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yVGl0bGUgPSAiSW52YWxpZCB2YWx1ZSB3YXMgZW50ZXJlZCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdFRpdGxlID0gIkVudGVyIHZhbHVlIGhlcmUiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5ncmVhdGVyVGhhbjsKLSAgICAgICAgICAgIC8vdmFsaWRhdGlvbi5WYWx1ZS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhID0gIkIxIjsKLQotICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhHZXRUZXN0T3V0cHV0UGF0aCgiQWRkT25lVmFsaWRhdGlvbk9mVHlwZVdob2xlLnhsc3giKSkpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19BZGRPbmVWYWxpZGF0aW9uT2ZUeXBlRGVjaW1hbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yU3R5bGUgPSBFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLnN0b3A7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yVGl0bGUgPSAiSW52YWxpZCB2YWx1ZSB3YXMgZW50ZXJlZCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yID0gIlZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEuNCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdFRpdGxlID0gIkVudGVyIHZhbHVlIGhlcmUiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Qcm9tcHQgPSAiRW50ZXIgYSB2YWx1ZSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiAxLjQiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93SW5wdXRNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuZ3JlYXRlclRoYW47Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUgPSAxLjQ7Ci0KLSAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oR2V0VGVzdE91dHB1dFBhdGgoIkFkZE9uZVZhbGlkYXRpb25PZlR5cGVEZWNpbWFsLnhsc3giKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19BZGRPbmVWYWxpZGF0aW9uT2ZUeXBlTGlzdE9mVHlwZUxpc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkTGlzdFZhbGlkYXRpb24oIkE6QSIpOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0lucHV0TWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzLkFkZCgiMSIpOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5BZGQoIjIiKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZXMuQWRkKCIzIik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oR2V0VGVzdE91dHB1dFBhdGgoIkFkZE9uZVZhbGlkYXRpb25PZlR5cGVMaXN0Lnhsc3giKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGFWYWxpZGF0aW9uc19BZGRPbmVWYWxpZGF0aW9uT2ZUeXBlTGlzdE9mVHlwZVRpbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGltZVZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93SW5wdXRNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5Ib3VyID0gMTQ7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUuTWludXRlID0gMzA7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLk9wZXJhdG9yID0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmdyZWF0ZXJUaGFuOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Qcm9tcHQgPSAiRW50ZXIgYSB0aW1lIGdyZWF0ZXIgdGhhbiAxNDozMCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yID0gIkludmFsaWQgdGltZSB3YXMgZW50ZXJlZCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlZhbGlkYXRlKCk7Ci0KLSAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oR2V0VGVzdE91dHB1dFBhdGgoIkFkZE9uZVZhbGlkYXRpb25PZlR5cGVUaW1lLnhsc3giKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgRGF0YVZhbGlkYXRpb25zX1JlYWRFeGlzdGluZ1dvcmtib29rV2l0aERhdGFWYWxpZGF0aW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEdldFRlc3RPdXRwdXRQYXRoKCJEVlRlc3QueGxzeCIpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBCdWdfT3Blbk9mZmljZSgpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB2YXIgeGxzUGF0aCA9IEdldFRlc3RPdXRwdXRQYXRoKCJPcGVuT2ZmaWNlLnhsc3giKTsKLSAgICAgICAgLy8gICAgdmFyIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oeGxzUGF0aCk7Ci0gICAgICAgIC8vICAgIGlmKCBuZXdGaWxlLkV4aXN0cykKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgbmV3RmlsZS5EZWxldGUoKTsKLSAgICAgICAgLy8gICAgICAgIC8vZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLSAgICAgICAgLy8gICAgICAgIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oeGxzUGF0aCk7Ci0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgICB1c2luZyh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIC8vIGFkZCBhIG5ldyB3b3Jrc2hlZXQgdG8gdGhlIGVtcHR5IHdvcmtib29rCi0gICAgICAgIC8vICAgICAgICB2YXIgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW52ZW50b3J5Iik7Ci0gICAgICAgIC8vICAgICAgICAvLyBBZGQgdGhlIGhlYWRlcnMKLSAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJJRCI7Ci0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7Ci0gICAgICAgIC8vLy8gICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAzXS5WYWx1ZSA9ICJRdWFudGl0eSI7Ci0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNF0uVmFsdWUgPSAiUHJpY2UiOwotCi0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNV0uVmFsdWUgPSAiVmFsdWUiOwotCi0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDEpLldpZHRoID0gMTU7Ci0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDIpLldpZHRoID0gMTI7Ci0gICAgICAgIC8vICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDMpLldpZHRoID0gMTI7Ci0KLSAgICAgICAgLy8gICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gdHJ1ZTsKLQotICAgICAgICAvLyAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIkludmVydG9yeSI7Ci0gICAgICAgIC8vICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBLw6RsbG1hbiI7Ci0gICAgICAgIC8vICAgICAgICBwYWNrYWdlLlNhdmUoKTsKLSAgICAgICAgLy8gICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9MaXN0RGF0YVZhbGlkYXRpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vTGlzdERhdGFWYWxpZGF0aW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODcyNDUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9MaXN0RGF0YVZhbGlkYXRpb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgTGlzdERhdGFWYWxpZGF0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IF92YWxpZGF0aW9uOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgICAgICBfdmFsaWRhdGlvbiA9IF9zaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsZWFudXBUZXN0RGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExpc3REYXRhVmFsaWRhdGlvbl9Gb3JtdWxhSXNTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKF92YWxpZGF0aW9uLkZvcm11bGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExpc3REYXRhVmFsaWRhdGlvbl9XaGVuT25lSXRlbUlzQWRkZWRDb3VudElzMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3ZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZXMuQWRkKCJ0ZXN0Iik7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIF92YWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzLkNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBMaXN0RGF0YVZhbGlkYXRpb25fU2hvdWxkVGhyb3dXaGVuTm9Gb3JtdWxhT3JWYWx1ZUlzU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZhbGlkYXRpb24uVmFsaWRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vUmFuZ2VCYXNlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1JhbmdlQmFzZVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzM2YzIzLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vUmFuZ2VCYXNlVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUmFuZ2VCYXNlVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkSW50ZWdlclZhbGlkYXRpb25fVmFsaWRhdGlvbklzQWRkZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZEludGVnZXJWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgX3NoZWV0LkRhdGFWYWxpZGF0aW9uc1swXS5BZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGREZWNpbWFsVmFsaWRhdGlvbl9WYWxpZGF0aW9uSXNBZGRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJBMTpBMiJdLkRhdGFWYWxpZGF0aW9uLkFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGVjaW1hbFZhbGlkYXRpb25fQWRkcmVzc0lzQ29ycmVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJBMTpBMiJdLkRhdGFWYWxpZGF0aW9uLkFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QTIiLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zWzBdLkFkZHJlc3MuQWRkcmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZFRleHRMZW5ndGhWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGRUZXh0TGVuZ3RoVmFsaWRhdGlvbl9BZGRyZXNzSXNDb3JyZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGF0ZVRpbWVWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkRGF0ZVRpbWVEYXRhVmFsaWRhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkRGF0ZVRpbWVWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5nZUJhc2VfQWRkTGlzdFZhbGlkYXRpb25fVmFsaWRhdGlvbklzQWRkZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5Db3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VCYXNlX0FkZExpc3RWYWxpZGF0aW9uX0FkZHJlc3NJc0NvcnJlY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siQTE6QTIiXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExOkEyIiwgX3NoZWV0LkRhdGFWYWxpZGF0aW9uc1swXS5BZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZFRpbWVWYWxpZGF0aW9uX1ZhbGlkYXRpb25Jc0FkZGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGltZURhdGFWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJhbmdlQmFzZV9BZGRUaW1lVmFsaWRhdGlvbl9BZGRyZXNzSXNDb3JyZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkExOkEyIl0uRGF0YVZhbGlkYXRpb24uQWRkVGltZURhdGFWYWxpZGF0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMF0uQWRkcmVzcy5BZGRyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRGF0YVZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NTg1YS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1ZhbGlkYXRpb25Db2xsZWN0aW9uVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db2xsZWN0aW9uVGVzdHMgOiBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRlc3REYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDbGVhbnVwVGVzdERhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0FkZERlY2ltYWxfU2hvdWxkVGhyb3dXaGVuQWRkcmVzc0lzTnVsbE9yRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGVjaW1hbFZhbGlkYXRpb24oc3RyaW5nLkVtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbl9BZGREZWNpbWFsX1Nob3VsZFRocm93V2hlbk5ld1ZhbGlkYXRpb25Db2xsaWRlc1dpdGhFeGlzdGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGVjaW1hbFZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fQWRkSW50ZWdlcl9TaG91bGRUaHJvd1doZW5OZXdWYWxpZGF0aW9uQ29sbGlkZXNXaXRoRXhpc3RpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0FkZFRleHRMZW5ndGhfU2hvdWxkVGhyb3dXaGVuTmV3VmFsaWRhdGlvbkNvbGxpZGVzV2l0aEV4aXN0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZFRleHRMZW5ndGhWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRUZXh0TGVuZ3RoVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbl9BZGREYXRlVGltZV9TaG91bGRUaHJvd1doZW5OZXdWYWxpZGF0aW9uQ29sbGlkZXNXaXRoRXhpc3RpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fSW5kZXhfU2hvdWxkUmV0dXJuSXRlbUF0SW5kZXgoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMiIpOwotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkIxIik7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnNbMV07Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMiIsIHJlc3VsdC5BZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0ZpbmRBbGxfU2hvdWxkUmV0dXJuVmFsaWRhdGlvbkluQ29sdW1uQW9ubHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMiIpOwotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oIkIxIik7Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuRmluZEFsbCh4ID0+IHguQWRkcmVzcy5BZGRyZXNzLlN0YXJ0c1dpdGgoIkEiKSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5Db3VudCgpKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0ZpbmRfU2hvdWxkUmV0dXJuRmlyc3RNYXRjaE9ubHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMiIpOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkZpbmQoeCA9PiB4LkFkZHJlc3MuQWRkcmVzcy5TdGFydHNXaXRoKCJBIikpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCByZXN1bHQuQWRkcmVzcy5BZGRyZXNzKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uX0NsZWFyX1Nob3VsZEJlRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkNsZWFyKCk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOwotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb25fUmVtb3ZlQWxsX1Nob3VsZFJlbW92ZU1hdGNoaW5nRW50cmllcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExIik7Ci0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEludGVnZXJWYWxpZGF0aW9uKCJBMiIpOwotICAgICAgICAgICAgX3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRJbnRlZ2VyVmFsaWRhdGlvbigiQjEiKTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICBfc2hlZXQuRGF0YVZhbGlkYXRpb25zLlJlbW92ZUFsbCh4ID0+IHguQWRkcmVzcy5BZGRyZXNzLlN0YXJ0c1dpdGgoIkIiKSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIF9zaGVldC5EYXRhVmFsaWRhdGlvbnMuQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9EYXRhVmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEJhc2UuY3MgYi9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0QmFzZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzNWYxYy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0RhdGFWYWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0QmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5EYXRhVmFsaWRhdGlvbgotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbFdvcmtzaGVldCBfc2hlZXQ7Ci0gICAgICAgIHByb3RlY3RlZCBYbWxOb2RlIF9kYXRhVmFsaWRhdGlvbk5vZGU7Ci0gICAgICAgIHByb3RlY3RlZCBYbWxOYW1lc3BhY2VNYW5hZ2VyIF9uYW1lc3BhY2VNYW5hZ2VyOwotICAgICAgICBwcm90ZWN0ZWQgQ3VsdHVyZUluZm8gX2N1bHR1cmVJbmZvOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwVGVzdERhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIF9zaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICBfY3VsdHVyZUluZm8gPSBuZXcgQ3VsdHVyZUluZm8oImVuLVVTIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwVGVzdERhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG51bGw7Ci0gICAgICAgICAgICBfc2hlZXQgPSBudWxsOwotICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBHZXRUZXN0T3V0cHV0UGF0aChzdHJpbmcgZmlsZU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBQYXRoLkNvbWJpbmUoRW52aXJvbm1lbnQuR2V0Rm9sZGVyUGF0aChFbnZpcm9ubWVudC5TcGVjaWFsRm9sZGVyLkRlc2t0b3ApLCBmaWxlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTYXZlVGVzdE91dHB1dChzdHJpbmcgZmlsZU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXRoID0gR2V0VGVzdE91dHB1dFBhdGgoZmlsZU5hbWUpOwotICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhwYXRoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBMb2FkWG1sVGVzdERhdGEoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyB2YWxpZGF0aW9uVHlwZSwgc3RyaW5nIGZvcm11bGExVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIoeG1sRG9jLk5hbWVUYWJsZSk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoImQiLCAidXJuOmEiKTsKLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkYXRhVmFsaWRhdGlvbiB4bWxuczpkPVwidXJuOmFcIiB0eXBlPVwiezB9XCIgc3FyZWY9XCJ7MX1cIj4iLCB2YWxpZGF0aW9uVHlwZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkOmZvcm11bGExPnswfTwvZDpmb3JtdWxhMT4iLCBmb3JtdWxhMVZhbHVlKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZCgiPC9kYXRhVmFsaWRhdGlvbj4iKTsKLSAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHNiLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgX2RhdGFWYWxpZGF0aW9uTm9kZSA9IHhtbERvYy5Eb2N1bWVudEVsZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBMb2FkWG1sVGVzdERhdGEoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyB2YWxpZGF0aW9uVHlwZSwgc3RyaW5nIG9wZXJhdG9yTmFtZSwgc3RyaW5nIGZvcm11bGExVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIoeG1sRG9jLk5hbWVUYWJsZSk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoImQiLCAidXJuOmEiKTsKLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkYXRhVmFsaWRhdGlvbiB4bWxuczpkPVwidXJuOmFcIiB0eXBlPVwiezB9XCIgc3FyZWY9XCJ7MX1cIiBvcGVyYXRvcj1cInsyfVwiPiIsIHZhbGlkYXRpb25UeXBlLCBhZGRyZXNzLCBvcGVyYXRvck5hbWUpOwotICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZDpmb3JtdWxhMT57MH08L2Q6Zm9ybXVsYTE+IiwgZm9ybXVsYTFWYWx1ZSk7Ci0gICAgICAgICAgICBzYi5BcHBlbmQoIjwvZGF0YVZhbGlkYXRpb24+Iik7Ci0gICAgICAgICAgICB4bWxEb2MuTG9hZFhtbChzYi5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSB4bWxEb2MuRG9jdW1lbnRFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgTG9hZFhtbFRlc3REYXRhKHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgdmFsaWRhdGlvblR5cGUsIHN0cmluZyBmb3JtdWxhMVZhbHVlLCBib29sIHNob3dFcnJvck1zZywgYm9vbCBzaG93SW5wdXRNc2cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIoeG1sRG9jLk5hbWVUYWJsZSk7Ci0gICAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoImQiLCAidXJuOmEiKTsKLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkYXRhVmFsaWRhdGlvbiB4bWxuczpkPVwidXJuOmFcIiB0eXBlPVwiezB9XCIgc3FyZWY9XCJ7MX1cIiAiLCB2YWxpZGF0aW9uVHlwZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIiBzaG93RXJyb3JNZXNzYWdlPVwiezB9XCIgc2hvd0lucHV0TWVzc2FnZT1cInsxfVwiPiIsIHNob3dFcnJvck1zZyA/IDEgOiAwLCBzaG93SW5wdXRNc2cgPyAxIDogMCk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIjxkOmZvcm11bGExPnswfTwvZDpmb3JtdWxhMT4iLCBmb3JtdWxhMVZhbHVlKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZCgiPC9kYXRhVmFsaWRhdGlvbj4iKTsKLSAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHNiLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgX2RhdGFWYWxpZGF0aW9uTm9kZSA9IHhtbERvYy5Eb2N1bWVudEVsZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBMb2FkWG1sVGVzdERhdGEoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyB2YWxpZGF0aW9uVHlwZSwgc3RyaW5nIGZvcm11bGExVmFsdWUsIHN0cmluZyBwcm9tcHQsIHN0cmluZyBwcm9tcHRUaXRsZSwgc3RyaW5nIGVycm9yLCBzdHJpbmcgZXJyb3JUaXRsZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIgPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcih4bWxEb2MuTmFtZVRhYmxlKTsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgiZCIsICJ1cm46YSIpOwotICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiPGRhdGFWYWxpZGF0aW9uIHhtbG5zOmQ9XCJ1cm46YVwiIHR5cGU9XCJ7MH1cIiBzcXJlZj1cInsxfVwiIiwgdmFsaWRhdGlvblR5cGUsIGFkZHJlc3MpOwotICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCIgcHJvbXB0PVwiezB9XCIgcHJvbXB0VGl0bGU9XCJ7MX1cIiIsIHByb21wdCwgcHJvbXB0VGl0bGUpOwotICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCIgZXJyb3I9XCJ7MH1cIiBlcnJvclRpdGxlPVwiezF9XCI+IiwgZXJyb3IsIGVycm9yVGl0bGUpOwotICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCI8ZDpmb3JtdWxhMT57MH08L2Q6Zm9ybXVsYTE+IiwgZm9ybXVsYTFWYWx1ZSk7Ci0gICAgICAgICAgICBzYi5BcHBlbmQoIjwvZGF0YVZhbGlkYXRpb24+Iik7Ci0gICAgICAgICAgICB4bWxEb2MuTG9hZFhtbChzYi5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIF9kYXRhVmFsaWRhdGlvbk5vZGUgPSB4bWxEb2MuRG9jdW1lbnRFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydEF4aXNUZXN0LmNzIGIvRVBQbHVzVGVzdC9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhZGUwMi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydEF4aXNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAot77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKLXVzaW5nIFN5c3RlbS5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkRyYXdpbmcuQ2hhcnQKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0QXhpc1Rlc3QKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxDaGFydEF4aXMgYXhpczsKLSAgICAgICAgCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHZhciB4bWxOc20gPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihuZXcgTmFtZVRhYmxlKCkpOwotICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgiYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICBheGlzID0gbmV3IEV4Y2VsQ2hhcnRBeGlzKHhtbE5zbSwgeG1sRG9jLkNyZWF0ZUVsZW1lbnQoImF4aXMiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3Jvc3Nlc0F0X1NldFRvMl9JczIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlzLkNyb3NzZXNBdCA9IDI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYXhpcy5Dcm9zc2VzQXQsIDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyb3NzZXNBdF9TZXRUbzFFTWludXM2X0lzMUVNaW51czYoKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlzLkNyb3NzZXNBdCA9IDEuMmUtNjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLkNyb3NzZXNBdCwgMS4yZS02KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNaW5WYWx1ZV9TZXRUbzJfSXMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgYXhpcy5NaW5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYXhpcy5NaW5WYWx1ZSwgMik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWluVmFsdWVfU2V0VG8xRU1pbnVzNl9JczFFTWludXM2KCkKLSAgICAgICAgewotICAgICAgICAgICAgYXhpcy5NaW5WYWx1ZSA9IDEuMmUtNjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLk1pblZhbHVlLCAxLjJlLTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1heFZhbHVlX1NldFRvMl9JczIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlzLk1heFZhbHVlID0gMjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChheGlzLk1heFZhbHVlLCAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNYXhWYWx1ZV9TZXRUbzFFTWludXM2X0lzMUVNaW51czYoKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlzLk1heFZhbHVlID0gMS4yZS02OwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGF4aXMuTWF4VmFsdWUsIDEuMmUtNik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0RyYXdpbmdUZXN0LmNzIGIvRVBQbHVzVGVzdC9EcmF3aW5nVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4MmU1ZC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0RyYXdpbmdUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIEVQUGx1c1Rlc3QuUHJvcGVydGllczsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBVbml0VGVzdDEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIERyYXdpbmdUZXN0IDogVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSdW5EcmF3aW5nVGVzdHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBCYXJDaGFydCgpOwotICAgICAgICAgICAgQ29sdW1uKCk7Ci0gICAgICAgICAgICBDb25lKCk7Ci0gICAgICAgICAgICBEb3VnbnV0KCk7Ci0gICAgICAgICAgICBEcmF3aW5ncygpOwotICAgICAgICAgICAgTGluZSgpOwotICAgICAgICAgICAgTGluZU1hcmtlcigpOwotICAgICAgICAgICAgUGllQ2hhcnQoKTsKLSAgICAgICAgICAgIFBpZUNoYXJ0M0QoKTsKLSAgICAgICAgICAgIFB5cmFtaWQoKTsKLSAgICAgICAgICAgIFNjYXR0ZXIoKTsKLSAgICAgICAgICAgIEJ1YmJsZSgpOwotICAgICAgICAgICAgUmFkYXIoKTsKLSAgICAgICAgICAgIFN1cmZhY2UoKTsKLSAgICAgICAgICAgIExpbmUyVGVzdCgpOwotICAgICAgICAgICAgTXVsdGlDaGFydFNlcmllcygpOwotICAgICAgICAgICAgRHJhd2luZ1NpemluZ0FuZFBvc2l0aW9uaW5nKCk7Ci0gICAgICAgICAgICBEZWxldGVEcmF3aW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNhdmVXb3Jrc2hlZXQoIkRyYXdpbmcueGxzeCIpOwotCi0gICAgICAgICAgICBSZWFkRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIFJlYWREcmF3aW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkRHJhd2luZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oX3dvcmtzaGVldFBhdGggKyBAIkRyYXdpbmcueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUHlyYW1pZCJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siVjI0Il0uVmFsdWUsIDEwNEQpOwotICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIlNjYXR0ZXIiXTsKLSAgICAgICAgICAgICAgICB2YXIgY2h0ID0gd3MuRHJhd2luZ3NbIlNjYXR0ZXJDaGFydDEiXSBhcyBFeGNlbFNjYXR0ZXJDaGFydDsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2h0LlRpdGxlLlRleHQsICJIZWFkZXIgIFRleHQiKTsKLSAgICAgICAgICAgICAgICBjaHQuVGl0bGUuVGV4dCA9ICJUZXN0IjsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2h0LlRpdGxlLlRleHQsICJUZXN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQaWN0dXJlKCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpY3R1cmUiKTsKLSAgICAgICAgICAgIHZhciBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUmVzb3VyY2VzLlRlc3QxKTsKLQotICAgICAgICAgICAgcGljID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljMiIsIFJlc291cmNlcy5UZXN0MSk7Ci0gICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oMTUwLCAyMDApOwotICAgICAgICAgICAgcGljLkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLlNvbGlkOwotICAgICAgICAgICAgcGljLkJvcmRlci5GaWxsLkNvbG9yID0gQ29sb3IuRGFya0N5YW47Ci0gICAgICAgICAgICBwaWMuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgcGljLkZpbGwuQ29sb3IgPSBDb2xvci5XaGl0ZTsKLSAgICAgICAgICAgIHBpYy5GaWxsLlRyYW5zcGFyYW5jeSA9IDUwOwotCi0gICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMzIiwgUmVzb3VyY2VzLlRlc3QxKTsKLSAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbig0MDAsIDIwMCk7Ci0gICAgICAgICAgICBwaWMuU2V0U2l6ZSgxNTApOwotCi0gICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWM0IiwgbmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsICJWZWN0b3IgRHJhd2luZy53bWYiKSkpOwotICAgICAgICAgICAgcGljID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljNSIsIG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoX2NsaXBhcnRQYXRoLCJCaXRtYXBJbWFnZS5naWYiKSkpOwotICAgICAgICAgICAgcGljLlNldFBvc2l0aW9uKDQwMCwgMjAwKTsKLSAgICAgICAgICAgIHBpYy5TZXRTaXplKDE1MCk7Ci0KLSAgICAgICAgICAgIHdzLkNvbHVtbigxKS5XaWR0aCA9IDUzOwotICAgICAgICAgICAgd3MuQ29sdW1uKDQpLldpZHRoID0gNTg7Ci0KLSAgICAgICAgICAgIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzbDtsOkw6UiLCBuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKF9jbGlwYXJ0UGF0aCwgIkJpdG1hcEltYWdlLmdpZiIpKSk7Ci0gICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oNDAwLCA0MDApOwotICAgICAgICAgICAgcGljLlNldFNpemUoMTAwKTsKLQotICAgICAgICAgICAgIHZhciB3czIgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaWN0dXJlMiIpOwotICAgICAgICAgICAgdmFyIGZpID0gbmV3IEZpbGVJbmZvKEAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgT2ZmaWNlXENMSVBBUlRcUFVCNjBDT1JcQUcwMDAyMV8uR0lGIik7Ci0gICAgICAgICAgICBpZiAoZmkuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpYyA9IHdzMi5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWM3IiwgZmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRlc3RDb250ZXh0LldyaXRlTGluZSgiQUcwMDAyMV8uR0lGIGRvZXMgbm90IGV4aXN0cy4gU2tpcGluZyBQaWM3LiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgd3NDb3B5ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGljdHVyZTMiLCB3czIpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSh3czIpOwotICAgICAgICAgfQotICAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgIHB1YmxpYyB2b2lkIERyYXdpbmdTaXppbmdBbmRQb3NpdGlvbmluZygpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRHJhd2luZ1Bvc1NpemUiKTsKLQotICAgICAgICAgICAgIHZhciBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUmVzb3VyY2VzLlRlc3QxKTsKLSAgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oMSwgMCwgMSwgMCk7Ci0KLSAgICAgICAgICAgICBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMyIiwgUmVzb3VyY2VzLlRlc3QxKTsKLSAgICAgICAgICAgICBwaWMuRWRpdEFzID0gZUVkaXRBcy5BYnNvbHV0ZTsKLSAgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oMTAsIDUsIDEsIDQpOwotCi0gICAgICAgICAgICAgcGljID0gd3MuRHJhd2luZ3MuQWRkUGljdHVyZSgiUGljMyIsIFJlc291cmNlcy5UZXN0MSk7Ci0gICAgICAgICAgICAgcGljLkVkaXRBcyA9IGVFZGl0QXMuVHdvQ2VsbDsKLSAgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oMjAsIDUsIDIsIDQpOwotCi0KLSAgICAgICAgICAgICB3cy5Db2x1bW4oMSkuV2lkdGggPSAxMDA7Ci0gICAgICAgICAgICAgd3MuQ29sdW1uKDMpLldpZHRoID0gMTAwOwotICAgICAgICAgfQotCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vIFtJZ25vcmVdCi0gICAgICAgICBwdWJsaWMgdm9pZCBCYXJDaGFydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkJhckNoYXJ0Iik7ICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJiYXJDaGFydCIsIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkKSBhcyBFeGNlbEJhckNoYXJ0OwotICAgICAgICAgICAgY2hydC5TZXRQb3NpdGlvbig1MCwgNTApOwotICAgICAgICAgICAgY2hydC5TZXRTaXplKDgwMCwgMzAwKTsKLSAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7Ci0gICAgICAgICAgICBjaHJ0LlZhcnlDb2xvcnMgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5YQXhpcy5PcmllbnRhdGlvbiA9IGVBeGlzT3JpZW50YXRpb24uTWF4TWluOwotICAgICAgICAgICAgY2hydC5YQXhpcy5NYWpvclRpY2tNYXJrID0gZUF4aXNUaWNrTWFyay5JbjsKLSAgICAgICAgICAgIGNocnQuWUF4aXMuT3JpZW50YXRpb24gPSBlQXhpc09yaWVudGF0aW9uLk1heE1pbjsKLSAgICAgICAgICAgIGNocnQuWUF4aXMuTWlub3JUaWNrTWFyayA9IGVBeGlzVGlja01hcmsuT3V0OwotICAgICAgICAgICAgY2hydC5TaG93SGlkZGVuRGF0YSA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LkRpc3BsYXlCbGFua3NBcyA9IGVEaXNwbGF5QmxhbmtzQXMuWmVybzsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuUmljaFRleHQuVGV4dCA9ICJCYXJjaGFydCBUZXN0IjsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2hydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQsICJJbnZhbGlkIENoYXJ0dHlwZSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LkRpcmVjdGlvbiA9PSBlRGlyZWN0aW9uLkJhciwgIkludmFsaWQgQmFyZGlyZWN0aW9uIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuR3JvdXBpbmcgPT0gZUdyb3VwaW5nLkNsdXN0ZXJlZCwgIkludmFsaWQgR3JvdXBpbmciKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2hydC5TaGFwZSA9PSBlU2hhcGUuQm94LCAiSW52YWxpZCBTaGFwZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRUZXN0U2VyaWUoRXhjZWxXb3Jrc2hlZXQgd3MsIEV4Y2VsQ2hhcnQgY2hydCkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkVGVzdERhdGEod3MpOwotICAgICAgICAgICAgY2hydC5TZXJpZXMuQWRkKCInIiArIHdzLk5hbWUgKyAiJyFWMTk6VjI0IiwgIiciICsgd3MuTmFtZSArICInIVUxOTpVMjQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkVGVzdERhdGEoRXhjZWxXb3Jrc2hlZXQgd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJVMTkiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDA5LCAxMiwgMzEpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDEpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMiJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDMpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMyJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDQpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyNCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDUpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUxOTpVMjQiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktbW0tZGQiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siVjE5Il0uVmFsdWUgPSAxMDA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIwIl0uVmFsdWUgPSAxMDI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIxIl0uVmFsdWUgPSAxMDE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIyIl0uVmFsdWUgPSAxMDM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIzIl0uVmFsdWUgPSAxMDU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjI0Il0uVmFsdWUgPSAxMDQ7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJYMTkiXS5WYWx1ZSA9ICLDtsOkw6UiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMCJdLlZhbHVlID0gIsOWw4TDhSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIxIl0uVmFsdWUgPSAiw7zDmyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIyIl0uVmFsdWUgPSAiJiUjwqQiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlgyMyJdLlZhbHVlID0gIsO/IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJYMjQiXS5WYWx1ZSA9ICLDuyI7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBQaWVDaGFydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpZUNoYXJ0Iik7Ci0gICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJwaWVDaGFydCIsIGVDaGFydFR5cGUuUGllKSBhcyBFeGNlbFBpZUNoYXJ0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOwotCi0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDI1OwotICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAxMjsKLQotICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuU2hvd1BlcmNlbnQgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5MZWdlbmQuRm9udC5Db2xvciA9IENvbG9yLlN0ZWVsQmx1ZTsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuQm9yZGVyLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgIGNocnQuTGVnZW5kLlBvc2l0aW9uID0gZUxlZ2VuZFBvc2l0aW9uLlRvcFJpZ2h0OwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZSwgIkludmFsaWQgQ2hhcnR0eXBlIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuVmFyeUNvbG9ycyk7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiUGllY2hhcnQiOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgUGllQ2hhcnQzRCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpZUNoYXJ0M2QiKTsKLSAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoInBpZUNoYXJ0M2QiLCBlQ2hhcnRUeXBlLlBpZTNEKSBhcyBFeGNlbFBpZUNoYXJ0OwotICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKLQotICAgICAgICAgICAgY2hydC5Uby5Sb3cgPSAyNTsKLSAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gMTI7Ci0KLSAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLlNob3dWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LkxlZ2VuZC5Qb3NpdGlvbiA9IGVMZWdlbmRQb3NpdGlvbi5MZWZ0OwotICAgICAgICAgICAgY2hydC5TaG93SGlkZGVuRGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgY2hydC5EaXNwbGF5QmxhbmtzQXMgPSBlRGlzcGxheUJsYW5rc0FzLkdhcDsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuUmljaFRleHQuQWRkKCJQaWUgUlQgVGl0bGUgYWRkIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNocnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllM0QsICJJbnZhbGlkIENoYXJ0dHlwZSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LlZhcnlDb2xvcnMpOwotCi0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBTY2F0dGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2NhdHRlciIpOwotICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiU2NhdHRlckNoYXJ0MSIsIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzKSBhcyBFeGNlbFNjYXR0ZXJDaGFydDsKLSAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7Ci0gICAgICAgICAgIC8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOwotICAgICAgICAgICAgY2hydC5Uby5Sb3cgPSAyMzsKLSAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gMTI7Ci0gICAgICAgICAgICAvL2NocnQuVGl0bGUuVGV4dCA9ICJIZWFkZXIgVGV4dCI7Ci0gICAgICAgICAgICB2YXIgcjE9Y2hydC5UaXRsZS5SaWNoVGV4dC5BZGQoIkhlYWRlciIpOwotICAgICAgICAgICAgcjEuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgcjI9Y2hydC5UaXRsZS5SaWNoVGV4dC5BZGQoIiAgVGV4dCIpOwotICAgICAgICAgICAgcjIuVW5kZXJMaW5lID0gZVVuZGVyTGluZVR5cGUuV2F2eUhlYXZ5OwotCi0gICAgICAgICAgICBjaHJ0LlRpdGxlLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuRmlsbC5Db2xvciA9IENvbG9yLkxpZ2h0Qmx1ZTsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuRmlsbC5UcmFuc3BhcmFuY3kgPSA1MDsKLSAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICBFeGNlbFNjYXR0ZXJDaGFydFNlcmllIHNlciA9IGNocnQuU2VyaWVzWzBdIGFzIEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWU7Ci0gICAgICAgICAgICBzZXIuRGF0YUxhYmVsLlBvc2l0aW9uID0gZUxhYmVsUG9zaXRpb24uQ2VudGVyOwotICAgICAgICAgICAgc2VyLkRhdGFMYWJlbC5TaG93VmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgc2VyLkRhdGFMYWJlbC5TaG93Q2F0ZWdvcnkgPSB0cnVlOwotICAgICAgICAgICAgc2VyLkRhdGFMYWJlbC5GaWxsLkNvbG9yID0gQ29sb3IuQmx1ZVZpb2xldDsKLSAgICAgICAgICAgIHNlci5EYXRhTGFiZWwuRm9udC5Db2xvciA9IENvbG9yLldoaXRlOwotICAgICAgICAgICAgc2VyLkRhdGFMYWJlbC5Gb250Lkl0YWxpYyA9IHRydWU7Ci0gICAgICAgICAgICBzZXIuRGF0YUxhYmVsLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoImJvb2ttYW4gb2xkIHN0eWxlIiwgOCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjaHJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycywgIkludmFsaWQgQ2hhcnR0eXBlIik7Ci0gICAgICAgICAgICBjaHJ0LlNlcmllc1swXS5IZWFkZXIgPSAiVGVzdCBzZXJpZSI7Ci0gICAgICAgICAgICBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlNjYXR0ZXJDaGFydDIiLCBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCkgYXMgRXhjZWxTY2F0dGVyQ2hhcnQ7Ci0gICAgICAgICAgICBjaHJ0LlNlcmllcy5BZGQoIlUxOTpVMjQiLCAiVjE5OlYyNCIpOwotCi0gICAgICAgICAgICBjaHJ0LkZyb20uQ29sdW1uID0gMDsKLSAgICAgICAgICAgIGNocnQuRnJvbS5Sb3c9MjU7Ci0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDUzOwotICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAxMjsKLSAgICAgICAgICAgIGNocnQuTGVnZW5kLlBvc2l0aW9uID0gZUxlZ2VuZFBvc2l0aW9uLkJvdHRvbTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8vL2NocnQuU2VyaWVzWzBdLkRhdGFMYWJlbC5Qb3NpdGlvbiA9IGVMYWJlbFBvc2l0aW9uLkNlbnRlcjsKLSAgICAgICAgICAgIC8vQXNzZXJ0LklzVHJ1ZShjaHJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlciwgIkludmFsaWQgQ2hhcnR0eXBlIik7Ci0KLSAgICAgICAgfQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1YmJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkJ1YmJsZSIpOwotICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQnViYmxlIiwgZUNoYXJ0VHlwZS5CdWJibGUpIGFzIEV4Y2VsQnViYmxlQ2hhcnQ7Ci0gICAgICAgICAgICBBZGRUZXN0RGF0YSh3cyk7Ci0KLSAgICAgICAgICAgIGNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7Ci0KLSAgICAgICAgICAgIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQnViYmxlM2QiLCBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0KSBhcyBFeGNlbEJ1YmJsZUNoYXJ0OwotICAgICAgICAgICAgd3MuQ2VsbHNbIlcxOSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJXMjAiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVzIxIl0uVmFsdWUgPSAyOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlcyMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJXMjMiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVzI0Il0uVmFsdWUgPSA0OwotCi0gICAgICAgICAgICBjaHJ0LlNlcmllcy5BZGQoIlYxOTpWMjQiLCAiVTE5OlUyNCIsICJXMTk6VzI0Iik7Ci0gICAgICAgICAgICBjaHJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUyNTsKLQotICAgICAgICAgICAgLy8gY2hydC5TZXJpZXNbMF0uTWFya2VyID0gZU1hcmtlclN0eWxlLkRpYW1vbmQ7Ci0gICAgICAgICAgICBjaHJ0LkZyb20uUm93ID0gMjM7Ci0gICAgICAgICAgICBjaHJ0LkZyb20uQ29sdW1uID0gMTI7Ci0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDMzOwotICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAyMjsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJIZWFkZXIgVGV4dCI7Ci0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgUmFkYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJSYWRhciIpOwotICAgICAgICAgICAgQWRkVGVzdERhdGEod3MpOwotCi0gICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJSYWRhcjEiLCBlQ2hhcnRUeXBlLlJhZGFyKSBhcyBFeGNlbFJhZGFyQ2hhcnQ7Ci0gICAgICAgICAgICB2YXIgcz1jaHJ0LlNlcmllcy5BZGQoIlYxOTpWMjQiLCAiVTE5OlUyNCIpOwotICAgICAgICAgICAgcy5IZWFkZXIgPSAic2VyaWUxIjsKLSAgICAgICAgICAgIC8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOwotICAgICAgICAgICAgY2hydC5Gcm9tLlJvdyA9IDIzOwotICAgICAgICAgICAgY2hydC5Gcm9tLkNvbHVtbiA9IDEyOwotICAgICAgICAgICAgY2hydC5Uby5Sb3cgPSAzODsKLSAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gMjI7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiUmFkYXIgQ2hhcnQgMSI7Ci0KLSAgICAgICAgICAgIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiUmFkYXIyIiwgZUNoYXJ0VHlwZS5SYWRhckZpbGxlZCkgYXMgRXhjZWxSYWRhckNoYXJ0OwotICAgICAgICAgICAgcyA9IGNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7Ci0gICAgICAgICAgICBzLkhlYWRlciA9ICJzZXJpZTEiOwotICAgICAgICAgICAgLy8gY2hydC5TZXJpZXNbMF0uTWFya2VyID0gZU1hcmtlclN0eWxlLkRpYW1vbmQ7Ci0gICAgICAgICAgICBjaHJ0LkZyb20uUm93ID0gNDM7Ci0gICAgICAgICAgICBjaHJ0LkZyb20uQ29sdW1uID0gMTI7Ci0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDU4OwotICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAyMjsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJSYWRhciBDaGFydCAyIjsKLQotICAgICAgICAgICAgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJSYWRhcjMiLCBlQ2hhcnRUeXBlLlJhZGFyTWFya2VycykgYXMgRXhjZWxSYWRhckNoYXJ0OwotICAgICAgICAgICAgdmFyIHJzID0gKEV4Y2VsUmFkYXJDaGFydFNlcmllKWNocnQuU2VyaWVzLkFkZCgiVjE5OlYyNCIsICJVMTk6VTI0Iik7Ci0gICAgICAgICAgICBycy5IZWFkZXIgPSAic2VyaWUxIjsKLSAgICAgICAgICAgIHJzLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5TdGFyOwotICAgICAgICAgICAgcnMuTWFya2VyU2l6ZSA9IDE0OwotCi0gICAgICAgICAgICAvLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKLSAgICAgICAgICAgIGNocnQuRnJvbS5Sb3cgPSA2MzsKLSAgICAgICAgICAgIGNocnQuRnJvbS5Db2x1bW4gPSAxMjsKLSAgICAgICAgICAgIGNocnQuVG8uUm93ID0gNzg7Ci0gICAgICAgICAgICBjaHJ0LlRvLkNvbHVtbiA9IDIyOwotICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIlJhZGFyIENoYXJ0IDMiOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgU3VyZmFjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlN1cmZhY2UiKTsKLSAgICAgICAgICAgIEFkZFRlc3REYXRhKHdzKTsKLQotICAgICAgICAgICAgdmFyIGNocnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiU3VyZmFjZTEiLCBlQ2hhcnRUeXBlLlN1cmZhY2UpIGFzIEV4Y2VsU3VyZmFjZUNoYXJ0OwotICAgICAgICAgICAgdmFyIHMgPSBjaHJ0LlNlcmllcy5BZGQoIlYxOTpWMjQiLCAiVTE5OlUyNCIpOwotICAgICAgICAgICAgcy5IZWFkZXIgPSAic2VyaWUxIjsKLSAgICAgICAgICAgIC8vIGNocnQuU2VyaWVzWzBdLk1hcmtlciA9IGVNYXJrZXJTdHlsZS5EaWFtb25kOwotICAgICAgICAgICAgY2hydC5Gcm9tLlJvdyA9IDIzOwotICAgICAgICAgICAgY2hydC5Gcm9tLkNvbHVtbiA9IDEyOwotICAgICAgICAgICAgY2hydC5Uby5Sb3cgPSAzODsKLSAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gMjI7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiU3VyZmFjZSBDaGFydCAxIjsKLQotICAgICAgICAgICAgLy9jaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlN1cmZhY2UiLCBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkKSBhcyBFeGNlbFJhZGFyQ2hhcnQ7Ci0gICAgICAgICAgICAvL3MgPSBjaHJ0LlNlcmllcy5BZGQoIlYxOTpWMjQiLCAiVTE5OlUyNCIpOwotICAgICAgICAgICAgLy9zLkhlYWRlciA9ICJzZXJpZTEiOwotICAgICAgICAgICAgLy8vLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKLSAgICAgICAgICAgIC8vY2hydC5Gcm9tLlJvdyA9IDQzOwotICAgICAgICAgICAgLy9jaHJ0LkZyb20uQ29sdW1uID0gMTI7Ci0gICAgICAgICAgICAvL2NocnQuVG8uUm93ID0gNTg7Ci0gICAgICAgICAgICAvL2NocnQuVG8uQ29sdW1uID0gMjI7Ci0gICAgICAgICAgICAvL2NocnQuVGl0bGUuVGV4dCA9ICJSYWRhciBDaGFydCAyIjsKLQotICAgICAgICAgICAgLy9jaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIlJhZGFyMyIsIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzKSBhcyBFeGNlbFJhZGFyQ2hhcnQ7Ci0gICAgICAgICAgICAvL3ZhciBycyA9IChFeGNlbFJhZGFyQ2hhcnRTZXJpZSljaHJ0LlNlcmllcy5BZGQoIlYxOTpWMjQiLCAiVTE5OlUyNCIpOwotICAgICAgICAgICAgLy9ycy5IZWFkZXIgPSAic2VyaWUxIjsKLSAgICAgICAgICAgIC8vcnMuTWFya2VyID0gZU1hcmtlclN0eWxlLlN0YXI7Ci0gICAgICAgICAgICAvL3JzLk1hcmtlclNpemUgPSAxNDsKLQotICAgICAgICAgICAgLy8vLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKLSAgICAgICAgICAgIC8vY2hydC5Gcm9tLlJvdyA9IDYzOwotICAgICAgICAgICAgLy9jaHJ0LkZyb20uQ29sdW1uID0gMTI7Ci0gICAgICAgICAgICAvL2NocnQuVG8uUm93ID0gNzg7Ci0gICAgICAgICAgICAvL2NocnQuVG8uQ29sdW1uID0gMjI7Ci0gICAgICAgICAgICAvL2NocnQuVGl0bGUuVGV4dCA9ICJSYWRhciBDaGFydCAzIjsKLSAgICAgICAgfQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFB5cmFtaWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQeXJhbWlkIik7Ci0gICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJQeXJhbWlkMSIsIGVDaGFydFR5cGUuUHlyYW1pZENvbCkgYXMgRXhjZWxCYXJDaGFydDsKLSAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7Ci0gICAgICAgICAgICAvLyBjaHJ0LlNlcmllc1swXS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuRGlhbW9uZDsKLSAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IDIzOwotICAgICAgICAgICAgY2hydC5Uby5Db2x1bW4gPSAxMjsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJIZWFkZXIgVGV4dCI7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLkZpbGwuU3R5bGU9IGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgY2hydC5UaXRsZS5GaWxsLkNvbG9yID0gQ29sb3IuRGFya0JsdWU7Ci0gICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5TaG93VmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgLy9jaHJ0LkRhdGFMYWJlbC5TaG93U2VyaWVzTmFtZSA9IHRydWU7Ci0gICAgICAgICAgICAvL2NocnQuRGF0YUxhYmVsLlNlcGFyYXRvciA9ICIsIjsKLSAgICAgICAgICAgIGNocnQuQm9yZGVyLkxpbmVDYXAgPSBlTGluZUNhcC5Sb3VuZDsgICAgICAgICAgICAKLSAgICAgICAgICAgIGNocnQuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2hEb3REb3Q7Ci0gICAgICAgICAgICBjaHJ0LkJvcmRlci5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICBjaHJ0LkJvcmRlci5GaWxsLkNvbG9yID0gQ29sb3IuQmx1ZTsKLQotICAgICAgICAgICAgY2hydC5GaWxsLkNvbG9yID0gQ29sb3IuTGlnaHRDeWFuOwotICAgICAgICAgICAgY2hydC5QbG90QXJlYS5GaWxsLkNvbG9yID0gQ29sb3IuV2hpdGU7Ci0gICAgICAgICAgICBjaHJ0LlBsb3RBcmVhLkJvcmRlci5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICBjaHJ0LlBsb3RBcmVhLkJvcmRlci5GaWxsLkNvbG9yID0gQ29sb3IuQmVpZ2U7Ci0gICAgICAgICAgICBjaHJ0LlBsb3RBcmVhLkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLkxvbmdEYXNoOwotCi0gICAgICAgICAgICBjaHJ0LkxlZ2VuZC5GaWxsLkNvbG9yID0gQ29sb3IuQXF1YW1hcmluZTsKLSAgICAgICAgICAgIGNocnQuTGVnZW5kLlBvc2l0aW9uID0gZUxlZ2VuZFBvc2l0aW9uLlRvcDsKLSAgICAgICAgICAgIGNocnQuQXhpc1swXS5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICBjaHJ0LkF4aXNbMF0uRmlsbC5Db2xvciA9IENvbG9yLkJsYWNrOwotICAgICAgICAgICAgY2hydC5BeGlzWzBdLkZvbnQuQ29sb3IgPSBDb2xvci5XaGl0ZTsKLQotICAgICAgICAgICAgY2hydC5BeGlzWzFdLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgIGNocnQuQXhpc1sxXS5GaWxsLkNvbG9yID0gQ29sb3IuTGlnaHRTbGF0ZUdyYXk7Ci0gICAgICAgICAgICBjaHJ0LkF4aXNbMV0uRm9udC5Db2xvciA9IENvbG9yLkRhcmtSZWQ7Ci0KLSAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5GaWxsLkNvbG9yID0gQ29sb3IuTGlnaHRCbHVlOwotICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuQm9yZGVyLkZpbGwuU3R5bGU9ZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICBjaHJ0LkRhdGFMYWJlbC5Cb3JkZXIuRmlsbC5Db2xvcj1Db2xvci5CbGFjazsKLSAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLlNvbGlkOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgQ29uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbmUiKTsKLSAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNvbmUxIiwgZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkKSBhcyBFeGNlbEJhckNoYXJ0OwotICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKLSAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlNldFNpemUoMjAwKTsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuVGV4dCA9ICJDb25lIGJhciI7Ci0gICAgICAgICAgICBjaHJ0LlNlcmllc1swXS5IZWFkZXIgPSAiU2VyaWUgMSI7Ci0gICAgICAgICAgICBjaHJ0LkxlZ2VuZC5Qb3NpdGlvbiA9IGVMZWdlbmRQb3NpdGlvbi5SaWdodDsKLSAgICAgICAgICAgIGNocnQuQXhpc1sxXS5EaXNwbGF5VW5pdCA9IDEwMDAwMDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChjaHJ0LkF4aXNbMV0uRGlzcGxheVVuaXQsIDEwMDAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBDb2x1bW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb2x1bW4iKTsKLSAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNvbHVtbjEiLCBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEKSBhcyBFeGNlbEJhckNoYXJ0OwotICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKLSAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlZpZXczRC5SaWdodEFuZ2xlQXhlcyA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlZpZXczRC5EZXB0aFBlcmNlbnQgPSA5OTsKLSAgICAgICAgICAgIC8vY2hydC5WaWV3M0QuSGVpZ2h0UGVyY2VudCA9IDk5OwotICAgICAgICAgICAgY2hydC5WaWV3M0QuUmlnaHRBbmdsZUF4ZXMgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5TZXRTaXplKDIwMCk7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiQ29sdW1uIjsKLSAgICAgICAgICAgIGNocnQuU2VyaWVzWzBdLkhlYWRlciA9ICJTZXJpZSAxIjsKLSAgICAgICAgICAgIGNocnQuTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBjaHJ0LlByaW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBjaHJ0LkVkaXRBcyA9IGVFZGl0QXMuVHdvQ2VsbDsKLSAgICAgICAgICAgIGNocnQuQXhpc1sxXS5EaXNwbGF5VW5pdCA9IDEwMDIwOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNocnQuQXhpc1sxXS5EaXNwbGF5VW5pdCwgMTAwMjApOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgRG91Z251dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRvdWdudXQiKTsKLSAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkRvdWdudXQxIiwgZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkKSBhcyBFeGNlbERvdWdobnV0Q2hhcnQ7Ci0gICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIGNocnQpOwotICAgICAgICAgICAgY2hydC5TZXRTaXplKDIwMCk7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiRG91Z2hudXQgRXhwbG9kZWQiOwotICAgICAgICAgICAgY2hydC5TZXJpZXNbMF0uSGVhZGVyID0gIlNlcmllIDEiOwotICAgICAgICAgICAgY2hydC5FZGl0QXMgPSBlRWRpdEFzLkFic29sdXRlOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgTGluZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxpbmUiKTsKLSAgICAgICAgICAgIHZhciBjaHJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkxpbmUxIiwgZUNoYXJ0VHlwZS5MaW5lKSBhcyBFeGNlbExpbmVDaGFydDsKLSAgICAgICAgICAgIEFkZFRlc3RTZXJpZSh3cywgY2hydCk7Ci0gICAgICAgICAgICBjaHJ0LlNldFNpemUoMTUwKTsKLSAgICAgICAgICAgIGNocnQuVmFyeUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlNtb290aCA9IGZhbHNlOwotICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIkxpbmUgM0QiOwotICAgICAgICAgICAgY2hydC5TZXJpZXNbMF0uSGVhZGVyID0gIkxpbmUgc2VyaWUgMSI7Ci0gICAgICAgICAgICB2YXIgdGwgPSBjaHJ0LlNlcmllc1swXS5UcmVuZExpbmVzLkFkZChlVHJlbmRMaW5lLlBvbHlub21pYWwpOwotICAgICAgICAgICAgdGwuTmFtZSA9ICJUZXN0IjsKLSAgICAgICAgICAgIHRsLkRpc3BsYXlSU3F1YXJlZFZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIHRsLkRpc3BsYXlFcXVhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICB0bC5Gb3J3YXJkID0gMTU7Ci0gICAgICAgICAgICB0bC5CYWNrd2FyZCA9IDE7Ci0gICAgICAgICAgICB0bC5JbnRlcmNlcHQgPSA2OwotICAgICAgICAgICAgLy90bC5QZXJpb2QgPSAxMjsKLSAgICAgICAgICAgIHRsLk9yZGVyID0gNTsKLQotICAgICAgICAgICAgdGwgPSBjaHJ0LlNlcmllc1swXS5UcmVuZExpbmVzLkFkZChlVHJlbmRMaW5lLk1vdmluZ0F2Z2VyYWdlKTsKLSAgICAgICAgICAgIGNocnQuRmlsbC5Db2xvciA9IENvbG9yLkxpZ2h0U3RlZWxCbHVlOwotICAgICAgICAgICAgY2hydC5Cb3JkZXIuTGluZVN0eWxlID0gZUxpbmVTdHlsZS5Eb3Q7Ci0gICAgICAgICAgICBjaHJ0LkJvcmRlci5GaWxsLkNvbG9yPUNvbG9yLkJsYWNrOwotCi0gICAgICAgICAgICBjaHJ0LkxlZ2VuZC5Gb250LkNvbG9yID0gQ29sb3IuUmVkOwotICAgICAgICAgICAgY2hydC5MZWdlbmQuRm9udC5TdHJpa2UgPSBlU3RyaWtlVHlwZS5Eb3VibGU7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLkZvbnQuQ29sb3IgPSBDb2xvci5EYXJrR29sZGVucm9kOwotICAgICAgICAgICAgY2hydC5UaXRsZS5Gb250LkxhdGluRm9udCA9ICJBcmlhbCI7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLkZpbGwuQ29sb3IgPSBDb2xvci5XaGl0ZTsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuQm9yZGVyLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgIGNocnQuVGl0bGUuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2hEb3REb3Q7Ci0gICAgICAgICAgICBjaHJ0LlRpdGxlLkJvcmRlci5GaWxsLkNvbG9yID0gQ29sb3IuVG9tYXRvOwotICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuU2hvd1Nlcmllc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5EYXRhTGFiZWwuU2hvd0xlYWRlckxpbmVzPXRydWU7Ci0gICAgICAgICAgICBjaHJ0LkVkaXRBcyA9IGVFZGl0QXMuT25lQ2VsbDsKLSAgICAgICAgICAgIGNocnQuRGlzcGxheUJsYW5rc0FzID0gZURpc3BsYXlCbGFua3NBcy5TcGFuOwotICAgICAgICAgICAgY2hydC5BeGlzWzBdLlRpdGxlLlRleHQgPSAiQXhpcyAwIjsKLSAgICAgICAgICAgIGNocnQuQXhpc1swXS5UaXRsZS5Sb3RhdGlvbiA9IDkwOwotICAgICAgICAgICAgY2hydC5BeGlzWzBdLlRpdGxlLk92ZXJsYXkgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5BeGlzWzFdLlRpdGxlLlRleHQgPSAiQXhpcyAxIjsKLSAgICAgICAgICAgIGNocnQuQXhpc1sxXS5UaXRsZS5BbmNob3JDdHIgPSB0cnVlOwotICAgICAgICAgICAgY2hydC5BeGlzWzFdLlRpdGxlLlRleHRWZXJ0aWNhbCA9IGVUZXh0VmVydGljYWxUeXBlLlZlcnRpY2FsMjcwOwotICAgICAgICAgICAgY2hydC5BeGlzWzFdLlRpdGxlLkJvcmRlci5MaW5lU3R5bGU9ZUxpbmVTdHlsZS5Mb25nRGFzaERvdERvdDsKLQotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgTGluZU1hcmtlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxpbmVNYXJrZXIxIik7Ci0gICAgICAgICAgICB2YXIgY2hydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJMaW5lMSIsIGVDaGFydFR5cGUuTGluZU1hcmtlcnMpIGFzIEV4Y2VsTGluZUNoYXJ0OwotICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0KTsKLSAgICAgICAgICAgIGNocnQuU2V0U2l6ZSgxNTApOwotICAgICAgICAgICAgY2hydC5UaXRsZS5UZXh0ID0gIkxpbmUgTWFya2VycyI7Ci0gICAgICAgICAgICBjaHJ0LlNlcmllc1swXS5IZWFkZXIgPSAiTGluZSBzZXJpZSAxIjsKLSAgICAgICAgICAgICgoRXhjZWxMaW5lQ2hhcnRTZXJpZSljaHJ0LlNlcmllc1swXSkuTWFya2VyID0gZU1hcmtlclN0eWxlLlBsdXM7Ci0KLSAgICAgICAgICAgIHZhciBjaHJ0MiA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJMaW5lMiIsIGVDaGFydFR5cGUuTGluZU1hcmtlcnMpIGFzIEV4Y2VsTGluZUNoYXJ0OwotICAgICAgICAgICAgQWRkVGVzdFNlcmllKHdzLCBjaHJ0Mik7Ci0gICAgICAgICAgICBjaHJ0Mi5TZXRQb3NpdGlvbig1MDAsMCk7Ci0gICAgICAgICAgICBjaHJ0Mi5TZXRTaXplKDE1MCk7Ci0gICAgICAgICAgICBjaHJ0Mi5UaXRsZS5UZXh0ID0gIkxpbmUgTWFya2VycyI7Ci0gICAgICAgICAgICB2YXIgc2VyaWUgPSAoRXhjZWxMaW5lQ2hhcnRTZXJpZSljaHJ0Mi5TZXJpZXNbMF07Ci0gICAgICAgICAgICBzZXJpZS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuWDsKLQotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgRHJhd2luZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTaGFwZXMiKTsKLSAgICAgICAgICAgIGludCB5PTEwMCwgaT0xOwotICAgICAgICAgICAgZm9yZWFjaChlU2hhcGVTdHlsZSBzdHlsZSBpbiBFbnVtLkdldFZhbHVlcyh0eXBlb2YoZVNoYXBlU3R5bGUpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hhcGUgPSB3cy5EcmF3aW5ncy5BZGRTaGFwZSgic2hhcGUiK2kuVG9TdHJpbmcoKSwgc3R5bGUpOwotICAgICAgICAgICAgICAgIHNoYXBlLlNldFBvc2l0aW9uKHksIDEwMCk7Ci0gICAgICAgICAgICAgICAgc2hhcGUuU2V0U2l6ZSgzMDAsIDMwMCk7Ci0gICAgICAgICAgICAgICAgeSArPSA0MDA7Ci0gICAgICAgICAgICAgICAgc2hhcGUuVGV4dCA9IHN0eWxlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlMSJdIGFzIEV4Y2VsU2hhcGUpLlRleHRBbmNob3JpbmcgPSBlVGV4dEFuY2hvcmluZ1R5cGUuVG9wOyAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIHJ0ID0gKHdzLkRyYXdpbmdzWyJzaGFwZTEiXSBhcyBFeGNlbFNoYXBlKS5SaWNoVGV4dC5BZGQoIkFkZGVkIGZvcm1hdGVkIHJpY2h0ZXh0Iik7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlMSJdIGFzIEV4Y2VsU2hhcGUpLkxvY2tUZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICBydC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJ0LkNvbG9yID0gQ29sb3IuQXF1YW1hcmluZTsKLSAgICAgICAgICAgIHJ0Lkl0YWxpYyA9IHRydWU7Ci0gICAgICAgICAgICBydC5TaXplID0gMTc7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlMiJdIGFzIEV4Y2VsU2hhcGUpLlRleHRWZXJ0aWNhbCA9IGVUZXh0VmVydGljYWxUeXBlLlZlcnRpY2FsOwotICAgICAgICAgICAgcnQgPSAod3MuRHJhd2luZ3NbInNoYXBlMiJdIGFzIEV4Y2VsU2hhcGUpLlJpY2hUZXh0LkFkZCgiXHJcbkFkZGVkIGZvcm1hdGVkIHJpY2h0ZXh0Iik7Ci0gICAgICAgICAgICBydC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJ0LkNvbG9yID0gQ29sb3IuRGFya0dvbGRlbnJvZCA7Ci0gICAgICAgICAgICBydC5TZXRGcm9tRm9udChuZXcgRm9udCgiVGltZXMgbmV3IHJvbWFuIiwgMTgsIEZvbnRTdHlsZS5VbmRlcmxpbmUpKTsKLSAgICAgICAgICAgIHJ0LlVuZGVyTGluZUNvbG9yID0gQ29sb3IuR3JlZW47Ci0KLQotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTMiXSBhcyBFeGNlbFNoYXBlKS5UZXh0QW5jaG9yaW5nPWVUZXh0QW5jaG9yaW5nVHlwZS5Cb3R0b207Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlMyJdIGFzIEV4Y2VsU2hhcGUpLlRleHRBbmNob3JpbmdDb250cm9sPXRydWUgOwotCi0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNCJdIGFzIEV4Y2VsU2hhcGUpLlRleHRWZXJ0aWNhbCA9IGVUZXh0VmVydGljYWxUeXBlLlZlcnRpY2FsMjcwOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTQiXSBhcyBFeGNlbFNoYXBlKS5UZXh0QW5jaG9yaW5nID0gZVRleHRBbmNob3JpbmdUeXBlLlRvcDsKLQotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTUiXSBhcyBFeGNlbFNoYXBlKS5GaWxsLlN0eWxlPWVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTUiXSBhcyBFeGNlbFNoYXBlKS5GaWxsLkNvbG9yPUNvbG9yLlJlZDsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU1Il0gYXMgRXhjZWxTaGFwZSkuRmlsbC5UcmFuc3BhcmFuY3kgPSA1MDsKLQotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTYiXSBhcyBFeGNlbFNoYXBlKS5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Ob0ZpbGw7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNiJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuQ29sb3IgPSBDb2xvci5CbGFjazsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU2Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CbGFjazsKLQotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuQ29sb3I9Q29sb3IuR3JheTsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkZpbGwuU3R5bGU9ZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkJvcmRlci5GaWxsLkNvbG9yID0gQ29sb3IuQmxhY2s7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkJvcmRlci5GaWxsLlRyYW5zcGFyYW5jeT00MzsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuQm9yZGVyLkxpbmVDYXA9ZUxpbmVDYXAuUm91bmQ7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLkxvbmdEYXNoOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Gb250LlVuZGVyTGluZUNvbG9yID0gQ29sb3IuQmx1ZTsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU3Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5Db2xvciA9IENvbG9yLkJsYWNrOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Gb250LkxhdGluRm9udCA9ICJBcmlhbCI7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuQ29tcGxleEZvbnQgPSAiQXJpYWwiOwotICAgICAgICAgICAgKHdzLkRyYXdpbmdzWyJzaGFwZTciXSBhcyBFeGNlbFNoYXBlKS5Gb250Lkl0YWxpYyA9IHRydWU7Ci0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlNyJdIGFzIEV4Y2VsU2hhcGUpLkZvbnQuVW5kZXJMaW5lID0gZVVuZGVyTGluZVR5cGUuRG90dGVkOwotCi0gICAgICAgICAgICAod3MuRHJhd2luZ3NbInNoYXBlOCJdIGFzIEV4Y2VsU2hhcGUpLkZpbGwuU3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU4Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5MYXRpbkZvbnQgPSAiTWlyaWFtIjsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU4Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5VbmRlckxpbmVDb2xvciA9IENvbG9yLkNhZGV0Qmx1ZTsKLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU4Il0gYXMgRXhjZWxTaGFwZSkuRm9udC5VbmRlckxpbmUgPSBlVW5kZXJMaW5lVHlwZS5TaW5nbGU7Ci0KLSAgICAgICAgICAgICh3cy5EcmF3aW5nc1sic2hhcGU5Il0gYXMgRXhjZWxTaGFwZSkuVGV4dEFsaWdubWVudCA9IGVUZXh0QWxpZ25tZW50LlJpZ2h0OwotCi0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIERyYXdpbmdXb3Jrc2hlZXRDb3B5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzU2hhcGVzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29weSBTaGFwZXMiLCBfcGNrLldvcmtib29rLldvcmtzaGVldHNbIlNoYXBlcyJdKTsKLSAgICAgICAgICAgIHZhciB3c1NjYXR0ZXJDaGFydCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHkgU2NhdHRlciIsIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1siU2NhdHRlciJdKTsKLSAgICAgICAgICAgIHZhciB3c1BpY3R1cmUgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5IFBpY3R1cmUiLCBfcGNrLldvcmtib29rLldvcmtzaGVldHNbIlBpY3R1cmUiXSk7Ci0gICAgICAgIH0gICAgCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgTGluZTJUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMaW5lSXNzdWUiKTsKLQotICAgICAgICAgICBFeGNlbENoYXJ0IGNoYXJ0ID0gd29ya3NoZWV0LkRyYXdpbmdzLkFkZENoYXJ0KCJMaW5lQ2hhcnQiLCBlQ2hhcnRUeXBlLkxpbmUpOwotICAgICAgICAgICAKLSAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlPTE7Ci0gICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZT0yOwotICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWU9MzsKLSAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlPTQ7Ci0gICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZT01OwotICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWU9NjsKLQotICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWU9MTAwMDA7Ci0gICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZT0xMDEwMDsKLSAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlPTEwMjAwOwotICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWU9MTAxNTA7Ci0gICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjUiXS5WYWx1ZT0xMDI1MDsKLSAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCNiJdLlZhbHVlPTEwMjAwOwotCi0gICAgICAgICAgIGNoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDEsIDIsIHdvcmtzaGVldC5EaW1lbnNpb24uRW5kLlJvdywgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDEsIDEsIHdvcmtzaGVldC5EaW1lbnNpb24uRW5kLlJvdywgMSkpOwotCi0gICAgICAgICAgIHZhciBTZXJpZXMgPSBjaGFydC5TZXJpZXNbMF07Ci0gICAgICAgICAgIAotICAgICAgICAgICBjaGFydC5TZXJpZXNbMF0uSGVhZGVyID0gIkJsYWgiOwotICAgICAgICB9Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgTXVsdGlDaGFydFNlcmllcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk11bHRpQ2hhcnRUeXBlcyIpOwotCi0gICAgICAgICAgICBFeGNlbENoYXJ0IGNoYXJ0ID0gd29ya3NoZWV0LkRyYXdpbmdzLkFkZENoYXJ0KCJjaHRQaWUiLCBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzKTsKLSAgICAgICAgICAgIGNoYXJ0LlNldFBvc2l0aW9uKDEwMCwgMTAwKTsKLSAgICAgICAgICAgIGNoYXJ0LlNldFNpemUoODAwLDYwMCk7Ci0gICAgICAgICAgICBBZGRUZXN0U2VyaWUod29ya3NoZWV0LCBjaGFydCk7Ci0gICAgICAgICAgICBjaGFydC5TZXJpZXNbMF0uSGVhZGVyID0gIlNlcmllNSI7Ci0gICAgICAgICAgICBjaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjc7Ci0gICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIlcxOSJdLlZhbHVlID0gMTIwOwotICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJXMjAiXS5WYWx1ZSA9IDEyMjsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siVzIxIl0uVmFsdWUgPSAxMjE7Ci0gICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIlcyMiJdLlZhbHVlID0gMTIzOwotICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJXMjMiXS5WYWx1ZSA9IDEyNTsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siVzI0Il0uVmFsdWUgPSAxMjQ7Ci0KLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDE5Il0uVmFsdWUgPSA5MDsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDIwIl0uVmFsdWUgPSA1MjsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDIxIl0uVmFsdWUgPSA4ODsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDIyIl0uVmFsdWUgPSA3NTsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDIzIl0uVmFsdWUgPSA3NzsKLSAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siWDI0Il0uVmFsdWUgPSA5OTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGNzMiA9IGNoYXJ0LlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkKTsKLSAgICAgICAgICAgIHZhciBzID0gY3MyLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJXMTk6VzI0Il0sIHdvcmtzaGVldC5DZWxsc1siVTE5OlUyNCJdKTsKLSAgICAgICAgICAgIHMuSGVhZGVyID0gIlNlcmllNCI7Ci0gICAgICAgICAgICBjczIuWUF4aXMuTWF4VmFsdWUgPSAzMDA7Ci0gICAgICAgICAgICBjczIuWUF4aXMuTWluVmFsdWUgPSAtNS41OwotICAgICAgICAgICAgdmFyIGNzMyA9IGNoYXJ0LlBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGVDaGFydFR5cGUuTGluZSk7Ci0gICAgICAgICAgICBzPWNzMy5TZXJpZXMuQWRkKHdvcmtzaGVldC5DZWxsc1siWDE5OlgyNCJdLCB3b3Jrc2hlZXQuQ2VsbHNbIlUxOTpVMjQiXSk7Ci0gICAgICAgICAgICBzLkhlYWRlciA9ICJTZXJpZTEiOwotICAgICAgICAgICAgY3MzLlVzZVNlY29uZGFyeUF4aXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjczMuWEF4aXMuRGVsZXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgY3MzLlhBeGlzLk1ham9yVW5pdCA9IDIwOwotICAgICAgICAgICAgY3MzLlhBeGlzLk1pbm9yVW5pdCA9IDM7Ci0KLSAgICAgICAgICAgIGNzMy5YQXhpcy5UaWNrTGFiZWxQb3NpdGlvbiA9IGVUaWNrTGFiZWxQb3NpdGlvbi5IaWdoOwotICAgICAgICAgICAgY3MzLllBeGlzLkxvZ0Jhc2UgPSAxMC4yOwotCi0gICAgICAgICAgICB2YXIgY2hhcnQyID0gd29ya3NoZWV0LkRyYXdpbmdzLkFkZENoYXJ0KCJzY2F0dGVyMSIsIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoKTsKLSAgICAgICAgICAgIHM9Y2hhcnQyLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJXMTk6VzI0Il0sIHdvcmtzaGVldC5DZWxsc1siVTE5OlUyNCJdKTsKLSAgICAgICAgICAgIHMuSGVhZGVyID0gIlNlcmllMiI7Ci0KLSAgICAgICAgICAgIHZhciBjMmN0MiA9IGNoYXJ0Mi5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCk7Ci0gICAgICAgICAgICBzPWMyY3QyLlNlcmllcy5BZGQod29ya3NoZWV0LkNlbGxzWyJYMTk6WDI0Il0sIHdvcmtzaGVldC5DZWxsc1siVjE5OlYyNCJdKTsKLSAgICAgICAgICAgIHMuSGVhZGVyPSJTZXJpZTMiOwotICAgICAgICAgICAgcz1jMmN0Mi5TZXJpZXMuQWRkKHdvcmtzaGVldC5DZWxsc1siVzE5OlcyNCJdLCB3b3Jrc2hlZXQuQ2VsbHNbIlYxOTpWMjQiXSk7Ci0gICAgICAgICAgICBzLkhlYWRlciA9ICJTZXJpZTQiOwotCi0gICAgICAgICAgICBjMmN0Mi5Vc2VTZWNvbmRhcnlBeGlzID0gdHJ1ZTsKLSAgICAgICAgICAgIGMyY3QyLlhBeGlzLkRlbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGMyY3QyLlhBeGlzLlRpY2tMYWJlbFBvc2l0aW9uID0gZVRpY2tMYWJlbFBvc2l0aW9uLkhpZ2g7Ci0KLSAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQzID0gd29ya3NoZWV0LkRyYXdpbmdzLkFkZENoYXJ0KCJjaGFydCIsIGVDaGFydFR5cGUuTGluZU1hcmtlcnMpOwotICAgICAgICAgICAgY2hhcnQzLlNldFBvc2l0aW9uKDMwMCwgMTAwMCk7Ci0gICAgICAgICAgICB2YXIgczMxPWNoYXJ0My5TZXJpZXMuQWRkKHdvcmtzaGVldC5DZWxsc1siVzE5OlcyNCJdLCB3b3Jrc2hlZXQuQ2VsbHNbIlUxOTpVMjQiXSk7Ci0gICAgICAgICAgICBzMzEuSGVhZGVyID0gIlNlcmllMSI7Ci0KLSAgICAgICAgICAgIHZhciBjM2N0MiA9IGNoYXJ0My5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzKTsKLSAgICAgICAgICAgIHZhciBjMzIgPSBjM2N0Mi5TZXJpZXMuQWRkKHdvcmtzaGVldC5DZWxsc1siWDE5OlgyNCJdLCB3b3Jrc2hlZXQuQ2VsbHNbIlYxOTpWMjQiXSk7Ci0gICAgICAgICAgICBjM2N0Mi5Vc2VTZWNvbmRhcnlBeGlzID0gdHJ1ZTsKLSAgICAgICAgICAgIGMzMi5IZWFkZXIgPSAiU2VyaWUyIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucz1uZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihuZXcgTmFtZVRhYmxlKCkpOwotICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJjIiwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0Iik7Ci0gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoYXJ0LkNoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vYzpwbG90VmlzT25seSIsIG5zKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IT1udWxsKSBlbGVtZW50LlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVEcmF3aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzPV9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRlbGV0ZURyYXdpbmcxIik7Ci0gICAgICAgICAgICB2YXIgY2hhcnQxID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0MSIsIGVDaGFydFR5cGUuTGluZSk7Ci0gICAgICAgICAgICB2YXIgY2hhcnQyID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0MiIsIGVDaGFydFR5cGUuTGluZSk7Ci0gICAgICAgICAgICB2YXIgc2hhcGUxID0gd3MuRHJhd2luZ3MuQWRkU2hhcGUoIlNoYXBlMSIsIGVTaGFwZVN0eWxlLkFjdGlvbkJ1dHRvbkJhY2tQcmV2aW91cyk7Ci0gICAgICAgICAgICB2YXIgcGljMSA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBSZXNvdXJjZXMuVGVzdDEpOwotICAgICAgICAgICAgd3MuRHJhd2luZ3MuUmVtb3ZlKDIpOwotICAgICAgICAgICAgd3MuRHJhd2luZ3MuUmVtb3ZlKGNoYXJ0Mik7Ci0gICAgICAgICAgICB3cy5EcmF3aW5ncy5SZW1vdmUoIlBpYzEiKTsKLQotICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEZWxldGVEcmF3aW5nMiIpOwotICAgICAgICAgICAgY2hhcnQxID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0MSIsIGVDaGFydFR5cGUuTGluZSk7Ci0gICAgICAgICAgICBjaGFydDIgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiQ2hhcnQyIiwgZUNoYXJ0VHlwZS5MaW5lKTsKLSAgICAgICAgICAgIHNoYXBlMSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJTaGFwZTEiLCBlU2hhcGVTdHlsZS5BY3Rpb25CdXR0b25CYWNrUHJldmlvdXMpOwotICAgICAgICAgICAgcGljMSA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBSZXNvdXJjZXMuVGVzdDEpOwotCi0gICAgICAgICAgICB3cy5EcmF3aW5ncy5SZW1vdmUoImNoYXJ0MSIpOwotCi0gICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNsZWFyRHJhd2luZzIiKTsKLSAgICAgICAgICAgIGNoYXJ0MSA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJDaGFydDEiLCBlQ2hhcnRUeXBlLkxpbmUpOwotICAgICAgICAgICAgY2hhcnQyID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIkNoYXJ0MiIsIGVDaGFydFR5cGUuTGluZSk7Ci0gICAgICAgICAgICBzaGFwZTEgPSB3cy5EcmF3aW5ncy5BZGRTaGFwZSgiU2hhcGUxIiwgZVNoYXBlU3R5bGUuQWN0aW9uQnV0dG9uQmFja1ByZXZpb3VzKTsKLSAgICAgICAgICAgIHBpYzEgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMxIiwgUmVzb3VyY2VzLlRlc3QxKTsKLSAgICAgICAgICAgIHdzLkRyYXdpbmdzLkNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkRG9jdW1lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZmk9bmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgImRyYXdpbmcueGxzeCIpOwotICAgICAgICAgICAgaWYgKCFmaS5FeGlzdHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkluY29uY2x1c2l2ZSgiRHJhd2luZy54bHN4IGlzIG5vdCBjcmVhdGVkLiBTa2lwcG5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShmaSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGZvcmVhY2godmFyIHdzIGluIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2goRXhjZWxEcmF3aW5nIGQgaW4gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uRHJhd2luZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZCBpcyBFeGNlbENoYXJ0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGV4dC5Xcml0ZUxpbmUoKChFeGNlbENoYXJ0KWQpLkNoYXJ0VHlwZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBjay5EaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRNdWx0aUNoYXJ0U2VyaWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY2hhcnRzZXJpZXMueGxzeCIpLCB0cnVlKTsKLQotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICBFeGNlbENoYXJ0IGMgPSB3cy5EcmF3aW5nc1swXSBhcyBFeGNlbENoYXJ0OwotCi0KLSAgICAgICAgICAgIHZhciBwID0gYy5QbG90QXJlYTsKLSAgICAgICAgICAgIHAuQ2hhcnRUeXBlc1sxXS5TZXJpZXNbMF0uU2VyaWVzID0gIlM3OlMxNSI7Ci0KLSAgICAgICAgICAgIHZhciBjMj13cy5EcmF3aW5ncy5BZGRDaGFydCgiTmV3Q2hhcnQiLCBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZCk7Ci0gICAgICAgICAgICB2YXIgc2VyaWUxID0gYzIuU2VyaWVzLkFkZCgiUjc6UjE1IiwgIlE3OlExNSIpOwotICAgICAgICAgICAgYzIuU2V0U2l6ZSg4MDAsIDgwMCk7Ci0gICAgICAgICAgICBzZXJpZTEuSGVhZGVyID0gIkNvbHVtbiBDbHVzdGVyZWQiOwotCi0gICAgICAgICAgICB2YXIgc3ViQ2hhcnQgPSBjMi5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzKTsKLSAgICAgICAgICAgIHZhciBzZXJpZTIgPSBzdWJDaGFydC5TZXJpZXMuQWRkKCJTNzpTMTUiLCAiUTc6UTE1Iik7Ci0gICAgICAgICAgICBzZXJpZTIuSGVhZGVyID0gIkxpbmUiOwotCi0gICAgICAgICAgICAvL3ZhciBzdWJDaGFydDIgPSBjMi5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQpOwotICAgICAgICAgICAgLy92YXIgc2VyaWUzID0gc3ViQ2hhcnQyLlNlcmllcy5BZGQoIlM3OlMxNSIsICJRNzpRMTUiKTsKLSAgICAgICAgICAgIC8vc2VyaWUzLkhlYWRlciA9ICJEb3VnaG51dCI7Ci0KLSAgICAgICAgICAgIHZhciBzdWJDaGFydDMgPSBjMi5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkFyZWEpOwotICAgICAgICAgICAgdmFyIHNlcmllNCA9IHN1YkNoYXJ0My5TZXJpZXMuQWRkKCJSNzpSMTUiLCAiUTc6UTE1Iik7Ci0gICAgICAgICAgICBzZXJpZTQuSGVhZGVyID0gIkFyZWEiOwotICAgICAgICAgICAgc3ViQ2hhcnQzLlVzZVNlY29uZGFyeUF4aXMgPSB0cnVlOwotCi0gICAgICAgICAgICB2YXIgc2VyaWU1ID0gc3ViQ2hhcnQuU2VyaWVzLkFkZCgiUjc6UjE1IiwiUTc6UTE1Iik7Ci0gICAgICAgICAgICBzZXJpZTUuSGVhZGVyID0gIkxpbmUgMiI7Ci0KLSAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcY2hhcnRzZXJpZXNuZXcueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2hhcnRXb3Jrc2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzQ2hhcnQgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkQ2hhcnQoImNoYXJ0IiwgZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJkYXRhIik7Ci0gICAgICAgICAgICBBZGRUZXN0U2VyaWUod3MsIHdzQ2hhcnQuQ2hhcnQpOwotICAgICAgICAgICAgd3NDaGFydC5DaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjM7Ci0gICAgICAgICAgICB3c0NoYXJ0LkNoYXJ0LlRpdGxlLlRleHQgPSAiQ2hhcnQgd29ya3NoZWV0IjsKLSAgICAgICAgICAgIHdzQ2hhcnQuQ2hhcnQuU2VyaWVzWzBdLkhlYWRlciA9ICJTZXJpZSI7Ci0gICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNoYXJ0Lnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRDaGFydFdvcmtzaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2hhcnQueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciBjaGFydCA9ICgoRXhjZWxDaGFydHNoZWV0KV9wY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXSkuQ2hhcnQ7Ci0KLSAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY2hhcnQueGxzeCIpKTsKLQotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkV3JpdGVTbW9vdGhDaGFydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXFhkc18yMDE0X1RFU1QueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciBjaGFydCA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EcmF3aW5nc1swXSBhcyBFeGNlbENoYXJ0OwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJCMiJdLlZhbHVlID0gMzM7Ci0gICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNoYXJ0Lnhsc3giKSk7Ci0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdEhlYWRlcmFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRHJhdyIpOwotICAgICAgICAgICAgdmFyIGNoYXJ0ID0gd3MuRHJhd2luZ3MuQWRkQ2hhcnQoIk5ld0NoYXJ0MSIsZUNoYXJ0VHlwZS5BcmVhKSBhcyBFeGNlbENoYXJ0OwotICAgICAgICAgICAgdmFyIHNlcjEgPSBjaGFydC5TZXJpZXMuQWRkKCJBMTpBMiIsICJCMTpCMiIpOwotICAgICAgICAgICAgc2VyMS5IZWFkZXJBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygiQTE6QTIiKTsKLSAgICAgICAgICAgIHNlcjEuSGVhZGVyQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoIkExOkIxIik7Ci0gICAgICAgICAgICBzZXIxLkhlYWRlckFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKCJBMSIpOwotICAgICAgICAgICAgX3Bjay5EaXNwb3NlKCk7Ci0gICAgICAgICAgICBfcGNrID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWxsRHJhd2luZ3NJbnNpZGVNYXJrdXBDb21wYXRpYmlsaXR5KCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHdvcmtib29rc0RpciA9IFBhdGguQ29tYmluZShBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5LCBAIi4uXC4uXHdvcmtib29rcyIpOwotICAgICAgICAgICAgLy8gVGhpcyBpcyBjb2RlcGxleCBpc3N1ZSAxNTAyODogTWFraW5nIGFuIHVucmVsYXRlZCBjaGFuZ2UgdG8gYW4gRXhjZWwgZmlsZSB0aGF0IGNvbnRhaW5zIGRyYXdpbmdzIHRoYXQgQUxMIGV4aXN0Ci0gICAgICAgICAgICAvLyBpbnNpZGUgTWFya3VwQ29tcGF0aWJpbGl0eS9DaG9pY2Ugbm9kZXMgY2F1c2VzIHRoZSBkcmF3aW5ncy54bWwgZmlsZSB0byBiZSBpbmNvcnJlY3RseSBnYXJiYWdlIGNvbGxlY3RlZAotICAgICAgICAgICAgLy8gd2hlbiBhbiB1bnJlbGF0ZWQgY2hhbmdlIGlzIG1hZGUuCi0gICAgICAgICAgICBzdHJpbmcgcGF0aCA9IFBhdGguQ29tYmluZSh3b3JrYm9va3NEaXIsICJBbGxEcmF3aW5nc0luc2lkZU1hcmt1cENvbXBhdGliaWxpdHkueGxzbSIpOwotCi0gICAgICAgICAgICAvLyBMb2FkIGV4YW1wbGUgZG9jdW1lbnQuCi0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8ocGF0aCkpOwotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBkcmF3aW5nIHBhcnQgZXhpc3RzOgotICAgICAgICAgICAgVXJpIHBhcnRVcmkgPSBuZXcgVXJpKCIveGwvZHJhd2luZ3MvZHJhd2luZzEueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKF9wY2suUGFja2FnZS5QYXJ0RXhpc3RzKHBhcnRVcmkpKTsKLQotICAgICAgICAgICAgLy8gVGhlIEV4Y2VsIERyYXdpbmdzIE5hbWVzcGFjZU1hbmFnZXIgZnJvbSBFeGNlbERyYXdpbmcuQ3JlYXRlTlNNOgotICAgICAgICAgICAgTmFtZVRhYmxlIG50ID0gbmV3IE5hbWVUYWJsZSgpOwotICAgICAgICAgICAgdmFyIHhtbE5zbSA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG50KTsKLSAgICAgICAgICAgIHhtbE5zbS5BZGROYW1lc3BhY2UoImEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hRHJhd2luZ3MpOwotICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgieGRyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpOwotICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgiYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICB4bWxOc20uQWRkTmFtZXNwYWNlKCJyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgeG1sTnNtLkFkZE5hbWVzcGFjZSgibWMiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFya3VwQ29tcGF0aWJpbGl0eSk7Ci0KLSAgICAgICAgICAgIFhtbERvY3VtZW50IGRyYXdpbmdzWG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBkcmF3aW5nc1htbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShkcmF3aW5nc1htbCwgX3Bjay5QYWNrYWdlLkdldFBhcnQocGFydFVyaSkuR2V0U3RyZWFtKCkpOwotCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBhcmUgdGhlIGNvcnJlY3QgIyBvZiBkcmF3aW5nczoKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkcmF3aW5nc1htbC5TZWxlY3ROb2RlcygiLy8qW3NlbGY6Onhkcjp0d29DZWxsQW5jaG9yIG9yIHNlbGY6OnhkcjpvbmVDZWxsQW5jaG9yIG9yIHNlbGY6OnhkcjphYnNvbHV0ZUFuY2hvcl0iLCB4bWxOc20pLkNvdW50LCA1KTsKLQotICAgICAgICAgICAgLy8gTWFrZSB1bnJlbGF0ZWQgY2hhbmdlLiAoaW4gdGhpcyBjYXNlIGEgdXNlbGVzcyBhZGRpdGlvbmFsIHdvcmtzaGVldCkKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5ld1dvcmtzaGVldCIpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGl0IG91dC4KLSAgICAgICAgICAgIHN0cmluZyBzYXZlZFBhdGggPSBQYXRoLkNvbWJpbmUod29ya2Jvb2tzRGlyLCAiQWxsRHJhd2luZ3NJbnNpZGVNYXJrdXBDb21wYXRpYmlsaXR5Mi54bHNtIik7Ci0gICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oc2F2ZWRQYXRoKSk7Ci0gICAgICAgICAgICBfcGNrLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBuZXcgc2F2ZWQgZmlsZS4KLSAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhzYXZlZFBhdGgpKTsKLQotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBkcmF3aW5nIHBhcnQgc3RpbGwgZXhpc3RzLgotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShfcGNrLlBhY2thZ2UuUGFydEV4aXN0cyhuZXcgVXJpKCIveGwvZHJhd2luZ3MvZHJhd2luZzEueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSkpKTsKLQotICAgICAgICAgICAgZHJhd2luZ3NYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGRyYXdpbmdzWG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKGRyYXdpbmdzWG1sLCBfcGNrLlBhY2thZ2UuR2V0UGFydChwYXJ0VXJpKS5HZXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGFyZSB0aGUgY29ycmVjdCAjIG9mIGRyYXdpbmdzOgotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRyYXdpbmdzWG1sLlNlbGVjdE5vZGVzKCIvLypbc2VsZjo6eGRyOnR3b0NlbGxBbmNob3Igb3Igc2VsZjo6eGRyOm9uZUNlbGxBbmNob3Igb3Igc2VsZjo6eGRyOmFic29sdXRlQW5jaG9yXSIsIHhtbE5zbSkuQ291bnQsIDUpOwotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG5ldyB3b3Jrc2hlZXQgZXhpc3RzOgotICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChfcGNrLldvcmtib29rLldvcmtzaGVldHNbIk5ld1dvcmtzaGVldCJdKTsKLSAgICAgICAgICAgIC8vIENsZWFudXA6Ci0gICAgICAgICAgICBGaWxlLkRlbGV0ZShzYXZlZFBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LmNzcHJvaiBiL0VQUGx1c1Rlc3QvRVBQbHVzVGVzdC5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzdhYzUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LmNzcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57RTdCQ0VERTAtRUFERC00MzdCLTg2RDUtNDlEMTkyMjE2OTQ4fTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+RVBQbHVzVGVzdDwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPkVQUGx1c1Rlc3Q8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC43LjI8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgotICAgIDxQcm9qZWN0VHlwZUd1aWRzPnszQUMwOTZEMC1BMUMyLUUxMkMtMTM5MC1BODMzNTgwMUZEQUJ9O3tGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9PC9Qcm9qZWN0VHlwZUd1aWRzPgotICAgIDxGaWxlVXBncmFkZUZsYWdzPgotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KLSAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgotICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KLSAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KLSAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgotICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgotICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KLSAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KLSAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+Ci0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICAgIDxTb2x1dGlvbkRpciBDb25kaXRpb249IiQoU29sdXRpb25EaXIpID09ICcnIE9yICQoU29sdXRpb25EaXIpID09ICcqVW5kZWZpbmVkKiciPi4uXDwvU29sdXRpb25EaXI+Ci0gICAgPFJlc3RvcmVQYWNrYWdlcz50cnVlPC9SZXN0b3JlUGFja2FnZXM+Ci0gICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGUgLz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT5FUFBsdXNUZXN0LnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZSA0LjB8QW55Q1BVJyI+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2UgNC4wXDwvT3V0cHV0UGF0aD4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5Vbml0VGVzdEZyYW1ld29yaywgVmVyc2lvbj0xMC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJoaW5vLk1vY2tzLCBWZXJzaW9uPTMuNi4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MGIzMzA1OTAyZGI3MTgzZiwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgotICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgotICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXFJoaW5vTW9ja3MuMy42LjFcbGliXG5ldFxSaGluby5Nb2Nrcy5kbGw8L0hpbnRQYXRoPgotICAgIDwvUmVmZXJlbmNlPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLmNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+Ci0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KLSAgICA8L1JlZmVyZW5jZT4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRlc2lnbiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EcmF3aW5nIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlY3VyaXR5IiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IldpbmRvd3NCYXNlIj4KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjA8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgotICAgIDwvUmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJBZGRyZXNzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNhbGN1bGF0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmRpdGlvbmFsRm9ybWF0dGluZ1xDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cQ3VzdG9tVmFsaWRhdGlvblRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXERhdGFWYWxpZGF0aW9uVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRGVjaW1hRGF0YVZhbGlkYXRpb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxFeGNlbFRpbWVUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xDdXN0b21Gb3JtdWxhVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRGF0ZVRpbWVGb3JtdWxhVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcRGVjaW1hbEZvcm11bGFUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxGb3JtdWxhc1xJbnRlZ2VyRm9ybXVsYVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkRhdGFWYWxpZGF0aW9uXEZvcm11bGFzXExpc3RGb3JtdWxhVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cRm9ybXVsYXNcVGltZUZvcm11bGFUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxJbnRlZ3JhdGlvblRlc3RzXEludGVncmF0aW9uVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cTGlzdERhdGFWYWxpZGF0aW9uVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cUmFuZ2VCYXNlVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGF0YVZhbGlkYXRpb25cVmFsaWRhdGlvbkNvbGxlY3Rpb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEYXRhVmFsaWRhdGlvblxWYWxpZGF0aW9uVGVzdEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRFRTX0ZhaWxpbmdUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJFbmNyeXB0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEFkZHJlc3NUcmFuc2xhdG9yVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcQ2VsbFJlZmVyZW5jZVByb3ZpZGVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcRXhjZWxBZGRyZXNzSW5mb1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFJhbmdlQWRkcmVzc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsVXRpbGl0aWVzXFJhbmdlc1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcVmFsdWVNYXRjaGVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxVdGlsaXRpZXNcV2lsZENhcmRWYWx1ZU1hdGNoZXJUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQXJndW1lbnRQYXJzZXJGYWN0b3J5VGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEFyZ3VtZW50UGFyc2Vyc0ltcGxlbWVudGF0aW9uc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xBcmd1bWVudFBhcnNlcnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcQ291bnRJZnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRGF0YWJhc2VcRXhjZWxEYXRhYmFzZVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxDcml0ZXJpYVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xEYXRhYmFzZVxSb3dNYXRjaGVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXERhdGVUaW1lRnVuY3Rpb25zVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXEV4Y2VsRnVuY3Rpb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcRnVuY3Rpb25Bcmd1bWVudFRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xJbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xMb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXE1hdGhGdW5jdGlvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcTnVtYmVyRnVuY3Rpb25zVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFJlZkFuZExvb2t1cFxMb29rdXBOYXZpZ2F0b3JUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXFJlZkFuZExvb2t1cFRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXEZ1bmN0aW9uc1xSZWZBbmRMb29rdXBcSW5kZXhUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcUmVmQW5kTG9va3VwXExvb2t1cE5hdmlnYXRvckZhY3RvcnlUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcU3VidG90YWxUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcU3VtSWZzVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhjZWxcRnVuY3Rpb25zXFRleHRGdW5jdGlvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeGNlbFxGdW5jdGlvbnNcVGltZVN0cmluZ1BhcnNlclRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4Y2VsXE9wZXJhdG9yc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFbnVtZXJhYmxlRXhwcmVzc2lvblRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeGNlbEFkZHJlc3NFeHByZXNzaW9uVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25Db21waWxlclRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEV4cHJlc3Npb25HcmFwaFxFeHByZXNzaW9uQ29udmVydGVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25GYWN0b3J5VGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcRXhwcmVzc2lvbkdyYXBoXEV4cHJlc3Npb25HcmFwaEJ1aWxkZXJUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcSW50ZWdlckV4cHJlc3Npb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcRGVjaW1hbEV4cHJlc3Npb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xFeHByZXNzaW9uR3JhcGhcQm9vbGVhbkV4cHJlc3Npb25UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xGb3JtdWxhUGFyc2VyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCYXNpY0NhbGNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcRGF0ZUFuZFRpbWVGdW5jdGlvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcRXhjZWxSYW5nZXNcTWF0aEV4Y2VsUmFuZ2VUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcRXhjZWxSYW5nZXNcVGV4dEV4Y2VsUmFuZ2VUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcTG9naWNhbEZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQnVpbHRJbkZ1bmN0aW9uc1xNYXRoRnVuY3Rpb25zVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcSW50ZWdyYXRpb25UZXN0c1xCdWlsdEluRnVuY3Rpb25zXFJlZkFuZExvb2t1cFRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQnVpbHRJbkZ1bmN0aW9uc1xTdHJpbmdGdW5jdGlvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcU3VidG90YWxUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEJ1aWx0SW5GdW5jdGlvbnNcVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQnVpbHRJbkZ1bmN0aW9uc1xEYXRhYmFzZVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcRXJyb3JIYW5kbGluZ1xTdW1UZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEV4Y2VsRGF0YVByb3ZpZGVyVGVzdHNcRXhjZWxEYXRhUHJvdmlkZXJJbnRlZ3JhdGlvblRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcRm9ybXVsYVBhcnNlclRlc3RCYXNlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcUHJlY2VkZW5jZVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXEludGVncmF0aW9uVGVzdHNcQ2FsY0V4dGVuc2lvbnNUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXEVycm9ySGFuZGxpbmdcRm9ybXVsYUVycm9ySGFuZGxpbmdUZXN0QmFzZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xJbnRlZ3JhdGlvblRlc3RzXE9wZXJhdG9yc1Rlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xOZWdhdGlvblRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXExleGljYWxBbmFseXNpc1xTb3VyY2VDb2RlVG9rZW5pemVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFN5bnRhY3RpY0FuYWx5emVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcTGV4aWNhbEFuYWx5c2lzXFRva2VuRmFjdG9yeVRlc3RzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkZvcm11bGFQYXJzaW5nXE5hbWVWYWx1ZVByb3ZpZGVyVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRm9ybXVsYVBhcnNpbmdcUGFyc2luZ0NvbnRleHRUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nU2NvcGVzVGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xQYXJzaW5nU2NvcGVUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGb3JtdWxhUGFyc2luZ1xUZXN0SGVscGVyc1xGdW5jdGlvbnNIZWxwZXIuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRHJhd2luZ1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xSZXNvdXJjZXMuRGVzaWduZXIuY3MiPgotICAgICAgPEF1dG9HZW4+VHJ1ZTwvQXV0b0dlbj4KLSAgICAgIDxEZXNpZ25UaW1lPlRydWU8L0Rlc2lnblRpbWU+Ci0gICAgICA8RGVwZW5kZW50VXBvbj5SZXNvdXJjZXMucmVzeDwvRGVwZW5kZW50VXBvbj4KLSAgICA8L0NvbXBpbGU+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVhZFRlbXBsYXRlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RCYXNlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3REVE8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ2VsbFN0b3JlVGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJJc3N1ZXMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iTG9hZEZyb21Db2xsZWN0aW9uVGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tbWVudHNUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlV0aWxzXEFkZHJlc3NVdGlsaXR5VGVzdHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVXRpbHNcR3VhcmRpbmdUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJVdGlsc1xTcVJlZlV0aWxpdHlUZXN0cy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJWQkEuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV29ya1NoZWV0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldvcmtzaGVldHNUZXN0cy5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPE5vbmUgSW5jbHVkZT0iRVBQbHVzVGVzdC5zbmsiIC8+Ci0gICAgPE5vbmUgSW5jbHVkZT0icGFja2FnZXMuY29uZmlnIiAvPgotICAgIDxOb25lIEluY2x1ZGU9IlRlc3RTdGFydC5vcmRlcmVkdGVzdCI+Ci0gICAgICA8Q29weVRvT3V0cHV0RGlyZWN0b3J5PkFsd2F5czwvQ29weVRvT3V0cHV0RGlyZWN0b3J5PgotICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+Ci0gICAgPC9Ob25lPgotICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9IlJlc291cmNlc1xWZWN0b3IgRHJhd2luZy53bWYiIC8+Ci0gICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iUmVzb3VyY2VzXFZlY3RvciBEcmF3aW5nMi53bWYiIC8+Ci0gICAgPE5vbmUgSW5jbHVkZT0iV29ya2Jvb2tzXEZvcm11bGFUZXN0Lnhsc3giPgotICAgICAgPENvcHlUb091dHB1dERpcmVjdG9yeT5QcmVzZXJ2ZU5ld2VzdDwvQ29weVRvT3V0cHV0RGlyZWN0b3J5PgotICAgIDwvTm9uZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iUHJvcGVydGllc1xSZXNvdXJjZXMucmVzeCI+Ci0gICAgICA8R2VuZXJhdG9yPlJlc1hGaWxlQ29kZUdlbmVyYXRvcjwvR2VuZXJhdG9yPgotICAgICAgPExhc3RHZW5PdXRwdXQ+UmVzb3VyY2VzLkRlc2lnbmVyLmNzPC9MYXN0R2VuT3V0cHV0PgotICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+Ci0gICAgPC9FbWJlZGRlZFJlc291cmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT5NaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNCAlMjh4ODYgYW5kIHg2NCUyOTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cRVBQbHVzXEVQUGx1cy5jc3Byb2oiPgotICAgICAgPFByb2plY3Q+ezdiMjg4MDI2LTU1MDItNGEzOS1iZjQxLTc3ZTA4NmYzZTRhM308L1Byb2plY3Q+Ci0gICAgICA8TmFtZT5FUFBsdXM8L05hbWU+Ci0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSJSZXNvdXJjZXNcQml0bWFwSW1hZ2UuZ2lmIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29udGVudCBJbmNsdWRlPSJSZXNvdXJjZXNcVGVzdDEuanBnIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChTb2x1dGlvbkRpcilcLm51Z2V0XG51Z2V0LnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LnNuayBiL0VQUGx1c1Rlc3QvRVBQbHVzVGVzdC5zbmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWYxMTUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9FUFBsdXNUZXN0LnNuaworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRW5jcnlwdC5jcyBiL0VQUGx1c1Rlc3QvRW5jcnlwdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1MjIwYy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0VuY3J5cHQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAot77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEVuY3J5cHQgOiBUZXN0QmFzZQotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRXcml0ZUVuY3J5cHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiVGVzdFxEcmF3aW5nLnhsc3giKSwgdHJ1ZSkpICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLkVuY3J5cHRpb24uUGFzc3dvcmQgPSAiRVBQbHVzIjsKLSAgICAgICAgICAgICAgICBwY2suRW5jcnlwdGlvbi5BbGdvcml0aG0gPSBFbmNyeXB0aW9uQWxnb3JpdGhtLkFFUzE5MjsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Qcm90ZWN0aW9uLkxvY2tTdHJ1Y3R1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Qcm90ZWN0aW9uLkxvY2tXaW5kb3dzID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiVGVzdFxEcmF3aW5nRW5jci54bHN4IikpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIEAiXERyYXdpbmdFbmNyLnhsc3giKSwgdHJ1ZSwgIkVQUGx1cyIpKSAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBjay5FbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oX3dvcmtzaGVldFBhdGggKyBAIlxEcmF3aW5nTm90RW5jci54bHN4IikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlU3RyZWFtIGZzID0gbmV3IEZpbGVTdHJlYW0oX3dvcmtzaGVldFBhdGggKyBAIlxEcmF3aW5nRW5jci54bHN4IiwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZzLCAiRVBQbHVzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLkVuY3J5cHRpb24uSXNFbmNyeXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIEAiRHJhd2luZ05vdEVuY3IueGxzeCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBbSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUVuY3J5cHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIC8vTG9hZCB0aGUgc2hlZXQgd2l0aCBvbmUgc3RyaW5nIGNvbHVtbiwgb25lIGRhdGUgY29sdW1uIGFuZCBhIGZldyByYW5kb20gbnVtYmVycy4KLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZpcnN0IGxpbmUgdGVzdCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICIxOyAxIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzIsIDFdLlZhbHVlID0gIjI7IDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiMTsgMiI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAyXS5WYWx1ZSA9ICIyOyAyIjsKLQotICAgICAgICAgICAgd3MuUm93KDEpLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5Db2x1bW4oMSkuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy9wYWNrYWdlLkVuY3J5cHRpb24uQWxnb3JpdGhtID0gRW5jcnlwdGlvbkFsZ29yaXRobS5BRVMyNTY7Ci0gICAgICAgICAgICAvL3BhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZW5jclRlc3QueGxzeCIpLCAiQUJ4c3cyM2VkYyIpOwotICAgICAgICAgICAgcGFja2FnZS5FbmNyeXB0aW9uLlBhc3N3b3JkID0gInRlc3QiOwotICAgICAgICAgICAgcGFja2FnZS5FbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZW5jclRlc3QueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVQcm90ZWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcd29ya2Jvb2twcm90Mi54bHN4IiksICIiKTsKLSAgICAgICAgICAgIC8vTG9hZCB0aGUgc2hlZXQgd2l0aCBvbmUgc3RyaW5nIGNvbHVtbiwgb25lIGRhdGUgY29sdW1uIGFuZCBhIGZldyByYW5kb20gbnVtYmVycy4KLSAgICAgICAgICAgIC8vcGFja2FnZS5Xb3JrYm9vay5Qcm90ZWN0aW9uLkxvY2tXaW5kb3dzID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vcGFja2FnZS5FbmNyeXB0aW9uLklzRW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgidCIpOwotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm90ZWN0aW9uLkxvY2tTdHJ1Y3R1cmUgPSB0cnVlOwotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WaWV3LkxlZnQgPSA1ODU7Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlZpZXcuVG9wID0gMTUwOwotCi0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlZpZXcuV2lkdGggPSAxNzMxMDsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmlldy5IZWlnaHQgPSAzODA1NTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZpcnN0IGxpbmUgdGVzdCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICIxOyAxIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzIsIDFdLlZhbHVlID0gIjI7IDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiMTsgMiI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAyXS5WYWx1ZSA9ICIyOyAyIjsKLQotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx3b3JrYm9va3Byb3QyLnhsc3giKSk7Ci0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgRGVjcnlwVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGVuY3IueGxzeCIpLCAidGVzdCIpOwotCi0gICAgICAgICAgICB2YXIgbiA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5OYW1lOwotICAgICAgICAgICAgcC5FbmNyeXB0aW9uLlBhc3N3b3JkID0gbnVsbDsKLSAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcZW5jck5ldy54bHN4IikpOwotICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgRW5jcnlwVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxlbmNyd3JpdGUueGxzeCIpOwotICAgICAgICAgICAgaWYgKGYuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGYuRGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoZik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHAuV29ya2Jvb2suUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiIik7Ci0gICAgICAgICAgICBwLldvcmtib29rLlByb3RlY3Rpb24uTG9ja1N0cnVjdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICBwLkVuY3J5cHRpb24uVmVyc2lvbiA9IEVuY3J5cHRpb25WZXJzaW9uLkFnaWxlOwotCi0gICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTaGVldDEiKTsKLSAgICAgICAgICAgIGZvciAoaW50IHIgPSAxOyByIDwgMTAwMDsgcisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkNlbGxzW3IsIDFdLlZhbHVlID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAuU2F2ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9FeGNlbENlbGxCYXNlVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRXhjZWxDZWxsQmFzZVRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMGUyNDIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9FeGNlbENlbGxCYXNlVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENlbGxCYXNlVGVzdAotICAgIHsKLSAgICAgICAgI3JlZ2lvbiBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyBUZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXNPblRoZVNhbWVTaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCJDMyIsIDMsIDMsIDIsIDIsICJzaGVldCIsICJzaGVldCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGNiIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXNJZ25vcmVzSW5jb3JyZWN0U2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygiQzMiLCAzLCAzLCAyLCAyLCAic2hlZXQiLCAib3RoZXIgc2hlZXQiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQzMiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzRnVsbHlRdWFsaWZpZWRSZWZlcmVuY2VPblRoZVNhbWVTaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCInc2hlZXQgbmFtZSBoZXJlJyFDMyIsIDMsIDMsIDIsIDIsICJzaGVldCBuYW1lIGhlcmUiLCAic2hlZXQgbmFtZSBoZXJlIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIidzaGVldCBuYW1lIGhlcmUnIUY2IiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlc0Z1bGx5UXVhbGlmaWVkQ3Jvc3NTaGVldFJlZmVyZW5jZUFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoIlNVTSgnc2hlZXQgbmFtZSBoZXJlJyFCMjpENCkiLCAzLCAzLCAzLCAzLCAiY3Jvc3Mgc2hlZXQiLCAic2hlZXQgbmFtZSBoZXJlIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlNVTSgnc2hlZXQgbmFtZSBoZXJlJyFCMjpHNykiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzRnVsbHlRdWFsaWZpZWRSZWZlcmVuY2VPbkFEaWZmZXJlbnRTaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKCIndXBkYXRlZCBzaGVldCchQzMiLCAzLCAzLCAyLCAyLCAiYm9yaW5nIHNoZWV0IiwgInVwZGF0ZWQgc2hlZXQiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiJ3VwZGF0ZWQgc2hlZXQnIUY2IiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlc1JlZmVyZW5jaW5nQURpZmZlcmVudFNoZWV0SXNOb3RVcGRhdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoIidib3Jpbmcgc2hlZXQnIUMzIiwgMywgMywgMiwgMiwgImJvcmluZyBzaGVldCIsICJ1cGRhdGVkIHNoZWV0Iik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIidib3Jpbmcgc2hlZXQnIUMzIiwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBVcGRhdGVDcm9zc1NoZWV0UmVmZXJlbmNlTmFtZXMgVGVzdHMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgdmFyIHJlc3VsdCA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlcygiNSsnT2xkU2hlZXQnISRHMysnU29tZSBPdGhlciBTaGVldCchQzMrU1VNKDEsMiwzKSIsICJPbGRTaGVldCIsICJOZXdTaGVldCIpOwotICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNSsnTmV3U2hlZXQnISRHMysnU29tZSBPdGhlciBTaGVldCchQzMrU1VNKDEsMiwzKSIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlc051bGxPbGRTaGVldFRocm93c0V4Y2VwdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXMoImZvcm11bGEiLCBudWxsLCAic2hlZXQyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlc0VtcHR5T2xkU2hlZXRUaHJvd3NFeGNlcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhU2hlZXRSZWZlcmVuY2VzKCJmb3JtdWxhIiwgc3RyaW5nLkVtcHR5LCAic2hlZXQyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlc051bGxOZXdTaGVldFRocm93c0V4Y2VwdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFTaGVldFJlZmVyZW5jZXMoImZvcm11bGEiLCAic2hlZXQxIiwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlRm9ybXVsYVNoZWV0UmVmZXJlbmNlc0VtcHR5TmV3U2hlZXRUaHJvd3NFeGNlcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhU2hlZXRSZWZlcmVuY2VzKCJmb3JtdWxhIiwgInNoZWV0MSIsIHN0cmluZy5FbXB0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0V4Y2VsUmFuZ2VCYXNlVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRXhjZWxSYW5nZUJhc2VUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzUyYTZmLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRXhjZWxSYW5nZUJhc2VUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAot77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEV4Y2VsUmFuZ2VCYXNlVGVzdCA6IFRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29weUNvcGllc0NvbW1lbnRzRnJvbVNpbmdsZUNlbGxSYW5nZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbml0QmFzZSgpOwotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3czEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbW1lbnRDb3B5aW5nIik7Ci0gICAgICAgICAgICB2YXIgc291cmNlRXhjZWxSYW5nZSA9IHdzMS5DZWxsc1szLCAzXTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwoc291cmNlRXhjZWxSYW5nZS5Db21tZW50KTsKLSAgICAgICAgICAgIHNvdXJjZUV4Y2VsUmFuZ2UuQWRkQ29tbWVudCgiVGVzdGluZyBjb21tZW50IDEiLCAidGVzdDEiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlLkNvbW1lbnQuQXV0aG9yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDEiLCBzb3VyY2VFeGNlbFJhbmdlLkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlID0gd3MxLkNlbGxzWzUsIDVdOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkZXN0aW5hdGlvbkV4Y2VsUmFuZ2UuQ29tbWVudCk7Ci0gICAgICAgICAgICBzb3VyY2VFeGNlbFJhbmdlLkNvcHkoZGVzdGluYXRpb25FeGNlbFJhbmdlKTsKLSAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgb3JpZ2luYWwgY29tbWVudCBpcyBpbnRhY3QuCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZS5Db21tZW50LkF1dGhvcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAxIiwgc291cmNlRXhjZWxSYW5nZS5Db21tZW50LlRleHQpOwotICAgICAgICAgICAgLy8gQXNzZXJ0IHRoZSBjb21tZW50IHdhcyBjb3BpZWQuCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlLkNvbW1lbnQuQXV0aG9yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDEiLCBkZXN0aW5hdGlvbkV4Y2VsUmFuZ2UuQ29tbWVudC5UZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5Q29waWVzQ29tbWVudHNGcm9tTXVsdGlDZWxsUmFuZ2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgSW5pdEJhc2UoKTsKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MxID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb21tZW50Q29weWluZyIpOwotICAgICAgICAgICAgdmFyIHNvdXJjZUV4Y2VsUmFuZ2VDMyA9IHdzMS5DZWxsc1szLCAzXTsKLSAgICAgICAgICAgIHZhciBzb3VyY2VFeGNlbFJhbmdlRDMgPSB3czEuQ2VsbHNbMywgNF07Ci0gICAgICAgICAgICB2YXIgc291cmNlRXhjZWxSYW5nZUUzID0gd3MxLkNlbGxzWzMsIDVdOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChzb3VyY2VFeGNlbFJhbmdlQzMuQ29tbWVudCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHNvdXJjZUV4Y2VsUmFuZ2VEMy5Db21tZW50KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwoc291cmNlRXhjZWxSYW5nZUUzLkNvbW1lbnQpOwotICAgICAgICAgICAgc291cmNlRXhjZWxSYW5nZUMzLkFkZENvbW1lbnQoIlRlc3RpbmcgY29tbWVudCAxIiwgInRlc3QxIik7Ci0gICAgICAgICAgICBzb3VyY2VFeGNlbFJhbmdlRDMuQWRkQ29tbWVudCgiVGVzdGluZyBjb21tZW50IDIiLCAidGVzdDEiKTsKLSAgICAgICAgICAgIHNvdXJjZUV4Y2VsUmFuZ2VFMy5BZGRDb21tZW50KCJUZXN0aW5nIGNvbW1lbnQgMyIsICJ0ZXN0MSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXN0MSIsIHNvdXJjZUV4Y2VsUmFuZ2VDMy5Db21tZW50LkF1dGhvcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAxIiwgc291cmNlRXhjZWxSYW5nZUMzLkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZUQzLkNvbW1lbnQuQXV0aG9yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDIiLCBzb3VyY2VFeGNlbFJhbmdlRDMuQ29tbWVudC5UZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlRTMuQ29tbWVudC5BdXRob3IpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMyIsIHNvdXJjZUV4Y2VsUmFuZ2VFMy5Db21tZW50LlRleHQpOwotICAgICAgICAgICAgLy8gQ29weSB0aGUgZnVsbCByb3cgdG8gY2FwdHVyZSBlYWNoIGNlbGwgYXQgb25jZS4KLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwod3MxLkNlbGxzWzUsIDNdLkNvbW1lbnQpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbCh3czEuQ2VsbHNbNSwgNF0uQ29tbWVudCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHdzMS5DZWxsc1s1LCA1XS5Db21tZW50KTsKLSAgICAgICAgICAgIHdzMS5DZWxsc1siMzozIl0uQ29weSh3czEuQ2VsbHNbIjU6NSJdKTsKLSAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgb3JpZ2luYWwgY29tbWVudHMgYXJlIGludGFjdC4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgidGVzdDEiLCBzb3VyY2VFeGNlbFJhbmdlQzMuQ29tbWVudC5BdXRob3IpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMSIsIHNvdXJjZUV4Y2VsUmFuZ2VDMy5Db21tZW50LlRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZXN0MSIsIHNvdXJjZUV4Y2VsUmFuZ2VEMy5Db21tZW50LkF1dGhvcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRlc3RpbmcgY29tbWVudCAyIiwgc291cmNlRXhjZWxSYW5nZUQzLkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgc291cmNlRXhjZWxSYW5nZUUzLkNvbW1lbnQuQXV0aG9yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGVzdGluZyBjb21tZW50IDMiLCBzb3VyY2VFeGNlbFJhbmdlRTMuQ29tbWVudC5UZXh0KTsKLSAgICAgICAgICAgIC8vIEFzc2VydCB0aGUgY29tbWVudHMgd2VyZSBjb3BpZWQuCi0gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlQzUgPSB3czEuQ2VsbHNbNSwgM107Ci0gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlRDUgPSB3czEuQ2VsbHNbNSwgNF07Ci0gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25FeGNlbFJhbmdlRTUgPSB3czEuQ2VsbHNbNSwgNV07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlQzUuQ29tbWVudC5BdXRob3IpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMSIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUM1LkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlRDUuQ29tbWVudC5BdXRob3IpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMiIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUQ1LkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3QxIiwgZGVzdGluYXRpb25FeGNlbFJhbmdlRTUuQ29tbWVudC5BdXRob3IpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0aW5nIGNvbW1lbnQgMyIsIGRlc3RpbmF0aW9uRXhjZWxSYW5nZUU1LkNvbW1lbnQuVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dGluZ0FkZHJlc3NIYW5kbGVzTXVsdGlBZGRyZXNzZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOwotICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcGFja2FnZS5Xb3JrYm9vay5OYW1lcy5BZGQoIlRlc3QiLCB3b3Jrc2hlZXQuQ2VsbHNbMywgM10pOwotICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJTaGVldDEhQzMiOwotICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJTaGVldDEhRDMiOwotICAgICAgICAgICAgICAgIEFzc2VydC5Jc051bGwobmFtZS5BZGRyZXNzZXMpOwotICAgICAgICAgICAgICAgIG5hbWUuQWRkcmVzcyA9ICJDMzpEMyxFMzpGMyI7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChuYW1lLkFkZHJlc3Nlcyk7Ci0gICAgICAgICAgICAgICAgbmFtZS5BZGRyZXNzID0gIlNoZWV0MSFDMyI7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChuYW1lLkFkZHJlc3Nlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0V4Y2VsU3R5bGVUZXN0LmNzIGIvRVBQbHVzVGVzdC9FeGNlbFN0eWxlVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwZTE1Zi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0V4Y2VsU3R5bGVUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAot77u/dXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEV4Y2VsU3R5bGVUZXN0Ci0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUXVvdGVQcmVmaXhTdHlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJRdW90ZVByZWZpeFRlc3QiKTsKLSAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHdzLkNlbGxzWyJCMiJdOwotICAgICAgICAgICAgICAgIGNlbGwuU3R5bGUuUXVvdGVQcmVmaXggPSB0cnVlOwotICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY2VsbC5TdHlsZS5RdW90ZVByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICBwLldvcmtib29rLlN0eWxlcy5VcGRhdGVYbWwoKTsKLSAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBwLldvcmtib29rLlN0eWxlc1htbC5TZWxlY3ROb2RlcygiLy9kOmNlbGxYZnMvZDp4ZiIsIHAuV29ya2Jvb2suTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHF1b3RlUHJlZml4IGF0dHJpYnV0ZSBpcyBub3QgcGFydCBvZiB0aGUgZGVmYXVsdCBzdHlsZSwKLSAgICAgICAgICAgICAgICAvLyBhIG5ldyBvbmUgc2hvdWxkIGJlIGNyZWF0ZWQgYW5kIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKDAsIGNlbGwuU3R5bGVJRCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChub2Rlc1swXS5BdHRyaWJ1dGVzWyJxdW90ZVByZWZpeCJdKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEiLCBub2Rlc1tjZWxsLlN0eWxlSURdLkF0dHJpYnV0ZXNbInF1b3RlUHJlZml4Il0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJGYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlckZhY3RvcnlUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2NmE4NS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlckZhY3RvcnlUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQXJndW1lbnRQYXJzZXJGYWN0b3J5VGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgQXJndW1lbnRQYXJzZXJGYWN0b3J5IF9wYXJzZXJGYWN0b3J5OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFyc2VyRmFjdG9yeSA9IG5ldyBBcmd1bWVudFBhcnNlckZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5JbnRBcmd1bWVudFBhcnNlcldoZW5EYXRhVHlwZUlzSW50ZWdlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBfcGFyc2VyRmFjdG9yeS5DcmVhdGVBcmd1bWVudFBhcnNlcihEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHBhcnNlciwgdHlwZW9mKEludEFyZ3VtZW50UGFyc2VyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuQm9vbEFyZ3VtZW50UGFyc2VyV2hlbkRhdGFUeXBlSXNCb29sZWFuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhcnNlciA9IF9wYXJzZXJGYWN0b3J5LkNyZWF0ZUFyZ3VtZW50UGFyc2VyKERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocGFyc2VyLCB0eXBlb2YoQm9vbEFyZ3VtZW50UGFyc2VyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuRG91YmxlQXJndW1lbnRQYXJzZXJXaGVuRGF0YVR5cGVJc0RlY2lhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBfcGFyc2VyRmFjdG9yeS5DcmVhdGVBcmd1bWVudFBhcnNlcihEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHBhcnNlciwgdHlwZW9mKERvdWJsZUFyZ3VtZW50UGFyc2VyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlcnNJbXBsZW1lbnRhdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vyc0ltcGxlbWVudGF0aW9uc1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E0MjM3Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vyc0ltcGxlbWVudGF0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2Vyc0ltcGxlbWVudGF0aW9uc1Rlc3RzCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnRQYXJzZXJTaG91bGRUaHJvd0lmQXJndW1lbnRJc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEludEFyZ3VtZW50UGFyc2VyKCk7Ci0gICAgICAgICAgICBwYXJzZXIuUGFyc2UobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSW50UGFyc2VyU2hvdWxkQ29udmVydFRvQW5JbnRlZ2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBJbnRBcmd1bWVudFBhcnNlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZSgzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEludFBhcnNlclNob3VsZENvbnZlcnRBRG91YmxlVG9BbkludGVnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEludEFyZ3VtZW50UGFyc2VyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKDNkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEludFBhcnNlclNob3VsZENvbnZlcnRBU3RyaW5nVmFsdWVUb0FuSW50ZWdlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgSW50QXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjMiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJvb2xQYXJzZXJTaG91bGRDb252ZXJ0TnVsbFRvRmFsc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZShudWxsKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQm9vbFBhcnNlclNob3VsZENvbnZlcnRTdHJpbmdWYWx1ZVRydWVUb0Jvb2xWYWx1ZVRydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZSgidHJ1ZSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJvb2xQYXJzZXJTaG91bGRDb252ZXJ0MFRvRmFsc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEJvb2xBcmd1bWVudFBhcnNlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChib29sKXBhcnNlci5QYXJzZSgwKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQm9vbFBhcnNlclNob3VsZENvbnZlcnQxVG9UcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBCb29sQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSAoYm9vbClwYXJzZXIuUGFyc2UoMCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERvdWJsZVBhcnNlclNob3VsZENvbnZlcnREb3VibGVUb0RvdWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoM2QpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERvdWJsZVBhcnNlclNob3VsZENvbnZlcnRJbnRUb0RvdWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoMyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBEb3VibGVQYXJzZXJTaG91bGRUaHJvd0lmQXJndW1lbnRJc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERvdWJsZUFyZ3VtZW50UGFyc2VyKCk7Ci0gICAgICAgICAgICBwYXJzZXIuUGFyc2UobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRG91YmxlUGFyc2VyQ29udmVydFN0cmluZ1RvRG91YmxlV2l0aERvdFNlcGFyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjMuMyIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vyc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2NiMjguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2Vyc1Rlc3RzCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuU2FtZUluc3RhbmNlT2ZJbnRQYXJzZXJXaGVuQ2FsbGVkVHdpY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VycyA9IG5ldyBBcmd1bWVudFBhcnNlcnMoKTsKLSAgICAgICAgICAgIHZhciBwYXJzZXIxID0gcGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyMiA9IHBhcnNlcnMuR2V0UGFyc2VyKERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBhcnNlcjEsIHBhcnNlcjIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ291bnRJZnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvdW50SWZzVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTZmMmEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ291bnRJZnNUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi3vu791c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDb3VudElmc1Rlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0c2hlZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVTaW5nbGVOdW1lcmljQ3JpdGVyaWEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRJRlMoQTE6QTMsIDEpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZVNpbmdsZVJhbmdlQ3JpdGVyaWEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBMywgQjEpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZVNpbmdsZU51bWVyaWNXaWxkY2FyZENyaXRlcmlhKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkEzLCBcIjwzXCIpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZVNpbmdsZVN0cmluZ0NyaXRlcmlhKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkEzLCBcImRlZlwiKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVTaW5nbGVTdHJpbmdXaWxkY2FyZENyaXRlcmlhKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkEzLCBcImQqZlwiKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVOdWxsUmFuZ2VDcml0ZXJpYSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVElGUyhBMTpBMywgQjEpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZU11bHRpcGxlUmFuZ2VzQW5kQ3JpdGVyaWFzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJDMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAyMDA7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJDMyJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkM0Il0uVmFsdWUgPSAyOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIkNPVU5USUZTKEExOkE0LCBcImQqZlwiLCBCMTpCNDsgMjsgQzE6QzQ7IDIwMCkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0RXJyb3JWYWx1ZUlmTnVtYmVyT2ZDZWxsc0luUmFuZ2VzRGlmZmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiQ09VTlRJRlMoQTE6QTQsIFwiZCpmXCIsIEIxOkIzOyAyKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpLCBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0NyaXRlcmlhVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Dcml0ZXJpYVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBjNTc4Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0NyaXRlcmlhVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQ3JpdGVyaWFUZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyaXRlcmlhU2hvdWxkUmVhZEZpZWxkc0FuZFZhbHVlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiQ3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gIkNyaXQyIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOwotCi0gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKHBhY2thZ2UpOwotCi0gICAgICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShwcm92aWRlciwgIkExOkIyIik7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgY3JpdGVyaWEuSXRlbXMuQ291bnQpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY3JpdDEiLCBjcml0ZXJpYS5JdGVtcy5LZXlzLkZpcnN0KCkuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJjcml0MiIsIGNyaXRlcmlhLkl0ZW1zLktleXMuTGFzdCgpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuRmlyc3QoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGNyaXRlcmlhLkl0ZW1zLlZhbHVlcy5MYXN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyaXRlcmlhU2hvdWxkSWdub3JlRW1wdHlGaWVsZHMxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJDcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiQ3JpdDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKLQotICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihwYWNrYWdlKTsKLQotICAgICAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEocHJvdmlkZXIsICJBMTpCMiIpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNyaXRlcmlhLkl0ZW1zLkNvdW50KTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNyaXQxIiwgY3JpdGVyaWEuSXRlbXMuS2V5cy5GaXJzdCgpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuTGFzdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcml0ZXJpYVNob3VsZElnbm9yZUVtcHR5RmllbGRzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiQ3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKLQotICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihwYWNrYWdlKTsKLQotICAgICAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEocHJvdmlkZXIsICJBMTpCMiIpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNyaXRlcmlhLkl0ZW1zLkNvdW50KTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNyaXQxIiwgY3JpdGVyaWEuSXRlbXMuS2V5cy5GaXJzdCgpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBjcml0ZXJpYS5JdGVtcy5WYWx1ZXMuTGFzdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTcwOTM0Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFiYXNlVGVzdHMKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRhYmFzZVNob3VsZFJlYWRGaWVsZHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlID0gR2V0RGF0YWJhc2UocGFja2FnZSk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgZGF0YWJhc2UuRmllbGRzLkNvdW50KCksICJjb3VudCB3YXMgbm90IDIiKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNvbDEiLCBkYXRhYmFzZS5GaWVsZHMuRmlyc3QoKS5GaWVsZE5hbWUsICJmaXJzdCBmaWVsZG5hbWUgd2FzIG5vdCAnY29sMSciKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNvbDIiLCBkYXRhYmFzZS5GaWVsZHMuTGFzdCgpLkZpZWxkTmFtZSwgImxhc3QgZmllbGRuYW1lIHdhcyBub3QgJ2NvbDEyJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEhhc01vcmVSb3dzU2hvdWxkQmVUcnVlV2hlbkluaXRpYWxpemVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZSA9IEdldERhdGFiYXNlKHBhY2thZ2UpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShkYXRhYmFzZS5IYXNNb3JlUm93cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBIYXNNb3JlUm93c1Nob3VsZEJlRmFsc2VXaGVuTGFzdFJvd0lzUmVhZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2UgPSBHZXREYXRhYmFzZShwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBkYXRhYmFzZS5SZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShkYXRhYmFzZS5IYXNNb3JlUm93cyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRhYmFzZVNob3VsZFJlYWRGaWVsZHNJblJvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2UgPSBHZXREYXRhYmFzZShwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICB2YXIgcm93ID0gZGF0YWJhc2UuUmVhZCgpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJvd1siY29sMSJdKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcm93WyJjb2wyIl0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFiYXNlIEdldERhdGFiYXNlKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIocGFja2FnZSk7Ci0gICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjb2wxIjsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNvbDIiOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOwotICAgICAgICAgICAgdmFyIGRhdGFiYXNlID0gbmV3IEV4Y2VsRGF0YWJhc2UocHJvdmlkZXIsICJBMTpCMiIpOwotICAgICAgICAgICAgcmV0dXJuIGRhdGFiYXNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvUm93TWF0Y2hlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvUm93TWF0Y2hlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmNzEwLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL1Jvd01hdGNoZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFJvd01hdGNoZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFiYXNlQ3JpdGVyaWEgR2V0Q3JpdGVyaWEoRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PiBpdGVtcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YWJhc2VDcml0ZXJpYT4ocHJvdmlkZXIsIHN0cmluZy5FbXB0eSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNyaXRlcmlhLlN0dWIoeCA9PiB4Lkl0ZW1zKS5SZXR1cm4oaXRlbXMpOwotICAgICAgICAgICAgcmV0dXJuIGNyaXRlcmlhOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkUmV0dXJuVHJ1ZUlmQ3JpdGVyaWFzTWF0Y2goKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBFeGNlbERhdGFiYXNlUm93KCk7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MSJdID0gMTsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQyIl0gPSAyOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDMiXSA9IDM7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsKLSAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MSIpXSA9IDE7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDMiKV0gPSAzOwotCi0gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSb3dNYXRjaGVyKCk7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEdldENyaXRlcmlhKGNyaXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1hdGNoZXIuSXNNYXRjaChkYXRhLCBjcml0ZXJpYSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRSZXR1cm5GYWxzZUlmQ3JpdGVyaWFzRG9lc05vdE1hdGNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9IDE7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MiJdID0gMjsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQzIl0gPSAzOwotCi0gICAgICAgICAgICB2YXIgY3JpdCA9IG5ldyBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+KCk7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDEiKV0gPSAxOwotICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gNDsKLQotICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOwotCi0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobWF0Y2hlci5Jc01hdGNoKGRhdGEsIGNyaXRlcmlhKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZE1hdGNoU3RyaW5nczEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBFeGNlbERhdGFiYXNlUm93KCk7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MSJdID0gIjEiOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDIiXSA9IDI7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MyJdID0gMzsKLQotICAgICAgICAgICAgdmFyIGNyaXQgPSBuZXcgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PigpOwotICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQxIildID0gIjEiOwotICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQzIildID0gMzsKLQotICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUm93TWF0Y2hlcigpOwotCi0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBHZXRDcml0ZXJpYShjcml0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkTWF0Y2hTdHJpbmdzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRhID0gbmV3IEV4Y2VsRGF0YWJhc2VSb3coKTsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQxIl0gPSAiMiI7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MiJdID0gMjsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQzIl0gPSAzOwotCi0gICAgICAgICAgICB2YXIgY3JpdCA9IG5ldyBEaWN0aW9uYXJ5PEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLCBvYmplY3Q+KCk7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDEiKV0gPSAiMSI7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDMiKV0gPSAzOwotCi0gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSb3dNYXRjaGVyKCk7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEdldENyaXRlcmlhKGNyaXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtYXRjaGVyLklzTWF0Y2goZGF0YSwgY3JpdGVyaWEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc01hdGNoU2hvdWxkTWF0Y2hXaWxkY2FyZFN0cmluZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBFeGNlbERhdGFiYXNlUm93KCk7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MSJdID0gInRlc3QiOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDIiXSA9IDI7Ci0gICAgICAgICAgICBkYXRhWyJDcml0MyJdID0gMzsKLQotICAgICAgICAgICAgdmFyIGNyaXQgPSBuZXcgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PigpOwotICAgICAgICAgICAgY3JpdFtuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoIkNyaXQxIildID0gInQqdCI7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDMiKV0gPSAzOwotCi0gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSb3dNYXRjaGVyKCk7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEdldENyaXRlcmlhKGNyaXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1hdGNoZXIuSXNNYXRjaChkYXRhLCBjcml0ZXJpYSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRNYXRjaE51bWVyaWNFeHByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQyIl0gPSAyOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDMiXSA9IDM7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsKLSAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKCJDcml0MiIpXSA9ICI8MyI7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDMiKV0gPSAzOwotCi0gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSb3dNYXRjaGVyKCk7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEdldENyaXRlcmlhKGNyaXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1hdGNoZXIuSXNNYXRjaChkYXRhLCBjcml0ZXJpYSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRIYW5kbGVGaWVsZEluZGV4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDEiXSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgIGRhdGFbIkNyaXQyIl0gPSAyOwotICAgICAgICAgICAgZGF0YVsiQ3JpdDMiXSA9IDM7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsKLSAgICAgICAgICAgIGNyaXRbbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKDIpXSA9ICI8MyI7Ci0gICAgICAgICAgICBjcml0W25ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCgiQ3JpdDMiKV0gPSAzOwotCi0gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSb3dNYXRjaGVyKCk7Ci0KLSAgICAgICAgICAgIHZhciBjcml0ZXJpYSA9IEdldENyaXRlcmlhKGNyaXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1hdGNoZXIuSXNNYXRjaChkYXRhLCBjcml0ZXJpYSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWVGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lRnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGY5MzEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWVGdW5jdGlvbnNUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7Ci11c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRGF0ZVRpbWVGdW5jdGlvbnNUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRUaW1lKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2VjSW5BRGF5ID0gRGF0ZVRpbWUuVG9kYXkuQWRkRGF5cygxKS5TdWJ0cmFjdChEYXRlVGltZS5Ub2RheSkuVG90YWxTZWNvbmRzOwotICAgICAgICAgICAgdmFyIHNlY29uZHNPZkV4YW1wbGUgPSAoZG91YmxlKShob3VyICogNjAgKiA2MCArIG1pbnV0ZSAqIDYwICsgc2Vjb25kKTsKLSAgICAgICAgICAgIHJldHVybiBzZWNvbmRzT2ZFeGFtcGxlIC8gc2VjSW5BRGF5OwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRlRnVuY3Rpb25TaG91bGRSZXR1cm5BRGF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjAxMiwgNCwgMyk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGF0YVR5cGUuRGF0ZSwgcmVzdWx0LkRhdGFUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRlRnVuY3Rpb25TaG91bGRSZXR1cm5BQ29ycmVjdERhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWREYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDQsIDMpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMDEyLCA0LCAzKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUuVG9PQURhdGUoKSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF0ZUZ1bmN0aW9uU2hvdWxkTW9udGhGcm9tUHJldlllYXJJZk1vbnRoSXNOZWdhdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMSwgMTEsIDMpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMDEyLCAtMSwgMyk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWREYXRlLlRvT0FEYXRlKCksIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5vd0Z1bmN0aW9uU2hvdWxkUmV0dXJuTm93KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IERhdGVUaW1lLk5vdzsKLSAgICAgICAgICAgIFRocmVhZC5TbGVlcCgxKTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE5vdygpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgRnVuY3Rpb25Bcmd1bWVudFswXTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIFRocmVhZC5TbGVlcCgxKTsKLSAgICAgICAgICAgIHZhciBlbmRUaW1lID0gRGF0ZVRpbWUuTm93OwotICAgICAgICAgICAgdmFyIHJlc3VsdERhdGUgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdERhdGUgPiBzdGFydFRpbWUgJiYgcmVzdWx0RGF0ZSA8IGVuZFRpbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvZGF5RnVuY3Rpb25TaG91bGRSZXR1cm5Ub2RheXNEYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVG9kYXkoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEZ1bmN0aW9uQXJndW1lbnRbMF07Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0RGF0ZSA9IERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSlyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChEYXRlVGltZS5Ob3cuRGF0ZSwgcmVzdWx0RGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF5U2hvdWxkUmV0dXJuRGF5SW5Nb250aCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDMsIDEyKTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkYXRlLlRvT0FEYXRlKCkpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXlTaG91bGRSZXR1cm5Nb250aE9mWWVhcldpdGhTdHJpbmdQYXJhbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGVUaW1lKDIwMTIsIDMsIDEyKTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0xMiIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNb250aFNob3VsZFJldHVybk1vbnRoT2ZZZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTW9udGgoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZGF0ZS5Ub09BRGF0ZSgpKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNb250aFNob3VsZFJldHVybk1vbnRoT2ZZZWFyV2l0aFN0cmluZ1BhcmFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTW9udGgoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBZZWFyU2hvdWxkUmV0dXJuQ29ycmVjdFllYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEyLCAzLCAxMik7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBZZWFyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGRhdGUuVG9PQURhdGUoKSksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAxMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgWWVhclNob3VsZFJldHVybkNvcnJlY3RZZWFyV2l0aFN0cmluZ1BhcmFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMywgMTIpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgWWVhcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0xMiIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMTIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRpbWVTaG91bGRSZXR1cm5BQ29ycmVjdFNlcmlhbE51bWJlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IEdldFRpbWUoMTAsIDExLCAxMik7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwLCAxMSwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsgIAotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRpbWVTaG91bGRQYXJzZVN0cmluZ0NvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9IEdldFRpbWUoMTAsIDExLCAxMik7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxMDoxMToxMiIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVGltZVNob3VsZFRocm93RXhjZXB0aW9uSWZTZWNvbmRzSXNPdXRPZlJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVGltZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMCwgMTEsIDYwKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVGltZVNob3VsZFRocm93RXhjZXB0aW9uSWZNaW51dGVJc091dE9mUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwLCA2MCwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBUaW1lU2hvdWxkVGhyb3dFeGNlcHRpb25JZkhvdXJJc091dE9mUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUaW1lKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDI0LCAxMiwgMTIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEhvdXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSG91cigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhHZXRUaW1lKDksIDEzLCAxNCkpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDksIHJlc3VsdC5SZXN1bHQpOwotCi0gICAgICAgICAgICByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoR2V0VGltZSgyMywgMTMsIDE0KSksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjMsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1pbnV0ZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNaW51dGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoR2V0VGltZSg5LCAxNCwgMTQpKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNCwgcmVzdWx0LlJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhHZXRUaW1lKDksIDU1LCAxNCkpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDU1LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTZWNvbmRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU2Vjb25kKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEdldFRpbWUoOSwgMTQsIDE3KSksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTcsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNlY29uZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoU3RyaW5nQXJndW1lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTZWNvbmQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMjcgMTA6MTE6MTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWludXRlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhTdHJpbmdBcmd1bWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1pbnV0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiMjAxMi0wMy0yNyAxMDoxMToxMiIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBIb3VyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhTdHJpbmdBcmd1bWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEhvdXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjIwMTItMDMtMjcgMTA6MTE6MTIiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgV2Vla2RheVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRGb3JBU3VuZGF5V2hlblJldHVyblR5cGVJczEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXZWVrZGF5KCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKG5ldyBEYXRlVGltZSgyMDEyLCA0LCAxKS5Ub09BRGF0ZSgpLCAxKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBXZWVrZGF5U2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdEZvckFTdW5kYXlXaGVuUmV0dXJuVHlwZUlzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFdlZWtkYXkoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MobmV3IERhdGVUaW1lKDIwMTIsIDQsIDEpLlRvT0FEYXRlKCksIDIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDcsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdlZWtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0Rm9yQVN1bmRheVdoZW5SZXR1cm5UeXBlSXMzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgV2Vla2RheSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhuZXcgRGF0ZVRpbWUoMjAxMiwgNCwgMSkuVG9PQURhdGUoKSwgMyksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgV2Vla051bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXZWVrbnVtKCk7Ci0gICAgICAgICAgICB2YXIgZHQxID0gbmV3IERhdGVUaW1lKDIwMTIsIDEyLCAzMSkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHZhciBkdDIgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMSwgMSkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHZhciBkdDMgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMjApLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciByMSA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDEpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHIyID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcjMgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZHQzLCAyKSwgX3BhcnNpbmdDb250ZXh0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUzLCByMS5SZXN1bHQsICJyMS5SZXN1bHQgd2FzIG5vdCA1MywgYnV0ICIgKyByMS5SZXN1bHQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcjIuUmVzdWx0LCAicjIuUmVzdWx0IHdhcyBub3QgMSwgYnV0ICIgKyByMi5SZXN1bHQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcjMuUmVzdWx0LCAicjMuUmVzdWx0IHdhcyBub3QgMywgYnV0ICIgKyByMy5SZXN1bHQuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRWRhdGVTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRWRhdGUoKTsKLQotICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEyLCAxLCAzMSkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHZhciBkdDJhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMSkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHZhciBkdDNhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMiwgMjgpLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciByMSA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIDEpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHIyID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MmFyZywgLTEpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHIzID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0M2FyZywgMiksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIHZhciBkdDEgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpIHIxLlJlc3VsdCk7Ci0gICAgICAgICAgICB2YXIgZHQyID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKXIyLlJlc3VsdCk7Ci0gICAgICAgICAgICB2YXIgZHQzID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKXIzLlJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHZhciBleHAxID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI5KTsKLSAgICAgICAgICAgIHZhciBleHAyID0gbmV3IERhdGVUaW1lKDIwMTIsIDEyLCAxKTsKLSAgICAgICAgICAgIHZhciBleHAzID0gbmV3IERhdGVUaW1lKDIwMTMsIDQsIDI4KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cDEsIGR0MSwgImR0MSB3YXMgbm90ICIgKyBleHAxLlRvU3RyaW5nKCJ5eXl5LU1NLWRkIikgKyAiLCBidXQgIiArIGR0MS5Ub1N0cmluZygieXl5eS1NTS1kZCIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHAyLCBkdDIsICJkdDEgd2FzIG5vdCAiICsgZXhwMi5Ub1N0cmluZygieXl5eS1NTS1kZCIpICsgIiwgYnV0ICIgKyBkdDIuVG9TdHJpbmcoInl5eXktTU0tZGQiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwMywgZHQzLCAiZHQxIHdhcyBub3QgIiArIGV4cDMuVG9TdHJpbmcoInl5eXktTU0tZGQiKSArICIsIGJ1dCAiICsgZHQzLlRvU3RyaW5nKCJ5eXl5LU1NLWRkIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aE5vTWV0aG9kU3BlY2lmaWVkMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheXMzNjAoKTsKLQotICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZyksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5MCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF5czM2MFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoRXVyb01ldGhvZFNwZWNpZmllZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IERheXMzNjAoKTsKLQotICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgdHJ1ZSksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4OSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF5czM2MFNob3VsZEhhbmRsZUZlYldpdGhFdXJvTWV0aG9kU3BlY2lmaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF5czM2MCgpOwotCi0gICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI5KS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAyLCAyOCkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgdHJ1ZSksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzNTksIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRIYW5kbGVGZWJXaXRoVXNNZXRob2RTcGVjaWZpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBEYXlzMzYwKCk7Ci0KLSAgICAgICAgICAgIHZhciBkdDFhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMiwgMiwgMjkpLlRvT0FEYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZHQyYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDI4KS5Ub09BRGF0ZSgpOwotCi0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MWFyZywgZHQyYXJnLCBmYWxzZSksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzNTgsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERheXMzNjBTaG91bGRIYW5kbGVGZWJXaXRoVXNNZXRob2RTcGVjaWZpZWQyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRGF5czM2MCgpOwotCi0gICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDI4KS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgZmFsc2UpLCBfcGFyc2luZ0NvbnRleHQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzAsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFllYXJGcmFjU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhVc0Jhc2lzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgWWVhcmZyYWMoKTsKLSAgICAgICAgICAgIHZhciBkdDFhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMiwgMjgpLlRvT0FEYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZHQyYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDMsIDMxKS5Ub09BRGF0ZSgpOwotCi0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGR0MWFyZywgZHQyYXJnKSwgX3BhcnNpbmdDb250ZXh0KTsKLQotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpIHJlc3VsdC5SZXN1bHQsIDQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKE1hdGguQWJzKDAuMDg2MSAtIHJvdW5kZWRSZXN1bHQpIDwgZG91YmxlLkVwc2lsb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFllYXJGcmFjU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhFdXJvQmFzaXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBZZWFyZnJhYygpOwotICAgICAgICAgICAgdmFyIGR0MWFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAyLCAyOCkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHZhciBkdDJhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMywgMzEpLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZHQxYXJnLCBkdDJhcmcsIDQpLCBfcGFyc2luZ0NvbnRleHQpOwotCi0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShNYXRoLkFicygwLjA4ODkgLSByb3VuZGVkUmVzdWx0KSA8IGRvdWJsZS5FcHNpbG9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBZZWFyRnJhY0FjdHVhbEFjdHVhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFllYXJmcmFjKCk7Ci0gICAgICAgICAgICB2YXIgZHQxYXJnID0gbmV3IERhdGVUaW1lKDIwMTIsIDIsIDI4KS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGR0MmFyZyA9IG5ldyBEYXRlVGltZSgyMDEzLCAzLCAzMSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhkdDFhcmcsIGR0MmFyZywgMSksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKE1hdGguQWJzKDEuMDg2MiAtIHJvdW5kZWRSZXN1bHQpIDwgZG91YmxlLkVwc2lsb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzb1dlZWtTaG91bGRSZXR1cm4xV2hlbjFTdEphbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzb1dlZWtOdW0oKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhhcmcpLCBfcGFyc2luZ0NvbnRleHQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRW9tb250aFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoUG9zaXRpdmVBcmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBFb21vbnRoKCk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDIpLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoYXJnLCAzKSwgX3BhcnNpbmdDb250ZXh0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxNDI1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRW9tb250aFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoTmVnYXRpdmVBcmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBFb21vbnRoKCk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gbmV3IERhdGVUaW1lKDIwMTMsIDIsIDIpLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoYXJnLCAtMyksIF9wYXJzaW5nQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MTI0M2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0SWZOb0hvbGlkYXlJc1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAxKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGV4cGVjdGVkRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAyOSkuVG9PQURhdGUoKTsKLQotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgV29ya2RheSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhpbnB1dERhdGUsIDIwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aEZvdXJEYXlzU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXREYXRlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDEpLlRvT0FEYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWREYXRlID0gbmV3IERhdGVUaW1lKDIwMTQsIDEsIDcpLlRvT0FEYXRlKCk7Ci0KLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFdvcmtkYXkoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoaW5wdXREYXRlLCA0KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5Db3JyZWN0V2hlbkFycmF5T2ZIb2xpZGF5RGF0ZXNJc1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0RGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAxKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlMSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAyKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlMiA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAzKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgdmFyIGV4cGVjdGVkRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCA5KS5Ub09BRGF0ZSgpOwotCi0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBXb3JrZGF5KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKGlucHV0RGF0ZSwgNCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoaG9saWRheURhdGUxLCBob2xpZGF5RGF0ZTIpKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZERhdGUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvblRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjE2MmUyLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0V4Y2VsRnVuY3Rpb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci11c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEZ1bmN0aW9uVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgY2xhc3MgRXhjZWxGdW5jdGlvblRlc3RlciA6IEV4Y2VsRnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZUltcGwoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJncykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmdzLCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAjcmVnaW9uIE90aGVyIG1lbWJlcnMKLSAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFyZ3NUb0RvdWJsZUVudW1lcmFibGVTaG91bGRIYW5kbGVJbm5lckVudW1lcmFibGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyLCBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCA0KSk7Ci0gICAgICAgICAgICB2YXIgdGVzdGVyID0gbmV3IEV4Y2VsRnVuY3Rpb25UZXN0ZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSB0ZXN0ZXIuQXJnc1RvRG91YmxlRW51bWVyYWJsZUltcGwoYXJncyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmVzdWx0LkNvdW50KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25Bcmd1bWVudFRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25Bcmd1bWVudFRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJiODg4Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uQXJndW1lbnRUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBGdW5jdGlvbkFyZ3VtZW50VGVzdHMKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXRFeGNlbFN0YXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZyA9IG5ldyBGdW5jdGlvbkFyZ3VtZW50KDIpOwotICAgICAgICAgICAgYXJnLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhcmcuRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhjZWxTdGF0ZUZsYWdJc1NldFNob3VsZFJldHVybkZhbHNlV2hlbk5vdFNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmcgPSBuZXcgRnVuY3Rpb25Bcmd1bWVudCgyKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGFyZy5FeGNlbFN0YXRlRmxhZ0lzU2V0KEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uUmVwb3NpdG9yeVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25SZXBvc2l0b3J5VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjMxMzQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25SZXBvc2l0b3J5VGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25SZXBvc2l0b3J5VGVzdHMKLSAgICB7Ci0gICAgICAgICNyZWdpb24gTG9hZE1vZHVsZSBUZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZE1vZHVsZVBvcHVsYXRlc0Z1bmN0aW9uc0FuZEN1c3RvbUNvbXBpbGVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShmdW5jdGlvblJlcG9zaXRvcnkuSXNGdW5jdGlvbk5hbWUoTXlGdW5jdGlvbi5OYW1lKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShmdW5jdGlvblJlcG9zaXRvcnkuQ3VzdG9tQ29tcGlsZXJzLkNvbnRhaW5zS2V5KHR5cGVvZihNeUZ1bmN0aW9uKSkpOwotICAgICAgICAgICAgZnVuY3Rpb25SZXBvc2l0b3J5LkxvYWRNb2R1bGUobmV3IFRlc3RGdW5jdGlvbk1vZHVsZSgpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZnVuY3Rpb25SZXBvc2l0b3J5LklzRnVuY3Rpb25OYW1lKE15RnVuY3Rpb24uTmFtZSkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShmdW5jdGlvblJlcG9zaXRvcnkuQ3VzdG9tQ29tcGlsZXJzLkNvbnRhaW5zS2V5KHR5cGVvZihNeUZ1bmN0aW9uKSkpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlbG9hZGluZyB0aGUgbW9kdWxlIG92ZXJ3cml0ZXMgcHJldmlvdXMgZnVuY3Rpb25zIGFuZCBjb21waWxlcnMKLSAgICAgICAgICAgIGZ1bmN0aW9uUmVwb3NpdG9yeS5Mb2FkTW9kdWxlKG5ldyBUZXN0RnVuY3Rpb25Nb2R1bGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gTmVzdGVkIENsYXNzZXMKLSAgICAgICAgcHVibGljIGNsYXNzIFRlc3RGdW5jdGlvbk1vZHVsZSA6IEZ1bmN0aW9uc01vZHVsZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgVGVzdEZ1bmN0aW9uTW9kdWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbXlGdW5jdGlvbiA9IG5ldyBNeUZ1bmN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmFyIGN1c3RvbUNvbXBpbGVyID0gbmV3IE15RnVuY3Rpb25Db21waWxlcihteUZ1bmN0aW9uKTsKLSAgICAgICAgICAgICAgICBiYXNlLkZ1bmN0aW9ucy5BZGQoTXlGdW5jdGlvbi5OYW1lLCBteUZ1bmN0aW9uKTsKLSAgICAgICAgICAgICAgICBiYXNlLkN1c3RvbUNvbXBpbGVycy5BZGQodHlwZW9mKE15RnVuY3Rpb24pLCBjdXN0b21Db21waWxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgY2xhc3MgTXlGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOYW1lID0gIk15RnVuY3Rpb24iOwotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgY2xhc3MgTXlGdW5jdGlvbkNvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTXlGdW5jdGlvbkNvbXBpbGVyKE15RnVuY3Rpb24gZnVuY3Rpb24pIDogYmFzZShmdW5jdGlvbikgeyB9Ci0gICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzN2RmNy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbkZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEluZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX2NvbnRleHQ7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNCbGFua1Nob3VsZFJldHVyblRydWVJZkZpcnN0QXJnSXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNCbGFuaygpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhuZXcgb2JqZWN0W117bnVsbH0pOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzQmxhbmtTaG91bGRSZXR1cm5UcnVlSWZGaXJzdEFyZ0lzRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc0JsYW5rKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHN0cmluZy5FbXB0eSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNOdW1iZXJTaG91bGRSZXR1cm5UcnVlV2hlbkFyZ0lzTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzTnVtYmVyKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc051bWJlclNob3VsZFJldHVybmZhbHNlV2hlbkFyZ0lzTm9uTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzTnVtYmVyKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzRXJyb3JTaG91bGRSZXR1cm5UcnVlSWZBcmdJc0FuRXJyb3JDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhFeGNlbEVycm9yVmFsdWUuUGFyc2UoIiNESVYvMCEiKSk7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc0Vycm9yKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNFcnJvclNob3VsZFJldHVybkZhbHNlSWZBcmdJc05vdEFuRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJBIiwgMSk7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc0Vycm9yKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzVGV4dFNob3VsZFJldHVyblRydWVXaGVuRmlyc3RBcmdJc0FTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxIik7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc1RleHQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc1RleHRTaG91bGRSZXR1cm5GYWxzZVdoZW5GaXJzdEFyZ0lzTm90QVN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSk7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc1RleHQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNOb25UZXh0U2hvdWxkUmV0dXJuRmFsc2VXaGVuRmlyc3RBcmdJc0FTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxIik7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc05vblRleHQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNOb25UZXh0U2hvdWxkUmV0dXJuVHJ1ZVdoZW5GaXJzdEFyZ0lzTm90QVN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSk7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBJc05vblRleHQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc09kZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMuMTIzKTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzT2RkKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNFdmVuU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNC4xMjMpOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSXNFdmVuKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNMb2dpY2FsU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElzTG9naWNhbCgpOwotCi0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLQotICAgICAgICAgICAgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJ0cnVlIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhmYWxzZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOc2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE4oKTsKLQotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLjIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS4yLCByZXN1bHQuUmVzdWx0KTsKLQotICAgICAgICAgICAgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmMiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHJlc3VsdC5SZXN1bHQpOwotCi0gICAgICAgICAgICBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3ModHJ1ZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLQotICAgICAgICAgICAgdmFyIGVycm9yQ29kZSA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoZXJyb3JDb2RlKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXJyb3JDb2RlLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWxGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWxGdW5jdGlvbnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3NmJmMi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBMb2dpY2FsRnVuY3Rpb25zVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElmU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IElmKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHRydWUsICJBIiwgIkIiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQSIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5vdFNob3VsZFJldHVybkZhbHNlSWZBcmd1bWVudElzVHJ1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE5vdCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5vdFNob3VsZFJldHVyblRydWVJZkFyZ3VtZW50SXMwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTm90KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOb3RTaG91bGRSZXR1cm5GYWxzZUlmQXJndW1lbnRJczEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBOb3QoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOb3RTaG91bGRIYW5kbGVFeGNlbFJlZmVyZW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MSIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJOT1QoQTEpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBbmRTaG91bGRSZXR1cm5UcnVlSWZBbGxBcmd1bWVudHNBcmVUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQW5kKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHRydWUsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBbmRTaG91bGRSZXR1cm5UcnVlSWZBbGxBcmd1bWVudHNBcmVUcnVlT3IxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQW5kKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHRydWUsIHRydWUsIDEsIHRydWUsIDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBbmRTaG91bGRSZXR1cm5GYWxzZUlmT25lQXJndW1lbnRJc0ZhbHNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQW5kKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFuZFNob3VsZFJldHVybkZhbHNlSWZPbmVBcmd1bWVudElzMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFuZCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCAwLCB0cnVlKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9yU2hvdWxkUmV0dXJuVHJ1ZUlmT25lQXJndW1lbnRJc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBPcigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyh0cnVlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJZkVycm9yU2hvdWxkUmV0dXJuU2Vjb25kQXJnSWZDcml0ZXJpYUV2YWx1YXRlc0FzQW5FcnJvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgczEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJJRkVSUk9SKDAvMCwgXCJoZWxsb1wiKSI7Ci0gICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJoZWxsbyIsIHMxLkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJZkVycm9yU2hvdWxkUmV0dXJuU2Vjb25kQXJnSWZDcml0ZXJpYUV2YWx1YXRlc0FzQW5FcnJvcjIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiSUZFUlJPUihBMiwgXCJoZWxsb1wiKSI7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICIyMy8wIjsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlbGxvIiwgczEuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElmRXJyb3JTaG91bGRSZXR1cm5SZXN1bHRPZkZvcm11bGFJZk5vRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiSUZFUlJPUihBMiwgXCJoZWxsb1wiKSI7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiaGkgdGhlcmUiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGkgdGhlcmUiLCBzMS5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSWZOYVNob3VsZFJldHVyblNlY29uZEFyZ0lmQ3JpdGVyaWFFdmFsdWF0ZXNBc0FuRXJyb3IyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIklGRVJST1IoQTIsIFwiaGVsbG9cIikiOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMiJdLlZhbHVlID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKTsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhlbGxvIiwgczEuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElmTmFTaG91bGRSZXR1cm5SZXN1bHRPZkZvcm11bGFJZk5vRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiSUZOQShBMiwgXCJoZWxsb1wiKSI7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiaGkgdGhlcmUiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGkgdGhlcmUiLCBzMS5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VBVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VBVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YWFhZTguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLQlbVGVzdENsYXNzXQotCXB1YmxpYyBjbGFzcyBBdmVyYWdlQVRlc3RzCi0JewotCQlbVGVzdE1ldGhvZF0KLQkJcHVibGljIHZvaWQgQXZlcmFnZUFMaXRlcmFscygpCi0JCXsKLQkJCS8vIEZvciBsaXRlcmFscywgQXZlcmFnZUEgYWx3YXlzIHBhcnNlcyBhbmQgaW5jbHVkZSBudW1lcmljIHN0cmluZ3MsIGRhdGUgc3RyaW5ncywgYm9vbHMsIGV0Yy4KLQkJCS8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB1bnBhcnNhYmxlIHN0cmluZyBsaXRlcmFscywgd2hpY2ggY2F1c2UgYSAjVkFMVUUuCi0JCQlBdmVyYWdlQSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2VBKCk7Ci0JCQl2YXIgZGF0ZTEgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7Ci0JCQl2YXIgZGF0ZTIgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgMTUpOwotCQkJZG91YmxlIHZhbHVlMSA9IDEwMDA7Ci0JCQlkb3VibGUgdmFsdWUyID0gMjAwMDsKLQkJCWRvdWJsZSB2YWx1ZTMgPSA2MDAwOwotCQkJZG91YmxlIHZhbHVlNCA9IDE7Ci0JCQlkb3VibGUgdmFsdWU1ID0gZGF0ZTEuVG9PQURhdGUoKTsKLQkJCWRvdWJsZSB2YWx1ZTYgPSBkYXRlMi5Ub09BRGF0ZSgpOwotCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCi0JCQl7Ci0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUxLlRvU3RyaW5nKCJuIikpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbHVlMiksCi0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUzLlRvU3RyaW5nKCJuIikpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHRydWUpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KGRhdGUxKSwKLQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChkYXRlMi5Ub1N0cmluZygiZCIpKQotCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOwotCQkJQXNzZXJ0LkFyZUVxdWFsKCh2YWx1ZTEgKyB2YWx1ZTIgKyB2YWx1ZTMgKyB2YWx1ZTQgKyB2YWx1ZTUgKyB2YWx1ZTYpIC8gNiwgcmVzdWx0LlJlc3VsdCk7Ci0JCX0KLQotCQlbVGVzdE1ldGhvZF0KLQkJcHVibGljIHZvaWQgQXZlcmFnZUFDZWxsUmVmZXJlbmNlcygpCi0JCXsKLQkJCS8vIEZvciBjZWxsIHJlZmVyZW5jZXMsIEF2ZXJhZ2VBIGRpdmlkZXMgYnkgYWxsIGNlbGxzLCBidXQgb25seSBhZGRzIGFjdHVhbCBudW1iZXJzLCBkYXRlcywgYW5kIGJvb2xlYW5zLgotCQkJRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0JCQl2YXIgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotCQkJZG91YmxlW10gdmFsdWVzID0KLQkJCXsKLQkJCQkwLAotCQkJCTIwMDAsCi0JCQkJMCwKLQkJCQkxLAotCQkJCW5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KS5Ub09BRGF0ZSgpLAotCQkJCTAKLQkJCX07Ci0JCQlFeGNlbFJhbmdlIHJhbmdlMSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxXTsKLQkJCXJhbmdlMS5Gb3JtdWxhID0gIlwiMTAwMFwiIjsKLQkJCXJhbmdlMS5DYWxjdWxhdGUoKTsKLQkJCXZhciByYW5nZTIgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl07Ci0JCQlyYW5nZTIuVmFsdWUgPSAyMDAwOwotCQkJdmFyIHJhbmdlMyA9IHdvcmtzaGVldC5DZWxsc1sxLCAzXTsKLQkJCXJhbmdlMy5Gb3JtdWxhID0gJCJcIntuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSkuVG9TdHJpbmcoImQiKX1cIiI7Ci0JCQlyYW5nZTMuQ2FsY3VsYXRlKCk7Ci0JCQl2YXIgcmFuZ2U0ID0gd29ya3NoZWV0LkNlbGxzWzEsIDRdOwotCQkJcmFuZ2U0LlZhbHVlID0gdHJ1ZTsKLQkJCXZhciByYW5nZTUgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgNV07Ci0JCQlyYW5nZTUuVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMywgMSwgNSk7Ci0JCQl2YXIgcmFuZ2U2ID0gd29ya3NoZWV0LkNlbGxzWzEsIDZdOwotCQkJcmFuZ2U2LlZhbHVlID0gIlRlc3QiOwotCQkJQXZlcmFnZUEgYXZlcmFnZSA9IG5ldyBBdmVyYWdlQSgpOwotCQkJdmFyIHJhbmdlSW5mbzEgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuUmFuZ2VJbmZvKHdvcmtzaGVldCwgMSwgMSwgMSwgMyk7Ci0JCQl2YXIgcmFuZ2VJbmZvMiA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5SYW5nZUluZm8od29ya3NoZWV0LCAxLCA0LCAxLCA0KTsKLQkJCXZhciByYW5nZUluZm8zID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLlJhbmdlSW5mbyh3b3Jrc2hlZXQsIDEsIDUsIDEsIDYpOwotCQkJdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLQkJCXZhciBhZGRyZXNzID0gbmV3IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMuUmFuZ2VBZGRyZXNzKCk7Ci0JCQlhZGRyZXNzLkZyb21Sb3cgPSBhZGRyZXNzLlRvUm93ID0gYWRkcmVzcy5Gcm9tQ29sID0gYWRkcmVzcy5Ub0NvbCA9IDI7Ci0JCQljb250ZXh0LlNjb3Blcy5OZXdTY29wZShhZGRyZXNzKTsKLQkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQotCQkJewotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzEpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzIpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzMpCi0JCQl9LCBjb250ZXh0KTsKLQkJCUFzc2VydC5BcmVFcXVhbCh2YWx1ZXMuQXZlcmFnZSgpLCByZXN1bHQuUmVzdWx0KTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBBdmVyYWdlQUFycmF5KCkKLQkJewotCQkJLy8gRm9yIGFycmF5cywgQXZlcmFnZUEgY29tcGxldGVseSBpZ25vcmVzIGJvb2xlYW5zLiAgSXQgZGl2aWRlcyBieSBzdHJpbmdzIGFuZCBudW1iZXJzLCBidXQgb25seQotCQkJLy8gbnVtYmVycyBhcmUgYWRkZWQgdG8gdGhlIHRvdGFsLiAgUmVhbCBkYXRlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGFuZCBzdHJpbmcgZGF0ZXMgYXJlIG5vdCBwYXJzZWQuCi0JCQlBdmVyYWdlQSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2VBKCk7Ci0JCQl2YXIgZGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7Ci0JCQlkb3VibGVbXSB2YWx1ZXMgPQotCQkJewotCQkJCTAsCi0JCQkJMjAwMCwKLQkJCQkwLAotCQkJCTAsCi0JCQkJMAotCQkJfTsKLQkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQotCQkJewotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KLQkJCQl7Ci0JCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDEwMDAuVG9TdHJpbmcoIm4iKSksCi0JCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDIwMDApLAotCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCg2MDAwLlRvU3RyaW5nKCJuIikpLAotCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCh0cnVlKSwKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoZGF0ZS5Ub1N0cmluZygiZCIpKSwKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoInRlc3QiKQotCQkJCX0pCi0JCQl9LCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwodmFsdWVzLkF2ZXJhZ2UoKSwgcmVzdWx0LlJlc3VsdCk7Ci0JCX0KLQotCQlbVGVzdE1ldGhvZF0KLQkJW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KLQkJcHVibGljIHZvaWQgQXZlcmFnZUFVbnBhcnNhYmxlTGl0ZXJhbCgpCi0JCXsKLQkJCS8vIEluIHRoZSBjYXNlIG9mIGxpdGVyYWxzLCBhbnkgdW5wYXJzYWJsZSBzdHJpbmcgbGl0ZXJhbCByZXN1bHRzIGluIGEgI1ZBTFVFLgotCQkJQXZlcmFnZUEgYXZlcmFnZSA9IG5ldyBBdmVyYWdlQSgpOwotCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCi0JCQl7Ci0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoMTAwMCksCi0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoIlRlc3QiKQotCQkJfSwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUlmVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NTk0OTguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi3vu791c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgc3RhdGljIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxEYXRhUHJvdmlkZXI7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQXZlcmFnZUlmVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOwotICAgICAgICBwcml2YXRlIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyIF9wcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIF9wcm92aWRlciA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlcihfcGFja2FnZSk7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdHNoZWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj4xIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTm9uTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiTW9uZGF5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiVHVlc2RheSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIlRodXJzZGF5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIlQqZGF5IiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTnVtZXJpY0V4cHJlc3Npb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgMWQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZFcXVhbFRvRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICIiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZOb3RFcXVhbFRvTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw+IiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmRXF1YWxUb1plcm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMGQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICIwIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTm90RXF1YWxUb1plcm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMGQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8PjAiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZHcmVhdGVyVGhhblplcm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+MCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkdyZWF0ZXJUaGFuT3JFcXVhbFRvWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj49MCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkxlc3NUaGFuWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAtMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8MCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZkxlc3NUaGFuT3JFcXVhbFRvWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAtMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8PTAiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZMZXNzVGhhbkNoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjxhIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmTGVzc1RoYW5PckVxdWFsVG9DaGFyYWN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8PWEiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZHcmVhdGVyVGhhbkNoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj5hIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmR3JlYXRlclRoYW5PckVxdWFsVG9DaGFyYWN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+PWEiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTA5YzQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLQlbVGVzdENsYXNzXQotCXB1YmxpYyBjbGFzcyBBdmVyYWdlVGVzdHMKLQl7Ci0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBBdmVyYWdlTGl0ZXJhbHMoKQotCQl7Ci0JCQkvLyBJbiB0aGUgY2FzZSBvZiBsaXRlcmFscywgQXZlcmFnZSBET0VTIHBhcnNlIGFuZCBpbmNsdWRlIG51bWVyaWMgc3RyaW5ncywgZGF0ZSBzdHJpbmdzLCBib29scywgZXRjLgotCQkJQXZlcmFnZSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2UoKTsKLQkJCXZhciBkYXRlMSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KTsKLQkJCXZhciBkYXRlMiA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7Ci0JCQlkb3VibGUgdmFsdWUxID0gMTAwMDsKLQkJCWRvdWJsZSB2YWx1ZTIgPSAyMDAwOwotCQkJZG91YmxlIHZhbHVlMyA9IDYwMDA7Ci0JCQlkb3VibGUgdmFsdWU0ID0gMTsKLQkJCWRvdWJsZSB2YWx1ZTUgPSBkYXRlMS5Ub09BRGF0ZSgpOwotCQkJZG91YmxlIHZhbHVlNiA9IGRhdGUyLlRvT0FEYXRlKCk7Ci0JCQl2YXIgcmVzdWx0ID0gYXZlcmFnZS5FeGVjdXRlKG5ldyBGdW5jdGlvbkFyZ3VtZW50W10KLQkJCXsKLQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCh2YWx1ZTEuVG9TdHJpbmcoIm4iKSksCi0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUyKSwKLQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCh2YWx1ZTMuVG9TdHJpbmcoIm4iKSksCi0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodHJ1ZSksCi0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoZGF0ZTEpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KGRhdGUyLlRvU3RyaW5nKCJkIikpCi0JCQl9LCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoKHZhbHVlMSArIHZhbHVlMiArIHZhbHVlMyArIHZhbHVlNCArIHZhbHVlNSArIHZhbHVlNikgLyA2LCByZXN1bHQuUmVzdWx0KTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBBdmVyYWdlQ2VsbFJlZmVyZW5jZXMoKQotCQl7Ci0JCQkvLyBJbiB0aGUgY2FzZSBvZiBjZWxsIHJlZmVyZW5jZXMsIEF2ZXJhZ2UgRE9FUyBOT1QgcGFyc2UgYW5kIGluY2x1ZGUgbnVtZXJpYyBzdHJpbmdzLCBkYXRlIHN0cmluZ3MsIGJvb2xzLCB1bnBhcnNhYmxlIHN0cmluZ3MsIGV0Yy4KLQkJCUV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotCQkJdmFyIHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLQkJCUV4Y2VsUmFuZ2UgcmFuZ2UxID0gd29ya3NoZWV0LkNlbGxzWzEsIDFdOwotCQkJcmFuZ2UxLkZvcm11bGEgPSAiXCIxMDAwXCIiOwotCQkJcmFuZ2UxLkNhbGN1bGF0ZSgpOwotCQkJdmFyIHJhbmdlMiA9IHdvcmtzaGVldC5DZWxsc1sxLCAyXTsKLQkJCXJhbmdlMi5WYWx1ZSA9IDIwMDA7Ci0JCQl2YXIgcmFuZ2UzID0gd29ya3NoZWV0LkNlbGxzWzEsIDNdOwotCQkJcmFuZ2UzLkZvcm11bGEgPSAkIlwie25ldyBEYXRlVGltZSgyMDEzLCAxLCA1KS5Ub1N0cmluZygiZCIpfVwiIjsKLQkJCXJhbmdlMy5DYWxjdWxhdGUoKTsKLQkJCXZhciByYW5nZTQgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgNF07Ci0JCQlyYW5nZTQuVmFsdWUgPSB0cnVlOwotCQkJdmFyIHJhbmdlNSA9IHdvcmtzaGVldC5DZWxsc1sxLCA1XTsKLQkJCXJhbmdlNS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KTsKLQkJCXZhciByYW5nZTYgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgNl07Ci0JCQlyYW5nZTYuVmFsdWUgPSAiVGVzdCI7Ci0JCQlBdmVyYWdlIGF2ZXJhZ2UgPSBuZXcgQXZlcmFnZSgpOwotCQkJdmFyIHJhbmdlSW5mbzEgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuUmFuZ2VJbmZvKHdvcmtzaGVldCwgMSwgMSwgMSwgMyk7Ci0JCQl2YXIgcmFuZ2VJbmZvMiA9IG5ldyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5SYW5nZUluZm8od29ya3NoZWV0LCAxLCA0LCAxLCA0KTsKLQkJCXZhciByYW5nZUluZm8zID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLlJhbmdlSW5mbyh3b3Jrc2hlZXQsIDEsIDUsIDEsIDYpOwotCQkJdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLQkJCXZhciBhZGRyZXNzID0gbmV3IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMuUmFuZ2VBZGRyZXNzKCk7Ci0JCQlhZGRyZXNzLkZyb21Sb3cgPSBhZGRyZXNzLlRvUm93ID0gYWRkcmVzcy5Gcm9tQ29sID0gYWRkcmVzcy5Ub0NvbCA9IDI7Ci0JCQljb250ZXh0LlNjb3Blcy5OZXdTY29wZShhZGRyZXNzKTsKLQkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQotCQkJewotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzEpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzIpLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KHJhbmdlSW5mbzMpCi0JCQl9LCBjb250ZXh0KTsKLQkJCUFzc2VydC5BcmVFcXVhbCgoMjAwMCArIG5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KS5Ub09BRGF0ZSgpKSAvIDIsIHJlc3VsdC5SZXN1bHQpOwotCQl9Ci0KLQkJW1Rlc3RNZXRob2RdCi0JCXB1YmxpYyB2b2lkIEF2ZXJhZ2VBcnJheSgpCi0JCXsKLQkJCS8vIEluIHRoZSBjYXNlIG9mIGFycmF5cywgQXZlcmFnZSBET0VTIE5PVCBwYXJzZSBhbmQgaW5jbHVkZSBudW1lcmljIHN0cmluZ3MsIGRhdGUgc3RyaW5ncywgYm9vbHMsIHVucGFyc2FibGUgc3RyaW5ncywgZXRjLgotCQkJQXZlcmFnZSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2UoKTsKLQkJCXZhciBkYXRlMSA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCA1KTsKLQkJCXZhciBkYXRlMiA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7Ci0JCQlkb3VibGUgdmFsdWUgPSAyMDAwOwotCQkJdmFyIHJlc3VsdCA9IGF2ZXJhZ2UuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFtdCi0JCQl7Ci0JCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQotCQkJCXsKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoMTAwMC5Ub1N0cmluZygibiIpKSwKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQodmFsdWUpLAotCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCg2MDAwLlRvU3RyaW5nKCJuIikpLAotCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudCh0cnVlKSwKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoZGF0ZTEpLAotCQkJCQluZXcgRnVuY3Rpb25Bcmd1bWVudChkYXRlMi5Ub1N0cmluZygiZCIpKSwKLQkJCQkJbmV3IEZ1bmN0aW9uQXJndW1lbnQoInRlc3QiKQotCQkJCX0pCi0JCQl9LCBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoKDIwMDAgKyBkYXRlMS5Ub09BRGF0ZSgpKSAvIDIsIHJlc3VsdC5SZXN1bHQpOwotCQl9Ci0KLQkJW1Rlc3RNZXRob2RdCi0JCVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCi0JCXB1YmxpYyB2b2lkIEF2ZXJhZ2VVbnBhcnNhYmxlTGl0ZXJhbCgpCi0JCXsKLQkJCS8vIEluIHRoZSBjYXNlIG9mIGxpdGVyYWxzLCBhbnkgdW5wYXJzYWJsZSBzdHJpbmcgbGl0ZXJhbCByZXN1bHRzIGluIGEgI1ZBTFVFLgotCQkJQXZlcmFnZSBhdmVyYWdlID0gbmV3IEF2ZXJhZ2UoKTsKLQkJCXZhciByZXN1bHQgPSBhdmVyYWdlLkV4ZWN1dGUobmV3IEZ1bmN0aW9uQXJndW1lbnRbXQotCQkJewotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KDEwMDApLAotCQkJCW5ldyBGdW5jdGlvbkFyZ3VtZW50KCJUZXN0IikKLQkJCX0sIFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZlRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Yjk2MTYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAot77u/dXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIHN0YXRpYyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsRGF0YVByb3ZpZGVyOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIENvdW50SWZUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIgX3Byb3ZpZGVyOwotICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgX3Byb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9wYWNrYWdlKTsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0c2hlZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+MSIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTm9uTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiTW9uZGF5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiVHVlc2RheSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIlRodXJzZGF5IjsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICJUKmRheSIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOdWxsRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDIsIDIsIDIsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOdW1lcmljRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgMWQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi1bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkVxdWFsVG9FbXB0eVN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICIiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZk5vdEVxdWFsVG9OdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIjw+Iik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZFcXVhbFRvWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICIwIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZOb3RFcXVhbFRvWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PjAiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkdyZWF0ZXJUaGFuWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+MCIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmR3JlYXRlclRoYW5PckVxdWFsVG9aZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIj49MCIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTGVzc1RoYW5aZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8MCIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmTGVzc1RoYW5PckVxdWFsVG9aZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IC0xZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PTAiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkxlc3NUaGFuQ2hhcmFjdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIjxhIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZMZXNzVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI8PWEiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZkdyZWF0ZXJUaGFuQ2hhcmFjdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZSwgIj5hIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZHcmVhdGVyVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsICI+PWEiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjExZWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZlRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLe+7v3VzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBzdGF0aWMgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbERhdGFQcm92aWRlcjsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBTdW1JZlRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBFcHBsdXNFeGNlbERhdGFQcm92aWRlciBfcHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OwotICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICBfcHJvdmlkZXIgPSBuZXcgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIoX3BhY2thZ2UpOwotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3RzaGVldCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTnVtZXJpYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPjEiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDhkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZk5vbk51bWVyaWMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gIk1vbmRheSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gIlR1ZXNkYXkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJUaHVyc2RheSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIlQqZGF5IiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZOdW1lcmljRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UsIDFkKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZFcXVhbFRvRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIiIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTm90RXF1YWxUb051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw+IiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZFcXVhbFRvWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAwZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiMCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTm90RXF1YWxUb1plcm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMGQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw+MCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmR3JlYXRlclRoYW5aZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+MCIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmR3JlYXRlclRoYW5PckVxdWFsVG9aZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI+PTAiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkxlc3NUaGFuWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAtMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjwwIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZMZXNzVGhhbk9yRXF1YWxUb1plcm8oKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gLTFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8PTAiLCByYW5nZTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdW1JZkxlc3NUaGFuQ2hhcmFjdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJOb3QgRW1wdHkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDNkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UxID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMSwgMywgMSk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMiA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDIsIDMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhyYW5nZTEsICI8YSIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmTGVzc1RoYW5PckVxdWFsVG9DaGFyYWN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIjw9YSIsIHJhbmdlMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmR3JlYXRlclRoYW5DaGFyYWN0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gIk5vdCBFbXB0eSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTEgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAxLCAzLCAxKTsKLSAgICAgICAgICAgIElSYW5nZUluZm8gcmFuZ2UyID0gX3Byb3ZpZGVyLkdldFJhbmdlKF93b3Jrc2hlZXQuTmFtZSwgMSwgMiwgMywgMik7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKHJhbmdlMSwgIj5hIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZHcmVhdGVyVGhhbk9yRXF1YWxUb0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPj1hIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZIYW5kbGVEYXRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiTm90IEVtcHR5IjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICBJUmFuZ2VJbmZvIHJhbmdlMSA9IF9wcm92aWRlci5HZXRSYW5nZShfd29ya3NoZWV0Lk5hbWUsIDEsIDEsIDMsIDEpOwotICAgICAgICAgICAgSVJhbmdlSW5mbyByYW5nZTIgPSBfcHJvdmlkZXIuR2V0UmFuZ2UoX3dvcmtzaGVldC5OYW1lLCAxLCAyLCAzLCAyKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MocmFuZ2UxLCAiPj1hIiwgcmFuZ2UyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZTaG91bGRIYW5kbGVCb29sZWFuQXJnKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzEiXS5Gb3JtdWxhID0gIlNVTUlGKEExOkEyLFRSVUUsQjE6QjIpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGhGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGhGdW5jdGlvbnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyMWUxMC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoRnVuY3Rpb25zVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU2ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBNYXRoRnVuY3Rpb25zVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBpU2hvdWxkUmV0dXJuUElDb25zdGFudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gKGRvdWJsZSlNYXRoLlJvdW5kKE1hdGguUEksIDE0KTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFBpKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFic1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IDNkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQWJzKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0zZCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXNpblNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBkb3VibGUgZXhwZWN0ZWRWYWx1ZSA9IDEuNTcwODsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFzaW4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMWQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcm91bmRlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXNpbmhTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgZG91YmxlIGV4cGVjdGVkVmFsdWUgPSAwLjA5OTg7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBc2luaCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygwLjFkKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIHZhciByb3VuZGVkID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJvdW5kZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENlaWxpbmdTaG91bGRSb3VuZFVwQWNjb3JkaW5nVG9QYXJhbXNTaWduaWZpY2FuY2VMb3dlclRoYW4wKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAyMi4zNmQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDZWlsaW5nKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIyLjM1ZCwgMC4wMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2VpbGluZ1Nob3VsZFJvdW5kVG93YXJkc1plcm9JZlNpZ25pZmljYW5jZUFuZE51bWJlcklzTWludXMwcG9pbnQxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAtMjIuNGQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDZWlsaW5nKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0yMi4zNWQsIC0wLjEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIFN5c3RlbS5NYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgMikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENlaWxpbmdTaG91bGRSb3VuZFVwQWNjb3JkaW5nVG9QYXJhbXNTaWduaWZpY2FuY2VJczEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IDIzZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENlaWxpbmcoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjIuMzVkLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkUm91bmRVcEFjY29yZGluZ1RvUGFyYW1zU2lnbmlmaWNhbmNlSXMxMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gMzBkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ2VpbGluZygpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyMi4zNWQsIDEwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkUm91bmRUb3dhcmRzWmVyb0lmU2lnbmlmaWNhbmNlQW5kTnVtYmVySXNOZWdhdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gLTMwZDsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENlaWxpbmcoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTIyLjM1ZCwgLTEwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFZhbHVlLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkVGhyb3dFeGNlcHRpb25JZk51bWJlcklzUG9zaXRpdmVBbmRTaWduaWZpY2FuY2VJc05lZ2F0aXZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAzMGQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDZWlsaW5nKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIyLjM1ZCwgLTEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZENhbGN1bGF0ZTJQbHVzM0FuZFJldHVybjUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW0oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgMyk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZENhbGN1bGF0ZUVudW1lcmFibGVPZjJQbHVzNVBsdXMzQW5kUmV0dXJuMTAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW0oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgNSksIDMpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtU2hvdWxkSWdub3JlSGlkZGVuVmFsdWVzV2hlbklnbm9yZUhpZGRlblZhbHVlc0lzU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDUpLCAzLCA0KTsKLSAgICAgICAgICAgIGFyZ3MuTGFzdCgpLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZTaG91bGRDYWxjdWxhdGVNYXRjaGluZ1ZhbHVlc09ubHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1JZigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCA0LCA1KSwgIjQiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZTaG91bGRDYWxjdWxhdGVXaXRoRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsIDQsIDUpLCAiPjMiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bUlmU2hvdWxkVGhyb3dJZkNyaXRlcmlhSXNMYXJnZXJUaGFuMjU1Q2hhcnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbG9uZ1N0cmluZyA9ICJhIjsKLSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgMjU2OyB4KyspIHsgbG9uZ1N0cmluZyA9IHN0cmluZy5Db25jYXQobG9uZ1N0cmluZywgImEiKTsgfQotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VtSWYoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMywgNCwgNSksIGxvbmdTdHJpbmcsIChGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCAyLCAxKSkpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVNxU2hvdWxkQ2FsY3VsYXRlQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdW1zcSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCA0KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVNxU2hvdWxkSW5jbHVkZVRydWVBc09uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1bXNxKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDQsIHRydWUpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtU3FTaG91bGROb0NvdW50VHJ1ZVRydWVJbkFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3Vtc3EoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgNCwgdHJ1ZSkpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RkZXZTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3RkZXYoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMywgNSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2U2hvdWxkSWdub3JlSGlkZGVuVmFsdWVzV2hlbklnbm9yZUhpZGRlblZhbHVlc0lzU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3RkZXYoKTsKLSAgICAgICAgICAgIGZ1bmMuSWdub3JlSGlkZGVuVmFsdWVzID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMywgNSwgNik7Ci0gICAgICAgICAgICBhcmdzLkxhc3QoKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RkZXZQU2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN0ZGV2UCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCAzLCA0KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjgxNjVkLCBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2UFNob3VsZElnbm9yZUhpZGRlblZhbHVlc1doZW5JZ25vcmVIaWRkZW5WYWx1ZXNJc1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN0ZGV2UCgpOwotICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyLCAzLCA0LCAxNjUpOwotICAgICAgICAgICAgYXJncy5MYXN0KCkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC44MTY1ZCwgTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeHBTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRXhwKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDU0LjU5ODE1MDAzZCwgU3lzdGVtLk1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4U2hvdWxkQ2FsY3VsYXRlQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1heCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAyLCA1LCAyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4U2hvdWxkSWdub3JlSGlkZGVuVmFsdWVzSWZJZ25vcmVIaWRkZW5WYWx1ZXNJc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXgoKTsKLSAgICAgICAgICAgIGZ1bmMuSWdub3JlSGlkZGVuVmFsdWVzID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMiwgNSwgMik7Ci0gICAgICAgICAgICBhcmdzLkVsZW1lbnRBdCgyKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4YVNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXhhKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0xLCAwLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4YVNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHRVc2luZ0Jvb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXhhKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0xLCAwLCB0cnVlKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4YVNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHRVc2luZ1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1heGEoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTEsICJ0ZXN0Iik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1pblNob3VsZENhbGN1bGF0ZUNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNaW4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMiwgNSwgMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1pblNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuVmFsdWVzSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWluKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDIsIDUsIDMpOwotICAgICAgICAgICAgYXJncy5FbGVtZW50QXQoMSkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkUmVzdWx0ID0gKDRkICsgMmQgKyA1ZCArIDJkKSAvIDRkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQsIDVkLCAyZCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0V2l0aEVudW1lcmFibGVBbmRCb29sTWVtYmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9ICg0ZCArIDJkICsgNWQgKyAyZCArIDFkKSAvIDVkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQpLCA1ZCwgMmQsIHRydWUpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlU2hvdWxkSWdub3JlSGlkZGVuRmllbGRzSWZJZ25vcmVIaWRkZW5WYWx1ZXNJc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRSZXN1bHQgPSAoNGQgKyAyZCArIDJkICsgMWQpIC8gNGQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCksIDVkLCAyZCwgdHJ1ZSk7Ci0gICAgICAgICAgICBhcmdzLkVsZW1lbnRBdCgxKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFJlc3VsdCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZVNob3VsZFRocm93RGl2QnlaZXJvRXhjZWxFcnJvclZhbHVlSWZFbXB0eUFyZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBlRXJyb3JUeXBlIGVycm9yVHlwZSA9IGVFcnJvclR5cGUuVmFsdWU7Ci0KLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2UoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEZ1bmN0aW9uQXJndW1lbnRbMF07Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnJvclR5cGUgPSBlLkVycm9yVmFsdWUuVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChlRXJyb3JUeXBlLkRpdjAsIGVycm9yVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUFTaG91bGRDYWxjdWxhdGVDb3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkUmVzdWx0ID0gKDRkICsgMmQgKyA1ZCArIDJkKSAvIDRkOwotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXZlcmFnZUEoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkLCA1ZCwgMmQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlQVNob3VsZEluY2x1ZGVUcnVlQXMxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkUmVzdWx0ID0gKDRkICsgMmQgKyA1ZCArIDJkICsgMWQpIC8gNWQ7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlQSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQsIDVkLCAyZCwgdHJ1ZSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUFTaG91bGRUaHJvd1ZhbHVlRXhjZXB0aW9uSWZOb25OdW1lcmljVGV4dElzU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdmVyYWdlQSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0ZCwgMmQsIDVkLCAyZCwgIkFCQyIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VBU2hvdWxkQ291bnRWYWx1ZUFzMElmTm9uTnVtZXJpY1RleHRJc1N1cHBsaWVkSW5BcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VBKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCAyZCwgM2QsICJBQkMiKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS41ZCxyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlQVNob3VsZENvdW50TnVtZXJpY1N0cmluZ1dpdGhWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEF2ZXJhZ2VBKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCwgIjkiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm91bmQoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMi4zNDMzLCAzKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLjM0M2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5OYnJPZkRlY2ltYWxzSXNOZWdhdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDkzMzMsIC0zKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5MDAwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRmxvb3JTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2hlblNpZ25pZmljYW5jZUlzQmV0d2VlbjBBbmQxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRmxvb3IoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjYuNzVkLCAwLjEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI2LjdkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGbG9vclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuU2lnbmlmaWNhbmNlSXMxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRmxvb3IoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMjYuNzVkLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyNmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZsb29yU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5TaWduaWZpY2FuY2VJc01pbnVzMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZsb29yKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKC0yNi43NWQsIC0xKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMjZkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5kU2hvdWxkUmV0dXJuQVZhbHVlQmV0d2VlbjBhbmQxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUmFuZCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgRnVuY3Rpb25Bcmd1bWVudFswXTsKLSAgICAgICAgICAgIHZhciByZXN1bHQxID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCgoZG91YmxlKXJlc3VsdDEuUmVzdWx0KSA+IDAgJiYgKChkb3VibGUpIHJlc3VsdDEuUmVzdWx0KSA8IDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdDIgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChyZXN1bHQxLlJlc3VsdCwgcmVzdWx0Mi5SZXN1bHQsICJUaGUgdHdvIG51bWJlcnMgd2VyZSB0aGUgc2FtZSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoKGRvdWJsZSlyZXN1bHQyLlJlc3VsdCkgPiAwICYmICgoZG91YmxlKXJlc3VsdDIuUmVzdWx0KSA8IDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJhbmRCZXR3ZWVuU2hvdWxkUmV0dXJuQW5JbnRlZ2VyVmFsdWVCZXR3ZWVuU3VwcGxpZWRWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSYW5kQmV0d2VlbigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCA1KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQ29udGFpbnMobmV3IExpc3Q8ZG91YmxlPiB7IDFkLCAyZCwgM2QsIDRkLCA1ZCB9LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5kQmV0d2VlblNob3VsZFJldHVybkFuSW50ZWdlclZhbHVlQmV0d2VlblN1cHBsaWVkVmFsdWVzV2hlbkxvd0lzTmVnYXRpdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSYW5kQmV0d2VlbigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtNSwgMCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkNvbnRhaW5zKG5ldyBMaXN0PGRvdWJsZT4geyAwZCwgLTFkLCAtMmQsIC0zZCwgLTRkLCAtNWQgfSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRTaG91bGRSZXR1cm5OdW1iZXJPZk51bWVyaWNJdGVtcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCAybSwgMywgbmV3IERhdGVUaW1lKDIwMTIsIDQsIDEpLCAiNCIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZEluY2x1ZGVOdW1lcmljU3RyaW5nc0FuZERhdGVzSW5BcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCAybSwgMywgbmV3IERhdGVUaW1lKDIwMTIsIDQsIDEpLCAiNCIpKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZEluY2x1ZGVFbnVtZXJhYmxlTWVtYmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMiwgMTMpKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuVmFsdWVzSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnQoKTsKLSAgICAgICAgICAgIGZ1bmMuSWdub3JlSGlkZGVuVmFsdWVzID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMWQsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEyLCAxMykpOwotICAgICAgICAgICAgYXJncy5FbGVtZW50QXQoMCkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZFJldHVybk51bWJlck9mTm9uV2hpdGVzcGFjZUl0ZW1zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRBKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCAybSwgMywgbmV3IERhdGVUaW1lKDIwMTIsIDQsIDEpLCAiNCIsIG51bGwsIHN0cmluZy5FbXB0eSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZEluY2x1ZGVFbnVtZXJhYmxlTWVtYmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50QSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxZCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTIsIDEzKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuVmFsdWVzSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ291bnRBKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMiwgMTMpKTsKLSAgICAgICAgICAgIGFyZ3MuRWxlbWVudEF0KDApLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudElmU2hvdWxkUmV0dXJuTmJyT2ZOdW1lcmljSXRlbXNUaGF0TWF0Y2goKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3VudElmKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDFkLCAyZCwgM2QpLCAiPjEiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZlNob3VsZFJldHVybk5ick9mQWxwaGFOdW1JdGVtc1RoYXRNYXRjaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvdW50SWYoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIk1vbmRheSIsICJUdWVzZGF5IiwgIlRodXJzZGF5IiksICJUKmRheSIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQcm9kdWN0U2hvdWxkTXVsdGlwbHlBcmd1bWVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBQcm9kdWN0KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDJkLCAyZCwgNGQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE2ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUHJvZHVjdFNob3VsZEhhbmRsZUVudW1lcmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBQcm9kdWN0KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDJkLCAyZCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQcm9kdWN0U2hvdWxkSWdub3JlSGlkZGVuVmFsdWVzSWZJZ25vcmVIaWRkZW5Jc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBQcm9kdWN0KCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDJkLCAyZCwgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNGQsIDJkKSk7Ci0gICAgICAgICAgICBhcmdzLkVsZW1lbnRBdCgxKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNmQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFByb2R1Y3RTaG91bGRIYW5kbGVGaXJzdEl0ZW1Jc0VudW1lcmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBQcm9kdWN0KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDRkLCAyZCksIDJkLCAyZCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzJkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWYXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVmFyKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMsIDQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuNjY2N2QsIFN5c3RlbS5NYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZhclNob3VsZElnbm9yZUhpZGRlblZhbHVlc0lmSWdub3JlSGlkZGVuSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVmFyKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMsIDQsIDkpOwotICAgICAgICAgICAgYXJncy5MYXN0KCkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS42NjY3ZCwgU3lzdGVtLk1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVmFyUFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBWYXJQKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMsIDQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEuMjVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWYXJQU2hvdWxkSWdub3JlSGlkZGVuVmFsdWVzSWZJZ25vcmVIaWRkZW5Jc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBWYXJQKCk7Ci0gICAgICAgICAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMsIDQsIDkpOwotICAgICAgICAgICAgYXJncy5MYXN0KCkuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS4yNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1vZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNb2QoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNSwgMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvc1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb3MoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMC40MTYxNDY4MzdkLCByb3VuZGVkUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3NIU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvc2goKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLjc2MjE5NTY5MSwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWNvc1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBY29zKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDAuMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjQ3MDYsIHJvdW5kZWRSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFDb3NIU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFjb3NoKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgMyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS4zMTcsIHJvdW5kZWRSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpblNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTaW4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA5KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjkwOTI5NzQyNywgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2luaFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTaW5oKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMy42MjY4NjA0MDhkLCByb3VuZGVkUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUYW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVGFuKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTIuMTg1MDM5ODYzZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGFuaFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUYW5oKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC45NjQwMjc1OGQsIHJvdW5kZWRSZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF0YW5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQXRhbigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSkgcmVzdWx0LlJlc3VsdCwgOSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS40NzExMjc2NzRkLCByb3VuZGVkUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdGFuMlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdGFuMigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMS4xMDcxNDg3MThkLCByb3VuZGVkUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdGFuaFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBdGFuaCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygwLjEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWRSZXN1bHQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgNCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4xMDAzZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9nU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvZygpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMzAxMDI5OTk2ZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9nU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhCYXNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTG9nKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsIDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb2cxMFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb2cxMCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMzAxMDI5OTk2ZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG5TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTG4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcm91bmRlZFJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA1KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjYwOTQ0ZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3FydFBpU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFNxcnRQaSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIHZhciByb3VuZGVkUmVzdWx0ID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIuNTA2NjI4Mjc1ZCwgcm91bmRlZFJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2lnblNob3VsZFJldHVybk1pbnVzMUlmQXJnSXNOZWdhdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFNpZ24oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoLTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpLlJlc3VsdDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMWQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2lnblNob3VsZFJldHVybjFJZkFyZ0lzUG9zaXRpdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTaWduKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpLlJlc3VsdDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZGRvd25TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0V2l0aFBvc2l0aXZlTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm91bmRkb3duKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDkuOTk5LCAyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5Ljk5LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZGRvd25TaG91bGRIYW5kbGVOZWdhdGl2ZU51bWJlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kZG93bigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtOS45OTksIDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC05Ljk5LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZGRvd25TaG91bGRIYW5kbGVOZWdhdGl2ZU51bURpZ2l0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kZG93bigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OTkuOTk5LCAtMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTAwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmRkb3duU2hvdWxkUmV0dXJuMElmTmVnYXRpdmVOdW1EaWdpdHNJc1Rvb0xhcmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm91bmRkb3duKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDk5OS45OTksIC00KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmRkb3duU2hvdWxkSGFuZGxlWmVyb051bURpZ2l0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kZG93bigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OTkuOTk5LCAwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5OTlkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZHVwU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhQb3NpdGl2ZU51bWJlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJvdW5kdXAoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOS45OTExLCAzKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5Ljk5MiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmR1cFNob3VsZEhhbmRsZU5lZ2F0aXZlTnVtRGlnaXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm91bmR1cCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OTEyMywgLTIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDk5MjAwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmR1cFNob3VsZEhhbmRsZVplcm9OdW1EaWdpdHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3VuZHVwKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDk5OS45OTksIDApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUcnVuY1Nob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUcnVuYygpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg5OS45OSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOTlkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGYWN0U2hvdWxkUm91bmREb3duQW5kUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEZhY3QoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNS45OSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mIChFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgRmFjdFNob3VsZFRocm93V2hlbk5lZ2F0aXZlTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRmFjdCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMSk7Ci0gICAgICAgICAgICBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBRdW90aWVudFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBRdW90aWVudCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg1LCAyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFF1b3RpZW50U2hvdWxkVGhyb3dXaGVuRGVub21JczAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBRdW90aWVudCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAwKTsKLSAgICAgICAgICAgIGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExhcmdlU2hvdWxkUmV0dXJuVGhlTGFyZ2VzdE51bWJlcklmMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExhcmdlKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMpLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTGFyZ2VTaG91bGRSZXR1cm5UaGVTZWNvbmRMYXJnZXN0TnVtYmVySWYyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTGFyZ2UoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMSwgMiwgMyksIDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIExhcmdlU2hvdWxkVGhyb3dJZkluZGV4T3V0T2ZCb3VuZHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMYXJnZSgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyhGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAxLCAyLCAzKSwgNik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU21hbGxTaG91bGRSZXR1cm5UaGVTbWFsbGVzdE51bWJlcklmMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFNtYWxsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDMpLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU21hbGxTaG91bGRSZXR1cm5UaGVTZWNvbmRTbWFsbGVzdE51bWJlcklmMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFNtYWxsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDEsIDIsIDMpLCAyKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBTbWFsbFNob3VsZFRocm93SWZJbmRleE91dE9mQm91bmRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU21hbGwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgMSwgMiwgMyksIDYpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgTWVkaWFuU2hvdWxkVGhyb3dJZk5vQXJncygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1lZGlhbigpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuRW1wdHkoKTsKLSAgICAgICAgICAgIGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lZGlhblNob3VsZENhbGN1bGF0ZUNvcnJlY3RseVdpdGhPbmVNZW1iZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNZWRpYW4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lZGlhblNob3VsZENhbGN1bGF0ZUNvcnJlY3RseVdpdGhPZGRNZW1iZXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWVkaWFuKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsIDUsIDEsIDQsIDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNZWRpYW5TaG91bGRDYWxjdWxhdGVDb3JyZWN0bHlXaXRoRXZlbk1lbWJlcnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNZWRpYW4oKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMiwgMywgNCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMi41ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9OdW1iZXJGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL051bWJlckZ1bmN0aW9uc1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ2ODgyLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL051bWJlckZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTnVtZXJpYzsKLXVzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIE51bWJlckZ1bmN0aW9uc1Rlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDSW50U2hvdWxkQ29udmVydFRleHRUb0ludGVnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDSW50KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIyIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSW50U2hvdWxkQ29udmVydERlY2ltYWxUb0ludGVnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDSW50KCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIuODhtKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnRTaG91bGRDb252ZXJ0TmVnYXRpdmVEZWNpbWFsVG9JbnRlZ2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ0ludCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygtMi44OG0pOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0zLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnRTaG91bGRDb252ZXJ0U3RyaW5nVG9JbnRlZ2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ0ludCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiLTIuODgiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMywgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYmQ5MjguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0Nob29zZVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDaG9vc2VUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOwotICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENob29zZVNpbmdsZVZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbENob29zZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJDSE9PU0UoNCwgQTEsIEEyLCBBMywgQTQsIEE1KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjUiLCBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDaG9vc2VTaW5nbGVGb3JtdWxhKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbENob29zZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJDSE9PU0UoNiwgQTEsIEEyLCBBMywgQTQsIEE1LCBBNikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxMiIsIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENob29zZU11bHRpcGxlVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbENob29zZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJTVU0oQ0hPT1NFKHsxLDMsNH0sIEExLCBBMiwgQTMsIEE0LCBBNSkpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5RCwgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2hvb3NlVmFsdWVBbmRGb3JtdWxhKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsbENob29zZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJTVU0oQ0hPT1NFKHsyLDZ9LCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KSkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE0RCwgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZmlsbENob29zZU9wdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gM2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gN2Q7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQTQgKyBBNSI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kZXhUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleFRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAzZWVmLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleFRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBJbmRleFRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpOwotICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbmRleF9TaG91bGRfUmV0dXJuX1ZhbHVlX0J5X0luZGV4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSW5kZXgoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoCi0gICAgICAgICAgICAgICAgRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoCi0gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIDUpLAotICAgICAgICAgICAgICAgICAgICAzCi0gICAgICAgICAgICAgICAgICAgICksX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbmRleF9TaG91bGRfSGFuZGxlX1NpbmdsZVJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDNkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDVkOwotCi0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiSU5ERVgoQTE6QTM7MykiOwotCi0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvckZhY3RvcnlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JGYWN0b3J5VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWRlY2MuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvckZhY3RvcnlUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIExvb2t1cE5hdmlnYXRvckZhY3RvcnlUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX2V4Y2VsUGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfY29udGV4dDsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpOwotICAgICAgICAgICAgX2V4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgX2NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIF9jb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gbmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9leGNlbFBhY2thZ2UpOwotICAgICAgICAgICAgX2NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxQYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRfUmV0dXJuX0V4Y2VsTG9va3VwTmF2aWdhdG9yX1doZW5fUmFuZ2VfSXNfU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDgsICJBOkIiLCAxKSk7Ci0gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwsIGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKG5hdmlnYXRvciwgdHlwZW9mKEV4Y2VsTG9va3VwTmF2aWdhdG9yKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkX1JldHVybl9BcnJheUxvb2t1cE5hdmlnYXRvcl9XaGVuX0FycmF5X0lzX1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDgsIEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsMiksIDEpKTsKLSAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uSG9yaXpvbnRhbCwgYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUobmF2aWdhdG9yLCB0eXBlb2YoQXJyYXlMb29rdXBOYXZpZ2F0b3IpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlZTA1Yi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7Ci11c2luZyBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLlRlc3RIZWxwZXJzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBMb29rdXBOYXZpZ2F0b3JUZXN0cwotICAgIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nIFdvcmtzaGVldE5hbWUgPSAiIjsKLSAgICAgICAgcHJpdmF0ZSBMb29rdXBBcmd1bWVudHMgR2V0QXJncyhwYXJhbXMgb2JqZWN0W10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxBcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoYXJncyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvb2t1cEFyZ3VtZW50cyhsQXJncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFBhcnNpbmdDb250ZXh0IEdldENvbnRleHQoRXhjZWxEYXRhUHJvdmlkZXIgcHJvdmlkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjdHggPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIGN0eC5TY29wZXMuTmV3U2NvcGUobmV3IFJhbmdlQWRkcmVzcygpe1dvcmtzaGVldCA9IFdvcmtzaGVldE5hbWUsIEZyb21Db2wgPSAxLCBGcm9tUm93ID0gMX0pOwotICAgICAgICAgICAgY3R4LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICByZXR1cm4gY3R4OwotICAgICAgICB9Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBOYXZpZ2F0b3JTaG91bGRFdmFsdWF0ZUZvcm11bGEoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAvLyAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwwLCAwKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoMyk7Ci0gICAgICAgIC8vICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDApKS5SZXR1cm4oIkI1Iik7Ci0gICAgICAgIC8vICAgIHZhciBhcmdzID0gR2V0QXJncyg0LCAiQTE6QjIiLCAxKTsKLSAgICAgICAgLy8gICAgdmFyIGNvbnRleHQgPSBHZXRDb250ZXh0KHByb3ZpZGVyKTsKLSAgICAgICAgLy8gICAgdmFyIHBhcnNlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlTW9jazxGb3JtdWxhUGFyc2VyPihwcm92aWRlcik7Ci0gICAgICAgIC8vICAgIGNvbnRleHQuUGFyc2VyID0gcGFyc2VyOwotICAgICAgICAvLyAgICB2YXIgbmF2aWdhdG9yID0gbmV3IExvb2t1cE5hdmlnYXRvcihMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGFyZ3MsIGNvbnRleHQpOwotICAgICAgICAvLyAgICBuYXZpZ2F0b3IuTW92ZU5leHQoKTsKLSAgICAgICAgLy8gICAgcGFyc2VyLkFzc2VydFdhc0NhbGxlZCh4ID0+IHguUGFyc2UoIkI1IikpOwotICAgICAgICAvL30KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3VycmVudFZhbHVlU2hvdWxkQmVGaXJzdENlbGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybig0KTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gR2V0QXJncygzLCAiQTE6QjIiLCAxKTsKLSAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGFyZ3MsIEdldENvbnRleHQocHJvdmlkZXIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBuYXZpZ2F0b3IuQ3VycmVudFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNb3ZlTmV4dFNob3VsZFJldHVybkZhbHNlSWZMYXN0Q2VsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDQpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDMsICJBMTpCMSIsIDEpOwotICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobmF2aWdhdG9yLk1vdmVOZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEhhc05leHRTaG91bGRCZVRydWVJZk5vdExhc3RDZWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDQpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDMsICJBMTpCMiIsIDEpOwotICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShuYXZpZ2F0b3IuTW92ZU5leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTW92ZU5leHRTaG91bGROYXZpZ2F0ZVZlcnRpY2FsbHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybig0KTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gR2V0QXJncyg2LCAiQTE6QjIiLCAxKTsKLSAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGFyZ3MsIEdldENvbnRleHQocHJvdmlkZXIpKTsKLSAgICAgICAgICAgIG5hdmlnYXRvci5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIG5hdmlnYXRvci5DdXJyZW50VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1vdmVOZXh0U2hvdWxkSW5jcmVhc2VJbmRleCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldERpbWVuc2lvbkVuZChBcmc8c3RyaW5nPi5Jcy5Bbnl0aGluZykpLlJldHVybihuZXcgRXhjZWxDZWxsQWRkcmVzcyg1LCA1KSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMSkpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAyKSkuUmV0dXJuKDQpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBHZXRBcmdzKDYsICJBMTpCMiIsIDEpOwotICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgYXJncywgR2V0Q29udGV4dChwcm92aWRlcikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG5hdmlnYXRvci5JbmRleCk7Ci0gICAgICAgICAgICBuYXZpZ2F0b3IuTW92ZU5leHQoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBuYXZpZ2F0b3IuSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldExvb2t1cFZhbHVlU2hvdWxkUmV0dXJuQ29ycmVzcG9uZGluZ1ZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDIpKS5SZXR1cm4oNCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEdldEFyZ3MoNiwgIkExOkIyIiwgMik7Ci0gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsLCBhcmdzLCBHZXRDb250ZXh0KHByb3ZpZGVyKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgbmF2aWdhdG9yLkdldExvb2t1cFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldExvb2t1cFZhbHVlU2hvdWxkUmV0dXJuQ29ycmVzcG9uZGluZ1ZhbHVlV2l0aE9mZnNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldERpbWVuc2lvbkVuZChBcmc8c3RyaW5nPi5Jcy5Bbnl0aGluZykpLlJldHVybihuZXcgRXhjZWxDZWxsQWRkcmVzcyg1LCA1KSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMSkpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAzLCAzKSkuUmV0dXJuKDQpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKDMsICJBMTpBNCIsIDMsIDIsIGZhbHNlKTsKLSAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShMb29rdXBEaXJlY3Rpb24uVmVydGljYWwsIGFyZ3MsIEdldENvbnRleHQocHJvdmlkZXIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBuYXZpZ2F0b3IuR2V0TG9va3VwVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvUmVmQW5kTG9va3VwVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvUmVmQW5kTG9va3VwVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMWU2NGMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1JlZkFuZExvb2t1cFRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5UZXN0SGVscGVyczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci11c2luZyBBZGRyZXNzRnVuY3Rpb24gPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAuQWRkcmVzczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUmVmQW5kTG9va3VwVGVzdHMKLSAgICB7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBXb3Jrc2hlZXROYW1lID0gbnVsbDsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cEFyZ3VtZW50c1Nob3VsZFNldFNlYXJjaGVkVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsICJBOkIiLCAyKTsKLSAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmdzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBsb29rdXBBcmdzLlNlYXJjaGVkVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cEFyZ3VtZW50c1Nob3VsZFNldFJhbmdlQWRkcmVzcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgIkE6QiIsIDIpOwotICAgICAgICAgICAgdmFyIGxvb2t1cEFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKGFyZ3MpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBOkIiLCBsb29rdXBBcmdzLlJhbmdlQWRkcmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9va3VwQXJndW1lbnRzU2hvdWxkU2V0Q29sSW5kZXgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsICJBOkIiLCAyKTsKLSAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmdzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBsb29rdXBBcmdzLkxvb2t1cEluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBBcmd1bWVudHNTaG91bGRTZXRSYW5nZUxvb2t1cFRvVHJ1ZUFzRGVmYXVsdFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQTpCIiwgMik7Ci0gICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJncyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxvb2t1cEFyZ3MuUmFuZ2VMb29rdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cEFyZ3VtZW50c1Nob3VsZFNldFJhbmdlTG9va3VwVG9UcnVlV2hlblRydWVJc1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQTpCIiwgMiwgdHJ1ZSk7Ci0gICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJncyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxvb2t1cEFyZ3MuUmFuZ2VMb29rdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZMb29rdXBTaG91bGRSZXR1cm5SZXN1bHRGcm9tTWF0Y2hpbmdSb3coKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBWTG9va3VwKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDIsICJBMTpCMiIsIDIpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oMSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKDIpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMikpLlJldHVybig1KTsKLQotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZMb29rdXBTaG91bGRSZXR1cm5DbG9zZXN0VmFsdWVCZWxvd1doZW5SYW5nZUxvb2t1cElzVHJ1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFZMb29rdXAoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgIkExOkIyIiwgMiwgdHJ1ZSk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotCi0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigxKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDEpKS5SZXR1cm4oNSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKDQpOwotCi0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVkxvb2t1cFNob3VsZFJldHVybkNsb3Nlc3RTdHJpbmdWYWx1ZUJlbG93V2hlblJhbmdlTG9va3VwSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgVkxvb2t1cCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiQiIsICJBMTpCMiIsIDIsIHRydWUpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgLy9wcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwwLCAwKSkuUmV0dXJuKG5ldyBFeGNlbENlbGwoIkEiLCBudWxsLCAwLCAwKSk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDAsIDEpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgxLCBudWxsLCAwLCAwKSk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDApKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgiQyIsIG51bGwsIDAsIDApKTsKLSAgICAgICAgICAgIC8vcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybihuZXcgRXhjZWxDZWxsKDQsIG51bGwsIDAsIDApKTsKLQotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDEpKS5SZXR1cm4oIkEiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAyKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDIsIDEpKS5SZXR1cm4oIkMiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAyKSkuUmV0dXJuKDQpOwotCi0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSExvb2t1cFNob3VsZFJldHVyblJlc3VsdEZyb21NYXRjaGluZ1JvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEhMb29rdXAoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgIkExOkIyIiwgMik7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotCi0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDAsIDApKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgzLCBudWxsLCAwLCAwKSk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDAsIDEpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgxLCBudWxsLCAwLCAwKSk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDApKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCgyLCBudWxsLCAwLCAwKSk7Ci0gICAgICAgICAgICAvL3Byb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4obmV3IEV4Y2VsQ2VsbCg1LCBudWxsLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAxKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDIpKS5SZXR1cm4oMSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMiwgMSkpLlJldHVybigyKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAyKSkuUmV0dXJuKDUpOwotCi0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSExvb2t1cFNob3VsZFJldHVybk5hRXJyb3JJZk5vTWF0Y2hpbmdSZWNvcmRJc0ZvdW5kV2hlblJhbmdlTG9va3VwSXNGYWxzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEhMb29rdXAoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgIkExOkIyIiwgMiwgZmFsc2UpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotCi0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMSkpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAxLCAyKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDIsIDEpKS5SZXR1cm4oMik7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMiwgMikpLlJldHVybig1KTsKLQotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgdmFyIGV4cGVjdGVkUmVzdWx0ID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFJlc3VsdCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBITG9va3VwU2hvdWxkVGhyb3dJZk5vTWF0Y2hpbmdSZWNvcmRJc0ZvdW5kV2hlblJhbmdlTG9va3VwSXNUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgSExvb2t1cCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiQTE6QjIiLCAyLCB0cnVlKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0KLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLQotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDEsIDEpKS5SZXR1cm4oMik7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwgMSwgMikpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLCAyLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsIDIsIDIpKS5SZXR1cm4oNSk7Ci0KLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBTaG91bGRSZXR1cm5SZXN1bHRGcm9tTWF0Y2hpbmdSb3dBcnJheVZlcnRpY2FsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTG9va3VwKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsICJBMTpCMyIsIDIpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oIkEiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDEpKS5SZXR1cm4oMyk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKCJCIik7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAxKSkuUmV0dXJuKDUpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMywgMikpLlJldHVybigiQyIpOwotCi0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkIiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb29rdXBTaG91bGRSZXR1cm5SZXN1bHRGcm9tTWF0Y2hpbmdSb3dBcnJheUhvcml6b250YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMb29rdXAoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNCwgIkExOkMyIiwgMik7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotCi0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAxKSkuUmV0dXJuKCJBIik7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKCJCIik7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAzKSkuUmV0dXJuKCJDIik7Ci0KLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQiIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvb2t1cFNob3VsZFJldHVyblJlc3VsdEZyb21NYXRjaGluZ1NlY29uZEFycmF5SG9yaXpvbnRhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvb2t1cCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAiQTE6QzEiLCAiQTM6QzMiKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0KLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMykpLlJldHVybig1KTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDEpKS5SZXR1cm4oIkEiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDIpKS5SZXR1cm4oIkIiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDMpKS5SZXR1cm4oIkMiKTsKLQotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9va3VwU2hvdWxkUmV0dXJuUmVzdWx0RnJvbU1hdGNoaW5nU2Vjb25kQXJyYXlIb3Jpem9udGFsV2l0aE9mZnNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvb2t1cCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAiQTE6QzEiLCAiQjM6RDMiKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0KLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMykpLlJldHVybig1KTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDIpKS5SZXR1cm4oIkEiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDMpKS5SZXR1cm4oIkIiKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDMsIDQpKS5SZXR1cm4oIkMiKTsKLQotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF0Y2hTaG91bGRSZXR1cm5JbmRleE9mTWF0Y2hpbmdWYWxIb3Jpem9udGFsX01hdGNoVHlwZUV4YWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMywgIkExOkMxIiwgMCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotCi0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybigzKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDMpKS5SZXR1cm4oNSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF0Y2hTaG91bGRSZXR1cm5JbmRleE9mTWF0Y2hpbmdWYWxWZXJ0aWNhbF9NYXRjaFR5cGVFeGFjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDMsICJBMTpBMyIsIDApOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDIsIDEpKS5SZXR1cm4oMyk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwzLCAxKSkuUmV0dXJuKDUpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hdGNoU2hvdWxkUmV0dXJuSW5kZXhPZk1hdGNoaW5nVmFsSG9yaXpvbnRhbF9NYXRjaFR5cGVDbG9zZXN0QmVsb3coKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNYXRjaCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg0LCAiQTE6QzEiLCAxKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0KLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMSk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMykpLlJldHVybig1KTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFNob3VsZFJldHVybkluZGV4T2ZNYXRjaGluZ1ZhbEhvcml6b250YWxfTWF0Y2hUeXBlQ2xvc2VzdEFib3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgTWF0Y2goKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoNiwgIkExOkMxIiwgLTEpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMSkpLlJldHVybigxMCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAyKSkuUmV0dXJuKDgpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMykpLlJldHVybig1KTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFNob3VsZFJldHVybkZpcnN0SXRlbVdoZW5FeGFjdE1hdGNoX01hdGNoVHlwZUNsb3Nlc3RBYm92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwLCAiQTE6QzEiLCAtMSk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotCi0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDEwKTsKLSAgICAgICAgICAgIHByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oOCk7Ci0gICAgICAgICAgICBwcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAzKSkuUmV0dXJuKDUpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvd1Nob3VsZFJldHVyblJvd0Zyb21DdXJyZW50U2NvcGVJZk5vQWRkcmVzc0lzU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBSb3coKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCkpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKCJBMiIpKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRW51bWVyYWJsZS5FbXB0eTxGdW5jdGlvbkFyZ3VtZW50PigpLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm93U2hvdWxkUmV0dXJuUm93U3VwcGxpZWRBZGRyZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm93KCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiQTMiKSwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbHVtblNob3VsZFJldHVyblJvd0Zyb21DdXJyZW50U2NvcGVJZk5vQWRkcmVzc0lzU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb2x1bW4oKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCkpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKCJCMiIpKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRW51bWVyYWJsZS5FbXB0eTxGdW5jdGlvbkFyZ3VtZW50PigpLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uU2hvdWxkUmV0dXJuUm93U3VwcGxpZWRBZGRyZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ29sdW1uKCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiRTMiKSwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvd3NTaG91bGRSZXR1cm5OYnJPZlJvd3NTdXBwbGllZFJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm93cygpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkExOkIzIiksIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3dzU2hvdWxkUmV0dXJuTmJyT2ZSb3dzRm9yRW50aXJlQ29sdW1uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUm93cygpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkE6QiIpLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTA0ODU3NiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uc3NTaG91bGRSZXR1cm5OYnJPZlJvd3NTdXBwbGllZFJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQ29sdW1ucygpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIkExOkUzIiksIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDaG9vc2VTaG91bGRSZXR1cm5JdGVtQnlJbmRleCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENob29zZSgpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsICJBIiwgIkIiKSwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzc1Nob3VsZFJldHVybkFkZHJlc3NCeUluZGV4V2l0aERlZmF1bHRSZWZUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgQWRkcmVzc0Z1bmN0aW9uKCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguRXhjZWxNYXhSb3dzKS5SZXR1cm4oMTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAyKSwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIkQiQxIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzc1Nob3VsZFJldHVybkFkZHJlc3NCeUluZGV4V2l0aFJlbGF0aXZlVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFkZHJlc3NGdW5jdGlvbigpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMiwgKGludClFeGNlbFJlZmVyZW5jZVR5cGUuUmVsYXRpdmVSb3dBbmRDb2x1bW4pLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkIxIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzc1Nob3VsZFJldHVybkFkZHJlc3NCeVdpdGhTcGVjaWZpZWRXb3Jrc2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBBZGRyZXNzRnVuY3Rpb24oKTsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybigxMCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDIsIChpbnQpRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uLCB0cnVlLCAiV29ya3NoZWV0MSIpLCBwYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIldvcmtzaGVldDEhQjEiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBBZGRyZXNzU2hvdWxkVGhyb3dJZlIxQzFGb3JtYXRJc1NwZWNpZmllZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEFkZHJlc3NGdW5jdGlvbigpOwotICAgICAgICAgICAgdmFyIHBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMSwgMiwgKGludClFeGNlbFJlZmVyZW5jZVR5cGUuUmVsYXRpdmVSb3dBbmRDb2x1bW4sIGZhbHNlKSwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1N1YnRvdGFsVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YTQxOWMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgU3VidG90YWxUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCBfY29udGV4dDsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIF9jb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dJZkludmFsaWRGdW5jTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTM5LCAxKTsKLSAgICAgICAgICAgIGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlQXZlcmFnZVdoZW5DYWxjVHlwZUlzMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEsIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZUNvdW50V2hlbkNhbGNUeXBlSXMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMiwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDVkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVDb3VudEFXaGVuQ2FsY1R5cGVJczMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygzLCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1heFdoZW5DYWxjVHlwZUlzNCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDQsIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1pbldoZW5DYWxjVHlwZUlzNSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDUsIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVByb2R1Y3RXaGVuQ2FsY1R5cGVJczYoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncyg2LCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwMDAwMDBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVTdGRldldoZW5DYWxjVHlwZUlzNygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDcsIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIHZhciByZXN1bHRSb3VuZGVkID0gTWF0aC5Sb3VuZCgoZG91YmxlKXJlc3VsdC5SZXN1bHQsIDUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE1LjgxMTM5ZCwgcmVzdWx0Um91bmRlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlU3RkZXZQV2hlbkNhbGNUeXBlSXM4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoOCwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdFJvdW5kZWQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LlJlc3VsdCwgOCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTQuMTQyMTM1NjIsIHJlc3VsdFJvdW5kZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVN1bVdoZW5DYWxjVHlwZUlzOSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDksIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNTBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJXaGVuQ2FsY1R5cGVJczEwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAsIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyNTBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJQV2hlbkNhbGNUeXBlSXMxMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExLCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlQXZlcmFnZVdoZW5DYWxjVHlwZUlzMTAxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAxLCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVDb3VudFdoZW5DYWxjVHlwZUlzMTAyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAyLCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZUNvdW50QVdoZW5DYWxjVHlwZUlzMTAzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTAzLCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNWQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZU1heFdoZW5DYWxjVHlwZUlzMTA0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA0LCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVNaW5XaGVuQ2FsY1R5cGVJczEwNSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEwNSwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlUHJvZHVjdFdoZW5DYWxjVHlwZUlzMTA2KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA2LCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwMDAwMDBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVTdGRldldoZW5DYWxjVHlwZUlzMTA3KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA3LCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0Um91bmRlZCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA1KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNS44MTEzOWQsIHJlc3VsdFJvdW5kZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVN0ZGV2UFdoZW5DYWxjVHlwZUlzMTA4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoMTA4LCAxMCwgMjAsIDMwLCA0MCwgNTApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShhcmdzLCBfY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0Um91bmRlZCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQuUmVzdWx0LCA4KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNC4xNDIxMzU2MiwgcmVzdWx0Um91bmRlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlU3VtV2hlbkNhbGNUeXBlSXMxMDkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBTdWJ0b3RhbCgpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxMDksIDEwLCAyMCwgMzAsIDQwLCA1MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKGFyZ3MsIF9jb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNTBkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWxjdWxhdGVWYXJXaGVuQ2FsY1R5cGVJczExMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExMCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA1MSk7Ci0gICAgICAgICAgICBhcmdzLkxhc3QoKS5TZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI1MGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVZhclBXaGVuQ2FsY1R5cGVJczExMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFN1YnRvdGFsKCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDExMSwgMTAsIDIwLCAzMCwgNDAsIDUwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoYXJncywgX2NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIwMGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvU3VtSWZzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9TdW1JZnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViZjhjMC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9TdW1JZnNUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFN1bUlmc1Rlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfc2hlZXQ7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHMxID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHMxLkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIHMxLkNlbGxzWyJBMyJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIHMxLkNlbGxzWyJBNCJdLlZhbHVlID0gNDsKLQotICAgICAgICAgICAgczEuQ2VsbHNbIkIxIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgczEuQ2VsbHNbIkIyIl0uVmFsdWUgPSA2OwotICAgICAgICAgICAgczEuQ2VsbHNbIkIzIl0uVmFsdWUgPSA3OwotICAgICAgICAgICAgczEuQ2VsbHNbIkI0Il0uVmFsdWUgPSA4OwotCi0gICAgICAgICAgICBzMS5DZWxsc1siQzEiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICBzMS5DZWxsc1siQzIiXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICBzMS5DZWxsc1siQzMiXS5WYWx1ZSA9IDc7Ci0gICAgICAgICAgICBzMS5DZWxsc1siQzQiXS5WYWx1ZSA9IDg7Ci0KLSAgICAgICAgICAgIF9zaGVldCA9IHMxOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZVR3b0NyaXRlcmlhUmFuZ2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiU1VNSUZTKEExOkE0O0IxOkI1O1wiPjVcIjtDMTpDNTtcIj40XCIpIjsKLSAgICAgICAgICAgIF9zaGVldC5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDlkLCBfc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZElnbm9yZUVycm9ySW5Dcml0ZXJpYVJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLkRpdjApOwotCi0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU1JRlMoQTE6QTQ7QjE6QjU7XCI+NVwiO0MxOkM1O1wiPjRcIikiOwotICAgICAgICAgICAgX3NoZWV0LkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNmQsIF9zaGVldC5DZWxsc1siQTUiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlRGF0ZUluU3VtUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJEQVRFKDIwMTU7MTsxKSI7Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU1JRlMoQTE6QTQ7QjE6QjU7XCI+NVwiO0MxOkM1O1wiPjRcIikiOwotICAgICAgICAgICAgX3NoZWV0LkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDIwMTJkLCBfc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZUV4Y2VsUmFuZ2VzSW5Dcml0ZXJpYSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICBfc2hlZXQuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU1JRlMoQTE6QTQ7QjE6QjU7XCI+NVwiO0MxOkM1O0QxKSI7Ci0gICAgICAgICAgICBfc2hlZXQuQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgX3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHRGdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHRGdW5jdGlvbnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1YmQyYy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0RnVuY3Rpb25zVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKLXVzaW5nIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBUZXh0RnVuY3Rpb25zVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENTdHJTaG91bGRDb252ZXJ0TnVtYmVyVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDU3RyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKDEpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKERhdGFUeXBlLlN0cmluZywgcmVzdWx0LkRhdGFUeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMSIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExlblNob3VsZFJldHVyblN0cmluZ3NMZW5ndGgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBMZW4oKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiYyIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb3dlclNob3VsZFJldHVybkxvd2VyQ2FzZVN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExvd2VyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJBQkMiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWJjIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVXBwZXJTaG91bGRSZXR1cm5VcHBlckNhc2VTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBVcHBlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiYWJjIiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkFCQyIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExlZnRTaG91bGRSZXR1cm5TdWJzdHJpbmdGcm9tTGVmdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IExlZnQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiY2QiLCAyKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWIiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSaWdodFNob3VsZFJldHVyblN1YnN0cmluZ0Zyb21SaWdodCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJpZ2h0KCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJhYmNkIiwgMiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImNkIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWlkU2hvdWxkUmV0dXJuU3Vic3RyaW5nQWNjb3JkaW5nVG9QYXJhbXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBNaWQoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiY2QiLCAxLCAyKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWIiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZXBsYWNlU2hvdWxkUmV0dXJuQVJlcGxhY2VkU3RyaW5nQWNjb3JkaW5nVG9QYXJhbXNXaGVuU3RhcnRJeElzMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IFJlcGxhY2UoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoInRlc3RhciIsIDEsIDIsICJoZWoiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGVqc3RhciIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcGxhY2VTaG91bGRSZXR1cm5BUmVwbGFjZWRTdHJpbmdBY2NvcmRpbmdUb1BhcmFtc1doZW5TdGFydEl4SXMzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUmVwbGFjZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygidGVzdGFyIiwgMywgMywgImhlaiIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0ZWhlanIiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJzdGl0dXRlU2hvdWxkUmV0dXJuQVJlcGxhY2VkU3RyaW5nQWNjb3JkaW5nVG9QYXJhbXNXaGVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgU3Vic3RpdHV0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygidGVzdGFyIHRlc3RhciIsICJlcyIsICJ4eCIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0eHh0YXIgdHh4dGFyIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29uY2F0ZW5hdGVTaG91bGRDb25jYXRlbmF0ZVRocmVlU3RyaW5ncygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IENvbmNhdGVuYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJPbmUiLCAiVHdvIiwgIlRocmVlIiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIk9uZVR3b1RocmVlIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29uY2F0ZW5hdGVTaG91bGRDb25jYXRlbmF0ZVN0cmluZ1dpdGhJbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBDb25jYXRlbmF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygxLCAiVHdvIiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjFUd28iLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGFjdFNob3VsZFJldHVyblRydWVXaGVuVHdvRXF1YWxTdHJpbmdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRXhhY3QoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiYyIsICJhYmMiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXhhY3RTaG91bGRSZXR1cm5UcnVlV2hlbkVxdWFsU3RyaW5nQW5kRG91YmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRXhhY3QoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoIjEiLCAxZCksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4YWN0U2hvdWxkUmV0dXJuRmFsc2VXaGVuU3RyaW5nQW5kTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEV4YWN0KCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCIxIiwgbnVsbCksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGFjdFNob3VsZFJldHVybkZhbHNlV2hlblR3b0VxdWFsU3RyaW5nc1dpdGhEaWZmZXJlbnRDYXNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRXhhY3QoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImFiYyIsICJBYmMiKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpbmRTaG91bGRSZXR1cm5JbmRleE9mRm91bmRQaHJhc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBGaW5kKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJob3BwIiwgImhlaiBob3BwIiksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRmluZFNob3VsZFJldHVybkluZGV4T2ZGb3VuZFBocmFzZUJhc2VkT25TdGFydEluZGV4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRmluZCgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiaG9wcCIsICJob3BwIGhvcHAiLCAyKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2LCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQcm9wZXJTaG91bGRTZXRGaXJzdExldHRlclRvVXBwZXJDYXNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgUHJvcGVyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5FeGVjdXRlKEZ1bmN0aW9uc0hlbHBlci5DcmVhdGVBcmdzKCJ0aGlzIElTIEEgdEVzdC53aTN0aCBTT01FIHcwcmRzIMO2c3RFciIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUaGlzIElzIEEgVGVzdC5XaTNUaCBTb21lIFcwUmRzIMOWc3RlciIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEh5cGVyTGlua1Nob3VsZFJldHVybkFyZ0lmT25lQXJnSXNTdXBwbGllZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jID0gbmV3IEh5cGVybGluaygpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuRXhlY3V0ZShGdW5jdGlvbnNIZWxwZXIuQ3JlYXRlQXJncygiaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20iKSwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20iLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBIeXBlckxpbmtTaG91bGRSZXR1cm5MYXN0QXJnSWZUd29BcmdzQXJlU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBIeXBlcmxpbmsoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLkV4ZWN1dGUoRnVuY3Rpb25zSGVscGVyLkNyZWF0ZUFyZ3MoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIiwgIkVQUGx1cyIpLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJFUFBsdXMiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RpbWVTdHJpbmdQYXJzZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RpbWVTdHJpbmdQYXJzZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxM2ZjZS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UaW1lU3RyaW5nUGFyc2VyVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBUaW1lU3RyaW5nUGFyc2VyVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZG91YmxlIEdldFNlcmlhbE51bWJlcihpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlY29uZHNJbkFEYXkgPSAyNGQgKiA2MGQgKiA2MGQ7Ci0gICAgICAgICAgICByZXR1cm4gKChkb3VibGUpaG91ciAqIDYwICogNjAgKyAoZG91YmxlKW1pbnV0ZSAqIDYwICsgKGRvdWJsZSlzZWNvbmQpIC8gc2Vjb25kc0luQURheTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDYW5QYXJzZVNob3VsZEhhbmRsZVZhbGlkMjRIb3VyUGF0dGVybnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCIxMDoxMjo1NSIpLCAiQ291bGQgbm90IHBhcnNlIDEwOjEyOjU1Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiMjI6MTI6NTUiKSwgIkNvdWxkIG5vdCBwYXJzZSAxMzoxMjo1NSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYXJzZXIuQ2FuUGFyc2UoIjEzIiksICJDb3VsZCBub3QgcGFyc2UgMTMiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCIxMzoxMiIpLCAiQ291bGQgbm90IHBhcnNlIDEzOjEyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FuUGFyc2VTaG91bGRIYW5kbGVWYWxpZDEySG91clBhdHRlcm5zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBUaW1lU3RyaW5nUGFyc2VyKCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiMTA6MTI6NTUgQU0iKSwgIkNvdWxkIG5vdCBwYXJzZSAxMDoxMjo1NSBBTSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShwYXJzZXIuQ2FuUGFyc2UoIjk6MTI6NTUgUE0iKSwgIkNvdWxkIG5vdCBwYXJzZSA5OjEyOjU1IFBNIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHBhcnNlci5DYW5QYXJzZSgiNyBBTSIpLCAiQ291bGQgbm90IHBhcnNlIDcgQU0iKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFyc2VyLkNhblBhcnNlKCI0OjEyIFBNIiksICJDb3VsZCBub3QgcGFyc2UgNDoxMiBQTSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkSWRlbnRpZnlQYXR0ZXJuQW5kUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgVGltZVN0cmluZ1BhcnNlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZSgiMTA6MTI6NTUiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChHZXRTZXJpYWxOdW1iZXIoMTAsIDEyLCA1NSksIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZvcm1hdEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFRocm93RXhjZXB0aW9uSWZTZWNvbmRJc091dE9mUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjEyOjYwIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZvcm1hdEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFRocm93RXhjZXB0aW9uSWZNaW51dGVJc091dE9mUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjYwOjU1Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFyc2VTaG91bGRJZGVudGlmeTEySG91ckFNUGF0dGVybkFuZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFRpbWVTdHJpbmdQYXJzZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuUGFyc2UoIjEwOjEyOjU1IEFNIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoR2V0U2VyaWFsTnVtYmVyKDEwLCAxMiwgNTUpLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkSWRlbnRpZnkxMkhvdXJQTVBhdHRlcm5BbmRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBUaW1lU3RyaW5nUGFyc2VyKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKCIxMDoxMjo1NSBQTSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEdldFNlcmlhbE51bWJlcigyMiwgMTIsIDU1KSwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9yc1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JkZjk1Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWwKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBPcGVyYXRvcnNUZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yUGx1c1Nob3VsZFRocm93RXhjZXB0aW9uSWZOb25OdW1lcmljT3BlcmFuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5QbHVzLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiYSIsIERhdGFUeXBlLlN0cmluZykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yUGx1c1Nob3VsZEFkZE51bWVyaWNTdHJpbmdBbmROdW1iZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuUGx1cy5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoIjIiLCBEYXRhVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JNaW51c1Nob3VsZFRocm93RXhjZXB0aW9uSWZOb25OdW1lcmljT3BlcmFuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5NaW51cy5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoImEiLCBEYXRhVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvck1pbnVzU2hvdWxkU3VidHJhY3ROdW1lcmljU3RyaW5nQW5kTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLk1pbnVzLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDUsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiMiIsIERhdGFUeXBlLlN0cmluZykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckRpdmlkZVNob3VsZFJldHVybkRpdmlkZUJ5WmVyb0lmUmlnaHRPcGVyYW5kSXNaZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkRpdmlkZS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxZCwgRGF0YVR5cGUuRGVjaW1hbCksIG5ldyBDb21waWxlUmVzdWx0KDBkLCBEYXRhVHlwZS5EZWNpbWFsKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLkRpdjApLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckRpdmlkZVNob3VsZERpdmlkZUNvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5EaXZpZGUuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoOWQsIERhdGFUeXBlLkRlY2ltYWwpLCBuZXcgQ29tcGlsZVJlc3VsdCgzZCwgRGF0YVR5cGUuRGVjaW1hbCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckRpdmlkZVNob3VsZFJldHVyblZhbHVlRXJyb3JJZk5vbk51bWVyaWNPcGVyYW5kKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkRpdmlkZS5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxLCBEYXRhVHlwZS5JbnRlZ2VyKSwgbmV3IENvbXBpbGVSZXN1bHQoImEiLCBEYXRhVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckRpdmlkZVNob3VsZERpdmlkZU51bWVyaWNTdHJpbmdBbmROdW1iZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuRGl2aWRlLkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDksIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiMyIsIERhdGFUeXBlLlN0cmluZykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvck11bHRpcGx5U2hvdWxkVGhyb3dFeGNlcHRpb25JZk5vbk51bWVyaWNPcGVyYW5kKCkKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IuTXVsdGlwbHkuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCJhIiwgRGF0YVR5cGUuU3RyaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b011bHRpcGx5U2hvdWxkTXVsdGlwbHlOdW1lcmljU3RyaW5nQW5kTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLk11bHRpcGx5LkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgiMyIsIERhdGFUeXBlLlN0cmluZykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckNvbmNhdFNob3VsZENvbmNhdFR3b1N0cmluZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuQ29uY2F0LkFwcGx5KG5ldyBDb21waWxlUmVzdWx0KCJhIiwgRGF0YVR5cGUuU3RyaW5nKSwgbmV3IENvbXBpbGVSZXN1bHQoImIiLCBEYXRhVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWIiLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckNvbmNhdFNob3VsZENvbmNhdEFOdW1iZXJBbmRBU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9wZXJhdG9yLkNvbmNhdC5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMiwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KCJiIiwgRGF0YVR5cGUuU3RyaW5nKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEyYiIsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRXFTaG91bGRSZXR1cm5UcnVlZlN1cHBsaWVkVmFsdWVzQXJlRXF1YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuRXEuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMTIsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgxMiwgRGF0YVR5cGUuSW50ZWdlcikpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckVxU2hvdWxkUmV0dXJuRmFsc2VmU3VwcGxpZWRWYWx1ZXNEaWZmZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuRXEuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMTEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgxMiwgRGF0YVR5cGUuSW50ZWdlcikpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JOb3RFcXVhbFRvU2hvdWxkUmV0dXJuVHJ1ZWZTdXBwbGllZFZhbHVlc0RpZmZlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5Ob3RFcXVhbHNUby5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDEyLCBEYXRhVHlwZS5JbnRlZ2VyKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yTm90RXF1YWxUb1Nob3VsZFJldHVybkZhbHNlZlN1cHBsaWVkVmFsdWVzQXJlRXF1YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuTm90RXF1YWxzVG8uQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMTEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlcikpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT3BlcmF0b3JHcmVhdGVyVGhhblRvU2hvdWxkUmV0dXJuVHJ1ZUlmTGVmdElzU2V0QW5kUmlnaHRJc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuR3JlYXRlclRoYW4uQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMTEsIERhdGFUeXBlLkludGVnZXIpLCBuZXcgQ29tcGlsZVJlc3VsdChudWxsLCBEYXRhVHlwZS5FbXB0eSkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVyYXRvckdyZWF0ZXJUaGFuVG9TaG91bGRSZXR1cm5UcnVlSWZMZWZ0SXMxMUFuZFJpZ2h0SXMxMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5HcmVhdGVyVGhhbi5BcHBseShuZXcgQ29tcGlsZVJlc3VsdCgxMSwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDEwLCBEYXRhVHlwZS5JbnRlZ2VyKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZXJhdG9yRXhwU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5FeHAuQXBwbHkobmV3IENvbXBpbGVSZXN1bHQoMiwgRGF0YVR5cGUuSW50ZWdlciksIG5ldyBDb21waWxlUmVzdWx0KDMsIERhdGFUeXBlLkludGVnZXIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0FkZHJlc3NUcmFuc2xhdG9yVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0FkZHJlc3NUcmFuc2xhdG9yVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGYyM2UuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9BZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBSaGluby5Nb2NrczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEFkZHJlc3NUcmFuc2xhdG9yVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgQWRkcmVzc1RyYW5zbGF0b3IgX2FkZHJlc3NUcmFuc2xhdG9yOwotICAgICAgICBwcml2YXRlIEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXhjZWxNYXhSb3dzID0gMTM1NjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKEV4Y2VsTWF4Um93cyk7Ci0gICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IgPSBuZXcgQWRkcmVzc1RyYW5zbGF0b3IoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkVGhyb3dJZlByb3ZpZGVySXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEFkZHJlc3NUcmFuc2xhdG9yKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZVJvd051bWJlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb2wsIHJvdzsKLSAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdygiQTIiLCBvdXQgY29sLCBvdXQgcm93KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCByb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZUxldHRlcnNUb0NvbHVtbkluZGV4KCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvbCwgcm93OwotICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KCJDMSIsIG91dCBjb2wsIG91dCByb3cpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGNvbCk7Ci0gICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IuVG9Db2xBbmRSb3coIkFBMiIsIG91dCBjb2wsIG91dCByb3cpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI3LCBjb2wpOwotICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KCJCQzEiLCBvdXQgY29sLCBvdXQgcm93KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1NSwgY29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVMZXR0ZXJBZGRyZXNzVXNpbmdNYXhSb3dzRnJvbVByb3ZpZGVyTG93ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY29sLCByb3c7Ci0gICAgICAgICAgICBfYWRkcmVzc1RyYW5zbGF0b3IuVG9Db2xBbmRSb3coIkEiLCBvdXQgY29sLCBvdXQgcm93KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZUxldHRlckFkZHJlc3NVc2luZ01heFJvd3NGcm9tUHJvdmlkZXJVcHBlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb2wsIHJvdzsKLSAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdygiQSIsIG91dCBjb2wsIG91dCByb3csIEFkZHJlc3NUcmFuc2xhdG9yLlJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIuTGFzdFBhcnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEV4Y2VsTWF4Um93cywgcm93KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQ2VsbFJlZmVyZW5jZVByb3ZpZGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0NlbGxSZWZlcmVuY2VQcm92aWRlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzZmYWJlLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQ2VsbFJlZmVyZW5jZVByb3ZpZGVyVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDZWxsUmVmZXJlbmNlUHJvdmlkZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfcHJvdmlkZXI7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9wcm92aWRlci5TdHViKHggPT4geC5FeGNlbE1heFJvd3MpLlJldHVybig1MDAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5SZWZlcmVuY2VkU2luZ2xlQWRkcmVzcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLlNldExleGVyKG5ldyBMZXhlcihwYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgcGFyc2luZ0NvbnRleHQuTmFtZVZhbHVlUHJvdmlkZXIpKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShfcHJvdmlkZXIpOwotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gbmV3IENlbGxSZWZlcmVuY2VQcm92aWRlcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHByb3ZpZGVyLkdldFJlZmVyZW5jZWRBZGRyZXNzZXMoIkExIiwgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSIsIHJlc3VsdC5GaXJzdCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5SZWZlcmVuY2VkTXVsdGlwbGVBZGRyZXNzZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5TZXRMZXhlcihuZXcgTGV4ZXIocGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnksIHBhcnNpbmdDb250ZXh0Lk5hbWVWYWx1ZVByb3ZpZGVyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoX3Byb3ZpZGVyKTsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IG5ldyBDZWxsUmVmZXJlbmNlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBwcm92aWRlci5HZXRSZWZlcmVuY2VkQWRkcmVzc2VzKCJBMTpBMiIsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCByZXN1bHQuRmlyc3QoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEyIiwgcmVzdWx0Lkxhc3QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc0luZm9UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mb1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWMxMDRiLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mb1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzc0luZm9UZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFRocm93SWZBZGRyZXNzSXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxBZGRyZXNzSW5mby5QYXJzZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVNob3VsZFNldFdvcmtzaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZSgiV29ya3NoZWV0IUExIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIldvcmtzaGVldCIsIGluZm8uV29ya3NoZWV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBXb3Jrc2hlZXRJc1NwZWNpZmllZFNob3VsZEJlVHJ1ZVdoZW5Xb3Jrc2hlZXRJc1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJXb3Jrc2hlZXQhQTEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5mby5Xb3Jrc2hlZXRJc1NwZWNpZmllZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSW5kaWNhdGVNdWx0aXBsZUNlbGxzV2hlbkFkZHJlc3NDb250YWluc0FDb2xvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZSgiQTE6QTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5mby5Jc011bHRpcGxlQ2VsbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFNldFN0YXJ0Q2VsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZSgiQTE6QTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCBpbmZvLlN0YXJ0Q2VsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0RW5kQ2VsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZSgiQTE6QTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTIiLCBpbmZvLkVuZENlbGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlU2hvdWxkU2V0QWRkcmVzc09uU2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoIldvcmtzaGVldCFBMTpBMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIGluZm8uQWRkcmVzc09uU2hlZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NPblNoZWV0U2hvdWxkQmVTYW1lQXNBZGRyZXNzSWZOb1dvcmtzaGVldElzU3BlY2lmaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGluZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKCJBMTpBMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBMiIsIGluZm8uQWRkcmVzc09uU2hlZXQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeHByZXNzaW9uRXZhbHVhdG9yVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMGU3NC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzLkRlc2lnbjsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEV4cHJlc3Npb25FdmFsdWF0b3JUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeHByZXNzaW9uRXZhbHVhdG9yIF9ldmFsdWF0b3I7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ldmFsdWF0b3IgPSBuZXcgRXhwcmVzc2lvbkV2YWx1YXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBOdW1lcmljIEV4cHJlc3Npb24gVGVzdHMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkUmV0dXJuVHJ1ZUlmT3BlcmFuZHNBcmVFcXVhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCIxIiwgIjEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZFJldHVyblRydWVJZk9wZXJhbmRzQXJlTWF0Y2hpbmdCdXREaWZmZXJlbnRUeXBlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiMSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkRXZhbHVhdGVPcGVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiPDIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVNob3VsZEV2YWx1YXRlTnVtZXJpY1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCIxIiwgIj4wIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRIYW5kbGVCb29sZWFuQXJnKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUodHJ1ZSwgIlRSVUUiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRUaHJvd0lmT3BlcmF0b3JJc05vdEJvb2xlYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIisxIik7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gRGF0ZSB0ZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRIYW5kbGVEYXRlQXJnKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGhyZWFkLkN1cnJlbnRUaHJlYWQuQ3VycmVudEN1bHR1cmUgPSBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobmV3IERhdGVUaW1lKDIwMTYsNiwyOCksICIyMDE2LTA2LTI4Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRIYW5kbGVEYXRlQXJnV2l0aE9wZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGhyZWFkLkN1cnJlbnRUaHJlYWQuQ3VycmVudEN1bHR1cmUgPSBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobmV3IERhdGVUaW1lKDIwMTYsIDYsIDI4KSwgIj4yMDE2LTA2LTI3Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gQmxhbmsgRXhwcmVzc2lvbiBUZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVCbGFua0V4cHJlc3Npb25FcXVhbHNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgIiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQmxhbmtFeHByZXNzaW9uRXF1YWxzRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShzdHJpbmcuRW1wdHksICIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVCbGFua0V4cHJlc3Npb25FcXVhbHNaZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMGQsICIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gUXVvdGVzIEV4cHJlc3Npb24gVGVzdHMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlUXVvdGVzRXhwcmVzc2lvbkVxdWFsc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShudWxsLCAiXCJcIiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZVF1b3Rlc0V4cHJlc3Npb25FcXVhbHNaZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMGQsICJcIlwiIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlUXVvdGVzRXhwcmVzc2lvbkVxdWFsc0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIlwiXCIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gTm90RXF1YWxUb1plcm8gRXhwcmVzc2lvbiBUZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvWmVyb0V4cHJlc3Npb25FcXVhbHNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgIjw+MCIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb1plcm9FeHByZXNzaW9uRXF1YWxzRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShzdHJpbmcuRW1wdHksICI8PjAiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9aZXJvRXhwcmVzc2lvbkVxdWFsc0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIjw+MCIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb1plcm9FeHByZXNzaW9uRXF1YWxzTm9uWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiPD4wIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvWmVyb0V4cHJlc3Npb25FcXVhbHNaZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMGQsICI8PjAiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gTm90RXF1YWxUb0JsYW5rIEV4cHJlc3Npb24gVGVzdHMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb0JsYW5rRXhwcmVzc2lvbkVxdWFsc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShudWxsLCAiPD4iKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvQmxhbmtFeHByZXNzaW9uRXF1YWxzRW1wdHlTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShzdHJpbmcuRW1wdHksICI8PiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlTm90RXF1YWxUb0JsYW5rRXhwcmVzc2lvbkVxdWFsc0NoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIjw+Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVOb3RFcXVhbFRvQmxhbmtFeHByZXNzaW9uRXF1YWxzTm9uWmVybygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiPD4iKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZU5vdEVxdWFsVG9CbGFua0V4cHJlc3Npb25FcXVhbHNaZXJvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMGQsICI8PiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIENoYXJhY3RlciBFeHByZXNzaW9uIFRlc3RzCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlckV4cHJlc3Npb25FcXVhbE51bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZShudWxsLCAiYSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlckV4cHJlc3Npb25FcXVhbHNFbXB0eVN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKHN0cmluZy5FbXB0eSwgImEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJFeHByZXNzaW9uRXF1YWxzTnVtZXJhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiYSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFdmFsdWF0ZUNoYXJhY3RlckV4cHJlc3Npb25FcXVhbHNTYW1lQ2hhcmFjdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoImEiLCAiYSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyRXhwcmVzc2lvbkVxdWFsc0RpZmZlcmVudENoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJiIiwgImEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gQ2hhcmFjdGVyV2l0aE9wZXJhdG9yIEV4cHJlc3Npb24gVGVzdHMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyV2l0aE9wZXJhdG9yRXhwcmVzc2lvbkVxdWFsTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKG51bGwsICI+YSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUobnVsbCwgIjxhIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyV2l0aE9wZXJhdG9yRXhwcmVzc2lvbkVxdWFsc0VtcHR5U3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoc3RyaW5nLkVtcHR5LCAiPmEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKHN0cmluZy5FbXB0eSwgIjxhIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJXaXRoT3BlcmF0b3JFeHByZXNzaW9uRXF1YWxzTnVtZXJhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiPmEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKDFkLCAiPGEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVDaGFyYWN0ZXJXaXRoT3BlcmF0b3JFeHByZXNzaW9uRXF1YWxzU2FtZUNoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIj5hIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOwotICAgICAgICAgICAgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgiYSIsICI+PWEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoImEiLCAiPGEiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJhIiwgIj49YSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlQ2hhcmFjdGVyV2l0aE9wZXJhdG9yRXhwcmVzc2lvbkVxdWFsc0RpZmZlcmVudENoYXJhY3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJiIiwgIj5hIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBfZXZhbHVhdG9yLkV2YWx1YXRlKCJiIiwgIjxhIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0luZGV4VG9BZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9JbmRleFRvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMmE5Ni4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0luZGV4VG9BZGRyZXNzVHJhbnNsYXRvclRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3JUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3I7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldHVwVHJhbnNsYXRvcigxMjM0NSwgRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBTZXR1cFRyYW5zbGF0b3IoaW50IG1heFJvd3MsIEV4Y2VsUmVmZXJlbmNlVHlwZSByZWZUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguRXhjZWxNYXhSb3dzKS5SZXR1cm4obWF4Um93cyk7Ci0gICAgICAgICAgICBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yID0gbmV3IEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcihfZXhjZWxEYXRhUHJvdmlkZXIsIHJlZlR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dJZkV4Y2VsRGF0YVByb3ZpZGVySXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGUxQW5kMVRvQTEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGUyN0FuZDFUb0FBMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcygyNywgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkFBMSIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlNTNBbmQxVG9CQTEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoNTMsIDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJCQTEiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZTcwMkFuZDFUb1paMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyg3MDIsIDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJaWjEiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFRyYW5zbGF0ZTcwM1RvQUFBNCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyg3MDMsIDQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBQUE0IiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVUb0VudGlyZUNvbHVtbldoZW5Sb3dJc0VxdWFsVG9NYXhSb3dzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEyMzQ1Nik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMTIzNDU2KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQSIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9BYnNvbHV0ZUFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRyYW5zbGF0b3IoMTIzNDU2LCBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dBbmRDb2x1bW4pOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IuVG9BZGRyZXNzKDEsIDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIkQSQxIiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUcmFuc2xhdGVUb0Fic29sdXRlUm93QW5kUmVsYXRpdmVDb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXR1cFRyYW5zbGF0b3IoMTIzNDU2LCBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEkMSIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9SZWxhdGl2ZVJvd0FuZEFic29sdXRlQ29sKCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0dXBUcmFuc2xhdG9yKDEyMzQ1NiwgRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QWJzb2x1dENvbHVtbik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiRBMSIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVHJhbnNsYXRlVG9SZWxhdGl2ZVJvd0FuZENvbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldHVwVHJhbnNsYXRvcigxMjM0NTYsIEV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0FuZENvbHVtbik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5Ub0FkZHJlc3MoMSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzMzcyNS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL051bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3JUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBfZXZhbHVhdG9yOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXZhbHVhdG9yID0gbmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRSZXR1cm5UcnVlSWZPcGVyYW5kc0FyZUVxdWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoIjEiLCAiMSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkUmV0dXJuVHJ1ZUlmT3BlcmFuZHNBcmVNYXRjaGluZ0J1dERpZmZlcmVudFR5cGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMWQsICIxIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRFdmFsdWF0ZU9wZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoMWQsICI8MiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV2YWx1YXRlU2hvdWxkRXZhbHVhdGVOdW1lcmljU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ldmFsdWF0b3IuRXZhbHVhdGUoIjEiLCAiPjAiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgRXZhbHVhdGVTaG91bGRUaHJvd0lmT3BlcmF0b3JJc05vdEJvb2xlYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V2YWx1YXRvci5FdmFsdWF0ZSgxZCwgIisxIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzc0ZhY3RvcnlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZiNzVlLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzRmFjdG9yeVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3NGYWN0b3J5VGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUmFuZ2VBZGRyZXNzRmFjdG9yeSBfZmFjdG9yeTsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXhjZWxNYXhSb3dzID0gMTA0ODU3NjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgcHJvdmlkZXIuU3R1Yih4ID0+IHguRXhjZWxNYXhSb3dzKS5SZXR1cm4oRXhjZWxNYXhSb3dzKTsKLSAgICAgICAgICAgIF9mYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRUaHJvd0lmU3VwcGxpZWRBZGRyZXNzSXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2ZhY3RvcnkuQ3JlYXRlKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkFuZEluc3RhbmNlV2l0aENvbFByb3BlcnRpZXNTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IF9mYWN0b3J5LkNyZWF0ZSgiQTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLkZyb21Db2wsICJGcm9tQ29sIHdhcyBub3QgMSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuVG9Db2wsICJUb0NvbCB3YXMgbm90IDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5BbmRJbnN0YW5jZVdpdGhSb3dQcm9wZXJ0aWVzU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoIkEyIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYWRkcmVzcy5Gcm9tUm93LCAiRnJvbVJvdyB3YXMgbm90IDIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBhZGRyZXNzLlRvUm93LCAiVG9Sb3cgd2FzIG5vdCAyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuQW5JbnN0YW5jZVdpdGhGcm9tQW5kVG9Db2xTZXRXaGVuQVJhbmdlQWRkcmVzc0lzU3VwcGxpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IF9mYWN0b3J5LkNyZWF0ZSgiQTE6QjIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLkZyb21Db2wpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGFkZHJlc3MuVG9Db2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkFuSW5zdGFuY2VXaXRoRnJvbUFuZFRvUm93U2V0V2hlbkFSYW5nZUFkZHJlc3NJc1N1cHBsaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkIzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Gcm9tUm93KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBhZGRyZXNzLlRvUm93KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRTZXRXb3Jrc2hlZXROYW1lSWZTdXBwbGllZEluQWRkcmVzcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKCJXcyFBMSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJXcyIsIGFkZHJlc3MuV29ya3NoZWV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5Bbkluc3RhbmNlV2l0aFN0cmluZ0FkZHJlc3NTZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IF9mYWN0b3J5LkNyZWF0ZSgxLCAxKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEiLCBhZGRyZXNzLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJldHVybkFuSW5zdGFuY2VXaXRoRnJvbUFuZFRvQ29sU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoMSwgMCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Gcm9tQ29sKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBhZGRyZXNzLlRvQ29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVTaG91bGRSZXR1cm5Bbkluc3RhbmNlV2l0aEZyb21BbmRUb1Jvd1NldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gX2ZhY3RvcnkuQ3JlYXRlKDAsIDEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuRnJvbVJvdyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Ub1Jvdyk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuQW5JbnN0YW5jZVdpdGhXb3Jrc2hlZXRTZXRUb0VtcHR5U3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoMCwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc3RyaW5nLkVtcHR5LCBhZGRyZXNzLldvcmtzaGVldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlU2hvdWxkUmV0dXJuRW50aXJlQ29sdW1uUmFuZ2VXaGVuTm9Sb3dzQXJlU3BlY2lmaWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBfZmFjdG9yeS5DcmVhdGUoIkE6QiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGFkZHJlc3MuRnJvbUNvbCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgYWRkcmVzcy5Ub0NvbCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgYWRkcmVzcy5Gcm9tUm93KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbE1heFJvd3MsIGFkZHJlc3MuVG9Sb3cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTI3YjkuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3NUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBSYW5nZUFkZHJlc3NGYWN0b3J5IF9mYWN0b3J5OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KHByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb2xsaWRlU2hvdWxkUmV0dXJuVHJ1ZUlmUmFuZ2VzQ29sbGlkZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkE2Iik7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE1Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGFkZHJlc3MxLkNvbGxpZGVzV2l0aChhZGRyZXNzMikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbGxpZGVTaG91bGRSZXR1cm5GYWxzZUlmUmFuZ2VzRG9lc05vdENvbGxpZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIkExOkE2Iik7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE4Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhZGRyZXNzMS5Db2xsaWRlc1dpdGgoYWRkcmVzczIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb2xsaWRlU2hvdWxkUmV0dXJuRmFsc2VJZlJhbmdlc0NvbGxpZGVzQnV0V29ya3NoZWV0TmFtZURpZmZlcnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczEgPSBfZmFjdG9yeS5DcmVhdGUoIldzIUExOkE2Iik7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczIgPSBfZmFjdG9yeS5DcmVhdGUoIkE1Iik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShhZGRyZXNzMS5Db2xsaWRlc1dpdGgoYWRkcmVzczIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VzVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzNzI1ZC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1Jhbmdlc1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBSYW5nZXNUZXN0Ci0gICAgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvVmFsdWVNYXRjaGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1ZhbHVlTWF0Y2hlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjMzYjk0Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvVmFsdWVNYXRjaGVyVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFZhbHVlTWF0Y2hlclRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIFZhbHVlTWF0Y2hlciBfbWF0Y2hlcjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX21hdGNoZXIgPSBuZXcgVmFsdWVNYXRjaGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMVdoZW5GaXJzdFBhcmFtSXNTb21ldGhpbmdBbmRTZWNvbmRQYXJhbUlzTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCBvMSA9IDE7Ci0gICAgICAgICAgICBvYmplY3QgbzIgPSBudWxsOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybk1pbnVzMVdoZW5GaXJzdFBhcmFtSXNOdWxsQW5kU2Vjb25kUGFyYW1Jc1NvbWV0aGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCBvMSA9IG51bGw7Ci0gICAgICAgICAgICBvYmplY3QgbzIgPSAxOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm4wV2hlbkJvdGhQYXJhbXNBcmVOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgb2JqZWN0IG8xID0gbnVsbDsKLSAgICAgICAgICAgIG9iamVjdCBvMiA9IG51bGw7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMFdoZW5Cb3RoUGFyYW1zQXJlRXF1YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3QgbzEgPSAxZDsKLSAgICAgICAgICAgIG9iamVjdCBvMiA9IDFkOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybk1pbnVzMVdoZW5GaXJzdFBhcmFtSXNMZXNzVGhhblNlY29uZFBhcmFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgb2JqZWN0IG8xID0gMWQ7Ci0gICAgICAgICAgICBvYmplY3QgbzIgPSA1ZDsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTEsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMVdoZW5GaXJzdFBhcmFtSXNHcmVhdGVyVGhhblNlY29uZFBhcmFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgb2JqZWN0IG8xID0gM2Q7Ci0gICAgICAgICAgICBvYmplY3QgbzIgPSAxZDsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm4wV2hlbldoZW5QYXJhbXNBcmVFcXVhbFN0cmluZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3QgbzEgPSAiVCI7Ci0gICAgICAgICAgICBvYmplY3QgbzIgPSAiVCI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuMFdoZW5QYXJhbXNBcmVFcXVhbEJ1dERpZmZlcmVudFR5cGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgb2JqZWN0IG8xID0gIjIiOwotICAgICAgICAgICAgb2JqZWN0IG8yID0gMmQ7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHJlc3VsdCwgIklzTWF0Y2ggZGlkIG5vdCByZXR1cm4gMCBhcyBleHBlY3RlZCB3aGVuIGZpcnN0IHBhcmFtIGlzIGEgc3RyaW5nIGFuZCBzZWNvbmQgYSBkb3VibGUiKTsKLQotICAgICAgICAgICAgbzEgPSAyZDsKLSAgICAgICAgICAgIG8yID0gIjIiOwotICAgICAgICAgICAgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChvMSwgbzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHJlc3VsdCwgIklzTWF0Y2ggZGlkIG5vdCByZXR1cm4gMCBhcyBleHBlY3RlZCB3aGVuIGZpcnN0IHBhcmFtIGlzIGEgZG91YmxlIGFuZCBzZWNvbmQgYSBzdHJpbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5Nw65udXMyV2hlblR5cGVzRGlmZmVyQW5kU3RyaW5nQ29udmVyc2lvblRvRG91YmxlRmFpbHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3QgbzEgPSAyZDsKLSAgICAgICAgICAgIG9iamVjdCBvMiA9ICJUIjsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfbWF0Y2hlci5Jc01hdGNoKG8xLCBvMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1dpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1dpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTI2ZTkuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlclRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5FeGNlbFV0aWxpdGllcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFdpbGRDYXJkVmFsdWVNYXRjaGVyVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX21hdGNoZXI7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9tYXRjaGVyID0gbmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNNYXRjaFNob3VsZFJldHVybjBXaGVuU2luZ2xlQ2hhcldpbGRDYXJkTWF0Y2hlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdHJpbmcxID0gImE/Yz8iOwotICAgICAgICAgICAgdmFyIHN0cmluZzIgPSAiYWJjZCI7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX21hdGNoZXIuSXNNYXRjaChzdHJpbmcxLCBzdHJpbmcyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzTWF0Y2hTaG91bGRSZXR1cm4wV2hlbk11bHRpcGxlQ2hhcldpbGRDYXJkTWF0Y2hlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdHJpbmcxID0gImEqYy4iOwotICAgICAgICAgICAgdmFyIHN0cmluZzIgPSAiYWJjYy4iOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9tYXRjaGVyLklzTWF0Y2goc3RyaW5nMSwgc3RyaW5nMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Cb29sZWFuRXhwcmVzc2lvblRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVlMzcyLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEJvb2xlYW5FeHByZXNzaW9uVGVzdHMKLSAgICB7Ci0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vcHVibGljIHZvaWQgQ29tcGlsZVNob3VsZEhhbmRsZVBlcmNlbnQoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIGV4cDEgPSBuZXcgQm9vbGVhbkV4cHJlc3Npb24oIlRSVUUiKTsKLSAgICAgICAgLy8gICAgZXhwMS5PcGVyYXRvciA9IE9wZXJhdG9yLlBlcmNlbnQ7Ci0gICAgICAgIC8vICAgIGV4cDEuTmV4dCA9IENvbnN0YW50RXhwcmVzc2lvbnMuUGVyY2VudDsKLSAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IGV4cDEuQ29tcGlsZSgpOwotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoMC4wMSwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbChEYXRhVHlwZS5EZWNpbWFsLCByZXN1bHQuRGF0YVR5cGUpOwotICAgICAgICAvL30KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdEZhY3RvcnlUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjMjQ2ZS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgQ29tcGlsZVJlc3VsdEZhY3RvcnlUZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0ZVVzaW5nRXVyb3BlYW5EYXRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB1cyA9IEN1bHR1cmVJbmZvLkNyZWF0ZVNwZWNpZmljQ3VsdHVyZSgiZW4tVVMiKTsKLSAgICAgICAgICAgIFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0gdXM7Ci0gICAgICAgICAgICB2YXIgY3JmID0gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3JmLkNyZWF0ZSgiMS8xNS8yMDE0Iik7Ci0gICAgICAgICAgICB2YXIgbnVtZXJpYyA9IHJlc3VsdC5SZXN1bHROdW1lcmljOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxNjU0LCBudW1lcmljKTsKLSAgICAgICAgICAgIHZhciBnYiA9IEN1bHR1cmVJbmZvLkNyZWF0ZVNwZWNpZmljQ3VsdHVyZSgiZW4tR0IiKTsKLSAgICAgICAgICAgIFRocmVhZC5DdXJyZW50VGhyZWFkLkN1cnJlbnRDdWx0dXJlID0gZ2I7Ci0gICAgICAgICAgICB2YXIgZXVyb1Jlc3VsdCA9IGNyZi5DcmVhdGUoIjE1LzEvMjAxNCIpOwotICAgICAgICAgICAgdmFyIGVOdW1lcmljID0gZXVyb1Jlc3VsdC5SZXN1bHROdW1lcmljOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQxNjU0LCBlTnVtZXJpYyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWJhOTEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdFRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0JW1Rlc3RDbGFzc10KLQlwdWJsaWMgY2xhc3MgQ29tcGlsZVJlc3VsdFRlc3RzCi0JewotCQlbVGVzdE1ldGhvZF0KLQkJcHVibGljIHZvaWQgTnVtZXJpY1N0cmluZ0NvbXBpbGVSZXN1bHQoKQotCQl7Ci0JCQl2YXIgZXhwZWN0ZWQgPSAxMjQuMjQ7Ci0JCQlzdHJpbmcgbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJuIik7Ci0JCQlDb21waWxlUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KG51bWVyaWNTdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7Ci0JCQlBc3NlcnQuSXNGYWxzZShyZXN1bHQuSXNOdW1lcmljKTsKLQkJCUFzc2VydC5Jc1RydWUocmVzdWx0LklzTnVtZXJpY1N0cmluZyk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdC5SZXN1bHROdW1lcmljKTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBEYXRlU3RyaW5nQ29tcGlsZVJlc3VsdCgpCi0JCXsKLQkJCXZhciBleHBlY3RlZCA9IG5ldyBEYXRlVGltZSgyMDEzLCAxLCAxNSk7Ci0JCQlzdHJpbmcgZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJkIik7Ci0JCQlDb21waWxlUmVzdWx0IHJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KGRhdGVTdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7Ci0JCQlBc3NlcnQuSXNGYWxzZShyZXN1bHQuSXNOdW1lcmljKTsKLQkJCUFzc2VydC5Jc1RydWUocmVzdWx0LklzRGF0ZVN0cmluZyk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQuVG9PQURhdGUoKSwgcmVzdWx0LlJlc3VsdE51bWVyaWMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGVjaW1hbEV4cHJlc3Npb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDY0NjQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGVjaW1hbEV4cHJlc3Npb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRGVjaW1hbEV4cHJlc3Npb25UZXN0cwotICAgIHsKLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBDb21waWxlU2hvdWxkSGFuZGxlUGVyY2VudCgpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB2YXIgZXhwMSA9IG5ldyBEZWNpbWFsRXhwcmVzc2lvbigiMSIpOwotICAgICAgICAvLyAgICBleHAxLk9wZXJhdG9yID0gT3BlcmF0b3IuUGVyY2VudDsKLSAgICAgICAgLy8gICAgZXhwMS5OZXh0ID0gQ29uc3RhbnRFeHByZXNzaW9ucy5QZXJjZW50OwotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gZXhwMS5Db21waWxlKCk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgwLjAxLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0VudW1lcmFibGVFeHByZXNzaW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxNjAuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEVudW1lcmFibGVFeHByZXNzaW9uVGVzdHMKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb21waWxlU2hvdWxkUmV0dXJuRW51bWVyYWJsZU9mQ29tcGlsZWRDaGlsZEV4cHJlc3Npb25zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBuZXcgRW51bWVyYWJsZUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGV4cHJlc3Npb24uQWRkQ2hpbGQobmV3IEludGVnZXJFeHByZXNzaW9uKCIyIikpOwotICAgICAgICAgICAgZXhwcmVzc2lvbi5BZGRDaGlsZChuZXcgSW50ZWdlckV4cHJlc3Npb24oIjMiKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gZXhwcmVzc2lvbi5Db21waWxlKCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdC5SZXN1bHQsIHR5cGVvZihJRW51bWVyYWJsZTxvYmplY3Q+KSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0TGlzdCA9IChJRW51bWVyYWJsZTxvYmplY3Q+KXJlc3VsdC5SZXN1bHQ7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdExpc3QuRWxlbWVudEF0KDApKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0TGlzdC5FbGVtZW50QXQoMSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxBZGRyZXNzRXhwcmVzc2lvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxBZGRyZXNzRXhwcmVzc2lvblRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVjNzQwLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OwotICAgICAgICBwcml2YXRlIFBhcnNpbmdTY29wZSBfc2NvcGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbENlbGwgQ3JlYXRlSXRlbShvYmplY3QgdmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ2VsbCh2YWwsIG51bGwsIDAsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgX3Njb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Njb3BlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkVGhyb3dJZkV4Y2VsRGF0YVByb3ZpZGVySXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oIkExIiwgbnVsbCwgX3BhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbnN0cnVjdG9yU2hvdWxkVGhyb3dJZlBhcnNpbmdDb250ZXh0SXNOdWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oIkExIiwgTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vVE9ETzpGaXggVGVzdCAvSmFubmUKLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBTaG91bGRDYWxsUmV0dXJuUmVzdWx0RnJvbVByb3ZpZGVyKCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlc3MgPSAiQTEiOwotICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgIC8vICAgIHByb3ZpZGVyCi0gICAgICAgIC8vICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoc3RyaW5nLkVtcHR5LCBleHBlY3RlZEFkZHJlc3MpKQotICAgICAgICAvLyAgICAgICAgLlJldHVybihuZXcgb2JqZWN0W117IDEgfSk7Ci0KLSAgICAgICAgLy8gICAgdmFyIGV4cHJlc3Npb24gPSBuZXcgRXhjZWxBZGRyZXNzRXhwcmVzc2lvbihleHBlY3RlZEFkZHJlc3MsIHByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gZXhwcmVzc2lvbi5Db21waWxlKCk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgxLCByZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9UT0RPOkZpeCBUZXN0IC9KYW5uZQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIENvbXBpbGVTaG91bGRSZXR1cm5BZGRyZXNzKCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlc3MgPSAiQTEiOwotICAgICAgICAvLyAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgIC8vICAgIHByb3ZpZGVyCi0gICAgICAgIC8vICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoZXhwZWN0ZWRBZGRyZXNzKSkKLSAgICAgICAgLy8gICAgICAgIC5SZXR1cm4obmV3IEV4Y2VsQ2VsbFtdIHsgQ3JlYXRlSXRlbSgxKSB9KTsKLQotICAgICAgICAvLyAgICB2YXIgZXhwcmVzc2lvbiA9IG5ldyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKGV4cGVjdGVkQWRkcmVzcywgcHJvdmlkZXIsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgIC8vICAgIGV4cHJlc3Npb24uUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IHRydWU7Ci0gICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBleHByZXNzaW9uLkNvbXBpbGUoKTsKLSAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkQWRkcmVzcywgcmVzdWx0LlJlc3VsdCk7Ci0KLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbXBpbGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0NjM2Ni4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBFeHBHcmFwaCA9IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29tcGlsZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJRXhwcmVzc2lvbkNvbXBpbGVyIF9leHByZXNzaW9uQ29tcGlsZXI7Ci0gICAgICAgIHByaXZhdGUgRXhwR3JhcGggX2dyYXBoOwotICAgICAgICAKLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9leHByZXNzaW9uQ29tcGlsZXIgPSBuZXcgRXhwcmVzc2lvbkNvbXBpbGVyKCk7Ci0gICAgICAgICAgICBfZ3JhcGggPSBuZXcgRXhwR3JhcGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDb21waWxlVHdvSW50ZXJFeHByZXNzaW9uc1RvQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHAxID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7Ci0gICAgICAgICAgICBleHAxLk9wZXJhdG9yID0gT3BlcmF0b3IuUGx1czsKLSAgICAgICAgICAgIF9ncmFwaC5BZGQoZXhwMSk7Ci0gICAgICAgICAgICB2YXIgZXhwMiA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOwotICAgICAgICAgICAgX2dyYXBoLkFkZChleHAyKTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9leHByZXNzaW9uQ29tcGlsZXIuQ29tcGlsZShfZ3JhcGguRXhwcmVzc2lvbnMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICB9Ci0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29tcGlsZVNob3VsZE11bHRpcGx5R3JvdXBFeHByZXNzaW9uV2l0aEZvbGxvd2luZ0ludGVnZXJFeHByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGdyb3VwRXhwcmVzc2lvbiA9IG5ldyBHcm91cEV4cHJlc3Npb24oZmFsc2UpOwotICAgICAgICAgICAgZ3JvdXBFeHByZXNzaW9uLkFkZENoaWxkKG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpKTsKLSAgICAgICAgICAgIGdyb3VwRXhwcmVzc2lvbi5DaGlsZHJlbi5GaXJzdCgpLk9wZXJhdG9yID0gT3BlcmF0b3IuUGx1czsKLSAgICAgICAgICAgIGdyb3VwRXhwcmVzc2lvbi5BZGRDaGlsZChuZXcgSW50ZWdlckV4cHJlc3Npb24oIjMiKSk7Ci0gICAgICAgICAgICBncm91cEV4cHJlc3Npb24uT3BlcmF0b3IgPSBPcGVyYXRvci5NdWx0aXBseTsKLQotICAgICAgICAgICAgX2dyYXBoLkFkZChncm91cEV4cHJlc3Npb24pOwotICAgICAgICAgICAgX2dyYXBoLkFkZChuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKSk7Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXhwcmVzc2lvbkNvbXBpbGVyLkNvbXBpbGUoX2dyYXBoLkV4cHJlc3Npb25zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29tcGlsZVNob3VsZENhbGN1bGF0ZU11bHRpcGxlRXhwcmVzc2lvbnNBY2NvcmRpbmdUb1ByZWNlZGVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwMSA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOwotICAgICAgICAgICAgZXhwMS5PcGVyYXRvciA9IE9wZXJhdG9yLk11bHRpcGx5OwotICAgICAgICAgICAgX2dyYXBoLkFkZChleHAxKTsKLSAgICAgICAgICAgIHZhciBleHAyID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7Ci0gICAgICAgICAgICBleHAyLk9wZXJhdG9yID0gT3BlcmF0b3IuUGx1czsKLSAgICAgICAgICAgIF9ncmFwaC5BZGQoZXhwMik7Ci0gICAgICAgICAgICB2YXIgZXhwMyA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOwotICAgICAgICAgICAgZXhwMy5PcGVyYXRvciA9IE9wZXJhdG9yLk11bHRpcGx5OwotICAgICAgICAgICAgX2dyYXBoLkFkZChleHAzKTsKLSAgICAgICAgICAgIHZhciBleHA0ID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7Ci0gICAgICAgICAgICBfZ3JhcGguQWRkKGV4cDQpOwotCi0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2V4cHJlc3Npb25Db21waWxlci5Db21waWxlKF9ncmFwaC5FeHByZXNzaW9ucyk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4ZCwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29udmVydGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29udmVydGVyVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzI4MzQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbnZlcnRlclRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29udmVydGVyVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSUV4cHJlc3Npb25Db252ZXJ0ZXIgX2NvbnZlcnRlcjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NvbnZlcnRlciA9IG5ldyBFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdFeHByZXNzaW9uU2hvdWxkQ29udmVydEludGVnZXJFeHByZXNzaW9uVG9TdHJpbmdFeHByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGludGVnZXJFeHByZXNzaW9uID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIyIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbnZlcnRlci5Ub1N0cmluZ0V4cHJlc3Npb24oaW50ZWdlckV4cHJlc3Npb24pOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoU3RyaW5nRXhwcmVzc2lvbikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyIiwgcmVzdWx0LkNvbXBpbGUoKS5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nRXhwcmVzc2lvblNob3VsZENvcHlPcGVyYXRvclRvU3RyaW5nRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnRlZ2VyRXhwcmVzc2lvbiA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOwotICAgICAgICAgICAgaW50ZWdlckV4cHJlc3Npb24uT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0ZXIuVG9TdHJpbmdFeHByZXNzaW9uKGludGVnZXJFeHByZXNzaW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpbnRlZ2VyRXhwcmVzc2lvbi5PcGVyYXRvciwgcmVzdWx0Lk9wZXJhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ0V4cHJlc3Npb25TaG91bGRDb252ZXJ0RGVjaW1hbEV4cHJlc3Npb25Ub1N0cmluZ0V4cHJlc3Npb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVjaW1hbEV4cHJlc3Npb24gPSBuZXcgRGVjaW1hbEV4cHJlc3Npb24oIjIuNSIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0ZXIuVG9TdHJpbmdFeHByZXNzaW9uKGRlY2ltYWxFeHByZXNzaW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKFN0cmluZ0V4cHJlc3Npb24pKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMiw1IiwgcmVzdWx0LkNvbXBpbGUoKS5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZyb21Db21waWxlUmVzdWx0U2hvdWxkQ3JlYXRlSW50ZWdlckV4cHJlc3Npb25JZkNvbXBpbGVSZXN1bHRJc0ludGVnZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KDEsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0ZXIuRnJvbUNvbXBpbGVSZXN1bHQoY29tcGlsZVJlc3VsdCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihJbnRlZ2VyRXhwcmVzc2lvbikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQuQ29tcGlsZSgpLlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRnJvbUNvbXBpbGVSZXN1bHRTaG91bGRDcmVhdGVTdHJpbmdFeHByZXNzaW9uSWZDb21waWxlUmVzdWx0SXNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IG5ldyBDb21waWxlUmVzdWx0KCJhYmMiLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb252ZXJ0ZXIuRnJvbUNvbXBpbGVSZXN1bHQoY29tcGlsZVJlc3VsdCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihTdHJpbmdFeHByZXNzaW9uKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImFiYyIsIHJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGcm9tQ29tcGlsZVJlc3VsdFNob3VsZENyZWF0ZURlY2ltYWxFeHByZXNzaW9uSWZDb21waWxlUmVzdWx0SXNEZWNpbWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBuZXcgQ29tcGlsZVJlc3VsdCgyLjVkLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLkZyb21Db21waWxlUmVzdWx0KGNvbXBpbGVSZXN1bHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoRGVjaW1hbEV4cHJlc3Npb24pKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLjVkLCByZXN1bHQuQ29tcGlsZSgpLlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRnJvbUNvbXBpbGVSZXN1bHRTaG91bGRDcmVhdGVCb29sZWFuRXhwcmVzc2lvbklmQ29tcGlsZVJlc3VsdElzQm9vbGVhbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gbmV3IENvbXBpbGVSZXN1bHQoInRydWUiLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29udmVydGVyLkZyb21Db21waWxlUmVzdWx0KGNvbXBpbGVSZXN1bHQpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoQm9vbGVhbkV4cHJlc3Npb24pKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0LkNvbXBpbGUoKS5SZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkZhY3RvcnlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25GYWN0b3J5VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjNhM2YuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkZhY3RvcnlUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkZhY3RvcnlUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJRXhwcmVzc2lvbkZhY3RvcnkgX2ZhY3Rvcnk7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9mYWN0b3J5ID0gbmV3IEV4cHJlc3Npb25GYWN0b3J5KHByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFJldHVybkludGVnZXJFeHByZXNzaW9uV2hlblRva2VuSXNJbnRlZ2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VuID0gbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpOwotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZmFjdG9yeS5DcmVhdGUodG9rZW4pOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZXhwcmVzc2lvbiwgdHlwZW9mKEludGVnZXJFeHByZXNzaW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuQm9vbGVhbkV4cHJlc3Npb25XaGVuVG9rZW5Jc0Jvb2xlYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBuZXcgVG9rZW4oInRydWUiLCBUb2tlblR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IF9mYWN0b3J5LkNyZWF0ZSh0b2tlbik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShleHByZXNzaW9uLCB0eXBlb2YoQm9vbGVhbkV4cHJlc3Npb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRSZXR1cm5EZWNpbWFsRXhwcmVzc2lvbldoZW5Ub2tlbklzRGVjaW1hbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbigiMi41IiwgVG9rZW5UeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZmFjdG9yeS5DcmVhdGUodG9rZW4pOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZXhwcmVzc2lvbiwgdHlwZW9mKERlY2ltYWxFeHByZXNzaW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuRXhjZWxSYW5nZUV4cHJlc3Npb25XaGVuVG9rZW5Jc0V4Y2VsQWRkcmVzcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbigiQTEiLCBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2ZhY3RvcnkuQ3JlYXRlKHRva2VuKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGV4cHJlc3Npb24sIHR5cGVvZihFeGNlbEFkZHJlc3NFeHByZXNzaW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkUmV0dXJuTmFtZWRWYWx1ZUV4cHJlc3Npb25XaGVuVG9rZW5Jc05hbWVkVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBuZXcgVG9rZW4oIk5hbWVkVmFsdWUiLCBUb2tlblR5cGUuTmFtZVZhbHVlKTsKLSAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2ZhY3RvcnkuQ3JlYXRlKHRva2VuKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGV4cHJlc3Npb24sIHR5cGVvZihOYW1lZFZhbHVlRXhwcmVzc2lvbikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQwYWI4Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25HcmFwaEJ1aWxkZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneTsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkdyYXBoQnVpbGRlclRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uR3JhcGhCdWlsZGVyIF9ncmFwaEJ1aWxkZXI7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIF9ncmFwaEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkdyYXBoQnVpbGRlcihfZXhjZWxEYXRhUHJvdmlkZXIsIHBhcnNpbmdDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkTm90VXNlU3RyaW5nSWRlbnRpZnllcnNXaGVuQnVpbGRpbmdTdHJpbmdFeHByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5TdHJpbmcpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiYWJjIiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LkV4cHJlc3Npb25zLkNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkTm90RXZhbHVhdGVFeHByZXNzaW9uc1dpdGhpbkFTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIxICsgMiIsIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuU3RyaW5nKQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIxICsgMiIsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNvbXBpbGUoKS5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkU2V0T3BlcmF0b3JPbkdyb3VwRXhwcmVzc2lvbkNvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjQiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIqIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlcikKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoT3BlcmF0b3IuTXVsdGlwbHkuT3BlcmF0b3IsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLk9wZXJhdG9yLk9wZXJhdG9yKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkU2V0Q2hpbGRyZW5Pbkdyb3VwRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjQiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIqIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlcikKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKSwgdHlwZW9mKEdyb3VwRXhwcmVzc2lvbikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNoaWxkcmVuLkNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkU2V0TmV4dE9uR3JvdXBlZEV4cHJlc3Npb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKyIsIFRva2VuVHlwZS5PcGVyYXRvciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCI0IiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKSIsIFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKiIsIFRva2VuVHlwZS5PcGVyYXRvciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChyZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5OZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLk5leHQsIHR5cGVvZihJbnRlZ2VyRXhwcmVzc2lvbikpOwotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRCdWlsZEZ1bmN0aW9uRXhwcmVzc2lvbklmRmlyc3RUb2tlbklzRnVuY3Rpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCJDU3RyIiwgVG9rZW5UeXBlLkZ1bmN0aW9uKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5FeHByZXNzaW9ucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLCB0eXBlb2YoRnVuY3Rpb25FeHByZXNzaW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQnVpbGRTaG91bGRTZXRDaGlsZHJlbk9uRnVuY3Rpb25FeHByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiQ1N0ciIsIFRva2VuVHlwZS5GdW5jdGlvbiksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKSIsIFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMpCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNoaWxkcmVuLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uRmlyc3QoKSwgdHlwZW9mKEdyb3VwRXhwcmVzc2lvbikpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uRmlyc3QoKS5DaGlsZHJlbi5GaXJzdCgpLCB0eXBlb2YoSW50ZWdlckV4cHJlc3Npb24pKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uRmlyc3QoKS5Db21waWxlKCkuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBCdWlsZFNob3VsZEFkZE9wZXJhdG9yVG9GdW5jdGlvbkV4cHJlc3Npb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gbmV3IExpc3Q8VG9rZW4+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCJDU3RyIiwgVG9rZW5UeXBlLkZ1bmN0aW9uKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCImIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIkEiLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0LkV4cHJlc3Npb25zLkZpcnN0KCkuQ2hpbGRyZW4uQ291bnQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0LkV4cHJlc3Npb25zLkNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkQWRkQ29tbWFTZXBhcmF0ZWRGdW5jdGlvbkFyZ3VtZW50c0FzQ2hpbGRyZW5Ub0Z1bmN0aW9uRXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIlRleHQiLCBUb2tlblR5cGUuRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMiIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiwiLCBUb2tlblR5cGUuQ29tbWEpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiMyIsIFRva2VuVHlwZS5JbnRlZ2VyKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiYiLCBUb2tlblR5cGUuT3BlcmF0b3IpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiQSIsIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNoaWxkcmVuLkNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkQ3JlYXRlQVNpbmdsZUV4cHJlc3Npb25PdXRPZkFOZWdhdG9yQW5kQU51bWVyaWNUb2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIi0iLCBUb2tlblR5cGUuTmVnYXRvciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdC5FeHByZXNzaW9ucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMmQsIHJlc3VsdC5FeHByZXNzaW9ucy5GaXJzdCgpLkNvbXBpbGUoKS5SZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ1aWxkU2hvdWxkSGFuZGxlRW51bWVyYWJsZVRva2VucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIlRleHQiLCBUb2tlblR5cGUuRnVuY3Rpb24pLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKCIsIFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigieyIsIFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiLCIsIFRva2VuVHlwZS5Db21tYSksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIzIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigifSIsIFRva2VuVHlwZS5DbG9zaW5nRW51bWVyYWJsZSksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcykKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7Ci0gICAgICAgICAgICB2YXIgZnVuY0FyZ0V4cHJlc3Npb24gPSByZXN1bHQuRXhwcmVzc2lvbnMuRmlyc3QoKS5DaGlsZHJlbi5GaXJzdCgpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZnVuY0FyZ0V4cHJlc3Npb24sIHR5cGVvZihGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbikpOwotCi0gICAgICAgICAgICB2YXIgZW51bWVyYWJsZUV4cHJlc3Npb24gPSBmdW5jQXJnRXhwcmVzc2lvbi5DaGlsZHJlbi5GaXJzdCgpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShlbnVtZXJhYmxlRXhwcmVzc2lvbiwgdHlwZW9mKEVudW1lcmFibGVFeHByZXNzaW9uKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgZW51bWVyYWJsZUV4cHJlc3Npb24uQ2hpbGRyZW4uQ291bnQoKSwgIkVudW1lcmFibGUuQ291bnQgd2FzIG5vdCAyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlSW5uZXJGdW5jdGlvbkNhbGwyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGN0eCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGZvcm11bGEgPSAiSUYoMz4yO1wiWWVzXCI7XCJOb1wiKSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY3R4LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBjdHguTmFtZVZhbHVlUHJvdmlkZXIpOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IHRva2VuaXplci5Ub2tlbml6ZShmb3JtdWxhKTsKLSAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGV4cHJlc3Npb24uRXhwcmVzc2lvbnMuQ291bnQoKSk7Ci0KLSAgICAgICAgICAgIHZhciBjb21waWxlciA9IG5ldyBFeHByZXNzaW9uQ29tcGlsZXIobmV3IEV4cHJlc3Npb25Db252ZXJ0ZXIoKSwgbmV3IENvbXBpbGVTdHJhdGVneUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGlsZXIuQ29tcGlsZShleHByZXNzaW9uLkV4cHJlc3Npb25zKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiWWVzIiwgcmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlSW5uZXJGdW5jdGlvbkNhbGwzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGN0eCA9IFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpOwotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGZvcm11bGEgPSAiSUYoSTEwPj0wO0lGKE8xMD5JMTA7KChPMTAtSTEwKSokQjEwKS8kQyQyNztJRihPMTA8MDsoTzEwKiRCMTApLyRDJDI3O1wiXCIpKTtJRihPMTA8MDsoKE8xMC1JMTApKiRCMTApLyRDJDI3O0lGKE8xMD4wOyhPMTAqJEIxMCkvJEMkMjc7KSkpIjsKLSAgICAgICAgICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgU291cmNlQ29kZVRva2VuaXplcihjdHguQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnksIGN0eC5OYW1lVmFsdWVQcm92aWRlcik7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gdG9rZW5pemVyLlRva2VuaXplKGZvcm11bGEpOwotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZXhwcmVzc2lvbi5FeHByZXNzaW9ucy5Db3VudCgpKTsKLSAgICAgICAgICAgIHZhciBleHAxID0gZXhwcmVzc2lvbi5FeHByZXNzaW9ucy5GaXJzdCgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGV4cDEuQ2hpbGRyZW4uQ291bnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUR1cGxpY2F0ZU9wZXJhdG9yczEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY3R4ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBjb25zdCBzdHJpbmcgZm9ybXVsYSA9ICIrKzEtLTIrKy0zKy0xLS0tLTMtKzIiOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IG5ldyBTb3VyY2VDb2RlVG9rZW5pemVyKGN0eC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgY3R4Lk5hbWVWYWx1ZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZXIuVG9rZW5pemUoZm9ybXVsYSkuVG9MaXN0KCk7Ci0gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMSwgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIrIiwgdG9rZW5zWzFdLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiLSIsIHRva2Vuc1szXS5WYWx1ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIi0iLCB0b2tlbnNbNV0uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIrIiwgdG9rZW5zWzddLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiLSIsIHRva2Vuc1s5XS5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUR1cGxpY2F0ZU9wZXJhdG9yczIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY3R4ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBjb25zdCBzdHJpbmcgZm9ybXVsYSA9ICIrKy0xLS0oLS0tMikrKy0zKy0xLS0tLTMtKzIiOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IG5ldyBTb3VyY2VDb2RlVG9rZW5pemVyKGN0eC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgY3R4Lk5hbWVWYWx1ZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSB0b2tlbml6ZXIuVG9rZW5pemUoZm9ybXVsYSkuVG9MaXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRnVuY3Rpb25Db21waWxlckZhY3RvcnlUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzZGUzNi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeVRlc3RzCi0gICAgewotICAgICAgICAjcmVnaW9uIENyZWF0ZSBUZXN0cwotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc1N0YW5kYXJkRnVuY3Rpb25Db21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBTdW0oKTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyID0gZnVuY3Rpb25Db21waWxlckZhY3RvcnkuQ3JlYXRlKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGZ1bmN0aW9uQ29tcGlsZXIsIHR5cGVvZihEZWZhdWx0Q29tcGlsZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVIYW5kbGVzU3BlY2lhbElmQ29tcGlsZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOwotICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgSWYoKTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyID0gZnVuY3Rpb25Db21waWxlckZhY3RvcnkuQ3JlYXRlKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGZ1bmN0aW9uQ29tcGlsZXIsIHR5cGVvZihJZkZ1bmN0aW9uQ29tcGlsZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVIYW5kbGVzU3BlY2lhbElmRXJyb3JDb21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBJZkVycm9yKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVIYW5kbGVzU3BlY2lhbElmTmFDb21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBJZk5hKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoSWZOYUZ1bmN0aW9uQ29tcGlsZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVIYW5kbGVzTG9va3VwRnVuY3Rpb25Db21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBDb2x1bW4oKTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkNvbXBpbGVyID0gZnVuY3Rpb25Db21waWxlckZhY3RvcnkuQ3JlYXRlKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKGZ1bmN0aW9uQ29tcGlsZXIsIHR5cGVvZihMb29rdXBGdW5jdGlvbkNvbXBpbGVyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlSGFuZGxlc0Vycm9yRnVuY3Rpb25Db21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IG5ldyBJc0Vycm9yKCk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Db21waWxlciA9IGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShmdW5jdGlvbkNvbXBpbGVyLCB0eXBlb2YoRXJyb3JIYW5kbGluZ0Z1bmN0aW9uQ29tcGlsZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVIYW5kbGVzQ3VzdG9tRnVuY3Rpb25Db21waWxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvblJlcG9zaXRvcnkgPSBGdW5jdGlvblJlcG9zaXRvcnkuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBmdW5jdGlvblJlcG9zaXRvcnkuTG9hZE1vZHVsZShuZXcgVGVzdEZ1bmN0aW9uTW9kdWxlKCkpOwotICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5ID0gbmV3IEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KGZ1bmN0aW9uUmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb24gPSBuZXcgTXlGdW5jdGlvbigpOwotICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ29tcGlsZXIgPSBmdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoZnVuY3Rpb25Db21waWxlciwgdHlwZW9mKE15RnVuY3Rpb25Db21waWxlcikpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIE5lc3RlZCBDbGFzc2VzCi0gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0RnVuY3Rpb25Nb2R1bGUgOiBGdW5jdGlvbnNNb2R1bGUKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIFRlc3RGdW5jdGlvbk1vZHVsZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIG15RnVuY3Rpb24gPSBuZXcgTXlGdW5jdGlvbigpOwotICAgICAgICAgICAgICAgIHZhciBjdXN0b21Db21waWxlciA9IG5ldyBNeUZ1bmN0aW9uQ29tcGlsZXIobXlGdW5jdGlvbik7Ci0gICAgICAgICAgICAgICAgYmFzZS5GdW5jdGlvbnMuQWRkKE15RnVuY3Rpb24uTmFtZSwgbXlGdW5jdGlvbik7Ci0gICAgICAgICAgICAgICAgYmFzZS5DdXN0b21Db21waWxlcnMuQWRkKHR5cGVvZihNeUZ1bmN0aW9uKSwgY3VzdG9tQ29tcGlsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGNsYXNzIE15RnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTmFtZSA9ICJNeUZ1bmN0aW9uIjsKLSAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGNsYXNzIE15RnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIE15RnVuY3Rpb25Db21waWxlcihNeUZ1bmN0aW9uIGZ1bmN0aW9uKSA6IGJhc2UoZnVuY3Rpb24pIHsgfQotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZShJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBjaGlsZHJlbiwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb25UZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0ludGVnZXJFeHByZXNzaW9uVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2YzNTkuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgSW50ZWdlckV4cHJlc3Npb25UZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlV2l0aE5leHRXaXRoUGx1c09wZXJhdG9yU2hvdWxkQ2FsdWxhdGVTdW1Db3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwMSA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMSIpOwotICAgICAgICAgICAgZXhwMS5PcGVyYXRvciA9IE9wZXJhdG9yLlBsdXM7Ci0gICAgICAgICAgICB2YXIgZXhwMiA9IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbigiMiIpOwotICAgICAgICAgICAgZXhwMS5OZXh0ID0gZXhwMjsKLQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4cDEuTWVyZ2VXaXRoTmV4dCgpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdC5Db21waWxlKCkuUmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZVdpdGhOZXh0V2l0aFBsdXNPcGVyYXRvclNob3VsZFNldE5leHRQb2ludGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cDEgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjEiKTsKLSAgICAgICAgICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QbHVzOwotICAgICAgICAgICAgdmFyIGV4cDIgPSBuZXcgSW50ZWdlckV4cHJlc3Npb24oIjIiKTsKLSAgICAgICAgICAgIGV4cDEuTmV4dCA9IGV4cDI7Ci0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBleHAxLk1lcmdlV2l0aE5leHQoKTsKLQotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChyZXN1bHQuTmV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIENvbXBpbGVTaG91bGRIYW5kbGVQZXJjZW50KCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBleHAxID0gbmV3IEludGVnZXJFeHByZXNzaW9uKCIxIik7Ci0gICAgICAgIC8vICAgIGV4cDEuT3BlcmF0b3IgPSBPcGVyYXRvci5QZXJjZW50OwotICAgICAgICAvLyAgICBleHAxLk5leHQgPSBDb25zdGFudEV4cHJlc3Npb25zLlBlcmNlbnQ7Ci0gICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBleHAxLkNvbXBpbGUoKTsKLSAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKDAuMDEsIHJlc3VsdC5SZXN1bHQpOwotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoRGF0YVR5cGUuRGVjaW1hbCwgcmVzdWx0LkRhdGFUeXBlKTsKLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyTWFuYWdlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyTWFuYWdlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQxOTY0Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlck1hbmFnZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEZvcm11bGFQYXJzZXJNYW5hZ2VyVGVzdHMKLSAgICB7Ci0gICAgICAgICNyZWdpb24gdGVzdCBjbGFzc2VzCi0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBNeUZ1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgTXlNb2R1bGUgOiBJRnVuY3Rpb25Nb2R1bGUKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIE15TW9kdWxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGdW5jdGlvbnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+KCk7Ci0gICAgICAgICAgICAgICAgRnVuY3Rpb25zLkFkZCgiTXlGdW5jdGlvbiIsIG5ldyBNeUZ1bmN0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgQ3VzdG9tQ29tcGlsZXJzID0gbmV3IERpY3Rpb25hcnk8VHlwZSwgRnVuY3Rpb25Db21waWxlcj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IEZ1bmN0aW9ucyB7IGdldDsgfQotICAgICAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PFR5cGUsIEZ1bmN0aW9uQ29tcGlsZXI+IEN1c3RvbUNvbXBpbGVycyB7IGdldDsgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRnVuY3Rpb25zU2hvdWxkQmVDb3BpZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UxID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhY2thZ2UxLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkxvYWRGdW5jdGlvbk1vZHVsZShuZXcgTXlNb2R1bGUoKSk7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlMiA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBvcmlnTnVtYmVyT2ZGdW5jcyA9IHBhY2thZ2UyLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkdldEltcGxlbWVudGVkRnVuY3Rpb25OYW1lcygpLkNvdW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBmdW5jdGlvbnMgaW5jbHVkaW5nIHRoZSBjdXN0b20gZnVuY3Rpb25zIGZyb20gcGFja2FnZSAxCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UyLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkNvcHlGdW5jdGlvbnNGcm9tKHBhY2thZ2UxLldvcmtib29rKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnRpb25zOiBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBpbmNyZWFzZWQgd2l0aCAxLCBhbmQgdGhlIGxpc3Qgb2YgZnVuY3Rpb24gbmFtZXMgY29udGFpbnMgdGhlIGN1c3RvbSBmdW5jdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG9yaWdOdW1iZXJPZkZ1bmNzICsgMSwgcGFja2FnZTIuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkuQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFja2FnZTIuV29ya2Jvb2suRm9ybXVsYVBhcnNlck1hbmFnZXIuR2V0SW1wbGVtZW50ZWRGdW5jdGlvbk5hbWVzKCkuQ29udGFpbnMoIm15ZnVuY3Rpb24iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjZGIxNC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBSaGluby5Nb2NrczsKLXVzaW5nIEV4R3JhcGggPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEZvcm11bGFQYXJzZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGb3JtdWxhUGFyc2VyIF9wYXJzZXI7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihwcm92aWRlcik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlclNob3VsZENhbGxMZXhlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsZXhlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJTGV4ZXI+KCk7Ci0gICAgICAgICAgICBsZXhlci5TdHViKHggPT4geC5Ub2tlbml6ZSgiQUJDIikpLlJldHVybihFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpKTsKLSAgICAgICAgICAgIF9wYXJzZXIuQ29uZmlndXJlKHggPT4geC5TZXRMZXhlcihsZXhlcikpOwotCi0gICAgICAgICAgICBfcGFyc2VyLlBhcnNlKCJBQkMiKTsKLQotICAgICAgICAgICAgbGV4ZXIuQXNzZXJ0V2FzQ2FsbGVkKHggPT4geC5Ub2tlbml6ZSgiQUJDIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlclNob3VsZENhbGxHcmFwaEJ1aWxkZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGV4ZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8SUxleGVyPigpOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PFRva2VuPigpOwotICAgICAgICAgICAgbGV4ZXIuU3R1Yih4ID0+IHguVG9rZW5pemUoIkFCQyIpKS5SZXR1cm4odG9rZW5zKTsKLSAgICAgICAgICAgIHZhciBncmFwaEJ1aWxkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8SUV4cHJlc3Npb25HcmFwaEJ1aWxkZXI+KCk7Ci0gICAgICAgICAgICBncmFwaEJ1aWxkZXIuU3R1Yih4ID0+IHguQnVpbGQodG9rZW5zKSkuUmV0dXJuKG5ldyBFeEdyYXBoKCkpOwotCi0gICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZShjb25maWcgPT4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgLlNldExleGVyKGxleGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgLlNldEdyYXBoQnVpbGRlcihncmFwaEJ1aWxkZXIpOwotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBfcGFyc2VyLlBhcnNlKCJBQkMiKTsKLQotICAgICAgICAgICAgZ3JhcGhCdWlsZGVyLkFzc2VydFdhc0NhbGxlZCh4ID0+IHguQnVpbGQodG9rZW5zKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFyc2VyU2hvdWxkQ2FsbENvbXBpbGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxleGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElMZXhlcj4oKTsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBuZXcgTGlzdDxUb2tlbj4oKTsKLSAgICAgICAgICAgIGxleGVyLlN0dWIoeCA9PiB4LlRva2VuaXplKCJBQkMiKSkuUmV0dXJuKHRva2Vucyk7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRHcmFwaCA9IG5ldyBFeEdyYXBoKCk7Ci0gICAgICAgICAgICBleHBlY3RlZEdyYXBoLkFkZChuZXcgU3RyaW5nRXhwcmVzc2lvbigiYXNkZiIpKTsKLSAgICAgICAgICAgIHZhciBncmFwaEJ1aWxkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8SUV4cHJlc3Npb25HcmFwaEJ1aWxkZXI+KCk7Ci0gICAgICAgICAgICBncmFwaEJ1aWxkZXIuU3R1Yih4ID0+IHguQnVpbGQodG9rZW5zKSkuUmV0dXJuKGV4cGVjdGVkR3JhcGgpOwotICAgICAgICAgICAgdmFyIGNvbXBpbGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElFeHByZXNzaW9uQ29tcGlsZXI+KCk7Ci0gICAgICAgICAgICBjb21waWxlci5TdHViKHggPT4geC5Db21waWxlKGV4cGVjdGVkR3JhcGguRXhwcmVzc2lvbnMpKS5SZXR1cm4obmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcikpOwotCi0gICAgICAgICAgICBfcGFyc2VyLkNvbmZpZ3VyZShjb25maWcgPT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25maWcKLSAgICAgICAgICAgICAgICAgICAgLlNldExleGVyKGxleGVyKQotICAgICAgICAgICAgICAgICAgICAuU2V0R3JhcGhCdWlsZGVyKGdyYXBoQnVpbGRlcikKLSAgICAgICAgICAgICAgICAgICAgLlNldEV4cHJlc2lvbkNvbXBpbGVyKGNvbXBpbGVyKTsKLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBfcGFyc2VyLlBhcnNlKCJBQkMiKTsKLQotICAgICAgICAgICAgY29tcGlsZXIuQXNzZXJ0V2FzQ2FsbGVkKHggPT4geC5Db21waWxlKGV4cGVjdGVkR3JhcGguRXhwcmVzc2lvbnMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZUF0U2hvdWxkQ2FsbEV4Y2VsRGF0YVByb3ZpZGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgZXhjZWxEYXRhUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAuU3R1Yih4ID0+IHguR2V0UmFuZ2VGb3JtdWxhKHN0cmluZy5FbXB0eSwgMSwgMSkpCi0gICAgICAgICAgICAgICAgLlJldHVybigiU3VtKDEsMikiKTsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihleGNlbERhdGFQcm92aWRlcik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlQXQoIkExIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlQXRTaG91bGRUaHJvd0lmQWRkcmVzc0lzTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzZXIuUGFyc2VBdChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CYXNpY0NhbGNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CYXNpY0NhbGNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4N2Y1ZS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQmFzaWNDYWxjVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci0KLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEJhc2ljQ2FsY1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKGV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRBZGRJbnRlZ2Vyc0NvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIxICsgMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFN1YnRyYWN0SW50ZWdlcnNDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMiAtIDEiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRNdWx0aXBseUludGVnZXJzQ29ycmVjdGx5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjIgKiAzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkRGl2aWRlSW50ZWdlcnNDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiOCAvIDQiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGREaXZpZGVEZWNpbWFsV2l0aEludGVnZXJDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi41LzIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjI1ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVFeHBDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMiBeIDQiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlRXhwV2l0aERlY2ltYWxDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi41IF4gMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYuMjVkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZE11bHRpcGx5RGVjaW1hbFdpdGhEZWNpbWFsQ29ycmVjdGx5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjIuNSAqIDEuNSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuNzVkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRocmVlR3JlYXRlclRoYW5Ud29TaG91bGRCZVRydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA+IDIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUxlc3NUaGFuVHdvU2hvdWxkQmVGYWxzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIzIDwgMiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUxlc3NUaGFuT3JFcXVhbFRvVGhyZWVTaG91bGRCZVRydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA8PSAzIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGhyZWVMZXNzVGhhbk9yRXF1YWxUb1R3b0RvdFRocmVlU2hvdWxkQmVGYWxzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIzIDw9IDIuMyIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZUdyZWF0ZXJUaGFuT3JFcXVhbFRvVGhyZWVTaG91bGRCZVRydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMyA+PSAzIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVHdvRG90VHdvR3JlYXRlclRoYW5PckVxdWFsVG9UaHJlZVNob3VsZEJlRmFsc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiMi4yID49IDMiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVHdlbHZlQW5kVHdlbHZlU2hvdWxkQmVFcXVhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIyPTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUZW5QZXJjZW50U2hvdWxkQmUwUG9pbnQxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjEwJSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVNdWx0aXBsZVBlcmNlbnRTaWducygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIxMCUlIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4wMDEsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlUGVyY2VudGFnZU9uRnVuY3Rpb25SZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU1VNKDE7MjszKSUiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjA2LCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZVBlcmNlbnRhZ2VPblBhcmFudGV0aGlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIigxKzIpJSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMDMsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSWdub3JlTGVhZGluZ1BsdXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiKygxLTIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZEhhbmRsZURlY2ltYWxOdW1iZXJXaGVuRGl2aWRpbmdJbnRlZ2VycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIyMjQ1Njc0NTUvNDAwMDAwMDAwKjUwMDAwMCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDI4MDcwOS4zMTg3NSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGROZWdhdGVFeHByZXNzaW9uSW5QYXJlbnRoZXNpcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCItKDErMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRhYmFzZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRGF0YWJhc2VUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2YTc3MS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRhYmFzZVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgRGF0YWJhc2VUZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERnZXRTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUgPSAiY3JpdDMiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzIiXS5WYWx1ZSA9ICJvdXRwdXQiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQzMiXS5WYWx1ZSA9ICJhYWEiOwotICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiY3JpdDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiREdFVChBMTpDMyxcIkNyaXQzXCIsRDE6RTIpIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJvdXRwdXQiLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGNvdW50U2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlID0gImNyaXQzIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAib3V0cHV0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAiMiI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMzIl0uVmFsdWUgPSAiYWFhIjsKLSAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMSJdLlZhbHVlID0gImNyaXQyIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRDT1VOVChBMTpDMyxcIkNyaXQyXCIsRDE6RTIpIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEY291bnRhU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlID0gImNyaXQzIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAib3V0cHV0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAiMiI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMzIl0uVmFsdWUgPSAiYWFhIjsKLSAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJFMSJdLlZhbHVlID0gImNyaXQyIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRDT1VOVEEoQTE6QzMsXCJDcml0MlwiLEQxOkUyKSI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRE1heFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiY3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNyaXQyIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKLQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgLy8gY3JpdGVyaWEKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAidCp0IjsKLQotICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkYxIl0uRm9ybXVsYSA9ICJETUFYKEExOkIzLFwiQ3JpdDJcIixEMTpFMikiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBETWluU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOwotCi0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRNSU4oQTE6QjMsXCJDcml0MlwiLEQxOkUyKSI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgc2hlZXQuQ2VsbHNbIkYxIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERTdW1TaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7Ci0KLSAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiRFNVTShBMTpCMyxcIkNyaXQyXCIsRDE6RTIpIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgREF2ZXJhZ2VTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJjcml0MiI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJ0ZXNzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgICAgIC8vIGNyaXRlcmlhCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiY3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMiJdLlZhbHVlID0gInQqdCI7Ci0KLSAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbgotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGMSJdLkZvcm11bGEgPSAiREFWRVJBR0UoQTE6QjMsXCJDcml0MlwiLEQxOkUyKSI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLjVkLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRFZhclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiY3JpdDEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImNyaXQyIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gInRlc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMjsKLQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gInRlc3N0IjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgLy8gY3JpdGVyaWEKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAidCp0IjsKLQotICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkYxIl0uRm9ybXVsYSA9ICJEVkFSKEExOkIzLFwiQ3JpdDJcIixEMTpFMikiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC41ZCwgc2hlZXQuQ2VsbHNbIkYxIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERWYXJwU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOwotCi0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRWQVJQKEExOkIzLFwiQ3JpdDJcIixEMTpFMikiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4yNWQsIHNoZWV0LkNlbGxzWyJGMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEVmFycFNob3VsZFJldHVybkJ5RmllbGRJbmRleCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJjcml0MSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiY3JpdDIiOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAidGVzdCI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAyOwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAidGVzc3QiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICAvLyBjcml0ZXJpYQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEMSJdLlZhbHVlID0gImNyaXQxIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRDIiXS5WYWx1ZSA9ICJ0KnQiOwotCi0gICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjEiXS5Gb3JtdWxhID0gIkRWQVJQKEExOkIzLDIsRDE6RTIpIjsKLQotICAgICAgICAgICAgICAgIHNoZWV0Lldvcmtib29rLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMjVkLCBzaGVldC5DZWxsc1siRjEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRlQW5kVGltZUZ1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRGF0ZUFuZFRpbWVGdW5jdGlvbnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNjRjNC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9EYXRlQW5kVGltZUZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBEYXRlQW5kVGltZUZ1bmN0aW9uc1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKGV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJEYXRlKDIwMTIsIDIsIDIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IERhdGVUaW1lKDIwMTIsIDIsIDIpLlRvT0FEYXRlKCksIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGF0ZVNob3VsZEhhbmRsZUNlbGxSZWZlcmVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDIwMTJkOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiRGF0ZShBMSwgMiwgMikiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IERhdGVUaW1lKDIwMTIsIDIsIDIpLlRvT0FEYXRlKCksIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUb2RheVNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVG9kYXkoKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUoRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKXJlc3VsdCksIHR5cGVvZihEYXRlVGltZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5vd1Nob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgibm93KCkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSlyZXN1bHQpLCB0eXBlb2YoRGF0ZVRpbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXlTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkRheShEYXRlKDIwMTIsIDQsIDIpKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTW9udGhTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk1vbnRoKERhdGUoMjAxMiwgNCwgMikpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBZZWFyU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJZZWFyKERhdGUoMjAxMiwgMiwgMikpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAxMiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUaW1lU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFJlc3VsdCA9ICgoZG91YmxlKSgxMiAqIDYwICogNjAgKyAxMyAqIDYwICsgMTQpKS8oKGRvdWJsZSkoMjQgKiA2MCAqIDYwKSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVGltZSgxMiwgMTMsIDE0KSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEhvdXJTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkhPVVIoVGltZSgxMiwgMTMsIDE0KSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNaW51dGVTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIm1pbnV0ZShUaW1lKDEyLCAxMywgMTQpKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNlY29uZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU2Vjb25kKFRpbWUoMTIsIDEzLCA1OSkpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTksIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2Vjb25kU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5QYXJzaW5nU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlNlY29uZChcIjEwOjEyOjE0XCIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWludXRlU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdoZW5QYXJzaW5nU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk1pbnV0ZShcIjEwOjEyOjE0IEFNXCIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSG91clNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuUGFyc2luZ1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJIb3VyKFwiMTA6MTI6MTRcIikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEYXkzNjBTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkRheXMzNjAoRGF0ZSgyMDEyLCA0LCAyKSwgRGF0ZSgyMDEyLCA1LCAyKSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBZZWFyZnJhY1Nob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiWWVhcmZyYWMoRGF0ZSgyMDEyLCA0LCAyKSwgRGF0ZSgyMDEyLCA1LCAyKSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzb1dlZWtOdW1TaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIklzb1dlZWtOdW0oRGF0ZSgyMDEyLCA0LCAyKSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGludCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVvbW9udGhTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkVvbW9udGgoRGF0ZSgyMDEzLCAyLCAyKSwgMykiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdvcmtkYXlTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIldvcmtkYXkoRGF0ZSgyMDEzLCAyLCAyKSwgMykiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERhdGVOb3RFcXVhbFRvU3RyaW5nU2hvdWxkQmVUcnVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRPREFZKCkgPD4gXCJcIiIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0aW9uNSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJKb2huIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gIkRvZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5Gb3JtdWxhID0gIkIxJlwiLCBcIiZBMSI7Ci0gICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRG9lLCBKb2huIiwgd3MuQ2VsbHNbIkMxIl0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEhvdXJXaXRoRXhjZWxSZWZlcmVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxNCwgMSwgMSwgMTAsIDExLCAxMikuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLkZvcm11bGEgPSAiSE9VUihBMSkiOwotICAgICAgICAgICAgd3MuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAsIHdzLkNlbGxzWyJCMSJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNaW51dGVXaXRoRXhjZWxSZWZlcmVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxNCwgMSwgMSwgMTAsIDExLCAxMikuVG9PQURhdGUoKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLkZvcm11bGEgPSAiTUlOVVRFKEExKSI7Ci0gICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMSwgd3MuQ2VsbHNbIkIxIl0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNlY29uZFdpdGhFeGNlbFJlZmVyZW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxLCAxLCAxMCwgMTEsIDEyKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJTRUNPTkQoQTEpIjsKLSAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLCB3cy5DZWxsc1siQjEiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9NYXRoRXhjZWxSYW5nZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvTWF0aEV4Y2VsUmFuZ2VUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMmM5Yy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9NYXRoRXhjZWxSYW5nZVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zLkV4Y2VsUmFuZ2VzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgTWF0aEV4Y2VsUmFuZ2VUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluaXRpYWxpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotCi0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDY7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZS5EaXNwb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWJzU2hvdWxkUmV0dXJuMygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJBQlMoQTIpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZFJldHVybjMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlQoQTE6QTMpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudFNob3VsZFJldHVybjJJZkFDZWxsVmFsdWVJc051bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJDT1VOVChBMTpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZFJldHVybjMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRBKEExOkEzKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRJZlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQ09VTlRJRihBMTpBMywgXCI+MlwiKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4U2hvdWxkUmV0dXJuNigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJNYXgoQTE6QTMpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg2ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNaW5TaG91bGRSZXR1cm4xKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5Gb3JtdWxhID0gIk1pbihBMTpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRSZXR1cm4zUG9pbnQzMzMzMzMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiQXZlcmFnZShBMTpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkICsgKDFkLzNkKSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZTaG91bGRIYW5kbGVTaW5nbGVSYW5nZU51bWVyaWNFeHByZXNzaW9uTWF0Y2goKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gIkIiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiPjFcIikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXZlcmFnZUlmU2hvdWxkSGFuZGxlU2luZ2xlUmFuZ2VTdHJpbmdNYXRjaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiQUJDIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAiMyI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiPjFcIikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LjVkLCBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlSWZTaG91bGRIYW5kbGVMb29rdXBSYW5nZVN0cmluZ01hdGNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJhYmMiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9ICJkZWYiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9ICJhYmQiOwotCi0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNCJdLlZhbHVlID0gNjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkI1Il0uVmFsdWUgPSA3OwotCi0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLkZvcm11bGEgPSAiQXZlcmFnZUlmKEExOkE1LFwiYWJjXCIsQjE6QjUpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZlNob3VsZEhhbmRsZUxvb2t1cFJhbmdlU3RyaW5nTnVtZXJpY01hdGNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMjsKLQotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSAyOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlID0gODsKLQotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5Gb3JtdWxhID0gIkF2ZXJhZ2VJZihBMTpBNSxcIj4yXCIsQjE6QjUpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VJZlNob3VsZEhhbmRsZUxvb2t1cFJhbmdlU3RyaW5nV2lsZENhcmRNYXRjaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiYWJjIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiYWJjIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiZGVmIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiZGVmIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAiYWJkIjsKLQotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlID0gODsKLQotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5Gb3JtdWxhID0gIkF2ZXJhZ2VJZihBMTpBNSwgXCJhYipcIixCMTpCNSkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtUHJvZHVjdFdpdGhSYW5nZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gNDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJTVU1QUk9EVUNUKEExOkEzLEIxOkIzKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjlkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVByb2R1Y3RXaXRoUmFuZ2VBbmRWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gNTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSA2OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU1VNUFJPRFVDVChBMTpBMyxCMTpCMyx7Miw0LDF9KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNzBkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpZ25TaG91bGRSZXR1cm4xV2hlblJlZklzUG9zaXRpdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU0lHTihBMSkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1YlRvdGFsU2hvdWxkTm90SW5jbHVkZUhpZGRlblJvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuUm93KDIpLkhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMTA5LEExOkEzKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoN2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9UZXh0RXhjZWxSYW5nZVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvRXhjZWxSYW5nZXMvVGV4dEV4Y2VsUmFuZ2VUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyZTViNi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9UZXh0RXhjZWxSYW5nZVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMuRXhjZWxSYW5nZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBUZXh0RXhjZWxSYW5nZVRlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgX3dvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7Ci0KLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gNjsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeGFjdFNob3VsZFJldHVyblRydWVXaGVuRXF1YWxWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiRVhBQ1QoQTEsQTIpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGaW5kU2hvdWxkUmV0dXJuSW5kZXgoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gImhvcHAiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJoZWogaG9wcCI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiRmluZChBMSxBMikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9FeGNlbFJhbmdlcy9Xb3Jrc2hlZXRSZWZzVGVzdC5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL1dvcmtzaGVldFJlZnNUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdhMDQ5Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0V4Y2VsUmFuZ2VzL1dvcmtzaGVldFJlZnNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMuRXhjZWxSYW5nZXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBXb3Jrc2hlZXRSZWZzVGVzdAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX2ZpcnN0U2hlZXQ7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3NlY29uZFNoZWV0OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgSW5pdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgX2ZpcnN0U2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQxIik7Ci0gICAgICAgICAgICBfc2Vjb25kU2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQyIik7Ci0gICAgICAgICAgICBfZmlyc3RTaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBfZmlyc3RTaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVSZWZlcmVuY2VUb090aGVyU2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2Vjb25kU2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVU0oJ3NoZWV0MSchQTE6QTIpIjsKLSAgICAgICAgICAgIF9zZWNvbmRTaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgX3NlY29uZFNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVSZWZlcmVuY2VUb090aGVyU2hlZXRXaXRoQ29tcGxleE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiYWIjay4uMiIpOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAyOwotICAgICAgICAgICAgX3NlY29uZFNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VNKCdhYiNrLi4yJ0ExOkEyKSI7Ci0gICAgICAgICAgICBfc2Vjb25kU2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIF9zZWNvbmRTaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlSW52YWxpZFJlZigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJhYiNrLi4yIik7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfc2Vjb25kU2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVU0oJ2FiI2suLjJBMTpBMicpIjsKLSAgICAgICAgICAgIF9zZWNvbmRTaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKF9zZWNvbmRTaGVldC5DZWxsc1siQTEiXS5WYWx1ZSwgdHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL0luZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTI4MWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvSW5mb3JtYXRpb25GdW5jdGlvbnNUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBSaGluby5Nb2NrczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEluZm9ybWF0aW9uRnVuY3Rpb25zVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc0JsYW5rU2hvdWxkUmV0dXJuQ29ycmVjdFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIklTQkxBTksoQTEpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNOdW1iZXJTaG91bGRSZXR1cm5Db3JyZWN0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSVNOVU1CRVIoMTAvMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc0Vycm9yU2hvdWxkUmV0dXJuVHJ1ZVdoZW5EaXZCeTAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiSVNFUlJPUigxMC8wKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzVGV4dFNob3VsZFJldHVyblRydWVXaGVuUmVmZXJlbmNlZENlbGxDb250YWluc1RleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gIkFiYyI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJJU1RFWFQoQTEpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzRXJyU2hvdWxkUmV0dXJuRmFsc2VJZkVycm9yQ29kZUlzTmEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9IEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZSgiI04vQSIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiSVNFUlIoQTEpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc05hU2hvdWxkUmV0dXJuVHJ1ZUNvZGVJc05hKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuUGFyc2UoIiNOL0EiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIklTTkEoQTEpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVycm9yVHlwZVNob3VsZFJldHVybkNvcnJlY3RFcnJvckNvZGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVsbCk7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEExKSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCk7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEEyKSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMyJdLkZvcm11bGEgPSAiRVJST1IuVFlQRShBMykiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlJlZik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI0Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE0KSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmFtZSk7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI1Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE1KSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVtKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjYiXS5Gb3JtdWxhID0gIkVSUk9SLlRZUEUoQTYpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTciXS5WYWx1ZSA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OQSk7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkI3Il0uRm9ybXVsYSA9ICJFUlJPUi5UWVBFKEE3KSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE4Il0uVmFsdWUgPSAxMDsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjgiXS5Gb3JtdWxhID0gIkVSUk9SLlRZUEUoQTgpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgbnVsbFJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlOwotICAgICAgICAgICAgICAgIHZhciBkaXYwUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgdmFyIHZhbHVlUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgdmFyIHJlZlJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNCJdLlZhbHVlOwotICAgICAgICAgICAgICAgIHZhciBuYW1lUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkI1Il0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgdmFyIG51bVJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNiJdLlZhbHVlOwotICAgICAgICAgICAgICAgIHZhciBuYVJlc3VsdCA9IHNoZWV0LkNlbGxzWyJCNyJdLlZhbHVlOwotICAgICAgICAgICAgICAgIHZhciBub0Vycm9yUmVzdWx0ID0gc2hlZXQuQ2VsbHNbIkI4Il0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG51bGxSZXN1bHQsICJOdWxsIGVycm9yIHdhcyBub3QgMSIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBkaXYwUmVzdWx0LCAiRGl2MCBlcnJvciB3YXMgbm90IDIiKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdmFsdWVSZXN1bHQsICJWYWx1ZSBlcnJvciB3YXMgbm90IDMiKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmVmUmVzdWx0LCAiUmVmIGVycm9yIHdhcyBub3QgNCIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCBuYW1lUmVzdWx0LCAiTmFtZSBlcnJvciB3YXMgbm90IDUiKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgbnVtUmVzdWx0LCAiTnVtIGVycm9yIHdhcyBub3QgNiIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3LCBuYVJlc3VsdCwgIk5BIGVycm9yIHdhcyBub3QgNyIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBub0Vycm9yUmVzdWx0LCAiTm8gZXJyb3IgZGlkIG5vdCByZXR1cm4gTi9BIGVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9Mb2dpY2FsRnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjQzNjUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvTG9naWNhbEZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIExvZ2ljYWxGdW5jdGlvbnNUZXN0cyA6IEZvcm11bGFQYXJzZXJUZXN0QmFzZQotICAgIHsKLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihleGNlbERhdGFQcm92aWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSWZTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIklmKDIgPCAzLCAxLCAyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElJZlNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaGVuSW5uZXJGdW5jdGlvbkV4aXN0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJJZihOT1QoT3IodHJ1ZSwgRkFMU0UpKSwgMSwgMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOb3RTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIm5vdCh0cnVlKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTk9UKGZhbHNlKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoYm9vbClyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFuZFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQW5kKHRydWUsIDEpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkFORCh0cnVlLCB0cnVlLCAxLCBmYWxzZSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT3JTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk9yKEZBTFNFLCAwKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKGJvb2wpcmVzdWx0KTsKLQotICAgICAgICAgICAgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiT1IodHJ1ZSwgdHJ1ZSwgMSwgZmFsc2UpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVHJ1ZVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVHJ1ZSgpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRmFsc2VTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkZhbHNlKCkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKChib29sKXJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9NYXRoRnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9NYXRoRnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMmZhYWEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvTWF0aEZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgTWF0aEZ1bmN0aW9uc1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKGV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQb3dlclNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUG93ZXIoMywgMykiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyN2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3FydFNob3VsZFJldHVybkNvcnJlY3RSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgic3FydCg5KSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBpU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gKGRvdWJsZSlNYXRoLlJvdW5kKE1hdGguUEksIDE0KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJQaSgpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRWYWx1ZSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDZWlsaW5nU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlID0gMjIuNGQ7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiY2VpbGluZygyMi4zNSwgMC4xKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRmxvb3JTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsdWUgPSAyMi4zZDsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJGbG9vcigyMi4zNSwgMC4xKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkVmFsdWUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhJbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoInN1bSgxLCAyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1bVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoRGVjaW1hbHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgic3VtKDEsMi41KSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMuNWQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtU2hvdWxkUmV0dXJuQ29ycmVjdFJlc3VsdFdpdGhFbnVtZXJhYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoInN1bSh7MTsyOzM7LTF9LCAyLjUpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNy41ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdW1zcVNob3VsZFJldHVybkNvcnJlY3RSZXN1bHRXaXRoRW51bWVyYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdW1zcSh7MjszfSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VtSWZTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoInN1bUlmKHsxOzI7MzsyfSwgMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5lZ2F0ZUV4cHJlc3Npb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiLXN1YnRvdGFsKDI7ezE7Mn0pIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTJkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0ZGV2U2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdGRldigxOzI7Mzs0KSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RkZXZQU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJzdGRldnAoMiwzLDQpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFeHBTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoImV4cCg0KSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWF4U2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNYXgoNCwgNSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1heGFTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk1heGEoNCwgNSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1pblNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgibWluKDQsIDUpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNaW5hU2hvdWxkQ2FsY3VsYXRlU3RyaW5nQXMwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gImEiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiTUlOQShBMTpCNCkiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwZCwgc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhZ2VTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkF2ZXJhZ2UoMiwgMiwgMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdmVyYWdlU2hvdWxkUmV0dXJuRGl2MElmRW1wdHlDZWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIkFWRVJBR0UoQTEpIjsKLSAgICAgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiNESVYvMCEiLCB3cy5DZWxsc1siQTIiXS5WYWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUm91bmQoMi4yLCAwKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kZG93blNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUm91bmRkb3duKDIuOTksIDEpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMi45ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZHVwU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJSb3VuZHVwKDIuOTksIDEpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3FydFBpU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJTcXJ0UGkoMi4yKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSW50U2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJJbnQoMi45KSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmFuZFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUmFuZCgpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSYW5kQmV0d2VlblNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUmFuZEJldHdlZW4oMSwyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ291bnRTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNvdW50KDEsMiwyLFwiNFwiKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50QVNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQ291bnRBKDEsMiwyLFwiXCIsIFwiYVwiKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDRkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvdW50SWZTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNvdW50SWYoezE7MjsyO1wiXCJ9LCBcIjJcIikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWYXJTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlZhcigxLDIsMykiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZhclBTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlZhclAoMSwyLDMpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNb2RTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk1vZCg1LDIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiU3VidG90YWwoMSwgMTAsIDIwKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVHJ1bmNTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlRydW5jKDEuMjM0NSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFByb2R1Y3RTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlByb2R1Y3QoMSwyLDMpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3NTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNvcygyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29zaFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQ29zaCgyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2luU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJTaW4oMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbmhTaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlNpbmgoMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRhblNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVGFuKDIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdGFuU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJBdGFuKDIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNJbnN0YW5jZU9mVHlwZShyZXN1bHQsIHR5cGVvZihkb3VibGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBBdGFuMlNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiQXRhbjIoMiwxKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGFuaFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVGFuaCgyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9nU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJMb2coMiwgMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb2cxMFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTG9nMTAoMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0luc3RhbmNlT2ZUeXBlKHJlc3VsdCwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExuU2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJMbigyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LklzSW5zdGFuY2VPZlR5cGUocmVzdWx0LCB0eXBlb2YoZG91YmxlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRmFjdFNob3VsZFJldHVybkFSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiRmFjdCgwKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFF1b3RpZW50U2hvdWxkUmV0dXJuQVJlc3VsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJRdW90aWVudCg1OzIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNZWRpYW5TaG91bGRSZXR1cm5BUmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIk1lZGlhbigxOzI7MykiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb3VudEJsYW5rU2hvdWxkQ2FsY3VsYXRlRW1wdHlDZWxscygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIkNPVU5UQkxBTksoQTE6QjQpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNywgc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZ3JlZXNTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkRFR1JFRVMoMC41KSIpOwotICAgICAgICAgICAgdmFyIHJvdW5kZWQgPSBNYXRoLlJvdW5kKChkb3VibGUpcmVzdWx0LCAzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyOC42NDgsIHJvdW5kZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEF2ZXJhdGVJZnNTaG91bGRDYWx1Y2xhdGVSZXN1bHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjQiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkY1Il0uVmFsdWUgPSAyOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGNiJdLkZvcm11bGEgPSAiMiArIDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJGNyJdLlZhbHVlID0gNDsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siRjgiXS5WYWx1ZSA9IDU7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSDQiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkg1Il0uVmFsdWUgPSAzOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJINiJdLkZvcm11bGEgPSAiMiArIDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJINyJdLlZhbHVlID0gNDsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSDgiXS5WYWx1ZSA9IDU7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSTQiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkk1Il0uVmFsdWUgPSAzOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJJNiJdLkZvcm11bGEgPSAiMiArIDIiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJJNyJdLlZhbHVlID0gNTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSTgiXS5WYWx1ZSA9IDE7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siSDkiXS5Gb3JtdWxhID0gIkFWRVJBR0VJRlMoRjQ6Rjg7SDQ6SDg7XCI+M1wiO0k0Okk4O1wiPDVcIikiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LjVkLCBzaGVldC5DZWxsc1siSDkiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9SZWZBbmRMb29rdXBUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1JlZkFuZExvb2t1cFRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBiYWMxLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1JlZkFuZExvb2t1cFRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5CdWlsdEluRnVuY3Rpb25zCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUmVmQW5kTG9va3VwVGVzdHMgOiBGb3JtdWxhUGFyc2VyVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOwotICAgICAgICBjb25zdCBzdHJpbmcgV29ya3NoZWV0TmFtZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOwotICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldERpbWVuc2lvbkVuZChBcmc8c3RyaW5nPi5Jcy5Bbnl0aGluZykpLlJldHVybihuZXcgRXhjZWxDZWxsQWRkcmVzcygxMCwgMSkpOwotICAgICAgICAgICAgX3BhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKF9leGNlbERhdGFQcm92aWRlcik7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZMb29rdXBTaG91bGRSZXR1cm5Db3JyZXNwb25kaW5nVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkEzIl0uRm9ybXVsYSA9ICJWTE9PS1VQKDIsICIgKyBsb29rdXBBZGRyZXNzICsgIiwgMikiOwotICAgICAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB3cy5DZWxsc1siQTMiXS5WYWx1ZTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWTG9va3VwU2hvdWxkUmV0dXJuQ2xvc2VzdFZhbHVlQmVsb3dJZkxhc3RBcmdJc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICB2YXIgbG9va3VwQWRkcmVzcyA9ICJBMTpCMiI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAzOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMyJdLkZvcm11bGEgPSAiVkxPT0tVUCg0LCAiICsgbG9va3VwQWRkcmVzcyArICIsIDIsIHRydWUpIjsKLSAgICAgICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gd3MuQ2VsbHNbIkEzIl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSExvb2t1cFNob3VsZFJldHVybkNvcnJlc3BvbmRpbmdWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5Gb3JtdWxhID0gIkhMT09LVVAoMiwgIiArIGxvb2t1cEFkZHJlc3MgKyAiLCAyKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBITG9va3VwU2hvdWxkUmV0dXJuQ2xvc2VzdFZhbHVlQmVsb3dJZkxhc3RBcmdJc1RydWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbG9va3VwQWRkcmVzcyA9ICJBMTpCMiI7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0RGltZW5zaW9uRW5kKEFyZzxzdHJpbmc+LklzLkFueXRoaW5nKSkuUmV0dXJuKG5ldyBFeGNlbENlbGxBZGRyZXNzKDUsIDUpKTsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oNSk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybigxKTsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKDIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkhMT09LVVAoNCwgIiArIGxvb2t1cEFkZHJlc3MgKyAiLCAyLCB0cnVlKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9va3VwU2hvdWxkUmV0dXJuTWF0Y2hpbmdWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsb29rdXBBZGRyZXNzID0gIkExOkIyIjsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwxLCAxKSkuUmV0dXJuKDMpOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDIpKS5SZXR1cm4oNSk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMiwgMSkpLlJldHVybig0KTsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRDZWxsVmFsdWUoV29ya3NoZWV0TmFtZSwyLCAyKSkuUmV0dXJuKDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkxPT0tVUCg0LCAiICsgbG9va3VwQWRkcmVzcyArICIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFNob3VsZFJldHVybkluZGV4T2ZNYXRjaGluZ1ZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxvb2t1cEFkZHJlc3MgPSAiQTE6QTIiOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldENlbGxWYWx1ZShXb3Jrc2hlZXROYW1lLDEsIDEpKS5SZXR1cm4oMyk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0Q2VsbFZhbHVlKFdvcmtzaGVldE5hbWUsMSwgMikpLlJldHVybig1KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJNQVRDSCgzLCAiICsgbG9va3VwQWRkcmVzcyArICIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3dTaG91bGRSZXR1cm5Sb3dOdW1iZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0UmFuZ2VGb3JtdWxhKCIiLCA0LCAxKSkuUmV0dXJuKCJSb3coKSIpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2VBdCgiQTQiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvd1Nob2xkSGFuZGxlUmVmZXJlbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlJPVyhBNCkiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBzMS5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uU2hvdWxkUmV0dXJuUm93TnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9fZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0UmFuZ2VWYWx1ZXMoIkI0IikpLlJldHVybihuZXcgTGlzdDxFeGNlbENlbGw+IHsgbmV3IEV4Y2VsQ2VsbChudWxsLCAiQ29sdW1uKCkiLCAwLCAwKSB9KTsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRSYW5nZUZvcm11bGEoIiIsIDQsIDIpKS5SZXR1cm4oIkNvbHVtbigpIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZUF0KCJCNCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uU2hvbGRIYW5kbGVSZWZlcmVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ09MVU1OKEI0KSI7Ci0gICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHMxLkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3dzU2hvdWxkUmV0dXJuTmJyT2ZSb3dzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFJhbmdlRm9ybXVsYSgiIiwgNCwgMSkpLlJldHVybigiUm93cyhBNTpCNykiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlQXQoIkE0Iik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb2x1bW5zU2hvdWxkUmV0dXJuTmJyT2ZDb2xzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkdldFJhbmdlRm9ybXVsYSgiIiwgNCwgMSkpLlJldHVybigiQ29sdW1ucyhBNTpCNykiKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlQXQoIkE0Iik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDaG9vc2VTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNob29zZSgxLCBcIkFcIiwgXCJCXCIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkEiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZHJlc3NTaG91bGRSZXR1cm5Db3JyZWN0UmVzdWx0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlN0dWIoeCA9PiB4LkV4Y2VsTWF4Um93cykuUmV0dXJuKDEyMzQ1KTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJBZGRyZXNzKDEsIDEpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiRBJDEiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZGlyZWN0U2hvdWxkUmV0dXJuQVJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTE6QTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkEzIl0uRm9ybXVsYSA9ICJTVU0oSW5kaXJlY3QoXCJBMTpBMlwiKSkiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgczEuQ2VsbHNbIkEzIl0uVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJTVU0oSW5kaXJlY3QoXCJBMTpBXCIgJiBcIjJcIikpIjsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNGQsIHMxLkNlbGxzWyJBNCJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BU2luZ2xlVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMyJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJPRkZTRVQoQTEsIDIsIDEpIjsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjMiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiU1VNKE9GRlNFVChBMTpBMywgMCwgMSkpIjsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXREaXJlY3RSZWZlcmVuY2VUb011bHRpUmFuZ2VTaG91bGRTZXRWYWx1ZUVycm9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMiJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIk9GRlNFVChBMTpBMywgMCwgMSkiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBzMS5DZWxsc1siQTUiXS5WYWx1ZTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRSZXR1cm5BUmFuZ2VBY2NvcmRpbmdUb1dpZHRoKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjEiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMiJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIzIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQTUiXS5Gb3JtdWxhID0gIlNVTShPRkZTRVQoQTE6QTMsIDAsIDEsIDIpKSI7Ci0gICAgICAgICAgICAgICAgczEuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJkLCBzMS5DZWxsc1siQTUiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgT2Zmc2V0U2hvdWxkUmV0dXJuQVJhbmdlQWNjb3JkaW5nVG9IZWlnaHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJCMSJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkIyIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQjMiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJDMSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkMyIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQzMiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJBNSJdLkZvcm11bGEgPSAiU1VNKE9GRlNFVChBMTpBMywgMCwgMSwgMiwgMikpIjsKLSAgICAgICAgICAgICAgICBzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNmQsIHMxLkNlbGxzWyJBNSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPZmZzZXRTaG91bGRDb3Zlck11bHRpcGxlQ29sdW1ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgczEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkMxIl0uVmFsdWUgPSAxZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siQzIiXS5WYWx1ZSA9IDFkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJDMyJdLlZhbHVlID0gMWQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkQxIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgICAgICBzMS5DZWxsc1siRDIiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgICAgIHMxLkNlbGxzWyJEMyJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICAgICAgczEuQ2VsbHNbIkE1Il0uRm9ybXVsYSA9ICJTVU0oT0ZGU0VUKEExOkIzLCAwLCAyKSkiOwotICAgICAgICAgICAgICAgIHMxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg5ZCwgczEuQ2VsbHNbIkE1Il0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgVkxvb2t1cFNob3VsZEhhbmRsZU5hbWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXEJvb2szLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHMxID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgdmFyIHYgPSBzMS5DZWxsc1siWDEwIl0uRm9ybXVsYTsKLSAgICAgICAgICAgICAgICAvL3MxLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIHYgPSBzMS5DZWxsc1siWDEwIl0uRm9ybXVsYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1N0cmluZ0Z1bmN0aW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3RyaW5nRnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjU0N2QuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3RyaW5nRnVuY3Rpb25zVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMuQnVpbHRJbkZ1bmN0aW9ucwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFN0cmluZ0Z1bmN0aW9uc1Rlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsRGF0YVByb3ZpZGVyIF9wcm92aWRlcjsKLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9wYXJzZXIgPSBuZXcgRm9ybXVsYVBhcnNlcihfcHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRleHRTaG91bGRDb25jYXRlbmF0ZVdpdGhOZXh0RXhwcmVzc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm92aWRlci5TdHViKHggPT4geC5HZXRGb3JtYXQoMjMuNSwgIiQwLjAwIikpLlJldHVybigiJDIzLjUwIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiVEVYVCgyMy41LFwiJDAuMDBcIikgJiBcIiBwZXIgaG91clwiIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiQyMy41MCBwZXIgaG91ciIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTGVuU2hvdWxkQWRkTGVuZ3RoVXNpbmdTdXBwbGllZE9wZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkxlbihcImFiY1wiKSArIDIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb3dlclNob3VsZFJldHVybkFMb3dlckNhc2VTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTG93ZXIoXCJBQkNcIikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYWJjIiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBVcHBlclNob3VsZFJldHVybkFuVXBwZXJDYXNlU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlVwcGVyKFwiYWJjXCIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkFCQyIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTGVmdFNob3VsZFJldHVyblN1YnN0cmluZ0Zyb21MZWZ0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkxlZnQoXCJhYmFjZFwiLCAyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJhYiIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmlnaHRTaG91bGRSZXR1cm5TdWJzdHJpbmdGcm9tUmlnaHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUklHSFQoXCJhYmFjZFwiLCAyKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJjZCIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTWlkU2hvdWxkUmV0dXJuU3Vic3RyaW5nQWNjb3JkaW5nVG9QYXJhbXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiTWlkKFwiYWJhY2RcIiwgMiwgMikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYmEiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcGxhY2VTaG91bGRSZXR1cm5TdWJzdHJpbmdBY2NvcmRpbmdUb1BhcmFtcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCJSZXBsYWNlKFwidGVzdGFyXCIsIDMsIDMsIFwiaGVqXCIpIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlaGVqciIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3Vic3RpdHV0ZVNob3VsZFJldHVyblN1YnN0cmluZ0FjY29yZGluZ1RvUGFyYW1zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlN1YnN0aXR1dGUoXCJ0ZXN0YXIgdGVzdGFyXCIsIFwiZXNcIiwgXCJ4eFwiKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0eHh0YXIgdHh4dGFyIiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb25jYXRlbmF0ZVNob3VsZFJldHVybkFjY29yZGluZ1RvUGFyYW1zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIkNPTkNBVEVOQVRFKFwiT25lXCIsIFwiVHdvXCIsIFwiVGhyZWVcIikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiT25lVHdvVGhyZWUiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRTaG91bGRSZXR1cm5UZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIlQoXCJPbmVcIikiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiT25lIiwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZXB0U2hvdWxkQ29uY2F0ZW5hdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiUkVQVChcIipcIiwzKSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIqKioiLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9CdWlsdEluRnVuY3Rpb25zL1N1YnRvdGFsVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YjhiYzcuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvU3VidG90YWxUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBTdWJ0b3RhbFRlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgX3BhcnNlciA9IF93b3Jrc2hlZXQuV29ya2Jvb2suRm9ybXVsYVBhcnNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYW51cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX0F2ZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCgxLCBBMjpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9Db3VudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCgyLCBBMjpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMWQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9Db3VudEEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoMywgQTI6QTMpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBNTpBNikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fTWF4KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDQsIEEyOkEzKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOSwgQTU6QTYpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX01pbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg1LCBBMjpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9Qcm9kdWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDYsIEEyOkEzKSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOSwgQTU6QTYpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX1N0ZGV2KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDcsIEEyOkE0KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMiJdLkZvcm11bGEgPSAiU1VCVE9UQUwoNywgQTU6QTYpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSA1ZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSA0ZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE1Il0uVmFsdWUgPSAyZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkE2Il0uVmFsdWUgPSA0ZDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5DZWxsc1siQTEiXS5WYWx1ZTsKLSAgICAgICAgICAgIHJlc3VsdCA9IE1hdGguUm91bmQoKGRvdWJsZSlyZXN1bHQsIDkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuNzA3MTA2NzgxZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX1N0ZGV2UCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg4LCBBMjpBNCkiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDgsIEE1OkE2KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gNWQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNCJdLlZhbHVlID0gNGQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNiJdLlZhbHVlID0gNGQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC41ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0b3RhbFNob3VsZE5vdEluY2x1ZGVTdWJ0b3RhbENoaWxkcmVuX1N1bSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg5LCBBMjpBMykiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTIiXS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksIEE1OkE2KSI7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBNSJdLlZhbHVlID0gMmQ7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMmQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3VidG90YWxTaG91bGROb3RJbmNsdWRlU3VidG90YWxDaGlsZHJlbl9WYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiU1VCVE9UQUwoOSwgQTI6QTQpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg4LCBBNTpBNikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDRkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSA9IDRkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDlkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1YnRvdGFsU2hvdWxkTm90SW5jbHVkZVN1YnRvdGFsQ2hpbGRyZW5fVmFyUCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCgxMCwgQTI6QTQpIjsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVUJUT1RBTCg4LCBBNTpBNikiOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9IDVkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDRkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9IDJkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1siQTYiXS5WYWx1ZSA9IDRkOwotICAgICAgICAgICAgX3dvcmtzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuNWQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9UZXh0RnVuY3Rpb25zVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvQnVpbHRJbkZ1bmN0aW9ucy9UZXh0RnVuY3Rpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTYwZmQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0J1aWx0SW5GdW5jdGlvbnMvVGV4dEZ1bmN0aW9uc1Rlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5Mb2dnaW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkJ1aWx0SW5GdW5jdGlvbnMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBUZXh0RnVuY3Rpb25zVGVzdHMKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBIeXBlcmxpbmtTaG91bGRIYW5kbGVSZWZlcmVuY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIkhZUEVSTElOSyhCMSkiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIiwgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEh5cGVybGlua1Nob3VsZEhhbmRsZVJlZmVyZW5jZTIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5Gb3JtdWxhID0gIkhZUEVSTElOSyhCMSwgQjIpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5WYWx1ZSA9ICJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiRXBwbHVzIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkVwcGx1cyIsIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBIeXBlcmxpbmtTaG91bGRIYW5kbGVUZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJIWVBFUkxJTksoXCJ0ZXN0aW5nXCIpIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInRlc3RpbmciLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2hhclNob3VsZFJldHVybkNoYXJWYWxPZk51bWJlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ2hhcihBMikiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gNTU7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI3Iiwgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpeGVkU2hvdWxkSGF2ZUNvcnJlY3REZWZhdWx0VmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMikiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTIzNC41Njc4OwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2NzguVG9TdHJpbmcoIk4yIiksIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGaXhlZFNob3VsZFNldENvcnJlY3ROdW1iZXJPZkRlY2ltYWxzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMiw0KSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2Nzg5LlRvU3RyaW5nKCJONCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRml4ZWRTaG91bGRTZXROb0NvbW1hcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiRml4ZWQoQTIsNCx0cnVlKSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjM0LjU2Nzg5LlRvU3RyaW5nKCJGNCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRml4ZWRTaG91bGRIYW5kbGVOZWdhdGl2ZURlY2ltYWxzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICJGaXhlZChBMiwtMSx0cnVlKSI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEyIl0uVmFsdWUgPSAxMjM0LjU2Nzg5OwotICAgICAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjMwLlRvU3RyaW5nKCJGMCIpLCBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29uY2F0ZW5hdGVTaG91bGRIYW5kbGVSYW5nZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLkZvcm11bGEgPSAiQ29uY2F0ZW5hdGUoMSxBMikiOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gImhlbGxvIjsKLSAgICAgICAgICAgICAgICBzaGVldC5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjFoZWxsbyIsIHNoZWV0LkNlbGxzWyJBMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvZ3Rlc3QxKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOwotICAgICAgICAgICAgc3cuU3RhcnQoKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGRlbmlzLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuQ3JlYXRlVGV4dEZpbGVMb2dnZXIobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxsb2cxLnR4dCIpKTsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suRm9ybXVsYVBhcnNlci5Db25maWd1cmUoeCA9PiB4LkF0dGFjaExvZ2dlcihsb2dnZXIpKTsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3LlN0b3AoKTsKLSAgICAgICAgICAgIHZhciBlbGFwc2VkID0gc3cuRWxhcHNlZDsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHN0cmluZy5Gb3JtYXQoInswfSBzZWNvbmRzIiwgZWxhcHNlZC5Ub3RhbFNlY29uZHMpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9DYWxjRXh0ZW5zaW9uc1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0NhbGNFeHRlbnNpb25zVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzM0NTEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0NhbGNFeHRlbnNpb25zVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBDYWxjRXh0ZW5zaW9uc1Rlc3RzCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlQ2hhaW5UZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXGNoYWludGVzdC54bHN4IikpOwotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5DYWxjdWxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGVUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy92YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgLy92YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0KLSAgICAgICAgICAgIC8vd3MuU2V0VmFsdWUoIkExIiwgKHNob3J0KTEpOwotICAgICAgICAgICAgLy92YXIgdiA9IHBjay5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5QYXJzZSgiMi41LUNhbGMxIUExK2FicygzLjApLVNJTigzKSIpOwotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoNC4zNTg4Nzk5OTIsIE1hdGguUm91bmQoKGRvdWJsZSl2LCA5KSk7Ci0KLSAgICAgICAgICAgIHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNhbGMxIik7Ci0KLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJBMSIsIChzaG9ydCkxKTsKLSAgICAgICAgICAgIHZhciB2ID0gcGNrLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLlBhcnNlKCIyLjUtQ2FsYzEhQTErQUJTKC0zLjApLVNJTigzKSphYnMoNSkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLjc5NDM5OTk2LCBNYXRoLlJvdW5kKChkb3VibGUpdiw5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsY3VsYXRlVGVzdDIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDYWxjMSIpOwotCi0gICAgICAgICAgICB3cy5TZXRWYWx1ZSgiQTEiLCAoc2hvcnQpMSk7Ci0gICAgICAgICAgICB2YXIgdiA9IHBjay5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5QYXJzZSgiMyooMis1LjUqMikrMiowLjUrMyIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQzLCBNYXRoLlJvdW5kKChkb3VibGUpdiwgOSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvRm9ybXVsYUVycm9ySGFuZGxpbmdUZXN0QmFzZS5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9FcnJvckhhbmRsaW5nL0Zvcm11bGFFcnJvckhhbmRsaW5nVGVzdEJhc2UuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzljNTguLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvRm9ybXVsYUVycm9ySGFuZGxpbmdUZXN0QmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIEZvcm11bGFFcnJvckhhbmRsaW5nVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbFBhY2thZ2UgUGFja2FnZTsKLSAgICAgICAgcHJvdGVjdGVkIEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBCYXNlSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkaXIgPSBBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5OwotICAgICAgICAgICAgdmFyIFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhQYXRoLkNvbWJpbmUoZGlyLCAiV29ya2Jvb2tzIiwgIkZvcm11bGFUZXN0Lnhsc3giKSkpOwotICAgICAgICAgICAgV29ya3NoZWV0ID0gUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJWYWxpZGF0ZUZvcm11bGFzIl07Ci0gICAgICAgICAgICBQYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQmFzZUNsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWNrYWdlLkRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9FcnJvckhhbmRsaW5nL1N1bVRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvU3VtVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzkxOGEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Vycm9ySGFuZGxpbmcvU3VtVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuSW50ZWdyYXRpb25UZXN0cy5FcnJvckhhbmRsaW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTdW1tYXJ5IGRlc2NyaXB0aW9uIGZvciBTdW1UZXN0cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW1Rlc3RDbGFzcywgSWdub3JlXQotICAgIHB1YmxpYyBjbGFzcyBTdW1UZXN0cyA6IEZvcm11bGFFcnJvckhhbmRsaW5nVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xhc3NJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgQmFzZUluaXRpYWxpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2xlYW51cF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xhc3NDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQmFzZUNsZWFudXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVGVzdENvbnRleHQgdGVzdENvbnRleHRJbnN0YW5jZTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vL0dldHMgb3Igc2V0cyB0aGUgdGVzdCBjb250ZXh0IHdoaWNoIHByb3ZpZGVzCi0gICAgICAgIC8vL2luZm9ybWF0aW9uIGFib3V0IGFuZCBmdW5jdGlvbmFsaXR5IGZvciB0aGUgY3VycmVudCB0ZXN0IHJ1bi4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVGVzdENvbnRleHQgVGVzdENvbnRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RDb250ZXh0SW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q29udGV4dEluc3RhbmNlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbmdsZUNlbGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM2QsIFdvcmtzaGVldC5DZWxsc1siQjkiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTXVsdGlDZWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQwZCwgV29ya3NoZWV0LkNlbGxzWyJDOSJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwZCwgV29ya3NoZWV0LkNlbGxzWyJFOSJdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWZlcmVuY2VFcnJvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiI1JFRiEiLCBXb3Jrc2hlZXQuQ2VsbHNbIkg5Il0uVmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTmFtZU9uT3RoZXJTaGVldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMzBkLCBXb3Jrc2hlZXQuQ2VsbHNbIkk5Il0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFycmF5SW5jbFRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoN2QsIFdvcmtzaGVldC5DZWxsc1siSjkiXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIE5hbWVFcnJvcigpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIiNOQU1FPyIsIFdvcmtzaGVldC5DZWxsc1siTDkiXS5WYWx1ZSk7Ci0gICAgICAgIC8vfQotCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIC8vcHVibGljIHZvaWQgRGl2QnlaZXJvRXJyb3IoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgQXNzZXJ0LkFyZUVxdWFsKCIjRElWLzAhIiwgV29ya3NoZWV0LkNlbGxzWyJNOSJdLlZhbHVlKTsKLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0V4Y2VsRGF0YVByb3ZpZGVyVGVzdHMvRXhjZWxEYXRhUHJvdmlkZXJJbnRlZ3JhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0V4Y2VsRGF0YVByb3ZpZGVyVGVzdHMvRXhjZWxEYXRhUHJvdmlkZXJJbnRlZ3JhdGlvblRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThhMTNjLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9FeGNlbERhdGFQcm92aWRlclRlc3RzL0V4Y2VsRGF0YVByb3ZpZGVySW50ZWdyYXRpb25UZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzLkV4Y2VsRGF0YVByb3ZpZGVyVGVzdHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFQcm92aWRlckludGVncmF0aW9uVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxDZWxsIENyZWF0ZUl0ZW0ob2JqZWN0IHZhbCwgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENlbGwodmFsLCBudWxsLCAwLCByb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBTaG91bGRDYWxsUHJvdmlkZXJJblN1bUZ1bmN0aW9uQW5kQ2FsY3VsYXRlUmVzdWx0KCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlcyA9ICJBMTpBMiI7Ci0gICAgICAgIC8vICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgLy8gICAgcHJvdmlkZXIKLSAgICAgICAgLy8gICAgICAgIC5TdHViKHggPT4geC5HZXRSYW5nZVZhbHVlcyhzdHJpbmcuRW1wdHksIGV4cGVjdGVkQWRkcmVzKSkKLSAgICAgICAgLy8gICAgICAgIC5SZXR1cm4obmV3IG9iamVjdFtdIHsgMSwgMiB9KTsKLSAgICAgICAgLy8gICAgdmFyIHBhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKHByb3ZpZGVyKTsKLSAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZShzdHJpbmcuRm9ybWF0KCJzdW0oezB9KSIsIGV4cGVjdGVkQWRkcmVzKSk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCgzZCwgcmVzdWx0KTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBTaG91bGRFeGVjdXRlRm9ybXVsYUluUmFuZ2UoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIGV4cGVjdGVkQWRkcmVzID0gIkExOkEyIjsKLSAgICAgICAgLy8gICAgdmFyIHByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAvLyAgICBwcm92aWRlcgotICAgICAgICAvLyAgICAgICAgLlN0dWIoeCA9PiB4LkdldFJhbmdlVmFsdWVzKGV4cGVjdGVkQWRkcmVzKSkKLSAgICAgICAgLy8gICAgICAgIC5SZXR1cm4obmV3IG9iamVjdFtdIHsgMSwgbmV3IEV4Y2VsQ2VsbChudWxsLCAiU1VNKDEsMikiLCAwLCAxKSB9KTsKLSAgICAgICAgLy8gICAgdmFyIHBhcnNlciA9IG5ldyBGb3JtdWxhUGFyc2VyKHByb3ZpZGVyKTsKLSAgICAgICAgLy8gICAgdmFyIHJlc3VsdCA9IHBhcnNlci5QYXJzZShzdHJpbmcuRm9ybWF0KCJzdW0oezB9KSIsIGV4cGVjdGVkQWRkcmVzKSk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5BcmVFcXVhbCg0ZCwgcmVzdWx0KTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKSldCi0gICAgICAgIC8vcHVibGljIHZvaWQgU2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2UyKCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHZhciBleHBlY3RlZEFkZHJlcyA9ICJBMTpBMiI7Ci0gICAgICAgIC8vICAgIHZhciBwcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgLy8gICAgcHJvdmlkZXIKLSAgICAgICAgLy8gICAgICAgIC5TdHViKHggPT4geC5HZXRSYW5nZVZhbHVlcyhleHBlY3RlZEFkZHJlcykpCi0gICAgICAgIC8vICAgICAgICAuUmV0dXJuKG5ldyBFeGNlbENlbGxbXSB7IENyZWF0ZUl0ZW0oMSwgMCksIG5ldyBFeGNlbENlbGwobnVsbCwgIlNVTShBMTpBMikiLDAsIDEpIH0pOwotICAgICAgICAvLyAgICB2YXIgcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIocHJvdmlkZXIpOwotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLlBhcnNlKHN0cmluZy5Gb3JtYXQoInN1bSh7MH0pIiwgZXhwZWN0ZWRBZGRyZXMpKTsKLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Zvcm11bGFQYXJzZXJUZXN0QmFzZS5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9Gb3JtdWxhUGFyc2VyVGVzdEJhc2UuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Yjk3YzQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL0Zvcm11bGFQYXJzZXJUZXN0QmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgRm9ybXVsYVBhcnNlciBfcGFyc2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9PcGVyYXRvcnNUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9PcGVyYXRvcnNUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3ZTdhNS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0ludGVncmF0aW9uVGVzdHMvT3BlcmF0b3JzVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkludGVncmF0aW9uVGVzdHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBPcGVyYXRvcnNUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dzOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRXJyb3JWYWx1ZSBEaXZCeVplcm8gPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuRGl2MCk7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICBfd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERpdkJ5WmVyb1Nob3VsZFJldHVybkVycm9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF93cy5DYWxjdWxhdGUoIjEwLzAgKyAzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGl2QnlaZXJvLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL1ByZWNlZGVuY2VUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvSW50ZWdyYXRpb25UZXN0cy9QcmVjZWRlbmNlVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMGZjMTcuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9JbnRlZ3JhdGlvblRlc3RzL1ByZWNlZGVuY2VUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5JbnRlZ3JhdGlvblRlc3RzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUHJlY2VkZW5jZVRlc3RzIDogRm9ybXVsYVBhcnNlclRlc3RCYXNlCi0gICAgewotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhjZWxEYXRhUHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfcGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIoZXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbHVjbGF0ZVVzaW5nUHJlY2VkZW5jZU11bHRpcGx5QmVmb3JlQWRkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjQgKyA2ICogMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE2ZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDYWx1Y2xhdGVVc2luZ1ByZWNlZGVuY2VEaXZpZGVCZWZvcmVBZGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3BhcnNlci5QYXJzZSgiNCArIDYgLyAyIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoN2QsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ2FsY3VsYXRlVHdvR3JvdXBzVXNpbmdEaXZpZGVBbmRNdWx0aXBseUJlZm9yZVN1YnRyYWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIjQvMiArIDMgKiAzIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTFkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENhbGN1bGF0ZUV4cHJlc3Npb25XaXRoaW5QYXJlbnRoZXNpc0JlZm9yZU11bHRpcGx5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wYXJzZXIuUGFyc2UoIigyKzQpICogMiIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDb25jYXRBZnRlckFkZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIyICsgNCAmIFwiYWJjXCIiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiNmFiYyIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQnVnZml4dGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfcGFyc2VyLlBhcnNlKCIoMSsyKSszXjIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0NoYXJIYW5kbGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9DaGFySGFuZGxlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTAzMzc3Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0NoYXJIYW5kbGVyVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi3vu791c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIENoYXJIYW5kbGVyVGVzdHMKLSAgICB7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9OZWdhdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvTmVnYXRpb25UZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmOWIwZC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9OZWdhdGlvblRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci0KLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgTmVnYXRpb25UZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBfdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXROZWdhdG9yT25GaXJzdFRva2VuSWZGaXJzdENoYXJJc01pbnVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIi0xIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2Vucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkZpcnN0KCkuVG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDaGFuZ2VQbHVzVG9NaW51c0lmTmVnYXRvcklzUHJlc2VudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICIxICsgLTEiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVyYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgxKS5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCItIiwgdG9rZW5zLkVsZW1lbnRBdCgxKS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0TmVnYXRvck9uVG9rZW5JbnNpZGVQYXJlbnRoZXRoaXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiMSArICgtMSAqIDIpIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDgsIHRva2Vucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgzKS5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFNldE5lZ2F0b3JPblRva2VuSW5zaWRlRnVuY3Rpb25DYWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIkNlaWxpbmcoLTEsIC0wLjEpIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDgsIHRva2Vucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgyKS5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5OZWdhdG9yLCB0b2tlbnMuRWxlbWVudEF0KDUpLlRva2VuVHlwZSwgIk5lZ2F0b3IgYWZ0ZXIgY29tbWEgd2FzIG5vdCBpZGVudGlmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkU2V0TmVnYXRvck9uVG9rZW5JbkVudW1lcmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiey0xfSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk5lZ2F0b3IsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRTZXROZWdhdG9yT25FeGNlbEFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiLUExIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmVnYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgwKS5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5FeGNlbEFkZHJlc3MsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXJUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5MDViZS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Tb3VyY2VDb2RlVG9rZW5pemVyVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFNvdXJjZUNvZGVUb2tlbml6ZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7Ci0KLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBTZXR1cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBfdG9rZW5pemVyID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdENsZWFudXBdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFudXAoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlVG9rZW5zRm9yU3RyaW5nQ29ycmVjdGx5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiYWJjMTIzXCIiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5TdHJpbmcsIHRva2Vucy5GaXJzdCgpLlRva2VuVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuU3RyaW5nLCB0b2tlbnMuTGFzdCgpLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVG9rZW5pemVTdHJpbmdDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiJ2FiKGMpZCciOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZVRva2Vuc0ZvckZ1bmN0aW9uQ29ycmVjdGx5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIlRleHQoMikiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5GdW5jdGlvbiwgdG9rZW5zLkZpcnN0KCkuVG9rZW5UeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzLCB0b2tlbnMuRWxlbWVudEF0KDEpLlRva2VuVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkludGVnZXIsIHRva2Vucy5FbGVtZW50QXQoMikuVG9rZW5UeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMiIsIHRva2Vucy5FbGVtZW50QXQoMikuVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMsIHRva2Vucy5MYXN0KCkuVG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRIYW5kbGVNdWx0aXBsZUNoYXJPcGVyYXRvckNvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICIxIDw9IDIiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI8PSIsIHRva2Vucy5FbGVtZW50QXQoMSkuVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVyYXRvciwgdG9rZW5zLkVsZW1lbnRBdCgxKS5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZVRva2Vuc0ZvckVudW1lcmFibGVDb3JyZWN0bHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiVGV4dCh7MTsyfSkiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoOCwgdG9rZW5zLkNvdW50KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSwgdG9rZW5zLkVsZW1lbnRBdCgyKS5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5DbG9zaW5nRW51bWVyYWJsZSwgdG9rZW5zLkVsZW1lbnRBdCg2KS5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZVRva2Vuc0ZvckV4Y2VsQWRkcmVzc0NvcnJlY3RseSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICJUZXh0KEExKSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuRXhjZWxBZGRyZXNzLCB0b2tlbnMuRWxlbWVudEF0KDIpLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlVG9rZW5Gb3JQZXJjZW50QWZ0ZXJEZWNpbWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIjEsMjMlIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuUGVyY2VudCwgdG9rZW5zLkxhc3QoKS5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZElnbm9yZVR3b1N1YnNlcXVlbnRTdHJpbmdJZGVudGlmeWVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICJcImhlbGxvXCJcIndvcmxkXCIiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHRva2Vucy5Db3VudCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGVsbG9cIndvcmxkIiwgdG9rZW5zLkVsZW1lbnRBdCgxKS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkSWdub3JlVHdvU3Vic2VxdWVudFN0cmluZ0lkZW50aWZ5ZXJzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXFF1b3RlSXNzdWUyLnhsc3giKSkpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICJcIlwiXCJcIlwiXCIiOwotICAgICAgICAgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5TdHJpbmdDb250ZW50LCB0b2tlbnMuRWxlbWVudEF0KDEpLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9rZW5pemVyU2hvdWxkSWdub3JlT3BlcmF0b3JJblN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICJcIipcIiI7Ci0gICAgICAgICAgICB2YXIgdG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShpbnB1dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQsIHRva2Vucy5FbGVtZW50QXQoMSkuVG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUb2tlbml6ZXJTaG91bGRIYW5kbGVXb3Jrc2hlZXROYW1lV2l0aE1pbnVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIidBLUInIUExIjsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB0b2tlbnMuQ291bnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdEJ1ZzlfMTJfMTQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLygoIFc2MCAtKC0gVzYzICktKCBXMjkgKyBXMzAgKyBXMzEgKSkvKCBXMjMgKyBXMjggKyBXNDIgLSBXNTEgKSogVzQgKQotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzMSA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAxOyB4IDw9IDEwOyB4KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3czEuQ2VsbHNbeCwgMV0uVmFsdWUgPSB4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdzMS5DZWxsc1siQTExIl0uRm9ybXVsYSA9ICIoKCBBMSAtKC0gQTIgKS0oIEEzICsgQTQgKyBBNSApKS8oIEE2ICsgQTcgKyBBOCAtIEE5ICkqIEE1ICkiOwotICAgICAgICAgICAgICAgIC8vd3MxLkNlbGxzWyJBMTEiXS5Gb3JtdWxhID0gIigtQTIgKyAxICkiOwotICAgICAgICAgICAgICAgIHdzMS5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gd3MxLkNlbGxzWyJBMTEiXS5WYWx1ZTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTMuNzUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9TeW50YWN0aWNBbmFseXplclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU3ludGFjdGljQW5hbHl6ZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyNjNjNi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9TeW50YWN0aWNBbmFseXplclRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgU3ludGFjdGljQW5hbHl6ZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBJU3ludGFjdGljQW5hbHl6ZXIgX2FuYWx5c2VyOwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfYW5hbHlzZXIgPSBuZXcgU3ludGFjdGljQW5hbHl6ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRQYXNzSWZQYXJlbnRoZXNpc0FyZVdlbGxmb3JtZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIigiLCBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjEiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIjIiLCBUb2tlblR5cGUuSW50ZWdlciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcykKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBfYW5hbHlzZXIuQW5hbHl6ZShpbnB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEZvcm1hdEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUaHJvd0V4Y2VwdGlvbklmUGFyZW50aGVzZXNBcmVOb3RXZWxsZm9ybWVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IExpc3Q8VG9rZW4+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIxIiwgVG9rZW5UeXBlLkludGVnZXIpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiKyIsIFRva2VuVHlwZS5PcGVyYXRvciksCi0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCIyIiwgVG9rZW5UeXBlLkludGVnZXIpCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgX2FuYWx5c2VyLkFuYWx5emUoaW5wdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFBhc3NJZlN0cmluZ0lzV2VsbGZvcm1lZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBMaXN0PFRva2VuPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5TdHJpbmcpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiYWJjMTIzIiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpLAotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgX2FuYWx5c2VyLkFuYWx5emUoaW5wdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihGb3JtYXRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkVGhyb3dFeGNlcHRpb25JZlN0cmluZ0hhc05vdENsb3NpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuU3RyaW5nKSwKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oImFiYzEyMyIsIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIF9hbmFseXNlci5BbmFseXplKGlucHV0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUaHJvd0V4Y2VwdGlvbklmVGhlcmVJc0FuVW5yZWNvZ25pemVkVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgTGlzdDxUb2tlbj4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oImFiYzEyMyIsIFRva2VuVHlwZS5VbnJlY29nbml6ZWQpCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgX2FuYWx5c2VyLkFuYWx5emUoaW5wdXQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5GYWN0b3J5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkZhY3RvcnlUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkODM4NS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkZhY3RvcnlUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgVG9rZW5GYWN0b3J5VGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSVRva2VuRmFjdG9yeSBfdG9rZW5GYWN0b3J5OwotICAgICAgICBwcml2YXRlIElOYW1lVmFsdWVQcm92aWRlciBfbmFtZVZhbHVlUHJvdmlkZXI7Ci0KLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHZhciBleGNlbERhdGFQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxFeGNlbERhdGFQcm92aWRlcj4oKTsKLSAgICAgICAgICAgIF9uYW1lVmFsdWVQcm92aWRlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJTmFtZVZhbHVlUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfdG9rZW5GYWN0b3J5ID0gbmV3IFRva2VuRmFjdG9yeShjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBfbmFtZVZhbHVlUHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RDbGVhbnVwXQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhbnVwKCkKLSAgICAgICAgewotICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlQVN0cmluZ1Rva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIlwiIjsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcIiIsIHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuU3RyaW5nLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZVBsdXNBc09wZXJhdG9yVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiKyI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiKyIsIHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlTWludXNBc09wZXJhdG9yVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiLSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiLSIsIHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlTXVsdGlwbHlBc09wZXJhdG9yVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiKiI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiKiIsIHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuT3BlcmF0b3IsIHRva2VuLlRva2VuVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2hvdWxkQ3JlYXRlRGl2aWRlQXNPcGVyYXRvclRva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIi8iOwotICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIi8iLCB0b2tlbi5WYWx1ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLk9wZXJhdG9yLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZUVxdWFsc0FzT3BlcmF0b3JUb2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICI9IjsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCI9IiwgdG9rZW4uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5PcGVyYXRvciwgdG9rZW4uVG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRDcmVhdGVJbnRlZ2VyQXNJbnRlZ2VyVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiMjMiOwotICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjIzIiwgdG9rZW4uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5JbnRlZ2VyLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZUJvb2xlYW5Bc0Jvb2xlYW5Ub2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICJ0cnVlIjsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0cnVlIiwgdG9rZW4uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5Cb29sZWFuLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZENyZWF0ZURlY2ltYWxBc0RlY2ltYWxUb2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9ICIyMy4zIjsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMy4zIiwgdG9rZW4uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5EZWNpbWFsLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZFJlYWRGdW5jdGlvbnNGcm9tRnVuY1JlcG9zaXRvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiVGV4dCI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkZ1bmN0aW9uLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXh0IiwgdG9rZW4uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsQWRkcmVzc0FzRXhjZWxBZGRyZXNzVG9rZW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSAiQTEiOwotICAgICAgICAgICAgdmFyIHRva2VuID0gX3Rva2VuRmFjdG9yeS5DcmVhdGUoRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKSwgaW5wdXQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRva2VuVHlwZS5FeGNlbEFkZHJlc3MsIHRva2VuLlRva2VuVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgdG9rZW4uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsUmFuZ2VBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIkExOkIxNSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcywgdG9rZW4uVG9rZW5UeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QjE1IiwgdG9rZW4uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZUV4Y2VsUmFuZ2VPbk90aGVyU2hlZXRBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIndzIUExOkIxNSI7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSBfdG9rZW5GYWN0b3J5LkNyZWF0ZShFbnVtZXJhYmxlLkVtcHR5PFRva2VuPigpLCBpbnB1dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcywgdG9rZW4uVG9rZW5UeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiV1MhQTE6QjE1IiwgdG9rZW4uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVNob3VsZENyZWF0ZU5hbWVkVmFsdWVBc0V4Y2VsQWRkcmVzc1Rva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlucHV0ID0gIk5hbWVkVmFsdWUiOwotICAgICAgICAgICAgX25hbWVWYWx1ZVByb3ZpZGVyLlN0dWIoeCA9PiB4LklzTmFtZWRWYWx1ZSgiTmFtZWRWYWx1ZSIsIiIpKS5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgICAgICBfbmFtZVZhbHVlUHJvdmlkZXIuU3R1Yih4ID0+IHguSXNOYW1lZFZhbHVlKCJOYW1lZFZhbHVlIiwgbnVsbCkpLlJldHVybih0cnVlKTsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IF90b2tlbkZhY3RvcnkuQ3JlYXRlKEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCksIGlucHV0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUb2tlblR5cGUuTmFtZVZhbHVlLCB0b2tlbi5Ub2tlblR5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOYW1lZFZhbHVlIiwgdG9rZW4uVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkhhbmRsZXJUZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhNzkxMC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkhhbmRsZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBUb2tlbkhhbmRsZXJUZXN0cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBUb2tlbml6ZXJDb250ZXh0IF90b2tlbml6ZXJDb250ZXh0OwotICAgICAgICBwcml2YXRlIFRva2VuSGFuZGxlciBfaGFuZGxlcjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9rZW5pemVyQ29udGV4dCA9IG5ldyBUb2tlbml6ZXJDb250ZXh0KCJ0ZXN0Iik7Ci0gICAgICAgICAgICBJbml0SGFuZGxlcihfdG9rZW5pemVyQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdEhhbmRsZXIoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFyc2luZ0NvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIHZhciB0b2tlbkZhY3RvcnkgPSBuZXcgVG9rZW5GYWN0b3J5KHBhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LCBudWxsKTsKLSAgICAgICAgICAgIF9oYW5kbGVyID0gbmV3IFRva2VuSGFuZGxlcihfdG9rZW5pemVyQ29udGV4dCwgdG9rZW5GYWN0b3J5LCBuZXcgVG9rZW5TZXBhcmF0b3JQcm92aWRlcigpKTsgCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSGFzTW9yZVRva2Vuc1Nob3VsZEJlVHJ1ZVdoZW5Ub2tlbnNFeGlzdHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKF9oYW5kbGVyLkhhc01vcmUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSGFzTW9yZVRva2Vuc1Nob3VsZEJlRmFsc2VXaGVuQWxsQXJlSGFuZGxlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgInRlc3QiLkxlbmd0aDsgeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaGFuZGxlci5OZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShfaGFuZGxlci5IYXNNb3JlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9OYW1lVmFsdWVQcm92aWRlclRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9OYW1lVmFsdWVQcm92aWRlclRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWVkMjFkLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvTmFtZVZhbHVlUHJvdmlkZXJUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Gb3JtdWxhUGFyc2luZwotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIE5hbWVWYWx1ZVByb3ZpZGVyVGVzdHMKLSAgICB7Ci0gICAgICAgIC8vcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7Ci0KLSAgICAgICAgLy9bVGVzdEluaXRpYWxpemVdCi0gICAgICAgIC8vcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVNb2NrPEV4Y2VsRGF0YVByb3ZpZGVyPigpOwotICAgICAgICAvL30KLQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIElzTmFtZWRWYWx1ZVNob3VsZFJldHVyblRydWVJZktleUlzQU5hbWVkVmFsdWUoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIGRpY3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKLSAgICAgICAgLy8gICAgZGljdC5BZGQoIkEiLCAiQiIpOwotICAgICAgICAvLyAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCkpCi0gICAgICAgIC8vICAgICAgICAuUmV0dXJuKGRpY3QpOwotICAgICAgICAvLyAgICB2YXIgbmFtZVZhbHVlUHJvdmlkZXIgPSBuZXcgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKLQotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gbmFtZVZhbHVlUHJvdmlkZXIuSXNOYW1lZFZhbHVlKCJBIik7Ci0gICAgICAgIC8vICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBJc05hbWVkVmFsdWVTaG91bGRSZXR1cm5GYWxzZUlmS2V5SXNOb3RBTmFtZWRWYWx1ZSgpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB2YXIgZGljdCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOwotICAgICAgICAvLyAgICBkaWN0LkFkZCgiQSIsICJCIik7Ci0gICAgICAgIC8vICAgIF9leGNlbERhdGFQcm92aWRlci5TdHViKHggPT4geC5HZXRXb3JrYm9va05hbWVWYWx1ZXMoKSkKLSAgICAgICAgLy8gICAgICAgIC5SZXR1cm4oZGljdCk7Ci0gICAgICAgIC8vICAgIHZhciBuYW1lVmFsdWVQcm92aWRlciA9IG5ldyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihfZXhjZWxEYXRhUHJvdmlkZXIpOwotCi0gICAgICAgIC8vICAgIHZhciByZXN1bHQgPSBuYW1lVmFsdWVQcm92aWRlci5Jc05hbWVkVmFsdWUoIkMiKTsKLSAgICAgICAgLy8gICAgQXNzZXJ0LklzRmFsc2UocmVzdWx0KTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgLy9wdWJsaWMgdm9pZCBHZXROYW1lZFZhbHVlU2hvdWxkUmV0dXJuQ29ycmVjdFZhbHVlSWZLZXlFeGlzdHMoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIGRpY3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKLSAgICAgICAgLy8gICAgZGljdC5BZGQoIkEiLCAiQiIpOwotICAgICAgICAvLyAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCkpCi0gICAgICAgIC8vICAgICAgICAuUmV0dXJuKGRpY3QpOwotICAgICAgICAvLyAgICB2YXIgbmFtZVZhbHVlUHJvdmlkZXIgPSBuZXcgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKLQotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gbmFtZVZhbHVlUHJvdmlkZXIuR2V0TmFtZWRWYWx1ZSgiQSIpOwotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIkIiLCByZXN1bHQpOwotICAgICAgICAvL30KLQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICAvL3B1YmxpYyB2b2lkIFJlbG9hZFNob3VsZFJlbG9hZERhdGFGcm9tRXhjZWxEYXRhUHJvdmlkZXIoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdmFyIGRpY3QgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKLSAgICAgICAgLy8gICAgZGljdC5BZGQoIkEiLCAiQiIpOwotICAgICAgICAvLyAgICBfZXhjZWxEYXRhUHJvdmlkZXIuU3R1Yih4ID0+IHguR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCkpCi0gICAgICAgIC8vICAgICAgICAuUmV0dXJuKGRpY3QpOwotICAgICAgICAvLyAgICB2YXIgbmFtZVZhbHVlUHJvdmlkZXIgPSBuZXcgRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIoX2V4Y2VsRGF0YVByb3ZpZGVyKTsKLQotICAgICAgICAvLyAgICB2YXIgcmVzdWx0ID0gbmFtZVZhbHVlUHJvdmlkZXIuR2V0TmFtZWRWYWx1ZSgiQSIpOwotICAgICAgICAvLyAgICBBc3NlcnQuQXJlRXF1YWwoIkIiLCByZXN1bHQpOwotCi0gICAgICAgIC8vICAgIGRpY3QuQ2xlYXIoKTsKLSAgICAgICAgLy8gICAgbmFtZVZhbHVlUHJvdmlkZXIuUmVsb2FkKCk7Ci0gICAgICAgIC8vICAgIEFzc2VydC5Jc0ZhbHNlKG5hbWVWYWx1ZVByb3ZpZGVyLklzTmFtZWRWYWx1ZSgiQSIpKTsKLSAgICAgICAgLy99Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29udGV4dFRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29udGV4dFRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjNjYmU3Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHRUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nQ29udGV4dFRlc3RzCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJhdGlvblNob3VsZEJlU2V0QnlGYWN0b3J5TWV0aG9kKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBQYXJzaW5nQ29udGV4dC5DcmVhdGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoY29udGV4dC5Db25maWd1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTY29wZXNTaG91bGRCZVNldEJ5RmFjdG9yeU1ldGhvZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb250ZXh0ID0gUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKGNvbnRleHQuU2NvcGVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3BlVGVzdHMuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZVRlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQzMjM1Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3BlVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIFJoaW5vLk1vY2tzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUGFyc2luZ1Njb3BlVGVzdHMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlciBfbGlmZVRpbWVFdmVudEhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ1Njb3BlcyBfcGFyc2luZ1Njb3BlczsKLSAgICAgICAgcHJpdmF0ZSBSYW5nZUFkZHJlc3NGYWN0b3J5IF9mYWN0b3J5OwotCi0gICAgICAgIFtUZXN0SW5pdGlhbGl6ZV0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0dXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8RXhjZWxEYXRhUHJvdmlkZXI+KCk7Ci0gICAgICAgICAgICBfZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KHByb3ZpZGVyKTsKLSAgICAgICAgICAgIF9saWZlVGltZUV2ZW50SGFuZGxlciA9IE1vY2tSZXBvc2l0b3J5LkdlbmVyYXRlU3R1YjxJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyPigpOwotICAgICAgICAgICAgX3BhcnNpbmdTY29wZXMgPSBNb2NrUmVwb3NpdG9yeS5HZW5lcmF0ZVN0dWI8UGFyc2luZ1Njb3Blcz4oX2xpZmVUaW1lRXZlbnRIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvclNob3VsZFNldEFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRBZGRyZXNzID0gIF9mYWN0b3J5LkNyZWF0ZSgiQTEiKTsKLSAgICAgICAgICAgIHZhciBzY29wZSA9IG5ldyBQYXJzaW5nU2NvcGUoX3BhcnNpbmdTY29wZXMsIGV4cGVjdGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRBZGRyZXNzLCBzY29wZS5BZGRyZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3RvclNob3VsZFNldFBhcmVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJlbnQgPSBuZXcgUGFyc2luZ1Njb3BlKF9wYXJzaW5nU2NvcGVzLCBfZmFjdG9yeS5DcmVhdGUoIkExIikpOwotICAgICAgICAgICAgdmFyIHNjb3BlID0gbmV3IFBhcnNpbmdTY29wZShfcGFyc2luZ1Njb3BlcywgcGFyZW50LCBfZmFjdG9yeS5DcmVhdGUoIkEyIikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBhcmVudCwgc2NvcGUuUGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTY29wZVNob3VsZENhbGxLaWxsU2NvcGVPbkRpc3Bvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2NvcGUgPSBuZXcgUGFyc2luZ1Njb3BlKF9wYXJzaW5nU2NvcGVzLCBfZmFjdG9yeS5DcmVhdGUoIkExIikpOwotICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlzY29wZSkuRGlzcG9zZSgpOwotICAgICAgICAgICAgX3BhcnNpbmdTY29wZXMuQXNzZXJ0V2FzQ2FsbGVkKHggPT4geC5LaWxsU2NvcGUoc2NvcGUpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blc1Rlc3QuY3MgYi9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZXNUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY2Y2U2Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3Blc1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci11c2luZyBSaGluby5Nb2NrczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0LkZvcm11bGFQYXJzaW5nCi17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUGFyc2luZ1Njb3Blc1Rlc3QKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ1Njb3BlcyBfcGFyc2luZ1Njb3BlczsKLSAgICAgICAgcHJpdmF0ZSBJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIF9saWZlVGltZUV2ZW50SGFuZGxlcjsKLQotICAgICAgICBbVGVzdEluaXRpYWxpemVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldHVwKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpZmVUaW1lRXZlbnRIYW5kbGVyID0gTW9ja1JlcG9zaXRvcnkuR2VuZXJhdGVTdHViPElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXI+KCk7Ci0gICAgICAgICAgICBfcGFyc2luZ1Njb3BlcyA9IG5ldyBQYXJzaW5nU2NvcGVzKF9saWZlVGltZUV2ZW50SGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlZFNjb3BlU2hvdWxkQmVDdXJyZW50U2NvcGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdTY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoX3BhcnNpbmdTY29wZXMuQ3VycmVudCwgc2NvcGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEN1cnJlbnRTY29wZVNob3VsZEhhbmRsZU5lc3RlZFNjb3BlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgc2NvcGUxID0gX3BhcnNpbmdTY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoX3BhcnNpbmdTY29wZXMuQ3VycmVudCwgc2NvcGUxKTsKLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlMiA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoX3BhcnNpbmdTY29wZXMuQ3VycmVudCwgc2NvcGUyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKF9wYXJzaW5nU2NvcGVzLkN1cnJlbnQsIHNjb3BlMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKF9wYXJzaW5nU2NvcGVzLkN1cnJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEN1cnJlbnRTY29wZVNob3VsZEJlTnVsbFdoZW5TY29wZUhhc1Rlcm1pbmF0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdTY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KSkKLSAgICAgICAgICAgIHsgfQotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChfcGFyc2luZ1Njb3Blcy5DdXJyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBOZXdTY29wZVNob3VsZFNldFBhcmVudE9uQ3JlYXRlZFNjb3BlSWZQYXJlbnRTY29wZUV4aXN0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlMSA9IF9wYXJzaW5nU2NvcGVzLk5ld1Njb3BlKFJhbmdlQWRkcmVzcy5FbXB0eSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZTIgPSBfcGFyc2luZ1Njb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHNjb3BlMSwgc2NvcGUyLlBhcmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExpZmV0aW1lRXZlbnRIYW5kbGVyU2hvdWxkQmVDYWxsZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdTY29wZXMuTmV3U2NvcGUoUmFuZ2VBZGRyZXNzLkVtcHR5KSkKLSAgICAgICAgICAgIHsgfQotICAgICAgICAgICAgX2xpZmVUaW1lRXZlbnRIYW5kbGVyLkFzc2VydFdhc0NhbGxlZCh4ID0+IHguUGFyc2luZ0NvbXBsZXRlZCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0Zvcm11bGFQYXJzaW5nL1Rlc3RIZWxwZXJzL0Z1bmN0aW9uc0hlbHBlci5jcyBiL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvVGVzdEhlbHBlcnMvRnVuY3Rpb25zSGVscGVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDExY2ViLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvRm9ybXVsYVBhcnNpbmcvVGVzdEhlbHBlcnMvRnVuY3Rpb25zSGVscGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgUmhpbm8uTW9ja3M7Ci11c2luZyBSaGluby5Nb2Nrcy5Db25zdHJhaW50czsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuRm9ybXVsYVBhcnNpbmcuVGVzdEhlbHBlcnMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZ1bmN0aW9uc0hlbHBlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBDcmVhdGVBcmdzKHBhcmFtcyBvYmplY3RbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQoYXJnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKSB7bmV3IEZ1bmN0aW9uQXJndW1lbnQobnVsbCl9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Jc3N1ZXMuY3MgYi9FUFBsdXNUZXN0L0lzc3Vlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljYzUxMy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0lzc3Vlcy5jcworKysgL2Rldi9udWxsCkBAIC0xLDk5NSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci11c2luZyBTeXN0ZW0uRGF0YTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7Ci11c2luZyBSaGluby5Nb2Nrcy5Db25zdHJhaW50czsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIElzc3VlcwotICAgIHsKLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKEAiYzpcVGVtcCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoQCJjOlxUZW1wIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIURpcmVjdG9yeS5FeGlzdHMoQCJjOlxUZW1wXGJ1ZyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoQCJjOlxUZW1wXGJ1ZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTA1MigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkE0Il0uVmFsdWUgPSAxOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxOkI0Il0uVmFsdWUgPSAyOwotCi0gICAgICAgICAgICB3cy5DZWxsc1sxLCAxLCA0LCAxXQotICAgICAgICAgICAgICAgICAgICAgICAgLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDA7W1JlZF0tIywjIzAuMDAiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1sxLCAyLCA1LCAyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzA7W1JlZF0tIywjIzAiOwotCi0gICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHN0eWxlLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUwNDEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMjAyMTAwMDgzOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiMDBcXC4wMFxcLjAwXFwuMDAwXFwuMCI7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIwMi4wMi4xMC4wMDguMyIsIHdzLkNlbGxzWyJBMSJdLlRleHQpOwotICAgICAgICAgICAgICAgIHdzLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTAzMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkID0gT2ZmaWNlT3BlblhtbC5VdGlscy5Db252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShuZXcgVGltZVNwYW4oMzUsIDU5LCAxKSk7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gZDsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIlt0XTptbTpzcyI7Ci0gICAgICAgICAgICAgICAgd3MuRGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MDIyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICB3cy5DZWxscy5BdXRvRml0Q29sdW1ucygpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiMCI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHMuQXV0b0ZpdENvbHVtbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTA1NigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXRoID0gQCJDOlx0ZW1wXG91dHB1dC54bHN4IjsKLSAgICAgICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGVJbmZvKHBhdGgpOwotICAgICAgICAgICAgZmlsZS5EZWxldGUoKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzID0gZXAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgICAgICBzLkNlbGxzWyJBMTpBMiJdLkZvcm11bGEgPSAiIjsgLy8gb3IgbnVsbCwgb3Igbm9uLWVtcHR5IHdoaXRlc3BhY2UsIHdpdGggc2FtZSByZXN1bHQKLSAgICAgICAgICAgICAgICBlcC5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTA1OCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5JTy5GaWxlSW5mbyBuZXdGaWxlID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAIkM6XFRlbXBcb3V0cHV0Lnhsc3giKTsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBleGNlbFAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBleGNlbFAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTA2MygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5JTy5GaWxlSW5mbyBuZXdGaWxlID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAIkM6XFRlbXBcYnVnXFRhYmxlRm9ybXVsYS54bHN4Iik7Ci0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgZXhjZWxQID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKTsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gZXhjZWxQLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICB3cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXSAgICAgICAgCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTEyKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLklPLkZpbGVJbmZvIGNhc2UxID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAImM6XHRlbXBcYnVnXHNyY1xzcmNcRGVsZXRlUm93SXNzdWVcVGVtcGxhdGUueGxzeCIpOwotICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKGNhc2UxKTsKLSAgICAgICAgICAgIHZhciBmaXJzdCA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIGZpcnN0LkRlbGV0ZVJvdyg1KTsKLSAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBTeXN0ZW0uSU8uRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xEZWxldGVDb2xfY2FzZTEueGxzeCIpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGNhc2UyID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAImM6XHRlbXBcYnVnXHNyYzJcRGVsZXRlUm93SXNzdWVcVGVtcGxhdGUueGxzeCIpOwotICAgICAgICAgICAgcCA9IG5ldyBFeGNlbFBhY2thZ2UoY2FzZTIpOwotICAgICAgICAgICAgZmlyc3QgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICBmaXJzdC5EZWxldGVSb3coNSk7Ci0gICAgICAgICAgICBwLlNhdmVBcyhuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiYzpcdGVtcFxidWdcRGVsZXRlQ29sX2Nhc2UyLnhsc3giKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTExOCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z091dHB1dC54bHN4IiksIG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXERlbGV0ZVJvd0lzc3VlXFRlbXBsYXRlLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB3b3JrQm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7Ci0gICAgICAgICAgICAgICAgdmFyIHdvcmtzaGVldCA9IHdvcmtCb29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzksIDYsIDksIDddLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbOSwgOF0uTWVyZ2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5EZWxldGVSb3coNSk7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZUNvbHVtbig1KTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlQ29sdW1uKDUpOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5EZWxldGVDb2x1bW4oNSk7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZUNvbHVtbig1KTsKLQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTA5KCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLklPLkZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcdGVzdDAxLnhsc3giKTsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBleGNlbFAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBleGNlbFAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6Wjc1Iix3cy5EaW1lbnNpb24uQWRkcmVzcyk7Ci0gICAgICAgICAgICBleGNlbFAuRGlzcG9zZSgpOwotCi0gICAgICAgICAgICBuZXdGaWxlID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAIkM6XFRlbXBcYnVnXHRlc3QwMi54bHN4Iik7Ci0gICAgICAgICAgICBleGNlbFAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOwotICAgICAgICAgICAgd3MgPSBleGNlbFAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QUY1MDEiLCB3cy5EaW1lbnNpb24uQWRkcmVzcyk7Ci0gICAgICAgICAgICBleGNlbFAuRGlzcG9zZSgpOwotCi0gICAgICAgICAgICBuZXdGaWxlID0gbmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAIkM6XFRlbXBcYnVnXHRlc3QwMy54bHN4Iik7Ci0gICAgICAgICAgICBleGNlbFAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOwotICAgICAgICAgICAgd3MgPSBleGNlbFAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTE6QUQ0MDYiLCB3cy5EaW1lbnNpb24uQWRkcmVzcyk7Ci0gICAgICAgICAgICBleGNlbFAuRGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTIwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHA9bmV3IEV4Y2VsUGFja2FnZShuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdccHAueGxzeCIpKTsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJ0dW1fbGlzdGUiXTsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdQdnQgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJwdnRTaGVldCIpOwotICAgICAgICAgICAgdmFyIHB2U2ggPSB3UHZ0LlBpdm90VGFibGVzLkFkZCh3UHZ0LkNlbGxzWyJCNSJdLCB3cy5DZWxsc1t3cy5EaW1lbnNpb24uQWRkcmVzcy5Ub1N0cmluZygpXSwgInB2dFMiKTsKLQotICAgICAgICAgICAgLy9wLlNhdmUoKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTExMygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiIFBlcmZvcm1hbmNlIFVwZGF0ZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6SDEiXS5NZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6SDEiXS5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6SDEiXS5TdHlsZS5Gb250LlNpemUgPSAxNDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXG1lcmdlLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNDEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB1c2luZyAoRXhjZWxXb3Jrc2hlZXQgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHMuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKLSAgICAgICAgICAgICAgICBzaGVldC5DZWxsc1sxLCAxLCAxLCAzXS5TdHlsZS5Cb3JkZXIuQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUuVGhpbik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbMSwgNSwgMiwgNV0uU3R5bGUuQm9yZGVyLkJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlLlRoaW4pOwotICAgICAgICAgICAgICAgIEV4Y2VsQ29sdW1uIGNvbHVtbiA9IHNoZWV0LkNvbHVtbigzKTsgLy8gZmFpbHMgd2l0aCBleGNlcHRpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTQ1KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgU3lzdGVtLklPLkZpbGVJbmZvKEAiQzpcVGVtcFxidWdcQ29sdW1uSW5zZXJ0Lnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgd3MuSW5zZXJ0Q29sdW1uKDEyLDMpOwotICAgICAgICAgICAgICAgIHdzLkluc2VydFJvdygzMCwzKTsKLSAgICAgICAgICAgICAgICB3cy5EZWxldGVSb3coMzEsMSk7Ci0gICAgICAgICAgICAgICAgd3MuRGVsZXRlQ29sdW1uKDcsMSk7Ci0gICAgICAgICAgICAgICAgcC5TYXZlQXMobmV3IFN5c3RlbS5JTy5GaWxlSW5mbyhAIkM6XFRlbXBcYnVnXEluc2VydENvcHlGYWlsLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE1MCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXENsZWFySXNzdWUueGxzeCIpOwotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIG91dHB1dCA9IEAiYzpcdGVtcFxidWdcQ2xlYXJJc3N1ZVNhdmUueGxzeCI7Ci0KLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSh0ZW1wbGF0ZSwgZmFsc2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMjpDMyJdLlZhbHVlID0gIlRlc3QiOwotICAgICAgICAgICAgICAgIHZhciBjID0gd3MuQ2VsbHNbIkIyOkIzIl07Ci0gICAgICAgICAgICAgICAgYy5DbGVhcigpOwotCi0gICAgICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTQ2KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ29weUZhaWwueGxzeCIpOwotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIG91dHB1dCA9IEAiYzpcdGVtcFxidWdcQ29weUZhaWwtU2F2ZS54bHN4IjsKLQotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKHRlbXBsYXRlLCBmYWxzZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbM107Ci0KLSAgICAgICAgICAgICAgICAvL3dzLkluc2VydENvbHVtbigzLCAxKTsKLSAgICAgICAgICAgICAgICBDdXN0b21Db2x1bW5JbnNlcnQod3MsIDMsIDEpOwotCi0gICAgICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3VzdG9tQ29sdW1uSW5zZXJ0KEV4Y2VsV29ya3NoZWV0IHdzLCBpbnQgY29sdW1uLCBpbnQgY29sdW1ucykKLSAgICB7Ci0gICAgICAgIHZhciBzb3VyY2UgPSB3cy5DZWxsc1sxLCBjb2x1bW4sIHdzLkRpbWVuc2lvbi5FbmQuUm93LCB3cy5EaW1lbnNpb24uRW5kLkNvbHVtbl07Ci0gICAgICAgIHZhciBkZXN0ID0gd3MuQ2VsbHNbMSwgY29sdW1uICsgY29sdW1ucywgd3MuRGltZW5zaW9uLkVuZC5Sb3csIHdzLkRpbWVuc2lvbi5FbmQuQ29sdW1uICsgY29sdW1uc107Ci0gICAgICAgIHNvdXJjZS5Db3B5KGRlc3QpOwotICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxMjMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInQiKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZHQgPSBuZXcgRGF0YVRhYmxlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIlN0cmluZyIsIHR5cGVvZihzdHJpbmcpKTsKLSAgICAgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiSW50IiwgdHlwZW9mKGludCkpOwotICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJCb29sIiwgdHlwZW9mKGJvb2wpKTsKLSAgICAgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiRG91YmxlIiwgdHlwZW9mKGRvdWJsZSkpOwotICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJEYXRlIiwgdHlwZW9mKERhdGVUaW1lKSk7Ci0KLSAgICAgICAgICAgICAgICB2YXIgZHIgPSBkdC5OZXdSb3coKTsKLQkgICAgICAgICAgICAgICAgIGRyWzBdID0gIlJvdzEiOwotCSAgICAgICAgICAgICAgICAgZHJbMV0gPSAxOwotCSAgICAgICAgICAgICAgICAgZHJbMl0gPSB0cnVlOwotCSAgICAgICAgICAgICAgICAgZHJbM10gPSAxLjU7Ci0gICAgICAgICAgICAgICAgICAgICBkcls0XSA9IG5ldyBEYXRlVGltZSgyMDE0LCAxMiwgMzApOwotCSAgICAgICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCSAgCi0JICAgICAgICAgICAgICAgICBkciA9IGR0Lk5ld1JvdygpOwotCSAgICAgICAgICAgICAgICAgZHJbMF0gPSAiUm93MiI7Ci0JICAgICAgICAgICAgICAgICBkclsxXSA9IDI7Ci0JICAgICAgICAgICAgICAgICBkclsyXSA9IGZhbHNlOwotCSAgICAgICAgICAgICAgICAgZHJbM10gPSAyLjI1OwotICAgICAgICAgICAgICAgICAgICAgZHJbNF0gPSBuZXcgRGF0ZVRpbWUoMjAxNCwgMTIsIDMxKTsKLQkgICAgICAgICAgICAgICAgIGR0LlJvd3MuQWRkKGRyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbURhdGFUYWJsZShkdCx0cnVlKTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siRDI6RDMiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIigqICMsIyMwLjAwKTtfKCogKCMsIyMwLjAwKTtfKCogXCItXCI/P18pOyhAKSI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkUyOkUzIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS9kZC95eXl5IjsKLSAgICAgICAgICAgICAgICB3cy5DZWxscy5BdXRvRml0Q29sdW1ucygpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbCh3cy5DZWxsc1syLCA1XS5UZXh0LCIiKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxMjgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInQiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlPTE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5Gb3JtdWxhID0gIkExKyRCJDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkMxIl0uVmFsdWUgPSAiVGVzdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6QjIiXS5Db3B5KHdzLkNlbGxzWyJDMSJdKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMiJdLkNvcHkod3MuQ2VsbHNbIkQxIl0pOwotICAgICAgICAgICAgcC5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcY29weS54bHN4IikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlTWVyZ2VkQ2VsbHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInQiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNSxDMTpDOCJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDMTpDOCJdLk1lcmdlID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6QTgiXS5NZXJnZSA9IGZhbHNlOwotICAgICAgICAgICAgcC5EaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNTgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxPdXRwdXQueGxzeCIpLCBuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xEZWxldGVDb2xGb3JtdWxhXEZvcm11bGFzSXNzdWVcZGVtby54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOwotICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHdvcmtCb29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgICAgICAvL3N0cmluZyBjb2x1bW4gPSBDb2x1bW5JbmRleFRvQ29sdW1uTGV0dGVyKDI4KTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuRGVsZXRlQ29sdW1uKDI4KTsKLQotICAgICAgICAgICAgICAgIGlmICh3b3Jrc2hlZXQuQ2VsbHNbIkFBMTkiXS5Gb3JtdWxhICE9ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGhpcyBjZWxsIHNob3VsZCBub3QgaGF2ZSBmb3JtdWxhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgY2xhc3MgY2xzMQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IHByb3AxIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBjbGFzcyBjbHMyIDogY2xzMQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3AyIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZEZyb21Db2xJc3N1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsID0gbmV3IExpc3Q8Y2xzMT4oKTsKLQotICAgICAgICAgICAgdmFyIGMyID0gbmV3IGNsczIoKSB7cHJvcDE9MSwgcHJvcDI9InRlc3QxIn07Ci0gICAgICAgICAgICBsLkFkZChjMik7Ci0KLSAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obCwgdHJ1ZSwgVGFibGVTdHlsZXMuTGlnaHQxNiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYywKLSAgICAgICAgICAgICAgICBuZXcgTWVtYmVySW5mb1tdIHt0eXBlb2YoY2xzMikuR2V0UHJvcGVydHkoInByb3AyIil9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTY4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QiKTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJBMSI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiQTIiOwotCi0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSB3cy5DZWxsc1sxLCAxXS5WYWx1ZTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExIiwgd3MuQ2VsbHNbMSwgMV0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTU5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZzID0gbmV3IEZpbGVTdHJlYW0oQCJDOlx0ZW1wXGJ1Z1xEZWxldGVDb2xGb3JtdWxhXEZvcm11bGFzSXNzdWVcZGVtby54bHN4IiwgRmlsZU1vZGUuT3Blbk9yQ3JlYXRlKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZShmcykpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnMuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKLSAgICAgICAgICAgIHZhciBmczIgPSBmczsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE3OSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk1lcmdlRGVsZXRlQnVnIik7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkUzOkYzIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJFMzpGMyJdLk1lcmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIsIDYpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICB2YXIgcyA9IHdzLkNlbGxzWyJBMSJdLlZhbHVlLlRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE2OSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcaXNzdWVcaW5wdXQueGxzeCIpOwotCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShmaWxlSW5mbyk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHNoZWV0TmFtZSA9ICJMYWJvdXIgQ29zdHMiOwotCi0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1tzaGVldE5hbWVdOwotICAgICAgICAgICAgICAgIGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSh3cyk7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZChzaGVldE5hbWUpOwotCi0gICAgICAgICAgICAgICAgZXhjZWxQYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xpc3N1ZVxvdXRwdXQyLnhsc3giKSk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxNzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXGJvb2syLnhsc3giKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIGV4Y2VsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoZmlsZUluZm8pOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIklGKCRSMTA+PVgkMiwxLDApIiwgd3MuQ2VsbHNbIlgxMCJdLkZvcm11bGEpOwotICAgICAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwRCx3cy5DZWxsc1siWDEwIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTc0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xNeVRlbXBsYXRlLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNvbHVtbigyKS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gImRkL21tL3l5eXkiOwotCi0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcTXlUZW1wbGF0ZTIueGxzeCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUGljdHVyZUlzc3VlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0Iik7Ci0gICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJUZXN0IiwgbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcMjE1MjIyOC5qcGciKSk7Ci0gICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xwaWMueGxzeCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE0OTg4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGd1aWQgPSBHdWlkLk5ld0d1aWQoKS5Ub1N0cmluZygiTiIpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZVN0cmVhbShAIkM6XHRlbXBcIiArIGd1aWQgKyAiLnhsc3giLCBGaWxlTW9kZS5DcmVhdGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZVN0cmVhbShAIkM6XHRlbXBcYnVnMi54bHN4IiwgRmlsZU1vZGUuT3BlbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0sICJUZXN0IikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3QgZW1wdHkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIlRlc3QiOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5FbmNyeXB0aW9uLlBhc3N3b3JkID0gIlRlc3QyIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9wYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHRlc3QyLnhsc3giKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTczXzEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxFUFBsdXNJc3N1ZXNcRXhjZWwwMS54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKLSAgICAgICAgICAgICAgICAvL3Bjay5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguQXR0YWNoTG9nZ2VyKExvZ2dlckZhY3RvcnkuQ3JlYXRlVGV4dEZpbGVMb2dnZXIobmV3IEZpbGVJbmZvKEAiYzpcVGVtcFxsb2cxLnR4dCIpKSkpOwotICAgICAgICAgICAgICAgIHN3LlN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMEwyMzAwIiwgd3MuQ2VsbHNbIkY0Il0uVmFsdWUpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjBLMkUwMSIsIHdzLkNlbGxzWyJGNSJdLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB2YXIgZjdWYWwgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siTU9ERUxMTy1USVBPIFBBTk5FTExPIl0uQ2VsbHNbIkY3Il0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEzLjQ0NTQxOSwgTWF0aC5Sb3VuZCgoZG91YmxlKSBmN1ZhbCwgNikpOwotICAgICAgICAgICAgICAgIHN3LlN0b3AoKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkLlRvdGFsU2Vjb25kcyk7IC8vIGFwcHJveC4gMTAgc2Vjb25kcwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTczXzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxFUFBsdXNJc3N1ZXNcRXhjZWwwMi54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suRm9ybXVsYVBhcnNlci5Db25maWd1cmUoeCA9PiB4LkF0dGFjaExvZ2dlcihMb2dnZXJGYWN0b3J5LkNyZWF0ZVRleHRGaWxlTG9nZ2VyKG5ldyBGaWxlSW5mbyhAImM6XFRlbXBcbG9nMS50eHQiKSkpKTsKLSAgICAgICAgICAgICAgICBzdy5TdGFydCgpOwotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgLy93cy5DYWxjdWxhdGUoKTsKLSAgICAgICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIyMEwyMzAwIiwgd3MuQ2VsbHNbIkY0Il0uVmFsdWUpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMjBLMkUwMSIsIHdzLkNlbGxzWyJGNSJdLlZhbHVlKTsKLSAgICAgICAgICAgICAgICBzdy5TdG9wKCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoc3cuRWxhcHNlZC5Ub3RhbFNlY29uZHMpOyAvLyBhcHByb3guIDEwIHNlY29uZHMKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTU0KCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgICBEaXJlY3RvcnkuRW51bWVyYXRlRmlsZXMoQCJjOlx0ZW1wXGJ1Z1xDb25zdHJ1Y3Rvckludm9rYXRpb25Ob3RUaHJlYWRTYWZlXCIpLkFzUGFyYWxsZWwoKS5Gb3JBbGwoZmlsZSA9PgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vbG9jayAoX2xvY2spCi0gICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZVN0cmVhbShmaWxlLCBGaWxlTW9kZS5PcGVuKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbMSwgMV0uVmFsdWUgPSBmaWxlOwotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xDb25zdHJ1Y3Rvckludm9rYXRpb25Ob3RUaHJlYWRTYWZlXG5ld1wiK25ldyBGaWxlSW5mbyhmaWxlKS5OYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTE4OCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNikuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS9kZC95eXl5IjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDcpLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAibW0vZGQveXl5eSI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig4KS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tL2RkL3l5eXkiOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMTApLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAibW0vZGQveXl5eSI7Ci0KLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMiwgNl0uVmFsdWUgPSBEYXRlVGltZS5Ub2RheTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgYSA9IHdvcmtzaGVldC5DZWxsc1syLDZdLlRleHQ7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKERhdGVUaW1lLlRvZGF5LlRvU3RyaW5nKCJNTS9kZC95eXl5IiksIGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxOTQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcaTE1MTk0LVNhdmUueGxzeCIpLCBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xJMTUxOTQueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtib29rIHdvcmtCb29rID0gcGFja2FnZS5Xb3JrYm9vazsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRTM6RjMiXS5NZXJnZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZVJvdygyLCA2KTsKLQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxOTUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcaTE1MTk1X1NhdmUueGxzeCIpLCBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xpMTUxOTUueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtib29rIHdvcmtCb29rID0gcGFja2FnZS5Xb3JrYm9vazsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5JbnNlcnRDb2x1bW4oOCwgMik7Ci0KLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCxJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTQ3ODgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcaTE1MTk1X1NhdmUueGxzeCIpLCBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xHZXRXb3JrU2hlZXRYbWxCYWQueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtib29rIHdvcmtCb29rID0gcGFja2FnZS5Xb3JrYm9vazsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5JbnNlcnRDb2x1bW4oOCwgMik7Ci0KLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MTY3KCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xEcmF3XGlucHV0Lnhsc3giKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIGV4Y2VsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoZmlsZUluZm8pOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBzaGVldE5hbWUgPSAiQm9hcmQgcGFjayI7Ci0KLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IGV4Y2VsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3NoZWV0TmFtZV07Ci0gICAgICAgICAgICAgICAgZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKHdzKTsKLQotICAgICAgICAgICAgICAgIHdzID0gZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKHNoZWV0TmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXG91dHB1dC54bHN4IikpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUxOTgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcT3V0cHV0Lnhsc3giKSwgbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcZGVtby54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOwotICAgICAgICAgICAgICAgIHZhciB3b3Jrc2hlZXQgPSB3b3JrQm9vay5Xb3Jrc2hlZXRzWzFdOwotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkRlbGV0ZVJvdygxMik7Ci0KLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCxJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTM0OTIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgT2ZmaWNlT3BlblhtbC5FeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQnVnMTM0OTIueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtib29rIHdvcmtCb29rID0gcGFja2FnZS5Xb3JrYm9vazsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0ID0gd29ya0Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgICAgIHZhciBydCA9IHdvcmtzaGVldC5DZWxsc1siSzMxIl0uUmljaFRleHQuVGV4dDsKLQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNDk2NigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcc3Npc1xGaWxlRnJvbVJlcG9ydGluZ1NlcnZlcjIwMTIueGxzeCIpKSkKLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xzc2lzXENvcnJ1cHRlZC54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUyMDAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlLkNvcHkoQCJDOlx0ZW1wXGJ1Z1xFUFBsdXNSYW5nZUNvcHlUZXN0XEVQUGx1c1JhbmdlQ29weVRlc3RcaW5wdXQueGxzeCIsIEAiQzpcdGVtcFxidWdcRVBQbHVzUmFuZ2VDb3B5VGVzdFxFUFBsdXNSYW5nZUNvcHlUZXN0XG91dHB1dC54bHN4IiwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcRVBQbHVzUmFuZ2VDb3B5VGVzdFxFUFBsdXNSYW5nZUNvcHlUZXN0XG91dHB1dC54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaGVldCA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOwotCi0gICAgICAgICAgICAgICAgdmFyIHNvdXJjZVJhbmdlID0gc2hlZXQuQ2VsbHNbMSwgMSwgMSwgMl07Ci0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdFJhbmdlID0gc2hlZXQuQ2VsbHNbMywgMSwgMywgMl07Ci0gICAgICAgICAgICAgICAgc291cmNlUmFuZ2UuQ29weShyZXN1bHRSYW5nZSk7Ci0KLSAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZSA9IHNoZWV0LkNlbGxzWzEsIDEsIDEsIDddOwotICAgICAgICAgICAgICAgIHJlc3VsdFJhbmdlID0gc2hlZXQuQ2VsbHNbNSwgMSwgNSwgN107Ci0gICAgICAgICAgICAgICAgc291cmNlUmFuZ2UuQ29weShyZXN1bHRSYW5nZSk7ICAvLyBUaGlzIHRocm93cyBTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb246IENhbid0IG1lcmdlIGFuZCBhbHJlYWR5IG1lcmdlZCByYW5nZQotCi0gICAgICAgICAgICAgICAgc291cmNlUmFuZ2UgPSBzaGVldC5DZWxsc1sxLCAxLCAxLCA3XTsKLSAgICAgICAgICAgICAgICByZXN1bHRSYW5nZSA9IHNoZWV0LkNlbGxzWzcsIDMsIDcsIDddOwotICAgICAgICAgICAgICAgIHNvdXJjZVJhbmdlLkNvcHkocmVzdWx0UmFuZ2UpOyAgLy8gVGhpcyB0aHJvd3MgU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uOiBDYW4ndCBtZXJnZSBhbmQgYWxyZWFkeSBtZXJnZWQgcmFuZ2UKLQotICAgICAgICAgICAgICAgIHAuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlMTUyMTIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcz0iXyhcIlIkIFwiKiAjLCMjMC4wMF8pO18oXCJSJCBcIiogKCMsIyMwLjAwKTtfKFwiUiQgXCIqIFwiLVwiPz9fKTtfKEBfKSApIjsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTdHlsZUJ1ZyIpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gNTY5ODYzMy42NDsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gczsKLSAgICAgICAgICAgICAgICB2YXIgdCA9IHdzLkNlbGxzWyJBMSJdLlRleHQ7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWUxNTIxMygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcRXhjZWxDbGVhckRlbW9cZXhjZWx0ZXN0ZmlsZS54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBwLldvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cy5DZWxsc1sxMDIzLCAxLCB3cy5EaW1lbnNpb24uRW5kLlJvdy0yLHdzLkRpbWVuc2lvbi5FbmQuQ29sdW1uXS5DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwod3MuRGltZW5zaW9uLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzJdLkNlbGxzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoY2VsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEV4Y2VsQ2xlYXJEZW1vXGV4Y2VsdGVzdGZpbGUtc2F2ZS54bHN4IikpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgSXNzdWVyMTUyMTcoKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcRm9ybWF0Um93Q29sLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiZm10Iik7Ci0gICAgICAgICAgICAgICAgd3MuUm93KDEpLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmF5KTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTE6QjIiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAgICAgd3MuQ29sdW1uKDEpLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAieXl5eS1tbS1kZCBoaDptbSI7Ci0gICAgICAgICAgICAgICAgd3MuQ29sdW1uKDIpLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOwotICAgICAgICAgICAgICAgIHAuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlcjE1MjI4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImNvbEJ1ZyIpOwotCi0gICAgICAgICAgICAgICAgdmFyIGNvbCA9IHdzLkNvbHVtbig3KTsKLSAgICAgICAgICAgICAgICBjb2wuQ29sdW1uTWF4ID0gODsKLSAgICAgICAgICAgICAgICBjb2wuSGlkZGVuID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIHZhciBjb2w4ID0gd3MuQ29sdW1uKDgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBjb2w4LkhpZGRlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MjM0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xtZXJnZTJcaW5wdXQueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKLQotICAgICAgICAgICAgICAgIHZhciBzb3VyY2VSYW5nZSA9IHNoZWV0LkNlbGxzWyIxOjQiXTsKLQotICAgICAgICAgICAgICAgIHNoZWV0Lkluc2VydFJvdyg1LCA0KTsKLQotICAgICAgICAgICAgICAgIHZhciByZXN1bHRSYW5nZSA9IHNoZWV0LkNlbGxzWyI1OjgiXTsKLSAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZS5Db3B5KHJlc3VsdFJhbmdlKTsKLQotICAgICAgICAgICAgICAgIHAuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICAvKioqKiBQaXZvdHRhYmxlIGlzc3VlICoqKiovCi0gICAgICAgIHB1YmxpYyB2b2lkIElzc3VlKCkKLSAgICAgICAgewotICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhAImM6XEV4Y2VsUGl2b3RUZXN0Iik7Ci0gICAgICAgICAgICBGaWxlSW5mbyBNeUZpbGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xwaXZvdHRhYmxlLnhsc3giKTsKLSAgICAgICAgICAgIExvYWREYXRhKE15RmlsZSk7Ci0gICAgICAgICAgICBCdWlsZFBpdm90VGFibGUxKE15RmlsZSk7Ci0gICAgICAgICAgICBCdWlsZFBpdm90VGFibGUyKE15RmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgTG9hZERhdGEoRmlsZUluZm8gTXlGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTXlGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNeUZpbGUuRGVsZXRlKCk7ICAvLyBlbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vawotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIEVQID0gbmV3IEV4Y2VsUGFja2FnZShNeUZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIG5ldyB3b3Jrc2hlZXQgdG8gdGhlIGVtcHR5IHdvcmtib29rCi0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3NEYXRhID0gRVAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRhdGEiKTsKLSAgICAgICAgICAgICAgICAvL0FkZCB0aGUgaGVhZGVycwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJJTlZPSUNFX0RBVEUiOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1sxLCAyXS5WYWx1ZSA9ICJUT1RBTF9JTlZPSUNFX1BSSUNFIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbMSwgM10uVmFsdWUgPSAiRVhURU5ERURfUFJJQ0VfVkFSSUFOQ0UiOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1sxLCA0XS5WYWx1ZSA9ICJBVURJVF9MSU5FX1NUQVRVUyI7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzEsIDVdLlZhbHVlID0gIlJFU09MVVRJT05fU1RBVFVTIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbMSwgNl0uVmFsdWUgPSAiQ09VTlQiOwotCi0gICAgICAgICAgICAgICAgLy9BZGQgc29tZSBpdGVtcy4uLgotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQTIiXS5WYWx1ZSA9IENvbnZlcnQuVG9EYXRlVGltZSgiMDQvMi8yMDEyIik7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJCMiJdLlZhbHVlID0gMzMuNjM7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJDMiJdLlZhbHVlID0gKC0uODcpOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRDIiXS5WYWx1ZSA9ICJVbmZhdm9yYWJsZSBQcmljZSBWYXJpYW5jZSI7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJFMiJdLlZhbHVlID0gIlBlbmRpbmciOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRjIiXS5WYWx1ZSA9IDE7Ci0KLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkEzIl0uVmFsdWUgPSBDb252ZXJ0LlRvRGF0ZVRpbWUoIjA0LzIvMjAxMiIpOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQjMiXS5WYWx1ZSA9IDQzLjE0OwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQzMiXS5WYWx1ZSA9ICgtMS4yOSk7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJEMyJdLlZhbHVlID0gIlVuZmF2b3JhYmxlIFByaWNlIFZhcmlhbmNlIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkUzIl0uVmFsdWUgPSAiUGVuZGluZyI7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJGMyJdLlZhbHVlID0gMTsKLQotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQTQiXS5WYWx1ZSA9IENvbnZlcnQuVG9EYXRlVGltZSgiMTEvOC8yMDExIik7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJCNCJdLlZhbHVlID0gNTU7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJDNCJdLlZhbHVlID0gKC0yLjg3KTsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkQ0Il0uVmFsdWUgPSAiVW5mYXZvcmFibGUgUHJpY2UgVmFyaWFuY2UiOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRTQiXS5WYWx1ZSA9ICJQZW5kaW5nIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkY0Il0uVmFsdWUgPSAxOwotCi0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJBNSJdLlZhbHVlID0gQ29udmVydC5Ub0RhdGVUaW1lKCIxMS84LzIwMTEiKTsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkI1Il0uVmFsdWUgPSAzOC43MjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkM1Il0uVmFsdWUgPSAoLTUuMDApOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRDUiXS5WYWx1ZSA9ICJVbmZhdm9yYWJsZSBQcmljZSBWYXJpYW5jZSI7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJFNSJdLlZhbHVlID0gIlBlbmRpbmciOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRjUiXS5WYWx1ZSA9IDE7Ci0KLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkE2Il0uVmFsdWUgPSBDb252ZXJ0LlRvRGF0ZVRpbWUoIjMvNC8yMDExIik7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJCNiJdLlZhbHVlID0gNzcuNDQ7Ci0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJDNiJdLlZhbHVlID0gKC0xLjU1KTsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkQ2Il0uVmFsdWUgPSAiVW5mYXZvcmFibGUgUHJpY2UgVmFyaWFuY2UiOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRTYiXS5WYWx1ZSA9ICJQZW5kaW5nIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkY2Il0uVmFsdWUgPSAxOwotCi0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWyJBNyJdLlZhbHVlID0gQ29udmVydC5Ub0RhdGVUaW1lKCIzLzQvMjAxMSIpOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siQjciXS5WYWx1ZSA9IDEyNy41NTsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkM3Il0uVmFsdWUgPSAoLTEwLjUwKTsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkQ3Il0uVmFsdWUgPSAiVW5mYXZvcmFibGUgUHJpY2UgVmFyaWFuY2UiOwotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxsc1siRTciXS5WYWx1ZSA9ICJQZW5kaW5nIjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbIkY3Il0uVmFsdWUgPSAxOwotCi0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciByYW5nZSA9IHdzRGF0YS5DZWxsc1syLCAxLCA3LCAxXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAibW0tZGQteXkiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdzRGF0YS5DZWxscy5BdXRvRml0Q29sdW1ucygwKTsKLSAgICAgICAgICAgICAgICBFUC5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEJ1aWxkUGl2b3RUYWJsZTEoRmlsZUluZm8gTXlGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIGVwID0gbmV3IEV4Y2VsUGFja2FnZShNeUZpbGUpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgdmFyIHdzRGF0YSA9IGVwLldvcmtib29rLldvcmtzaGVldHNbIkRhdGEiXTsKLSAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gd3NEYXRhLkRpbWVuc2lvbi5BZGRyZXNzOwotICAgICAgICAgICAgICAgIEV4Y2VsUmFuZ2UgZGF0YSA9IHdzRGF0YS5DZWxsc1t0b3RhbFJvd3NdOwotCi0gICAgICAgICAgICAgICAgdmFyIHdzQXVkaXRQaXZvdCA9IGVwLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdDEiKTsKLQotICAgICAgICAgICAgICAgIHZhciBwaXZvdFRhYmxlMSA9IHdzQXVkaXRQaXZvdC5QaXZvdFRhYmxlcy5BZGQod3NBdWRpdFBpdm90LkNlbGxzWyJBNzpDMzAiXSwgZGF0YSwgIlBpdm90QXVkaXQxIik7Ci0gICAgICAgICAgICAgICAgcGl2b3RUYWJsZTEuQ29sdW1HcmFuZFRvdGFscyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdmFyIHJvd0ZpZWxkID0gcGl2b3RUYWJsZTEuUm93RmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIklOVk9JQ0VfREFURSJdKTsKLQotCi0gICAgICAgICAgICAgICAgcm93RmllbGQuQWRkRGF0ZUdyb3VwaW5nKGVEYXRlR3JvdXBCeS5ZZWFycyk7Ci0gICAgICAgICAgICAgICAgdmFyIHllYXJGaWVsZCA9IHBpdm90VGFibGUxLkZpZWxkcy5HZXREYXRlR3JvdXBGaWVsZChlRGF0ZUdyb3VwQnkuWWVhcnMpOwotICAgICAgICAgICAgICAgIHllYXJGaWVsZC5OYW1lID0gIlllYXIiOwotCi0gICAgICAgICAgICAgICAgdmFyIHJvd0ZpZWxkMiA9IHBpdm90VGFibGUxLlJvd0ZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWyJBVURJVF9MSU5FX1NUQVRVUyJdKTsKLQotICAgICAgICAgICAgICAgIHZhciBUb3RhbFNwZW5kID0gcGl2b3RUYWJsZTEuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWyJUT1RBTF9JTlZPSUNFX1BSSUNFIl0pOwotICAgICAgICAgICAgICAgIFRvdGFsU3BlbmQuTmFtZSA9ICJUb3RhbCBTcGVuZCI7Ci0gICAgICAgICAgICAgICAgVG90YWxTcGVuZC5Gb3JtYXQgPSAiJCMjLCMjMCI7Ci0KLQotICAgICAgICAgICAgICAgIHZhciBDb3VudEludm9pY2VQcmljZSA9IHBpdm90VGFibGUxLkRhdGFGaWVsZHMuQWRkKHBpdm90VGFibGUxLkZpZWxkc1siQ09VTlQiXSk7Ci0gICAgICAgICAgICAgICAgQ291bnRJbnZvaWNlUHJpY2UuTmFtZSA9ICJUb3RhbCBMaW5lcyI7Ci0gICAgICAgICAgICAgICAgQ291bnRJbnZvaWNlUHJpY2UuRm9ybWF0ID0gIiMjLCMjMCI7Ci0KLSAgICAgICAgICAgICAgICBwaXZvdFRhYmxlMS5EYXRhT25Sb3dzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXAuU2F2ZSgpOwotICAgICAgICAgICAgICAgIGVwLkRpc3Bvc2UoKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQnVpbGRQaXZvdFRhYmxlMihGaWxlSW5mbyBNeUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKE15RmlsZSkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICB2YXIgd3NEYXRhID0gZXAuV29ya2Jvb2suV29ya3NoZWV0c1siRGF0YSJdOwotICAgICAgICAgICAgICAgIHZhciB0b3RhbFJvd3MgPSB3c0RhdGEuRGltZW5zaW9uLkFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgRXhjZWxSYW5nZSBkYXRhID0gd3NEYXRhLkNlbGxzW3RvdGFsUm93c107Ci0KLSAgICAgICAgICAgICAgICB2YXIgd3NBdWRpdFBpdm90ID0gZXAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90MiIpOwotCi0gICAgICAgICAgICAgICAgdmFyIHBpdm90VGFibGUxID0gd3NBdWRpdFBpdm90LlBpdm90VGFibGVzLkFkZCh3c0F1ZGl0UGl2b3QuQ2VsbHNbIkE3OkMzMCJdLCBkYXRhLCAiUGl2b3RBdWRpdDIiKTsKLSAgICAgICAgICAgICAgICBwaXZvdFRhYmxlMS5Db2x1bUdyYW5kVG90YWxzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2YXIgcm93RmllbGQgPSBwaXZvdFRhYmxlMS5Sb3dGaWVsZHMuQWRkKHBpdm90VGFibGUxLkZpZWxkc1siSU5WT0lDRV9EQVRFIl0pOwotCi0KLSAgICAgICAgICAgICAgICByb3dGaWVsZC5BZGREYXRlR3JvdXBpbmcoZURhdGVHcm91cEJ5LlllYXJzKTsKLSAgICAgICAgICAgICAgICB2YXIgeWVhckZpZWxkID0gcGl2b3RUYWJsZTEuRmllbGRzLkdldERhdGVHcm91cEZpZWxkKGVEYXRlR3JvdXBCeS5ZZWFycyk7Ci0gICAgICAgICAgICAgICAgeWVhckZpZWxkLk5hbWUgPSAiWWVhciI7Ci0KLSAgICAgICAgICAgICAgICB2YXIgcm93RmllbGQyID0gcGl2b3RUYWJsZTEuUm93RmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIkFVRElUX0xJTkVfU1RBVFVTIl0pOwotCi0gICAgICAgICAgICAgICAgdmFyIFRvdGFsU3BlbmQgPSBwaXZvdFRhYmxlMS5EYXRhRmllbGRzLkFkZChwaXZvdFRhYmxlMS5GaWVsZHNbIlRPVEFMX0lOVk9JQ0VfUFJJQ0UiXSk7Ci0gICAgICAgICAgICAgICAgVG90YWxTcGVuZC5OYW1lID0gIlRvdGFsIFNwZW5kIjsKLSAgICAgICAgICAgICAgICBUb3RhbFNwZW5kLkZvcm1hdCA9ICIkIyMsIyMwIjsKLQotCi0gICAgICAgICAgICAgICAgdmFyIENvdW50SW52b2ljZVByaWNlID0gcGl2b3RUYWJsZTEuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWyJDT1VOVCJdKTsKLSAgICAgICAgICAgICAgICBDb3VudEludm9pY2VQcmljZS5OYW1lID0gIlRvdGFsIExpbmVzIjsKLSAgICAgICAgICAgICAgICBDb3VudEludm9pY2VQcmljZS5Gb3JtYXQgPSAiIyMsIyMwIjsKLQotICAgICAgICAgICAgICAgIHBpdm90VGFibGUxLkRhdGFPblJvd3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlcC5TYXZlKCk7Ci0gICAgICAgICAgICAgICAgZXAuRGlzcG9zZSgpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgc3RyaW5nIElzc3VlMTUyNDcoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxkaWFnb25hbC54bHN4Iik7Ci0gICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZURpYWdvbmFsLnhsc3giKTsKLSAgICAgICAgICAgIGlmIChuZXdGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLSAgICAgICAgICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZURpYWdvbmFsLnhsc3giKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSwgdGVtcGxhdGVGaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL09wZW4gd29ya3NoZWV0IDEKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgICAgICBEZWJ1Zy5Xcml0ZUxpbmUod29ya3NoZWV0LkNlbGxzWyJBMSJdLlN0eWxlLkJvcmRlci5EaWFnb25hbFVwKTsKLSAgICAgICAgICAgICAgICBEZWJ1Zy5Xcml0ZUxpbmUod29ya3NoZWV0LkNlbGxzWyJBMSJdLlN0eWxlLkJvcmRlci5EaWFnb25hbERvd24pOwotCi0KLSAgICAgICAgICAgICAgICAvL3dvcmtzaGVldC5DZWxsc1siQTEiXS5TdHlsZS5Cb3JkZXIuRGlhZ29uYWxVcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy93b3Jrc2hlZXQuQ2VsbHNbIkExIl0uU3R5bGUuQm9yZGVyLkRpYWdvbmFsRG93biA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBzYXZlIG91ciBuZXcgd29ya2Jvb2sgYW5kIHdlIGFyZSBkb25lIQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3RmlsZS5GdWxsTmFtZTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBpc3N1ZTE1MjQ5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcodmFyIGV4ZmlsZT1uZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEJvbGR0ZXh0Y29weS54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4ZmlsZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoInNoZWV0MSIsImNvcGllZFNoZWV0Iik7Ci0gICAgICAgICAgICAgICAgZXhmaWxlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xCb2xkdGV4dGNvcHkyLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgaXNzdWUxNTMwMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZXhmaWxlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xoZWFkZm9vdHBpYy54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4ZmlsZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoInNoZWV0MSIsImNvcGllZFNoZWV0Iik7Ci0gICAgICAgICAgICAgICAgZXhmaWxlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xoZWFkZm9vdHBpY19zYXZlLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBpc3N1ZTE1Mjk1KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBleGZpbGUgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXHBpdm90IGlzc3VlXGlucHV0Lnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhmaWxlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xwaXZvdCBpc3N1ZVxwaXZvdGNvbGR1cC54bHN4IikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgaXNzdWUxNTI4MigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgZXhmaWxlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xwaXZvdHRhYmxlLXRhYmxlLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhmaWxlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xwaXZvdCBpc3N1ZVxwaXZvdHRhYi10YWItc2F2ZS54bHN4IikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZXMxNDY5OSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oc3RyaW5nLkZvcm1hdCgiYzpcXHRlbXBcXGJ1Z1xcRVBQbHVzX0lzc3VlMTQ2OTkueGxzeCIsIFN5c3RlbS5JTy5EaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7Ci0gICAgICAgICAgICBPZmZpY2VPcGVuWG1sLkV4Y2VsUGFja2FnZSBwa2cgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd2tzaGVldCA9IHBrZy5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSXNzdWUxNDY5OSIpOwotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBhIHNtYWxsIHJhbmdlCi0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCAxMTsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMTsgY29sIDwgMTE7IGNvbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2tzaGVldC5DZWxsc1tyb3csIGNvbF0uVmFsdWUgPSBzdHJpbmcuRm9ybWF0KCJ7MH17MX0iLCAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiW2NvbCAtIDFdLCByb3cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdrc2hlZXQuVmlldy5GcmVlemVQYW5lcygzLCAzKTsKLSAgICAgICAgICAgIHBrZy5TYXZlKCk7Ci0KLSAgICAgICAgfQotICAgIH0KLX0gICAgCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L0xvYWRGcm9tQ29sbGVjdGlvblRlc3RzLmNzIGIvRVBQbHVzVGVzdC9Mb2FkRnJvbUNvbGxlY3Rpb25UZXN0cy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyZjI2NS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L0xvYWRGcm9tQ29sbGVjdGlvblRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7Ci11c2luZyBSaGluby5Nb2NrczsKLXVzaW5nIFJoaW5vLk1vY2tzLkNvbnN0cmFpbnRzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIExvYWRGcm9tQ29sbGVjdGlvblRlc3RzCi0gICAgewotICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCBjbGFzcyBCYXNlQ2xhc3MKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHN0cmluZyBJZCB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgY2xhc3MgSW1wbGVtZW50YXRpb24gOiBCYXNlQ2xhc3MKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBOdW1iZXIgeyBnZXQ7IHNldDsgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgY2xhc3MgQWNsYXNzCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgSWQgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRVc2VBY2xhc3NQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IExpc3Q8QWNsYXNzPigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IEFjbGFzcygpeyBJZCA9ICIxMjMiLCBOYW1lID0gIkl0ZW0gMSIsIE51bWJlciA9IDN9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihpdGVtcywgdHJ1ZSwgVGFibGVTdHlsZXMuRGFyazEpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJZCIsIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRVc2VCYXNlQ2xhc3NQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IExpc3Q8QmFzZUNsYXNzPigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IEltcGxlbWVudGF0aW9uKCl7IElkID0gIjEyMyIsIE5hbWUgPSAiSXRlbSAxIiwgTnVtYmVyID0gM30KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uTG9hZEZyb21Db2xsZWN0aW9uKGl0ZW1zLCB0cnVlLCBUYWJsZVN0eWxlcy5EYXJrMSk7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIklkIiwgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNob3VsZFVzZUFub255bW91c1Byb3BlcnRpZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgb2JqcyA9IG5ldyBMaXN0PEJhc2VDbGFzcz4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvbigpeyBJZCA9ICIxMjMiLCBOYW1lID0gIkl0ZW0gMSIsIE51bWJlciA9IDN9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIGl0ZW1zID0gb2Jqcy5TZWxlY3QoeCA9PiBuZXcge0lkID0geC5JZCwgTmFtZSA9IHguTmFtZX0pLlRvTGlzdCgpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldCIpOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihpdGVtcywgdHJ1ZSwgVGFibGVTdHlsZXMuRGFyazEpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJZCIsIHNoZWV0LkNlbGxzWyJDMSJdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihJbnZhbGlkQ2FzdEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBTaG91bGRUaHJvd0ludmFsaWRDYXN0RXhjZXB0aW9uSWYoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgb2JqcyA9IG5ldyBMaXN0PEJhc2VDbGFzcz4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvbigpeyBJZCA9ICIxMjMiLCBOYW1lID0gIkl0ZW0gMSIsIE51bWJlciA9IDN9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIGl0ZW1zID0gb2Jqcy5TZWxlY3QoeCA9PiBuZXcgeyBJZCA9IHguSWQsIE5hbWUgPSB4Lk5hbWUgfSkuVG9MaXN0KCk7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uTG9hZEZyb21Db2xsZWN0aW9uKGl0ZW1zLCB0cnVlLCBUYWJsZVN0eWxlcy5EYXJrMSwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgdHlwZW9mKHN0cmluZykuR2V0TWVtYmVycygpKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSWQiLCBzaGVldC5DZWxsc1siQzEiXS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMjU4NS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRXhjZWxQYWNrYWdlVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJFUFBsdXMgVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIEphbiBLw6RsbG1hbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKLS8vIHRvIENPTSBjb21wb25lbmV0cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoIjkxNzk3N2QyLTViMjAtNDhlNy1iMDFjLWY1ZGJkOWU3NmI5OSIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uIAotLy8gICAgICBCdWlsZCBOdW1iZXIKLS8vICAgICAgUmV2aXNpb24KLS8vCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBSZXZpc2lvbiBhbmQgQnVpbGQgTnVtYmVycyAKLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6Ci1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvUmVzb3VyY2VzLkRlc2lnbmVyLmNzIGIvRVBQbHVzVGVzdC9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5EZXNpZ25lci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjZGQ3Yi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvUmVzb3VyY2VzLkRlc2lnbmVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAot77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDxhdXRvLWdlbmVyYXRlZD4KLS8vICAgICBUaGlzIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBhIHRvb2wuCi0vLyAgICAgUnVudGltZSBWZXJzaW9uOjQuMC4zMDMxOS40MjAwMAotLy8KLS8vICAgICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYKLS8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4KLS8vIDwvYXV0by1nZW5lcmF0ZWQ+Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5Qcm9wZXJ0aWVzIHsKLSAgICB1c2luZyBTeXN0ZW07Ci0gICAgCi0gICAgCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgIEEgc3Ryb25nbHktdHlwZWQgcmVzb3VyY2UgY2xhc3MsIGZvciBsb29raW5nIHVwIGxvY2FsaXplZCBzdHJpbmdzLCBldGMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLyBUaGlzIGNsYXNzIHdhcyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgU3Ryb25nbHlUeXBlZFJlc291cmNlQnVpbGRlcgotICAgIC8vIGNsYXNzIHZpYSBhIHRvb2wgbGlrZSBSZXNHZW4gb3IgVmlzdWFsIFN0dWRpby4KLSAgICAvLyBUbyBhZGQgb3IgcmVtb3ZlIGEgbWVtYmVyLCBlZGl0IHlvdXIgLlJlc1ggZmlsZSB0aGVuIHJlcnVuIFJlc0dlbgotICAgIC8vIHdpdGggdGhlIC9zdHIgb3B0aW9uLCBvciByZWJ1aWxkIHlvdXIgVlMgcHJvamVjdC4KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlQXR0cmlidXRlKCJTeXN0ZW0uUmVzb3VyY2VzLlRvb2xzLlN0cm9uZ2x5VHlwZWRSZXNvdXJjZUJ1aWxkZXIiLCAiNC4wLjAuMCIpXQotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgW2dsb2JhbDo6U3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5Db21waWxlckdlbmVyYXRlZEF0dHJpYnV0ZSgpXQotICAgIGludGVybmFsIGNsYXNzIFJlc291cmNlcyB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOjpTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyByZXNvdXJjZUN1bHR1cmU7Ci0gICAgICAgIAotICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuQ29kZUFuYWx5c2lzLlN1cHByZXNzTWVzc2FnZUF0dHJpYnV0ZSgiTWljcm9zb2Z0LlBlcmZvcm1hbmNlIiwgIkNBMTgxMTpBdm9pZFVuY2FsbGVkUHJpdmF0ZUNvZGUiKV0KLSAgICAgICAgaW50ZXJuYWwgUmVzb3VyY2VzKCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgIFJldHVybnMgdGhlIGNhY2hlZCBSZXNvdXJjZU1hbmFnZXIgaW5zdGFuY2UgdXNlZCBieSB0aGlzIGNsYXNzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlQXR0cmlidXRlKGdsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZVN0YXRlLkFkdmFuY2VkKV0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgUmVzb3VyY2VNYW5hZ2VyIHsKLSAgICAgICAgICAgIGdldCB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5SZWZlcmVuY2VFcXVhbHMocmVzb3VyY2VNYW4sIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgdGVtcCA9IG5ldyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyKCJFUFBsdXNUZXN0LlByb3BlcnRpZXMuUmVzb3VyY2VzIiwgdHlwZW9mKFJlc291cmNlcykuQXNzZW1ibHkpOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1hbiA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU1hbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICBPdmVycmlkZXMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgQ3VycmVudFVJQ3VsdHVyZSBwcm9wZXJ0eSBmb3IgYWxsCi0gICAgICAgIC8vLyAgIHJlc291cmNlIGxvb2t1cHMgdXNpbmcgdGhpcyBzdHJvbmdseSB0eXBlZCByZXNvdXJjZSBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIEN1bHR1cmUgewotICAgICAgICAgICAgZ2V0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDdWx0dXJlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUN1bHR1cmUgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gICBMb29rcyB1cCBhIGxvY2FsaXplZCByZXNvdXJjZSBvZiB0eXBlIFN5c3RlbS5EcmF3aW5nLkJpdG1hcC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIFN5c3RlbS5EcmF3aW5nLkJpdG1hcCBUZXN0MSB7Ci0gICAgICAgICAgICBnZXQgewotICAgICAgICAgICAgICAgIG9iamVjdCBvYmogPSBSZXNvdXJjZU1hbmFnZXIuR2V0T2JqZWN0KCJUZXN0MSIsIHJlc291cmNlQ3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU3lzdGVtLkRyYXdpbmcuQml0bWFwKShvYmopKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeCBiL0VQUGx1c1Rlc3QvUHJvcGVydGllcy9SZXNvdXJjZXMucmVzeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMzI5NS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Byb3BlcnRpZXMvUmVzb3VyY2VzLnJlc3gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxyb290PgotICA8IS0tIAotICAgIE1pY3Jvc29mdCBSZXNYIFNjaGVtYSAKLSAgICAKLSAgICBWZXJzaW9uIDIuMAotICAgIAotICAgIFRoZSBwcmltYXJ5IGdvYWxzIG9mIHRoaXMgZm9ybWF0IGlzIHRvIGFsbG93IGEgc2ltcGxlIFhNTCBmb3JtYXQgCi0gICAgdGhhdCBpcyBtb3N0bHkgaHVtYW4gcmVhZGFibGUuIFRoZSBnZW5lcmF0aW9uIGFuZCBwYXJzaW5nIG9mIHRoZSAKLSAgICB2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlcy4KLSAgICAKLSAgICBFeGFtcGxlOgotICAgIAotICAgIC4uLiBhZG8ubmV0L1hNTCBoZWFkZXJzICYgc2NoZW1hIC4uLgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPnRleHQvbWljcm9zb2Z0LXJlc3g8L3Jlc2hlYWRlcj4KLSAgICA8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjIuMDwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0icmVhZGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVJlYWRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxyZXNoZWFkZXIgbmFtZT0id3JpdGVyIj5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIC4uLjwvcmVzaGVhZGVyPgotICAgIDxkYXRhIG5hbWU9Ik5hbWUxIj48dmFsdWU+dGhpcyBpcyBteSBsb25nIHN0cmluZzwvdmFsdWU+PGNvbW1lbnQ+dGhpcyBpcyBhIGNvbW1lbnQ8L2NvbW1lbnQ+PC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkNvbG9yMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuQ29sb3IsIFN5c3RlbS5EcmF3aW5nIj5CbHVlPC9kYXRhPgotICAgIDxkYXRhIG5hbWU9IkJpdG1hcDEiIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQiPgotICAgICAgICA8dmFsdWU+W2Jhc2U2NCBtaW1lIGVuY29kZWQgc2VyaWFsaXplZCAuTkVUIEZyYW1ld29yayBvYmplY3RdPC92YWx1ZT4KLSAgICA8L2RhdGE+Ci0gICAgPGRhdGEgbmFtZT0iSWNvbjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkljb24sIFN5c3RlbS5EcmF3aW5nIiBtaW1ldHlwZT0iYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5ieXRlYXJyYXkuYmFzZTY0Ij4KLSAgICAgICAgPHZhbHVlPltiYXNlNjQgbWltZSBlbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBieXRlIGFycmF5IGZvcm0gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIG9iamVjdF08L3ZhbHVlPgotICAgICAgICA8Y29tbWVudD5UaGlzIGlzIGEgY29tbWVudDwvY29tbWVudD4KLSAgICA8L2RhdGE+Ci0gICAgICAgICAgICAgICAgCi0gICAgVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAotICAgIG5hbWUvdmFsdWUgcGFpcnMuCi0gICAgCi0gICAgRWFjaCBkYXRhIHJvdyBjb250YWlucyBhIG5hbWUsIGFuZCB2YWx1ZS4gVGhlIHJvdyBhbHNvIGNvbnRhaW5zIGEgCi0gICAgdHlwZSBvciBtaW1ldHlwZS4gVHlwZSBjb3JyZXNwb25kcyB0byBhIC5ORVQgY2xhc3MgdGhhdCBzdXBwb3J0IAotICAgIHRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCi0gICAgQ2xhc3NlcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhpcyBhcmUgc2VyaWFsaXplZCBhbmQgc3RvcmVkIHdpdGggdGhlIAotICAgIG1pbWV0eXBlIHNldC4KLSAgICAKLSAgICBUaGUgbWltZXR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzLCBhbmQgdGVsbHMgdGhlIAotICAgIFJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKLSAgICBleHRlbnNpYmxlLiBGb3IgYSBnaXZlbiBtaW1ldHlwZSB0aGUgdmFsdWUgbXVzdCBiZSBzZXQgYWNjb3JkaW5nbHk6Ci0gICAgCi0gICAgTm90ZSAtIGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCBpcyB0aGUgZm9ybWF0IAotICAgIHRoYXQgdGhlIFJlc1hSZXNvdXJjZVdyaXRlciB3aWxsIGdlbmVyYXRlLCBob3dldmVyIHRoZSByZWFkZXIgY2FuIAotICAgIHJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KLSAgICAKLSAgICBtaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0Ci0gICAgdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggCi0gICAgICAgICAgICA6IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uRm9ybWF0dGVycy5CaW5hcnkuQmluYXJ5Rm9ybWF0dGVyCi0gICAgICAgICAgICA6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCi0gICAgCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3Quc29hcC5iYXNlNjQKLSAgICB2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKLSAgICAgICAgICAgIDogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotCi0gICAgbWltZXR5cGU6IGFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYnl0ZWFycmF5LmJhc2U2NAotICAgIHZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbnRvIGEgYnl0ZSBhcnJheSAKLSAgICAgICAgICAgIDogdXNpbmcgYSBTeXN0ZW0uQ29tcG9uZW50TW9kZWwuVHlwZUNvbnZlcnRlcgotICAgICAgICAgICAgOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgotICAgIC0tPgotICA8eHNkOnNjaGVtYSBpZD0icm9vdCIgeG1sbnM9IiIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6bXNkYXRhPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhtbC1tc2RhdGEiPgotICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAvPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290IiBtc2RhdGE6SXNEYXRhU2V0PSJ0cnVlIj4KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0YWRhdGEiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5Ij4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KLSAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1zZGF0YTpPcmRpbmFsPSI0IiAvPgotICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICA8L3hzZDpzY2hlbWE+Ci0gIDxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgotICAgIDx2YWx1ZT50ZXh0L21pY3Jvc29mdC1yZXN4PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxyZXNoZWFkZXIgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHZhbHVlPjIuMDwvdmFsdWU+Ci0gIDwvcmVzaGVhZGVyPgotICA8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+Ci0gICAgPHZhbHVlPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlUmVhZGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODk8L3ZhbHVlPgotICA8L3Jlc2hlYWRlcj4KLSAgPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgotICAgIDx2YWx1ZT5TeXN0ZW0uUmVzb3VyY2VzLlJlc1hSZXNvdXJjZVdyaXRlciwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5PC92YWx1ZT4KLSAgPC9yZXNoZWFkZXI+Ci0gIDxhc3NlbWJseSBhbGlhcz0iU3lzdGVtLldpbmRvd3MuRm9ybXMiIG5hbWU9IlN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSIgLz4KLSAgPGRhdGEgbmFtZT0iVGVzdDEiIHR5cGU9IlN5c3RlbS5SZXNvdXJjZXMuUmVzWEZpbGVSZWYsIFN5c3RlbS5XaW5kb3dzLkZvcm1zIj4KLSAgICA8dmFsdWU+Li5cUmVzb3VyY2VzXFRlc3QxLmpwZztTeXN0ZW0uRHJhd2luZy5CaXRtYXAsIFN5c3RlbS5EcmF3aW5nLCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYTwvdmFsdWU+Ci0gIDwvZGF0YT4KLTwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1JlYWRUZW1wbGF0ZS5jcyBiL0VQUGx1c1Rlc3QvUmVhZFRlbXBsYXRlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWYwNjEyLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvUmVhZFRlbXBsYXRlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0gICAgW1Rlc3RDbGFzc10KLSAgICBwdWJsaWMgY2xhc3MgUmVhZFRlbXBsYXRlIC8vOiBUZXN0QmFzZQotICAgIHsKLSAgICAgICAgLy9bQ2xhc3NJbml0aWFsaXplKCldCi0gICAgICAgIC8vcHVibGljIHN0YXRpYyB2b2lkIENsYXNzSW5pdChUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIC8vSW5pdEJhc2UoKTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vW0NsYXNzQ2xlYW51cCgpXQotICAgICAgICAvL3B1YmxpYyBzdGF0aWMgdm9pZCBDbGFzc0NsZWFudXAoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgLy9TYXZlV29ya3NoZWV0KCJXb3Jrc2hlZXQueGxzeCIpOwotICAgICAgICAvL30KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCbGFua1N0cmVhbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2Uoc3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBlcmYiKTsKLSAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW0uQ2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wueGxzeCIpOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJHNCJdLlZhbHVlPTEyOwotICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wyLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWczKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHhsc1BhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYmlsbGluZ190ZW1wbGF0ZS54bHN4IikpOwotICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB4bHNXYiA9IHhsc1BhY2suV29ya2Jvb2s7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB4bHNTaGVldCA9IHhsc1diLldvcmtzaGVldHNbIkJpbGxpbmciXTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZmlsZSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYm9vazIueGxzeCIpOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiR29vZCIsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJBMSJdLlN0eWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJHb29kIDIiLCBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQzEiXS5TdHlsZU5hbWUpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiTm90ZSIsIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJHMTEiXS5TdHlsZU5hbWUpOwotICAgICAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxBZGVub3ZpcmlkYWUgUHJvdG9jb2wyLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbmRGb3JtYXREYXRhVmFsQnVnKCkKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGZpbGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNvbmRpLnhsc3giKTsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShmaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZHYgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5DZWxsc1siQTEiXS5EYXRhVmFsaWRhdGlvbi5BZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgICAgICAgICBkdi5Gb3JtdWxhLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICBkdi5Gb3JtdWxhMi5WYWx1ZSA9IDQ7Ci0gICAgICAgICAgICAgICAgZHYuT3BlcmF0b3IgPSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5lcXVhbDsKLSAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY29uZGkyLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEludGVybmFsWmlwKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy92YXIgZmlsZSA9IEAiYzpcdGVtcFxjb25kaS54bHN4IjsKLSAgICAgICAgICAgIC8vdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpbGUpKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGluZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx0ZXN0Lnhsc3giKSk7Ci0KLSAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya0Jvb2sgPSBwYWNrYWdlLldvcmtib29rOwotICAgICAgICAgICAgaWYgKHdvcmtCb29rICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod29ya0Jvb2suV29ya3NoZWV0cy5Db3VudCA+IDApIC8vZmFpbHMgb24gdGhpcyBsaW5lCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IHdvcmtzaGVldAotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgY3VycmVudFdvcmtzaGVldCA9IHdvcmtCb29rLldvcmtzaGVldHMuRmlyc3QoKTsKLQotICAgICAgICAgICAgdmFyIHJvd0NvdW50ID0gMTsKLSAgICAgICAgICAgIHZhciBsYXN0Um93ID0gY3VycmVudFdvcmtzaGVldC5EaW1lbnNpb24uRW5kLlJvdzsKLSAgICAgICAgICAgIHZhciBsYXN0Q29sdW1uID0gY3VycmVudFdvcmtzaGVldC5EaW1lbnNpb24uRW5kLkNvbHVtbjsKLSAgICAgICAgICAgIHdoaWxlIChyb3dDb3VudCA8PSBsYXN0Um93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbHVtbkNvdW50ID0gMTsKLSAgICAgICAgICAgIHZhciBsaW5lID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAoY29sdW1uQ291bnQgPD0gbGFzdENvbHVtbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpbmUgKz0gY3VycmVudFdvcmtzaGVldC5DZWxsc1tyb3dDb3VudCwgY29sdW1uQ291bnRdLlZhbHVlICsgInwiOwotICAgICAgICAgICAgY29sdW1uQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmVzLkFkZChsaW5lKTsKLSAgICAgICAgICAgIHJvd0NvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWc1KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NccHJvdGVjdC54bHN4IikpOwotCi0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uUHJvdGVjdGlvbi5BbGxvd0luc2VydENvbHVtbnMgPSB0cnVlOwotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoInRlc3QiKTsKLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NccHJvdGVjdG5ldy54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnNigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXG91dG9mcmFuZ2VcZXJyb3IueGxzeCIpKTsKLQotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLlByb3RlY3Rpb24uQWxsb3dJbnNlcnRDb2x1bW5zID0gdHJ1ZTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXS5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXGVycm9yLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWc3KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0ZXN0Iik7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHJuZyA9IHdzLkNlbGxzWyJBMSJdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBydDEgPSBybmcuUmljaFRleHQuQWRkKCJURVhUMVxyXG4iKTsKLSAgICAgICAgICAgICAgICBydDEuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcm5nLlN0eWxlLldyYXBUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2YXIgcnQyPXJuZy5SaWNoVGV4dC5BZGQoIlRFWFQyIik7Ci0gICAgICAgICAgICAgICAgcnQyLkJvbGQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFwyLjkgYnVnc1xlcnJvci54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnOCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXDIuOSBidWdzXGJ1Z1xHZW5iYW5kIFNPIENyb3NzUmVmIFBob2VuaXgueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcm5nID0gd3MuQ2VsbHNbIkExIl0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJ0MSA9IHJuZy5SaWNoVGV4dC5BZGQoIlRFWFQxXHJcbiIpOwotICAgICAgICAgICAgICAgIHJ0MS5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBybmcuU3R5bGUuV3JhcFRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHZhciBydDIgPSBybmcuUmljaFRleHQuQWRkKCJURVhUMiIpOwotICAgICAgICAgICAgICAgIHJ0Mi5Cb2xkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NcYmlsbGluZ190ZW1wbGF0ZS54bHN4LmVycm9yIikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnOSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXENvdmVuYW50c0NoZWNrUmVwb3J0VGVtcGxhdGUueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcMi45IGJ1Z3NcbmV3X3QueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzEwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcTW9kZWxfZ3JhcGhlc19NQlcueGxzbSIpKTsKLQotICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJIVFRQX2RhdGEiXTsKLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwod3MuQ2VsbHNbIkI0Il0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuSW5kZXhlZCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHdzLkNlbGxzWyJCNSJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLkluZGV4ZWQpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnMTEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxzYW1wbGUueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHZhciBwY2syID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgcGNrMi5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIsIHdzKTsKLSAgICAgICAgICAgIHBjazIuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcU2FtcGxlTmV3Lnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRDb25kaXRpb25hbEZvcm1hdHRpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjZjIueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5Db25kaXRpb25hbEZvcm1hdHRpbmdbNl0uVHlwZSwgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWwpOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjb25kRm9ybVRlc3QueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZFN0eWxlQnVnKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYWNxdWlzaXRpb25zLTE5OTMtMi54bHN4IikpOwotICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjb25kRm9ybVRlc3QueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZFVSTCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1x1cmwueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY29uZEZvcm1UZXN0Lnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWROYW1lRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxuYW1lczIueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcVGVzdFRhYmxlU2F2ZS54bHN4IikpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZEJ1ZzEyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHRlc3Q0Lnhsc3giKSk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICAvL3dzLkNvbHVtbigwKS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWcyLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWcxMygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXG9yaWdpbmFsLnhsc3giKSk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZShuZXcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbENhbGN1bGF0aW9uT3B0aW9uKCkgeyBBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPSB0cnVlIH0pOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWcyLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRCdWcxNCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29tbWVudCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uQWRkQ29tbWVudCgiVGVzdCBhdiBrb21tZW50YXIiLCAiSiIpOwotICAgICAgICAgICAgd3MuQ29tbWVudHMuUmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xDb21tZW50VGVzdC54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnMTUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ29sdW1uTWF4RXJyb3IueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHZhciBjb2wgPSB3cy5Db2x1bW4oMSk7Ci0gICAgICAgICAgICBjb2wuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgY29sLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1ZzIueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uICJUaHJlYWRpbmcgQ2VsbHN0b3JlIFRlc3QiCi0gICAgICAgIHB1YmxpYyBpbnQgX3RocmVhZENvdW50PTA7Ci0gICAgICAgIEV4Y2VsUGFja2FnZSBfcGNrVGhyZWFkOwotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBUaHJlYWRpbmdUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Bja1RocmVhZCA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2tUaHJlYWQuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRocmVhZGluZyIpOwotCi0gICAgICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IDIwOyB0KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHRzPW5ldyBUaHJlYWRTdGF0ZShGaW5uaXNoZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cz13cywKLSAgICAgICAgICAgICAgICAgICAgU3RhcnRSb3c9MSsodCoxMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgUm93cz0xMDAwLCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB2YXIgdHN0YXJ0PW5ldyBUaHJlYWRTdGFydCh0cy5TdGFydExvYWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdmFyIHRocmVhZCA9IG5ldyBUaHJlYWQodHN0YXJ0KTsKLSAgICAgICAgICAgICAgICBfdGhyZWFkQ291bnQrKzsKLSAgICAgICAgICAgICAgICB0aHJlYWQuU3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICgxID09IDEpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChfdGhyZWFkQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9wY2tUaHJlYWQuU2F2ZUFzKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXHRocmVhZC54bHN4IikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGhyZWFkLlNsZWVwKDEwMDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIEZpbm5pc2hlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90aHJlYWRDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgY2xhc3MgVGhyZWFkU3RhdGUKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIFRocmVhZFN0YXRlKGNiRmluaXNoZWQgY2IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NiID0gY2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgd3MgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIGludCBTdGFydFJvdyB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IFJvd3MgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgY2JGaW5pc2hlZCgpOwotICAgICAgICAgICAgcHVibGljIGNiRmluaXNoZWQgX2NiOwotICAgICAgICAgICAgcHVibGljIHZvaWQgU3RhcnRMb2FkKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IoaW50IHJvdz1TdGFydFJvdztyb3c8U3RhcnRSb3crUm93cztyb3crKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDE7IGNvbCA8IDEwMDsgY29sKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKHJvdyxjb2wsc3RyaW5nLkZvcm1hdCgicm93IHswfSBjb2wgezF9Iiwgcm93LGNvbCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9jYigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3RJbnZhbGlkVkJBKCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGluZmlsZT1AIkM6XHRlbXBcYnVnXEluZmlsZS54bHNtIjsKLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyBvdXRmaWxlPUAiQzpcdGVtcFxidWdcT3V0ZmlsZS54bHNtIjsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBlcDsKLQotICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5SZWFkKGluZmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKGZzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5Xcml0ZShvdXRmaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcC5TYXZlQXMoZnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1c2luZyAoRmlsZVN0cmVhbSBmcyA9IEZpbGUuT3BlblJlYWQob3V0ZmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXAgPSBuZXcgRXhjZWxQYWNrYWdlKGZzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNpbmcgKEZpbGVTdHJlYW0gZnMgPSBGaWxlLk9wZW5Xcml0ZShvdXRmaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcC5TYXZlQXMoZnMpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJlYW1UZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciB0ZW1wbGF0ZVN0cmVhbSA9IEZpbGUuT3BlblJlYWQoQCJjOlx0ZW1wXHRocmVhZC54bHN4IikpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIG91dFN0cmVhbSA9IEZpbGUuT3BlbihAImM6XHRlbXBcc3RyZWFtT3V0Lnhsc3giLCBGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG91dFN0cmVhbSwgdGVtcGxhdGVTdHJlYW0pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkExIl0uVmFsdWUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG1vcmUgY29udGVudAotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdCgpCi0gICAgICAgIHsgCi0gICAgICAgICAgICBDcmVhdGVYbHN4U2hlZXQoQCJDOlx0ZW1wXGJ1Z1x0ZXN0NC54bHN4IiwgNCwgNCk7Ci0gICAgICAgICAgICBDcmVhdGVYbHN4U2hlZXQoQCJDOlx0ZW1wXGJ1Z1x0ZXN0MjUueGxzeCIsIDI1LCAyNSk7IAotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJMTUwMzgoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcMTUwMzgueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3M9cC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEkxNTAzOSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcMTUwMzkueGxzbSIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgICAgICBwLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1wxNTAzOS1zYXZlZC54bHNtIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJMTUwMzAoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIG5ld1BhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXEkxNTAzMC54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3a0JrID0gbmV3UGFjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgICAgIHZhciBjZWxsID0gd2tCay5DZWxsc1siQTEiXTsKLSAgICAgICAgICAgICAgICBpZiAoY2VsbC5Db21tZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjZWxsLkNvbW1lbnQuVGV4dCA9ICJIZWxsbyBlZGl0ZWQgY29tbWVudHMiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdQYWNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1wxNTAzMC1zYXZlLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEkxNTAxNCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcQ2xhc3NpY1dpbmVDb21wYW55Lnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiU0ZGU2VjdGlvbkhlYWRpbmcwMCIsIHdzLkNlbGxzWzUsIDJdLlN0eWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEkxNTA0MygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcRVBQbHVzVGVzdFxFUFBsdXNUZXN0XEVQUGx1c1Rlc3RcZXhhbXBsZS54bHN4IikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgICAgICBwLldvcmtib29rLldvcmtzaGVldHMuQ29weSh3cy5OYW1lLCAiQ29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXEdyaWRUb0V4Y2VsXzA1LTEyLTIwMTQueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gd3MuQ2VsbHNbMSw4NCwzLDg2XSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNlbGwuQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNhdmVDb3JydXB0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1x0YWJsZXMueGxzeCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgcC5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcY29yci54bHN4IikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWQkFlcnJvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzOwotICAgICAgICAgICAgdXNpbmcgKHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHAuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOwotICAgICAgICAgICAgICAgIHdzID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgi0JPRgNCw0LTRg9C40YDQvtCy0LrQsCIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIHAyID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcDIuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB2YXIgd3MyID0gcDIuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoItCT0YDQsNC00YPQuNGA0L7QstC60LAyIiwgd3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlJc3N1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGtnID0gbmV3IEV4Y2VsUGFja2FnZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUZpbGUgPSBSZWFkVGVtcGxhdGVGaWxlKEAiQzpcdGVtcFxidWdcU3RhY2tPdmVyZmxvd1xFUFBsdXNUZXN0XDIwMTQxMTIwXzAxXzMu5ZCE6IKh57Sv6KiI5pS257WQ6KGoICjlhbbku5bmoYjku7YpLnhsc3giKTsKLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIG1zID0gbmV3IFN5c3RlbS5JTy5NZW1vcnlTdHJlYW0odGVtcGxhdGVGaWxlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgdGVtcFBrZyA9IG5ldyBFeGNlbFBhY2thZ2UobXMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwa2cuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIjIwMTQxMTIwXzAxXzMu5ZCE6IKh57Sv6KiI5pS257WQ6KGoICjlhbbku5bmoYjku7YpIiwgdGVtcFBrZy5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpbGVTdHJlYW1TYXZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZzID0gRmlsZS5DcmVhdGUoQCJjOlx0ZW1wXGZzLnhsc3giKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGtnID0gbmV3IEV4Y2VsUGFja2FnZShmcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzPXBrZy5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICB2YXIgY29sPXdzLkNvbHVtbigxKTsKLSAgICAgICAgICAgICAgICBjb2wuT3V0bGluZUxldmVsID0gMTsKLSAgICAgICAgICAgICAgICBjb2wuQ29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7Ci0gICAgICAgICAgICAgICAgY29sLkNvbHVtbk1heCA9IDE7Ci0gICAgICAgICAgICAgICAgcGtnLlNhdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBSZWFkVGVtcGxhdGVGaWxlKHN0cmluZyB0ZW1wbGF0ZU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSB0ZW1wbGF0ZUZJbGU7Ci0gICAgICAgICAgICB1c2luZyAoU3lzdGVtLklPLk1lbW9yeVN0cmVhbSBtcyA9IG5ldyBTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdyA9IG5ldyBTeXN0ZW0uSU8uRmlsZVN0cmVhbSh0ZW1wbGF0ZU5hbWUsIFN5c3RlbS5JTy5GaWxlTW9kZS5PcGVuLCBTeXN0ZW0uSU8uRmlsZUFjY2Vzcy5SZWFkLCBTeXN0ZW0uSU8uRmlsZVNoYXJlLlJlYWRXcml0ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjA0OF07Ci0gICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gc3cuUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zLldyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVGSWxlID0gbXMuVG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRklsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ3JlYXRlWGxzeFNoZWV0KHN0cmluZyBwRmlsZU5hbWUsIGludCBwUm93cywgaW50IHBDb2x1bW5zKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBGaWxlTmFtZSkpIEZpbGUuRGVsZXRlKHBGaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8ocEZpbGVOYW1lKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgZXhjZWxXb3Jrc2hlZXQgPSBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRlc3RzaGVldCIpOwotCi0gICAgICAgICAgICAgICAgLy8gRmlsbCB3aXRoIGRhdGEKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPD0gcFJvd3M7IHJvdysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMTsgY29sdW1uIDw9IHBDb2x1bW5zOyBjb2x1bW4rKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA+IDEgJiYgcm93ID4gMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByYW5nZSA9IGV4Y2VsV29ya3NoZWV0LkNlbGxzW3JvdywgY29sdW1uXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiMCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLlZlcnRpY2FsQWxpZ25tZW50ID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsV29ya3NoZWV0LkNlbGxzW3JvdywgY29sdW1uXS5WYWx1ZSA9IHJvdyAqIGNvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzdHlsZSB0aGUgZmlyc3QgY29sdW1uLCBiZWdpbmluZyB3aXRoIHJvdyAzIHdoaWNoIGhhcyBubyBjb250ZW50IHlldC4uLgotICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJhbmdlID0gZXhjZWxXb3Jrc2hlZXQuQ2VsbHNbRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKDMsIDEsIHBSb3dzLCAxKV0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbFN0eWxlIHN0eWxlID0gcmFuZ2UuU3R5bGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IEkgd291bGQgYWRkIGRhdGEgdG8gdGhlIGZpcnN0IGNvbHVtbiAobGVmdCBvdXQgaGVyZSkuLi4KLSAgICAgICAgICAgICAgICBleGNlbFBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9CaXRtYXBJbWFnZS5naWYgYi9FUFBsdXNUZXN0L1Jlc291cmNlcy9CaXRtYXBJbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZjM0MWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9SZXNvdXJjZXMvQml0bWFwSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9SZXNvdXJjZXMvVGVzdDEuanBnIGIvRVBQbHVzVGVzdC9SZXNvdXJjZXMvVGVzdDEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzVmZWZmLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL1Rlc3QxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL1ZlY3RvciBEcmF3aW5nLndtZiBiL0VQUGx1c1Rlc3QvUmVzb3VyY2VzL1ZlY3RvciBEcmF3aW5nLndtZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyNWFlYi4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZy53bWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZzIud21mIGIvRVBQbHVzVGVzdC9SZXNvdXJjZXMvVmVjdG9yIERyYXdpbmcyLndtZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkZWVmYS4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Jlc291cmNlcy9WZWN0b3IgRHJhd2luZzIud21mCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9TdHlsZVRlc3QuY3MgYi9FUFBsdXNUZXN0L1N0eWxlVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3MzE4MC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1N0eWxlVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwotCi1uYW1lc3BhY2UgRXhjZWxQYWNrYWdlVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGNsYXNzIFN0eWxlVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldFN0eWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXGZvcm1hdHMueGxzeCIpKTsKLQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uQ2VsbHNbIkE6WCJdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlYnVnLldyaXRlTGluZShjZWxsLlRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RnJhY3Rpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3N0cmluZyBmID0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuRm9ybWF0RnJhY3Rpb24oMC4yNSwgMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKDAuMzMzLCAyKTsKLSAgICAgICAgICAgIC8vZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKC0wLjg4OCwgMik7Ci0gICAgICAgICAgICAvL2YgPSBFeGNlbE51bWJlckZvcm1hdFhtbC5Gb3JtYXRGcmFjdGlvbigtMC4yNzI0NzEsIDMpOwotICAgICAgICAgICAgLy9mID0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuRm9ybWF0RnJhY3Rpb24oMC42NjY2NjYsIDQpOwotICAgICAgICAgICAgLy9mID0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuRm9ybWF0RnJhY3Rpb24oMC4yMSwgNCk7Ci0gICAgICAgICAgICAvL2YgPSBFeGNlbE51bWJlckZvcm1hdFhtbC5Gb3JtYXRGcmFjdGlvbigwLjA5OTk5LCAzKTsKLSAgICAgICAgICAgIC8vZiA9IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkZvcm1hdEZyYWN0aW9uKDAsIDMpOwotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9UZXN0QmFzZS5jcyBiL0VQUGx1c1Rlc3QvVGVzdEJhc2UuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWUyMTAuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9UZXN0QmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdAotewotICAgIFtUZXN0Q2xhc3NdCi0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RCYXNlCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgRXhjZWxQYWNrYWdlIF9wY2s7Ci0gICAgICAgIHByb3RlY3RlZCBzdHJpbmcgX2NsaXBhcnRQYXRoPSIiOwotICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIF93b3Jrc2hlZXRQYXRoPSIiOwotICAgICAgICBwdWJsaWMgVGVzdENvbnRleHQgVGVzdENvbnRleHQgeyBnZXQ7IHNldDsgfQotICAgICAgICAKLSAgICAgICAgW1Rlc3RJbml0aWFsaXplXQotICAgICAgICBwdWJsaWMgdm9pZCBJbml0QmFzZSgpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgX2NsaXBhcnRQYXRoID0gUGF0aC5Db21iaW5lKFBhdGguR2V0VGVtcFBhdGgoKSwgQCJFUFBsdXMgY2xpcGFydCIpOwotICAgICAgICAgICAgaWYgKCFEaXJlY3RvcnkuRXhpc3RzKF9jbGlwYXJ0UGF0aCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShfY2xpcGFydFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGFzbSA9IEFzc2VtYmx5LkdldEV4ZWN1dGluZ0Fzc2VtYmx5KCk7Ci0gICAgICAgICAgICB2YXIgdmFsaWRFeHRlbnNpb25zID0gbmV3W10KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICIuZ2lmIiwgIi53bWYiCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBuYW1lIGluIGFzbS5HZXRNYW5pZmVzdFJlc291cmNlTmFtZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZXh0IGluIHZhbGlkRXh0ZW5zaW9ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLkVuZHNXaXRoKGV4dCwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWxlTmFtZSA9IG5hbWUuUmVwbGFjZSgiRVBQbHVzVGVzdC5SZXNvdXJjZXMuIiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSBhc20uR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbShuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgZmlsZSA9IEZpbGUuQ3JlYXRlKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsIGZpbGVOYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNvcHlUbyhmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3dvcmtzaGVldFBhdGggPSBQYXRoLkNvbWJpbmUoUGF0aC5HZXRUZW1wUGF0aCgpLCBAIkVQUGx1cyB3b3Jrc2hlZXRzIik7Ci0gICAgICAgICAgICBpZiAoIURpcmVjdG9yeS5FeGlzdHMoX3dvcmtzaGVldFBhdGgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpcmVjdG9yeS5DcmVhdGVEaXJlY3RvcnkoX3dvcmtzaGVldFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGRpPW5ldyBEaXJlY3RvcnlJbmZvKF93b3Jrc2hlZXRQYXRoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIF93b3Jrc2hlZXRQYXRoID0gZGkuRnVsbE5hbWUgKyAiXFwiOwotCi0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgT3BlblBhY2thZ2Uoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIG5hbWUpOwotICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoZmkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTYXZlV29ya3NoZWV0KHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvdW50ID09IDApIHJldHVybjsKLSAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhfd29ya3NoZWV0UGF0aCArIG5hbWUpOwotICAgICAgICAgICAgaWYgKGZpLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaS5EZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9wY2suU2F2ZUFzKGZpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVGVzdERUTy5jcyBiL0VQUGx1c1Rlc3QvVGVzdERUTy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4YzYwOC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1Rlc3REVE8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0gICAgcHVibGljIGNsYXNzIFRlc3REVE8KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZVZhcjsKLQotICAgICAgICBwdWJsaWMgaW50IElkIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgW0Rpc3BsYXlOYW1lKCJOYW1lIGZyb20gRGlzcGxheU5hbWVBdHRyaWJ1dGUiKV0KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIFRlc3REVE8gZHRvIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIERhdGVUaW1lIERhdGUgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgYm9vbCBCb29sZWFuIHsgZ2V0OyBzZXQ7IH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIEdldE5hbWVJRCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJZCArICIsIiArIE5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1Rlc3RTdGFydC5vcmRlcmVkdGVzdCBiL0VQUGx1c1Rlc3QvVGVzdFN0YXJ0Lm9yZGVyZWR0ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQyZmYzLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvVGVzdFN0YXJ0Lm9yZGVyZWR0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxPcmRlcmVkVGVzdCBuYW1lPSJUZXN0U3RhcnQiIHN0b3JhZ2U9ImM6XGRldmV4dGVybmFsXGVwcGx1c1xlcHBsdXN0ZXN0XHRlc3RzdGFydC5vcmRlcmVkdGVzdCIgaWQ9ImU3NTk5ZTJlLTQzNmEtNDZiMi1hZjIyLTk2ZmZmMjYzNDZkMyIgeG1sbnM9Imh0dHA6Ly9taWNyb3NvZnQuY29tL3NjaGVtYXMvVmlzdWFsU3R1ZGlvL1RlYW1UZXN0LzIwMTAiPgotICA8RXhlY3V0aW9uIHRpbWVPdXQ9IjIxNDc0ODM2NDciIGlkPSJkMzA5MTlhMS0zYzEyLTQzZmQtYmM1Yy05MGQ5MzRlZjBjMTUiIC8+Ci0gIDxUZXN0TGlua3M+Ci0gICAgPFRlc3RMaW5rIGlkPSJlYzhjN2NiNi1iYjY4LTBiMmQtMzM2ZS1lN2FkNjQ5OGRmYmMiIG5hbWU9IkJhckNoYXJ0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iYTMzNTY3YjAtMGY3NC0zYzIyLTYwNTctM2FjOTQwNGI0YWZlIiBuYW1lPSJDb2x1bW4iIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI2NGY4ZGVlZC04YTVkLTNjMjYtMGQ2Yy1jOGE4NTI3NTVmNTIiIG5hbWU9IkNvbmUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJhMzIzMDM4Ni00ZTFiLTBkYzAtOGYyOC00OTI4NjU2MjdhOWQiIG5hbWU9IkRvdWdudXQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJlNjA0YTQ0Ny01ZDMxLWM2ZDEtOTQ0ZC02OGY4ZDNlMzZiN2QiIG5hbWU9IkRyYXdpbmdzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iZTljOGQxOWEtZjBmMi02ZWFhLWZiY2UtODAzYThlMzIyODViIiBuYW1lPSJMaW5lIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iNWIyZjgzMmItMmU2ZC1kOGZlLWZlOGItNjMwMDI0NGU5YzUzIiBuYW1lPSJMaW5lTWFya2VyIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iYzNjNGRhYTctZjVjNS0wYWE3LTA4NTItMTM5NjU1MmVmNDc4IiBuYW1lPSJQaWN0dXJlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMmQ1OTFhOTItYjRiYy1hNWY4LWFlYzEtODM1MjhjYTk5MTVlIiBuYW1lPSJQaWVDaGFydCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9Ijg4NGNjNDhiLWI3YjEtNmIxYS01NzM1LWViOTljYWVkYmZiOCIgbmFtZT0iUGllQ2hhcnQzRCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjZlZGQ2YTI2LWVkODAtZDBhZS02MjZlLTM2ZWVmZTZlZWY3NiIgbmFtZT0iUHlyYW1pZCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImNmMjM2Y2UwLTYzN2QtZWFlYy0yODViLTU3YTRjNDdjMTUwNyIgbmFtZT0iU2NhdHRlciIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9Ijg0ODkxOTk2LWQ0ZGQtZDUzMS02NTJjLWY0MzYyNDc5MDM4ZSIgbmFtZT0iQnViYmxlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iYjQwNGVjNmUtOTJkMy0wMjM1LWM2YzEtN2Q3OTkyOTQ1ZGZmIiBuYW1lPSJSYWRhciIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImZiNzgxNDU0LWEyZjAtMmFhOS1hZWJmLTA1NjIyZTc1ODc0ZiIgbmFtZT0iU3VyZmFjZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjVjOGFlM2Q1LWZmMGUtNmM5YS1iZTMxLTJiOGE4YTY4NDg1YyIgbmFtZT0iTGluZTJUZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iOTAxNWUzNjktNjY1Ni00ZDc3LTdmNWMtODAzZmUyNWI2OTI3IiBuYW1lPSJNdWx0aUNoYXJ0U2VyaWVzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMGMwYTMyNGMtMTEyYy02OWQ2LThlYWMtMjM0N2FjODI1YjJmIiBuYW1lPSJEcmF3aW5nU2l6aW5nQW5kUG9zaXRpb25pbmciIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIyYWZjMTQ3ZS1kOTM4LTg4OTMtODEyNi04NjI2N2JmOGYyNTgiIG5hbWU9IkRyYXdpbmdXb3Jrc2hlZXRDb3B5IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMmYxNDc3NGMtNDllZS1iZWQ3LTEyYTgtODZkZDMwOTJkNzRmIiBuYW1lPSJEZWxldGVEcmF3aW5nIiBzdG9yYWdlPSJiaW5ccmVsZWFzZVxlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJkMjY3OTc5YS0yMmFjLWY3MzctZDlhMi1lZjIwOGE0OWVjZTQiIG5hbWU9IlJlYWREb2N1bWVudCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImRjMDRhNjkzLTU3NmMtZmI0Mi03MGYwLTkxNDVjNTUwOWI4OCIgbmFtZT0iSW5zZXJ0RGVsZXRlVGVzdCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImI4OWUxM2EwLWIxOTMtOTBiNS1lMjdlLWMwMzgzZWE0ODA5MCIgbmFtZT0iTG9hZERhdGEiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIwMGIxMGE1Zi04YTZiLWZjNWEtOTM2OS1hMTM0ZDQwYzY5YTAiIG5hbWU9IlN0eWxlRmlsbCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjMzODgzOTJmLWNiMTgtNjM4ZS1lYzNkLTBlNGU0YmNiMGYwMCIgbmFtZT0iUGVyZm9ybWFuY2UiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIxZmMwYzk3Mi1kZDgyLWIzY2EtNzRkYS1mNGI3MmI5MGE0MmQiIG5hbWU9IlJpY2hUZXh0Q2VsbHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJhN2U4NjRmNi1jNmQyLWQ2MzYtMjE2MC00Y2ZkNTRhY2QyNGIiIG5hbWU9IlRlc3RDb21tZW50cyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImQ1YmZlNTUzLWU3NGUtZjliMy03MzdmLTRhNmMwM2ZkMWEwMSIgbmFtZT0iSHlwZXJsaW5rIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iNDllMmM0Y2MtY2UxNi01Mjc3LTdmM2QtYjg3ZmIwNTM5MDA5IiBuYW1lPSJQaWN0dXJlVVJMIiBzdG9yYWdlPSJiaW5ccmVsZWFzZVxlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI3ZmJmNTBiYS1jYzAwLTYxNmYtNDZlZi0zYjg1NDc3YTBhNjQiIG5hbWU9IkNvcHlPdmVyd3JpdGUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI2ZGNlOWQyOC05YzA1LWI1MjUtMjBmNi05MjBhZjVhMTlmMjAiIG5hbWU9IkhpZGVUZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iZmJiM2JiNmQtZjcyYy0wZDAyLTkzODItOWM1ODFkN2NkNGQwIiBuYW1lPSJWZXJ5SGlkZVRlc3QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIyODdiMzVkNS0yYmFiLTQ5YmEtMzUzMy1jYTQyNmM2YWQzNGYiIG5hbWU9IlByaW50ZXJTZXR0aW5ncyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImMyZDBmYjQ3LWUxMTItNzlmOS05MGVmLWRkNDgyMDA5Y2E5YyIgbmFtZT0iQWRkcmVzcyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImI4ODhlZGM2LTU4NTgtN2U3MS1jNmNjLTY4ZWI1MjZiZWNkYSIgbmFtZT0iTWVyZ2UiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI1NWNjMTVjOC1jZmY4LTlkOTEtMjJiMi1lZDhmNGRiNjdhMTEiIG5hbWU9IkVuY29kaW5nIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iZmE2MzM5MDgtODk4NS00MWQ4LWUzY2ItMTgwNmQwMzViMTdmIiBuYW1lPSJMb2FkVGV4dCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjcyODFhMGY3LTRkNGEtODdmOS1mNzZlLTljMjBjMDlhMTAyZiIgbmFtZT0iTG9hZERhdGFUYWJsZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImE5N2U4MjBmLWU2MDQtOGJjOC0zMDMwLTI0NDIyZTZmMTk5ZiIgbmFtZT0iV29ya3NoZWV0Q29weSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjdjMGQ4ZjBlLWJiNmYtYWNlZi0zYjkzLTc4MGM0NTMzNzExNyIgbmFtZT0iRGVmYXVsdENvbFdpZHRoIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iNWRlYWMxYzktNDllZi0xMjkyLWIyYzUtNTM1OTIyNzBjMjRkIiBuYW1lPSJDb3B5VGFibGUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJiYzgyMzYwMi02MDVkLTI3MDEtYzQ1NS03ZjQxMGI4ZTJkMTciIG5hbWU9IkF1dG9GaXRDb2x1bW5zIiBzdG9yYWdlPSJiaW5ccmVsZWFzZVxlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI4ZDdlYjNlMS1iZDIxLWM0NjYtYzA1OC0wNGU5ZGI0Yjk5MmQiIG5hbWU9IkNvcHlSYW5nZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjMwMDA1YjVmLTg0ZmQtNzg3NS00YmM3LTE4NGRiYWM0YmJmYSIgbmFtZT0iQ29weU1lcmdlZFJhbmdlIiBzdG9yYWdlPSJiaW5ccmVsZWFzZVxlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI2YjA0MzA2OS00Nzg1LTkzZWMtMjEwZi0yMDkwMjdiNzk1Y2UiIG5hbWU9IlZhbHVlRXJyb3IiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI3Y2NmZjI3My1hOThmLWJhNWYtMjE2NS00NDJjYjc5ODA2ZjMiIG5hbWU9IkRlZkNvbFdpZHRoQnVnIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iZGY5MjMzNDktNmIzMC0xMDdkLTZkMzgtMDcwOWVmYmNlYWNlIiBuYW1lPSJGb3JtdWxhT3ZlcndyaXRlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iOWU0NDlhNjAtMzBiZC02MDBiLWRmNGItMWU4YzRlYjRjZjA2IiBuYW1lPSJGb3JtdWxhRXJyb3IiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJlZDdjMzNmMC1lZDk1LWIxODktZjdiZS01ODg5NGRhZTZjZDUiIG5hbWU9IlN0eWxlTmFtZVRlc3QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI3YTVlYmJlOS01NDQ2LTI0ZGEtMWRlNC01YjQwMjY4MzMxYWQiIG5hbWU9Ik5hbWVkU3R5bGVzIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iYTA3YjRiOGItYTJhMS03N2FlLWUwMTctZDE3NzgzNjcxODE5IiBuYW1lPSJUYWJsZVRlc3QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIzZTdjYTVjNy02MDc1LTA5ZTctNzY1OS02YzMyZWM0ODJlNjciIG5hbWU9IkxvYWRBcnJheSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjY4NGMxNDdlLTUwYjAtYzljNS0yZjg3LWY0YmEyNjg5NGQ4MyIgbmFtZT0iRGVmaW5lZE5hbWUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJkZDNkZDA5ZS01YTQ0LTRhMzQtNWFkZi0zMmE2NjA2YzA4NDMiIG5hbWU9IkNyZWF0ZVBpdm90VGFibGUiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIzMTk4MzAwOC00MzdmLTcwNmItNmMyNC03ZjYxMjVkNDU5MzIiIG5hbWU9IlNldEJhY2tncm91bmQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJiNWViZjUxYi04OGIwLTcxZDUtNmFhYS0zYTgxNWVhNDEwNTUiIG5hbWU9IkNvcHlQaXZvdFRhYmxlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMTkxYTQxZWMtMjI2YS1lMjQxLTM2MWEtYzhiOWU4N2Q1ZTcxIiBuYW1lPSJMb2FkRnJvbUNvbGxlY3Rpb25UZXN0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iZWU4NzEzYTEtZWFjMi1mNjY5LTc0MDItYWNlMDYxNjRmZWZhIiBuYW1lPSJTZXRIZWFkZXJGb290ZXJJbWFnZSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjA2NjliMTExLTE1MjAtOGVkZC1kMTlhLWFkOTQzZTRhNzc4NCIgbmFtZT0iUmVhZFN0cmVhbVNhdmVBc1N0cmVhbSIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjBlYzllYjk2LWMzZjktOTIzMy1lMzAyLTFhNzcwYzFmOTNjYyIgbmFtZT0iUmVhZFdvcmtTaGVldCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9IjQxYWZhYWQyLTc1YTEtYTBjMi0wNzExLTIwMjdiZGNlMDFjYyIgbmFtZT0iUmVhZERyYXdpbmciIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI0MzY1ZGU4Yi1hMGJiLTA1YWItMWI5Yy1lMjVlOGQ5ZjY4ZGEiIG5hbWU9IlJlYWRXcml0ZUVuY3J5cHQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJiYzcxYmM1YS05MzQ2LTRiN2YtOGMwOC05NWRhYmJhMDgzOTAiIG5hbWU9IlJlYWRTdHJlYW1XaXRoVGVtcGxhdGVXb3JrU2hlZXQiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSIzMDc2OWMyZS0zMDI4LTYwY2QtYzhiZi0xMTkxY2RjNGQ3NDQiIG5hbWU9IlNob3VsZEJlQWJsZVRvRGVsZXRlQW5kVGhlbkFkZCIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImQxNmYxNzUwLWU5NTctYzVhMS0xNDZjLTVhOTliY2E3ZDU4YyIgbmFtZT0iVHdvQmFja0NvbG9yIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iODRhOGFkNzgtOTIyZS0zZDc4LTZiNGMtZWU1NzY1NDFlZTk4IiBuYW1lPSJUd29Db2xvclNjYWxlIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMzQxZGIxYjctYTI3My03OGQzLTAzYjktZjEwNDBhOTY1NTZkIiBuYW1lPSJJY29uU2V0IiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iMDM0YzViMTMtMDc0Mi1jNjZmLTA2ZDAtZTAzMWVjNjNiZDI2IiBuYW1lPSJEYXRhYmFyIiBzdG9yYWdlPSJiaW5cZGVidWdcZXBwbHVzdGVzdC5kbGwiIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlRlc3RUeXBlcy5Vbml0LlVuaXRUZXN0RWxlbWVudCwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuVGlwcy5Vbml0VGVzdC5PYmplY3RNb2RlbCwgVmVyc2lvbj0xMS4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhIiAvPgotICAgIDxUZXN0TGluayBpZD0iYmQ0ODNlNzUtNmFkYS05ZGFlLTY2MmUtMDkyMDk2NTIyNmIxIiBuYW1lPSJEZWxldGVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImRkYTkyYjRhLWRlNzMtMDYyOS05OTQ2LTI1MWYxZTQ4ODI3OCIgbmFtZT0iRGVsZXRlQnlOYW1lV2hlcmVXb3JrU2hlZXREb2VzTm90RXhpc3QiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSI2MDMwNWY5Ni1hY2M1LWNhNTQtZmZlMC04MzY0NDljN2NhYmMiIG5hbWU9Ik1vdmVCZWZvcmVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cyIgc3RvcmFnZT0iYmluXGRlYnVnXGVwcGx1c3Rlc3QuZGxsIiB0eXBlPSJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5UZXN0VHlwZXMuVW5pdC5Vbml0VGVzdEVsZW1lbnQsIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlRpcHMuVW5pdFRlc3QuT2JqZWN0TW9kZWwsIFZlcnNpb249MTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYSIgLz4KLSAgICA8VGVzdExpbmsgaWQ9ImM3MmJlNWY2LTM0ZjgtZDgyNS04OThlLTUyYzVlMGQzNjYyMCIgbmFtZT0iTW92ZUFmdGVyQnlOYW1lV2hlcmVXb3JrU2hlZXRFeGlzdHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gICAgPFRlc3RMaW5rIGlkPSJkYzQ4ZWM0Ny0xNWMxLTMyM2ItMzUwOS0wMTBkNDM1MGFlNDUiIG5hbWU9Ik1vdmVCZWZvcmVCeVBvc2l0aW9uV2hlcmVXb3JrU2hlZXRFeGlzdHMiIHN0b3JhZ2U9ImJpblxkZWJ1Z1xlcHBsdXN0ZXN0LmRsbCIgdHlwZT0iTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVGVzdFR5cGVzLlVuaXQuVW5pdFRlc3RFbGVtZW50LCBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlF1YWxpdHlUb29scy5UaXBzLlVuaXRUZXN0Lk9iamVjdE1vZGVsLCBWZXJzaW9uPTExLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gIDwvVGVzdExpbmtzPgotPC9PcmRlcmVkVGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1V0aWxzL0FkZHJlc3NVdGlsaXR5VGVzdHMuY3MgYi9FUFBsdXNUZXN0L1V0aWxzL0FkZHJlc3NVdGlsaXR5VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjM5ZTYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9VdGlscy9BZGRyZXNzVXRpbGl0eVRlc3RzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuVXRpbHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBBZGRyZXNzVXRpbGl0eVRlc3RzCi0gICAgewotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFyc2VGb3JFbnRpcmVDb2x1bW5TZWxlY3Rpb25zX1Nob3VsZEFkZE1heFJvd3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9ICJBOkEiOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMTpBIiArIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlRm9yRW50aXJlQ29sdW1uU2VsZWN0aW9uc19TaG91bGRBZGRNYXhSb3dzT25Db2x1bW5zV2l0aE11bHRpcGxlTGV0dGVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkFCOkFDIjsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gQWRkcmVzc1V0aWxpdHkuUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKGFkZHJlc3MpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQUIxOkFDIiArIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlRm9yRW50aXJlQ29sdW1uU2VsZWN0aW9uc19TaG91bGRIYW5kbGVNdWx0aXBsZVJhbmdlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkE6QSBCOkIiOwotICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gc3RyaW5nLkZvcm1hdCgiQTE6QXswfSBCMTpCezB9IiwgRXhjZWxQYWNrYWdlLk1heFJvd3MpOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9VdGlscy9Db252ZXJ0VXRpbFRlc3QuY3MgYi9FUFBsdXNUZXN0L1V0aWxzL0NvbnZlcnRVdGlsVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZTljMy4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L1V0aWxzL0NvbnZlcnRVdGlsVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotCi1uYW1lc3BhY2UgRVBQbHVzVGVzdC5VdGlscwotewotCVtUZXN0Q2xhc3NdCi0JcHVibGljIGNsYXNzIENvbnZlcnRVdGlsVGVzdAotCXsKLQkJW1Rlc3RNZXRob2RdCi0JCXB1YmxpYyB2b2lkIFRyeVBhcnNlTnVtZXJpY1N0cmluZygpCi0JCXsKLQkJCWRvdWJsZSByZXN1bHQ7Ci0JCQlvYmplY3QgbnVtZXJpY1N0cmluZyA9IG51bGw7Ci0JCQlkb3VibGUgZXhwZWN0ZWQgPSAwOwotCQkJQXNzZXJ0LklzRmFsc2UoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCWV4cGVjdGVkID0gMTQ0Mi4wOwotCQkJbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJlIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAxLjQ0MkUrMDAzCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImYwIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAxNDQyCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImYyIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAxNDQyLjAwCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoIm4iLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDEsNDQyLjAKLQkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCWV4cGVjdGVkID0gLTAuMDA1MjY7Ci0JCQludW1lcmljU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImUiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIC01LjI2RS0wMDMKLQkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VOdW1lcmljU3RyaW5nKG51bWVyaWNTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCW51bWVyaWNTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZjAiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIC0wCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoMC4wLCByZXN1bHQpOwotCQkJbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJmMyIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gLTAuMDA1Ci0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoLTAuMDA1LCByZXN1bHQpOwotCQkJbnVtZXJpY1N0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJuNiIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gLTAuMDA1MjYwCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlTnVtZXJpY1N0cmluZyhudW1lcmljU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCX0KLQkJCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBUcnlQYXJzZURhdGVTdHJpbmcoKQotCQl7Ci0JCQlEYXRlVGltZSByZXN1bHQ7Ci0JCQlvYmplY3QgZGF0ZVN0cmluZyA9IG51bGw7Ci0JCQlEYXRlVGltZSBleHBlY3RlZCA9IERhdGVUaW1lLk1pblZhbHVlOwotCQkJQXNzZXJ0LklzRmFsc2UoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCWV4cGVjdGVkID0gbmV3IERhdGVUaW1lKDIwMTMsIDEsIDE1KTsKLQkJCWRhdGVTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiZCIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gMS8xNS8yMDEzCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlRGF0ZVN0cmluZyhkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCQlkYXRlU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoIkQiLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIFR1ZXNkYXksIEphbnVhcnkgMTUsIDIwMTMKLQkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCWRhdGVTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiRiIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gVHVlc2RheSwgSmFudWFyeSAxNSwgMjAxMyAxMjowMDowMCBBTQotCQkJQXNzZXJ0LklzVHJ1ZShDb252ZXJ0VXRpbC5UcnlQYXJzZURhdGVTdHJpbmcoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCkpOwotCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCByZXN1bHQpOwotCQkJZGF0ZVN0cmluZyA9IGV4cGVjdGVkLlRvU3RyaW5nKCJnIiwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUpOyAvLyAxLzE1LzIwMTMgMTI6MDAgQU0KLQkJCUFzc2VydC5Jc1RydWUoQ29udmVydFV0aWwuVHJ5UGFyc2VEYXRlU3RyaW5nKGRhdGVTdHJpbmcsIG91dCByZXN1bHQpKTsKLQkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcmVzdWx0KTsKLQkJCWV4cGVjdGVkID0gbmV3IERhdGVUaW1lKDIwMTMsIDEsIDE1LCAxNSwgMjYsIDMyKTsKLQkJCWRhdGVTdHJpbmcgPSBleHBlY3RlZC5Ub1N0cmluZygiRiIsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlKTsgLy8gVHVlc2RheSwgSmFudWFyeSAxNSwgMjAxMyAzOjI2OjMyIFBNCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlRGF0ZVN0cmluZyhkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCk7Ci0JCQlkYXRlU3RyaW5nID0gZXhwZWN0ZWQuVG9TdHJpbmcoImciLCBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZSk7IC8vIDEvMTUvMjAxMyAzOjI2IFBNCi0JCQlBc3NlcnQuSXNUcnVlKENvbnZlcnRVdGlsLlRyeVBhcnNlRGF0ZVN0cmluZyhkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KSk7Ci0JCQlBc3NlcnQuQXJlRXF1YWwobmV3IERhdGVUaW1lKDIwMTMsIDEsIDE1LCAxNSwgMjYsIDApLCByZXN1bHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9VdGlscy9HdWFyZGluZ1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9VdGlscy9HdWFyZGluZ1Rlc3RzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTY3Zjk5Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvVXRpbHMvR3VhcmRpbmdUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuVXRpbHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBHdWFyZGluZ1Rlc3RzCi0gICAgewotICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RDbGFzcwotICAgICAgICB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnROdWxsRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVfSXNOb3ROdWxsX1Nob3VsZFRocm93SWZBcmd1bWVudElzTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RDbGFzcyBvYmogPSBudWxsOwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChvYmopLklzTm90TnVsbCgidGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVfSXNOb3ROdWxsX1Nob3VsZE5vdFRocm93SWZBcmd1bWVudElzQW5JbnN0YW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBvYmogPSBuZXcgVGVzdENsYXNzKCk7Ci0gICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KG9iaikuSXNOb3ROdWxsKCJ0ZXN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50TnVsbEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzTm90TnVsbE9yRW1wdHlfU2hvdWxkVGhyb3dJZlN0cmluZ0lzTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBhcmcgPSBudWxsOwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhcmcpLklzTm90TnVsbE9yRW1wdHkoInRlc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZXF1aXJlX0lzTm90TnVsbE9yRW1wdHlfU2hvdWxkTm90VGhyb3dJZlN0cmluZ0lzTm90TnVsbE9yRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgYXJnID0gInRlc3QiOwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhcmcpLklzTm90TnVsbE9yRW1wdHkoInRlc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kLCBFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVfSXNJblJhbmdlX1Nob3VsZFRocm93SWZBcmd1bWVudElzT3V0T2ZSYW5nZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhcmcgPSAzOwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhcmcpLklzSW5SYW5nZSg1LCA3LCAidGVzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcXVpcmVfSXNJblJhbmdlX1Nob3VsZE5vdFRocm93SWZBcmd1bWVudElzSW5SYW5nZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhcmcgPSA2OwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhcmcpLklzSW5SYW5nZSg1LCA3LCAidGVzdCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9VdGlscy9TcVJlZlV0aWxpdHlUZXN0cy5jcyBiL0VQUGx1c1Rlc3QvVXRpbHMvU3FSZWZVdGlsaXR5VGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MmY5OGUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9VdGlscy9TcVJlZlV0aWxpdHlUZXN0cy5jcworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QuVXRpbHMKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBTcVJlZlV0aWxpdHlUZXN0cwotICAgIHsKLSAgICAgICAgW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudE51bGxFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X1RvU3FSZWZBZGRyZXNzX1Nob3VsZFRocm93SWZBZGRyZXNzSXNOdWxsT3JFbXB0eSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNxUmVmVXRpbGl0eS5Ub1NxUmVmQWRkcmVzcyhudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTcVJlZlV0aWxpdHlfVG9TcVJlZkFkZHJlc3NfU2hvdWxkUmVtb3ZlQ29tbWFzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiQTEsIEEyOkEzIjsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEgQTI6QTMiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X1RvU3FSZWZBZGRyZXNzX1Nob3VsZFJlbW92ZUNvbW1hc0FuZEluc2VydFNwYWNlSWZOZWNlc2FyeSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkExLEEyOkEzIjsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKGFkZHJlc3MpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQTEgQTI6QTMiLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNxUmVmVXRpbGl0eV9Ub1NxUmVmQWRkcmVzc19TaG91bGRSZW1vdmVNdWx0aXBsZVNwYWNlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gIkExLCAgICAgICAgQTI6QTMiOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBTcVJlZlV0aWxpdHkuVG9TcVJlZkFkZHJlc3MoYWRkcmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJBMSBBMjpBMyIsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU3FSZWZVdGlsaXR5X0Zyb21TcVJlZkFkZHJlc3NfU2hvdWxkUmVwbGFjZVNwYWNlV2l0aENvbW1hKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQXJyYW5nZQotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSAiQTEgQTIiOwotCi0gICAgICAgICAgICAvLyBBY3QKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBTcVJlZlV0aWxpdHkuRnJvbVNxUmVmQWRkcmVzcyhhZGRyZXNzKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkExLEEyIiwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvVkJBLmNzIGIvRVBQbHVzVGVzdC9WQkEuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzEyNjUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9WQkEuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHk7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlZCQTsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBWQkEKLSAgICB7Ci0jaWYgIU1PTk8KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbXByZXNzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9Db21wcmVzc2lvbi9EZWNvbXByZXNzaW9uCi0gICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSAiI2FhYWJjZGVmYWFhYWdoaWphYWFhYWtsYWFhbW5vcHFhYWFhYWFhYWFhYWFyc3R1dnd4eXphYWEiOwotCi0gICAgICAgICAgICBieXRlW10gY29tcFZhbHVlID0gQ29tcG91bmREb2N1bWVudC5Db21wcmVzc1BhcnQoRW5jb2RpbmcuR2V0RW5jb2RpbmcoMTI1MikuR2V0Qnl0ZXModmFsdWUpKTsKLSAgICAgICAgICAgIHN0cmluZyBkZWNvbXBWYWx1ZSA9IEVuY29kaW5nLkdldEVuY29kaW5nKDEyNTIpLkdldFN0cmluZyhDb21wb3VuZERvY3VtZW50LkRlY29tcHJlc3NQYXJ0KGNvbXBWYWx1ZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBkZWNvbXBWYWx1ZSk7Ci0KLSAgICAgICAgICAgIHZhbHVlID0gImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiOwotCi0gICAgICAgICAgICBjb21wVmFsdWUgPSBDb21wb3VuZERvY3VtZW50LkNvbXByZXNzUGFydChFbmNvZGluZy5HZXRFbmNvZGluZygxMjUyKS5HZXRCeXRlcyh2YWx1ZSkpOwotICAgICAgICAgICAgZGVjb21wVmFsdWUgPSBFbmNvZGluZy5HZXRFbmNvZGluZygxMjUyKS5HZXRTdHJpbmcoQ29tcG91bmREb2N1bWVudC5EZWNvbXByZXNzUGFydChjb21wVmFsdWUpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgZGVjb21wVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRWQkEoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxyZXBvcnQueGxzbSIpKTsKLSAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KEAiYzpcdGVtcFx2YmFcbW9kdWxlc1xkaXIudHh0IiwgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkNvZGVQYWdlICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkNvbnN0YW50cyArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5EZXNjcmlwdGlvbiArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5IZWxwQ29udGV4dElELlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuSGVscEZpbGUxICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkhlbHBGaWxlMiArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5MY2lkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTGNpZEludm9rZS5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkxpYkZsYWdzLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTWFqb3JWZXJzaW9uLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTWlub3JWZXJzaW9uLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTmFtZSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm9qZWN0SUQgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuU3lzdGVtS2luZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uSG9zdFByb3RlY3RlZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uVXNlclByb3RlY3RlZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uVmJlUHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5WaXNpYmlsaXR5U3RhdGUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbW9kdWxlIGluIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHN0cmluZy5Gb3JtYXQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXHswfS50eHQiLCBtb2R1bGUuTmFtZSksIG1vZHVsZS5Db2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5SZWZlcmVuY2VzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHN0cmluZy5Gb3JtYXQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXHswfS50eHQiLCByLk5hbWUpLCByLkxpYmlkICsgIiAiICsgci5SZWZlcmVuY2VSZWNvcmRJRC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxYNTA5Q2VydGlmaWNhdGUyPiByZXQgPSBuZXcgTGlzdDxYNTA5Q2VydGlmaWNhdGUyPigpOwotICAgICAgICAgICAgWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKLSAgICAgICAgICAgIHN0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TaWduYXR1cmUuQ2VydGlmaWNhdGUgPSBzdG9yZS5DZXJ0aWZpY2F0ZXNbMTldOwotICAgICAgICAgICAgLy9wYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiIik7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYVNhdmVkLnhsc20iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVkJBKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTaGVldDEiKTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOwotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXNbIlNoZWV0MSJdLkNvZGUgKz0gIlxyXG5Qcml2YXRlIFN1YiBXb3Jrc2hlZXRfU2VsZWN0aW9uQ2hhbmdlKEJ5VmFsIFRhcmdldCBBcyBSYW5nZSlcclxuTXNnQm94KFwiVGVzdCBvZiB0aGUgVkJBIEZlYXR1cmUhXCIpXHJcbkVuZCBTdWJcclxuIjsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzWyJTaGVldDEiXS5OYW1lID0gIkJsYWQxIjsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ29kZU1vZHVsZS5OYW1lID0gIkRlbkjDpHJBcmJldHNib2tlbiI7Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uTmFtZSA9ICJGaXJzdFNoZWV0IjsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ29kZU1vZHVsZS5Db2RlICs9ICJcclxuUHJpdmF0ZSBTdWIgV29ya2Jvb2tfT3BlbigpXHJcbkJsYWQxLkNlbGxzKDEsMSkuVmFsdWUgPSBcIlZCQSB0ZXN0XCJcclxuTXNnQm94IFwiVkJBIGlzIHJ1bm5pbmchXCJcclxuRW5kIFN1YiI7Ci0gICAgICAgICAgICAvL1g1MDlTdG9yZSBzdG9yZSA9IG5ldyBYNTA5U3RvcmUoU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7Ci0gICAgICAgICAgICAvL3N0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsKLSAgICAgICAgICAgIC8vcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1sxMV07Ci0KLSAgICAgICAgICAgIHZhciBtID0gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJNb2R1bGUxIik7Ci0gICAgICAgICAgICBtLkNvZGUgKz0gIlB1YmxpYyBTdWIgVGVzdChwYXJhbTEgYXMgc3RyaW5nKVxyXG5cclxuRW5kIHN1YlxyXG5QdWJsaWMgRnVuY3Rpb24gZnVuY3Rlc3QoKSBBcyBTdHJpbmdcclxuXHJcbkVuZCBGdW5jdGlvblxyXG4iOwotICAgICAgICAgICAgdmFyIGMgPSBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGRDbGFzcygiQ2xhc3MxIiwgZmFsc2UpOwotICAgICAgICAgICAgYy5Db2RlICs9ICJQcml2YXRlIFN1YiBDbGFzc19Jbml0aWFsaXplKClcclxuXHJcbkVuZCBTdWJcclxuUHJpdmF0ZSBTdWIgQ2xhc3NfVGVybWluYXRlKClcclxuXHJcbkVuZCBTdWIiOwotICAgICAgICAgICAgdmFyIGMyID0gcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkQ2xhc3MoIkNsYXNzMiIsIHRydWUpOwotICAgICAgICAgICAgYzIuQ29kZSArPSAiUHJpdmF0ZSBTdWIgQ2xhc3NfSW5pdGlhbGl6ZSgpXHJcblxyXG5FbmQgU3ViXHJcblByaXZhdGUgU3ViIENsYXNzX1Rlcm1pbmF0ZSgpXHJcblxyXG5FbmQgU3ViIjsKLQotICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoIkVQUGx1cyIpOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx2YmFXcml0ZS54bHNtIikpOwotCi0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlc2lnbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYVdyaXRlLnhsc20iKSk7Ci0gICAgICAgICAgICAvL3BhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TaWduYXR1cmUuQ2VydGlmaWNhdGUgPSBzdG9yZS5DZXJ0aWZpY2F0ZXNbMTFdOwotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx2YmFXcml0ZTIueGxzbSIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVMb25nVkJBTW9kdWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWQkFTZXREYXRhIik7Ci0gICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNyZWF0ZVZCQVByb2plY3QoKTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suQ29kZU1vZHVsZS5Db2RlID0gIlByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKVxyXG5DcmVhdGVEYXRhXHJcbkVuZCBTdWIiOwotICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzLkFkZE1vZHVsZSgiQ29kZSIpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGNvZGUgPSBuZXcgU3RyaW5nQnVpbGRlcigiUHVibGljIFN1YiBDcmVhdGVEYXRhKClcclxuIik7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCAzMDsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMTsgY29sIDwgMzA7IGNvbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZS5BcHBlbmRMaW5lKHN0cmluZy5Gb3JtYXQoIlZCQVNldERhdGEuQ2VsbHMoezB9LHsxfSkuVmFsdWU9XCJDZWxsIHsyfVwiIiwgcm93LCBjb2wsIG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJvdywgY29sLCByb3csIGNvbCkuQWRkcmVzcykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGUuQXBwZW5kTGluZSgiRW5kIFN1YiIpOwotICAgICAgICAgICAgbW9kdWxlLkNvZGUgPSBjb2RlLlRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIC8vWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKLSAgICAgICAgICAgIC8vc3RvcmUuT3BlbihPcGVuRmxhZ3MuUmVhZE9ubHkpOwotICAgICAgICAgICAgLy9wYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuU2lnbmF0dXJlLkNlcnRpZmljYXRlID0gc3RvcmUuQ2VydGlmaWNhdGVzWzE5XTsKLQotICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx2YmFMb25nLnhsc20iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0gICAgICAgIAotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVmJhRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBEaXJlY3RvcnlJbmZvIHdvcmtpbmdEaXIgPSBuZXcgRGlyZWN0b3J5SW5mbyhAIkM6XGVwcGx1c0V4YW1wbGVcZm9sZGVyIik7Ci0gICAgICAgICAgICBpZiAoIXdvcmtpbmdEaXIuRXhpc3RzKSB3b3JraW5nRGlyLkNyZWF0ZSgpOwotICAgICAgICAgICAgRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyh3b3JraW5nRGlyLkZ1bGxOYW1lICsgIi8vIiArICJ0ZW1wLnhsc3giKTsKLSAgICAgICAgICAgIGlmIChmLkV4aXN0cykgZi5EZWxldGUoKTsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBteVBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKGYpOwotICAgICAgICAgICAgbXlQYWNrYWdlLldvcmtib29rLkNyZWF0ZVZCQVByb2plY3QoKTsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IGV4Y2VsV29ya3NoZWV0ID0gbXlQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTaGVldDEiKTsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IGV4Y2VsV29ya3NoZWV0MiA9IG15UGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2hlZXQyIik7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBleGNlbFdvcmtzaGVldDMgPSBteVBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MyIpOwotICAgICAgICAgICAgRmlsZUluZm8gZjIgPSBuZXcgRmlsZUluZm8od29ya2luZ0Rpci5GdWxsTmFtZSArICIvLyIgKyAibmV3ZmlsZS54bHNtIik7Ci0gICAgICAgICAgICBFeGNlbFZCQU1vZHVsZSBleGNlbFZiYU1vZHVsZSA9IG15UGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJNb2R1bGUxIik7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG15YnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7IG15YnVpbGRlci5BcHBlbmRMaW5lKCJTdWIgSmltaW55KCkiKTsKLSAgICAgICAgICAgIG15YnVpbGRlci5BcHBlbmRMaW5lKCJSYW5nZShcIkQ2XCIpLlNlbGVjdCIpOwotICAgICAgICAgICAgbXlidWlsZGVyLkFwcGVuZExpbmUoIkFjdGl2ZUNlbGwuRm9ybXVsYVIxQzEgPSBcIkppbWlueVwiIik7Ci0gICAgICAgICAgICBteWJ1aWxkZXIuQXBwZW5kTGluZSgiRW5kIFN1YiIpOwotICAgICAgICAgICAgZXhjZWxWYmFNb2R1bGUuQ29kZSA9IG15YnVpbGRlci5Ub1N0cmluZygpOwotICAgICAgICAgICAgbXlQYWNrYWdlLlNhdmVBcyhmMik7Ci0gICAgICAgICAgICBteVBhY2thZ2UuRGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkVkJBVW5pY29kZVdzTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xWYmFVbmljb2RlV1MueGxzbSIpKTsKLSAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KEAiYzpcdGVtcFx2YmFcbW9kdWxlc1xkaXIudHh0IiwgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkNvZGVQYWdlICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkNvbnN0YW50cyArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5EZXNjcmlwdGlvbiArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5IZWxwQ29udGV4dElELlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuSGVscEZpbGUxICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkhlbHBGaWxlMiArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5MY2lkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTGNpZEludm9rZS5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LkxpYkZsYWdzLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTWFqb3JWZXJzaW9uLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTWlub3JWZXJzaW9uLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuTmFtZSArICIsIiArIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Qcm9qZWN0SUQgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuU3lzdGVtS2luZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uSG9zdFByb3RlY3RlZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uVXNlclByb3RlY3RlZC5Ub1N0cmluZygpICsgIiwiICsgcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0LlByb3RlY3Rpb24uVmJlUHJvdGVjdGVkLlRvU3RyaW5nKCkgKyAiLCIgKyBwYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5WaXNpYmlsaXR5U3RhdGUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbW9kdWxlIGluIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHN0cmluZy5Gb3JtYXQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXHswfS50eHQiLCBtb2R1bGUuTmFtZSksIG1vZHVsZS5Db2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5SZWZlcmVuY2VzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KHN0cmluZy5Gb3JtYXQoQCJjOlx0ZW1wXHZiYVxtb2R1bGVzXHswfS50eHQiLCByLk5hbWUpLCByLkxpYmlkICsgIiAiICsgci5SZWZlcmVuY2VSZWNvcmRJRC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxYNTA5Q2VydGlmaWNhdGUyPiByZXQgPSBuZXcgTGlzdDxYNTA5Q2VydGlmaWNhdGUyPigpOwotICAgICAgICAgICAgWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKLSAgICAgICAgICAgIHN0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsKLSAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5TaWduYXR1cmUuQ2VydGlmaWNhdGUgPSBzdG9yZS5DZXJ0aWZpY2F0ZXNbMTldOwotICAgICAgICAgICAgLy9wYWNrYWdlLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiIik7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHZiYVNhdmVkLnhsc20iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVVuaWNvZGVXc05hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9FeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUZXN0Iik7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgi5rWL6K+VIik7Ci0KLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNyZWF0ZVZCQVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIlN1YiBHZXREYXRhKCkiKTsKLSAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJNc2dCb3ggKFwiSGVsbG8sV29ybGRcIikiKTsKLSAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJFbmQgU3ViIik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0MiA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNoZWV0MSIpOwotICAgICAgICAgICAgICAgIHZhciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZExpbmUoIlByaXZhdGUgU3ViIFdvcmtzaGVldF9DaGFuZ2UoQnlWYWwgVGFyZ2V0IEFzIFJhbmdlKSIpOwotICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kTGluZSgiR2V0RGF0YSIpOwotICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kTGluZSgiRW5kIFN1YiIpOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2RlTW9kdWxlLkNvZGUgPSBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGludnZiYS54bHNtIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vSXNzdWUgd2l0aCBjaHVuayBvdmVyd3JpdGluZyA0MDk2IGJ5dGVzCi0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWYmFCdWcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAoIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xvdXRmaWxlLnhsc20iKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUocGFja2FnZS5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUuTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV0uQ29kZU1vZHVsZS5Db2RlID0gIlByaXZhdGUgU3ViIFdvcmtzaGVldF9TZWxlY3Rpb25DaGFuZ2UoQnlWYWwgVGFyZ2V0IEFzIFJhbmdlKVxyXG5cclxuRW5kIFN1YiI7Ci0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdENvcHkiLHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1sxXSk7Ci0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcb3V0ZmlsZTIueGxzbSIpKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVjb21wcmVzc2lvbkNodW5rR3JlYXRlclRoYW40aygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB0ZXN0IGZvciBJc3N1ZSAxNTAyNjogVkJBIGRlY29tcHJlc3Npb24gZW5jb3VudGVycyBpbmRleCBvdXQgb2YgcmFuZ2UKLSAgICAgICAgICAgIC8vIG9uIHRoZSBkZWNvbXByZXNzaW9uIGJ1ZmZlci4KLSAgICAgICAgICAgIHZhciB3b3JrYm9va0RpciA9IFBhdGguQ29tYmluZShBcHBEb21haW4uQ3VycmVudERvbWFpbi5CYXNlRGlyZWN0b3J5LCBAIi4uXC4uXHdvcmtib29rcyIpOwotICAgICAgICAgICAgdmFyIHBhdGggPSBQYXRoLkNvbWJpbmUod29ya2Jvb2tEaXIsICJWQkFEZWNvbXByZXNzQnVnLnhsc20iKTsKLSAgICAgICAgICAgIHZhciBmID0gbmV3IEZpbGVJbmZvKHBhdGgpOwotICAgICAgICAgICAgaWYgKGYuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBSZWFkaW5nIHRoZSBXb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUgd2lsbCBjYXVzZSBhbiBJbmRleE91dE9mUmFuZ2UgaWYgdGhlIHByb2JsZW0gaGFzbid0IGJlZW4gZml4ZWQuCi0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocGFja2FnZS5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUuTGVuZ3RoID4gMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvV29ya1NoZWV0LmNzIGIvRVBQbHVzVGVzdC9Xb3JrU2hlZXQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTVjODQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Xb3JrU2hlZXQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg0ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgU3lzdGVtLkRhdGE7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEVQUGx1c1Rlc3QKLXsKLSAgICBbVGVzdENsYXNzXQotICAgIHB1YmxpYyBjbGFzcyBXb3JrU2hlZXRUZXN0IDogVGVzdEJhc2UKLSAgICB7Ci0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSdW5Xb3Jrc2hlZXRUZXN0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluc2VydERlbGV0ZVRlc3RSb3dzKCk7Ci0gICAgICAgICAgICBJbnNlcnREZWxldGVUZXN0Q29sdW1ucygpOwotICAgICAgICAgICAgTG9hZERhdGEoKTsKLSAgICAgICAgICAgIFN0eWxlRmlsbCgpOwotICAgICAgICAgICAgUGVyZm9ybWFuY2UoKTsKLSAgICAgICAgICAgIFJpY2hUZXh0Q2VsbHMoKTsKLSAgICAgICAgICAgIFRlc3RDb21tZW50cygpOwotICAgICAgICAgICAgSHlwZXJsaW5rKCk7Ci0gICAgICAgICAgICBQaWN0dXJlVVJMKCk7Ci0gICAgICAgICAgICBDb3B5T3ZlcndyaXRlKCk7Ci0gICAgICAgICAgICBIaWRlVGVzdCgpOwotICAgICAgICAgICAgVmVyeUhpZGVUZXN0KCk7Ci0gICAgICAgICAgICBQcmludGVyU2V0dGluZ3MoKTsKLSAgICAgICAgICAgIEFkZHJlc3MoKTsKLSAgICAgICAgICAgIE1lcmdlKCk7Ci0gICAgICAgICAgICBFbmNvZGluZygpOwotICAgICAgICAgICAgTG9hZFRleHQoKTsKLSAgICAgICAgICAgIExvYWREYXRhUmVhZGVyKCk7Ci0gICAgICAgICAgICBMb2FkRGF0YVRhYmxlKCk7Ci0gICAgICAgICAgICBMb2FkRnJvbUNvbGxlY3Rpb25UZXN0KCk7Ci0gICAgICAgICAgICBMb2FkRnJvbUVtcHR5Q29sbGVjdGlvblRlc3QoKTsKLSAgICAgICAgICAgIExvYWRBcnJheSgpOwotICAgICAgICAgICAgV29ya3NoZWV0Q29weSgpOwotICAgICAgICAgICAgRGVmYXVsdENvbFdpZHRoKCk7Ci0gICAgICAgICAgICBDb3B5VGFibGUoKTsKLSAgICAgICAgICAgIEF1dG9GaXRDb2x1bW5zKCk7Ci0gICAgICAgICAgICBDb3B5UmFuZ2UoKTsKLSAgICAgICAgICAgIENvcHlNZXJnZWRSYW5nZSgpOwotICAgICAgICAgICAgVmFsdWVFcnJvcigpOwotICAgICAgICAgICAgRm9ybXVsYU92ZXJ3cml0ZSgpOwotICAgICAgICAgICAgRm9ybXVsYUVycm9yKCk7Ci0gICAgICAgICAgICBTdHlsZU5hbWVUZXN0KCk7Ci0gICAgICAgICAgICBOYW1lZFN0eWxlcygpOwotICAgICAgICAgICAgVGFibGVUZXN0KCk7Ci0gICAgICAgICAgICBEZWZpbmVkTmFtZSgpOwotICAgICAgICAgICAgQ3JlYXRlUGl2b3RUYWJsZSgpOwotICAgICAgICAgICAgQWRkQ2hhcnRTaGVldCgpOwotICAgICAgICAgICAgU2V0SGVhZGVyRm9vdGVySW1hZ2UoKTsKLQotICAgICAgICAgICAgU2F2ZVdvcmtzaGVldCgiV29ya3NoZWV0Lnhsc3giKTsKLQotICAgICAgICAgICAgUmVhZFdvcmtTaGVldCgpOwotICAgICAgICAgICAgUmVhZFN0cmVhbVNhdmVBc1N0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZENoYXJ0U2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY2hhcnQgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkQ2hhcnQoIkNoYXJ0U2hlZXQiLCBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgX24gaW4gX3Bjay5Xb3JrYm9vay5OYW1lcykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9JdGVyYXRlIGFsbCBjb2xsZWN0aW9uIGFuZCBtYWtlIHN1cmUgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3b3Jrc2hlZXQgaW4gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghKHdvcmtzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gd29ya3NoZWV0LkRyYXdpbmdzKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiB3b3Jrc2hlZXQuVGFibGVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiB3b3Jrc2hlZXQuUGl2b3RUYWJsZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkIGluIHdvcmtzaGVldC5OYW1lcykKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gd29ya3NoZWV0LkNvbW1lbnRzKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZCBpbiB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRXb3JrU2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlU3RyZWFtIGluc3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oX3dvcmtzaGVldFBhdGggKyBAIldvcmtzaGVldC54bHN4IiwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGluc3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUGVyZiJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siSDYiXS5Gb3JtdWxhLCAiQjUrQjYiKTsKLQotICAgICAgICAgICAgICAgIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbIkNvbW1lbnQiXTsKLSAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHdzLkNlbGxzWyJCMiJdLkNvbW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwoY29tbWVudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGNvbW1lbnQuQXV0aG9yLCAiSmFuIEvDpGxsbWFuIik7Ci0gICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siSGlkZGVuIl07Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsPGVXb3JrU2hlZXRIaWRkZW4+KHdzLkhpZGRlbiwgZVdvcmtTaGVldEhpZGRlbi5IaWRkZW4pOwotCi0gICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siVmVyeUhpZGRlbiJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbDxlV29ya1NoZWV0SGlkZGVuPih3cy5IaWRkZW4sIGVXb3JrU2hlZXRIaWRkZW4uVmVyeUhpZGRlbik7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJSaWNoVGV4dCJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiUm9vbSAwMiAmIDAzIiwgd3MuQ2VsbHNbIkcxIl0uUmljaFRleHQuVGV4dCk7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJIZWFkZXJJbWFnZSJdOwotICAgICAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHdzLkhlYWRlckZvb3Rlci5QaWN0dXJlcy5Db3VudCwgMyk7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJuZXdzaGVldCJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siRjIiXS5TdHlsZS5Gb250LlVuZGVyTGluZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJGMiJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSwgRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJGMyJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSwgRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZUFjY291bnRpbmcpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5DZWxsc1siRjUiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUsIEV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuQ2VsbHNbIkY1Il0uU3R5bGUuRm9udC5VbmRlckxpbmUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc3RyZWFtLkNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRTdHJlYW1XaXRoVGVtcGxhdGVXb3JrU2hlZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlU3RyZWFtIGluc3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oX3dvcmtzaGVldFBhdGggKyBAIlxXb3Jrc2hlZXQueGxzeCIsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCk7Ci0gICAgICAgICAgICBNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKHN0cmVhbSwgaW5zdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJQZXJmIl07Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJINiJdLkZvcm11bGEsICJCNStCNiIpOwotCi0gICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sibmV3c2hlZXQiXTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwod3MuR2V0VmFsdWU8RGF0ZVRpbWU+KDIwLCAyMSksIG5ldyBEYXRlVGltZSgyMDEwLCAxLCAxKSk7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJMb2FkZWQgRGF0YVRhYmxlIl07Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlPHN0cmluZz4oMiwgMSksICJSb3cxIik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlPGludD4oMiwgMiksIDEpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5HZXRWYWx1ZTxib29sPigyLCAzKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkdldFZhbHVlPGRvdWJsZT4oMiwgNCksIDEuNSk7Ci0KLSAgICAgICAgICAgICAgICB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJSaWNoVGV4dCJdOwotCi0gICAgICAgICAgICAgICAgdmFyIHIxID0gd3MuQ2VsbHNbIkExIl0uUmljaFRleHRbMF07Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHIxLlRleHQsICJUZXN0Iik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHIxLkJvbGQsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1siUGljIFVSTCJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoKEV4Y2VsUGljdHVyZSl3cy5EcmF3aW5nc1siUGljIFVSSSJdKS5IeXBlcmxpbmssICJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbSIpOwotCi0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJBZGRyZXNzIl0uR2V0VmFsdWU8c3RyaW5nPig0MCwgMSksICJcYlx0Iik7Ci0KLSAgICAgICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAIlRlc3RcV29ya3NoZWV0Mi54bHN4IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zdHJlYW0uQ2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRTdHJlYW1TYXZlQXNTdHJlYW0oKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUZpbGUuRXhpc3RzKF93b3Jrc2hlZXRQYXRoICsgQCJXb3Jrc2hlZXQueGxzeCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5JbmNvbmNsdXNpdmUoIldvcmtzaGVldC54bHN4IGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZVN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKF93b3Jrc2hlZXRQYXRoICsgQCJXb3Jrc2hlZXQueGxzeCIsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKLSAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoaW5zdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJOYW1lcyJdOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh3cy5OYW1lc1siRnVsbENvbCJdLlN0YXJ0LlJvdywgMSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLk5hbWVzWyJGdWxsQ29sIl0uRW5kLlJvdywgRXhjZWxQYWNrYWdlLk1heFJvd3MpOwotICAgICAgICAgICAgICAgIHBjay5TYXZlQXMoc3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc3RyZWFtLkNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXMgeW91IHdyaXRlIHlvdXIgdGVzdHM6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIFVzZSBDbGFzc0luaXRpYWxpemUgdG8gcnVuIGNvZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGZpcnN0IHRlc3QgaW4gdGhlIGNsYXNzCi0gICAgICAgIC8vIFVzZSBDbGFzc0NsZWFudXAgdG8gcnVuIGNvZGUgYWZ0ZXIgYWxsIHRlc3RzIGluIGEgY2xhc3MgaGF2ZSBydW4KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgibmV3c2hlZXQiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJVMTkiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDA5LCAxMiwgMzEpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDEpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMiJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDMpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyMyJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDQpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUyNCJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDEsIDUpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIlUxOTpVMjQiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktbW0tZGQiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siVjE5Il0uVmFsdWUgPSAxMDA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIwIl0uVmFsdWUgPSAxMDI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIxIl0uVmFsdWUgPSAxMDE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIyIl0uVmFsdWUgPSAxMDM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjIzIl0uVmFsdWUgPSAxMDU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siVjI0Il0uVmFsdWUgPSAxMDQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1sidjE5OnYyNCJdLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuTGVmdDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJ2MTk6djI0Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9IEAiJCMsIyMwLjAwXyk7KCQjLCMjMC4wMCkiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siWDE5Il0uVmFsdWUgPSAyMTA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIwIl0uVmFsdWUgPSAyMTI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIxIl0uVmFsdWUgPSAyMjE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIyIl0uVmFsdWUgPSAxMjM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDIzIl0uVmFsdWUgPSAxMzU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siWDI0Il0uVmFsdWUgPSAxMzQ7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhdXRvZmlsdGVyCi0gICAgICAgICAgICB3cy5DZWxsc1siVTE5OlgyNCJdLkF1dG9GaWx0ZXIgPSB0cnVlOwotICAgICAgICAgICAgRXhjZWxQaWN0dXJlIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoIlBpYzEiLCBQcm9wZXJ0aWVzLlJlc291cmNlcy5UZXN0MSk7Ci0gICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oMTUwLCAxNDApOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTMwIl0uVmFsdWUgPSAiVGV4dCBvcmllbnRhdGlvbiA0NSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTMwIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gNDU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjMwIl0uVmFsdWUgPSAiVGV4dCBvcmllbnRhdGlvbiA5MCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjMwIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gOTA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzMwIl0uVmFsdWUgPSAiVGV4dCBvcmllbnRhdGlvbiAxODAiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkMzMCJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDE4MDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMzAiXS5WYWx1ZSA9ICJUZXh0IG9yaWVudGF0aW9uIDM4IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMzAiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAzODsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMzAiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkQzMCJdLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodDsKLQotICAgICAgICAgICAgd3MuV29ya2Jvb2suTmFtZXMuQWRkKCJUZXN0TmFtZSIsIHdzLkNlbGxzWyJCMzA6RTMwIl0pOwotICAgICAgICAgICAgd3MuV29ya2Jvb2suTmFtZXNbIlRlc3ROYW1lIl0uU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5SZWQpOwotCi0KLSAgICAgICAgICAgIHdzLldvcmtib29rLk5hbWVzWyJUZXN0TmFtZSJdLk9mZnNldCgxLCAwKS5WYWx1ZSA9ICJPZmZzZXQgdGVzdCAxIjsKLSAgICAgICAgICAgIHdzLldvcmtib29rLk5hbWVzWyJUZXN0TmFtZSJdLk9mZnNldCgyLCAtMSwgMiwgMikuVmFsdWUgPSAiT2Zmc2V0IHRlc3QgMiI7Ci0KLSAgICAgICAgICAgIC8vVGVzdCB2ZXJ0aWNhbCBhbGlnbgotICAgICAgICAgICAgd3MuQ2VsbHNbIkUxOSJdLlZhbHVlID0gIlN1YnNjcmlwdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRTE5Il0uU3R5bGUuRm9udC5WZXJ0aWNhbEFsaWduID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuU3Vic2NyaXB0OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMCJdLlZhbHVlID0gIlN1YnNjcmlwdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRTIwIl0uU3R5bGUuRm9udC5WZXJ0aWNhbEFsaWduID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuU3VwZXJzY3JpcHQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRTIxIl0uVmFsdWUgPSAiU3VwZXJzY3JpcHQiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMSJdLlN0eWxlLkZvbnQuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1cGVyc2NyaXB0OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMSJdLlN0eWxlLkZvbnQuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7Ci0KLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMiJdLlZhbHVlID0gIkluZGVudCAyIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJFMjIiXS5TdHlsZS5JbmRlbnQgPSAyOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMyJdLlZhbHVlID0gIlNocmluayB0byBmaXQiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUyMyJdLlN0eWxlLlNocmlua1RvRml0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbImUyNCJdLlZhbHVlID0gIlJlYWRpbmdPcmRlciBMZWZ0VG9SaWdodCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siZTI0Il0uU3R5bGUuUmVhZGluZ09yZGVyID0gRXhjZWxSZWFkaW5nT3JkZXIuTGVmdFRvUmlnaHQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1siZTI1Il0uVmFsdWUgPSAiUmVhZGluZ09yZGVyIFJpZ2h0VG9MZWZ0IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJlMjUiXS5TdHlsZS5SZWFkaW5nT3JkZXIgPSBFeGNlbFJlYWRpbmdPcmRlci5SaWdodFRvTGVmdDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJlMjYiXS5WYWx1ZSA9ICJSZWFkaW5nT3JkZXIgQ29udGV4dCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siZTI2Il0uU3R5bGUuUmVhZGluZ09yZGVyID0gRXhjZWxSZWFkaW5nT3JkZXIuQ29udGV4dERlcGVuZGVudDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJlMjciXS5WYWx1ZSA9ICJEZWZhdWx0IFJlYWRpbmdvcmRlciI7Ci0KLSAgICAgICAgICAgIC8vVW5kZXJsaW5lCi0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJGMTpGNyJdLlZhbHVlID0gIlVuZGVybGluZWQiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkYxIl0uU3R5bGUuRm9udC5VbmRlckxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJGMiJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5Eb3VibGU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRjMiXS5TdHlsZS5Gb250LlVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuU2luZ2xlQWNjb3VudGluZzsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJGNCJdLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5Eb3VibGVBY2NvdW50aW5nOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkY1Il0uU3R5bGUuRm9udC5VbmRlckxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRjY6RjciXS5TdHlsZS5Gb250LlVuZGVyTGluZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRjciXS5TdHlsZS5Gb250LlVuZGVyTGluZSA9IGZhbHNlOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siRTI0Il0uVmFsdWUgPSAwOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHdzLkNlbGxzWyJFMjQiXS5UZXh0LCAiMCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkY3Il0uU3R5bGUuRm9udC5VbmRlckxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZCgiU2hlZXROYW1lIiwgd3MuQ2VsbHNbIkExOkEyIl0pOwotICAgICAgICAgICAgd3MuVmlldy5GcmVlemVQYW5lcygzLCA1KTsKLQotICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxSYW5nZUJhc2UgY2VsbCBpbiB3cy5DZWxsc1siQTEiXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiQTEgaXMgbm90IHNldCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbFJhbmdlQmFzZSBjZWxsIGluIHdzLkNlbGxzW3dzLkRpbWVuc2lvbi5BZGRyZXNzXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWcuV3JpdGVMaW5lKGNlbGwuQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLy9MaW5xIHRlc3QKLSAgICAgICAgICAgIHZhciByZXMgPSBmcm9tIGMgaW4gd3MuQ2VsbHNbd3MuRGltZW5zaW9uLkFkZHJlc3NdIHdoZXJlIGMuVmFsdWUgIT0gbnVsbCAmJiBjLlZhbHVlLlRvU3RyaW5nKCkgPT0gIk9mZnNldCB0ZXN0IDEiIHNlbGVjdCBjOwotCi0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbFJhbmdlQmFzZSBjZWxsIGluIHJlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWcuV3JpdGVMaW5lKGNlbGwuQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5BdXRob3IgPSAiSmFuIEvDpGxsbWFuIjsKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5DYXRlZ29yeSA9ICJDYXRlZ29yeSI7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiQ29tbWVudHMiOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlIHdvcmtzIjsKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5LZXl3b3JkcyA9ICJLZXl3b3JkcyI7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiVGl0bGUiOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlN1YmplY3QgPSAiU3ViamVjdCI7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuU3RhdHVzID0gIlN0YXR1cyI7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuSHlwZXJsaW5rQmFzZSA9IG5ldyBVcmkoImh0dHA6Ly9zZXJ2ZXJzaWRlZXhjZWwuY29tIiwgVXJpS2luZC5BYnNvbHV0ZSk7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLlByb3BlcnRpZXMuTWFuYWdlciA9ICJNYW5hZ2VyIjsKLQotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkRhdGVUZXN0IiwgbmV3IERhdGVUaW1lKDIwMDgsIDEyLCAzMSkpOwotICAgICAgICAgICAgVGVzdENvbnRleHQuV3JpdGVMaW5lKF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5HZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJEYXRlVGVzdCIpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkF1dGhvciIsICJKYW4gS8OkbGxtYW4iKTsKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJDb3VudCIsIDEpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIklzVGVzdGVkIiwgZmFsc2UpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkxhcmdlTm8iLCAxMjM0NTY3ODkxMjMpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkF1dGhvciIsIDMpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGludCBQRVJGX1JPV1MgPSA1MDAwOwotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBlcmZvcm1hbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQZXJmIik7Ci0gICAgICAgICAgICBUZXN0Q29udGV4dC5Xcml0ZUxpbmUoIlN0YXJ0VGltZSB7MH0iLCBEYXRlVGltZS5Ob3cpOwotCi0gICAgICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IFBFUkZfUk9XUzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkNlbGxzW2ksIDFdLlZhbHVlID0gc3RyaW5nLkZvcm1hdCgiUm93IHswfVxuLlRlc3QgbmV3IHJvd1wiJyDDtsOkw6XDvCIsIGkpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzW2ksIDJdLlZhbHVlID0gaTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tpLCAyXS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbaSwgM10uVmFsdWUgPSBEYXRlVGltZS5Ob3c7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbaSwgNF0uVmFsdWUgPSByLk5leHREb3VibGUoKSAqIDEwMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdzLkNlbGxzWzEsIDIsIFBFUkZfUk9XUywgMl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCAzLCBQRVJGX1JPV1MsIDNdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAieXl5eS1NTS1kZCBISDptbTpzcyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCA0LCBQRVJGX1JPV1MsIDRdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAiOwotICAgICAgICAgICAgd3MuQ2VsbHNbUEVSRl9ST1dTICsgMSwgMl0uRm9ybXVsYSA9ICJTVU0oQjE6QiIgKyBQRVJGX1JPV1MuVG9TdHJpbmcoKSArICIpIjsKLSAgICAgICAgICAgIHdzLkNvbHVtbigxKS5XaWR0aCA9IDEyOwotICAgICAgICAgICAgd3MuQ29sdW1uKDIpLldpZHRoID0gODsKLSAgICAgICAgICAgIHdzLkNvbHVtbigzKS5XaWR0aCA9IDIwOwotICAgICAgICAgICAgd3MuQ29sdW1uKDQpLldpZHRoID0gMTQ7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDMSJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMjpBNSJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxLCAxKTsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdygxLCAxKTsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdygzLCAxKTsKLQotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDEwMDAsIDMsIHRydWUpOwotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIwMDAsIDEsIHRydWUpOwotCi0gICAgICAgICAgICB3cy5JbnNlcnRSb3coMjAwMSwgNCk7Ci0KLSAgICAgICAgICAgIHdzLkluc2VydFJvdygyMDEwLCAxLCAyMDEwKTsKLQotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDIwMDAwLCAyKTsKLQotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIwMDA1LCA0LCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vU2luZ2xlIGZvcm11bGEKLSAgICAgICAgICAgIHdzLkNlbGxzWyJIMyJdLkZvcm11bGEgPSAiQjIrQjMiOwotICAgICAgICAgICAgd3MuRGVsZXRlUm93KDIsIDEsIHRydWUpOwotCi0gICAgICAgICAgICAvL1NoYXJlZCBmb3JtdWxhCi0gICAgICAgICAgICB3cy5DZWxsc1siSDU6SDMwIl0uRm9ybXVsYSA9ICJCNCtCNSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siSDU6SDMwIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJfKFwiJFwiKiAjICMjMC4wMF8pO18oXCIkXCIqICgjICMjMC4wMCk7XyhcIiRcIiogXCItXCI/P18pO18oQF8pIjsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdyg3LCAzKTsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdygyLCAxKTsKLSAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygzMCwgMywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxNSwgMiwgdHJ1ZSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siYTE6QjEwMCJdLlN0eWxlLkxvY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgd3MuQ2VsbHNbImExOkIxMiJdLlN0eWxlLkhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICBUZXN0Q29udGV4dC5Xcml0ZUxpbmUoIkVuZFRpbWUgezB9IiwgRGF0ZVRpbWUuTm93KTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluc2VydERlbGV0ZVRlc3RSb3dzKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJJbnNlcnREZWxldGUiKTsKLSAgICAgICAgICAgIC8vd3MuQ2VsbHMuVmFsdWUgPSAwOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkM1Il0uVmFsdWUgPSAxOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgob2JqZWN0WyxdKXdzLkNlbGxzWyJBMTpDNSJdLlZhbHVlKVsxLCAxXSwgMSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6QjMiXS5NZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRDMiXS5Gb3JtdWxhID0gIkEyK0M1IjsKLSAgICAgICAgICAgIHdzLkluc2VydFJvdygyLCAxKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExMDpDMTUiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTExOkIxMyJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkRlbGV0ZVJvdygxMiwgMSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJhMTpCMTAwIl0uU3R5bGUuTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5DZWxsc1siYTE6QjEyIl0uU3R5bGUuSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uSXNQcm90ZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiUGFzc3dvcmQiKTsKLQotCi0gICAgICAgICAgICB2YXIgcmFuZ2UgPSB3cy5DZWxsc1siQjI6RDEwMCJdOwotCi0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gbnVsbDsKLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QcmludEFyZWEgPSB3cy5DZWxsc1siQjI6RDk5Il07Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gbnVsbDsKLSAgICAgICAgICAgIHdzLlJvdygxNSkuUGFnZUJyZWFrID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNvbHVtbigzKS5QYWdlQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgd3MuVmlldy5TaG93SGVhZGVycyA9IGZhbHNlOwotICAgICAgICAgICAgd3MuVmlldy5QYWdlQnJlYWtWaWV3ID0gdHJ1ZTsKLQotICAgICAgICAgICAgd3MuUm93KDIwMCkuSGVpZ2h0ID0gNTA7Ci0gICAgICAgICAgICB3cy5Xb3JrYm9vay5DYWxjTW9kZSA9IEV4Y2VsQ2FsY01vZGUuQXV0b21hdGljOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmFuZ2UuU3RhcnQuQ29sdW1uLCAyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYW5nZS5TdGFydC5Sb3csIDIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLlN0YXJ0LkFkZHJlc3MsICJCMiIpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmFuZ2UuRW5kLkNvbHVtbiwgNCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmFuZ2UuRW5kLlJvdywgMTAwKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYW5nZS5FbmQuQWRkcmVzcywgIkQxMDAiKTsKLQotICAgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzKCJCMTpEMyIpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoYWRkci5TdGFydC5Db2x1bW4sIDIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFkZHIuU3RhcnQuUm93LCAxKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChhZGRyLkVuZC5Db2x1bW4sIDQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGFkZHIuRW5kLlJvdywgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnREZWxldGVUZXN0Q29sdW1ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSW5zZXJ0RGVsZXRlQ29sdW1ucyIpOwotICAgICAgICAgICAgLy93cy5DZWxscy5WYWx1ZSA9IDA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6QzUiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKChvYmplY3RbLF0pd3MuQ2VsbHNbIkExOkM1Il0uVmFsdWUpWzEsIDFdLCAxKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpCMyJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMyJdLkZvcm11bGEgPSAiQTIrQzUiOwotICAgICAgICAgICAgd3MuSW5zZXJ0Q29sdW1uKDEsIDEpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSzEwOk0xNSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMTE6TDEzIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuRGVsZXRlQ29sdW1uKDEyLCAxKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIlgxOlkxMDAiXS5TdHlsZS5Mb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDMTpZMTIiXS5TdHlsZS5IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5Jc1Byb3RlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJQYXNzd29yZCIpOwotCi0KLSAgICAgICAgICAgIHZhciByYW5nZSA9IHdzLkNlbGxzWyJYMjpaMTAwIl07Ci0KLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QcmludEFyZWEgPSBudWxsOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlByaW50QXJlYSA9IHdzLkNlbGxzWyJYMjpaOTkiXTsKLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5QcmludEFyZWEgPSBudWxsOwotICAgICAgICAgICAgd3MuUm93KDE1KS5QYWdlQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ29sdW1uKDMpLlBhZ2VCcmVhayA9IHRydWU7Ci0gICAgICAgICAgICB3cy5WaWV3LlNob3dIZWFkZXJzID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5WaWV3LlBhZ2VCcmVha1ZpZXcgPSB0cnVlOwotCi0gICAgICAgICAgICB3cy5Sb3coMjAwKS5IZWlnaHQgPSA1MDsKLSAgICAgICAgICAgIHdzLldvcmtib29rLkNhbGNNb2RlID0gRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWM7Ci0KLSAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLlN0YXJ0LkNvbHVtbiwgMik7Ci0gICAgICAgICAgICAvL0Fzc2VydC5BcmVFcXVhbChyYW5nZS5TdGFydC5Sb3csIDIpOwotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwocmFuZ2UuU3RhcnQuQWRkcmVzcywgIkIyIik7Ci0KLSAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLkVuZC5Db2x1bW4sIDQpOwotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwocmFuZ2UuRW5kLlJvdywgMTAwKTsKLSAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKHJhbmdlLkVuZC5BZGRyZXNzLCAiRDEwMCIpOwotCi0gICAgICAgICAgICAvL0V4Y2VsQWRkcmVzcyBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcygiQjE6RDMiKTsKLQotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoYWRkci5TdGFydC5Db2x1bW4sIDIpOwotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoYWRkci5TdGFydC5Sb3csIDEpOwotICAgICAgICAgICAgLy9Bc3NlcnQuQXJlRXF1YWwoYWRkci5FbmQuQ29sdW1uLCA0KTsKLSAgICAgICAgICAgIC8vQXNzZXJ0LkFyZUVxdWFsKGFkZHIuRW5kLlJvdywgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSaWNoVGV4dENlbGxzKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJSaWNoVGV4dCIpOwotICAgICAgICAgICAgdmFyIHJzID0gd3MuQ2VsbHNbIkExIl0uUmljaFRleHQ7Ci0KLSAgICAgICAgICAgIHZhciByMSA9IHJzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgcjEuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICByMS5Db2xvciA9IENvbG9yLlBpbms7Ci0KLSAgICAgICAgICAgIHZhciByMiA9IHJzLkFkZCgiIG9mIik7Ci0gICAgICAgICAgICByMi5TaXplID0gMTQ7Ci0gICAgICAgICAgICByMi5JdGFsaWMgPSB0cnVlOwotCi0gICAgICAgICAgICB2YXIgcjMgPSBycy5BZGQoIiByaWNoIik7Ci0gICAgICAgICAgICByMy5Gb250TmFtZSA9ICJBcmlhbCI7Ci0gICAgICAgICAgICByMy5TaXplID0gMTg7Ci0gICAgICAgICAgICByMy5JdGFsaWMgPSB0cnVlOwotCi0gICAgICAgICAgICB2YXIgcjQgPSBycy5BZGQoInRleHQuIik7Ci0gICAgICAgICAgICByNC5TaXplID0gOC4yNWY7Ci0gICAgICAgICAgICByNC5JdGFsaWMgPSB0cnVlOwotICAgICAgICAgICAgcjQuVW5kZXJMaW5lID0gdHJ1ZTsKLQotICAgICAgICAgICAgcnMgPSB3cy5DZWxsc1siQTM6QTQiXS5SaWNoVGV4dDsKLQotICAgICAgICAgICAgdmFyIHI1ID0gcnMuQWRkKCJEb3VibGUiKTsKLSAgICAgICAgICAgIHI1LkNvbG9yID0gQ29sb3IuUGVhY2hQdWZmOwotICAgICAgICAgICAgcjUuRm9udE5hbWUgPSAidGltZXMgbmV3IHJvbWFuIjsKLSAgICAgICAgICAgIHI1LlNpemUgPSAxNjsKLQotICAgICAgICAgICAgdmFyIHI2ID0gcnMuQWRkKCIgY2VsbHMiKTsKLSAgICAgICAgICAgIHI2LkNvbG9yID0gQ29sb3IuUmVkOwotICAgICAgICAgICAgcjYuVW5kZXJMaW5lID0gdHJ1ZTsKLQotCi0gICAgICAgICAgICBycyA9IHdzLkNlbGxzWyJDOCJdLlJpY2hUZXh0OwotICAgICAgICAgICAgcjEgPSBycy5BZGQoIkJsdWUgIik7Ci0gICAgICAgICAgICByMS5Db2xvciA9IENvbG9yLkJsdWU7Ci0KLSAgICAgICAgICAgIHIyID0gcnMuQWRkKCJSZWQiKTsKLSAgICAgICAgICAgIHIyLkNvbG9yID0gQ29sb3IuUmVkOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siRzEiXS5SaWNoVGV4dC5BZGQoIlJvb20gMDIgJiAwMyIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkcyIl0uUmljaFRleHQuVGV4dCA9ICJSb29tIDAyICYgMDMiOwotCi0gICAgICAgICAgICB3cyA9IHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUmljaFRleHQyIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5SaWNoVGV4dC5UZXh0ID0gIlJvb20gMDIgJiAwMyI7Ci0gICAgICAgICAgICB3cy5UYWJDb2xvciA9IENvbG9yLlBvd2RlckJsdWU7Ci0KLSAgICAgICAgICAgIHIxID0gd3MuQ2VsbHNbIkczIl0uUmljaFRleHQuQWRkKCJUZXN0Iik7Ci0gICAgICAgICAgICByMS5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHMyJdLlJpY2hUZXh0LkFkZCgiIGEgbmV3IHQiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHMyJdLlJpY2hUZXh0WzFdLkJvbGQgPSBmYWxzZTsgOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdENvbW1lbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29tbWVudCIpOwotICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkMzIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbiIsICJKSyIpOwotICAgICAgICAgICAgY29tbWVudC5SaWNoVGV4dFswXS5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbW1lbnQuUmljaFRleHRbMF0uUHJlc2VydmVTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgcnQgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiVGVzdCBjb21tZW50Iik7Ci0gICAgICAgICAgICBjb21tZW50LlZlcnRpY2FsQWxpZ25tZW50ID0gZVRleHRBbGlnblZlcnRpY2FsVm1sLkNlbnRlcjsKLSAgICAgICAgICAgIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkEyIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbjEiLCAiSksiKTsKLQotICAgICAgICAgICAgY29tbWVudCA9IHdzLkNvbW1lbnRzLkFkZCh3cy5DZWxsc1siQTEiXSwgIkphbiBLw6RsbG1hblxyXG5BdXRob3JcclxuMiIsICJKSyIpOwotICAgICAgICAgICAgY29tbWVudC5BbHRlcm5hdGl2ZVRleHQgPSAiVGVzdCBvZiBBbHRlcm5ldGl2ZVRleHQyIjsKLSAgICAgICAgICAgIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkMyIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbjMiLCAiSksiKTsKLSAgICAgICAgICAgIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkMxIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbjUiLCAiSksiKTsKLSAgICAgICAgICAgIGNvbW1lbnQgPSB3cy5Db21tZW50cy5BZGQod3MuQ2VsbHNbIkIxIl0sICJKYW4gS8OkbGxtYW5cclxuQXV0aG9yXHJcbjciLCAiSksiKTsKLQotICAgICAgICAgICAgd3MuQ29tbWVudHMuUmVtb3ZlKHdzLkNlbGxzWyJBMiJdLkNvbW1lbnQpOwotICAgICAgICAgICAgLy9jb21tZW50Lkhvcml6b250YWxBbGlnbm1lbnQgPSBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbC5DZW50ZXI7Ci0gICAgICAgICAgICAvL2NvbW1lbnQuVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAvL2NvbW1lbnQuQmFja2dyb3VuZENvbG9yID0gQ29sb3IuR3JlZW47Ci0gICAgICAgICAgICAvL2NvbW1lbnQuVG8uUm93ICs9IDQ7Ci0gICAgICAgICAgICAvL2NvbW1lbnQuVG8uQ29sdW1uICs9IDI7Ci0gICAgICAgICAgICAvL2NvbW1lbnQuTGluZVN0eWxlID0gZUxpbmVTdHlsZVZtbC5Mb25nRGFzaDsKLSAgICAgICAgICAgIC8vY29tbWVudC5MaW5lQ29sb3IgPSBDb2xvci5SZWQ7Ci0gICAgICAgICAgICAvL2NvbW1lbnQuTGluZVdpZHRoID0gKFNpbmdsZSkyLjU7Ci0gICAgICAgICAgICAvL3J0LkNvbG9yID0gQ29sb3IuUmVkOwotCi0gICAgICAgICAgICB2YXIgcnQyID0gd3MuQ2VsbHNbIkIyIl0uQWRkQ29tbWVudCgiUmFuZ2UgQWRkZWQgQ29tbWVudCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0dGVzdHRlc3R0ZXN0IiwgIkphbiBLw6RsbG1hbiIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbImMzIl0uQ29tbWVudC5BdXRvRml0ID0gdHJ1ZTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkcmVzcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkFkZHJlc3MiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNCxCNTpCNyJdLlZhbHVlID0gIkFkZHJlc3NUZXN0IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNCxCNTpCNyJdLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMjpBMyxCNDpCOCJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLkxpZ2h0VXA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTI6QTMsQjQ6QjgiXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyZWVuKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyIyOjIiXS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyIyOjIiXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyZWVuKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCOkIiXS5TdHlsZS5Gb250Lk5hbWUgPSAiVGltZXMgTmV3IFJvbWFuIjsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkM0Okc0LEg4OkgzMCxCMTUiXS5Gb3JtdWxhUjFDMSA9ICJSQ1stMV0rUjFDWy0xXSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzQ6RzQsSDg6SDMwLEIxNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAwIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHMSxHMyJdLkh5cGVybGluayA9IG5ldyBFeGNlbEh5cGVyTGluaygiQ29tbWVudCEkQSQxIiwgIkNvbW1lbnQiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHMSxHMyJdLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRzEsRzMiXS5TdHlsZS5Gb250LlVuZGVyTGluZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpHNSJdLkNvcHkod3MuQ2VsbHNbIkE1MCJdKTsKLQotICAgICAgICAgICAgdmFyIHdzMiA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHkgQ2VsbHMiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyIxOjQiXS5Db3B5KHdzMi5DZWxsc1siMToxIl0pOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSDE6SjUiXS5NZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siMjozIl0uQ29weSh3cy5DZWxsc1siNTA6NTEiXSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBNDAiXS5WYWx1ZSA9IG5ldyBzdHJpbmcobmV3IGNoYXJbXSB7IChjaGFyKTgsIChjaGFyKTkgfSk7Ci0KLSAgICAgICAgICAgIEV4Y2VsUmFuZ2Ugc3R5bGVSbmcgPSB3cy5DZWxsc1siQTEiXTsKLSAgICAgICAgICAgIEV4Y2VsU3R5bGUgdGVtcFN0eWxlID0gc3R5bGVSbmcuU3R5bGU7Ci0gICAgICAgICAgICB2YXIgbmFtZWRTdHlsZSA9IF9wY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIkh5cGVyTGluayIsIHRlbXBTdHlsZSk7Ci0gICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGU7Ci0gICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBFbmNvZGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkVuY29kaW5nIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJfeDAwOTlfIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gIiBUZXN0IFxiIiArIChjaGFyKTEgKyAiIGVuZFwiIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMyJdLlZhbHVlID0gIl94MDA5N18gdGVzdF94MDAxRF8xMjM0IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBNCJdLlZhbHVlID0gInRlc3QiICsgKGNoYXIpMzE7ICAgLy9CdWcgaXNzdWUgMTQ2ODkgLy9GaXhlZAotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgV29ya3NoZWV0Q29weSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcGllZCBBZGRyZXNzIiwgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJBZGRyZXNzIl0pOwotICAgICAgICAgICAgdmFyIHdzQ29weSA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcGllZCBDb21tZW50IiwgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJDb21tZW50Il0pOwotCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrMiA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHBjazIuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHkgRnJvbSBvdGhlciBwY2siLCBfcGNrLldvcmtib29rLldvcmtzaGVldHNbIkFkZHJlc3MiXSk7Ci0gICAgICAgICAgICBwY2syLlNhdmVBcyhuZXcgRmlsZUluZm8oX3dvcmtzaGVldFBhdGggKyAiY29weS54bHN4IikpOwotICAgICAgICAgICAgcGNrMiA9IG51bGw7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgd3NDb3B5LkNvbW1lbnRzLkNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdERlbGV0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBmaWxlID0gX3dvcmtzaGVldFBhdGggKyAidGVzdC54bHN4IjsKLQotICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGZpbGUpKQotICAgICAgICAgICAgICAgIEZpbGUuRGVsZXRlKGZpbGUpOwotCi0gICAgICAgICAgICBDcmVhdGUoZmlsZSk7Ci0KLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwYWNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0c1siZGVsZXRlIl07Ci0gICAgICAgICAgICB3LkRlbGV0ZVJvdygxLCAyKTsKLQotICAgICAgICAgICAgcGFjay5TYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRnJvbUNvbGxlY3Rpb25UZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZEZyb21Db2xsZWN0aW9uIik7Ci0gICAgICAgICAgICBMaXN0PFRlc3REVE8+IGxpc3QgPSBuZXcgTGlzdDxUZXN0RFRPPigpOwotICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gMSwgTmFtZSA9ICJJdGVtMSIsIEJvb2xlYW4gPSBmYWxzZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDExLCAxLCAxKSwgZHRvID0gbnVsbCwgTmFtZVZhciA9ICJGaWVsZCAxIiB9KTsKLSAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDIsIE5hbWUgPSAiSXRlbTIiLCBCb29sZWFuID0gdHJ1ZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDExLCAxLCAxNSksIGR0byA9IG5ldyBUZXN0RFRPKCksIE5hbWVWYXIgPSAiRmllbGQgMiIgfSk7Ci0gICAgICAgICAgICBsaXN0LkFkZChuZXcgVGVzdERUTygpIHsgSWQgPSAzLCBOYW1lID0gIkl0ZW0zIiwgQm9vbGVhbiA9IGZhbHNlLCBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTEsIDIsIDEpLCBkdG8gPSBudWxsLCBOYW1lVmFyID0gIkZpZWxkIDMiIH0pOwotICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gNCwgTmFtZSA9ICJJdGVtNCIsIEJvb2xlYW4gPSB0cnVlLCBEYXRlID0gbmV3IERhdGVUaW1lKDIwMTEsIDQsIDE5KSwgZHRvID0gbGlzdFsxXSwgTmFtZVZhciA9ICJGaWVsZCA0IiB9KTsKLSAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDUsIE5hbWUgPSAiSXRlbTUiLCBCb29sZWFuID0gZmFsc2UsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMSwgNSwgOCksIGR0byA9IG51bGwsIE5hbWVWYXIgPSAiRmllbGQgNSIgfSk7Ci0gICAgICAgICAgICBsaXN0LkFkZChuZXcgVGVzdERUTygpIHsgSWQgPSA2LCBOYW1lID0gIkl0ZW02IiwgQm9vbGVhbiA9IHRydWUsIERhdGUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMywgMjcpLCBkdG8gPSBudWxsLCBOYW1lVmFyID0gIkZpZWxkIDYiIH0pOwotICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gNywgTmFtZSA9ICJJdGVtNyIsIEJvb2xlYW4gPSBmYWxzZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDA5LCAxLCA1KSwgZHRvID0gbGlzdFszXSwgTmFtZVZhciA9ICJGaWVsZCA3IiB9KTsKLSAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBUZXN0RFRPKCkgeyBJZCA9IDgsIE5hbWUgPSAiSXRlbTgiLCBCb29sZWFuID0gdHJ1ZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDE4LCAxMiwgMzEpLCBkdG8gPSBudWxsLCBOYW1lVmFyID0gIkZpZWxkIDgiIH0pOwotICAgICAgICAgICAgbGlzdC5BZGQobmV3IFRlc3REVE8oKSB7IElkID0gOSwgTmFtZSA9ICJJdGVtOSIsIEJvb2xlYW4gPSBmYWxzZSwgRGF0ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAyLCAxKSwgZHRvID0gbnVsbCwgTmFtZVZhciA9ICJGaWVsZCA5IiB9KTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21Db2xsZWN0aW9uKGxpc3QsIHRydWUpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkEzMCJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0LCB0cnVlLCBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTksIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgdHlwZW9mKFRlc3REVE8pLkdldEZpZWxkcygpKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkE0NSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0LCB0cnVlLCBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLkxpZ2h0MSwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLCBuZXcgTWVtYmVySW5mb1tdIHsgdHlwZW9mKFRlc3REVE8pLkdldE1ldGhvZCgiR2V0TmFtZUlEIiksIHR5cGVvZihUZXN0RFRPKS5HZXRGaWVsZCgiTmFtZVZhciIpIH0pOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkoxIl0uTG9hZEZyb21Db2xsZWN0aW9uKGZyb20gbCBpbiBsaXN0IHdoZXJlIGwuQm9vbGVhbiBvcmRlcmJ5IGwuRGF0ZSBzZWxlY3QgbmV3IHsgTmFtZSA9IGwuTmFtZSwgSWQgPSBsLklkLCBEYXRlID0gbC5EYXRlLCBOYW1lVmFyaWFibGUgPSBsLk5hbWVWYXIgfSwgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5EYXJrNCk7Ci0KLSAgICAgICAgICAgIHZhciBpbnRzID0gbmV3IGludFtdIHsgMSwgMywgNCwgNzYsIDIsIDUgfTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTUiXS5WYWx1ZSA9IGludHM7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZEZyb21FbXB0eUNvbGxlY3Rpb25UZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9wY2sgPT0gbnVsbCkgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRGcm9tRW1weUNvbGxlY3Rpb24iKTsKLSAgICAgICAgICAgIExpc3Q8VGVzdERUTz4gbGlzdERUTyA9IG5ldyBMaXN0PFRlc3REVE8+KDApOwotICAgICAgICAgICAgLy9MaXN0PGludD4gbGlzdCA9IG5ldyBMaXN0PGludD4oMCk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0RFRPLCB0cnVlKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBNSJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0RFRPLCB0cnVlLCBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTksIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgdHlwZW9mKFRlc3REVE8pLkdldEZpZWxkcygpKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExMCJdLkxvYWRGcm9tQ29sbGVjdGlvbihsaXN0RFRPLCB0cnVlLCBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLkxpZ2h0MSwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLCBuZXcgTWVtYmVySW5mb1tdIHsgdHlwZW9mKFRlc3REVE8pLkdldE1ldGhvZCgiR2V0TmFtZUlEIiksIHR5cGVvZihUZXN0RFRPKS5HZXRGaWVsZCgiTmFtZVZhciIpIH0pOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExNSJdLkxvYWRGcm9tQ29sbGVjdGlvbihmcm9tIGwgaW4gbGlzdERUTyB3aGVyZSBsLkJvb2xlYW4gb3JkZXJieSBsLkRhdGUgc2VsZWN0IG5ldyB7IE5hbWUgPSBsLk5hbWUsIElkID0gbC5JZCwgRGF0ZSA9IGwuRGF0ZSwgTmFtZVZhcmlhYmxlID0gbC5OYW1lVmFyIH0sIHRydWUsIE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuRGFyazQpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTIwIl0uTG9hZEZyb21Db2xsZWN0aW9uKGxpc3REVE8sIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZEZyb21PbmVDb2xsZWN0aW9uVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGNrID09IG51bGwpIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkRnJvbUVtcHlDb2xsZWN0aW9uIik7Ci0gICAgICAgICAgICBMaXN0PFRlc3REVE8+IGxpc3REVE8gPSBuZXcgTGlzdDxUZXN0RFRPPigwKSB7IG5ldyBUZXN0RFRPKCkgeyBOYW1lID0gIlNpbmdsZSIgfSB9OwotICAgICAgICAgICAgLy9MaXN0PGludD4gbGlzdCA9IG5ldyBMaXN0PGludD4oMCk7Ci0KLSAgICAgICAgICAgIHZhciByID0gd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21Db2xsZWN0aW9uKGxpc3REVE8sIHRydWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHIuUm93cyk7Ci0gICAgICAgICAgICB2YXIgcjIgPSB3cy5DZWxsc1siQTUiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdERUTywgZmFsc2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHIyLlJvd3MpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRpYyB2b2lkIENyZWF0ZShzdHJpbmcgZmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3ID0gcGFjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiZGVsZXRlIik7Ci0gICAgICAgICAgICB3LkNlbGxzWzEsIDFdLlZhbHVlID0gInRlc3QiOwotICAgICAgICAgICAgdy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgIHcuQ2VsbHNbMiwgMV0uVmFsdWUgPSAidG8gZGVsZXRlIjsKLSAgICAgICAgICAgIHcuQ2VsbHNbMiwgMl0uVmFsdWUgPSAidG8gZGVsZXRlIjsKLSAgICAgICAgICAgIHcuQ2VsbHNbMywgMV0uVmFsdWUgPSAiM0xlZnQiOwotICAgICAgICAgICAgdy5DZWxsc1szLCAyXS5WYWx1ZSA9ICIzTGVmdCI7Ci0gICAgICAgICAgICB3LkNlbGxzWzQsIDFdLkZvcm11bGEgPSAiQjMrQzMiOwotICAgICAgICAgICAgdy5DZWxsc1s0LCAyXS5WYWx1ZSA9ICJDMytEMyI7Ci0gICAgICAgICAgICBwYWNrLlNhdmUoKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUm93U3R5bGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgQCJzYW1wbGU4Lnhsc3giKTsKLSAgICAgICAgICAgIGlmIChuZXdGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLSAgICAgICAgICAgICAgICAvL25ld0ZpbGUgPSBuZXcgRmlsZUluZm8oZGlyICsgQCJzYW1wbGU4Lnhsc3giKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICAvL0xvYWQgdGhlIHNoZWV0IHdpdGggb25lIHN0cmluZyBjb2x1bW4sIG9uZSBkYXRlIGNvbHVtbiBhbmQgYSBmZXcgcmFuZG9tIG51bWJlcnMuCi0gICAgICAgICAgICB2YXIgd3MgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaXJzdCBsaW5lIHRlc3QiKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMV0uVmFsdWUgPSAiMTsgMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAxXS5WYWx1ZSA9ICIyOyAxIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEsIDJdLlZhbHVlID0gIjE7IDIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMl0uVmFsdWUgPSAiMjsgMiI7Ci0KLSAgICAgICAgICAgIHdzLlJvdygxKS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ29sdW1uKDEpLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhuZXdGaWxlKTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSGlkZVRlc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJIaWRkZW4iKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIlRoaXMgd29ya2Jvb2sgaXMgaGlkZGVuIjsKLSAgICAgICAgICAgIHdzLkhpZGRlbiA9IGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgSHlwZXJsaW5rKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiSHlwZXJMaW5rcyIpOwotICAgICAgICAgICAgdmFyIGhsID0gbmV3IEV4Y2VsSHlwZXJMaW5rKCJHMSIsICJUaWxsIEcxIik7Ci0gICAgICAgICAgICBobC5Ub29sVGlwID0gIkxpbmsgdG8gY2VsbCBHMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5IeXBlcmxpbmsgPSBobDsKLSAgICAgICAgICAgIC8vd3MuQ2VsbHNbIkEyIl0uSHlwZXJsaW5rID0gbmV3IEV4Y2VsSHlwZXJMaW5rKCJtYWlsdG86ZWNzb21hbnlAZ29vZ2xlOmh1c3phciIsIFVyaUtpbmQuQWJzb2x1dGUpOyAvL0ludmFsaWQgVVJMIHdpbGwgdGhyb3cgYW4gRXhjZXB0aW9uCi0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBWZXJ5SGlkZVRlc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWZXJ5SGlkZGVuIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siYTEiXS5WYWx1ZSA9ICJUaGlzIHdvcmtib29rIGlzIGhpZGRlbiI7Ci0gICAgICAgICAgICB3cy5IaWRkZW4gPSBlV29ya1NoZWV0SGlkZGVuLlZlcnlIaWRkZW47Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQcmludGVyU2V0dGluZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJTb2QvSHlkcm9zZWVkIik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIjE7IDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMiwgMV0uVmFsdWUgPSAiMjsgMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICIxOyAyIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzIsIDJdLlZhbHVlID0gIjI7IDIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMSwgMSwgMl0uQXV0b0ZpbHRlciA9IHRydWU7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuQmxhY2tBbmRXaGl0ZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuU2hvd0dyaWRMaW5lcyA9IHRydWU7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuU2hvd0hlYWRlcnMgPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlBhcGVyU2l6ZSA9IGVQYXBlclNpemUuQTQ7Ci0KLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gbmV3IEV4Y2VsQWRkcmVzcygiMToxIik7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUmVwZWF0Q29sdW1ucyA9IG5ldyBFeGNlbEFkZHJlc3MoIkE6QSIpOwotCi0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuRHJhZnQgPSB0cnVlOwotICAgICAgICAgICAgdmFyIHIgPSB3cy5DZWxsc1siQTI2Il07Ci0gICAgICAgICAgICByLlZhbHVlID0gIlgiOwotICAgICAgICAgICAgci5Xb3Jrc2hlZXQuUm93KDI2KS5QYWdlQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlByaW50QXJlYSA9IHdzLkNlbGxzWyJBMTpCMiJdOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkhvcml6b250YWxDZW50ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuVmVydGljYWxDZW50ZXJlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIHdzLlNlbGVjdChuZXcgRXhjZWxBZGRyZXNzKCIzOjQsRTU6RjYiKSk7Ci0KLSAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJSaWNoVGV4dCJdOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSB3cy5DZWxsc1siQTpCIl07Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IHdzLkNlbGxzWyIxOjExIl07Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuVG9wTWFyZ2luID0gMU07Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuTGVmdE1hcmdpbiA9IDFNOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkJvdHRvbU1hcmdpbiA9IDFNOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlJpZ2h0TWFyZ2luID0gMU07Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuT3JpZW50YXRpb24gPSBlT3JpZW50YXRpb24uTGFuZHNjYXBlOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLlBhcGVyU2l6ZSA9IGVQYXBlclNpemUuQTQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHlsZU5hbWVUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU3R5bGVOYW1lVGVzdCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJSMSBDMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCAyXS5WYWx1ZSA9ICJSMSBDMiI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCAzXS5WYWx1ZSA9ICJSMSBDMyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAxXS5WYWx1ZSA9ICJSMiBDMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAyXS5WYWx1ZSA9ICJSMiBDMiI7Ci0gICAgICAgICAgICB3cy5DZWxsc1syLCAzXS5WYWx1ZSA9ICJSMiBDMyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1szLCAxXS5WYWx1ZSA9IGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5OwotICAgICAgICAgICAgd3MuQ2VsbHNbMywgMl0uVmFsdWUgPSBkb3VibGUuTmVnYXRpdmVJbmZpbml0eTsKLSAgICAgICAgICAgIHdzLkNlbGxzWzQsIDFdLkNyZWF0ZUFycmF5Rm9ybXVsYSgiQTErQjEiKTsKLSAgICAgICAgICAgIHZhciBucyA9IF9wY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIlRlc3RTdHlsZSIpOwotICAgICAgICAgICAgbnMuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLQotICAgICAgICAgICAgd3MuQ2VsbHMuU3R5bGUuTG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDMSJdLlN0eWxlTmFtZSA9ICJUZXN0U3R5bGUiOwotICAgICAgICAgICAgd3MuRGVmYXVsdFJvd0hlaWdodCA9IDM1OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkM0Il0uU3R5bGUuTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5Qcm90ZWN0aW9uLklzUHJvdGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZhbHVlRXJyb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWYWx1ZUVycm9yIik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWzEsIDFdLlZhbHVlID0gIkRvbWVzdGljIFZpb2xlbmNlJiN4QjsgYW5kIHRoZSBQcm9mZXNzaW9uYWwiOwotICAgICAgICAgICAgdmFyIHJ0ID0gd3MuQ2VsbHNbMSwgMl0uUmljaFRleHQuQWRkKCJEb21lc3RpYyBWaW9sZW5jZSYjeEI7IGFuZCB0aGUgUHJvZmVzc2lvbmFsIDIiKTsKLSAgICAgICAgICAgIFRlc3RDb250ZXh0LldyaXRlTGluZShydC5Cb2xkLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBUZXN0Q29udGV4dC5Xcml0ZUxpbmUocnQuQm9sZC5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZvcm11bGFFcnJvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZvcm11bGFFcnJvciIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siRDUiXS5Gb3JtdWxhID0gIkNPVU5USUYoQTE6QTEwMCxcIk1pc3NcIikiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkszIl0uRm9ybXVsYSA9ICJBMytBNCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTQiXS5Gb3JtdWxhUjFDMSA9ICIrUk9VTkRVUChSQ1sxXS8xMCwwKSoxMCI7Ci0KLSAgICAgICAgICAgIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2hlZXQtUkMxIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTQiXS5Gb3JtdWxhUjFDMSA9ICIrUk9VTkRVUCgnU2hlZXQtUkMxJyFSQ1sxXS8xMCwwKSoxMCI7Ci0KLSAgICAgICAgICAgIC8vd3MuQ2VsbHNbIkIyOkkyIl0uRm9ybXVsYSA9ICIiOyAgIC8vRXJyb3IKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBGb3JtdWxhQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRm9ybXVsYUVycm9yIik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJFMjpFNSJdLkNyZWF0ZUFycmF5Rm9ybXVsYSgiRlJFUVVFTkNZKEIyOkIxOCxDMjpDNSkiKTsKLSAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXGFycmF5Zm9ybXVsYS54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUGljdHVyZVVSTCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpYyBVUkwiKTsKLQotICAgICAgICAgICAgRXhjZWxIeXBlckxpbmsgaGwgPSBuZXcgRXhjZWxIeXBlckxpbmsoImh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tIik7Ci0gICAgICAgICAgICBobC5Ub29sVGlwID0gIlNjcmVlbiBUaXAiOwotCi0gICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJQaWMgVVJJIiwgUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDEsIGhsKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBpdm90VGFibGVUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90VGFibGUiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tQXJyYXlzKG5ldyBvYmplY3RbXVtdIHsgbmV3W10geyAiQSIsICJCIiwgIkMiLCAiRCIgfSB9KTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLkxvYWRGcm9tQXJyYXlzKG5ldyBvYmplY3RbXVtdCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3IG9iamVjdCBbXSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfSwKLSAgICAgICAgICAgICAgICBuZXcgb2JqZWN0IFtdIHsgOSwgOCwgNyAsNiwgNSwgNCwgMywgMiwgMSwgMCB9LAotICAgICAgICAgICAgICAgIG5ldyBvYmplY3QgW10geyAxLCAxLCAyLCAzLCA1LCA4LCAxMywgMjEsIDM0LCA1NX0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdmFyIHRhYmxlID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQTE6RDQiXSwgIlBpdm90RGF0YSIpOwotICAgICAgICAgICAgd3MuUGl2b3RUYWJsZXMuQWRkKHdzLkNlbGxzWyJHMSJdLCB3cy5DZWxsc1siQTE6RDQiXSwgIlBpdm90VGFibGUiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiUGl2b3RTdHlsZU1lZGl1bTkiLCB3cy5QaXZvdFRhYmxlc1siUGl2b3RUYWJsZSJdLlN0eWxlTmFtZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEFyZ3VtZW50RXhjZXB0aW9uKSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3RUYWJsZU5hbWVDYW5Ob3RTdGFydHNXaXRoTnVtYmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGFibGUiKTsKLSAgICAgICAgICAgIHZhciB0YmwgPSB3cy5UYWJsZXMuQWRkKHdzLkNlbGxzWyJBMSJdLCAiNVRlc3RUYWJsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoQXJndW1lbnRFeGNlcHRpb24pKV0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdFRhYmxlTmFtZUNhbk5vdENvbnRhaW5XaGl0ZVNwYWNlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRhYmxlIik7Ci0gICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQTEiXSwgIlRlc3QgVGFibGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0VGFibGVOYW1lQ2FuU3RhcnRzV2l0aEJhY2tTbGFzaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlRhYmxlIik7Ci0gICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQTEiXSwgIlxcVGVzdFRhYmxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdFRhYmxlTmFtZUNhblN0YXJ0c1dpdGhVbmRlcnNjb3JlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGFibGUiKTsKLSAgICAgICAgICAgIHZhciB0YmwgPSB3cy5UYWJsZXMuQWRkKHdzLkNlbGxzWyJBMSJdLCAiX1Rlc3RUYWJsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUYWJsZVRlc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJUYWJsZSIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uVmFsdWUgPSAxMjM7Ci0gICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siQjE6UDEyIl0sICJUZXN0VGFibGUiKTsKLSAgICAgICAgICAgIHRibC5UYWJsZVN0eWxlID0gT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5DdXN0b207Ci0KLSAgICAgICAgICAgIHRibC5TaG93Rmlyc3RDb2x1bW4gPSB0cnVlOwotICAgICAgICAgICAgdGJsLlNob3dUb3RhbCA9IHRydWU7Ci0gICAgICAgICAgICB0YmwuU2hvd0hlYWRlciA9IHRydWU7Ci0gICAgICAgICAgICB0YmwuU2hvd0xhc3RDb2x1bW4gPSB0cnVlOwotICAgICAgICAgICAgdGJsLlNob3dGaWx0ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0YmwuU2hvd0ZpbHRlciwgZmFsc2UpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIksyIl0uVmFsdWUgPSA1OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkozIl0uVmFsdWUgPSA0OwotCi0gICAgICAgICAgICB0YmwuQ29sdW1uc1s4XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IE9mZmljZU9wZW5YbWwuVGFibGUuUm93RnVuY3Rpb25zLlN1bTsKLSAgICAgICAgICAgIHRibC5Db2x1bW5zWzldLlRvdGFsc1Jvd0Zvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVU0oW3swfV0pIiwgdGJsLkNvbHVtbnNbOV0uTmFtZSk7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1sxNF0uQ2FsY3VsYXRlZENvbHVtbkZvcm11bGEgPSAiVGVzdFRhYmxlW1sjVGhpcyBSb3ddLFsxMjNdXStUZXN0VGFibGVbWyNUaGlzIFJvd10sW0NvbHVtbjJdXSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjMiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjQiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjUiXS5WYWx1ZSA9IDQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjYiXS5WYWx1ZSA9IDU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjciXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjgiXS5WYWx1ZSA9IDc7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjkiXS5WYWx1ZSA9IDg7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjEwIl0uVmFsdWUgPSA5OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxMSJdLlZhbHVlID0gMTA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjEyIl0uVmFsdWUgPSAxMTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDNyJdLlZhbHVlID0gIlRhYmxlIHRlc3QiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkM4Il0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkM4Il0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKLQotICAgICAgICAgICAgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1siYTEyOmExMyJdLCAiIik7Ci0KLSAgICAgICAgICAgIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkMxNjpZMzUiXSwgIiIpOwotICAgICAgICAgICAgdGJsLlRhYmxlU3R5bGUgPSBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTE0OwotICAgICAgICAgICAgdGJsLlNob3dGaXJzdENvbHVtbiA9IHRydWU7Ci0gICAgICAgICAgICB0YmwuU2hvd0xhc3RDb2x1bW4gPSB0cnVlOwotICAgICAgICAgICAgdGJsLlNob3dDb2x1bW5TdHJpcGVzID0gdHJ1ZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0YmwuU2hvd0ZpbHRlciwgdHJ1ZSk7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5OYW1lID0gIlRlc3QgQ29sdW1uIE5hbWUiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siRzUwIl0uVmFsdWUgPSAiVGltZXNwYW4iOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkc1MSJdLlZhbHVlID0gbmV3IERhdGVUaW1lKG5ldyBUaW1lU3BhbigxLCAxLCAxMCkuVGlja3MpOyAvL25ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDEsIDEsIDEwKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHNTIiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDIsIDMsIDEwKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHNTMiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDMsIDQsIDEwKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHNTQiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDQsIDUsIDEwKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkc1MTpHNTUiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIkhIOk1NOlNTIjsKLSAgICAgICAgICAgIHRibCA9IHdzLlRhYmxlcy5BZGQod3MuQ2VsbHNbIkc1MDpHNTQiXSwgIiIpOwotICAgICAgICAgICAgdGJsLlNob3dUb3RhbCA9IHRydWU7Ci0gICAgICAgICAgICB0YmwuU2hvd0ZpbHRlciA9IGZhbHNlOwotICAgICAgICAgICAgdGJsLkNvbHVtbnNbMF0uVG90YWxzUm93RnVuY3Rpb24gPSBPZmZpY2VPcGVuWG1sLlRhYmxlLlJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGFibGVEZWxldGVUZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwa2cgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdiID0gcGtnLldvcmtib29rOwotICAgICAgICAgICAgICAgIHZhciBzaGVldHMgPSBuZXdbXQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2IuV29ya3NoZWV0cy5BZGQoIldvcmtTaGVldCBBIiksCi0gICAgICAgICAgICAgICAgICAgIHdiLldvcmtzaGVldHMuQWRkKCJXb3JrU2hlZXQgQiIpCi0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHNoZWV0c1swXS5DZWxsc1sxLCBpXTsKLSAgICAgICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9IGNlbGwuQWRkcmVzcyArICJfIjsKLSAgICAgICAgICAgICAgICAgICAgY2VsbCA9IHNoZWV0c1sxXS5DZWxsc1sxLCBpXTsKLSAgICAgICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9IGNlbGwuQWRkcmVzcyArICJfIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gNjsgaSA8PSAxMTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBzaGVldHNbMF0uQ2VsbHNbMywgaV07Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwuVmFsdWUgPSBjZWxsLkFkZHJlc3MgKyAiXyI7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwgPSBzaGVldHNbMV0uQ2VsbHNbMywgaV07Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwuVmFsdWUgPSBjZWxsLkFkZHJlc3MgKyAiXyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhciB0YWJsZXMgPSBuZXdbXQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2hlZXRzWzFdLlRhYmxlcy5BZGQoc2hlZXRzWzFdLkNlbGxzWyJBMTpENzMiXSwgIlRhYmxlYSIpLAotICAgICAgICAgICAgICAgICAgICBzaGVldHNbMF0uVGFibGVzLkFkZChzaGVldHNbMF0uQ2VsbHNbIkExOkQ3MyJdLCAiVGFibGUyIiksCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0c1sxXS5UYWJsZXMuQWRkKHNoZWV0c1sxXS5DZWxsc1siRjM6SzEwIl0sICJUYWJsZWIiKSwKLSAgICAgICAgICAgICAgICAgICAgc2hlZXRzWzBdLlRhYmxlcy5BZGQoc2hlZXRzWzBdLkNlbGxzWyJGMzpLMTAiXSwgIlRhYmxlMyIpLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHdiLl9uZXh0VGFibGVJRCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRhYmxlc1swXS5JZCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRhYmxlc1sxXS5JZCk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaGVldHNbMF0uVGFibGVzLkRlbGV0ZSgiVGFibGVhIik7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5GYWlsKCJBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbikgeyB9Ci0gICAgICAgICAgICAgICAgc2hlZXRzWzFdLlRhYmxlcy5EZWxldGUoIlRhYmxlYSIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB0YWJsZXNbMV0uSWQpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB0YWJsZXNbMl0uSWQpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaGVldHNbMV0uVGFibGVzLkRlbGV0ZSg0KTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKSB7IH0KLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBzaGVldHNbMF0uQ2VsbHNbc2hlZXRzWzBdLlRhYmxlc1sxXS5BZGRyZXNzLkFkZHJlc3NdOwotICAgICAgICAgICAgICAgIHNoZWV0c1swXS5UYWJsZXMuRGVsZXRlKDEsIHRydWUpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJhbmdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChjZWxsLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlUYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5Db3B5KCJGaWxlNCIsICJDb3BpZWQgdGFibGUiKTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlSYW5nZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvcHlUZXN0Iik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIlNpbmdsZSBDZWxsIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gIk1lcmdlZCBDZWxscyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTI6RDMwIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHNDpINSJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMzpDNSJdLkNvcHkod3MuQ2VsbHNbIkc0Il0pOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29weU1lcmdlZFJhbmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29weU1lcmdlZFJhbmdlVGVzdCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTExOkMxMSJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTI6QzEyIl0uTWVyZ2UgPSB0cnVlOwotCi0gICAgICAgICAgICB2YXIgc291cmNlID0gd3MuQ2VsbHNbIkExMTpDMTIiXTsKLSAgICAgICAgICAgIHZhciB0YXJnZXQgPSB3cy5DZWxsc1siQTIxIl07Ci0KLSAgICAgICAgICAgIHNvdXJjZS5Db3B5KHRhcmdldCk7Ci0KLSAgICAgICAgICAgIHZhciBhMjEgPSB3cy5DZWxsc1syMSwgMV07Ci0gICAgICAgICAgICB2YXIgYTIyID0gd3MuQ2VsbHNbMjIsIDFdOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGEyMS5NZXJnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGEyMi5NZXJnZSk7Ci0KLSAgICAgICAgICAgIC8vQXNzZXJ0LkFyZU5vdEVxdWFsKGEyMS5NZXJnZUlkLCBhMjIuTWVyZ2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlQaXZvdFRhYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoIlBpdm90LUdyb3VwIERhdGUiLCAiQ29waWVkIFBpdm90dGFibGUgMSIpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvcHkoIlBpdm90LUdyb3VwIE51bWJlciIsICJDb3BpZWQgUGl2b3R0YWJsZSAyIik7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0eWxlYnVnKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHAgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcRnVsbFByb2plY3RlLnhsc3giKSk7Ci0KLSAgICAgICAgICAgIHZhciB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTIsIDFdLlZhbHVlID0gMDsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEyLCAyXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA5LCAxNCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMiwgM10uVmFsdWUgPSAiRmVkZXJpY28gTG9pcyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMiwgNF0uVmFsdWUgPSAiTmFrYW1pIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEyLCA1XS5WYWx1ZSA9ICJIb3JlcyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMiwgN10uVmFsdWUgPSAxMjA7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMiwgOF0uVmFsdWUgPSAiQSBkZWZpbmlyIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEyLCA5XS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA5LCAxNCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMiwgMTBdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDksIDE0KTsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEyLCAxMV0uVmFsdWUgPSAiVHJhbnNmZXLDqG5jaWEiOwotCi0gICAgICAgICAgICB3cy5JbnNlcnRSb3coMTMsIDEsIDEyKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWzEzLCAxXS5WYWx1ZSA9IDA7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMywgMl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMTQpOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDNdLlZhbHVlID0gIkZlZGVyaWNvIExvaXMiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDRdLlZhbHVlID0gIk5ha2FtaSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMywgNV0uVmFsdWUgPSAiSG9yZXMiOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDddLlZhbHVlID0gMTIwOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDhdLlZhbHVlID0gIkEgZGVmaW5pciI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMywgOV0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgOSwgMTQpOwotICAgICAgICAgICAgd3MuQ2VsbHNbMTMsIDEwXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA5LCAxNCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxMywgMTFdLlZhbHVlID0gIlRyYW5zZmVyw6huY2lhIjsKLQotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDE0LCAxLCAxMyk7Ci0KLSAgICAgICAgICAgIHdzLkluc2VydFJvdygxOSwgMSwgMTkpOwotICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDI2LCAxLCAyNik7Ci0gICAgICAgICAgICB3cy5JbnNlcnRSb3coMzMsIDEsIDMzKTsKLSAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcRnVsbFByb2plY3RlX25ldy54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkQnVnKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGVycm9yLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGZ1bGxhID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBmdWxsYSA9PSBudWxsID8gbnVsbCA6IGZ1bGxhLkNlbGxzWyJhOmEiXQotICAgICAgICAgICAgICAgIC5XaGVyZSh0ID0+ICFzdHJpbmcuSXNOdWxsT3JXaGl0ZVNwYWNlKHQuVGV4dCkpLlNlbGVjdChjZWxsID0+IGNlbGwuVmFsdWUuVG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAuVG9MaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBGb3JtdWxhT3ZlcndyaXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRm9ybXVsYU92ZXJ3cml0ZSIpOwotICAgICAgICAgICAgLy9JbnNpZGUKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpHMTIiXS5Gb3JtdWxhID0gIkIxK0MxIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMjpDMyJdLkZvcm11bGEgPSAiRzIrRTEiOwotCi0KLSAgICAgICAgICAgIC8vVG9wIGJvdHRvbSBvdmVyd3JpdGUKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTQ6RzI2Il0uRm9ybXVsYSA9ICJCMStDMStEMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjEzOkMyOCJdLkZvcm11bGEgPSAiRzIrRTEiOwotCi0gICAgICAgICAgICAvL1RvcCBib3R0b20gb3ZlcndyaXRlCi0gICAgICAgICAgICB3cy5DZWxsc1siQjMwOkU0MiJdLkZvcm11bGEgPSAiQjErQzErJEQkMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTMyOkgzMyJdLkZvcm11bGEgPSAiRzIrRTEiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTUwOkE1OSJdLkNyZWF0ZUFycmF5Rm9ybXVsYSgiQzUwK0Q1MCIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAidGVzdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE1Il0uVmFsdWUgPSAiVsOkcmRlIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDMTIiXS5BZGRDb21tZW50KCJUZXN0IiwgIkpKT0QiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMTI6STEyIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkQxMjpJMTIiXS5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEhvcml6b250YWxBbGlnbm1lbnQuTGVmdDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMTI6STEyIl0uU3R5bGUuVmVydGljYWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsVmVydGljYWxBbGlnbm1lbnQuVG9wOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkQxMjpJMTIiXS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJGMTpGMyJdLkZvcm11bGEgPSAiRjIrRjMiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkoxOkozIl0uRm9ybXVsYSA9ICJGMitGMyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRjE6RjMiXS5Gb3JtdWxhID0gIkY1K0Y2IjsgICAgLy9PdmVyd3JpdGUgc2FtZSByYW5nZQotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVmaW5lZE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJOYW1lcyIpOwotICAgICAgICAgICAgd3MuTmFtZXMuQWRkKCJSZWZFcnJvciIsIHdzLkNlbGxzWyIjUkVGISJdKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiVGVzdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5Gb250LlNpemUgPSA4LjVGOwotCi0gICAgICAgICAgICB3cy5OYW1lcy5BZGQoIkFkZHJlc3MiLCB3cy5DZWxsc1siQTI6QTMiXSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQWRkcmVzcyJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZFZhbHVlKCJWYWx1ZSIsIDUpOwotICAgICAgICAgICAgd3MuTmFtZXMuQWRkKCJGdWxsUm93Iiwgd3MuQ2VsbHNbIjI6MiJdKTsKLSAgICAgICAgICAgIHdzLk5hbWVzLkFkZCgiRnVsbENvbCIsIHdzLkNlbGxzWyJBOkEiXSk7Ci0gICAgICAgICAgICAvL3dzLk5hbWVzWyJWYWx1ZSJdLlN0eWxlLkJvcmRlci5Cb3R0b20uQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmxhY2spOwotICAgICAgICAgICAgd3MuTmFtZXMuQWRkRm9ybXVsYSgiRm9ybXVsYSIsICJOYW1lcyFBMitOYW1lcyFBMytOYW1lcyFWYWx1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBVUkwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx1cmwueGxzeCIpKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBwLldvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdXJsc2F2ZWQueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBMb2FkRGF0YVJlYWRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGNrID09IG51bGwpIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkZWQgRGF0YVJlYWRlciIpOwotICAgICAgICAgICAgRXhjZWxSYW5nZUJhc2UgcmFuZ2U7Ci0gICAgICAgICAgICB1c2luZyAodmFyIGR0ID0gbmV3IERhdGFUYWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJTdHJpbmciLCB0eXBlb2Yoc3RyaW5nKSk7Ci0gICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkludCIsIHR5cGVvZihpbnQpKTsKLSAgICAgICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiQm9vbCIsIHR5cGVvZihib29sKSk7Ci0gICAgICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkRvdWJsZSIsIHR5cGVvZihkb3VibGUpKTsKLQotICAgICAgICAgICAgICAgIHZhciBkciA9IGR0Lk5ld1JvdygpOwotICAgICAgICAgICAgICAgIGRyWzBdID0gIlJvdzEiOwotICAgICAgICAgICAgICAgIGRyWzFdID0gMTsKLSAgICAgICAgICAgICAgICBkclsyXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZHJbM10gPSAxLjU7Ci0gICAgICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICAgICAgZHIgPSBkdC5OZXdSb3coKTsKLSAgICAgICAgICAgICAgICBkclswXSA9ICJSb3cyIjsKLSAgICAgICAgICAgICAgICBkclsxXSA9IDI7Ci0gICAgICAgICAgICAgICAgZHJbMl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBkclszXSA9IDIuMjU7Ci0gICAgICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICAgICAgLy9kciA9IGR0Lk5ld1JvdygpOwotICAgICAgICAgICAgICAgIC8vZHJbMF0gPSAiUm93MyI7Ci0gICAgICAgICAgICAgICAgLy9kclsxXSA9IDM7Ci0gICAgICAgICAgICAgICAgLy9kclsyXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy9kclszXSA9IDMuMTI1OwotICAgICAgICAgICAgICAgIC8vZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZWFkZXIgPSBkdC5DcmVhdGVEYXRhUmVhZGVyKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tRGF0YVJlYWRlcihyZWFkZXIsIHRydWUsICJNeV9UYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZmljZU9wZW5YbWwuVGFibGUuVGFibGVTdHlsZXMuTWVkaXVtNSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCByYW5nZS5TdGFydC5Db2x1bW4pOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCByYW5nZS5FbmQuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmFuZ2UuU3RhcnQuUm93KTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgcmFuZ2UuRW5kLlJvdyk7Ci0KLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJlYWRlciA9IGR0LkNyZWF0ZURhdGFSZWFkZXIoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gd3MuQ2VsbHNbIkE1Il0uTG9hZEZyb21EYXRhUmVhZGVyKHJlYWRlciwgZmFsc2UsICJNeV9UYWJsZTIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZpY2VPcGVuWG1sLlRhYmxlLlRhYmxlU3R5bGVzLk1lZGl1bTUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgcmFuZ2UuU3RhcnQuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgcmFuZ2UuRW5kLkNvbHVtbik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIHJhbmdlLlN0YXJ0LlJvdyk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIHJhbmdlLkVuZC5Sb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvL1tUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvYWREYXRhVGFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3BjayA9PSBudWxsKSBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZGVkIERhdGFUYWJsZSIpOwotCi0gICAgICAgICAgICB2YXIgZHQgPSBuZXcgRGF0YVRhYmxlKCk7Ci0gICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiU3RyaW5nIiwgdHlwZW9mKHN0cmluZykpOwotICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQoIkludCIsIHR5cGVvZihpbnQpKTsKLSAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJCb29sIiwgdHlwZW9mKGJvb2wpKTsKLSAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJEb3VibGUiLCB0eXBlb2YoZG91YmxlKSk7Ci0KLQotICAgICAgICAgICAgdmFyIGRyID0gZHQuTmV3Um93KCk7Ci0gICAgICAgICAgICBkclswXSA9ICJSb3cxIjsKLSAgICAgICAgICAgIGRyWzFdID0gMTsKLSAgICAgICAgICAgIGRyWzJdID0gdHJ1ZTsKLSAgICAgICAgICAgIGRyWzNdID0gMS41OwotICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICBkciA9IGR0Lk5ld1JvdygpOwotICAgICAgICAgICAgZHJbMF0gPSAiUm93MiI7Ci0gICAgICAgICAgICBkclsxXSA9IDI7Ci0gICAgICAgICAgICBkclsyXSA9IGZhbHNlOwotICAgICAgICAgICAgZHJbM10gPSAyLjI1OwotICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICBkciA9IGR0Lk5ld1JvdygpOwotICAgICAgICAgICAgZHJbMF0gPSAiUm93MyI7Ci0gICAgICAgICAgICBkclsxXSA9IDM7Ci0gICAgICAgICAgICBkclsyXSA9IHRydWU7Ci0gICAgICAgICAgICBkclszXSA9IDMuMTI1OwotICAgICAgICAgICAgZHQuUm93cy5BZGQoZHIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbURhdGFUYWJsZShkdCwgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW01KTsKLQotICAgICAgICAgICAgLy93b3Jrc2hlZXQuQ2VsbHNbc3RhcnRSb3csIDcsIHdvcmtzaGVldC5EaW1lbnNpb24uRW5kLlJvdywgN10uRm9ybXVsYVIxQzEgPSAiPUlGKFJDWy0yXT0wLDAsUkNbLTFdL1JDWy0yXSkiOwotCi0gICAgICAgICAgICB3cy5UYWJsZXNbMF0uQ29sdW1uc1sxXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IE9mZmljZU9wZW5YbWwuVGFibGUuUm93RnVuY3Rpb25zLlN1bTsKLSAgICAgICAgICAgIHdzLlRhYmxlc1swXS5TaG93VG90YWwgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIExvYWRFbXB0eURhdGFUYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfcGNrID09IG51bGwpIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkZWQgRW1wdHkgRGF0YVRhYmxlIik7Ci0KLSAgICAgICAgICAgIHZhciBkdCA9IG5ldyBEYXRhVGFibGUoKTsKLSAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKG5ldyBEYXRhQ29sdW1uKCJjb2wxIikpOwotICAgICAgICAgICAgZHQuQ29sdW1ucy5BZGQobmV3IERhdGFDb2x1bW4oImNvbDIiKSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbURhdGFUYWJsZShkdCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMSJdLkxvYWRGcm9tRGF0YVRhYmxlKGR0LCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZFRleHRfQnVnMTUwMTUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRlZCBUZXh0Iik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQoIlwidGV4dCB3aXRoIGVvbCxcclxuIGluIGEgY2VsbFwiLFwib3RoZXIgdmFsdWVcIiIsIG5ldyBFeGNlbFRleHRGb3JtYXQgeyBUZXh0UXVhbGlmaWVyID0gJyInLCBFT0wgPSAiLFxyXG4iLCBEZWxpbWl0ZXIgPSAnLCcgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZFRleHRfQnVnMTUwMTVfTmVnYXRpdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkxvYWRlZCBUZXh0Iik7Ci0gICAgICAgICAgICBib29sIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KCJcInRleHQgd2l0aCBlb2wsXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlbFRleHRGb3JtYXQgeyBUZXh0UXVhbGlmaWVyID0gJyInLCBFT0wgPSAiLFxyXG4iLCBEZWxpbWl0ZXIgPSAnLCcgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXh0IGRlbGltaXRlciBpcyBub3QgY2xvc2VkIGluIGxpbmUgOiBcInRleHQgd2l0aCBlb2wiLCBlLk1lc3NhZ2UsICJFeGNlcHRpb24gbWVzc2FnZSIpOwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGV4Y2VwdGlvblRocm93biwgIkV4Y2VwdGlvbiB0aHJvd24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZFRleHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJMb2FkZWQgVGV4dCIpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQoIjEuMiIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkEyIl0uTG9hZEZyb21UZXh0KCIxLFwiVGVzdCBhdiBkYXRhXCIsXCIxMiwyXCIsXCJcIlRlc3RcIlwiIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTMiXS5Mb2FkRnJvbVRleHQoIlwiMSwzXCIsXCJUZXN0IGF2IFwiXCJkYXRhXCIsXCIxMiwyXCIsXCJUZXN0XCJcIlwiIiwgbmV3IEV4Y2VsVGV4dEZvcm1hdCgpIHsgVGV4dFF1YWxpZmllciA9ICciJyB9KTsKLQotICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxlMSIpOwotICAgICAgICAgICAgLy8gd3MuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcY3N2XGV0MWMxMDA0LmNzdiIpLCBuZXcgRXhjZWxUZXh0Rm9ybWF0KCkge1NraXBMaW5lc0JlZ2lubmluZz0zLFNraXBMaW5lc0VuZD0xLCBFT0w9IlxuIn0pOwotCi0gICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZpbGUyIik7Ci0gICAgICAgICAgICAvL3dzLkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dChuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNzdlxldGl2MjgxMi5jc3YiKSwgbmV3IEV4Y2VsVGV4dEZvcm1hdCgpIHsgU2tpcExpbmVzQmVnaW5uaW5nID0gMywgU2tpcExpbmVzRW5kID0gMSwgRU9MID0gIlxuIiB9KTsKLQotICAgICAgICAgICAgLy93cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkZpbGUzIik7Ci0gICAgICAgICAgICAvL3dzLkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dChuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGNzdlxsYXN0X2dpY3MudHh0IiksIG5ldyBFeGNlbFRleHRGb3JtYXQoKSB7IFNraXBMaW5lc0JlZ2lubmluZyA9IDEsIERlbGltaXRlcj0nfCd9KTsKLQotICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxlNCIpOwotICAgICAgICAgICAgLy93cy5DZWxsc1siQTEiXS5Mb2FkRnJvbVRleHQobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxjc3ZcMjAwNjA5MjcuY3VzdG9tX29wZW5fcG9zaXRpb25zLmNkZi5TUFAiKSwgbmV3IEV4Y2VsVGV4dEZvcm1hdCgpIHsgU2tpcExpbmVzQmVnaW5uaW5nID0gMiwgU2tpcExpbmVzRW5kPTIsIFRleHRRdWFsaWZpZXI9JyInLCBEYXRhVHlwZXM9bmV3IGVEYXRhVHlwZXNbXSB7ZURhdGFUeXBlcy5OdW1iZXIsZURhdGFUeXBlcy5TdHJpbmcsIGVEYXRhVHlwZXMuTnVtYmVyLCBlRGF0YVR5cGVzLk51bWJlciwgZURhdGFUeXBlcy5OdW1iZXIsIGVEYXRhVHlwZXMuU3RyaW5nLCBlRGF0YVR5cGVzLk51bWJlciwgZURhdGFUeXBlcy5OdW1iZXIsIGVEYXRhVHlwZXMuU3RyaW5nLCBlRGF0YVR5cGVzLlN0cmluZywgZURhdGFUeXBlcy5OdW1iZXIsIGVEYXRhVHlwZXMuTnVtYmVyLCBlRGF0YVR5cGVzLk51bWJlcn19LAotICAgICAgICAgICAgLy8gICAgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0yNywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dCgiMSxcIlRlc3RcIixcIlwiLFwiXCJcIlwiLDMiLCBuZXcgRXhjZWxUZXh0Rm9ybWF0KCkgeyBUZXh0UXVhbGlmaWVyID0gJ1wiJyB9KTsKLQotICAgICAgICAgICAgdmFyIHN0eWxlID0gX3Bjay5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiUmVkU3R5bGUiKTsKLSAgICAgICAgICAgIHN0eWxlLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgIHN0eWxlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7Ci0KLSAgICAgICAgICAgIC8vdmFyIHRibCA9IHdzLlRhYmxlc1t3cy5UYWJsZXMuQ291bnQgLSAxXTsKLSAgICAgICAgICAgIC8vdGJsLlNob3dUb3RhbCA9IHRydWU7Ci0gICAgICAgICAgICAvL3RibC5Ub3RhbHNSb3dDZWxsU3R5bGUgPSAiUmVkU3R5bGUiOwotICAgICAgICAgICAgLy90YmwuSGVhZGVyUm93Q2VsbFN0eWxlID0gIlJlZFN0eWxlIjsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdFJlcGVhdFJvd3NBbmRDb2x1bW5zVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotCi0gICAgICAgICAgICB2YXIgdyA9IHAuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlJlcGVhdFJvd3NBbmRDb2x1bW5zVGVzdCIpOwotCi0gICAgICAgICAgICB3LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRDb2x1bW5zID0gbmV3IEV4Y2VsQWRkcmVzcygiQTpBIik7Ci0gICAgICAgICAgICB3LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gbmV3IEV4Y2VsQWRkcmVzcygiMToxIik7Ci0KLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwody5QcmludGVyU2V0dGluZ3MuUmVwZWF0Q29sdW1ucyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHcuUHJpbnRlclNldHRpbmdzLlJlcGVhdFJvd3MpOyAvLyBGYWlscyEKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTWVyZ2UiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNCJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDMTpDNCxDODpDMTIiXS5NZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRDEzOkUxOCxHNSxVMzI6VTQ1Il0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkQxMzpFMTgsRzUsVTMyOlU0NSJdLlN0eWxlLldyYXBUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vd3MuQ2VsbHNbIjUwOjUyIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkFBOkFDIl0uTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuU2V0VmFsdWUoMTMsIDQsICJNZXJnZWRcclxubmV3IHJvdyIpOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVmYXVsdENvbFdpZHRoKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGVmQ29sV2lkdGgiKTsKLSAgICAgICAgICAgIHdzLkRlZmF1bHRDb2xXaWR0aCA9IDQ1OwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZEFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTG9hZGVkIEFycmF5Iik7Ci0gICAgICAgICAgICBMaXN0PG9iamVjdFtdPiB0ZXN0QXJyYXkgPSBuZXcgTGlzdDxvYmplY3RbXT4oKSB7IG5ldyBvYmplY3RbXSB7IDMsIDQsIDUsIDYgfSwgbmV3IHN0cmluZ1tdIHsgIlRlc3QxIiwgInRlc3QiLCAiNSIsICI2IiB9IH07Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5Mb2FkRnJvbUFycmF5cyh0ZXN0QXJyYXkpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWZDb2xXaWR0aEJ1ZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgYm9vayA9IF9wY2suV29ya2Jvb2s7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBzaGVldCA9IGJvb2suV29ya3NoZWV0cy5BZGQoIkdlYnJ1aWtlcnMiKTsKLQotICAgICAgICAgICAgc2hlZXQuRGVmYXVsdENvbFdpZHRoID0gMjVkOwotICAgICAgICAgICAgLy9zaGVldC5kZWZhdWx0Um93SGVpZ2h0ID0gMTVkOyAvLyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoZSByZXN1bHRpbmcgZmlsZSBpcyB2YWxpZCEKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBoZWFkZXIgcm93Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJBZmRlbGluZyBjb2RlIjsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDJdLlZhbHVlID0gIkFmZGVsaW5nIG5hYW0iOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbMSwgM10uVmFsdWUgPSAiVm9vcm5hYW0iOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbMSwgNF0uVmFsdWUgPSAiVHVzc2Vudm9lZ3NlbCI7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJBY2h0ZXJuYWFtIjsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDZdLlZhbHVlID0gIkdlYnJ1aWtlcnNuYWFtIjsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWzEsIDddLlZhbHVlID0gIkUtbWFpbCBhZHJlcyI7Ci0gICAgICAgICAgICBFeGNlbFJhbmdlIGhlYWRlclJvdyA9IHNoZWV0LkNlbGxzWzEsIDEsIDEsIDddOwotICAgICAgICAgICAgaGVhZGVyUm93LlN0eWxlLkJvcmRlci5Cb3R0b20uU3R5bGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKLSAgICAgICAgICAgIGhlYWRlclJvdy5TdHlsZS5Gb250LlNpemUgPSAxMjsKLSAgICAgICAgICAgIGhlYWRlclJvdy5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotCi0gICAgICAgICAgICAvLy8vIENyZWF0ZSBhIGNvbnRleHQgZm9yIHJldHJpZXZpbmcgdGhlIHVzZXJzCi0gICAgICAgICAgICAvL3VzaW5nIChQYWxhdURhdGFDb250ZXh0IGNvbnRleHQgPSBuZXcgUGFsYXVEYXRhQ29udGV4dCgpKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBpbnQgY3VycmVudFJvdyA9IDI7Ci0KLSAgICAgICAgICAgIC8vICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdXNlcnMgaW4gdGhlIGV4cG9ydCBhbmQgYWRkIHRoZWlyIGluZm8KLSAgICAgICAgICAgIC8vICAgIC8vIHRvIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgICAgICAvLyAgICBmb3JlYWNoICh2d19FeHBvcnRVc2VyIHVzZXIgaW4KLSAgICAgICAgICAgIC8vICAgICAgY29udGV4dC52d19FeHBvcnRVc2VycwotICAgICAgICAgICAgLy8gICAgICAuT3JkZXJCeSh1ID0+IHUuRGVwYXJ0bWVudENvZGUpCi0gICAgICAgICAgICAvLyAgICAgIC5UaGVuQnkodSA9PiB1LkFzcE5ldFVzZXJOYW1lKSkKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICBzaGVldC5DZWxsc1tjdXJyZW50Um93LCAxXS5WYWx1ZSA9IHVzZXIuRGVwYXJ0bWVudENvZGU7Ci0gICAgICAgICAgICAvLyAgICAgICAgc2hlZXQuQ2VsbHNbY3VycmVudFJvdywgMl0uVmFsdWUgPSB1c2VyLkRlcGFydG1lbnROYW1lOwotICAgICAgICAgICAgLy8gICAgICAgIHNoZWV0LkNlbGxzW2N1cnJlbnRSb3csIDNdLlZhbHVlID0gdXNlci5Vc2VyRmlyc3ROYW1lOwotICAgICAgICAgICAgLy8gICAgICAgIHNoZWV0LkNlbGxzW2N1cnJlbnRSb3csIDRdLlZhbHVlID0gdXNlci5Vc2VySW5maXg7Ci0gICAgICAgICAgICAvLyAgICAgICAgc2hlZXQuQ2VsbHNbY3VycmVudFJvdywgNV0uVmFsdWUgPSB1c2VyLlVzZXJTdXJuYW1lOwotICAgICAgICAgICAgLy8gICAgICAgIHNoZWV0LkNlbGxzW2N1cnJlbnRSb3csIDZdLlZhbHVlID0gdXNlci5Bc3BOZXRVc2VyTmFtZTsKLSAgICAgICAgICAgIC8vICAgICAgICBzaGVldC5DZWxsc1tjdXJyZW50Um93LCA3XS5WYWx1ZSA9IHVzZXIuQXNwTmV0RW1haWw7Ci0KLSAgICAgICAgICAgIC8vICAgICAgICBjdXJyZW50Um93Kys7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmaWxsZWQgRXhjZWwgd29ya2Jvb2sKLSAgICAgICAgICAgIC8vICByZXR1cm4gcGtnCi0KLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xvc2VQcm9ibGVtKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTWFudWFsIFJlY2VpcHRzIik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIiBTcGFjZU5lZWRsZSBNYW51YWwgUmVjZWlwdCBGb3JtIjsKLQotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUmFuZ2UgciA9IHdzLkNlbGxzWyJBMTpGMSJdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIuTWVyZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQXJpYWwiLCAxOCwgRm9udFN0eWxlLkl0YWxpYykpOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5EYXJrUmVkKTsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOwotICAgICAgICAgICAgICAgIC8vci5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gT2ZmaWNlT3BlblhtbC5TdHlsZS5FeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICAvL3IuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoMjMsIDU1LCA5MykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8JCQl3cy5Db2x1bW4oMSkuQmVzdEZpdCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5Db2x1bW4oMSkuV2lkdGggPSAxNzsKLSAgICAgICAgICAgIHdzLkNvbHVtbig1KS5XaWR0aCA9IDIwOwotCi0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMiJdLlZhbHVlID0gIkRhdGUgUHJvZHVjZWQiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIyIl0uVmFsdWUgPSBEYXRlVGltZS5Ob3cuVG9TaG9ydERhdGVTdHJpbmcoKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMiJdLlZhbHVlID0gIlF1YW50aXR5IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMiJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRTIiXS5WYWx1ZSA9ICJ0eHQiOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siQzQiXS5WYWx1ZSA9ICJSZWNlaXB0IE51bWJlciI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzQiXS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzQiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotCi0gICAgICAgICAgICBpbnQgcm93TmJyID0gNTsKLSAgICAgICAgICAgIGZvciAoaW50IGVudHJ5TmJyID0gMTsgZW50cnlOYnIgPD0gMTsgZW50cnlOYnIgKz0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQiIgKyByb3dOYnJdLlZhbHVlID0gZW50cnlOYnI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkMiICsgcm93TmJyXS5WYWx1ZSA9IDEgKyBlbnRyeU5iciAtIDE7Ci0gICAgICAgICAgICAgICAgcm93TmJyICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbygiLlxcdGVzdC54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBPcGVuWGxzbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxjczEueGxzeCIpKTsKLSAgICAgICAgICAgIGludCBjID0gcC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvdW50OwotICAgICAgICAgICAgcC5TYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlYnVnKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHhsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB4bFdvcmtTaGVldCA9IHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCBTaGVldCIpOwotICAgICAgICAgICAgdmFyIENlbGxzID0geGxXb3JrU2hlZXQuQ2VsbHM7Ci0gICAgICAgICAgICB2YXIgVGl0bGVDZWxsID0gQ2VsbHNbMSwgMSwgMSwgM107Ci0KLSAgICAgICAgICAgIFRpdGxlQ2VsbC5NZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICBUaXRsZUNlbGwuVmFsdWUgPSAiVGVzdCBTcHJlYWRzaGVldCI7Ci0gICAgICAgICAgICBDZWxsc1syLCAxXS5WYWx1ZSA9ICJUZXN0IFN1YiBIZWFkaW5nXHJcbnRlc3QiICsgKGNoYXIpMjI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENlbGxzWzMsIGkgKyAxXS5WYWx1ZSA9IChjaGFyKWk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDZWxsc1syLCAxXS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICB4bFdvcmtTaGVldC5Sb3coMSkuSGVpZ2h0ID0gNTA7Ci0gICAgICAgICAgICB4bFBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXE1lcmdlYnVnLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9wZW5Qcm9ibGVtKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHhsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVzEiKTsKLSAgICAgICAgICAgIHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVzIiKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkExMCJdLkZvcm11bGEgPSAiVzIhQTErQzEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxOkIxMCJdLkZvcm11bGFSMUMxID0gIlcyIVIxQzErQzEiOwotICAgICAgICAgICAgeGxQYWNrYWdlLlNhdmVBcyhuZXcgRmlsZUluZm8oImM6XFx0ZW1wXFxNZXJnZWJ1Zy54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBQcm90ZWN0aW9uUHJvYmxlbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB4bFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXENvdmVuYW50c0NoZWNrUmVwb3J0VGVtcGxhdGUueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICB3cy5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJUZXN0Iik7Ci0gICAgICAgICAgICB4bFBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbygiYzpcXHRlbXBcXE1lcmdlYnVnLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5hbWV0ZXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKCJjOlxcdGVtcFxcbmFtZXMueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siSDM3Il0uRm9ybXVsYSA9ICJcIlRlc3RcIiI7Ci0gICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XFx0ZW1wXFxuYW1ldGVzdF9uZXcueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVBpdm90VGFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3NQaXZvdDEgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJSb3dzLURhdGEgb24gY29sdW1ucyIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3QyID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUm93cy1EYXRhIG9uIHJvd3MiKTsKLSAgICAgICAgICAgIHZhciB3c1Bpdm90MyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbHVtbnMtRGF0YSBvbiBjb2x1bW5zIik7Ci0gICAgICAgICAgICB2YXIgd3NQaXZvdDQgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb2x1bW5zLURhdGEgb24gcm93cyIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3Q1ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29sdW1ucy9Sb3dzLURhdGEgb24gY29sdW1ucyIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3Q2ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29sdW1ucy9Sb3dzLURhdGEgb24gcm93cyIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3Q3ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUm93cy9QYWdlLURhdGEgb24gQ29sdW1ucyIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3Q4ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGl2b3QtR3JvdXAgRGF0ZSIpOwotICAgICAgICAgICAgdmFyIHdzUGl2b3Q5ID0gX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiUGl2b3QtR3JvdXAgTnVtYmVyIik7Ci0KLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkRhdGEiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMSJdLlZhbHVlID0gIkl0ZW0iOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkwxIl0uVmFsdWUgPSAiQ2F0ZWdvcnkiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk0xIl0uVmFsdWUgPSAiU3RvY2siOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk4xIl0uVmFsdWUgPSAiUHJpY2UiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk8xIl0uVmFsdWUgPSAiRGF0ZSBmb3IgZ3JvdXBpbmciOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSzIiXS5WYWx1ZSA9ICJDcm93YmFyIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJMMiJdLlZhbHVlID0gIkhhcmR3YXJlIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJNMiJdLlZhbHVlID0gMTI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTjIiXS5WYWx1ZSA9IDg1LjI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTzIiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxLCAzMSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMyJdLlZhbHVlID0gIkNyb3diYXIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkwzIl0uVmFsdWUgPSAiSGFyZHdhcmUiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk0zIl0uVmFsdWUgPSAxNTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJOMyJdLlZhbHVlID0gMTIuMjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJPMyJdLlZhbHVlID0gbmV3IERhdGVUaW1lKDIwMTAsIDIsIDI4KTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIks0Il0uVmFsdWUgPSAiSGFtbWVyIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJMNCJdLlZhbHVlID0gIkhhcmR3YXJlIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJNNCJdLlZhbHVlID0gNTUwOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk40Il0uVmFsdWUgPSA3Mi43OwotICAgICAgICAgICAgd3MuQ2VsbHNbIk80Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgMywgMzEpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSzUiXS5WYWx1ZSA9ICJIYW1tZXIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkw1Il0uVmFsdWUgPSAiSGFyZHdhcmUiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk01Il0uVmFsdWUgPSAxMjA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTjUiXS5WYWx1ZSA9IDExLjM7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTzUiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA0LCAzMCk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJLNiJdLlZhbHVlID0gIkNyb3diYXIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkw2Il0uVmFsdWUgPSAiSGFyZHdhcmUiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk02Il0uVmFsdWUgPSAxMjA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTjYiXS5WYWx1ZSA9IDE3My4yOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk82Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgNSwgMzEpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSzciXS5WYWx1ZSA9ICJIYW1tZXIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkw3Il0uVmFsdWUgPSAiSGFyZHdhcmUiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk03Il0uVmFsdWUgPSAxOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk43Il0uVmFsdWUgPSA0LjI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTzciXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA2LCAzMCk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJLOCJdLlZhbHVlID0gIlNhdyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTDgiXS5WYWx1ZSA9ICJIYXJkd2FyZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTTgiXS5WYWx1ZSA9IDQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTjgiXS5WYWx1ZSA9IDMzLjEyOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk84Il0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMCwgNiwgMjgpOwotCi0gICAgICAgICAgICB3cy5DZWxsc1siSzkiXS5WYWx1ZSA9ICJTY3Jld2RyaXZlciI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTDkiXS5WYWx1ZSA9ICJIYXJkd2FyZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTTkiXS5WYWx1ZSA9IDEyMDA7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTjkiXS5WYWx1ZSA9IDQ1LjI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTzkiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA4LCAzMSk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMTAiXS5WYWx1ZSA9ICJBcHBsZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTDEwIl0uVmFsdWUgPSAiR3JvY2VyaWVzIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJNMTAiXS5WYWx1ZSA9IDgwNzsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJOMTAiXS5WYWx1ZSA9IDEuMjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJPMTAiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCA5LCAzMCk7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMTEiXS5WYWx1ZSA9ICJCdXR0ZXIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkwxMSJdLlZhbHVlID0gIkdyb2NlcmllcyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siTTExIl0uVmFsdWUgPSA1MjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJOMTEiXS5WYWx1ZSA9IDcuMjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJPMTEiXS5WYWx1ZSA9IG5ldyBEYXRlVGltZSgyMDEwLCAxMCwgMzEpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIk8yOk8xMSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAieXl5eS1NTS1kZCI7Ci0KLSAgICAgICAgICAgIHZhciBwdCA9IHdzUGl2b3QxLlBpdm90VGFibGVzLkFkZCh3c1Bpdm90MS5DZWxsc1siQTEiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTEiKTsKLSAgICAgICAgICAgIHB0LkdyYW5kVG90YWxDYXB0aW9uID0gIlRvdGFsIGFtb3VudCI7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1swXSk7Ci0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHNbMF0uRnVuY3Rpb24gPSBEYXRhRmllbGRGdW5jdGlvbnMuUHJvZHVjdDsKLSAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgcHQgPSB3c1Bpdm90Mi5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDIuQ2VsbHNbIkExIl0sIHdzLkNlbGxzWyJLMTpOMTEiXSwgIlBpdm90dGFibGUyIik7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1swXSk7Ci0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHNbMF0uRnVuY3Rpb24gPSBEYXRhRmllbGRGdW5jdGlvbnMuQXZlcmFnZTsKLSAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSB0cnVlOwotCi0gICAgICAgICAgICBwdCA9IHdzUGl2b3QzLlBpdm90VGFibGVzLkFkZCh3c1Bpdm90My5DZWxsc1siQTEiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTMiKTsKLSAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzFdKTsKLSAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzBdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1szXSk7Ci0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbMl0pOwotICAgICAgICAgICAgcHQuRGF0YU9uUm93cyA9IGZhbHNlOwotCi0gICAgICAgICAgICBwdCA9IHdzUGl2b3Q0LlBpdm90VGFibGVzLkFkZCh3c1Bpdm90NC5DZWxsc1siQTEiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTQiKTsKLSAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzFdKTsKLSAgICAgICAgICAgIHB0LkNvbHVtbkZpZWxkcy5BZGQocHQuRmllbGRzWzBdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1szXSk7Ci0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbMl0pOwotICAgICAgICAgICAgcHQuRGF0YU9uUm93cyA9IHRydWU7Ci0KLSAgICAgICAgICAgIHB0ID0gd3NQaXZvdDUuUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3Q1LkNlbGxzWyJBMSJdLCB3cy5DZWxsc1siSzE6TjExIl0sICJQaXZvdHRhYmxlNSIpOwotICAgICAgICAgICAgcHQuQ29sdW1uRmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOwotICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMF0pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7Ci0gICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHB0ID0gd3NQaXZvdDYuUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3Q2LkNlbGxzWyJBMSJdLCB3cy5DZWxsc1siSzE6TjExIl0sICJQaXZvdHRhYmxlNiIpOwotICAgICAgICAgICAgcHQuQ29sdW1uRmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOwotICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMF0pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzNdKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7Ci0gICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzUGl2b3Q2LkRyYXdpbmdzLkFkZENoYXJ0KCJQaXZvdGNoYXJ0NiIsIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydC5lQ2hhcnRUeXBlLkJhclN0YWNrZWQzRCwgcHQpOwotCi0gICAgICAgICAgICBwdCA9IHdzUGl2b3Q3LlBpdm90VGFibGVzLkFkZCh3c1Bpdm90Ny5DZWxsc1siQTMiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTciKTsKLSAgICAgICAgICAgIHB0LlBhZ2VGaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1swXSk7Ci0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKLSAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgcHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zID0gZVN1YlRvdGFsRnVuY3Rpb25zLlN1bSB8IGVTdWJUb3RhbEZ1bmN0aW9ucy5NYXg7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zLCBlU3ViVG90YWxGdW5jdGlvbnMuU3VtIHwgZVN1YlRvdGFsRnVuY3Rpb25zLk1heCk7Ci0KLSAgICAgICAgICAgIHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucyA9IGVTdWJUb3RhbEZ1bmN0aW9ucy5TdW0gfCBlU3ViVG90YWxGdW5jdGlvbnMuUHJvZHVjdCB8IGVTdWJUb3RhbEZ1bmN0aW9ucy5TdGREZXZQOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHB0LkZpZWxkc1swXS5TdWJUb3RhbEZ1bmN0aW9ucywgZVN1YlRvdGFsRnVuY3Rpb25zLlN1bSB8IGVTdWJUb3RhbEZ1bmN0aW9ucy5Qcm9kdWN0IHwgZVN1YlRvdGFsRnVuY3Rpb25zLlN0ZERldlApOwotCi0gICAgICAgICAgICBwdC5GaWVsZHNbMF0uU3ViVG90YWxGdW5jdGlvbnMgPSBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwdC5GaWVsZHNbMF0uU3ViVG90YWxGdW5jdGlvbnMsIGVTdWJUb3RhbEZ1bmN0aW9ucy5Ob25lKTsKLQotICAgICAgICAgICAgcHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zID0gZVN1YlRvdGFsRnVuY3Rpb25zLkRlZmF1bHQ7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocHQuRmllbGRzWzBdLlN1YlRvdGFsRnVuY3Rpb25zLCBlU3ViVG90YWxGdW5jdGlvbnMuRGVmYXVsdCk7Ci0KLSAgICAgICAgICAgIHB0LkZpZWxkc1swXS5Tb3J0ID0gZVNvcnRUeXBlLkRlc2NlbmRpbmc7Ci0gICAgICAgICAgICBwdC5UYWJsZVN0eWxlID0gT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0xNDsKLQotICAgICAgICAgICAgcHQgPSB3c1Bpdm90OC5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDguQ2VsbHNbIkEzIl0sIHdzLkNlbGxzWyJLMTpPMTEiXSwgIlBpdm90dGFibGU4Iik7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1s0XSk7Ci0gICAgICAgICAgICBwdC5GaWVsZHNbNF0uQWRkRGF0ZUdyb3VwaW5nKGVEYXRlR3JvdXBCeS5ZZWFycyB8IGVEYXRlR3JvdXBCeS5Nb250aHMgfCBlRGF0ZUdyb3VwQnkuRGF5cyB8IGVEYXRlR3JvdXBCeS5RdWFydGVycywgbmV3IERhdGVUaW1lKDIwMTAsIDAxLCAzMSksIG5ldyBEYXRlVGltZSgyMDEwLCAxMSwgMzApKTsKLSAgICAgICAgICAgIHB0LlJvd0hlYWRlckNhcHRpb24gPSAiw4VyIjsKLSAgICAgICAgICAgIHB0LkZpZWxkc1s0XS5OYW1lID0gIkRhZyI7Ci0gICAgICAgICAgICBwdC5GaWVsZHNbNV0uTmFtZSA9ICJNw6VuYWQiOwotICAgICAgICAgICAgcHQuRmllbGRzWzZdLk5hbWUgPSAiS3ZhcnRhbCI7Ci0gICAgICAgICAgICBwdC5HcmFuZFRvdGFsQ2FwdGlvbiA9ICJUb3RhbHQiOwotCi0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKLSAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSB0cnVlOwotCi0gICAgICAgICAgICBwdCA9IHdzUGl2b3Q5LlBpdm90VGFibGVzLkFkZCh3c1Bpdm90OS5DZWxsc1siQTMiXSwgd3MuQ2VsbHNbIksxOk4xMSJdLCAiUGl2b3R0YWJsZTkiKTsKLSAgICAgICAgICAgIHB0LlBhZ2VGaWVsZHMuQWRkKHB0LkZpZWxkc1sxXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHMuQWRkKHB0LkZpZWxkc1szXSk7Ci0gICAgICAgICAgICBwdC5Sb3dGaWVsZHNbMF0uQWRkTnVtZXJpY0dyb3VwaW5nKC0zLjMsIDUuNSwgNC4wKTsKLSAgICAgICAgICAgIHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1syXSk7Ci0gICAgICAgICAgICBwdC5EYXRhT25Sb3dzID0gZmFsc2U7Ci0gICAgICAgICAgICBwdC5UYWJsZVN0eWxlID0gT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0xNDsKLQotICAgICAgICAgICAgcHQgPSB3c1Bpdm90OC5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDguQ2VsbHNbIkgzIl0sIHdzLkNlbGxzWyJLMTpPMTEiXSwgIlBpdm90dGFibGUxMCIpOwotICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbMV0pOwotICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbNF0pOwotICAgICAgICAgICAgcHQuRmllbGRzWzRdLkFkZERhdGVHcm91cGluZyg3LCBuZXcgRGF0ZVRpbWUoMjAxMCwgMDEsIDMxKSwgbmV3IERhdGVUaW1lKDIwMTAsIDExLCAzMCkpOwotICAgICAgICAgICAgcHQuUm93SGVhZGVyQ2FwdGlvbiA9ICJWZWNrb3IiOwotICAgICAgICAgICAgcHQuR3JhbmRUb3RhbENhcHRpb24gPSAiVG90YWx0IjsKLQotICAgICAgICAgICAgcHQgPSB3c1Bpdm90OC5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDguQ2VsbHNbIkE2MCJdLCB3cy5DZWxsc1siSzE6TzExIl0sICJQaXZvdHRhYmxlMTEiKTsKLSAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWyJDYXRlZ29yeSJdKTsKLSAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWyJJdGVtIl0pOwotICAgICAgICAgICAgcHQuUm93RmllbGRzLkFkZChwdC5GaWVsZHNbIkRhdGUgZm9yIGdyb3VwaW5nIl0pOwotCi0gICAgICAgICAgICBwdC5EYXRhRmllbGRzLkFkZChwdC5GaWVsZHNbM10pOwotICAgICAgICAgICAgcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWzJdKTsKLSAgICAgICAgICAgIHB0LkRhdGFPblJvd3MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkUGl2b3RUYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBccGl2b3RccGl2b3Rmb3JyZWFkLnhsc3giKSk7Ci0KLSAgICAgICAgICAgIHZhciBwaXZvdDEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1syXS5QaXZvdFRhYmxlc1swXTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBpdm90MS5GaWVsZHMuQ291bnQsIDI0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwaXZvdDEuUm93RmllbGRzLkNvdW50LCAzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwaXZvdDEuRGF0YUZpZWxkcy5Db3VudCwgNyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGl2b3QxLkNvbHVtbkZpZWxkcy5Db3VudCwgMCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChwaXZvdDEuRGF0YUZpZWxkc1sxXS5OYW1lLCAiU3VtIG9mIG4zIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocGl2b3QxLkZpZWxkc1syXS5Tb3J0LCBlU29ydFR5cGUuQXNjZW5kaW5nKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHBpdm90MS5EYXRhT25Sb3dzLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHZhciBwaXZvdDIgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1syXS5QaXZvdFRhYmxlc1swXTsKLSAgICAgICAgICAgIHZhciBwaXZvdDMgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1szXS5QaXZvdFRhYmxlc1swXTsKLQotICAgICAgICAgICAgdmFyIHBpdm90NCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzRdLlBpdm90VGFibGVzWzBdOwotICAgICAgICAgICAgdmFyIHBpdm90NSA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzVdLlBpdm90VGFibGVzWzBdOwotICAgICAgICAgICAgcGl2b3Q1LkNhY2hlRGVmaW5pdGlvbi5Tb3VyY2VSYW5nZSA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkNlbGxzWyJRMTpYMzAwIl07Ci0KLSAgICAgICAgICAgIHZhciBwaXZvdDYgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1s2XS5QaXZvdFRhYmxlc1swXTsKLQotICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtzaGVldHNbNl0uRHJhd2luZ3MuQWRkQ2hhcnQoImNoYXJ0MSIsIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydC5lQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRCwgcGl2b3Q2KTsKLQotICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXHBpdm90XHBpdm90Zm9ycmVhZF9uZXcueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3JlYXRlUGl2b3RNdWx0RGF0YSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIGZpID0gbmV3IEZpbGVJbmZvKEAiYzpcdGVtcFx0ZXN0Lnhsc3giKTsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKGZpKTsKLQotICAgICAgICAgICAgdmFyIHdzID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJEYXRhIik7Ci0gICAgICAgICAgICB2YXIgcHYgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBpdm90Iik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIkRhdGExIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMSJdLlZhbHVlID0gIkRhdGEyIjsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkEyIl0uVmFsdWUgPSAiMSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5WYWx1ZSA9ICIyIjsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiMyI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjMiXS5WYWx1ZSA9ICI0IjsKLQotICAgICAgICAgICAgd3MuU2VsZWN0KCJBMTpCMyIpOwotCi0gICAgICAgICAgICB2YXIgcHQgPSBwdi5QaXZvdFRhYmxlcy5BZGQocHYuU2VsZWN0ZWRSYW5nZSwgd3MuU2VsZWN0ZWRSYW5nZSwgIlBpdm90Iik7Ci0KLSAgICAgICAgICAgIHB0LlJvd0ZpZWxkcy5BZGQocHQuRmllbGRzWyJEYXRhMiJdKTsKLQotICAgICAgICAgICAgdmFyIGRmID0gcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWyJEYXRhMSJdKTsKLSAgICAgICAgICAgIGRmLkZ1bmN0aW9uID0gRGF0YUZpZWxkRnVuY3Rpb25zLkNvdW50OwotCi0gICAgICAgICAgICBkZiA9IHB0LkRhdGFGaWVsZHMuQWRkKHB0LkZpZWxkc1siRGF0YTEiXSk7Ci0gICAgICAgICAgICBkZi5GdW5jdGlvbiA9IERhdGFGaWVsZEZ1bmN0aW9ucy5TdW07Ci0KLSAgICAgICAgICAgIGRmID0gcHQuRGF0YUZpZWxkcy5BZGQocHQuRmllbGRzWyJEYXRhMSJdKTsKLSAgICAgICAgICAgIGRmLkZ1bmN0aW9uID0gRGF0YUZpZWxkRnVuY3Rpb25zLlN0ZERldjsKLSAgICAgICAgICAgIGRmLk5hbWUgPSAiRGF0QTFfMiI7Ci0KLSAgICAgICAgICAgIHBjay5TYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0QmFja2dyb3VuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImJhY2tpbWciKTsKLQotICAgICAgICAgICAgd3MuQmFja2dyb3VuZEltYWdlLkltYWdlID0gUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDE7Ci0gICAgICAgICAgICB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImJhY2tpbWcyIik7Ci0gICAgICAgICAgICB3cy5CYWNrZ3JvdW5kSW1hZ2UuU2V0RnJvbUZpbGUobmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsIlZlY3RvciBEcmF3aW5nLndtZiIpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0SGVhZGVyRm9vdGVySW1hZ2UoKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHZhciB3cyA9IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkhlYWRlckltYWdlIik7Ci0gICAgICAgICAgICB3cy5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICJCZWZvcmUgIjsKLSAgICAgICAgICAgIHZhciBpbWcgPSB3cy5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkluc2VydFBpY3R1cmUoUHJvcGVydGllcy5SZXNvdXJjZXMuVGVzdDEsIFBpY3R1cmVBbGlnbm1lbnQuQ2VudGVyZWQpOwotICAgICAgICAgICAgaW1nLlRpdGxlID0gIlJlbmFtZWQgSW1hZ2UiOwotICAgICAgICAgICAgaW1nLkdyYXlTY2FsZSA9IHRydWU7Ci0gICAgICAgICAgICBpbWcuQmlMZXZlbCA9IHRydWU7Ci0gICAgICAgICAgICBpbWcuR2FpbiA9IC41OwotICAgICAgICAgICAgaW1nLkdhbW1hID0gLjM1OwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW1nLldpZHRoLCA0MjYpOwotICAgICAgICAgICAgaW1nLldpZHRoIC89IDQ7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW1nLkhlaWdodCwgNDkuNSk7Ci0gICAgICAgICAgICBpbWcuSGVpZ2h0IC89IDQ7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaW1nLkxlZnQsIDApOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGltZy5Ub3AsIDApOwotICAgICAgICAgICAgd3MuSGVhZGVyRm9vdGVyLk9kZEhlYWRlci5DZW50ZXJlZFRleHQgKz0gIiBBZnRlciI7Ci0KLQotICAgICAgICAgICAgaW1nID0gd3MuSGVhZGVyRm9vdGVyLkV2ZW5Gb290ZXIuSW5zZXJ0UGljdHVyZShuZXcgRmlsZUluZm8oUGF0aC5Db21iaW5lKF9jbGlwYXJ0UGF0aCwiVmVjdG9yIERyYXdpbmcud21mIikpLCBQaWN0dXJlQWxpZ25tZW50LkxlZnQpOwotICAgICAgICAgICAgaW1nLlRpdGxlID0gIkRpc2tGaWxlIjsKLQotICAgICAgICAgICAgaW1nID0gd3MuSGVhZGVyRm9vdGVyLkZpcnN0SGVhZGVyLkluc2VydFBpY3R1cmUobmV3IEZpbGVJbmZvKFBhdGguQ29tYmluZShfY2xpcGFydFBhdGgsICJWZWN0b3IgRHJhd2luZzIuV01GIikpLCBQaWN0dXJlQWxpZ25tZW50LlJpZ2h0KTsKLSAgICAgICAgICAgIGltZy5UaXRsZSA9ICJEaXNrRmlsZTIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkE0MDAiXS5WYWx1ZSA9IDE7Ci0KLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5Db3B5KHdzLk5hbWUsICJDb3BpZWQgSGVhZGVySW1hZ2UiKTsKLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5hbWVkU3R5bGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdzU2hlZXQgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJOYW1lZFN0eWxlcyIpOwotCi0gICAgICAgICAgICB2YXIgZmlyc3ROYW1lZFN0eWxlID0KLSAgICAgICAgICAgICAgICBfcGNrLldvcmtib29rLlN0eWxlcy5DcmVhdGVOYW1lZFN0eWxlKCJ0ZW1wbGF0ZUZpcnN0Iik7Ci0KLSAgICAgICAgICAgIHZhciBzID0gZmlyc3ROYW1lZFN0eWxlLlN0eWxlOwotCi0gICAgICAgICAgICBzLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgIHMuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmVlbik7Ci0gICAgICAgICAgICBzLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyQ29udGludW91czsKLSAgICAgICAgICAgIHMuVmVydGljYWxBbGlnbm1lbnQgPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50LkNlbnRlcjsKLQotICAgICAgICAgICAgdmFyIHNlY29uZE5hbWVkU3R5bGUgPSBfcGNrLldvcmtib29rLlN0eWxlcy5DcmVhdGVOYW1lZFN0eWxlKCJmaXJzdCIsIGZpcnN0TmFtZWRTdHlsZS5TdHlsZSkuU3R5bGU7Ci0gICAgICAgICAgICBzZWNvbmROYW1lZFN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBzZWNvbmROYW1lZFN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIEJsYWNrIiwgOCkpOwotICAgICAgICAgICAgc2Vjb25kTmFtZWRTdHlsZS5Cb3JkZXIuQm90dG9tLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5NZWRpdW07Ci0gICAgICAgICAgICBzZWNvbmROYW1lZFN0eWxlLkJvcmRlci5MZWZ0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5NZWRpdW07Ci0KLSAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiVGV4dCBDZW50ZXIiOwotICAgICAgICAgICAgd3NTaGVldC5DZWxsc1siQjIiXS5TdHlsZU5hbWUgPSAiZmlyc3QiOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5TdHlsZXMuTmFtZWRTdHlsZXNbMF0uU3R5bGUuRm9udC5OYW1lID0gIkFyaWFsIjsKLQotICAgICAgICAgICAgdmFyIHJvd1N0eWxlID0gX3Bjay5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiUm93U3R5bGUiLCBmaXJzdE5hbWVkU3R5bGUuU3R5bGUpLlN0eWxlOwotICAgICAgICAgICAgcm93U3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuUGluayk7Ci0gICAgICAgICAgICB3c1NoZWV0LkNlbGxzLlN0eWxlTmFtZSA9ICJ0ZW1wbGF0ZUZpcnN0IjsKLSAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIkM1OkgxNSJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIkM1OkgxNSJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLk9yYW5nZVJlZCk7Ci0KLSAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIjMwOjM1Il0uU3R5bGVOYW1lID0gIlJvd1N0eWxlIjsKLSAgICAgICAgICAgIHZhciBjb2xTdHlsZSA9IF9wY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoImNvbHVtblN0eWxlIiwgZmlyc3ROYW1lZFN0eWxlLlN0eWxlKS5TdHlsZTsKLSAgICAgICAgICAgIGNvbFN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkNhZGV0Qmx1ZSk7Ci0KLSAgICAgICAgICAgIHdzU2hlZXQuQ2VsbHNbIkQ6RSJdLlN0eWxlTmFtZSA9ICJDb2x1bW5TdHlsZSI7Ci0gICAgICAgIH0KLSAgICAgICAgLy9bSWdub3JlXQotICAgICAgICAvL1tUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHlsZUZpbGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGaWxscyIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExOkMzIl0uU3R5bGUuRmlsbC5HcmFkaWVudC5UeXBlID0gRXhjZWxGaWxsR3JhZGllbnRUeXBlLkxpbmVhcjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpDMyJdLlN0eWxlLkZpbGwuR3JhZGllbnQuQ29sb3IxLlNldENvbG9yKENvbG9yLlJlZCk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6QzMiXS5TdHlsZS5GaWxsLkdyYWRpZW50LkNvbG9yMi5TZXRDb2xvcihDb2xvci5CbHVlKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLk1lZGl1bUdyYXk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gb3Jlc3RHcmVlbik7Ci0gICAgICAgICAgICB2YXIgciA9IHdzLkNlbGxzWyJBMjpBMyJdOwotICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LlR5cGUgPSBFeGNlbEZpbGxHcmFkaWVudFR5cGUuUGF0aDsKLSAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5MZWZ0ID0gMC43OwotICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LlJpZ2h0ID0gMC43OwotICAgICAgICAgICAgci5TdHlsZS5GaWxsLkdyYWRpZW50LlRvcCA9IDAuNzsKLSAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5Cb3R0b20gPSAwLjc7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWzQsIDEsIDQsIDM2MF0uU3R5bGUuRmlsbC5HcmFkaWVudC5UeXBlID0gRXhjZWxGaWxsR3JhZGllbnRUeXBlLlBhdGg7Ci0KLSAgICAgICAgICAgIGZvciAoZG91YmxlIGNvbCA9IDE7IGNvbCA8IDM2MDsgY29sKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgciA9IHdzLkNlbGxzWzQsIENvbnZlcnQuVG9JbnQzMihjb2wpXTsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuRGVncmVlID0gY29sOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5MZWZ0ID0gY29sIC8gMzYwOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5SaWdodCA9IGNvbCAvIDM2MDsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuVG9wID0gY29sIC8gMzYwOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5HcmFkaWVudC5Cb3R0b20gPSBjb2wgLyAzNjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByID0gd3MuQ2VsbHNbIkE1Il07Ci0gICAgICAgICAgICByLlN0eWxlLkZpbGwuR3JhZGllbnQuTGVmdCA9IC41MDsKLQotICAgICAgICAgICAgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGdWxsRmlsbHMiKTsKLSAgICAgICAgICAgIHdzLkNlbGxzLlN0eWxlLkZpbGwuR3JhZGllbnQuTGVmdCA9IDAuMjU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTEiXS5WYWx1ZSA9ICJ0ZXN0IjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlJpY2hUZXh0LkFkZCgiVGVzdCBydCIpOwotICAgICAgICAgICAgd3MuQ2VsbHMuQXV0b0ZpbHRlciA9IHRydWU7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwod3MuQ2VsbHNbIkExOkQ1Il0uVmFsdWUsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIFtJZ25vcmVdCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBCdWlsZEluU3R5bGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRGVmYXVsdCIpOwotICAgICAgICAgICAgd3MuQ2VsbHMuU3R5bGUuRm9udC5OYW1lID0gIkFyaWFsIjsKLSAgICAgICAgICAgIHdzLkNlbGxzLlN0eWxlLkZvbnQuU2l6ZSA9IDE1OwotICAgICAgICAgICAgd3MuQ2VsbHMuU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTWVkaXVtRGFzaGVkOwotICAgICAgICAgICAgdmFyIG4gPSBwY2suV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzWzBdOwotICAgICAgICAgICAgbi5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXkiOwotICAgICAgICAgICAgbi5TdHlsZS5Gb250Lk5hbWUgPSAiQXJpYWwiOwotICAgICAgICAgICAgbi5TdHlsZS5Gb250LlNpemUgPSAxNTsKLSAgICAgICAgICAgIG4uU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuRG90dGVkOwotICAgICAgICAgICAgbi5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7Ci0gICAgICAgICAgICBuLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgIG4uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7Ci0gICAgICAgICAgICBuLlN0eWxlLkJvcmRlci5Cb3R0b20uQ29sb3IuU2V0Q29sb3IoQ29sb3IuUmVkKTsKLSAgICAgICAgICAgIG4uU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXI7Ci0gICAgICAgICAgICBuLlN0eWxlLlZlcnRpY2FsQWxpZ25tZW50ID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXI7Ci0gICAgICAgICAgICBuLlN0eWxlLlRleHRSb3RhdGlvbiA9IDkwOwotICAgICAgICAgICAgd3MuQ2VsbHNbImExOmMzIl0uU3R5bGVOYW1lID0gIk5vcm1hbCI7Ci0gICAgICAgICAgICAvLyAgbi5DdXN0b21CdWlsZGluID0gdHJ1ZTsKLSAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxzdHlsZS54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIC8vW0lnbm9yZV0KLSAgICAgICAgLy9bVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQXV0b0ZpdENvbHVtbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJBdXRvZml0Iik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQTE6SDEiXS5WYWx1ZSA9ICJBdXRvIGZpdCBjb2x1bW4gdGhhdCBpcyB2ZWVlcnkgbG9uZy4uLiI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSAzMDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJDMSJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDQ1OwotICAgICAgICAgICAgd3MuQ2VsbHNbIkQxIl0uU3R5bGUuVGV4dFJvdGF0aW9uID0gNzU7Ci0gICAgICAgICAgICB3cy5DZWxsc1siRTEiXS5TdHlsZS5UZXh0Um90YXRpb24gPSA5MDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJGMSJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDEyMDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJHMSJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDEzNTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJIMSJdLlN0eWxlLlRleHRSb3RhdGlvbiA9IDE4MDsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpIMSJdLkF1dG9GaXRDb2x1bW5zKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgTW92ZWlzc3VlKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiQzpcdGVtcFxidWdcRm9ybXVsYUlzc3VlXFByZURlbGV0ZS54bHN4IikpOwotICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLkRlbGV0ZVJvdygyLCA0KTsKLSAgICAgICAgICAgIF9wY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcbW92ZS54bHN4IikpOwotICAgICAgICB9Ci0gICAgICAgIFtUZXN0TWV0aG9kLCBJZ25vcmVdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlbENvbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAIkM6XHRlbXBcYnVnXEZvcm11bGFJc3N1ZVxQcmVEZWxldGVDb2wueGxzeCIpKTsKLSAgICAgICAgICAgIF9wY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXS5EZWxldGVDb2x1bW4oNSwgMSk7Ci0gICAgICAgICAgICBfcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXG1vdmUueGxzeCIpKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNDb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oQCJDOlx0ZW1wXGJ1Z1xGb3JtdWxhSXNzdWVcUHJlRGVsZXRlQ29sLnhsc3giKSk7Ci0gICAgICAgICAgICBfcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uSW5zZXJ0Q29sdW1uKDQsIDUpOwotICAgICAgICAgICAgX3Bjay5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxtb3ZlLnhsc3giKSk7Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpbGVMb2NrZWRQcm9ibGVtKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcdXJsLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtzaGVldHNbMV0uRGVsZXRlUm93KDEsIDEpOwotICAgICAgICAgICAgICAgIHBjay5TYXZlKCk7Ci0gICAgICAgICAgICAgICAgcGNrLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1tJZ25vcmVdCi0gICAgICAgIC8vW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlPdmVyd3JpdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb3B5T3ZlcndyaXRlIik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDE7IGNvbCA8IDE1OyBjb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCAzMDsgcm93KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cy5TZXRWYWx1ZShyb3csIGNvbCwgImNlbGwgIiArIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhyb3csIGNvbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpQMzAiXS5Db3B5KHdzLkNlbGxzWyJCMSJdKTsKLSAgICAgICAgfQotICAgICAgICBbSWdub3JlXQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUnVuU2FtcGxlMCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8oQCJjOlx0ZW1wXGJ1Z1xzYW1wbGUwLnhsc3giKTsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5JbnNlcnRDb2x1bW4oMSwgMSk7Ci0KLSAgICAgICAgICAgICAgICBFeGNlbENvbHVtbiBlbnRpcmVDb2x1bW4gPSB3b3Jrc2hlZXQuQ29sdW1uKDEpOwotCi0gICAgICAgICAgICAgICAgdmFyIGxhc3QgPSB3b3Jrc2hlZXQuQ29sdW1uKDYpOwotICAgICAgICAgICAgICAgIGxhc3QuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIGxhc3QuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7Ci0gICAgICAgICAgICAgICAgbGFzdC5Db2x1bW5NYXggPSA3OwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5JbnNlcnRDb2x1bW4oNywgMSk7Ci0KLSAgICAgICAgICAgICAgICAvL3NhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCi0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgW0lnbm9yZV0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZXdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHdvcmtzaGVldCBlcnJvci54bHN4Iik7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3czEgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJzaGVldDEiKTsKLSAgICAgICAgICAgICAgICB2YXIgd3MyID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgic2hlZXQyIik7Ci0gICAgICAgICAgICAgICAgdmFyIHdzMyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MyIpOwotCi0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLk1vdmVUb1N0YXJ0KHdzMy5OYW1lKTsKLSAgICAgICAgICAgICAgICAvL3NhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCi0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ld0ZpbGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5EZWxldGUoMSk7Ci0gICAgICAgICAgICAgICAgdmFyIHdzMyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInNoZWV0MyIpOwotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ldyBGaWxlSW5mbyhAImM6XHRlbXBcYnVnXHdvcmtzaGVldCBlcnJvcl9zYXZlLnhsc3giKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBJc3N1ZTE1MjA3KCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBlcCA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxidWdcd29ya3NoZWV0IGVycm9yLnhsc3giKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3JrYm9vayB3YiA9IGVwLldvcmtib29rOwotCi0gICAgICAgICAgICAgICAgaWYgKHdiICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3MgPSB3Yi5Xb3Jrc2hlZXRzWzFdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh3cyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2RvIHNvbWV0aGluZyB3aXRoIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHdiLkRpc3Bvc2UoKTsKLQotICAgICAgICAgICAgICAgIH0gLy9pZiB3YiAhPSBudWxsCi0KLSAgICAgICAgICAgICAgICB3YiA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAvL2RvIHNvbWUgb3RoZXIgdGhpbmdzCi0KLSAgICAgICAgICAgICAgICAvL3J1bm5pbmcgdGhyb3VnaCB0aGlzIG5leHQgbGluZSBub3cgdGhyb3dzIHRoZSBudWxsIHJlZmVyZW5jZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAvL3NvIHRoZSBpbmJ1aWx0IGRpc3Bvc2UgbWV0aG9kIGRvZXNuJ3Qgd29yayBwcm9wZXJseS4KLSAgICAgICAgICAgIH0gLy91c2luZyAoRXhjZWxQYWNrYWdlIGVwID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oc29tZV9maWxlKSkKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIERhdGUxOTA0IFRlc3QgQ2FzZXMKLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3REYXRlMTkwNFdpdGhvdXRTZXR0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSAidGVzdDE5MDQueGxzeCI7Ci0gICAgICAgICAgICBEYXRlVGltZSBkYXRlVGVzdDEgPSBuZXcgRGF0ZVRpbWUoMjAwOCwgMiwgMjkpOwotICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QyID0gbmV3IERhdGVUaW1lKDE5NTAsIDExLCAzMCk7Ci0KLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkKLSAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShmaWxlKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3ID0gcGFjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgidGVzdCIpOwotICAgICAgICAgICAgdy5DZWxsc1sxLCAxLCAyLCAxXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSW5Gcm9tSUQoMTQpOwotICAgICAgICAgICAgdy5DZWxsc1sxLCAxXS5WYWx1ZSA9IGRhdGVUZXN0MTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMiwgMV0uVmFsdWUgPSBkYXRlVGVzdDI7Ci0gICAgICAgICAgICBwYWNrLlNhdmUoKTsKLQotCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFjazIgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3MiA9IHBhY2syLldvcmtib29rLldvcmtzaGVldHNbInRlc3QiXTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGVUZXN0MSwgdzIuQ2VsbHNbMSwgMV0uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGVUZXN0MiwgdzIuQ2VsbHNbMiwgMV0uVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3REYXRlMTkwNFdpdGhTZXR0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSAidGVzdDE5MDQueGxzeCI7Ci0gICAgICAgICAgICBEYXRlVGltZSBkYXRlVGVzdDEgPSBuZXcgRGF0ZVRpbWUoMjAwOCwgMiwgMjkpOwotICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QyID0gbmV3IERhdGVUaW1lKDE5NTAsIDExLCAzMCk7Ci0KLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkKLSAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShmaWxlKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBwYWNrLldvcmtib29rLkRhdGUxOTA0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMSwgMiwgMV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlEKDE0KTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMV0uVmFsdWUgPSBkYXRlVGVzdDE7Ci0gICAgICAgICAgICB3LkNlbGxzWzIsIDFdLlZhbHVlID0gZGF0ZVRlc3QyOwotICAgICAgICAgICAgcGFjay5TYXZlKCk7Ci0KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2syID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdzIgPSBwYWNrMi5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJ0ZXN0Il07Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDEsIHcyLkNlbGxzWzEsIDFdLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDIsIHcyLkNlbGxzWzIsIDFdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGF0ZTE5MDRTZXRBbmRSZW1vdmVTZXR0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSAidGVzdDE5MDQueGxzeCI7Ci0gICAgICAgICAgICBEYXRlVGltZSBkYXRlVGVzdDEgPSBuZXcgRGF0ZVRpbWUoMjAwOCwgMiwgMjkpOwotICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QyID0gbmV3IERhdGVUaW1lKDE5NTAsIDExLCAzMCk7Ci0KLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkKLSAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShmaWxlKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBwYWNrLldvcmtib29rLkRhdGUxOTA0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMSwgMiwgMV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlEKDE0KTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMV0uVmFsdWUgPSBkYXRlVGVzdDE7Ci0gICAgICAgICAgICB3LkNlbGxzWzIsIDFdLlZhbHVlID0gZGF0ZVRlc3QyOwotICAgICAgICAgICAgcGFjay5TYXZlKCk7Ci0KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2syID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOwotICAgICAgICAgICAgcGFjazIuV29ya2Jvb2suRGF0ZTE5MDQgPSBmYWxzZTsKLSAgICAgICAgICAgIHBhY2syLlNhdmUoKTsKLQotCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFjazMgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3MyA9IHBhY2szLldvcmtib29rLldvcmtzaGVldHNbInRlc3QiXTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGVUZXN0MS5BZGREYXlzKDM2NS41ICogLTQpLCB3My5DZWxsc1sxLCAxXS5WYWx1ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0ZVRlc3QyLkFkZERheXMoMzY1LjUgKiAtNCksIHczLkNlbGxzWzIsIDFdLlZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGF0ZTE5MDRTZXRBbmRTZXRTZXR0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSAidGVzdDE5MDQueGxzeCI7Ci0gICAgICAgICAgICBEYXRlVGltZSBkYXRlVGVzdDEgPSBuZXcgRGF0ZVRpbWUoMjAwOCwgMiwgMjkpOwotICAgICAgICAgICAgRGF0ZVRpbWUgZGF0ZVRlc3QyID0gbmV3IERhdGVUaW1lKDE5NTAsIDExLCAzMCk7Ci0KLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkKLSAgICAgICAgICAgICAgICBGaWxlLkRlbGV0ZShmaWxlKTsKLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhmaWxlKSk7Ci0gICAgICAgICAgICBwYWNrLldvcmtib29rLkRhdGUxOTA0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdyA9IHBhY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMSwgMiwgMV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlEKDE0KTsKLSAgICAgICAgICAgIHcuQ2VsbHNbMSwgMV0uVmFsdWUgPSBkYXRlVGVzdDE7Ci0gICAgICAgICAgICB3LkNlbGxzWzIsIDFdLlZhbHVlID0gZGF0ZVRlc3QyOwotICAgICAgICAgICAgcGFjay5TYXZlKCk7Ci0KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2syID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOwotICAgICAgICAgICAgcGFjazIuV29ya2Jvb2suRGF0ZTE5MDQgPSB0cnVlOyAgLy8gT25seSB0aGUgY2VsbHMgbXVzdCBiZSB1cGRhdGVkIHdoZW4gdGhpcyBjaGFuZ2UsIGlmIHNldCB0aGUgc2FtZSBub3RoaW5nIG11c3QgY2hhbmdlCi0gICAgICAgICAgICBwYWNrMi5TYXZlKCk7Ci0KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBhY2szID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oZmlsZSkpOwotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgdzMgPSBwYWNrMy5Xb3JrYm9vay5Xb3Jrc2hlZXRzWyJ0ZXN0Il07Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDEsIHczLkNlbGxzWzEsIDFdLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGVzdDIsIHczLkNlbGxzWzIsIDFdLlZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBbVGVzdE1ldGhvZCwgSWdub3JlXQotICAgICAgICBwdWJsaWMgdm9pZCBTYXZlVG9TdHJlYW0oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShGaWxlLlJlYWRBbGxCeXRlcyhAImM6XHRlbXBcYm9vazEueGxzeCIpKTsKLSAgICAgICAgICAgIHZhciBleGNlbFBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKHN0cmVhbSk7Ci0gICAgICAgICAgICBleGNlbFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIGV4Y2VsUGFja2FnZS5TYXZlKCk7Ci0gICAgICAgICAgICB2YXIgcyA9IHN0cmVhbS5Ub0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgW1Rlc3RNZXRob2QsIElnbm9yZV0KLSAgICAgICAgcHVibGljIHZvaWQgQ29sdW1uc1Rlc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZXhjZWxQYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzID0gZXhjZWxQYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDb2x1bW5UZXN0Iik7Ci0KLQotICAgICAgICAgICAgZm9yICh2YXIgYyA9IDQ7IGMgPD0gMjA7IGMgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY29sID0gd3MuQ29sdW1uKGMpOwotICAgICAgICAgICAgICAgIGNvbC5Db2x1bW5NYXggPSBjICsgMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3MuQ29sdW1uKDMpLkhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICB3cy5Db2x1bW4oNikuSGlkZGVuID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNvbHVtbig5KS5IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgd3MuQ29sdW1uKDE1KS5IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgd3MuQ2VsbHNbImExOloxIl0uVmFsdWUgPSAiVGVzdCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siYTE6RkYzMyJdLkF1dG9GaXRDb2x1bW5zKDApOwotICAgICAgICAgICAgd3MuQ29sdW1uKDI2KS5Db2x1bW5NYXggPSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1uczsKLSAgICAgICAgICAgIGV4Y2VsUGFja2FnZS5TYXZlQXMobmV3IEZpbGVJbmZvKEAiYzpcdGVtcFxhdXRvZml0Lnhsc3giKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgQ29tbWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXRCYXNlKCk7Ci0gICAgICAgICAgICB2YXIgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdmFyIHdzMSA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29tbWVudDEiKTsKLSAgICAgICAgICAgIHdzMS5DZWxsc1sxLCAxXS5BZGRDb21tZW50KCJUZXN0aW5nIiwgInRlc3QxIik7Ci0KLSAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKF93b3Jrc2hlZXRQYXRoICsgImNvbW1lbnQueGxzeCIpKTsKLQotICAgICAgICAgICAgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oX3dvcmtzaGVldFBhdGggKyAiY29tbWVudC54bHN4IikpOwotICAgICAgICAgICAgdmFyIHdzMiA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgd3MyLkNlbGxzWzEsIDJdLkFkZENvbW1lbnQoIlRlc3RpbmciLCAidGVzdDEiKTsKLSAgICAgICAgICAgIHBjay5TYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvV29ya2Jvb2tzL0Zvcm11bGFUZXN0Lnhsc3ggYi9FUFBsdXNUZXN0L1dvcmtib29rcy9Gb3JtdWxhVGVzdC54bHN4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FhMzA0Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvV29ya2Jvb2tzL0Zvcm11bGFUZXN0Lnhsc3gKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9FUFBsdXNUZXN0L1dvcmtib29rcy9NdWx0aUNvbG9yQ29uZGl0aW9uYWxGb3JtYXR0aW5nLnhsc3ggYi9FUFBsdXNUZXN0L1dvcmtib29rcy9NdWx0aUNvbG9yQ29uZGl0aW9uYWxGb3JtYXR0aW5nLnhsc3gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjk2NzcuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Xb3JrYm9va3MvTXVsdGlDb2xvckNvbmRpdGlvbmFsRm9ybWF0dGluZy54bHN4CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9Xb3JrYm9va3MvVkJBRGVjb21wcmVzc0J1Zy54bHNtIGIvRVBQbHVzVGVzdC9Xb3JrYm9va3MvVkJBRGVjb21wcmVzc0J1Zy54bHNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RkMzA2Li4wMDAwMDAwCi0tLSBhL0VQUGx1c1Rlc3QvV29ya2Jvb2tzL1ZCQURlY29tcHJlc3NCdWcueGxzbQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0VQUGx1c1Rlc3QvV29ya3NoZWV0c1Rlc3RzLmNzIGIvRVBQbHVzVGVzdC9Xb3Jrc2hlZXRzVGVzdHMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2VlOWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzVGVzdC9Xb3Jrc2hlZXRzVGVzdHMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci0KLW5hbWVzcGFjZSBFUFBsdXNUZXN0Ci17Ci0JW1Rlc3RDbGFzc10KLQlwdWJsaWMgY2xhc3MgV29ya3NoZWV0c1Rlc3RzCi0JewotCQlwcml2YXRlIEV4Y2VsUGFja2FnZSBwYWNrYWdlOwotCQlwcml2YXRlIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2s7Ci0KLQkJW1Rlc3RJbml0aWFsaXplXQotCQlwdWJsaWMgdm9pZCBUZXN0SW5pdGlhbGl6ZSgpCi0JCXsKLQkJCXBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0JCQl3b3JrYm9vayA9IHBhY2thZ2UuV29ya2Jvb2s7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMSIpOwotCQl9Ci0KLQkJW1Rlc3RNZXRob2RdCi0JCXB1YmxpYyB2b2lkIENvbmZpcm1GaWxlU3RydWN0dXJlKCkKLQkJewotCQkJQXNzZXJ0LklzTm90TnVsbChwYWNrYWdlLCAiUGFja2FnZSBub3QgY3JlYXRlZCIpOwotCQkJQXNzZXJ0LklzTm90TnVsbCh3b3JrYm9vaywgIk5vIHdvcmtib29rIGZvdW5kIik7Ci0JCX0KLQotCQlbVGVzdE1ldGhvZF0KLQkJcHVibGljIHZvaWQgU2hvdWxkQmVBYmxlVG9EZWxldGVBbmRUaGVuQWRkKCkKLQkJewotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuRGVsZXRlKDEpOwotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzMiKTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBEZWxldGVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cygpCi0JCXsKLQkJICAgIHdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSgiTkVXMiIpOwotICAgICAgICB9Ci0KLQkJW1Rlc3RNZXRob2QsIEV4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotCQlwdWJsaWMgdm9pZCBEZWxldGVCeU5hbWVXaGVyZVdvcmtTaGVldERvZXNOb3RFeGlzdCgpCi0JCXsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkRlbGV0ZSgiTkVXMyIpOwotCQl9Ci0KLQkJW1Rlc3RNZXRob2RdCi0JCXB1YmxpYyB2b2lkIE1vdmVCZWZvcmVCeU5hbWVXaGVyZVdvcmtTaGVldEV4aXN0cygpCi0JCXsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVcyIik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMyIpOwotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzQiKTsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVc1Iik7Ci0KLQkJCXdvcmtib29rLldvcmtzaGVldHMuTW92ZUJlZm9yZSgiTkVXNCIsICJORVcyIik7Ci0KLQkJCUNvbXBhcmVPcmRlck9mV29ya3NoZWV0c0FmdGVyU2F2aW5nKHBhY2thZ2UpOwotCQl9Ci0KLQkJW1Rlc3RNZXRob2RdCi0JCXB1YmxpYyB2b2lkIE1vdmVBZnRlckJ5TmFtZVdoZXJlV29ya1NoZWV0RXhpc3RzKCkKLQkJewotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVczIik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNCIpOwotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzUiKTsKLQotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5Nb3ZlQWZ0ZXIoIk5FVzQiLCAiTkVXMiIpOwotCi0JCQlDb21wYXJlT3JkZXJPZldvcmtzaGVldHNBZnRlclNhdmluZyhwYWNrYWdlKTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBNb3ZlQmVmb3JlQnlQb3NpdGlvbldoZXJlV29ya1NoZWV0RXhpc3RzKCkKLQkJewotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzIiKTsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVczIik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNCIpOwotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzUiKTsKLQotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5Nb3ZlQmVmb3JlKDQsIDIpOwotCi0JCQlDb21wYXJlT3JkZXJPZldvcmtzaGVldHNBZnRlclNhdmluZyhwYWNrYWdlKTsKLQkJfQotCi0JCVtUZXN0TWV0aG9kXQotCQlwdWJsaWMgdm9pZCBNb3ZlQWZ0ZXJCeVBvc2l0aW9uV2hlcmVXb3JrU2hlZXRFeGlzdHMoKQotCQl7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXMiIpOwotCQkJd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIk5FVzMiKTsKLQkJCXdvcmtib29rLldvcmtzaGVldHMuQWRkKCJORVc0Iik7Ci0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiTkVXNSIpOwotCi0JCQl3b3JrYm9vay5Xb3Jrc2hlZXRzLk1vdmVBZnRlcig0LCAyKTsKLQotCQkJQ29tcGFyZU9yZGVyT2ZXb3Jrc2hlZXRzQWZ0ZXJTYXZpbmcocGFja2FnZSk7Ci0JCX0KLSAgICAgICAgI3JlZ2lvbiBEZWxldGUgQ29sdW1uIHdpdGggU2F2ZSBUZXN0cwotCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIE91dHB1dERpcmVjdG9yeSA9IEAiZDpcdGVtcFwiOwotCi0gICAgICAgIFtUZXN0TWV0aG9kXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVGaXJzdENvbHVtbkluUmFuZ2VDb2x1bW5TaG91bGRCZURlbGV0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdXNpbmcgKAotICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbigxKTsKLSAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKE91dHB1dERpcmVjdG9yeSArICJBZnRlckRlbGV0ZUNvbHVtbi54bHN4IikpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGl0bGUiLCB3c0RhdGEuQ2VsbHNbIkExIl0uVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IE5hbWUiLCB3c0RhdGEuQ2VsbHNbIkIxIl0uVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZhbWlseSBOYW1lIiwgd3NEYXRhLkNlbGxzWyJDMSJdLlRleHQpOwotICAgICAgICB9Ci0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlTGFzdENvbHVtbkluUmFuZ2VDb2x1bW5TaG91bGRCZURlbGV0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdXNpbmcgKAotICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbig0KTsKLSAgICAgICAgICAgIHBjay5TYXZlQXMobmV3IEZpbGVJbmZvKE91dHB1dERpcmVjdG9yeSArICJBZnRlckRlbGV0ZUNvbHVtbi54bHN4IikpOwotCi0gICAgICAgICAgICAvLyBBc3NlcnQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiSWQiLCB3c0RhdGEuQ2VsbHNbIkExIl0uVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlRpdGxlIiwgd3NEYXRhLkNlbGxzWyJCMSJdLlRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGaXJzdCBOYW1lIiwgd3NEYXRhLkNlbGxzWyJDMSJdLlRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RNZXRob2RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUNvbHVtbkFmdGVyTm9ybWFsUmFuZ2VTaGVldFNob3VsZFJlbWFpblVuY2hhbmdlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB1c2luZyAoCi0gICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDUpOwotICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oT3V0cHV0RGlyZWN0b3J5ICsgIkFmdGVyRGVsZXRlQ29sdW1uLnhsc3giKSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJJZCIsIHdzRGF0YS5DZWxsc1siQTEiXS5UZXh0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiVGl0bGUiLCB3c0RhdGEuQ2VsbHNbIkIxIl0uVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZpcnN0IE5hbWUiLCB3c0RhdGEuQ2VsbHNbIkMxIl0uVGV4dCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkZhbWlseSBOYW1lIiwgd3NEYXRhLkNlbGxzWyJEMSJdLlRleHQpOwotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW5CZWZvcmVSYW5nZU1pbWl0VGhyb3dzQXJndW1lbnRFeGNlcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBcnJhbmdlCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgdXNpbmcgKAotICAgICAgICAgICAgICAgIFN0cmVhbSBmaWxlID0KLSAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHkuR2V0RXhlY3V0aW5nQXNzZW1ibHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgLkdldE1hbmlmZXN0UmVzb3VyY2VTdHJlYW0oIkVQUGx1c1Rlc3QuVGVzdFdvcmtib29rcy5QcmVEZWxldGVDb2x1bW4ueGxzIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGNrLkxvYWQoZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgd3NEYXRhID0gcGNrLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0KLSAgICAgICAgICAgIC8vIEFjdAotICAgICAgICAgICAgd3NEYXRhLkRlbGV0ZUNvbHVtbigwKTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuRmFpbCgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihBcmd1bWVudEV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW5BZnRlclJhbmdlTGltaXRUaHJvd3NBcmd1bWVudEV4Y2VwdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB1c2luZyAoCi0gICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDE2Mzg1KTsKLQotICAgICAgICAgICAgLy8gQXNzZXJ0Ci0gICAgICAgICAgICBBc3NlcnQuRmFpbCgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlRmlyc3RUd29Db2x1bW5zRnJvbVJhbmdlQ29sdW1uc1Nob3VsZEJlRGVsZXRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFycmFuZ2UKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB1c2luZyAoCi0gICAgICAgICAgICAgICAgU3RyZWFtIGZpbGUgPQotICAgICAgICAgICAgICAgICAgICBBc3NlbWJseS5HZXRFeGVjdXRpbmdBc3NlbWJseSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuR2V0TWFuaWZlc3RSZXNvdXJjZVN0cmVhbSgiRVBQbHVzVGVzdC5UZXN0V29ya2Jvb2tzLlByZURlbGV0ZUNvbHVtbi54bHMiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2suTG9hZChmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLQotICAgICAgICAgICAgLy8gQWN0Ci0gICAgICAgICAgICB3c0RhdGEuRGVsZXRlQ29sdW1uKDEsIDIpOwotICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8oT3V0cHV0RGlyZWN0b3J5ICsgIkFmdGVyRGVsZXRlQ29sdW1uLnhsc3giKSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc2VydAotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGaXJzdCBOYW1lIiwgd3NEYXRhLkNlbGxzWyJBMSJdLlRleHQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGYW1pbHkgTmFtZSIsIHdzRGF0YS5DZWxsc1siQjEiXS5UZXh0KTsKLQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBbVGVzdE1ldGhvZF0KLSAgICAgICAgcHVibGljIHZvaWQgUmFuZ2VDbGVhck1ldGhvZFNob3VsZE5vdENsZWFyU3Vycm91bmRpbmdDZWxscygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3a3MgID0gd29ya2Jvb2suV29ya3NoZWV0cy5BZGQoInRlc3QiKTsKLSAgICAgICAgICAgIHdrcy5DZWxsc1syLCAyXS5WYWx1ZSA9ICJzb21ldGhpbmciOwotICAgICAgICAgICAgd2tzLkNlbGxzWzIsIDNdLlZhbHVlID0gInNvbWV0aGluZyI7Ci0KLSAgICAgICAgICAgIHdrcy5DZWxsc1syLCAzXS5DbGVhcigpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHdrcy5DZWxsc1syLCAyXS5WYWx1ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInNvbWV0aGluZyIsIHdrcy5DZWxsc1syLCAyXS5WYWx1ZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHdrcy5DZWxsc1syLCAzXS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENvbXBhcmVPcmRlck9mV29ya3NoZWV0c0FmdGVyU2F2aW5nKEV4Y2VsUGFja2FnZSBlZGl0ZWRQYWNrYWdlKQotCQl7Ci0JCQl2YXIgcGFja2FnZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLQkJCWVkaXRlZFBhY2thZ2UuU2F2ZUFzKHBhY2thZ2VTdHJlYW0pOwotCi0JCQl2YXIgbmV3UGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UocGFja2FnZVN0cmVhbSk7Ci0JCQl2YXIgcG9zaXRpb25JZCA9IDE7Ci0JCQlmb3JlYWNoICh2YXIgd29ya3NoZWV0IGluIGVkaXRlZFBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cykKLQkJCXsKLQkJCQlBc3NlcnQuQXJlRXF1YWwod29ya3NoZWV0Lk5hbWUsIG5ld1BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1twb3NpdGlvbklkXS5OYW1lLCAiV29ya3NoZWV0cyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyIik7Ci0JCQkJcG9zaXRpb25JZCsrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzVGVzdC9wYWNrYWdlcy5jb25maWcgYi9FUFBsdXNUZXN0L3BhY2thZ2VzLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5YjhkOC4uMDAwMDAwMAotLS0gYS9FUFBsdXNUZXN0L3BhY2thZ2VzLmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxwYWNrYWdlcz4KLSAgPHBhY2thZ2UgaWQ9IlJoaW5vTW9ja3MiIHZlcnNpb249IjMuNi4xIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQwIiAvPgotPC9wYWNrYWdlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4IGIvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmMTFiZC4uMDAwMDAwMAotLS0gYS9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAot77u/PCVAIFBhZ2UgTGFuZ3VhZ2U9IkMjIiBBdXRvRXZlbnRXaXJldXA9InRydWUiIENvZGVCZWhpbmQ9IkRlZmF1bHQuYXNweC5jcyIgSW5oZXJpdHM9IkVQUGx1c1dlYlNhbXBsZS5fRGVmYXVsdCIgJT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgPgotPGhlYWQgcnVuYXQ9InNlcnZlciI+Ci0gICAgPHRpdGxlPkVQUGx1cyBXZWJzYW1wbGU8L3RpdGxlPgotICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgIGJvZHkKLSAgICB7Ci0gICAgICAgIEJBQ0tHUk9VTkQtQ09MT1I6I0ZGRkZGRjsKLSAgICAgICAgQ09MT1I6ICMxMTExMTE7Ci0gICAgICAgIEZPTlQtRkFNSUxZOiBBcmlhbDsKLSAgICAgICAgZm9udC1zaXplOiBsYXJnZTsKLSAgICAgICAgbWFyZ2luLXRvcDogMXB4Ci0gICAgfQotICAgIHRhYmxlCi0gICAgewotICAgICAgICBGT05ULUZBTUlMWTogQXJpYWw7Ci0gICAgICAgIEZPTlQtU0laRTogbWVkaXVtCi0gICAgfSAgICAKLUE6bGluayB7Y29sb3I6IzAwMzM5OTt9Ci1BOnZpc2l0ZWQge2NvbG9yOiMwMDMzOTk7fQotQTpob3Zlcntjb2xvcjojQ0M2Njk5fQotCi0gICA8L3N0eWxlPgotPC9oZWFkPgotPGJvZHk+Ci0gICAgPGZvcm0gaWQ9ImZvcm0xIiBydW5hdD0ic2VydmVyIj4KLSAgICA8aDE+RVBQbHVzIFdlYiBzYW1wbGVzPC9oMT4KLSAgICAgICAgPGgzPlRoZSB3ZWIgc2FtcGxlIHByb2plY3Qgc2hvd3MgYSBmZXcgZGlmZmVyZW50IHdheXMgdG8gc2VuZCBhIHdvcmtib29rIHRvIHRoZSBjbGllbnQuIDwvaDM+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8YXNwOkh5cGVyTGluayBJRD0ic2FtcGxlMSIgcnVuYXQ9InNlcnZlciIgTmF2aWdhdGVVcmw9In4vR2V0U2FtcGxlLmFzcHg/U2FtcGxlPTEiPlNhbXBsZSAxPC9hc3A6SHlwZXJMaW5rPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG91dHB1dCBhIHNwcmVhZHNoZWV0IHVzaW5nIHRoZSBTYXZlQXMoUmVwb25zZS5PdXRwdXRTdGVhbSkgbWV0aG9kLgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPGFzcDpIeXBlckxpbmsgSUQ9InNhbXBsZTIiIHJ1bmF0PSJzZXJ2ZXIiIE5hdmlnYXRlVXJsPSJ+L0dldFNhbXBsZS5hc3B4P1NhbXBsZT0yIj5TYW1wbGUgMjwvYXNwOkh5cGVyTGluaz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgICAgVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvdXRwdXQgYSBzcHJlYWRzaGVldCB1c2luZyB0aGUgUmVzcG9uc2UuQmluYXJ5V3JpdGUocGNrLkdldEFzQnl0ZUFycmF5KCkpLgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPGFzcDpIeXBlckxpbmsgSUQ9InNhbXBsZTMiIHJ1bmF0PSJzZXJ2ZXIiIE5hdmlnYXRlVXJsPSJ+L0dldFNhbXBsZS5hc3B4P1NhbXBsZT0zIj5TYW1wbGUgMzwvYXNwOkh5cGVyTGluaz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgICAgVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSB0ZW1wbGF0ZSBzdG9yZWQgaW4gdGhlIEFwcGxpY2F0aW9uIGNhc2hlLgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgPGFzcDpIeXBlckxpbmsgSUQ9InNhbXBsZTQiIHJ1bmF0PSJzZXJ2ZXIiIE5hdmlnYXRlVXJsPSJ+L0dldFNhbXBsZS5hc3B4P1NhbXBsZT00Ij5TYW1wbGUgNDwvYXNwOkh5cGVyTGluaz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgICAgVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgYSBtYWNyby1lbmFibGVkIHNwcmVhZHNoZWV0LgotICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHguY3MgYi9FUFBsdXNXZWJTYW1wbGUvRGVmYXVsdC5hc3B4LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2QxMGVjLi4wMDAwMDAwCi0tLSBhL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHguY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5XZWI7Ci11c2luZyBTeXN0ZW0uV2ViLlVJOwotdXNpbmcgU3lzdGVtLldlYi5VSS5XZWJDb250cm9sczsKLQotbmFtZXNwYWNlIEVQUGx1c1dlYlNhbXBsZQotewotICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIF9EZWZhdWx0IDogU3lzdGVtLldlYi5VSS5QYWdlCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQYWdlX0xvYWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweC5kZXNpZ25lci5jcyBiL0VQUGx1c1dlYlNhbXBsZS9EZWZhdWx0LmFzcHguZGVzaWduZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzY0ZjYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzV2ViU2FtcGxlL0RlZmF1bHQuYXNweC5kZXNpZ25lci5jcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLe+7vy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyA8YXV0by1nZW5lcmF0ZWQ+Ci0vLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLgotLy8KLS8vICAgICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYKLS8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4gCi0vLyA8L2F1dG8tZ2VuZXJhdGVkPgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIEVQUGx1c1dlYlNhbXBsZSB7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgX0RlZmF1bHQgewotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gZm9ybTEgY29udHJvbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gQXV0by1nZW5lcmF0ZWQgZmllbGQuCi0gICAgICAgIC8vLyBUbyBtb2RpZnkgbW92ZSBmaWVsZCBkZWNsYXJhdGlvbiBmcm9tIGRlc2lnbmVyIGZpbGUgdG8gY29kZS1iZWhpbmQgZmlsZS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHJvdGVjdGVkIGdsb2JhbDo6U3lzdGVtLldlYi5VSS5IdG1sQ29udHJvbHMuSHRtbEZvcm0gZm9ybTE7Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBzYW1wbGUxIGNvbnRyb2wuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGZpZWxkLgotICAgICAgICAvLy8gVG8gbW9kaWZ5IG1vdmUgZmllbGQgZGVjbGFyYXRpb24gZnJvbSBkZXNpZ25lciBmaWxlIHRvIGNvZGUtYmVoaW5kIGZpbGUuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHByb3RlY3RlZCBnbG9iYWw6OlN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuSHlwZXJMaW5rIHNhbXBsZTE7Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBzYW1wbGUyIGNvbnRyb2wuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGZpZWxkLgotICAgICAgICAvLy8gVG8gbW9kaWZ5IG1vdmUgZmllbGQgZGVjbGFyYXRpb24gZnJvbSBkZXNpZ25lciBmaWxlIHRvIGNvZGUtYmVoaW5kIGZpbGUuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHByb3RlY3RlZCBnbG9iYWw6OlN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuSHlwZXJMaW5rIHNhbXBsZTI7Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBzYW1wbGUzIGNvbnRyb2wuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGZpZWxkLgotICAgICAgICAvLy8gVG8gbW9kaWZ5IG1vdmUgZmllbGQgZGVjbGFyYXRpb24gZnJvbSBkZXNpZ25lciBmaWxlIHRvIGNvZGUtYmVoaW5kIGZpbGUuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHByb3RlY3RlZCBnbG9iYWw6OlN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuSHlwZXJMaW5rIHNhbXBsZTM7Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBzYW1wbGU0IGNvbnRyb2wuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGZpZWxkLgotICAgICAgICAvLy8gVG8gbW9kaWZ5IG1vdmUgZmllbGQgZGVjbGFyYXRpb24gZnJvbSBkZXNpZ25lciBmaWxlIHRvIGNvZGUtYmVoaW5kIGZpbGUuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHByb3RlY3RlZCBnbG9iYWw6OlN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMuSHlwZXJMaW5rIHNhbXBsZTQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL0VQUGx1c1dlYlNhbXBsZS5jc3Byb2ogYi9FUFBsdXNXZWJTYW1wbGUvRVBQbHVzV2ViU2FtcGxlLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxODg5Yi4uMDAwMDAwMAotLS0gYS9FUFBsdXNXZWJTYW1wbGUvRVBQbHVzV2ViU2FtcGxlLmNzcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+Ci0gICAgPFByb2plY3RHdWlkPnsxQkYzMEE1Mi02MTQ5LTQzMkQtODJGNi03MjUyNTBFNUM2NjJ9PC9Qcm9qZWN0R3VpZD4KLSAgICA8UHJvamVjdFR5cGVHdWlkcz57MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4KLSAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5FUFBsdXNXZWJTYW1wbGU8L1Jvb3ROYW1lc3BhY2U+Ci0gICAgPEFzc2VtYmx5TmFtZT5FUFBsdXNXZWJTYW1wbGU8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlVXBncmFkZUZsYWdzPgotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KLSAgICA8T2xkVG9vbHNWZXJzaW9uPjQuMDwvT2xkVG9vbHNWZXJzaW9uPgotICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24+Ci0gICAgPC9VcGdyYWRlQmFja3VwTG9jYXRpb24+Ci0gICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGUgLz4KLSAgICA8VXNlSUlTRXhwcmVzcz5mYWxzZTwvVXNlSUlTRXhwcmVzcz4KLSAgICA8SUlTRXhwcmVzc1NTTFBvcnQgLz4KLSAgICA8SUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uPmRpc2FibGVkPC9JSVNFeHByZXNzQW5vbnltb3VzQXV0aGVudGljYXRpb24+Ci0gICAgPElJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24+ZW5hYmxlZDwvSUlTRXhwcmVzc1dpbmRvd3NBdXRoZW50aWNhdGlvbj4KLSAgICA8SUlTRXhwcmVzc1VzZUNsYXNzaWNQaXBlbGluZU1vZGU+ZmFsc2U8L0lJU0V4cHJlc3NVc2VDbGFzc2ljUGlwZWxpbmVNb2RlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8U2lnbkFzc2VtYmx5PnRydWU8L1NpZ25Bc3NlbWJseT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkR5bmFtaWNEYXRhIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5FbnRpdHkiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvbmZpZ3VyYXRpb24iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLlNlcnZpY2VzIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkVudGVycHJpc2VTZXJ2aWNlcyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuTW9iaWxlIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29udGVudCBJbmNsdWRlPSJEZWZhdWx0LmFzcHgiIC8+Ci0gICAgPENvbnRlbnQgSW5jbHVkZT0iR2V0U2FtcGxlLmFzcHgiIC8+Ci0gICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLmNvbmZpZyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRGVmYXVsdC5hc3B4LmNzIj4KLSAgICAgIDxTdWJUeXBlPkFTUFhDb2RlQmVoaW5kPC9TdWJUeXBlPgotICAgICAgPERlcGVuZGVudFVwb24+RGVmYXVsdC5hc3B4PC9EZXBlbmRlbnRVcG9uPgotICAgIDwvQ29tcGlsZT4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWZhdWx0LmFzcHguZGVzaWduZXIuY3MiPgotICAgICAgPERlcGVuZGVudFVwb24+RGVmYXVsdC5hc3B4PC9EZXBlbmRlbnRVcG9uPgotICAgIDwvQ29tcGlsZT4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZXRTYW1wbGUuYXNweC5jcyI+Ci0gICAgICA8RGVwZW5kZW50VXBvbj5HZXRTYW1wbGUuYXNweDwvRGVwZW5kZW50VXBvbj4KLSAgICAgIDxTdWJUeXBlPkFTUFhDb2RlQmVoaW5kPC9TdWJUeXBlPgotICAgIDwvQ29tcGlsZT4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJHZXRTYW1wbGUuYXNweC5kZXNpZ25lci5jcyI+Ci0gICAgICA8RGVwZW5kZW50VXBvbj5HZXRTYW1wbGUuYXNweDwvRGVwZW5kZW50VXBvbj4KLSAgICA8L0NvbXBpbGU+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxGb2xkZXIgSW5jbHVkZT0iQXBwX0RhdGFcIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxFUFBsdXNcRVBQbHVzLmNzcHJvaiI+Ci0gICAgICA8UHJvamVjdD57N0IyODgwMjYtNTUwMi00QTM5LUJGNDEtNzdFMDg2RjNFNEEzfTwvUHJvamVjdD4KLSAgICAgIDxOYW1lPkVQUGx1czwvTmFtZT4KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8VmlzdWFsU3R1ZGlvVmVyc2lvbiBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnJyI+MTAuMDwvVmlzdWFsU3R1ZGlvVmVyc2lvbj4KLSAgICA8VlNUb29sc1BhdGggQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknID09ICcnIj4kKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYkKFZpc3VhbFN0dWRpb1ZlcnNpb24pPC9WU1Rvb2xzUGF0aD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZSA0LjB8QW55Q1BVJyI+Ci0gICAgPE91dHB1dFBhdGg+YmluXDwvT3V0cHV0UGF0aD4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoVlNUb29sc1BhdGgpXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknICE9ICcnIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoMzIpXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cdjEwLjBcV2ViQXBwbGljYXRpb25zXE1pY3Jvc29mdC5XZWJBcHBsaWNhdGlvbi50YXJnZXRzIiBDb25kaXRpb249ImZhbHNlIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgotICA8L1RhcmdldD4KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIC0tPgotICA8UHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgPFZpc3VhbFN0dWRpbz4KLSAgICAgIDxGbGF2b3JQcm9wZXJ0aWVzIEdVSUQ9InszNDljNTg1MS02NWRmLTExZGEtOTM4NC0wMDA2NWI4NDZmMjF9Ij4KLSAgICAgICAgPFdlYlByb2plY3RQcm9wZXJ0aWVzPgotICAgICAgICAgIDxVc2VJSVM+RmFsc2U8L1VzZUlJUz4KLSAgICAgICAgICA8QXV0b0Fzc2lnblBvcnQ+VHJ1ZTwvQXV0b0Fzc2lnblBvcnQ+Ci0gICAgICAgICAgPERldmVsb3BtZW50U2VydmVyUG9ydD44NTQ0PC9EZXZlbG9wbWVudFNlcnZlclBvcnQ+Ci0gICAgICAgICAgPERldmVsb3BtZW50U2VydmVyVlBhdGg+LzwvRGV2ZWxvcG1lbnRTZXJ2ZXJWUGF0aD4KLSAgICAgICAgICA8SUlTVXJsPgotICAgICAgICAgIDwvSUlTVXJsPgotICAgICAgICAgIDxOVExNQXV0aGVudGljYXRpb24+RmFsc2U8L05UTE1BdXRoZW50aWNhdGlvbj4KLSAgICAgICAgICA8VXNlQ3VzdG9tU2VydmVyPkZhbHNlPC9Vc2VDdXN0b21TZXJ2ZXI+Ci0gICAgICAgICAgPEN1c3RvbVNlcnZlclVybD4KLSAgICAgICAgICA8L0N1c3RvbVNlcnZlclVybD4KLSAgICAgICAgICA8U2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT5GYWxzZTwvU2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT4KLSAgICAgICAgPC9XZWJQcm9qZWN0UHJvcGVydGllcz4KLSAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4KLSAgICA8L1Zpc3VhbFN0dWRpbz4KLSAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHggYi9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2FiNTYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzV2ViU2FtcGxlL0dldFNhbXBsZS5hc3B4CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAot77u/PCVAIFBhZ2UgTGFuZ3VhZ2U9IkMjIiBBdXRvRXZlbnRXaXJldXA9InRydWUiIENvZGVCZWhpbmQ9IkdldFNhbXBsZS5hc3B4LmNzIiBJbmhlcml0cz0iRVBQbHVzV2ViU2FtcGxlLkdldFNhbXBsZSIgJT4KZGlmZiAtLWdpdCBhL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5jcyBiL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNmQzNi4uMDAwMDAwMAotLS0gYS9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHguY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIFNlZSBodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbS8gZm9yIGRldGFpbHMKLSAqIAotICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqIAotICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAotICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKLSAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCi0gKiAKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMy1NQVItMjAxMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5XZWI7Ci11c2luZyBTeXN0ZW0uV2ViLlVJOwotdXNpbmcgU3lzdGVtLldlYi5VSS5XZWJDb250cm9sczsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLW5hbWVzcGFjZSBFUFBsdXNXZWJTYW1wbGUKLXsKLSAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBHZXRTYW1wbGUgOiBTeXN0ZW0uV2ViLlVJLlBhZ2UKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFBhZ2VfTG9hZChvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChSZXF1ZXN0LlF1ZXJ5U3RyaW5nWyJTYW1wbGUiXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICIxIjoKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxlMSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICIyIjoKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxlMigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICIzIjoKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxlMygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICI0IjoKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxlNCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5Xcml0ZSgiPHNjcmlwdD5qYXZhc2NyaXB0OmFsZXJ0KCdJbnZhbGlkIHF1ZXJ5c3RyaW5nJyk7PC9zY3JpcHQ+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTYW1wbGUgMSAKLSAgICAgICAgLy8vIERlbW9uc3RyYXRlcyB0aGUgU2F2ZUFzIG1ldGhvZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgU2FtcGxlMSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbXBsZTEiKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiU2FtcGxlIDEiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJTaGFwZTEiLCBlU2hhcGVTdHlsZS5SZWN0KTsKLSAgICAgICAgICAgIHNoYXBlLlNldFBvc2l0aW9uKDUwLCAyMDApOwotICAgICAgICAgICAgc2hhcGUuU2V0U2l6ZSgyMDAsIDEwMCk7Ci0gICAgICAgICAgICBzaGFwZS5UZXh0ID0gIlNhbXBsZSAxIHNhdmVzIHRvIHRoZSBSZXNwb25zZS5PdXRwdXRTdHJlYW0iOwotCi0gICAgICAgICAgICBwY2suU2F2ZUFzKFJlc3BvbnNlLk91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBSZXNwb25zZS5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCI7Ci0gICAgICAgICAgICBSZXNwb25zZS5BZGRIZWFkZXIoImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgIGZpbGVuYW1lPVNhbXBsZTEueGxzeCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNhbXBsZSAyCi0gICAgICAgIC8vLyBEZW1vbnN0cmF0ZXMgdGhlIEdldEFzQnl0ZUFycmF5IG1ldGhvZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgU2FtcGxlMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbXBsZTIiKTsKLQotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiU2FtcGxlIDIiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJTaGFwZTEiLCBlU2hhcGVTdHlsZS5SZWN0KTsKLSAgICAgICAgICAgIHNoYXBlLlNldFBvc2l0aW9uKDUwLCAyMDApOwotICAgICAgICAgICAgc2hhcGUuU2V0U2l6ZSgyMDAsIDEwMCk7Ci0gICAgICAgICAgICBzaGFwZS5UZXh0ID0gIlNhbXBsZSAyIG91dHB1dHMgdGhlIHNoZWV0IHVzaW5nIHRoZSBSZXNwb25zZS5CaW5hcnlXcml0ZSBtZXRob2QiOwotCi0gICAgICAgICAgICBSZXNwb25zZS5CaW5hcnlXcml0ZShwY2suR2V0QXNCeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBSZXNwb25zZS5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCI7Ci0gICAgICAgICAgICBSZXNwb25zZS5BZGRIZWFkZXIoImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgIGZpbGVuYW1lPVNhbXBsZTIueGxzeCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNhbXBsZSAzCi0gICAgICAgIC8vLyBVc2VzIGEgY2FjaGVkIHRlbXBsYXRlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTYW1wbGUzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEFwcGxpY2F0aW9uWyJTYW1wbGUzVGVtcGxhdGUiXSA9PSBudWxsKSAvL0NoZWNrIGlmIHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0hlcmUgd2UgY3JlYXRlIHRoZSB0ZW1wbGF0ZS4gCi0gICAgICAgICAgICAgICAgLy9BcyBhbiBhbHRlcm5hdGl2ZSB0aGUgdGVtcGxhdGUgY291bGQgYmUgbG9hZGVkIGZyb20gZGlzayBvciBmcm9tIGEgcmVzb3VyY2UuCi0gICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBja1RlbXBsYXRlID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAgICAgICAgIHZhciB3c1RlbXBsYXRlID0gcGNrVGVtcGxhdGUuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbXBsZTMiKTsKLQotICAgICAgICAgICAgICAgIHdzVGVtcGxhdGUuQ2VsbHNbIkExIl0uVmFsdWUgPSAiU2FtcGxlIDMiOwotICAgICAgICAgICAgICAgIHdzVGVtcGxhdGUuQ2VsbHNbIkExIl0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2YXIgc2hhcGUgPSB3c1RlbXBsYXRlLkRyYXdpbmdzLkFkZFNoYXBlKCJTaGFwZTEiLCBlU2hhcGVTdHlsZS5SZWN0KTsKLSAgICAgICAgICAgICAgICBzaGFwZS5TZXRQb3NpdGlvbig1MCwgMjAwKTsKLSAgICAgICAgICAgICAgICBzaGFwZS5TZXRTaXplKDIwMCwgMTAwKTsKLSAgICAgICAgICAgICAgICBzaGFwZS5UZXh0ID0gIlNhbXBsZSAzIHVzZXMgYSB0ZW1wbGF0ZSB0aGF0IGlzIHN0b3JlZCBpbiB0aGUgYXBwbGljYXRpb24gY2FzaGUuIjsKLSAgICAgICAgICAgICAgICBwY2tUZW1wbGF0ZS5TYXZlKCk7Ci0KLSAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblsiU2FtcGxlM1RlbXBsYXRlIl0gPSBwY2tUZW1wbGF0ZS5TdHJlYW07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vT3BlbiB0aGUgbmV3IHBhY2thZ2Ugd2l0aCB0aGUgdGVtcGxhdGUgc3RyZWFtLgotICAgICAgICAgICAgLy9UaGUgdGVtcGxhdGUgc3RyZWFtIGlzIGNvcGllZCB0byB0aGUgbmV3IHN0cmVhbSBpbiB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSwgQXBwbGljYXRpb25bIlNhbXBsZTNUZW1wbGF0ZSJdIGFzIFN0cmVhbSk7Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIGludCByb3cgPSBuZXcgUmFuZG9tKCkuTmV4dCgxMCkgKyAxMDsgICAvL1BpY2sgYSByYW5kb20gcm93IHRvIHByaW50IHRoZSB0ZXh0Ci0gICAgICAgICAgICB3cy5DZWxsc1tyb3csMV0uVmFsdWUgPSAiV2UgbWFrZSBhIHNtYWxsIGNoYW5nZSBoZXJlLCBhZnRlciB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gbG9hZGVkLi4uIjsKLSAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMSwgcm93LCA1XS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICB3cy5DZWxsc1tyb3csIDEsIHJvdywgNV0uU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHb2xkZW5yb2RZZWxsb3cpOwotCi0gICAgICAgICAgICBSZXNwb25zZS5CaW5hcnlXcml0ZShwY2suR2V0QXNCeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBSZXNwb25zZS5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCI7Ci0gICAgICAgICAgICBSZXNwb25zZS5BZGRIZWFkZXIoImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgIGZpbGVuYW1lPVNhbXBsZTMueGxzeCIpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTYW1wbGU0KCkKLSAgICAgICAgewotICAgICAgICAgICAgIEV4Y2VsUGFja2FnZSBwY2sgPSBuZXcgRXhjZWxQYWNrYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vQWRkIGEgd29ya3NoZWV0LgotICAgICAgICAgICAgdmFyIHdzPXBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVkJBIFNhbXBsZSIpOwotICAgICAgICAgICAgd3MuRHJhd2luZ3MuQWRkU2hhcGUoIlZCQVNhbXBsZVJlY3QiLCBlU2hhcGVTdHlsZS5Sb3VuZFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0NyZWF0ZSBhIHZiYSBwcm9qZWN0ICAgICAgICAgICAgIAotICAgICAgICAgICAgcGNrLldvcmtib29rLkNyZWF0ZVZCQVByb2plY3QoKTsKLQotICAgICAgICAgICAgLy9Ob3cgYWRkIHNvbWUgY29kZSB0aGF0IGNyZWF0ZXMgYSBidWJibGUgY2hhcnQuLi4KLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIlByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKSIpOwotICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiICAgIFtWQkEgU2FtcGxlXS5TaGFwZXMoXCJWQkFTYW1wbGVSZWN0XCIpLlRleHRFZmZlY3QuVGV4dCA9IFwiVGhpcyB0ZXh0IGlzIHNldCBmcm9tIFZCQSFcIiIpOwotICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiRW5kIFN1YiIpOwotICAgICAgICAgICAgcGNrLldvcmtib29rLkNvZGVNb2R1bGUuQ29kZSA9IHNiLlRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIFJlc3BvbnNlLkJpbmFyeVdyaXRlKHBjay5HZXRBc0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb0VuYWJsZWQuMTIiOyAgICAgICAgICAgIC8vLnhsc20gZmlsZXMgdXNlcyBhIGRpZmZlcmVudCBjb250ZW50dHlwZSB0aGFuIC54bHN4Ci0gICAgICAgICAgICBSZXNwb25zZS5BZGRIZWFkZXIoImNvbnRlbnQtZGlzcG9zaXRpb24iLCAiYXR0YWNobWVudDsgIGZpbGVuYW1lPVNhbXBsZTQueGxzbSIpOwotCi0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5kZXNpZ25lci5jcyBiL0VQUGx1c1dlYlNhbXBsZS9HZXRTYW1wbGUuYXNweC5kZXNpZ25lci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmOTg1YS4uMDAwMDAwMAotLS0gYS9FUFBsdXNXZWJTYW1wbGUvR2V0U2FtcGxlLmFzcHguZGVzaWduZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi3vu78vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gPGF1dG8tZ2VuZXJhdGVkPgotLy8gICAgIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgdG9vbC4KLS8vICAgICBSdW50aW1lIFZlcnNpb246Mi4wLjUwNzI3LjQ5MjcKLS8vCi0vLyAgICAgQ2hhbmdlcyB0byB0aGlzIGZpbGUgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmCi0vLyAgICAgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuCi0vLyA8L2F1dG8tZ2VuZXJhdGVkPgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIEVQUGx1c1dlYlNhbXBsZSB7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgR2V0U2FtcGxlIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXNXZWJTYW1wbGUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9FUFBsdXNXZWJTYW1wbGUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMmM1ZWEuLjAwMDAwMDAKLS0tIGEvRVBQbHVzV2ViU2FtcGxlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRVBQbHVzV2ViU2FtcGxlIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIk1pY3Jvc29mdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1c1dlYlNhbXBsZSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIEphbiBLw6RsbG1hbiAyMDEwIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCIzZDU5MDBhZS0xMTFhLTQ1YmUtOTZiMy1kOWU0NjA2Y2E3OTMiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbiAKLS8vICAgICAgQnVpbGQgTnVtYmVyCi0vLyAgICAgIFJldmlzaW9uCi0vLwotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvRVBQbHVzV2ViU2FtcGxlL1dlYi5jb25maWcgYi9FUFBsdXNXZWJTYW1wbGUvV2ViLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkMWZkYi4uMDAwMDAwMAotLS0gYS9FUFBsdXNXZWJTYW1wbGUvV2ViLmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxjb25maWd1cmF0aW9uPgotICA8Y29uZmlnU2VjdGlvbnM+Ci0gICAgPHNlY3Rpb25Hcm91cCBuYW1lPSJzeXN0ZW0ud2ViLmV4dGVuc2lvbnMiIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TeXN0ZW1XZWJFeHRlbnNpb25zU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ij4KLSAgICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0ic2NyaXB0aW5nIiB0eXBlPSJTeXN0ZW0uV2ViLkNvbmZpZ3VyYXRpb24uU2NyaXB0aW5nU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ij4KLSAgICAgICAgPHNlY3Rpb24gbmFtZT0ic2NyaXB0UmVzb3VyY2VIYW5kbGVyIiB0eXBlPSJTeXN0ZW0uV2ViLkNvbmZpZ3VyYXRpb24uU2NyaXB0aW5nU2NyaXB0UmVzb3VyY2VIYW5kbGVyU2VjdGlvbiwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiBhbGxvd0RlZmluaXRpb249Ik1hY2hpbmVUb0FwcGxpY2F0aW9uIi8+Ci0gICAgICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0id2ViU2VydmljZXMiIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdXZWJTZXJ2aWNlc1NlY3Rpb25Hcm91cCwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSI+Ci0gICAgICAgICAgPHNlY3Rpb24gbmFtZT0ianNvblNlcmlhbGl6YXRpb24iIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdKc29uU2VyaWFsaXphdGlvblNlY3Rpb24sIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgYWxsb3dEZWZpbml0aW9uPSJFdmVyeXdoZXJlIi8+Ci0gICAgICAgICAgPHNlY3Rpb24gbmFtZT0icHJvZmlsZVNlcnZpY2UiIHR5cGU9IlN5c3RlbS5XZWIuQ29uZmlndXJhdGlvbi5TY3JpcHRpbmdQcm9maWxlU2VydmljZVNlY3Rpb24sIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgYWxsb3dEZWZpbml0aW9uPSJNYWNoaW5lVG9BcHBsaWNhdGlvbiIvPgotICAgICAgICAgIDxzZWN0aW9uIG5hbWU9ImF1dGhlbnRpY2F0aW9uU2VydmljZSIgdHlwZT0iU3lzdGVtLldlYi5Db25maWd1cmF0aW9uLlNjcmlwdGluZ0F1dGhlbnRpY2F0aW9uU2VydmljZVNlY3Rpb24sIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgYWxsb3dEZWZpbml0aW9uPSJNYWNoaW5lVG9BcHBsaWNhdGlvbiIvPgotICAgICAgICAgIDxzZWN0aW9uIG5hbWU9InJvbGVTZXJ2aWNlIiB0eXBlPSJTeXN0ZW0uV2ViLkNvbmZpZ3VyYXRpb24uU2NyaXB0aW5nUm9sZVNlcnZpY2VTZWN0aW9uLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIGFsbG93RGVmaW5pdGlvbj0iTWFjaGluZVRvQXBwbGljYXRpb24iLz4KLSAgICAgICAgPC9zZWN0aW9uR3JvdXA+Ci0gICAgICA8L3NlY3Rpb25Hcm91cD4KLSAgICA8L3NlY3Rpb25Hcm91cD4KLSAgPC9jb25maWdTZWN0aW9ucz4KLSAgPGFwcFNldHRpbmdzLz4KLSAgPGNvbm5lY3Rpb25TdHJpbmdzLz4KLSAgPHN5c3RlbS53ZWI+Ci0gICAgPCEtLSAKLSAgICAgICAgICAgIFNldCBjb21waWxhdGlvbiBkZWJ1Zz0idHJ1ZSIgdG8gaW5zZXJ0IGRlYnVnZ2luZyAKLSAgICAgICAgICAgIHN5bWJvbHMgaW50byB0aGUgY29tcGlsZWQgcGFnZS4gQmVjYXVzZSB0aGlzIAotICAgICAgICAgICAgYWZmZWN0cyBwZXJmb3JtYW5jZSwgc2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZSBvbmx5IAotICAgICAgICAgICAgZHVyaW5nIGRldmVsb3BtZW50LgotICAgICAgICAtLT4KLSAgICA8Y29tcGlsYXRpb24gZGVidWc9InRydWUiPgotICAgICAgPGFzc2VtYmxpZXM+Ci0gICAgICAgIDxhZGQgYXNzZW1ibHk9IlN5c3RlbS5Db3JlLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Qjc3QTVDNTYxOTM0RTA4OSIvPgotICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+Ci0gICAgICAgIDxhZGQgYXNzZW1ibHk9IlN5c3RlbS5YbWwuTGlucSwgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPUI3N0E1QzU2MTkzNEUwODkiLz4KLSAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1CNzdBNUM1NjE5MzRFMDg5Ii8+Ci0gICAgICA8L2Fzc2VtYmxpZXM+Ci0gICAgPC9jb21waWxhdGlvbj4KLSAgICA8IS0tCi0gICAgICAgICAgICBUaGUgPGF1dGhlbnRpY2F0aW9uPiBzZWN0aW9uIGVuYWJsZXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgICAgIG9mIHRoZSBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtb2RlIHVzZWQgYnkgCi0gICAgICAgICAgICBBU1AuTkVUIHRvIGlkZW50aWZ5IGFuIGluY29taW5nIHVzZXIuIAotICAgICAgICAtLT4KLSAgICA8YXV0aGVudGljYXRpb24gbW9kZT0iV2luZG93cyIvPgotICAgIDwhLS0KLSAgICAgICAgICAgIFRoZSA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIGVuYWJsZXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgICAgIG9mIHdoYXQgdG8gZG8gaWYvd2hlbiBhbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJzIAotICAgICAgICAgICAgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYSByZXF1ZXN0LiBTcGVjaWZpY2FsbHksIAotICAgICAgICAgICAgaXQgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSBodG1sIGVycm9yIHBhZ2VzIAotICAgICAgICAgICAgdG8gYmUgZGlzcGxheWVkIGluIHBsYWNlIG9mIGEgZXJyb3Igc3RhY2sgdHJhY2UuCi0KLSAgICAgICAgPGN1c3RvbUVycm9ycyBtb2RlPSJSZW1vdGVPbmx5IiBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvclBhZ2UuaHRtIj4KLSAgICAgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI0MDMiIHJlZGlyZWN0PSJOb0FjY2Vzcy5odG0iIC8+Ci0gICAgICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNDA0IiByZWRpcmVjdD0iRmlsZU5vdEZvdW5kLmh0bSIgLz4KLSAgICAgICAgPC9jdXN0b21FcnJvcnM+Ci0gICAgICAgIC0tPgotICAgIDxwYWdlcz4KLSAgICAgIDxjb250cm9scz4KLSAgICAgICAgPGFkZCB0YWdQcmVmaXg9ImFzcCIgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLlVJIiBhc3NlbWJseT0iU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgotICAgICAgICA8YWRkIHRhZ1ByZWZpeD0iYXNwIiBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuVUkuV2ViQ29udHJvbHMiIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+Ci0gICAgICA8L2NvbnRyb2xzPgotICAgIDwvcGFnZXM+Ci0gICAgPGh0dHBIYW5kbGVycz4KLSAgICAgIDxyZW1vdmUgdmVyYj0iKiIgcGF0aD0iKi5hc214Ii8+Ci0gICAgICA8YWRkIHZlcmI9IioiIHBhdGg9IiouYXNteCIgdmFsaWRhdGU9ImZhbHNlIiB0eXBlPSJTeXN0ZW0uV2ViLlNjcmlwdC5TZXJ2aWNlcy5TY3JpcHRIYW5kbGVyRmFjdG9yeSwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgotICAgICAgPGFkZCB2ZXJiPSIqIiBwYXRoPSIqX0FwcFNlcnZpY2UuYXhkIiB2YWxpZGF0ZT0iZmFsc2UiIHR5cGU9IlN5c3RlbS5XZWIuU2NyaXB0LlNlcnZpY2VzLlNjcmlwdEhhbmRsZXJGYWN0b3J5LCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+Ci0gICAgICA8YWRkIHZlcmI9IkdFVCxIRUFEIiBwYXRoPSJTY3JpcHRSZXNvdXJjZS5heGQiIHZhbGlkYXRlPSJmYWxzZSIgdHlwZT0iU3lzdGVtLldlYi5IYW5kbGVycy5TY3JpcHRSZXNvdXJjZUhhbmRsZXIsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KLSAgICA8L2h0dHBIYW5kbGVycz4KLSAgICA8aHR0cE1vZHVsZXM+Ci0gICAgICA8YWRkIG5hbWU9IlNjcmlwdE1vZHVsZSIgdHlwZT0iU3lzdGVtLldlYi5IYW5kbGVycy5TY3JpcHRNb2R1bGUsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KLSAgICA8L2h0dHBNb2R1bGVzPgotICA8L3N5c3RlbS53ZWI+Ci0gIDwhLS0gCi0gICAgICAgIFRoZSBzeXN0ZW0ud2ViU2VydmVyIHNlY3Rpb24gaXMgcmVxdWlyZWQgZm9yIHJ1bm5pbmcgQVNQLk5FVCBBSkFYIHVuZGVyIEludGVybmV0Ci0gICAgICAgIEluZm9ybWF0aW9uIFNlcnZpY2VzIDcuMC4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHByZXZpb3VzIHZlcnNpb24gb2YgSUlTLgotICAgIC0tPgotICA8c3lzdGVtLmNvZGVkb20+Ci0gICAgICA8Y29tcGlsZXJzPgotICAgICAgICA8Y29tcGlsZXIgbGFuZ3VhZ2U9ImMjO2NzO2NzaGFycCIgZXh0ZW5zaW9uPSIuY3MiIHR5cGU9Ik1pY3Jvc29mdC5DU2hhcnAuQ1NoYXJwQ29kZVByb3ZpZGVyLCBTeXN0ZW0sIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5IiB3YXJuaW5nTGV2ZWw9IjQiPgotICAgICAgICAgIDxwcm92aWRlck9wdGlvbiBuYW1lPSJDb21waWxlclZlcnNpb24iIHZhbHVlPSJ2My41Ii8+Ci0gICAgICAgICAgPHByb3ZpZGVyT3B0aW9uIG5hbWU9Ildhcm5Bc0Vycm9yIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgIDwvY29tcGlsZXI+Ci0gICAgPC9jb21waWxlcnM+Ci0gIDwvc3lzdGVtLmNvZGVkb20+Ci0gIDxzeXN0ZW0ud2ViU2VydmVyPgotICAgICAgPHZhbGlkYXRpb24gdmFsaWRhdGVJbnRlZ3JhdGVkTW9kZUNvbmZpZ3VyYXRpb249ImZhbHNlIi8+Ci0gICAgPG1vZHVsZXM+Ci0gICAgICA8cmVtb3ZlIG5hbWU9IlNjcmlwdE1vZHVsZSIvPgotICAgICAgPGFkZCBuYW1lPSJTY3JpcHRNb2R1bGUiIHByZUNvbmRpdGlvbj0ibWFuYWdlZEhhbmRsZXIiIHR5cGU9IlN5c3RlbS5XZWIuSGFuZGxlcnMuU2NyaXB0TW9kdWxlLCBTeXN0ZW0uV2ViLkV4dGVuc2lvbnMsIFZlcnNpb249My41LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1Ii8+Ci0gICAgPC9tb2R1bGVzPgotICAgIDxoYW5kbGVycz4KLSAgICAgIDxyZW1vdmUgbmFtZT0iV2ViU2VydmljZUhhbmRsZXJGYWN0b3J5LUludGVncmF0ZWQiLz4KLSAgICAgIDxyZW1vdmUgbmFtZT0iU2NyaXB0SGFuZGxlckZhY3RvcnkiLz4KLSAgICAgIDxyZW1vdmUgbmFtZT0iU2NyaXB0SGFuZGxlckZhY3RvcnlBcHBTZXJ2aWNlcyIvPgotICAgICAgPHJlbW92ZSBuYW1lPSJTY3JpcHRSZXNvdXJjZSIvPgotICAgICAgPGFkZCBuYW1lPSJTY3JpcHRIYW5kbGVyRmFjdG9yeSIgdmVyYj0iKiIgcGF0aD0iKi5hc214IiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLlNjcmlwdC5TZXJ2aWNlcy5TY3JpcHRIYW5kbGVyRmFjdG9yeSwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgotICAgICAgPGFkZCBuYW1lPSJTY3JpcHRIYW5kbGVyRmFjdG9yeUFwcFNlcnZpY2VzIiB2ZXJiPSIqIiBwYXRoPSIqX0FwcFNlcnZpY2UuYXhkIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLlNjcmlwdC5TZXJ2aWNlcy5TY3JpcHRIYW5kbGVyRmFjdG9yeSwgU3lzdGVtLldlYi5FeHRlbnNpb25zLCBWZXJzaW9uPTMuNS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIvPgotICAgICAgPGFkZCBuYW1lPSJTY3JpcHRSZXNvdXJjZSIgdmVyYj0iR0VULEhFQUQiIHBhdGg9IlNjcmlwdFJlc291cmNlLmF4ZCIgcHJlQ29uZGl0aW9uPSJpbnRlZ3JhdGVkTW9kZSIgdHlwZT0iU3lzdGVtLldlYi5IYW5kbGVycy5TY3JpcHRSZXNvdXJjZUhhbmRsZXIsIFN5c3RlbS5XZWIuRXh0ZW5zaW9ucywgVmVyc2lvbj0zLjUuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiLz4KLSAgICA8L2hhbmRsZXJzPgotICA8L3N5c3RlbS53ZWJTZXJ2ZXI+Ci0gIDxydW50aW1lPgotICAgIDxhc3NlbWJseUJpbmRpbmcgYXBwbGllc1RvPSJ2Mi4wLjUwNzI3IiB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiPgotICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgotICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1Ii8+Ci0gICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0xLjEuMC4wIiBuZXdWZXJzaW9uPSIzLjUuMC4wIi8+Ci0gICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgotICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgotICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMuRGVzaWduIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIvPgotICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMS4xLjAuMCIgbmV3VmVyc2lvbj0iMy41LjAuMCIvPgotICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KLSAgICA8L2Fzc2VtYmx5QmluZGluZz4KLSAgPC9ydW50aW1lPgotPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0V4Y2VsUGFja2FnZS52c21kaSBiL0V4Y2VsUGFja2FnZS52c21kaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkMmNjMC4uMDAwMDAwMAotLS0gYS9FeGNlbFBhY2thZ2UudnNtZGkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08VGVzdExpc3RzIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KLSAgPFRlc3RMaXN0IG5hbWU9Ikxpc3RzIG9mIFRlc3RzIiBpZD0iOGM0MzEwNmItOWRjMS00OTA3LWEyOWYtYWE2NmE2MWJmNWI2Ij4KLSAgICA8UnVuQ29uZmlndXJhdGlvbiBpZD0iZGRlNTlmMmMtODBkNC00OGVhLWI2ZmYtMmNmNjA1NWYzMTYyIiBuYW1lPSJMb2NhbCBUZXN0IFJ1biIgc3RvcmFnZT0ibG9jYWx0ZXN0cnVuLnRlc3RydW5jb25maWciIHR5cGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLkNvbW1vbi5UZXN0UnVuQ29uZmlndXJhdGlvbiwgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5RdWFsaXR5VG9vbHMuQ29tbW9uLCBWZXJzaW9uPTEwLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EiIC8+Ci0gIDwvVGVzdExpc3Q+Ci08L1Rlc3RMaXN0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Mb2NhbFRlc3RSdW4udGVzdHJ1bmNvbmZpZyBiL0xvY2FsVGVzdFJ1bi50ZXN0cnVuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2EwMzc2Li4wMDAwMDAwCi0tLSBhL0xvY2FsVGVzdFJ1bi50ZXN0cnVuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxUZXN0U2V0dGluZ3MgbmFtZT0iTG9jYWwgVGVzdCBSdW4iIGlkPSJkZGU1OWYyYy04MGQ0LTQ4ZWEtYjZmZi0yY2Y2MDU1ZjMxNjIiIHhtbG5zPSJodHRwOi8vbWljcm9zb2Z0LmNvbS9zY2hlbWFzL1Zpc3VhbFN0dWRpby9UZWFtVGVzdC8yMDEwIj4KLSAgPERlc2NyaXB0aW9uPlRoaXMgaXMgYSBkZWZhdWx0IHRlc3QgcnVuIGNvbmZpZ3VyYXRpb24gZm9yIGEgbG9jYWwgdGVzdCBydW4uPC9EZXNjcmlwdGlvbj4KLSAgPERlcGxveW1lbnQgZW5hYmxlZD0iZmFsc2UiIC8+Ci0gIDxFeGVjdXRpb24+Ci0gICAgPFRpbWVvdXRzIHRlc3RUaW1lb3V0PSIwIiAvPgotICAgIDxUZXN0VHlwZVNwZWNpZmljPgotICAgICAgPFVuaXRUZXN0UnVuQ29uZmlnIHRlc3RUeXBlSWQ9IjEzY2RjOWQ5LWRkYjUtNGZhNC1hOTdkLWQ5NjVjY2ZjNmQ0YiI+Ci0gICAgICAgIDxBc3NlbWJseVJlc29sdXRpb24+Ci0gICAgICAgICAgPFRlc3REaXJlY3RvcnkgdXNlTG9hZENvbnRleHQ9InRydWUiIC8+Ci0gICAgICAgIDwvQXNzZW1ibHlSZXNvbHV0aW9uPgotICAgICAgPC9Vbml0VGVzdFJ1bkNvbmZpZz4KLSAgICAgIDxXZWJUZXN0UnVuQ29uZmlndXJhdGlvbiB0ZXN0VHlwZUlkPSI0ZTc1OTlmYS01ZWNiLTQzZTktYTg4Ny1jZDYzY2Y3MmQyMDciPgotICAgICAgICA8QnJvd3NlciBuYW1lPSJJbnRlcm5ldCBFeHBsb3JlciAxMC4wIiBNYXhDb25uZWN0aW9ucz0iNiI+Ci0gICAgICAgICAgPEhlYWRlcnM+Ci0gICAgICAgICAgICA8SGVhZGVyIG5hbWU9IlVzZXItQWdlbnQiIHZhbHVlPSJNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIE5UIDYuMTsgVHJpZGVudC82LjApIiAvPgotICAgICAgICAgICAgPEhlYWRlciBuYW1lPSJBY2NlcHQiIHZhbHVlPSIqLyoiIC8+Ci0gICAgICAgICAgICA8SGVhZGVyIG5hbWU9IkFjY2VwdC1MYW5ndWFnZSIgdmFsdWU9Int7JElFQWNjZXB0TGFuZ3VhZ2V9fSIgLz4KLSAgICAgICAgICAgIDxIZWFkZXIgbmFtZT0iQWNjZXB0LUVuY29kaW5nIiB2YWx1ZT0iR1pJUCIgLz4KLSAgICAgICAgICA8L0hlYWRlcnM+Ci0gICAgICAgIDwvQnJvd3Nlcj4KLSAgICAgIDwvV2ViVGVzdFJ1bkNvbmZpZ3VyYXRpb24+Ci0gICAgPC9UZXN0VHlwZVNwZWNpZmljPgotICAgIDxBZ2VudFJ1bGUgbmFtZT0iTG9jYWxNYWNoaW5lRGVmYXVsdFJvbGUiPgotICAgIDwvQWdlbnRSdWxlPgotICA8L0V4ZWN1dGlvbj4KLSAgPFByb3BlcnRpZXMgLz4KLTwvVGVzdFNldHRpbmdzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvR2VuZXJhdGVQYWNrYWdlLmNzcHJvaiBiL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvR2VuZXJhdGVQYWNrYWdlLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0MTc0ZS4uMDAwMDAwMAotLS0gYS9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL0dlbmVyYXRlUGFja2FnZS5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjMwNzAzPC9Qcm9kdWN0VmVyc2lvbj4KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+Ci0gICAgPFByb2plY3RHdWlkPns1QjgzRjRDRi1BRjBELTRGMDQtQjk5Mi03NDBDRTRGOUMxMTZ9PC9Qcm9qZWN0R3VpZD4KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+Ci0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgotICAgIDxSb290TmFtZXNwYWNlPkdlbmVyYXRlUGFja2FnZTwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPkdlbmVyYXRlUGFja2FnZTwvQXNzZW1ibHlOYW1lPgotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+Ci0gICAgPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KLSAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+Ci0gICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9Qcm9ncmFtLmNzIGIvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQ2M2QxLi4wMDAwMDAwCi0tLSBhL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBHZW5lcmF0ZVBhY2thZ2UKLXsKLSAgICBjbGFzcyBQcm9ncmFtCi0gICAgewotICAgICAgICBzdGF0aWMgRXhjZWxQYWNrYWdlIHBhY2thZ2U7Ci0KLSAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoIlByZXNzIGVudGVyIHRvIFN0YXJ0Iik7Ci0gICAgICAgICAgICBDb25zb2xlLkluLlJlYWRMaW5lKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGNhID0gMDsgY2EgPCAxMDsgY2ErKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY2EgJSAxMCA9PSAwKQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoY2EpOwotICAgICAgICAgICAgICAgIENyZWF0ZURlbGV0ZVBhY2thZ2UoNCwxMDAwMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCFDb25zb2xlLkluLlJlYWRMaW5lKCkuRXF1YWxzKCJleGl0IiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlRGVsZXRlUGFja2FnZSgxLDEwMDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDcmVhdGVEZWxldGVQYWNrYWdlKGludCBTaGVldHMsIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PG9iamVjdD4gcm93ID0gbmV3IExpc3Q8b2JqZWN0PigpOwotICAgICAgICAgICAgcm93LkFkZCgxKTsKLSAgICAgICAgICAgIHJvdy5BZGQoIlNvbWUgdGV4dCIpOwotICAgICAgICAgICAgcm93LkFkZCgxMi4wKTsKLSAgICAgICAgICAgIHJvdy5BZGQoIlNvbWUgbGFyZ2VyIHRleHQgdGhhdCBoYXMgY29tcGxldGVseSBubyBtZWFuaW5nLiAgSG93IG11Y2ggd29vZCBjYW4gYSB3b29kIGNodWNrIGNodWNrIGlmIGEgd29vZCBjaHVjayBjb3VsZCBjaHVjayB3b29kLiAgQSB3b29kIGNodWNrIGNvdWxkIGNodWNrIGFzIG11Y2ggd29vZCBhcyBhIHdvb2QgY2h1Y2sgY291bGQgY2h1Y2sgd29vZC4iKTsKLQotICAgICAgICAgICAgRmlsZUluZm8gTG9jYWxGdWxsRmlsZU5hbWUgPSBuZXcgRmlsZUluZm8oUGF0aC5HZXRUZW1wRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICBMb2NhbEZ1bGxGaWxlTmFtZS5EZWxldGUoKTsKLSAgICAgICAgICAgIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKExvY2FsRnVsbEZpbGVOYW1lKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY2EgPSAwOyBjYSA8IFNoZWV0czsgY2ErKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENyZWF0ZVdvcmtzaGVldCgiU2hlZXQiICsgKGNhKzEpLCByb3csIHJvd3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvY2FsRnVsbEZpbGVOYW1lLlJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICBpZiAoTG9jYWxGdWxsRmlsZU5hbWUuRXhpc3RzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTG9jYWxGdWxsRmlsZU5hbWUuRGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGFja2FnZS5EaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgcGFja2FnZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBHQy5Db2xsZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZVdvcmtzaGVldChzdHJpbmcgc2hlZXROYW1lLCBMaXN0PG9iamVjdD4gcm93LCBpbnQgbnVtcm93cykKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZChzaGVldE5hbWUpOwotICAgICAgICAgICAgZm9yIChpbnQgY2EgPSAxOyBjYSA8PSBudW1yb3dzOyBjYSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZERhdGFSb3cod29ya3NoZWV0LCBjYSwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBZGREYXRhUm93KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgaW50IHJvdywgSUVudW1lcmFibGU8b2JqZWN0PiB2YWx1ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBjYSA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChvYmplY3QgdiBpbiB2YWx1ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ErKzsKLSAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSBjZWxsID0gd29ya3NoZWV0LkNlbGxzW3JvdywgY2FdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHZhbHVlID0gdjsKLSAgICAgICAgICAgICAgICAgICAgY2VsbC5WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd29ya3NoZWV0LlJvdyhyb3cpLkhlaWdodCA9IDEwLjI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2NzkxNC4uMDAwMDAwMAotLS0gYS9Qcm9maWxpbmcvR2VuZXJhdGVQYWNrYWdlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiR2VuZXJhdGVQYWNrYWdlIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkhQIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiR2VuZXJhdGVQYWNrYWdlIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgSFAgMjAxMyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKLS8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQotCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KLVthc3NlbWJseTogR3VpZCgiNjMyYjM2YzAtNGJmZC00NTI5LWE5OWItNDNmNzhlMTVhYWEzIildCi0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6Ci0vLwotLy8gICAgICBNYWpvciBWZXJzaW9uCi0vLyAgICAgIE1pbm9yIFZlcnNpb24gCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzIAotLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9hcHAuY29uZmlnIGIvUHJvZmlsaW5nL0dlbmVyYXRlUGFja2FnZS9hcHAuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTlhZjQ0Li4wMDAwMDAwCi0tLSBhL1Byb2ZpbGluZy9HZW5lcmF0ZVBhY2thZ2UvYXBwLmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08Y29uZmlndXJhdGlvbj4KLTxzdGFydHVwPjxzdXBwb3J0ZWRSdW50aW1lIHZlcnNpb249InYyLjAuNTA3MjciLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL0VQUGx1c1NhbXBsZXMuY3Nwcm9qIGIvU2FtcGxlQXBwL0VQUGx1c1NhbXBsZXMuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjUxNGRjLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9FUFBsdXNTYW1wbGVzLmNzcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjEyLjAiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57MDZCRjNDNjgtRTdENC00NTc5LTkwQkUtRTM2REFDRTU2NEVGfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5FUFBsdXNTYW1wbGVzPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+RVBQbHVzU2FtcGxlczwvQXNzZW1ibHlOYW1lPgotICAgIDxGaWxlVXBncmFkZUZsYWdzPgotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KLSAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uPgotICAgIDwvVXBncmFkZUJhY2t1cExvY2F0aW9uPgotICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+Ci0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgotICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgotICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgotICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+Ci0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgotICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+Ci0gICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+Ci0gICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgotICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPkNsaWVudDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZSA0LjB8QW55Q1BVJyI+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2UgNC4wXDwvT3V0cHV0UGF0aD4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkxpbnEiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEwLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTExLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEyLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTEzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTE0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTE1LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTguY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlMS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGUzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlNS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGU2LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZTcuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2FtcGxlOS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZV9Gb3JtdWxhQ2FsYy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGVfTWFpbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGUyLmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEVQUGx1c1xFUFBsdXMuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns3QjI4ODAyNi01NTAyLTRBMzktQkY0MS03N0UwODZGM0U0QTN9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+RVBQbHVzPC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KLSAgICA8Tm9uZSBJbmNsdWRlPSJHcmFwaFRlbXBsYXRlLnhsc3giIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb250ZW50IEluY2x1ZGU9ImNzdlxTYW1wbGU5LTIudHh0IiAvPgotICAgIDxDb250ZW50IEluY2x1ZGU9ImNzdlxTYW1wbGU5LTEudHh0IiAvPgotICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXENvbXB1dGVyUGxheU1vZHVsZS50eHQiIC8+Ci0gICAgPENvbnRlbnQgSW5jbHVkZT0iVkJBLUNvZGVcQmF0dGxlc2hpcFNoZWV0LnR4dCIgLz4KLSAgICA8Q29udGVudCBJbmNsdWRlPSJWQkEtQ29kZVxUaGlzV29ya2Jvb2sudHh0IiAvPgotICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXENvZGVNb2R1bGUudHh0IiAvPgotICAgIDxDb250ZW50IEluY2x1ZGU9IlZCQS1Db2RlXFNoaXBDbGFzcy50eHQiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvR3JhcGhUZW1wbGF0ZS54bHN4IGIvU2FtcGxlQXBwL0dyYXBoVGVtcGxhdGUueGxzeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2YzRiZS4uMDAwMDAwMAotLS0gYS9TYW1wbGVBcHAvR3JhcGhUZW1wbGF0ZS54bHN4CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvU2FtcGxlQXBwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ1NGUyLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLe+7vy8qIAotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqIAotICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAotICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKLSAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCi0gKiAKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiAKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJFUFBsdXNTYW1wbGVzIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkRlbW9uc3RyYXRlIEV4Y2VsIGZpbGVzIGJlaW5nIGNyZWF0ZWQgb24gdGhlIHNlcnZlciIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1cyBTYW1wbGVzIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCJUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlIAotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbSAKLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCi0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQotW2Fzc2VtYmx5OiBHdWlkKCIzNzk1YjI4Mi03M2RkLTQ3ZjAtYWNjZi0yMTk3MDU0ZDZjZjQiKV0KLQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKLS8vCi0vLyAgICAgIE1ham9yIFZlcnNpb24KLS8vICAgICAgTWlub3IgVmVyc2lvbiAKLS8vICAgICAgQnVpbGQgTnVtYmVyCi0vLyAgICAgIFJldmlzaW9uCi0vLwotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjEiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMSIpXQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTEuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhZjc2NC4uMDAwMDAwMAotLS0gYS9TYW1wbGVBcHAvU2FtcGxlMS5jcworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqCi0gKiAKLSAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKiAKLSAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKLSAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCi0gKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBL5GxsbWFuCQlBZGRlZAkJMjEgTWFyIDIwMTAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLQljbGFzcyBTYW1wbGUxCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTYW1wbGUgMSAtIHNpbXBseSBjcmVhdGVzIGEgbmV3IHdvcmtib29rIGZyb20gc2NyYXRjaC4KLQkJLy8vIFRoZSB3b3JrYm9vayBjb250YWlucyBvbmUgd29ya3NoZWV0IHdpdGggYSBzaW1wbGUgaW52ZXJ0b3J5IGxpc3QKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlMShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLQkJewotCQkJRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKLQkJCWlmIChuZXdGaWxlLkV4aXN0cykKLQkJCXsKLQkJCQluZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLQkJCQluZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTEueGxzeCIpOwotCQkJfQotCQkJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSBuZXcgd29ya3NoZWV0IHRvIHRoZSBlbXB0eSB3b3JrYm9vawotICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkludmVudG9yeSIpOwotICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBoZWFkZXJzCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDFdLlZhbHVlID0gIklEIjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDNdLlZhbHVlID0gIlF1YW50aXR5IjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNF0uVmFsdWUgPSAiUHJpY2UiOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7Ci0KLSAgICAgICAgICAgICAgICAvL0FkZCBzb21lIGl0ZW1zLi4uCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMiJdLlZhbHVlID0gMTIwMDE7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gIk5haWxzIjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAzNzsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAzLjk5OwotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMyJdLlZhbHVlID0gMTIwMDI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gIkhhbW1lciI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMyJdLlZhbHVlID0gNTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQzIl0uVmFsdWUgPSAxMi4xMDsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9IDEyMDAzOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJTYXciOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9IDEyOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDQiXS5WYWx1ZSA9IDE1LjM3OwotCi0gICAgICAgICAgICAgICAgLy9BZGQgYSBmb3JtdWxhIGZvciB0aGUgdmFsdWUtY29sdW1uCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJFMjpFNCJdLkZvcm11bGEgPSAiQzIqRDIiOwotCi0gICAgICAgICAgICAgICAgLy9PayBub3cgZm9ybWF0IHRoZSB2YWx1ZXM7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciByYW5nZSA9IHdvcmtzaGVldC5DZWxsc1sxLCAxLCAxLCA1XSkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByYW5nZS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkRhcmtCbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbNSwgMywgNSwgNV0uRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIlNVQlRPVEFMKDksezB9KSIsIG5ldyBFeGNlbEFkZHJlc3MoMiwzLDQsMykuQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMjpDNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDI6RTUiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSBhbiBhdXRvZmlsdGVyIGZvciB0aGUgcmFuZ2UKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExOkU0Il0uQXV0b0ZpbHRlciA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEyOkE0Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJAIjsgICAvL0Zvcm1hdCBhcyB0ZXh0Ci0KLSAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIGFjdHVhbGx5IG5vIG5lZWQgdG8gY2FsY3VsYXRlLCBFeGNlbCB3aWxsIGRvIGl0IGZvciB5b3UsIGJ1dCBpbiBzb21lIGNhc2VzIGl0IG1pZ2h0IGJlIHVzZWZ1bC4gCi0gICAgICAgICAgICAgICAgLy9Gb3IgZXhhbXBsZSBpZiB5b3UgbGluayB0byB0aGlzIHdvcmtib29rIGZyb20gYW5vdGhlciB3b3JrYm9vayBvciB5b3Ugd2lsbCBvcGVuIHRoZSB3b3JrYm9vayBpbiBhIHByb2dyYW0gdGhhdCBoYXNuJ3QgYSBjYWxjdWxhdGlvbiBlbmdpbmUgb3IgCi0gICAgICAgICAgICAgICAgLy95b3Ugd2FudCB0byB1c2UgdGhlIHJlc3VsdCBvZiBhIGZvcm11bGEgaW4geW91ciBwcm9ncmFtLgotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DYWxjdWxhdGUoKTsgCi0KLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHMuQXV0b0ZpdENvbHVtbnMoMCk7ICAvL0F1dG9maXQgY29sdW1ucyBmb3IgYWxsIGNlbGxzCi0KLSAgICAgICAgICAgICAgICAvLyBsZXRzIHNldCB0aGUgaGVhZGVyIHRleHQgCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRIZWFkZXIuQ2VudGVyZWRUZXh0ID0gIiYyNCZVJlwiQXJpYWwsUmVndWxhciBCb2xkXCIgSW52ZW50b3J5IjsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHBhZ2UgbnVtYmVyIHRvIHRoZSBmb290ZXIgcGx1cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIlBhZ2UgezB9IG9mIHsxfSIsIEV4Y2VsSGVhZGVyRm9vdGVyLlBhZ2VOdW1iZXIsIEV4Y2VsSGVhZGVyRm9vdGVyLk51bWJlck9mUGFnZXMpOwotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgc2hlZXQgbmFtZSB0byB0aGUgZm9vdGVyCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuQ2VudGVyZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuU2hlZXROYW1lOwotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb290ZXIKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLk9kZEZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgPSBFeGNlbEhlYWRlckZvb3Rlci5GaWxlUGF0aCArIEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVOYW1lOwotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gd29ya3NoZWV0LkNlbGxzWyIxOjIiXTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSB3b3Jrc2hlZXQuQ2VsbHNbIkE6RyJdOwotCi0gICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaGVldCB2aWV3IHRvIHNob3cgaXQgaW4gcGFnZSBsYXlvdXQgbW9kZQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5WaWV3LlBhZ2VMYXlvdXRWaWV3ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBL5GxsbWFuIjsKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgMjAwNyB3b3JrYm9vayB1c2luZyBFUFBsdXMiOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0IHNvbWUgZXh0ZW5kZWQgcHJvcGVydHkgdmFsdWVzCi0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXQgc29tZSBjdXN0b20gcHJvcGVydHkgdmFsdWVzCi0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkNoZWNrZWQgYnkiLCAiSmFuIEvkbGxtYW4iKTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkVQUGx1cyIpOwotICAgICAgICAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCi0gICAgICAgICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTAuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTAuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmYzZWMuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTEwLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICoKLSAqIAotICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqIAotICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAotICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKLSAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCi0gKiAKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjggT2N0IDIwMTAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLQotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhbXBsZTEwCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuU2FtcGxlMTAoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ3JlYXRlIGEgU2FtcGxlMTAgZGlyZWN0b3J5Li4uCi0gICAgICAgICAgICBpZighRGlyZWN0b3J5LkV4aXN0cyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxTYW1wbGUxMCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dERpci5DcmVhdGVTdWJkaXJlY3RvcnkoIlNhbXBsZTEwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRwdXREaXI9bmV3IERpcmVjdG9yeUluZm8ob3V0cHV0RGlyICsgQCJcU2FtcGxlMTAiKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHRocmVlIEZpbGVJbmZvIG9iamVjdHMuLi4KLSAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxUZW1wbGF0ZS54bHN4Iik7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbGUuRGVsZXRlKCk7IAotICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxUZW1wbGF0ZS54bHN4Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlSW5mbyBhbnN3ZXJGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXEFuc3dlcnMueGxzeCIpOwotICAgICAgICAgICAgaWYgKGFuc3dlckZpbGUuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFuc3dlckZpbGUuRGVsZXRlKCk7ICAKLSAgICAgICAgICAgICAgICBhbnN3ZXJGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXEFuc3dlcnMueGxzeCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlSW5mbyBKS0Fuc3dlckZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcSktBbnN3ZXJzLnhsc3giKTsKLSAgICAgICAgICAgIGlmIChKS0Fuc3dlckZpbGUuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEpLQW5zd2VyRmlsZS5EZWxldGUoKTsKLSAgICAgICAgICAgICAgICBKS0Fuc3dlckZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcSktBbnN3ZXJzLnhsc3giKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHRlbXBsYXRlLi4uCi0gICAgICAgICAgICB1c2luZyAoCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UodGVtcGxhdGVGaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0xvY2sgdGhlIHdvcmtib29rIHRvdGFsbHkKLSAgICAgICAgICAgICAgICB2YXIgd29ya2Jvb2sgPSBwYWNrYWdlLldvcmtib29rOwotICAgICAgICAgICAgICAgIHdvcmtib29rLlByb3RlY3Rpb24uTG9ja1dpbmRvd3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdvcmtib29rLlByb3RlY3Rpb24uTG9ja1N0cnVjdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgd29ya2Jvb2suVmlldy5TZXRXaW5kb3dTaXplKDE1MCwgNTI1LCAxNDUwMCwgNjAwMCk7Ci0gICAgICAgICAgICAgICAgd29ya2Jvb2suVmlldy5TaG93SG9yaXpvbnRhbFNjcm9sbEJhciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHdvcmtib29rLlZpZXcuU2hvd1ZlcnRpY2FsU2Nyb2xsQmFyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgd29ya2Jvb2suVmlldy5TaG93U2hlZXRUYWJzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvL1NldCBhIHBhc3N3b3JkIGZvciB0aGUgd29ya2Jvb2twcm90ZWN0aW9uCi0gICAgICAgICAgICAgICAgd29ya2Jvb2suUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiRVBQbHVzIik7Ci0KLSAgICAgICAgICAgICAgICAvL0VuY3J5cHQgd2l0aCBubyBwYXNzd29yZAotICAgICAgICAgICAgICAgIHBhY2thZ2UuRW5jcnlwdGlvbi5Jc0VuY3J5cHRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJRdWl6Iik7Ci0gICAgICAgICAgICAgICAgc2hlZXQuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2hlZXQuVmlldy5TaG93SGVhZGVycyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHVzaW5nKHZhciByYW5nZT1zaGVldC5DZWxsc1siQTpYRkQiXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuUGF0dGVyblR5cGU9RXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkxpZ2h0R3JheSk7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZvbnQuTmFtZSA9ICJCcm9hZHdheSI7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkhpZGRlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkExIl0uVmFsdWUgPSAiUXVpei1Td2VkZW4iOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMSJdLlN0eWxlLkZvbnQuU2l6ZSA9IDE4OwotCi0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiRW50ZXIgeW91ciBuYW1lOiI7Ci0KLSAgICAgICAgICAgICAgICBzaGVldC5Db2x1bW4oMSkuV2lkdGggPSAzMDsKLSAgICAgICAgICAgICAgICBzaGVldC5Db2x1bW4oMikuV2lkdGggPSA4MDsKLSAgICAgICAgICAgICAgICBzaGVldC5Db2x1bW4oMykuV2lkdGggPSAyMDsKLQotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBNyJdLlZhbHVlID0gIldoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGNhcGl0YWwgb2YgU3dlZGVuPyI7Ci0gICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkE5Il0uVmFsdWUgPSAiQXQgd2hpY2ggcGxhY2UgZGlkIHRoZSBTd2VkaXNoIHRlYW0gZW5kIHVwIGluIHRoZSBTb2NjZXIgV29ybGRjdXAgMTk5ND8iOwotICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMTEiXS5WYWx1ZSA9ICJXaGF0IGlzIHRoZSBmaXJzdCBuYW1lIG9mIHRoZSBmYW1vdXMgU3dlZGlzaCBpbnZlbnRvci9zY2llbnRpc3QgdGhhdCBmb3VuZGVkIHRoZSBOb2JlbC1wcml6ZT8iOwotCi0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciByID0gc2hlZXQuQ2VsbHNbIkIzLEM3LEM5LEMxMSJdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZVNtb2tlKTsKLSAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuVG9wLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5Eb3R0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuQm9yZGVyLlRvcC5Db2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuQm9yZGVyLlJpZ2h0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5Eb3R0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuQm9yZGVyLlJpZ2h0LkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuQm90dG9tLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5Eb3R0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuQm9yZGVyLkJvdHRvbS5Db2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuQm9yZGVyLkxlZnQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLkRvdHRlZDsKLSAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Cb3JkZXIuTGVmdC5Db2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuTG9ja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNoZWV0LlNlbGVjdCgiQjMiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5Qcm90ZWN0aW9uLlNldFBhc3N3b3JkKCJFUFBsdXMiKTsKLSAgICAgICAgICAgICAgICBzaGVldC5Qcm90ZWN0aW9uLkFsbG93U2VsZWN0TG9ja2VkQ2VsbHMgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8vT3B0aW9ucyBxdWVzdGlvbiAxCi0gICAgICAgICAgICAgICAgdmFyIGxpc3QxID0gc2hlZXQuQ2VsbHNbIkM3Il0uRGF0YVZhbGlkYXRpb24uQWRkTGlzdERhdGFWYWxpZGF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbGlzdDEuRm9ybXVsYS5WYWx1ZXMuQWRkKCJCZXJuIik7Ci0gICAgICAgICAgICAgICAgbGlzdDEuRm9ybXVsYS5WYWx1ZXMuQWRkKCJTdG9ja2hvbG0iKTsKLSAgICAgICAgICAgICAgICBsaXN0MS5Gb3JtdWxhLlZhbHVlcy5BZGQoIk9zbG8iKTsKLSAgICAgICAgICAgICAgICBsaXN0MS5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsaXN0MS5FcnJvciA9ICJQbGVhc2Ugc2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgbGlzdCI7Ci0KLSAgICAgICAgICAgICAgICB2YXIgbGlzdDIgPSBzaGVldC5DZWxsc1siQzkiXS5EYXRhVmFsaWRhdGlvbi5BZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgICAgICAgICBsaXN0Mi5Gb3JtdWxhLlZhbHVlcy5BZGQoIkZpcnN0Iik7Ci0gICAgICAgICAgICAgICAgbGlzdDIuRm9ybXVsYS5WYWx1ZXMuQWRkKCJTZWNvbmQiKTsKLSAgICAgICAgICAgICAgICBsaXN0Mi5Gb3JtdWxhLlZhbHVlcy5BZGQoIlRoaXJkIik7Ci0gICAgICAgICAgICAgICAgbGlzdDIuU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbGlzdDIuRXJyb3IgPSAiUGxlYXNlIHNlbGVjdCBhIHZhbHVlIGZyb20gdGhlIGxpc3QiOwotCi0gICAgICAgICAgICAgICAgdmFyIGxpc3QzID0gc2hlZXQuQ2VsbHNbIkMxMSJdLkRhdGFWYWxpZGF0aW9uLkFkZExpc3REYXRhVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgICAgIGxpc3QzLkZvcm11bGEuVmFsdWVzLkFkZCgiQ2FybCBHdXN0YWYiKTsKLSAgICAgICAgICAgICAgICBsaXN0My5Gb3JtdWxhLlZhbHVlcy5BZGQoIkluZ21hciIpOwotICAgICAgICAgICAgICAgIGxpc3QzLkZvcm11bGEuVmFsdWVzLkFkZCgiQWxmcmVkIik7Ci0gICAgICAgICAgICAgICAgbGlzdDMuU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbGlzdDMuRXJyb3IgPSAiUGxlYXNlIHNlbGVjdCBhIHZhbHVlIGZyb20gdGhlIGxpc3QiOwotCi0KLSAgICAgICAgICAgICAgICAvL1NhdmUsIGFuZCB0aGUgdGVtcGxhdGUgaXMgcmVhZHkgZm9yIHVzZQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotCi0gICAgICAgICAgICAgICAgLy9RdWl6LXRlbXBsYXRlIGlzIGRvbmUsIG5vdyBjcmVhdGUgdGhlIGFuc3dlciB0ZW1wbGF0ZSBhbmQgZW5jcnlwdCBpdC4uLgotICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZUFuc3dlcnMgPSBuZXcgRXhjZWxQYWNrYWdlKHBhY2thZ2UuU3RyZWFtKSkgICAgICAgLy9XZSB1c2UgdGhlIHN0cmVhbSBmcm9tIHRoZSB0ZW1wbGF0ZSBoZXJlIHRvIGdldCBhIGNvcHkgb2YgaXQuCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgc2hlZXRBbnN3ZXJzID0gcGFja2FnZUFuc3dlcnMuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgICAgICAgICAgc2hlZXRBbnN3ZXJzLkNlbGxzWyJDNyJdLlZhbHVlID0gIlN0b2NraG9sbSI7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0QW5zd2Vycy5DZWxsc1siQzkiXS5WYWx1ZSA9ICJUaGlyZCI7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0QW5zd2Vycy5DZWxsc1siQzExIl0uVmFsdWUgPSAiQWxmcmVkIjsKLQotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlQW5zd2Vycy5FbmNyeXB0aW9uLkFsZ29yaXRobSA9IEVuY3J5cHRpb25BbGdvcml0aG0uQUVTMTkyOyAgIC8vRm9yIHRoZSBhbnN3ZXJzIHdlIHdhbnQgYSBsaXR0bGUgYml0IHN0cm9uZ2VyIGVuY3J5cHRpb24KLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZUFuc3dlcnMuU2F2ZUFzKGFuc3dlckZpbGUsICJFUFBsdXMiKTsgICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgYW5kIHNldCB0aGUgcGFzc3dvcmQgdG8gRVBQbHVzLiBUaGUgcGFzc3dvcmQgY2FuIGFsc28gYmUgc2V0IHVzaW5nIHBhY2thZ2VBbnN3ZXJzLkVuY3J5cHRpb24uUGFzc3dvcmQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL09rLCBTaW5jZSB0aGlzIGlzICAgICBxYW4gZXhhbXBsZSB3ZSBjcmVhdGUgb25lIHVzZXIgYW5zd2VyLi4uCi0gICAgICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlQW5zd2VycyA9IG5ldyBFeGNlbFBhY2thZ2UocGFja2FnZS5TdHJlYW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHNoZWV0VXNlciA9IHBhY2thZ2VBbnN3ZXJzLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0VXNlci5DZWxsc1siQjMiXS5WYWx1ZSA9ICJKYW4gS8OkbGxtYW4iOwotICAgICAgICAgICAgICAgICAgICBzaGVldFVzZXIuQ2VsbHNbIkM3Il0uVmFsdWUgPSAiQmVybiI7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0VXNlci5DZWxsc1siQzkiXS5WYWx1ZSA9ICJUaGlyZCI7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0VXNlci5DZWxsc1siQzExIl0uVmFsdWUgPSAiQWxmcmVkIjsKLQotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlQW5zd2Vycy5TYXZlQXMoSktBbnN3ZXJGaWxlLCAiSksiKTsgIC8vV2UgdXNlIGRlZmF1bHQgZW5jcnlwdGlvbiBoZXJlIChBRVMxMjgpIGFuZCBQYXNzd29yZCBKSwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvL05vdyBsZXRzIGNvcnJlY3QgdGhlIHVzZXIgZm9ybS4uLgotICAgICAgICAgICAgdmFyIHBhY2tBbnN3ZXJzID0gbmV3IEV4Y2VsUGFja2FnZShhbnN3ZXJGaWxlLCAiRVBQbHVzIik7ICAgIC8vU3VwcGx5IHRoZSBwYXNzd29yZCwgc28gdGhlIGZpbGUgY2FuIGJlIGRlY3J5cHRlZAotICAgICAgICAgICAgdmFyIHBhY2tVc2VyID0gIG5ldyBFeGNlbFBhY2thZ2UoSktBbnN3ZXJGaWxlLCAiSksiKTsgICAgICAgIC8vU3VwcGx5IHRoZSBwYXNzd29yZCwgc28gdGhlIGZpbGUgY2FuIGJlIGRlY3J5cHRlZAotCi0gICAgICAgICAgICB2YXIgd3NBbnN3ZXJzID0gcGFja0Fuc3dlcnMuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgIHZhciB3c1VzZXIgPSBwYWNrVXNlci5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotCi0gICAgICAgICAgICAvL0VudW1lcmF0ZSB0aGUgdGhyZWUgYW5zd2VycwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gd3NBbnN3ZXJzLkNlbGxzWyJDNyxDOSxDMTEiXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3c1VzZXIuQ2VsbHNbY2VsbC5BZGRyZXNzXS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNlbGwuVmFsdWUuVG9TdHJpbmcoKS5FcXVhbHMod3NVc2VyLkNlbGxzW2NlbGwuQWRkcmVzc10uVmFsdWUuVG9TdHJpbmcoKSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIC8vQ29ycmVjdCBBbnN3ZXI/Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3c1VzZXIuQ2VsbHNbY2VsbC5BZGRyZXNzXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5HcmVlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdzVXNlci5DZWxsc1tjZWxsLkFkZHJlc3NdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLlJlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFja1VzZXIuU2F2ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTExLmNzIGIvU2FtcGxlQXBwL1NhbXBsZTExLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmZiMGNiLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9TYW1wbGUxMS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi3vu78vKiAKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqIAotICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAotICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKLSAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCi0gKiAKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiAgQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKLQotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB1c2UgZGF0YSB2YWxpZGF0aW9uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBjbGFzcyBTYW1wbGUxMQotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlMTEoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vQ3JlYXRlIGEgU2FtcGxlMTAgZGlyZWN0b3J5Li4uCi0gICAgICAgICAgICBpZiAoIURpcmVjdG9yeS5FeGlzdHMob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcU2FtcGxlMTEiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREaXIuQ3JlYXRlU3ViZGlyZWN0b3J5KCJTYW1wbGUxMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0RGlyID0gbmV3IERpcmVjdG9yeUluZm8ob3V0cHV0RGlyICsgQCJcU2FtcGxlMTEiKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgRmlsZUluZm8gb2JqZWN0Li4uCi0gICAgICAgICAgICBGaWxlSW5mbyBvdXRwdXQgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcT3V0cHV0Lnhsc3giKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXQuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dC5EZWxldGUoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcT3V0cHV0Lnhsc3giKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShvdXRwdXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZEludGVnZXJWYWxpZGF0aW9uKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIEFkZExpc3RWYWxpZGF0aW9uRm9ybXVsYShwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBBZGRMaXN0VmFsaWRhdGlvblZhbHVlcyhwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBBZGRUaW1lVmFsaWRhdGlvbihwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBBZGREYXRlVGltZVZhbGlkYXRpb24ocGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgUmVhZEV4aXN0aW5nVmFsaWRhdGlvbnNGcm9tUGFja2FnZShwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5GdWxsTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgaW50ZWdlciB2YWxpZGF0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZSI+PC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRJbnRlZ2VyVmFsaWRhdGlvbihFeGNlbFBhY2thZ2UgcGFja2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiaW50ZWdlciIpOwotICAgICAgICAgICAgLy8gYWRkIGEgdmFsaWRhdGlvbiBhbmQgc2V0IHZhbHVlcwotICAgICAgICAgICAgdmFyIHZhbGlkYXRpb24gPSBzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oIkExOkEyIik7Ci0gICAgICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5OgotICAgICAgICAgICAgLy92YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkNlbGxzWyJBMTpBMiJdLkRhdGFWYWxpZGF0aW9uLkFkZEludGVnZXJEYXRhVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvclN0eWxlID0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS5zdG9wOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Qcm9tcHRUaXRsZSA9ICJFbnRlciBhIGludGVnZXIgdmFsdWUgaGVyZSI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdCA9ICJWYWx1ZSBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCA1IjsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0lucHV0TWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yVGl0bGUgPSAiQW4gaW52YWxpZCB2YWx1ZSB3YXMgZW50ZXJlZCI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yID0gIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1IjsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLk9wZXJhdG9yID0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmJldHdlZW47Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkZvcm11bGEuVmFsdWUgPSAxOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZSA9IDU7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBZGRlZCBzaGVldCBmb3IgaW50ZWdlciB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgbGlzdCB2YWxpZGF0aW9uIHdoZXJlIHRoZSBsaXN0IHNvdXJjZSBpcyBhIGZvcm11bGEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZExpc3RWYWxpZGF0aW9uRm9ybXVsYShFeGNlbFBhY2thZ2UgcGFja2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgibGlzdCBmb3JtdWxhIik7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQjEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiU291cmNlIHZhbHVlcyI7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQjIiXS5WYWx1ZSA9IDE7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9IDM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFkZCBhIHZhbGlkYXRpb24gYW5kIHNldCB2YWx1ZXMKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZExpc3RWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICAgICAgLy8gQWx0ZXJuYXRpdmVseToKLSAgICAgICAgICAgIC8vIHZhciB2YWxpZGF0aW9uID0gc2hlZXQuQ2VsbHNbIkExIl0uRGF0YVZhbGlkYXRpb24uQWRkTGlzdERhdGFWYWxpZGF0aW9uKCk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlNob3dFcnJvck1lc3NhZ2UgPSB0cnVlOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvclN0eWxlID0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZS53YXJuaW5nOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvclRpdGxlID0gIkFuIGludmFsaWQgdmFsdWUgd2FzIGVudGVyZWQiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5FcnJvciA9ICJTZWxlY3QgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0IjsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEgPSAiQjI6QjQiOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkZWQgc2hlZXQgZm9yIGxpc3QgdmFsaWRhdGlvbiB3aXRoIGZvcm11bGEiKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIGxpc3QgdmFsaWRhdGlvbiB3aGVyZSB0aGUgc2VsZWN0YWJsZSB2YWx1ZXMgYXJlIHNldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhY2thZ2UiPjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkTGlzdFZhbGlkYXRpb25WYWx1ZXMoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoImxpc3QgdmFsdWVzIik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhIHZhbGlkYXRpb24gYW5kIHNldCB2YWx1ZXMKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZExpc3RWYWxpZGF0aW9uKCJBMSIpOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUud2FybmluZzsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJBbiBpbnZhbGlkIHZhbHVlIHdhcyBlbnRlcmVkIjsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3IgPSAiU2VsZWN0IGEgdmFsdWUgZnJvbSB0aGUgbGlzdCI7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlcy5BZGQoaS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBZGRlZCBzaGVldCBmb3IgbGlzdCB2YWxpZGF0aW9uIHdpdGggdmFsdWVzIik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgYSB0aW1lIHZhbGlkYXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFRpbWVWYWxpZGF0aW9uKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJ0aW1lIik7Ci0gICAgICAgICAgICAvLyBhZGQgYSB2YWxpZGF0aW9uIGFuZCBzZXQgdmFsdWVzCi0gICAgICAgICAgICB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRUaW1lVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIC8vIEFsdGVybmF0aXZlbHk6Ci0gICAgICAgICAgICAvLyB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkNlbGxzWyJBMSJdLkRhdGFWYWxpZGF0aW9uLkFkZFRpbWVEYXRhVmFsaWRhdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uRXJyb3JTdHlsZSA9IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuc3RvcDsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0lucHV0TWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLlByb21wdFRpdGxlID0gIkVudGVyIHRpbWUgaW4gZm9ybWF0IEhIOk1NOlNTIjsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uUHJvbXB0ID0gIlNob3VsZCBiZSBncmVhdGVyIHRoYW4gMTM6MzA6MTAiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5ncmVhdGVyVGhhbjsKLSAgICAgICAgICAgIHZhciB0aW1lID0gdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlOwotICAgICAgICAgICAgdGltZS5Ib3VyID0gMTM7Ci0gICAgICAgICAgICB0aW1lLk1pbnV0ZSA9IDMwOwotICAgICAgICAgICAgdGltZS5TZWNvbmQgPSAxMDsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJBZGRlZCBzaGVldCBmb3IgdGltZSB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZERhdGVUaW1lVmFsaWRhdGlvbihFeGNlbFBhY2thZ2UgcGFja2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiZGF0ZXRpbWUiKTsKLSAgICAgICAgICAgIC8vIGFkZCBhIHZhbGlkYXRpb24gYW5kIHNldCB2YWx1ZXMKLSAgICAgICAgICAgIHZhciB2YWxpZGF0aW9uID0gc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKLSAgICAgICAgICAgIC8vIEFsdGVybmF0aXZlbHk6Ci0gICAgICAgICAgICAvLyB2YXIgdmFsaWRhdGlvbiA9IHNoZWV0LkNlbGxzWyJBMSJdLkRhdGFWYWxpZGF0aW9uLkFkZERhdGVUaW1lRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yU3R5bGUgPSBFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLnN0b3A7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLkVycm9yID0gIkludmFsaWQgZGF0ZSEiOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5TaG93SW5wdXRNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIHZhbGlkYXRpb24uUHJvbXB0ID0gIkVudGVyIGEgZGF0ZSBncmVhdGVyIHRoYW4gdG9kYXlzIGRhdGUgaGVyZSI7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uLk9wZXJhdG9yID0gRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmdyZWF0ZXJUaGFuOwotICAgICAgICAgICAgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlID0gRGF0ZVRpbWUuTm93LkRhdGU7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQWRkZWQgc2hlZXQgZm9yIGRhdGUgdGltZSB2YWxpZGF0aW9uIik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIHNob3dzIGRldGFpbHMgYWJvdXQgYWxsIGV4aXN0aW5nIHZhbGlkYXRpb25zIGluIHRoZSBlbnRpcmUgd29ya2Jvb2sKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJlYWRFeGlzdGluZ1ZhbGlkYXRpb25zRnJvbVBhY2thZ2UoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBhY2thZ2UgdmFsaWRhdGlvbnMiKTsKLSAgICAgICAgICAgIC8vIHByaW50IGhlYWRlcnMKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBMTpFMSJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siQTEiXS5WYWx1ZSA9ICJUeXBlIjsKLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJCMSJdLlZhbHVlID0gIkFkZHJlc3MiOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkMxIl0uVmFsdWUgPSAiT3BlcmF0b3IiOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQxIl0uVmFsdWUgPSAiRm9ybXVsYTEiOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiRm9ybXVsYTIiOwotCi0gICAgICAgICAgICBpbnQgcm93ID0gMjsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBvdGhlclNoZWV0IGluIHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihvdGhlclNoZWV0ID09IHNoZWV0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkYXRhVmFsaWRhdGlvbiBpbiBvdGhlclNoZWV0LkRhdGFWYWxpZGF0aW9ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJBIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9IGRhdGFWYWxpZGF0aW9uLlZhbGlkYXRpb25UeXBlLlR5cGUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkIiICsgcm93LlRvU3RyaW5nKCldLlZhbHVlID0gZGF0YVZhbGlkYXRpb24uQWRkcmVzcy5BZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24uQWxsb3dzT3BlcmF0b3IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJDIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9ICgoSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IpZGF0YVZhbGlkYXRpb24pLk9wZXJhdG9yLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBjYXN0aW5nIGlzIG5lZWRlZCB0byBnZXQgdmFsaWRhdGlvbnR5cGUtc3BlY2lmaWMgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChkYXRhVmFsaWRhdGlvbi5WYWxpZGF0aW9uVHlwZS5UeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRXaG9sZVZhbGlkYXRpb25EZXRhaWxzKHNoZWV0LCAoSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQpZGF0YVZhbGlkYXRpb24sIHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuTGlzdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludExpc3RWYWxpZGF0aW9uRGV0YWlscyhzaGVldCwgKElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdClkYXRhVmFsaWRhdGlvbiwgcm93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UaW1lOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50VGltZVZhbGlkYXRpb25EZXRhaWxzKHNoZWV0LCAoRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUpZGF0YVZhbGlkYXRpb24sIHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHNhbXBsZSwgYnV0IEkgaG9wZSB5b3UgZ2V0IHRoZSBwaWN0dXJlLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludFdob2xlVmFsaWRhdGlvbkRldGFpbHMoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IHdob2xlVmFsaWRhdGlvbiwgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkQiICsgcm93LlRvU3RyaW5nKCldLlZhbHVlID0gd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEuVmFsdWUuSGFzVmFsdWUgPyB3aG9sZVZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5WYWx1ZS5Ub1N0cmluZygpIDogd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhOwotICAgICAgICAgICAgc2hlZXQuQ2VsbHNbIkUiICsgcm93LlRvU3RyaW5nKCldLlZhbHVlID0gd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEyLlZhbHVlLkhhc1ZhbHVlID8gd2hvbGVWYWxpZGF0aW9uLkZvcm11bGEyLlZhbHVlLlZhbHVlLlRvU3RyaW5nKCkgOiB3aG9sZVZhbGlkYXRpb24uRm9ybXVsYTIuRXhjZWxGb3JtdWxhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludExpc3RWYWxpZGF0aW9uRGV0YWlscyhFeGNlbFdvcmtzaGVldCBzaGVldCwgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IGxpc3RWYWxpZGF0aW9uLCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICAvLyBpZiBmb3JtdWxhIGlzIHVzZWQgLSBzaG93IGl0Li4uCi0gICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkobGlzdFZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdFZhbGlkYXRpb24uRm9ybXVsYS5FeGNlbEZvcm11bGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIC0gc2hvdyB0aGUgdmFsdWVzIGZyb20gdGhlIGxpc3QgY29sbGVjdGlvbgotICAgICAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCh2YXIgbGlzdFZhbHVlIGluIGxpc3RWYWxpZGF0aW9uLkZvcm11bGEuVmFsdWVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoc2IuTGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGxpc3RWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoZWV0LkNlbGxzWyJEIiArIHJvdy5Ub1N0cmluZygpXS5WYWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludFRpbWVWYWxpZGF0aW9uRGV0YWlscyhFeGNlbFdvcmtzaGVldCBzaGVldCwgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUgdmFsaWRhdGlvbiwgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHZhbHVlMSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIGlmKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZTEgPSB2YWxpZGF0aW9uLkZvcm11bGEuRXhjZWxGb3JtdWxhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlMSA9IHN0cmluZy5Gb3JtYXQoInswfTp7MX06ezJ9IiwgdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlLkhvdXIsIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5NaW51dGUsIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZS5TZWNvbmQgPz8gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1siRCIgKyByb3cuVG9TdHJpbmcoKV0uVmFsdWUgPSB2YWx1ZTE7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTIuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGJmOWQuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTEyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLe+7vy8qIAotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqICBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTA0LTE4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Ci1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjbGFzcyBzaG93cyBob3cgdG8gdXNlIHBpdm90dGFibGVzIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGUxMgotICAgIHsKLSAgICAgICAgcHVibGljIGNsYXNzIFNhbGVzRFRPCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVGl0bGUgeyBnZXQ7IHNldDsgfSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIHN0cmluZyBGaXJzdE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBNaWRkbGVOYW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTGFzdE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLklzTnVsbE9yRW1wdHkoTWlkZGxlTmFtZSkgPyBGaXJzdE5hbWUgKyAiICIgKyBMYXN0TmFtZSA6IEZpcnN0TmFtZSArICIgIiArIE1pZGRsZU5hbWUgKyAiICIgKyBMYXN0TmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgT3JkZXJEYXRlIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFN1YlRvdGFsIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRheCB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgZGVjaW1hbCBGcmVpZ2h0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBkZWNpbWFsIFRvdGFsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3ViVG90YWwgKyBUYXggKyBGcmVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGUxMihzdHJpbmcgc3FsU2VydmVyTmFtZSwgRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IExpc3Q8U2FsZXNEVE8+KCk7Ci0gICAgICAgICAgICBpZiAoc3FsU2VydmVyTmFtZSA9PSAiIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0ID0gR2V0UmFuZG9tRGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QgPSBHZXREYXRhRnJvbVNRTChzcWxTZXJ2ZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSBvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxMi54bHN4IjsKLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkgRmlsZS5EZWxldGUoZmlsZSk7Ci0gICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKGZpbGUpOwotCi0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBoYW5kbGUgdG8gdGhlIGV4aXN0aW5nIHdvcmtzaGVldAotICAgICAgICAgICAgICAgIHZhciB3c0RhdGEgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlNhbGVzRGF0YSIpOwotCi0gICAgICAgICAgICAgICAgdmFyIGRhdGFSYW5nZSA9IHdzRGF0YS5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIGZyb20gcyBpbiBsaXN0IAotICAgICAgICAgICAgICAgICAgICBvcmRlcmJ5IHMuTGFzdE5hbWUsIHMuRmlyc3ROYW1lIAotICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcywgCi0gICAgICAgICAgICAgICAgICAgdHJ1ZSwgT2ZmaWNlT3BlblhtbC5UYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW0yKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd3NEYXRhLkNlbGxzWzIsIDYsIGRhdGFSYW5nZS5FbmQuUm93LCA2XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKLSAgICAgICAgICAgICAgICB3c0RhdGEuQ2VsbHNbMiwgNywgZGF0YVJhbmdlLkVuZC5Sb3csIDExXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkYXRhUmFuZ2UuQXV0b0ZpdENvbHVtbnMoKTsKLQotICAgICAgICAgICAgICAgIHZhciB3c1Bpdm90ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdFNpbXBsZSIpOwotICAgICAgICAgICAgICAgIHZhciBwaXZvdFRhYmxlMSA9IHdzUGl2b3QuUGl2b3RUYWJsZXMuQWRkKHdzUGl2b3QuQ2VsbHNbIkExIl0sIGRhdGFSYW5nZSwgIlBlckVtcGxvZWUiKTsKLQotICAgICAgICAgICAgICAgIHBpdm90VGFibGUxLlJvd0ZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWzRdKTsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTEuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTEuRmllbGRzWzZdKTsKLSAgICAgICAgICAgICAgICBkYXRhRmllbGQuRm9ybWF0PSIjLCMjMCI7Ci0gICAgICAgICAgICAgICAgcGl2b3RUYWJsZTEuRGF0YU9uUm93cyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB2YXIgY2hhcnQgPSB3c1Bpdm90LkRyYXdpbmdzLkFkZENoYXJ0KCJQaXZvdENoYXJ0IiwgZUNoYXJ0VHlwZS5QaWUsIHBpdm90VGFibGUxKTsKLSAgICAgICAgICAgICAgICBjaGFydC5TZXRQb3NpdGlvbigxLCAwLCA0LCAwKTsKLSAgICAgICAgICAgICAgICBjaGFydC5TZXRTaXplKDYwMCwgNDAwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdmFyIHdzUGl2b3QyID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJQaXZvdERhdGVHcnAiKTsKLSAgICAgICAgICAgICAgICB2YXIgcGl2b3RUYWJsZTIgPSB3c1Bpdm90Mi5QaXZvdFRhYmxlcy5BZGQod3NQaXZvdDIuQ2VsbHNbIkEzIl0sIGRhdGFSYW5nZSwgIlBlckVtcGxvZWVBbmRRdWFydGVyIik7Ci0KLSAgICAgICAgICAgICAgICBwaXZvdFRhYmxlMi5Sb3dGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siTmFtZSJdKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL0FkZCBhIHJvd2ZpZWxkCi0gICAgICAgICAgICAgICAgdmFyIHJvd0ZpZWxkID0gcGl2b3RUYWJsZTIuUm93RmllbGRzLkFkZChwaXZvdFRhYmxlMi5GaWVsZHNbIk9yZGVyRGF0ZSJdKTsKLSAgICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBkYXRlIGZpZWxkIHNvIHdlIHdhbnQgdG8gZ3JvdXAgYnkgWWVhcnMgYW5kIHF1YXRlcnMuIFRoaXMgd2lsbCBjcmVhdGUgb25lIGFkZGl0aW9uYWwgZmllbGQgZm9yIHllYXJzLgotICAgICAgICAgICAgICAgIHJvd0ZpZWxkLkFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkuWWVhcnMgfCBlRGF0ZUdyb3VwQnkuUXVhcnRlcnMpOwotICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBRdWF0ZXJzIGZpZWxkIGFuZCBjaGFuZ2UgdGhlIHRleHRzCi0gICAgICAgICAgICAgICAgdmFyIHF1YXRlckZpZWxkID0gcGl2b3RUYWJsZTIuRmllbGRzLkdldERhdGVHcm91cEZpZWxkKGVEYXRlR3JvdXBCeS5RdWFydGVycyk7Ci0gICAgICAgICAgICAgICAgcXVhdGVyRmllbGQuSXRlbXNbMF0uVGV4dCA9ICI8IjsgLy9WYWx1ZXMgYmVsb3cgbWluIGRhdGUsIGJ1dCB3ZSB1c2UgYXV0byBzbyBpdHMgbm90IHVzZWQKLSAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1sxXS5UZXh0ID0gIlExIjsKLSAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1syXS5UZXh0ID0gIlEyIjsKLSAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1szXS5UZXh0ID0gIlEzIjsKLSAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1s0XS5UZXh0ID0gIlE0IjsKLSAgICAgICAgICAgICAgICBxdWF0ZXJGaWVsZC5JdGVtc1s1XS5UZXh0ID0gIj4iOyAvL1ZhbHVlcyBhYm92ZSBtYXggZGF0ZSwgYnV0IHdlIHVzZSBhdXRvIHNvIGl0cyBub3QgdXNlZAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vQWRkIGEgcGFnZWZpZWxkCi0gICAgICAgICAgICAgICAgdmFyIHBhZ2VGaWVsZCA9IHBpdm90VGFibGUyLlBhZ2VGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siVGl0bGUiXSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9BZGQgdGhlIGRhdGEgZmllbGRzIGFuZCBmb3JtYXQgdGhlbQotICAgICAgICAgICAgICAgIGRhdGFGaWVsZCA9IHBpdm90VGFibGUyLkRhdGFGaWVsZHMuQWRkKHBpdm90VGFibGUyLkZpZWxkc1siU3ViVG90YWwiXSk7Ci0gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgICAgICAgICAgICAgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTIuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTIuRmllbGRzWyJUYXgiXSk7Ci0gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgICAgICAgICAgICAgZGF0YUZpZWxkID0gcGl2b3RUYWJsZTIuRGF0YUZpZWxkcy5BZGQocGl2b3RUYWJsZTIuRmllbGRzWyJGcmVpZ2h0Il0pOwotICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5Gb3JtYXQgPSAiIywjIzAiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2Ugd2FudCB0aGUgZGF0YWZpZWxkcyB0byBhcHBlYXIgaW4gY29sdW1ucwotICAgICAgICAgICAgICAgIHBpdm90VGFibGUyLkRhdGFPblJvd3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHBjay5TYXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2FsZXNEVE8+IEdldFJhbmRvbURhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFNhbGVzRFRPPiByZXQgPSBuZXcgTGlzdDxTYWxlc0RUTz4oKTsKLSAgICAgICAgICAgIHZhciBmaXJzdE5hbWVzID0gbmV3IHN0cmluZ1tdIHsiSm9obiIsICJHdW5uYXIiLCAiS2FybCIsICJBbGljZSJ9OwotICAgICAgICAgICAgdmFyIGxhc3ROYW1lcyA9IG5ldyBzdHJpbmdbXSB7IlNtaXRoIiwgIkpvaGFuc3NvbiIsICJMaW5kZW1hbiJ9OwotICAgICAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldC5BZGQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTYWxlc0RUTygpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0TmFtZSA9IGZpcnN0TmFtZXNbci5OZXh0KDQpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExhc3ROYW1lID0gbGFzdE5hbWVzW3IuTmV4dCgzKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBPcmRlckRhdGUgPSBuZXcgRGF0ZVRpbWUoMjAwMiwgMSwgMSkuQWRkRGF5cyhyLk5leHQoMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGU9IlNhbGVzIFJlcHJlc2VudGF0aXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRvdGFsID0gci5OZXh0KDEwMCwgMTAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgVGF4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZyZWlnaHQgPSAwCi0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2FsZXNEVE8+IEdldERhdGFGcm9tU1FMKHN0cmluZyBzcWxTZXJ2ZXJOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgY29ubmVjdGlvblN0ciA9IHN0cmluZy5Gb3JtYXQoQCJzZXJ2ZXI9ezB9O2RhdGFiYXNlPUFkdmVudHVyZVdvcmtzO0ludGVncmF0ZWQgU2VjdXJpdHk9dHJ1ZTsiLCBzcWxTZXJ2ZXJOYW1lKTsKLSAgICAgICAgICAgIHZhciByZXQgPSBuZXcgTGlzdDxTYWxlc0RUTz4oKTsKLSAgICAgICAgICAgIC8vIGxldHMgY29ubmVjdCB0byB0aGUgQWR2ZW50dXJlV29ya3Mgc2FtcGxlIGRhdGFiYXNlIGZvciBzb21lIGRhdGEKLSAgICAgICAgICAgIHVzaW5nIChTcWxDb25uZWN0aW9uIHNxbENvbm4gPSBuZXcgU3FsQ29ubmVjdGlvbihjb25uZWN0aW9uU3RyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcWxDb25uLk9wZW4oKTsKLSAgICAgICAgICAgICAgICB1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgic2VsZWN0IGguVGl0bGUsIEZpcnN0TmFtZSwgTWlkZGxlTmFtZSwgTGFzdE5hbWUsIFN1YlRvdGFsLCBPcmRlckRhdGUsIFRheEFtdCwgRnJlaWdodCwgVG90YWxEdWUgIGZyb20gU2FsZXMuU2FsZXNPcmRlckhlYWRlciBzIGlubmVyIGpvaW4gSHVtYW5SZXNvdXJjZXMuRW1wbG95ZWUgaCBvbiBzLlNhbGVzUGVyc29uSUQgPSBoLkVtcGxveWVlSUQgaW5uZXIgam9pbiBQZXJzb24uQ29udGFjdCBjIG9uIGMuQ29udGFjdElEID0gaC5Db250YWN0SUQgb3JkZXIgYnkgTGFzdE5hbWUsIEZpcnN0TmFtZSwgTWlkZGxlTmFtZTsiLCBzcWxDb25uKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVzaW5nIChTcWxEYXRhUmVhZGVyIHNxbFJlYWRlciA9IHNxbENtZC5FeGVjdXRlUmVhZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBkYXRhIGFuZCBmaWxsIHJvd3MgNSBvbndhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3FsUmVhZGVyLlJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuQWRkKG5ldyBTYWxlc0RUTwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPSBzcWxSZWFkZXJbIlRpdGxlIl0uVG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyc3ROYW1lPXNxbFJlYWRlclsiRmlyc3ROYW1lIl0uVG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlkZGxlTmFtZT1zcWxSZWFkZXJbIk1pZGRsZU5hbWUiXS5Ub1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0TmFtZT1zcWxSZWFkZXJbIkxhc3ROYW1lIl0uVG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJEYXRlID0gKERhdGVUaW1lKXNxbFJlYWRlclsiT3JkZXJEYXRlIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRvdGFsID0gKGRlY2ltYWwpc3FsUmVhZGVyWyJTdWJUb3RhbCJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXg9KGRlY2ltYWwpc3FsUmVhZGVyWyJUYXhBbXQiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlaWdodD0oZGVjaW1hbClzcWxSZWFkZXJbIkZyZWlnaHQiXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTMuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWM4MzUuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTEzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLe+7vy8qIAotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqICBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTA1LTAzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uRGF0YTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY2xhc3Mgc2hvd3MgaG93IHRvIGxvYWQgZGF0YSBpbiBhIGZldyB3YXlzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhbXBsZTEzCi0gICAgewotICAgICAgICBwdWJsaWMgY2xhc3MgRmlsZURUTwotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIGxvbmcgU2l6ZSB7Z2V0O3NldDt9Ci0gICAgICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgQ3JlYXRlZCB7Z2V0O3NldDt9Ci0gICAgICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgTGFzdE1vZGlmaWVkIHtnZXQ7c2V0O30KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgSXNEaXJlY3Rvcnk9ZmFsc2U7ICAgICAgICAgICAgICAgICAgLy9UaGlzIGlzIGEgZmllbGQgdmFyaWFibGUKLQotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKElzRGlyZWN0b3J5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUgKyAiXHQ8RGlyPiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOYW1lICsgIlx0IiArIFNpemUuVG9TdHJpbmcoIiMsIyMwIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJ1blNhbXBsZTEzKERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZSgpOwotCi0gICAgICAgICAgICAvL0NyZWF0ZSBhIGRhdGF0YWJsZSB3aXRoIHRoZSBkaXJlY3RvcmllcyBhbmQgZmlsZXMgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkuLi4KLSAgICAgICAgICAgIERhdGFUYWJsZSBkdCA9IEdldERhdGFUYWJsZShvdXRwdXREaXIuUm9vdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciB3c0R0ID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGcm9tRGF0YVRhYmxlIik7Ci0KLSAgICAgICAgICAgIC8vTG9hZCB0aGUgZGF0YXRhYmxlIGFuZCBzZXQgdGhlIG51bWJlciBmb3JtYXRzLi4uCi0gICAgICAgICAgICB3c0R0LkNlbGxzWyJBMSJdLkxvYWRGcm9tRGF0YVRhYmxlKGR0LCB0cnVlLCBUYWJsZVN0eWxlcy5NZWRpdW05KTsKLSAgICAgICAgICAgIHdzRHQuQ2VsbHNbMiwgMiwgZHQuUm93cy5Db3VudCArIDEsIDJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOwotICAgICAgICAgICAgd3NEdC5DZWxsc1syLCAzLCBkdC5Sb3dzLkNvdW50ICsgMSwgNF0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS1kZC15eSI7Ci0gICAgICAgICAgICB3c0R0LkNlbGxzW3dzRHQuRGltZW5zaW9uLkFkZHJlc3NdLkF1dG9GaXRDb2x1bW5zKCk7Ci0KLSAgICAgICAgICAgIC8vU2VsZWN0IE5hbWUgYW5kIENyZWF0ZWQtdGltZS4uLgotICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSAoZnJvbSByb3cgaW4gZHQuU2VsZWN0KCkgc2VsZWN0IG5ldyB7TmFtZT1yb3dbIk5hbWUiXSwgQ3JlYXRlZF90aW1lPShEYXRlVGltZSlyb3dbIkNyZWF0ZWQiXX0pOwotCi0gICAgICAgICAgICB2YXIgd3NFbnVtID0gcGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJGcm9tQW5vbnltb3VzIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vTG9hZCB0aGUgY29sbGVjdGlvbiBzdGFydGluZyBmcm9tIGNlbGwgQTEuLi4KLSAgICAgICAgICAgIHdzRW51bS5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgdHJ1ZSwgVGFibGVTdHlsZXMuTWVkaXVtOSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQWRkIHNvbWUgZm9ybWF0aW5nLi4uCi0gICAgICAgICAgICB3c0VudW0uQ2VsbHNbMiwgMiwgZHQuUm93cy5Db3VudC0xLCAyXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIm1tLWRkLXl5IjsKLSAgICAgICAgICAgIHdzRW51bS5DZWxsc1t3c0VudW0uRGltZW5zaW9uLkFkZHJlc3NdLkF1dG9GaXRDb2x1bW5zKCk7Ci0KLSAgICAgICAgICAgIC8vTG9hZCBhIGxpc3Qgb2YgRmlsZURUTyBvYmplY3RzIGZyb20gdGhlIGRhdGF0YWJsZS4uLgotICAgICAgICAgICAgdmFyIHdzTGlzdCA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiRnJvbUxpc3QiKTsKLSAgICAgICAgICAgIExpc3Q8RmlsZURUTz4gbGlzdCA9IChmcm9tIHJvdyBpbiBkdC5TZWxlY3QoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgbmV3IEZpbGVEVE8geyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gcm93WyJOYW1lIl0uVG9TdHJpbmcoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9IHJvd1siU2l6ZSJdLkdldFR5cGUoKSA9PSB0eXBlb2YobG9uZykgPyAobG9uZylyb3dbIlNpemUiXSA6IDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZWQgPSAoRGF0ZVRpbWUpcm93WyJDcmVhdGVkIl0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RNb2RpZmllZCA9IChEYXRlVGltZSlyb3dbIk1vZGlmaWVkIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNEaXJlY3RvcnkgPSAocm93WyJTaXplIl09PURCTnVsbC5WYWx1ZSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuVG9MaXN0PEZpbGVEVE8+KCk7Ci0KLSAgICAgICAgICAgIC8vTG9hZCBmaWxlcyBvcmRlcmVkIGJ5IHNpemUuLi4KLSAgICAgICAgICAgIHdzTGlzdC5DZWxsc1siQTEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24oZnJvbSBmaWxlIGluIGxpc3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyYnkgZmlsZS5TaXplIGRlc2NlbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGZpbGUuSXNEaXJlY3RvcnkgPT0gZmFsc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBmaWxlLCB0cnVlLCBUYWJsZVN0eWxlcy5NZWRpdW05KTsKLQotICAgICAgICAgICAgd3NMaXN0LkNlbGxzWzIsIDIsIGR0LlJvd3MuQ291bnQgKyAxLCAyXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKLSAgICAgICAgICAgIHdzTGlzdC5DZWxsc1syLCAzLCBkdC5Sb3dzLkNvdW50ICsgMSwgNF0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS1kZC15eSI7Ci0KLQotICAgICAgICAgICAgLy9Mb2FkIGRpcmVjdG9yaWVzIG9yZGVyZWQgYnkgTmFtZS4uLgotICAgICAgICAgICAgd3NMaXN0LkNlbGxzWyJGMSJdLkxvYWRGcm9tQ29sbGVjdGlvbihmcm9tIGZpbGUgaW4gbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmJ5IGZpbGUuTmFtZSBhc2NlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgZmlsZS5Jc0RpcmVjdG9yeSA9PSB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXcgeyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWU9ZmlsZS5OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZWQgPSBmaWxlLkNyZWF0ZWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdF9tb2RpZmllZD1maWxlLkxhc3RNb2RpZmllZH0sIC8vVXNlIGFuIHVuZGVyc2NvcmUgaW4gdGhlIHByb3BlcnR5IG5hbWUgdG8gZ2V0IGEgc3BhY2UgaW4gdGhlIHRpdGxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBUYWJsZVN0eWxlcy5NZWRpdW0xMSk7Ci0KLSAgICAgICAgICAgIHdzTGlzdC5DZWxsc1syLCA3LCBkdC5Sb3dzLkNvdW50ICsgMSwgOF0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJtbS1kZC15eSI7Ci0KLSAgICAgICAgICAgIC8vTG9hZCB0aGUgbGlzdCB1c2luZyBhIHNwZWNpZmllZCBhcnJheSBvZiBNZW1iZXJJbmZvIG9iamVjdHMuIFByb3BlcnRpZXMsIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgICAgdmFyIHJuZyA9IHdzTGlzdC5DZWxsc1siSjEiXS5Mb2FkRnJvbUNvbGxlY3Rpb24obGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVTdHlsZXMuTWVkaXVtMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZW1iZXJJbmZvW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mKEZpbGVEVE8pLkdldFByb3BlcnR5KCJOYW1lIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YoRmlsZURUTykuR2V0RmllbGQoIklzRGlyZWN0b3J5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YoRmlsZURUTykuR2V0TWV0aG9kKCJUb1N0cmluZyIpfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICB3c0xpc3QuVGFibGVzLkdldEZyb21SYW5nZShybmcpLkNvbHVtbnNbMl0uTmFtZSA9ICJEZXNjcmlwdGlvbiI7Ci0KLSAgICAgICAgICAgIHdzTGlzdC5DZWxsc1t3c0xpc3QuRGltZW5zaW9uLkFkZHJlc3NdLkF1dG9GaXRDb2x1bW5zKCk7Ci0KLSAgICAgICAgICAgIC8vLi4uYW5kIHNhdmUKLSAgICAgICAgICAgIHZhciBmaSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxTYW1wbGUxMy54bHN4Iik7Ci0gICAgICAgICAgICBpZiAoZmkuRXhpc3RzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpLkRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGNrLlNhdmVBcyhmaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBEYXRhVGFibGUgR2V0RGF0YVRhYmxlKERpcmVjdG9yeUluZm8gZGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhVGFibGUgZHQgPSBuZXcgRGF0YVRhYmxlKCJSb290RGlyIik7Ci0gICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiTmFtZSIsIHR5cGVvZihzdHJpbmcpKTsKLSAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJTaXplIiwgdHlwZW9mKGxvbmcpKTsKLSAgICAgICAgICAgIGR0LkNvbHVtbnMuQWRkKCJDcmVhdGVkIiwgdHlwZW9mKERhdGVUaW1lKSk7Ci0gICAgICAgICAgICBkdC5Db2x1bW5zLkFkZCgiTW9kaWZpZWQiLCB0eXBlb2YoRGF0ZVRpbWUpKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGRpci5HZXREaXJlY3RvcmllcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByb3c9ZHQuTmV3Um93KCk7Ci0gICAgICAgICAgICAgICAgcm93WyJOYW1lIl09aXRlbS5OYW1lOwotICAgICAgICAgICAgICAgIHJvd1siQ3JlYXRlZCJdPWl0ZW0uQ3JlYXRpb25UaW1lOwotICAgICAgICAgICAgICAgIHJvd1siTW9kaWZpZWQiXT1pdGVtLkxhc3RXcml0ZVRpbWU7Ci0KLSAgICAgICAgICAgICAgICBkdC5Sb3dzLkFkZChyb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gZGlyLkdldEZpbGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJvdyA9IGR0Lk5ld1JvdygpOwotICAgICAgICAgICAgICAgIHJvd1siTmFtZSJdID0gaXRlbS5OYW1lOwotICAgICAgICAgICAgICAgIHJvd1siU2l6ZSJdID0gaXRlbS5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgcm93WyJDcmVhdGVkIl0gPSBpdGVtLkNyZWF0aW9uVGltZTsKLSAgICAgICAgICAgICAgICByb3dbIk1vZGlmaWVkIl0gPSBpdGVtLkxhc3RXcml0ZVRpbWU7Ci0KLSAgICAgICAgICAgICAgICBkdC5Sb3dzLkFkZChyb3cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGR0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTE0LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTE0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJhY2VmLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9TYW1wbGUxNC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqCi0gKiAKLSAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKiAKLSAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKLSAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCi0gKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEV5YWwgU2VhZ3VsbAkJCQlBZGRlZAkJCQkJCQkyMDEyLTA0LTAzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwotCi1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICBjbGFzcyBTYW1wbGUxNAotICB7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTYW1wbGUgMTQgLSBDb25kaXRpb25hbCBmb3JtYXR0aW5nIGV4YW1wbGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTE0KERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQotICAgIHsKLSAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMTQueGxzeCIpOwotCi0gICAgICBpZiAobmV3RmlsZS5FeGlzdHMpCi0gICAgICB7Ci0gICAgICAgIG5ld0ZpbGUuRGVsZXRlKCk7ICAvLyBlbnN1cmVzIHdlIGNyZWF0ZSBhIG5ldyB3b3JrYm9vawotICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTE0Lnhsc3giKTsKLSAgICAgIH0KLQotICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKLSAgICAgIHsKLSAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiQ29uZGl0aW9uYWwgRm9ybWF0dGluZyIpOwotCi0gICAgICAgIC8vIENyZWF0ZSA0IGNvbHVtbnMgb2Ygc2FtcGxlcyBkYXRhCi0gICAgICAgIGZvciAoaW50IGNvbCA9IDE7IGNvbCA8IDEwOyBjb2wrKykKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZCB0aGUgaGVhZGVycwotICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCBjb2xdLlZhbHVlID0gIlNhbXBsZSAiICsgY29sOwotCi0gICAgICAgICAgZm9yIChpbnQgcm93ID0gMjsgcm93IDwgMjE7IHJvdysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFkZCBzb21lIGl0ZW1zLi4uCi0gICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdLlZhbHVlID0gcm93OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gVHdvQ29sb3JTY2FsZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIGV4YW1wbGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFeGNlbEFkZHJlc3MgY2ZBZGRyZXNzMSA9IG5ldyBFeGNlbEFkZHJlc3MoIkEyOkExMCIpOwotICAgICAgICB2YXIgY2ZSdWxlMSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVHdvQ29sb3JTY2FsZShjZkFkZHJlc3MxKTsKLQotICAgICAgICAvLyBOb3csIGxldHMgY2hhbmdlIHNvbWUgcHJvcGVydGllczoKLSAgICAgICAgY2ZSdWxlMS5Mb3dWYWx1ZS5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bTsKLSAgICAgICAgY2ZSdWxlMS5Mb3dWYWx1ZS5WYWx1ZSA9IDQ7Ci0gICAgICAgIGNmUnVsZTEuTG93VmFsdWUuQ29sb3IgPSBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoIiNGRkZGRUI4NCIpOwotICAgICAgICBjZlJ1bGUxLkhpZ2hWYWx1ZS5UeXBlID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGE7Ci0gICAgICAgIGNmUnVsZTEuSGlnaFZhbHVlLkZvcm11bGEgPSAiSUYoJEckMT1cIkE8L3g6JidjZlJ1bGU+XCIsMSw1KSI7Ci0gICAgICAgIGNmUnVsZTEuU3RvcElmVHJ1ZSA9IHRydWU7Ci0gICAgICAgIGNmUnVsZTEuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLQotICAgICAgICAvLyBCdXQgb3RoZXJzIHlvdSBjYW4ndCAocmVhZG9ubHkpCi0gICAgICAgIC8vIGNmUnVsZTEuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFRocmVlQ29sb3JTY2FsZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIGV4YW1wbGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFeGNlbEFkZHJlc3MgY2ZBZGRyZXNzMiA9IG5ldyBFeGNlbEFkZHJlc3MoMiwgMiwgMTAsIDIpOyAgLy89IkIyOkIxMCIKLSAgICAgICAgdmFyIGNmUnVsZTIgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRocmVlQ29sb3JTY2FsZShjZkFkZHJlc3MyKTsKLQotICAgICAgICAvLyBDaGFuZ2luZyBzb21lIHByb3BlcnRpZXMgYWdhaW4KLSAgICAgICAgY2ZSdWxlMi5Qcmlvcml0eSA9IDE7Ci0gICAgICAgIGNmUnVsZTIuTWlkZGxlVmFsdWUuVHlwZSA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50aWxlOwotICAgICAgICBjZlJ1bGUyLk1pZGRsZVZhbHVlLlZhbHVlID0gMzA7Ci0gICAgICAgIGNmUnVsZTIuU3RvcElmVHJ1ZSA9IHRydWU7Ci0KLSAgICAgICAgLy8gWW91IGNhbiBhY2Nlc3MgYSBydWxlIGJ5IGl0cyBQcmlvcml0eQotICAgICAgICB2YXIgY2ZSdWxlMlByaW9yaXR5ID0gY2ZSdWxlMi5Qcmlvcml0eTsKLSAgICAgICAgdmFyIGNmUnVsZTJfMSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuUnVsZXNCeVByaW9yaXR5KGNmUnVsZTJQcmlvcml0eSk7Ci0KLSAgICAgICAgLy8gQW5kIHlvdSBjYW4gZXZlbiBjaGFuZ2UgdGhlIHJ1bGUncyBBZGRyZXNzCi0gICAgICAgIGNmUnVsZTJfMS5BZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygiWjE6WjMiKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEFkZGluZyBhbm90aGVyIFRocmVlQ29sb3JTY2FsZSBpbiBhIGRpZmZlcmVudCB3YXkgKG9ic2VydmUgdGhhdCB3ZSBhcmUKLSAgICAgICAgLy8gcG9pbnRpbmcgdG8gdGhlIHNhbWUgcmFuZ2UgYXMgdGhlIGZpcnN0IHJ1bGUgd2UgZW50ZXJlZC4gRXhjZWwgYWxsb3dzIGl0IHRvCi0gICAgICAgIC8vIGhhcHBlbiBhbmQgZ3JvdXAgdGhlIHJ1bGVzIGluIG9uZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBub2RlKQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUzID0gd29ya3NoZWV0LkNlbGxzW2NmQWRkcmVzczEuQWRkcmVzc10uQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRocmVlQ29sb3JTY2FsZSgpOwotICAgICAgICBjZlJ1bGUzLkxvd1ZhbHVlLkNvbG9yID0gQ29sb3IuTGVtb25DaGlmZm9uOwotICAgICAgICAKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDaGFuZ2UgdGhlIHJ1bGVzIHByaW9yaXRpZXMgdG8gY2hhbmdlIHRoZWlyIGV4ZWN1dGlvbiBvcmRlcgotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGNmUnVsZTMuUHJpb3JpdHkgPSAxOwotICAgICAgICBjZlJ1bGUxLlByaW9yaXR5ID0gMjsKLSAgICAgICAgY2ZSdWxlMi5Qcmlvcml0eSA9IDM7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYW4gQWJvdmUgQXZlcmFnZSBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTUgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEFib3ZlQXZlcmFnZSgKLSAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOwotICAgICAgICBjZlJ1bGU1LlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgIGNmUnVsZTUuU3R5bGUuRm9udC5Db2xvci5Db2xvciA9IENvbG9yLlJlZDsKLSAgICAgICAgY2ZSdWxlNS5TdHlsZS5Gb250LlN0cmlrZSA9IHRydWU7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYW4gQWJvdmUgT3IgRXF1YWwgQXZlcmFnZSBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTYgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoCi0gICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIEJlbG93IEF2ZXJhZ2UgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGU3ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWxvd0F2ZXJhZ2UoCi0gICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcygiQjExOkIyMCIpKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIEJlbG93IE9yIEVxdWFsIEF2ZXJhZ2UgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGU4ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWxvd09yRXF1YWxBdmVyYWdlKAotICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoIkIxMTpCMjAiKSk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBBYm92ZSBTdGREZXYgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGU5ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZVN0ZERldigKLSAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOwotICAgICAgICAgIGNmUnVsZTkuU3RkRGV2ID0gMDsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIEJlbG93IFN0ZERldiBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTEwID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWxvd1N0ZERldigKLSAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOwotCi0gICAgICAgIGNmUnVsZTEwLlN0ZERldiA9IDI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBCb3R0b20gcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUxMSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQm90dG9tKAotICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoIkIxMTpCMjAiKSk7Ci0KLSAgICAgICAgY2ZSdWxlMTEuUmFuayA9IDQ7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBCb3R0b20gUGVyY2VudCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTEyID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCb3R0b21QZXJjZW50KAotICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoIkIxMTpCMjAiKSk7Ci0KLSAgICAgICAgY2ZSdWxlMTIuUmFuayA9IDE1OwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgVG9wIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMTMgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvcCgKLSAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgVG9wIFBlcmNlbnQgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUxNCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVG9wUGVyY2VudCgKLSAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKCJCMTE6QjIwIikpOwotICAgICAgICAKLSAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLkxlZnQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47Ci0gICAgICAgIGNmUnVsZTE0LlN0eWxlLkJvcmRlci5MZWZ0LkNvbG9yLlRoZW1lID0gMzsKLSAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuRGFzaERvdDsKLSAgICAgICAgY2ZSdWxlMTQuU3R5bGUuQm9yZGVyLkJvdHRvbS5Db2xvci5JbmRleD04OwotICAgICAgICBjZlJ1bGUxNC5TdHlsZS5Cb3JkZXIuUmlnaHQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47Ci0gICAgICAgIGNmUnVsZTE0LlN0eWxlLkJvcmRlci5SaWdodC5Db2xvci5Db2xvcj1Db2xvci5CbHVlOwotICAgICAgICBjZlJ1bGUxNC5TdHlsZS5Cb3JkZXIuVG9wLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5IYWlyOwotICAgICAgICBjZlJ1bGUxNC5TdHlsZS5Cb3JkZXIuVG9wLkNvbG9yLkF1dG89dHJ1ZTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIExhc3QgNyBEYXlzIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFeGNlbEFkZHJlc3MgdGltZVBlcmlvZEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKCJEMjE6RzM0IEMxMTpDMjAiKTsKLSAgICAgICAgdmFyIGNmUnVsZTE1ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMYXN0N0RheXMoCi0gICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOwotCi0gICAgICAgIGNmUnVsZTE1LlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5MaWdodFRyZWxsaXM7Ci0gICAgICAgIGNmUnVsZTE1LlN0eWxlLkZpbGwuUGF0dGVybkNvbG9yLkNvbG9yID0gQ29sb3IuQnVybHlXb29kOwotICAgICAgICBjZlJ1bGUxNS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5Db2xvciA9IENvbG9yLkxpZ2h0Q3lhbjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIExhc3QgTW9udGggcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUxNiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGFzdE1vbnRoKAotICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUxNi5TdHlsZS5OdW1iZXJGb3JtYXQuRm9ybWF0ID0gIllZWVkiOwotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIExhc3QgV2VlayBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTE3ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMYXN0V2VlaygKLSAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7Ci0gICAgICAgIGNmUnVsZTE3LlN0eWxlLk51bWJlckZvcm1hdC5Gb3JtYXQgPSAiWVlZWSI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBOZXh0IE1vbnRoIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMTggPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5leHRNb250aCgKLSAgICAgICAgICB0aW1lUGVyaW9kQWRkcmVzcyk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBOZXh0IFdlZWsgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUxOSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTmV4dFdlZWsoCi0gICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgVGhpcyBNb250aCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTIwID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaGlzTW9udGgoCi0gICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgVGhpcyBXZWVrIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMjEgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRoaXNXZWVrKAotICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIFRvZGF5IHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMjIgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvZGF5KAotICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIFRvbW9ycm93IHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMjMgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvbW9ycm93KAotICAgICAgICAgIHRpbWVQZXJpb2RBZGRyZXNzKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIFllc3RlcmRheSBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTI0ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRZZXN0ZXJkYXkoCi0gICAgICAgICAgdGltZVBlcmlvZEFkZHJlc3MpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmVnaW5zV2l0aCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgRXhjZWxBZGRyZXNzIGNlbGxJc0FkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKCJFMTE6RTIwIik7Ci0gICAgICAgIHZhciBjZlJ1bGUyNSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVnaW5zV2l0aCgKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUyNS5UZXh0ID0gIlNlYXJjaE1lIjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIEJldHdlZW4gcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUyNiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmV0d2VlbigKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUyNi5Gb3JtdWxhID0gIklGKEUxMT41LDEwLDIwKSI7Ci0gICAgICAgIGNmUnVsZTI2LkZvcm11bGEyID0gIklGKEUxMT41LDMwLDUwKSI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBDb250YWluc0JsYW5rcyBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTI3ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc0JsYW5rcygKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIENvbnRhaW5zRXJyb3JzIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMjggPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZENvbnRhaW5zRXJyb3JzKAotICAgICAgICAgIGNlbGxJc0FkZHJlc3MpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQ29udGFpbnNUZXh0IHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMjkgPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZENvbnRhaW5zVGV4dCgKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUyOS5UZXh0ID0gIk1lIjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIER1cGxpY2F0ZVZhbHVlcyBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTMwID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGREdXBsaWNhdGVWYWx1ZXMoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYW4gRW5kc1dpdGggcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUzMSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRW5kc1dpdGgoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlMzEuVGV4dCA9ICJFbmRUZXh0IjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhbiBFcXVhbCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTMyID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRFcXVhbCgKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUzMi5Gb3JtdWxhID0gIjYiOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGFuIEV4cHJlc3Npb24gcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUzMyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXhwcmVzc2lvbigKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUzMy5Gb3JtdWxhID0gIkUxMT1FMTIiOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgR3JlYXRlclRoYW4gcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUzNCA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkR3JlYXRlclRoYW4oCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlMzQuRm9ybXVsYSA9ICJTRShFMTE8MTAsMTAsNjUpIjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIEdyZWF0ZXJUaGFuT3JFcXVhbCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTM1ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRHcmVhdGVyVGhhbk9yRXF1YWwoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlMzUuRm9ybXVsYSA9ICIzNSI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBMZXNzVGhhbiBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTM2ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMZXNzVGhhbigKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICBjZlJ1bGUzNi5Gb3JtdWxhID0gIjM2IjsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIExlc3NUaGFuT3JFcXVhbCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTM3ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMZXNzVGhhbk9yRXF1YWwoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlMzcuRm9ybXVsYSA9ICIzNyI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBOb3RCZXR3ZWVuIHJ1bGUKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB2YXIgY2ZSdWxlMzggPSB3b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEJldHdlZW4oCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlMzguRm9ybXVsYSA9ICIzMzMiOwotICAgICAgICBjZlJ1bGUzOC5Gb3JtdWxhMiA9ICI5OTkiOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGEgTm90Q29udGFpbnNCbGFua3MgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGUzOSA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNCbGFua3MoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYSBOb3RDb250YWluc0Vycm9ycyBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTQwID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RDb250YWluc0Vycm9ycygKLSAgICAgICAgICBjZWxsSXNBZGRyZXNzKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIENyZWF0ZSBhIE5vdENvbnRhaW5zVGV4dCBydWxlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdmFyIGNmUnVsZTQxID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RDb250YWluc1RleHQoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlNDEuVGV4dCA9ICJOb3RNZSI7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBDcmVhdGUgYW4gTm90RXF1YWwgcnVsZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHZhciBjZlJ1bGU0MiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90RXF1YWwoCi0gICAgICAgICAgY2VsbElzQWRkcmVzcyk7Ci0KLSAgICAgICAgY2ZSdWxlNDIuRm9ybXVsYSA9ICIxNCI7Ci0KLSAgICAgICAgRXhjZWxBZGRyZXNzIGNmQWRkcmVzczQzID0gbmV3IEV4Y2VsQWRkcmVzcygiRzI6RzEwIik7Ci0gICAgICAgIHZhciBjZlJ1bGU0MyA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVGhyZWVJY29uU2V0KGNmQWRkcmVzczQzLCBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlLlRyYWZmaWNMaWdodHMxKTsKLQotICAgICAgICBFeGNlbEFkZHJlc3MgY2ZBZGRyZXNzNDQgPSBuZXcgRXhjZWxBZGRyZXNzKCJIMjpIMTAiKTsKLSAgICAgICAgdmFyIGNmUnVsZTQ0ID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGREYXRhYmFyKGNmQWRkcmVzczQ0LCBDb2xvci5EYXJrQmx1ZSk7Ci0gICAgICAgIAotICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFJlbW92aW5nIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgcnVsZXMKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gUmVtb3ZlIG9uZSBSdWxlIGJ5IGl0cyBvYmplY3QKLSAgICAgICAgLy93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJlbW92ZShjZlJ1bGUxKTsKLQotICAgICAgICAvLyBSZW1vdmUgb25lIFJ1bGUgYnkgaW5kZXgKLSAgICAgICAgLy93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJlbW92ZUF0KDEpOwotCi0gICAgICAgIC8vIFJlbW92ZSBvbmUgUnVsZSBieSBpdHMgUHJpb3JpdHkKLSAgICAgICAgLy93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJlbW92ZUJ5UHJpb3JpdHkoMik7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgUnVsZXMKLSAgICAgICAgLy93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJlbW92ZUFsbCgpOwotCi0gICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKLSAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIkNvbmRpdGlvbmFsIEZvcm1hdHRpbmciOwotICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkV5YWwgU2VhZ3VsbCI7Ci0gICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21tZW50cyA9ICJUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGFkZCBDb25kaXRpb25hbCBGb3JtYXR0aW5nIHRvIGFuIEV4Y2VsIDIwMDcgd29ya3NoZWV0IHVzaW5nIEVQUGx1cyI7Ci0KLSAgICAgICAgLy8gc2V0IHNvbWUgY3VzdG9tIHByb3BlcnR5IHZhbHVlcwotICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQ2hlY2tlZCBieSIsICJFeWFsIFNlYWd1bGwiKTsKLSAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkFzc2VtYmx5TmFtZSIsICJFUFBsdXMiKTsKLQotICAgICAgICAvLyBzYXZlIG91ciBuZXcgd29ya2Jvb2sgYW5kIHdlIGFyZSBkb25lIQotICAgICAgICBwYWNrYWdlLlNhdmUoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMTUuY3MgYi9TYW1wbGVBcHAvU2FtcGxlMTUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjA5ZTEuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTE1LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLe+7vy8qIAotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqICBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEyLTA1LTAxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Ci1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIGNsYXNzIFNhbXBsZTE1Ci0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVkJBU2FtcGxlKERpcmVjdG9yeUluZm8gb3V0cHV0RGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0NyZWF0ZSBhIG1hY3JvLWVuYWJsZWQgd29ya2Jvb2sgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgVkJBU2FtcGxlMShvdXRwdXREaXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL09wZW4gU2FtcGxlIDEgYW5kIGFkZCBjb2RlIHRvIGNoYW5nZSB0aGUgY2hhcnQgdG8gYSBidWJibGUgY2hhcnQuCi0gICAgICAgICAgICBWQkFTYW1wbGUyKG91dHB1dERpcik7Ci0KLSAgICAgICAgICAgIC8vU2ltcGxlIGJhdHRsZXNoaXBzIGdhbWUgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgVkJBU2FtcGxlMyhvdXRwdXREaXIpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLQotICAgICAgICAgICAgLy9BZGQgYSB3b3Jrc2hlZXQuCi0gICAgICAgICAgICB2YXIgd3M9cGNrLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJWQkEgU2FtcGxlIik7Ci0gICAgICAgICAgICB3cy5EcmF3aW5ncy5BZGRTaGFwZSgiVkJBU2FtcGxlUmVjdCIsIGVTaGFwZVN0eWxlLlJvdW5kUmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ3JlYXRlIGEgdmJhIHByb2plY3QgICAgICAgICAgICAgCi0gICAgICAgICAgICBwY2suV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOwotCi0gICAgICAgICAgICAvL05vdyBhZGQgc29tZSBjb2RlIHRvIHVwZGF0ZSB0aGUgdGV4dCBvZiB0aGUgc2hhcGUuLi4KLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIlByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKSIpOwotICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiICAgIFtWQkEgU2FtcGxlXS5TaGFwZXMoXCJWQkFTYW1wbGVSZWN0XCIpLlRleHRFZmZlY3QuVGV4dCA9IFwiVGhpcyB0ZXh0IGlzIHNldCBmcm9tIFZCQSFcIiIpOwotICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiRW5kIFN1YiIpOwotICAgICAgICAgICAgcGNrLldvcmtib29rLkNvZGVNb2R1bGUuQ29kZSA9IHNiLlRvU3RyaW5nKCk7ICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8vQW5kIFNhdmUgYXMgeGxzbQotICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMTUtMS54bHNtIikpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMihEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLSAgICAgICAgewotICAgICAgICAgICAgLy9PcGVuIFNhbXBsZSAxIGFnYWluCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4IikpOwotICAgICAgICAgICAgLy9DcmVhdGUgYSB2YmEgcHJvamVjdCAgICAgICAgICAgICAKLSAgICAgICAgICAgIHBjay5Xb3JrYm9vay5DcmVhdGVWQkFQcm9qZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vTm93IGFkZCBzb21lIGNvZGUgdGhhdCBjcmVhdGVzIGEgYnViYmxlIGNoYXJ0Li4uCi0gICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJQdWJsaWMgU3ViIENyZWF0ZUJ1YmJsZUNoYXJ0KCkiKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIkRpbSBjbyBBcyBDaGFydE9iamVjdCIpOwotICAgICAgICAgICAgc2IuQXBwZW5kTGluZSgiU2V0IGNvID0gSW52ZW50b3J5LkNoYXJ0T2JqZWN0cy5BZGQoMTAsIDEwMCwgNDAwLCAyMDApIik7Ci0gICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCJjby5DaGFydC5TZXRTb3VyY2VEYXRhIFNvdXJjZTo9UmFuZ2UoXCInSW52ZW50b3J5JyEkQiQxOiRFJDVcIikiKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoImNvLkNoYXJ0LkNoYXJ0VHlwZSA9IHhsQnViYmxlM0RFZmZlY3QgICAgICAgICAnQWRkIGEgYnViYmxlY2hhcnQiKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoIkVuZCBTdWIiKTsKLQotICAgICAgICAgICAgLy9DcmVhdGUgYSBuZXcgbW9kdWxlIGFuZCBzZXQgdGhlIGNvZGUKLSAgICAgICAgICAgIHZhciBtb2R1bGUgPSBwY2suV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzLkFkZE1vZHVsZSgiRVBQbHVzR2VuZXJhdGVkQ29kZSIpOwotICAgICAgICAgICAgbW9kdWxlLkNvZGUgPSBzYi5Ub1N0cmluZygpOwotCi0gICAgICAgICAgICAvL0NhbGwgdGhlIG5ld2x5IGNyZWF0ZWQgc3ViIGZyb20gdGhlIHdvcmtib29rIG9wZW4gZXZlbnQKLSAgICAgICAgICAgIHBjay5Xb3JrYm9vay5Db2RlTW9kdWxlLkNvZGUgPSAiUHJpdmF0ZSBTdWIgV29ya2Jvb2tfT3BlbigpXHJcbkNyZWF0ZUJ1YmJsZUNoYXJ0XHJcbkVuZCBTdWIiOwotCi0gICAgICAgICAgICAvL09wdGlvbmFsbHksIFNpZ24gdGhlIGNvZGUgd2l0aCB5b3VyIGNvbXBhbnkgY2VydGlmaWNhdGUuCi0gICAgICAgICAgICAvKiAgICAgICAgICAgIAotICAgICAgICAgICAgWDUwOVN0b3JlIHN0b3JlID0gbmV3IFg1MDlTdG9yZShTdG9yZUxvY2F0aW9uLkN1cnJlbnRVc2VyKTsKLSAgICAgICAgICAgIHN0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsKLSAgICAgICAgICAgIHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0LlNpZ25hdHVyZS5DZXJ0aWZpY2F0ZSA9IHN0b3JlLkNlcnRpZmljYXRlc1swXTsKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8vQW5kIFNhdmUgYXMgeGxzbQotICAgICAgICAgICAgcGNrLlNhdmVBcyhuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMTUtMi54bHNtIikpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVkJBU2FtcGxlMyhEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLSAgICAgICAgewotICAgICAgICAgICAgLy9Ob3csIGxldHMgZG8gc29tZXRoaW5nIGEgbGl0dGxlIGJpdCBtb3JlIGZ1bi4KLSAgICAgICAgICAgIC8vV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIHNpbXBsZSBiYXR0bGVzaGlwcyBnYW1lIGZyb20gc2NyYXRjaC4KLQotICAgICAgICAgICAgRXhjZWxQYWNrYWdlIHBjayA9IG5ldyBFeGNlbFBhY2thZ2UoKTsKLQotICAgICAgICAgICAgLy9BZGQgYSB3b3Jrc2hlZXQuCi0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkJhdHRsZXNoaXAiKTsKLQotICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7Ci0gICAgICAgICAgICB3cy5WaWV3LlNob3dIZWFkZXJzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHdzLkRlZmF1bHRDb2xXaWR0aCA9IDM7Ci0gICAgICAgICAgICB3cy5EZWZhdWx0Um93SGVpZ2h0ID0gMTU7Ci0KLSAgICAgICAgICAgIGludCBncmlkU2l6ZT0xMDsKLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIGJvYXJkcwotICAgICAgICAgICAgdmFyIGJvYXJkMSA9IHdzLkNlbGxzWzIsIDIsIDIgKyBncmlkU2l6ZSAtIDEsIDIgKyBncmlkU2l6ZSAtIDFdOwotICAgICAgICAgICAgdmFyIGJvYXJkMiA9IHdzLkNlbGxzWzIsIDQrZ3JpZFNpemUtMSwgMiArIGdyaWRTaXplLTEsIDQgKyAoZ3JpZFNpemUtMSkqMl07Ci0gICAgICAgICAgICBDcmVhdGVCb2FyZChib2FyZDEpOwotICAgICAgICAgICAgQ3JlYXRlQm9hcmQoYm9hcmQyKTsKLSAgICAgICAgICAgIHdzLlNlbGVjdCgiQjIiKTsKLSAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uSXNQcm90ZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJvdGVjdGlvbi5BbGxvd1NlbGVjdExvY2tlZENlbGxzID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIFZCQSBQcm9qZWN0Ci0gICAgICAgICAgICBwY2suV29ya2Jvb2suQ3JlYXRlVkJBUHJvamVjdCgpOwotICAgICAgICAgICAgLy9QYXNzd29yZCBwcm90ZWN0IHlvdXIgY29kZQotICAgICAgICAgICAgcGNrLldvcmtib29rLlZiYVByb2plY3QuUHJvdGVjdGlvbi5TZXRQYXNzd29yZCgiRVBQbHVzIik7Ci0KLSAgICAgICAgICAgIC8vQWRkIGFsbCB0aGUgY29kZSBmcm9tIHRoZSB0ZXh0ZmlsZXMgaW4gdGhlIFZiYS1Db2RlIHN1Yi1mb2xkZXIuCi0gICAgICAgICAgICBwY2suV29ya2Jvb2suQ29kZU1vZHVsZS5Db2RlID0gRmlsZS5SZWFkQWxsVGV4dCgiLi5cXC4uXFxWQkEtQ29kZVxcVGhpc1dvcmtib29rLnR4dCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0FkZCB0aGUgc2hlZXQgY29kZQotICAgICAgICAgICAgd3MuQ29kZU1vZHVsZS5Db2RlID0gRmlsZS5SZWFkQWxsVGV4dCgiLi5cXC4uXFxWQkEtQ29kZVxcQmF0dGxlc2hpcFNoZWV0LnR4dCIpOwotICAgICAgICAgICAgdmFyIG0xPXBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJDb2RlIik7Ci0gICAgICAgICAgICBzdHJpbmcgY29kZSA9IEZpbGUuUmVhZEFsbFRleHQoIi4uXFwuLlxcVkJBLUNvZGVcXENvZGVNb2R1bGUudHh0Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vSW5zZXJ0IHlvdXIgc2hpcHMgb24gdGhlIHJpZ2h0IGJvYXJkLiB5b3UgY2FuIGNoYW5nZXMgdGhlc2UsIGJ1dCBkb24ndCBjaGVhdCA7KQotICAgICAgICAgICAgdmFyIHNoaXBzID0gbmV3IHN0cmluZ1tdewotICAgICAgICAgICAgICAgICJOMzpONyIsCi0gICAgICAgICAgICAgICAgIlAyOlMyIiwKLSAgICAgICAgICAgICAgICAiVjk6VjExIiwKLSAgICAgICAgICAgICAgICAiTzEwOlExMCIsCi0gICAgICAgICAgICAgICAgIlIxMTpTMTEifTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9Ob3RlOiBGb3Igc2VjdXJpdHkgcmVhc29ucyB5b3Ugc2hvdWxkIG5ldmVyIG1peCBleHRlcm5hbCBkYXRhIGFuZCBjb2RlKHRvIGF2b2lkIGNvZGUgaW5qZWN0aW9ucyEpLCBlc3BlY2lhbGx5IG5vdCBvbiBhIHdlYnNlcnZlci4gCi0gICAgICAgICAgICAvL0lmIHlvdSBkZXNpZGUgdG8gZG8gdGhhdCBhbnl3YXksIGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkYXRhLgotICAgICAgICAgICAgLy9CZSBleHRyYSBjYXJlZnVsbCBpZiB5b3Ugc2lnbiB0aGUgY29kZS4KLSAgICAgICAgICAgIC8vUmVhZCBtb3JlIGhlcmUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2RlX2luamVjdGlvbgotCi0gICAgICAgICAgICBjb2RlID0gc3RyaW5nLkZvcm1hdChjb2RlLCBzaGlwc1swXSxzaGlwc1sxXSxzaGlwc1syXSxzaGlwc1szXSxzaGlwc1s0XSwgYm9hcmQxLkFkZHJlc3MsIGJvYXJkMi5BZGRyZXNzKTsgIC8vU2hpcHMgYXJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0YW50cyBpbiB0aGUgbW9kdWxlCi0gICAgICAgICAgICBtMS5Db2RlID0gY29kZTsKLQotICAgICAgICAgICAgLy9TaGlwcyBhcmUgZGlzcGxheWVkIHdpdGggYSBibGFjayBiYWNrZ3JvdW5kCi0gICAgICAgICAgICBzdHJpbmcgc2hpcHNhZGRyZXNzID0gc3RyaW5nLkpvaW4oIiwiLCBzaGlwcyk7Ci0gICAgICAgICAgICB3cy5DZWxsc1tzaGlwc2FkZHJlc3NdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgd3MuQ2VsbHNbc2hpcHNhZGRyZXNzXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5CbGFjayk7Ci0KLSAgICAgICAgICAgIHZhciBtMiA9IHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkTW9kdWxlKCJDb21wdXRlclBsYXkiKTsKLSAgICAgICAgICAgIG0yLkNvZGUgPSBGaWxlLlJlYWRBbGxUZXh0KCIuLlxcLi5cXFZCQS1Db2RlXFxDb21wdXRlclBsYXlNb2R1bGUudHh0Iik7Ci0KLSAgICAgICAgICAgIHZhciBjMSA9IHBjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkQ2xhc3MoIlNoaXAiLGZhbHNlKTsKLSAgICAgICAgICAgIGMxLkNvZGUgPSBGaWxlLlJlYWRBbGxUZXh0KCIuLlxcLi5cXFZCQS1Db2RlXFxTaGlwQ2xhc3MudHh0Iik7Ci0KLSAgICAgICAgICAgIC8vQWRkIHRoZSBpbmZvIHRleHQgc2hhcGUuCi0gICAgICAgICAgICB2YXIgdGIgPSB3cy5EcmF3aW5ncy5BZGRTaGFwZSgidHh0SW5mbyIsIGVTaGFwZVN0eWxlLlJlY3QpOwotICAgICAgICAgICAgdGIuU2V0UG9zaXRpb24oMSwgMCwgMjcsIDApOwotICAgICAgICAgICAgdGIuRmlsbC5Db2xvciA9IENvbG9yLkxpZ2h0U2xhdGVHcmF5OwotICAgICAgICAgICAgdmFyIHJ0MSA9IHRiLlJpY2hUZXh0LkFkZCgiQmF0dGxlc2hpcHMiKTsKLSAgICAgICAgICAgIHJ0MS5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHRiLlJpY2hUZXh0LkFkZCgiXHJcbkRvdWJsZS1jbGljayBvbiB0aGUgbGVmdCBib2FyZCB0byBtYWtlIHlvdXIgbW92ZS4gRmluZCBhbmQgc2luayBhbGwgc2hpcHMgdG8gd2luISIpOwotCi0gICAgICAgICAgICAvL1NldCB0aGUgaGVhZGVycy4KLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJCMSIsICJDb21wdXRlciBHcmlkIik7Ci0gICAgICAgICAgICB3cy5TZXRWYWx1ZSgiTTEiLCAiWW91ciBHcmlkIik7Ci0gICAgICAgICAgICB3cy5Sb3coMSkuU3R5bGUuRm9udC5TaXplID0gMTg7Ci0KLSAgICAgICAgICAgIEFkZENoYXJ0KHdzLkNlbGxzWyJCMTMiXSwgImNodEhpdFBlcmNlbnQiLCAiUGxheWVyIik7Ci0gICAgICAgICAgICBBZGRDaGFydCh3cy5DZWxsc1siTTEzIl0sICJjaHRDb21wdXRlckhpdFBlcmNlbnQiLCAiQ29tcHV0ZXIiKTsKLQotICAgICAgICAgICAgd3MuTmFtZXMuQWRkKCJMb2dTdGFydCIsIHdzLkNlbGxzWyJCMjQiXSk7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjI0OlgyMjQiXS5TdHlsZS5Cb3JkZXIuQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUuVGhpbiwgQ29sb3IuQmxhY2spOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIyNTpYMjI0Il0uU3R5bGUuRm9udC5OYW1lID0gIkNvbnNvbGFzIjsKLSAgICAgICAgICAgIHdzLlNldFZhbHVlKCJCMjQiLCAiTG9nIik7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjI0Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMjQ6WDI0Il0uU3R5bGUuQm9yZGVyLkJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlLlRoaW4sIENvbG9yLkJsYWNrKTsKLSAgICAgICAgICAgIHZhciBjZj13cy5DZWxsc1siQjI1OkIyMjQiXS5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNUZXh0KCk7Ci0gICAgICAgICAgICBjZi5UZXh0ID0gImhpdCI7Ci0gICAgICAgICAgICBjZi5TdHlsZS5Gb250LkNvbG9yLkNvbG9yID0gQ29sb3IuUmVkOwotCi0gICAgICAgICAgICAvL0lmIHlvdSBoYXZlIGEgdmFsaWQgY2VydGlmaWNhdGUgZm9yIGNvZGUgc2lnbmluZyB5b3UgY2FuIHVzZSB0aGlzIGNvZGUgdG8gc2V0IGl0LgotICAgICAgICAgICAgLy8vKioqIFRyeSB0byBmaW5kIGEgY2VydCB2YWxpZCBmb3Igc2lnbmluZy4uLiAqKiovCi0gICAgICAgICAgICAvL1g1MDlTdG9yZSBzdG9yZSA9IG5ldyBYNTA5U3RvcmUoU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7Ci0gICAgICAgICAgICAvL3N0b3JlLk9wZW4oT3BlbkZsYWdzLlJlYWRPbmx5KTsgICAKLSAgICAgICAgICAgIC8vZm9yZWFjaCAodmFyIGNlcnQgaW4gc3RvcmUuQ2VydGlmaWNhdGVzKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBpZiAoY2VydC5IYXNQcml2YXRlS2V5ICYmIGNlcnQuTm90QmVmb3JlIDw9IERhdGVUaW1lLlRvZGF5ICYmIGNlcnQuTm90QWZ0ZXIgPj0gRGF0ZVRpbWUuVG9kYXkpCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgcGNrLldvcmtib29rLlZiYVByb2plY3QuU2lnbmF0dXJlLkNlcnRpZmljYXRlID0gY2VydDsKLSAgICAgICAgICAgIC8vICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICBwY2suU2F2ZUFzKG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxNS0zLnhsc20iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZENoYXJ0KEV4Y2VsUmFuZ2Ugcm5nLHN0cmluZyBuYW1lLCBzdHJpbmcgcHJlZml4KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY2hydCA9IChFeGNlbFBpZUNoYXJ0KXJuZy5Xb3Jrc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQobmFtZSwgZUNoYXJ0VHlwZS5QaWUpOwotICAgICAgICAgICAgY2hydC5TZXRQb3NpdGlvbihybmcuU3RhcnQuUm93LTEsIDAsIHJuZy5TdGFydC5Db2x1bW4tMSwgMCk7Ci0gICAgICAgICAgICBjaHJ0LlRvLlJvdyA9IHJuZy5TdGFydC5Sb3crOTsKLSAgICAgICAgICAgIGNocnQuVG8uQ29sdW1uID0gcm5nLlN0YXJ0LkNvbHVtbiArIDk7Ci0gICAgICAgICAgICBjaHJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUxODsKLSAgICAgICAgICAgIGNocnQuRGF0YUxhYmVsLlNob3dQZXJjZW50ID0gdHJ1ZTsKLQotICAgICAgICAgICAgdmFyIHNlcmllID0gY2hydC5TZXJpZXMuQWRkKHJuZy5PZmZzZXQoMiwgMiwgMSwgMiksIHJuZy5PZmZzZXQoMSwgMiwgMSwgMikpOwotICAgICAgICAgICAgc2VyaWUuSGVhZGVyID0gIkhpdHMiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjaHJ0LlRpdGxlLlRleHQgPSAiSGl0IHJhdGlvIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIG4xID0gcm5nLldvcmtzaGVldC5OYW1lcy5BZGQocHJlZml4ICsgIk1pc3NlcyIsIHJuZy5PZmZzZXQoMiwgMikpOwotICAgICAgICAgICAgbjEuVmFsdWUgPSAwOwotICAgICAgICAgICAgdmFyIG4yID0gcm5nLldvcmtzaGVldC5OYW1lcy5BZGQocHJlZml4ICsgIkhpdHMiLCBybmcuT2Zmc2V0KDIsIDMpKTsKLSAgICAgICAgICAgIG4yLlZhbHVlID0gMDsKLSAgICAgICAgICAgIHJuZy5PZmZzZXQoMSwgMikuVmFsdWUgPSAiTWlzc2VzIjsKLSAgICAgICAgICAgIHJuZy5PZmZzZXQoMSwgMykuVmFsdWUgPSAiSGl0cyI7ICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIENyZWF0ZUJvYXJkKEV4Y2VsUmFuZ2Ugcm5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0NyZWF0ZSBhIGdyYWRpYW50IGJhY2tncm91bmQgd2l0aCBvbmUgZGFyayBhbmQgb25lIGxpZ2h0IGJsdWUgY29sb3IKLSAgICAgICAgICAgIHJuZy5TdHlsZS5GaWxsLkdyYWRpZW50LkNvbG9yMS5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigweDgwLCAweDgwLCAwWEZGKSk7Ci0gICAgICAgICAgICBybmcuU3R5bGUuRmlsbC5HcmFkaWVudC5Db2xvcjIuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoMHgyMCwgMHgyMCwgMFhGRikpOwotICAgICAgICAgICAgcm5nLlN0eWxlLkZpbGwuR3JhZGllbnQuVHlwZSA9IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5Ob25lOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDw9IHJuZy5FbmQuQ29sdW1uIC0gcm5nLlN0YXJ0LkNvbHVtbjsgY29sKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDw9IHJuZy5FbmQuUm93IC0gcm5nLlN0YXJ0LlJvdzsgcm93KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sICUgNCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBybmcuT2Zmc2V0KHJvdywgY29sLCAxLCAxKS5TdHlsZS5GaWxsLkdyYWRpZW50LkRlZ3JlZSA9IDQ1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2wgJSA0ID09IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJuZy5PZmZzZXQocm93LCBjb2wsIDEsIDEpLlN0eWxlLkZpbGwuR3JhZGllbnQuRGVncmVlID0gNzA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCAlIDQgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcm5nLk9mZnNldChyb3csIGNvbCwgMSwgMSkuU3R5bGUuRmlsbC5HcmFkaWVudC5EZWdyZWUgPSAxMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBybmcuT2Zmc2V0KHJvdywgY29sLCAxLCAxKS5TdHlsZS5GaWxsLkdyYWRpZW50LkRlZ3JlZSA9IDEzNTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vU2V0IHRoZSBpbm5lciBjZWxsIGJvcmRlciB0byB0aGluLCBsaWdodCBncmF5Ci0gICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLlRvcC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKLSAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuVG9wLkNvbG9yLlNldENvbG9yKENvbG9yLkdyYXkpOwotICAgICAgICAgICAgcm5nLlN0eWxlLkJvcmRlci5SaWdodC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKLSAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuUmlnaHQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuR3JheSk7Ci0gICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkxlZnQuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47Ci0gICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkxlZnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuR3JheSk7Ci0gICAgICAgICAgICBybmcuU3R5bGUuQm9yZGVyLkJvdHRvbS5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKLSAgICAgICAgICAgIHJuZy5TdHlsZS5Cb3JkZXIuQm90dG9tLkNvbG9yLlNldENvbG9yKENvbG9yLkdyYXkpOwotCi0gICAgICAgICAgICAvL1NvbGlkIGJsYWNrIGJvcmRlciBhcm91bmQgdGhlIGJvYXJkLgotICAgICAgICAgICAgcm5nLlN0eWxlLkJvcmRlci5Cb3JkZXJBcm91bmQoRXhjZWxCb3JkZXJTdHlsZS5NZWRpdW0sIENvbG9yLkJsYWNrKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGUxNi5jcyBiL1NhbXBsZUFwcC9TYW1wbGUxNi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MGVhYS4uMDAwMDAwMAotLS0gYS9TYW1wbGVBcHAvU2FtcGxlMTYuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5EYXRhOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwotCi1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIGNsYXNzIFNhbXBsZTE2Ci0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuU2FtcGxlMTYoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YVRhYmxlID0gbmV3IERhdGFUYWJsZSgidGVzdCIpOwotICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Db2x1bW5zLkFkZCgiY29sMSIpOwotICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Db2x1bW5zLkFkZCgiY29sMiIpOwotICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Db2x1bW5zLkFkZCgiY29sMyIpOwotICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Db2x1bW5zLkFkZCgiY29sNCIpOwotICAgICAgICAgICAgICAgIGRhdGFUYWJsZS5Sb3dzLkFkZCgicXdlMTEiLCAicXdlMTIiLCAicXdlMTMiLCAicXdlMTQiKTsKLSAgICAgICAgICAgICAgICBkYXRhVGFibGUuUm93cy5BZGQoInF3ZTIxIiwgInF3ZTIyIiwgInF3ZTIzIiwgInF3ZTI0Iik7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZChkYXRhVGFibGUuVGFibGVOYW1lKTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExIl0uTG9hZEZyb21EYXRhVGFibGUoZGF0YVRhYmxlLCB0cnVlLCBUYWJsZVN0eWxlcy5Ob25lKTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGlvbi5BbGxvd1NlbGVjdExvY2tlZENlbGxzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LlByb3RlY3Rpb24uQWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGlvbi5BbGxvd1NvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Qcm90ZWN0aW9uLkFsbG93Rm9ybWF0Q29sdW1ucyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LlByb3RlY3Rpb24uQWxsb3dBdXRvRmlsdGVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUHJvdGVjdGlvbi5BbGxvd0VkaXRPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Qcm90ZWN0aW9uLklzUHJvdGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB2YXIgcjE9d29ya3NoZWV0LlByb3RlY3RlZFJhbmdlcy5BZGQoIlJhbmdlMSIsIG5ldyBFeGNlbEFkZHJlc3MoMSwgMSwgd29ya3NoZWV0LkRpbWVuc2lvbi5FbmQuUm93LCA0KSk7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LlByb3RlY3RlZFJhbmdlcy5SZW1vdmUocjEpOwotICAgICAgICAgICAgICAgIHZhciByMiA9IHdvcmtzaGVldC5Qcm90ZWN0ZWRSYW5nZXMuQWRkKCJSYW5nZTIiLCBuZXcgRXhjZWxBZGRyZXNzKCJGMzpUMTIsRjE1OlQzMCIpKTsKLSAgICAgICAgICAgICAgICByMi5TZXRQYXNzd29yZCgiRVBQbHVzIik7Ci0KLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDEpLldpZHRoID0gMzA7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigyKS5XaWR0aCA9IDMwOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMykuV2lkdGggPSAxMDA7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig0KS5XaWR0aCA9IDEwMDsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNCwgd29ya3NoZWV0LkRpbWVuc2lvbi5FbmQuUm93LCA0XS5TdHlsZS5Mb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMywgd29ya3NoZWV0LkRpbWVuc2lvbi5FbmQuUm93LCA0XS5TdHlsZS5XcmFwVGV4dCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIGZzID0gbmV3IEZpbGVTdHJlYW0oUGF0aC5Db21iaW5lKG91dHB1dERpci5Ub1N0cmluZygpLCAic2FtcGxlMTYueGxzeCIpLCBGaWxlTW9kZS5DcmVhdGUpKQotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLlNhdmVBcyhmcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVzaW5nICh2YXIgZnMgPSBuZXcgRmlsZVN0cmVhbShQYXRoLkNvbWJpbmUob3V0cHV0RGlyLlRvU3RyaW5nKCksICJzYW1wbGUxNi54bHN4IiksIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCkpCi0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKGZzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgd29ya3NoZWV0MSBpbiBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcHJDb2xsZWN0aW9uID0gd29ya3NoZWV0MS5Qcm90ZWN0ZWRSYW5nZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwckNvbGxlY3Rpb24uQ291bnQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJFeHBlY3RlZCAxIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMi5jcyBiL1NhbXBsZUFwcC9TYW1wbGUyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2E2ZWI0Li4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9TYW1wbGUyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKgotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS+RsbG1hbgkJQWRkZWQJCTEwLVNFUC0yMDA5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotCi1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gU2ltcGx5IG9wZW5zIGFuIGV4aXN0aW5nIGZpbGUgYW5kIHJlYWRzIHNvbWUgdmFsdWVzIGFuZCBwcm9wZXJ0aWVzCi0JLy8vIDwvc3VtbWFyeT4KLQljbGFzcyBTYW1wbGUyCi0JewotCQlwdWJsaWMgc3RhdGljIHZvaWQgUnVuU2FtcGxlMihzdHJpbmcgRmlsZVBhdGgpCi0JCXsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJSZWFkaW5nIGNvbHVtbiAyIG9mIHswfSIsIEZpbGVQYXRoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0KLQkJCUZpbGVJbmZvIGV4aXN0aW5nRmlsZSA9IG5ldyBGaWxlSW5mbyhGaWxlUGF0aCk7Ci0JCQl1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKGV4aXN0aW5nRmlsZSkpCi0JCQl7Ci0JCQkJLy8gZ2V0IHRoZSBmaXJzdCB3b3Jrc2hlZXQgaW4gdGhlIHdvcmtib29rCi0JCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdOwotICAgICAgICAgICAgICAgIGludCBjb2wgPSAyOyAvL1RoZSBpdGVtIGRlc2NyaXB0aW9uCi0JCQkJLy8gb3V0cHV0IHRoZSBkYXRhIGluIGNvbHVtbiAyCi0JCQkJZm9yIChpbnQgcm93ID0gMjsgcm93IDwgNTsgcm93KyspCi0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJcdENlbGwoezB9LHsxfSkuVmFsdWU9ezJ9Iiwgcm93LCBjb2wsIHdvcmtzaGVldC5DZWxsc1tyb3csIGNvbF0uVmFsdWUpOwotCi0JCQkJLy8gb3V0cHV0IHRoZSBmb3JtdWxhIGluIHJvdyA1Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhPXsyfSIsIDMsIDUsIHdvcmtzaGVldC5DZWxsc1szLCA1XS5Gb3JtdWxhKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhUjFDMT17Mn0iLCAzLCA1LCB3b3Jrc2hlZXQuQ2VsbHNbMywgNV0uRm9ybXVsYVIxQzEpOwotCi0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IHRoZSBmb3JtdWxhIGluIHJvdyA1Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlx0Q2VsbCh7MH0sezF9KS5Gb3JtdWxhPXsyfSIsIDUsIDMsIHdvcmtzaGVldC5DZWxsc1s1LCAzXS5Gb3JtdWxhKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiXHRDZWxsKHswfSx7MX0pLkZvcm11bGFSMUMxPXsyfSIsIDUsIDMsIHdvcmtzaGVldC5DZWxsc1s1LCAzXS5Gb3JtdWxhUjFDMSk7Ci0KLSAgICAgICAgICAgIH0gLy8gdGhlIHVzaW5nIHN0YXRlbWVudCBhdXRvbWF0aWNhbGx5IGNhbGxzIERpc3Bvc2UoKSB3aGljaCBjbG9zZXMgdGhlIHBhY2thZ2UuCi0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDIgY29tcGxldGUiKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvU2FtcGxlMy5jcyBiL1NhbXBsZUFwcC9TYW1wbGUzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk3Y2FlLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9TYW1wbGUzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICogCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBFUFBsdXMgaXMgYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBwcm92aWRlZCB1bmRlciB0aGUgCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIAotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICogCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3IHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICoKLSAqIAotICogVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqIAotICogVGhlIGNvZGUgZm9yIHRoaXMgcHJvamVjdCBtYXkgYmUgdXNlZCBhbmQgcmVkaXN0cmlidXRlZCBieSBhbnkgbWVhbnMgUFJPVklESU5HIGl0IGlzIAotICogbm90IHNvbGQgZm9yIHByb2ZpdCB3aXRob3V0IHRoZSBhdXRob3IncyB3cml0dGVuIGNvbnNlbnQsIGFuZCBwcm92aWRpbmcgdGhhdCB0aGlzIG5vdGljZSAKLSAqIGFuZCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYWxsIGNvcHlyaWdodCBub3RpY2VzIHJlbWFpbiBpbnRhY3QuCi0gKiAKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvkbGxtYW4JCUFkZGVkCQkxMC1TRVAtMjAwOQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBTYW1wbGUgY29kZSBkZW1vbnN0cmF0aW5nIGhvdyB0byBnZW5lcmF0ZSBFeGNlbCBzcHJlYWRzaGVldHMgb24gdGhlIHNlcnZlciB1c2luZyAKLSAqIE9mZmljZSBPcGVuIFhNTCBhbmQgdGhlIEV4Y2VsUGFja2FnZSB3cmFwcGVyIGNsYXNzZXMuCi0gKiAKLSAqIEV4Y2VsUGFja2FnZSBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0V4Y2VsUGFja2FnZSBmb3IgZGV0YWlscy4KLSAqIAotICogU2FtcGxlIDM6IENyZWF0ZXMgYSB3b3JrYm9vayBiYXNlZCBvbiBhIHRlbXBsYXRlIGFuZCBwb3B1bGF0ZXMgdXNpbmcgdGhlIGRhdGFiYXNlIGRhdGEuCi0gKiAKLSAqIENvcHlyaWdodCAyMDA3IKkgRHIgSm9obiBUdW5uaWNsaWZmZSAKLSAqIG1haWx0bzpkci5qb2huLnR1bm5pY2xpZmZlQGJ0aW50ZXJuZXQuY29tCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLkRhdGEuU3FsQ2xpZW50OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotCi1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotCWNsYXNzIFNhbXBsZTMKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNhbXBsZSAzIC0gY3JlYXRlcyBhIHdvcmtib29rIGFuZCBwb3B1bGF0ZXMgdXNpbmcgZGF0YSBmcm9tIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZQotCQkvLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCi0gICAgICAgIC8vLyBUaGlzIG9uZSBpcyBmcm9tIHRoZSBvcmdpbmFsIEV4Y2VscGFja2FnZSBzYW1wbGUgcHJvamVjdCwgYnV0IHdpdGhvdXQgdGhlIHRlbXBsYXRlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0RGlyIj5UaGUgb3V0cHV0IGRpcmVjdG9yeTwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGVEaXIiPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJjb25uZWN0aW9uU3RyaW5nIj5UaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8geW91ciBjb3B5IG9mIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZTwvcGFyYW0+Ci0JCXB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTMoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIHN0cmluZyBjb25uZWN0aW9uU3RyaW5nKQotCQl7Ci0JCQkKLSAgICAgICAgICAgIHN0cmluZyBmaWxlID0gb3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMy54bHN4IjsKLSAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhmaWxlKSkgRmlsZS5EZWxldGUoZmlsZSk7Ci0gICAgICAgICAgICBGaWxlSW5mbyBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTMueGxzeCIpOwotCi0JCQkvLyBvaywgd2UgY2FuIHJ1biB0aGUgcmVhbCBjb2RlIG9mIHRoZSBzYW1wbGUgbm93Ci0JCQl1c2luZyAoRXhjZWxQYWNrYWdlIHhsUGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSkpCi0JCQl7Ci0JCQkJLy8gdW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3Ugd2FudCB0aGUgWE1MIHdyaXR0ZW4gb3V0IHRvIHRoZSBvdXRwdXREaXIKLQkJCQkvL3hsUGFja2FnZS5EZWJ1Z01vZGUgPSB0cnVlOyAKLQotCQkJCS8vIGdldCBoYW5kbGUgdG8gdGhlIGV4aXN0aW5nIHdvcmtzaGVldAotCQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHhsUGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU2FsZXMiKTsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZWRTdHlsZSA9IHhsUGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiSHlwZXJMaW5rIik7ICAgLy9UaGlzIG9uZSBpcyBsYW5ndWFnZSBkZXBlbmRlbnQKLSAgICAgICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuVW5kZXJMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHdvcmtzaGVldCAhPSBudWxsKQotCQkJCXsKLQkJCQkJY29uc3QgaW50IHN0YXJ0Um93ID0gNTsKLQkJCQkJaW50IHJvdyA9IHN0YXJ0Um93OwotICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSBIZWFkZXJzIGFuZCBmb3JtYXQgdGhlbSAKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMSJdLlZhbHVlID0gIkFkdmVudHVyZVdvcmtzIEluYy4iOwotICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByID0gd29ya3NoZWV0LkNlbGxzWyJBMTpHMSJdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQnJpdGFubmljIEJvbGQiLCAyMiwgRm9udFN0eWxlLkl0YWxpYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigyMyw1NSw5MykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICJZZWFyLUVuZCBTYWxlcyBSZXBvcnQiOwotICAgICAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByID0gd29ya3NoZWV0LkNlbGxzWyJBMjpHMiJdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5TZXRGcm9tRm9udChuZXcgRm9udCgiQnJpdGFubmljIEJvbGQiLCAxOCwgRm9udFN0eWxlLkl0YWxpYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLkJsYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOwotICAgICAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDE4NCwyMDQsMjI4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiTmFtZSI7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJKb2IgVGl0bGUiOwotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkM0Il0uVmFsdWUgPSAiUmVnaW9uIjsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENCJdLlZhbHVlID0gIk1vbnRobHkgUXVvdGEiOwotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkU0Il0uVmFsdWUgPSAiUXVvdGEgWVREIjsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJGNCJdLlZhbHVlID0gIlNhbGVzIFlURCI7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRzQiXS5WYWx1ZSA9ICJRdW90YSAlIjsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDE4NCwgMjA0LCAyMjgpKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNDpHNCJdLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIGNvbm5lY3QgdG8gdGhlIEFkdmVudHVyZVdvcmtzIHNhbXBsZSBkYXRhYmFzZSBmb3Igc29tZSBkYXRhCi0JCQkJCXVzaW5nIChTcWxDb25uZWN0aW9uIHNxbENvbm4gPSBuZXcgU3FsQ29ubmVjdGlvbihjb25uZWN0aW9uU3RyaW5nKSkKLQkJCQkJewotCQkJCQkJc3FsQ29ubi5PcGVuKCk7Ci0JCQkJCQl1c2luZyAoU3FsQ29tbWFuZCBzcWxDbWQgPSBuZXcgU3FsQ29tbWFuZCgic2VsZWN0IExhc3ROYW1lICsgJywgJyArIEZpcnN0TmFtZSBBUyBbTmFtZV0sIEVtYWlsQWRkcmVzcywgSm9iVGl0bGUsIENvdW50cnlSZWdpb25OYW1lLCBJU05VTEwoU2FsZXNRdW90YSwwKSBBUyBTYWxlc1F1b3RhLCBJU05VTEwoU2FsZXNRdW90YSwwKSoxMiBBUyBZZWFybHlRdW90YSwgU2FsZXNZVEQgZnJvbSBTYWxlcy52U2FsZXNQZXJzb24gT1JERVIgQlkgU2FsZXNZVEQgZGVzYyIsIHNxbENvbm4pKQotCQkJCQkJewotCQkJCQkJCXVzaW5nIChTcWxEYXRhUmVhZGVyIHNxbFJlYWRlciA9IHNxbENtZC5FeGVjdXRlUmVhZGVyKCkpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBnZXQgdGhlIGRhdGEgYW5kIGZpbGwgcm93cyA1IG9ud2FyZHMKLQkJCQkJCQkJd2hpbGUgKHNxbFJlYWRlci5SZWFkKCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWludCBjb2wgPSAxOwotCQkJCQkJCQkJLy8gb3VyIHF1ZXJ5IGhhcyB0aGUgY29sdW1ucyBpbiB0aGUgcmlnaHQgb3JkZXIsIHNvIHNpbXBseQotCQkJCQkJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2x1bW5zCi0JCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNxbFJlYWRlci5GaWVsZENvdW50OyBpKyspCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJLy8gdXNlIHRoZSBlbWFpbCBhZGRyZXNzIGFzIGEgaHlwZXJsaW5rIGZvciBjb2x1bW4gMQotCQkJCQkJCQkJCWlmIChzcWxSZWFkZXIuR2V0TmFtZShpKSA9PSAiRW1haWxBZGRyZXNzIikKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCS8vIGluc2VydCB0aGUgZW1haWwgYWRkcmVzcyBhcyBhIGh5cGVybGluayBmb3IgdGhlIG5hbWUKLQkJCQkJCQkJCQkJc3RyaW5nIGh5cGVybGluayA9ICJtYWlsdG86IiArIHNxbFJlYWRlci5HZXRWYWx1ZShpKS5Ub1N0cmluZygpOwotCQkJCQkJCQkJCQl3b3Jrc2hlZXQuQ2VsbHNbcm93LCAxXS5IeXBlcmxpbmsgPSBuZXcgVXJpKGh5cGVybGluaywgVXJpS2luZC5BYnNvbHV0ZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCS8vIGRvIG5vdCBib3RoZXIgZmlsbGluZyBjZWxsIHdpdGggYmxhbmsgZGF0YSAoYWxzbyB1c2VmdWwgaWYgd2UgaGF2ZSBhIGZvcm11bGEgaW4gYSBjZWxsKQotCQkJCQkJCQkJCQlpZiAoc3FsUmVhZGVyLkdldFZhbHVlKGkpICE9IG51bGwpCi0JCQkJCQkJCQkJCQl3b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdLlZhbHVlID0gc3FsUmVhZGVyLkdldFZhbHVlKGkpOwotCQkJCQkJCQkJCQljb2wrKzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlyb3crKzsKLQkJCQkJCQkJfQotCQkJCQkJCQlzcWxSZWFkZXIuQ2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbc3RhcnRSb3csIDEsIHJvdyAtIDEsIDFdLlN0eWxlTmFtZSA9ICJIeXBlckxpbmsiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbc3RhcnRSb3csIDQsIHJvdyAtIDEsIDZdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiWyQkLTQwOV0jLCMjMCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1tzdGFydFJvdywgNywgcm93IC0gMSwgN10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIwJSI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzW3N0YXJ0Um93LCA3LCByb3cgLSAxLCA3XS5Gb3JtdWxhUjFDMSA9ICI9SUYoUkNbLTJdPTAsMCxSQ1stMV0vUkNbLTJdKSI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oMSkuV2lkdGggPSAyNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbigyKS5XaWR0aCA9IDI4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDMpLldpZHRoID0gMTg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNCkuV2lkdGggPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvbHVtbig1KS5XaWR0aCA9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ29sdW1uKDYpLldpZHRoID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db2x1bW4oNykuV2lkdGggPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQl9Ci0JCQkJCQlzcWxDb25uLkNsb3NlKCk7Ci0JCQkJCX0KLQotICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHNldCB0aGUgaGVhZGVyIHRleHQgCi0JCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICJBZHZlbnR1cmVXb3JrcyBJbmMuIFNhbGVzIFJlcG9ydCI7Ci0JCQkJCS8vIGFkZCB0aGUgcGFnZSBudW1iZXIgdG8gdGhlIGZvb3RlciBwbHVzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMKLQkJCQkJd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCA9Ci0JCQkJCQlzdHJpbmcuRm9ybWF0KCJQYWdlIHswfSBvZiB7MX0iLCBFeGNlbEhlYWRlckZvb3Rlci5QYWdlTnVtYmVyLCBFeGNlbEhlYWRlckZvb3Rlci5OdW1iZXJPZlBhZ2VzKTsKLQkJCQkJLy8gYWRkIHRoZSBzaGVldCBuYW1lIHRvIHRoZSBmb290ZXIKLQkJCQkJd29ya3NoZWV0LkhlYWRlckZvb3Rlci5PZGRGb290ZXIuQ2VudGVyZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuU2hlZXROYW1lOwotCQkJCQkvLyBhZGQgdGhlIGZpbGUgcGF0aCB0byB0aGUgZm9vdGVyCi0JCQkJCXdvcmtzaGVldC5IZWFkZXJGb290ZXIuT2RkRm9vdGVyLkxlZnRBbGlnbmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVQYXRoICsgRXhjZWxIZWFkZXJGb290ZXIuRmlsZU5hbWU7Ci0JCQkJfQotCQkJCS8vIHdlIGhhZCBiZXR0ZXIgYWRkIHNvbWUgZG9jdW1lbnQgcHJvcGVydGllcyB0byB0aGUgc3ByZWFkc2hlZXQgCi0KLQkJCQkvLyBzZXQgc29tZSBjb3JlIHByb3BlcnR5IHZhbHVlcwotCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlRpdGxlID0gIlNhbXBsZSAzIjsKLQkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5BdXRob3IgPSAiSm9obiBUdW5uaWNsaWZmZSI7Ci0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU3ViamVjdCA9ICJFeGNlbFBhY2thZ2UgU2FtcGxlcyI7Ci0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuS2V5d29yZHMgPSAiT2ZmaWNlIE9wZW4gWE1MIjsKLQkJCQl4bFBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5DYXRlZ29yeSA9ICJFeGNlbFBhY2thZ2UgU2FtcGxlcyI7Ci0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQ29tbWVudHMgPSAiVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgMjAwNyBmaWxlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgUGFja2FnaW5nIEFQSSBhbmQgT2ZmaWNlIE9wZW4gWE1MIjsKLQotCQkJCS8vIHNldCBzb21lIGV4dGVuZGVkIHByb3BlcnR5IHZhbHVlcwotCQkJCXhsUGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7Ci0gICAgICAgICAgICAgICAgeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuSHlwZXJsaW5rQmFzZSA9IG5ldyBVcmkoImh0dHA6Ly93d3cuY29kZXBsZXguY29tL01TRlREQlByb2RTYW1wbGVzIik7Ci0KLQkJCQkvLyBzZXQgc29tZSBjdXN0b20gcHJvcGVydHkgdmFsdWVzCi0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQ2hlY2tlZCBieSIsICJKb2huIFR1bm5pY2xpZmZlIik7Ci0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiRW1wbG95ZWVJRCIsICIxMTQ3Iik7Ci0JCQkJeGxQYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkV4Y2VsUGFja2FnZSIpOwotCQkJCQotCQkJCS8vIHNhdmUgdGhlIG5ldyBzcHJlYWRzaGVldAotCQkJCXhsUGFja2FnZS5TYXZlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHlvdSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBYTUwgY3JlYXRlZCBpbiB0aGUgcGFja2FnZSwgc2ltcGx5IHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzCi0JCQkvLyBUaGVzZSBjb3B5IHRoZSBvdXRwdXQgZmlsZSBhbmQgZ2l2ZSBpdCBhIHppcCBleHRlbnNpb24gc28geW91IGNhbiBvcGVuIGl0IGFuZCB0YWtlIGEgbG9vayEKLQkJCS8vRmlsZUluZm8gemlwRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUzLnppcCIpOwotCQkJLy9pZiAoemlwRmlsZS5FeGlzdHMpIHppcEZpbGUuRGVsZXRlKCk7Ci0JCQkvL25ld0ZpbGUuQ29weVRvKHppcEZpbGUuRnVsbE5hbWUpOwotCi0JCQlyZXR1cm4gbmV3RmlsZS5GdWxsTmFtZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU0LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWRkMGIuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiAKLSAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKiAKLSAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKLSAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCi0gKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLVNFUC0yMDA5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci0KLW5hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCi17Ci0gICAgY2xhc3MgU2FtcGxlNAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhpcyBzYW1wbGUgY3JlYXRlcyBhIG5ldyB3b3JrYm9vayBmcm9tIGEgdGVtcGxhdGUgZmlsZSBjb250YWluaW5nIGEgY2hhcnQgYW5kIHBvcHVsYXRlcyBpdCB3aXRoIEV4Y2hhbmdyYXRlcyBmcm9tIAotICAgICAgICAvLy8gdGhlIEFkdmVudHVyZXdvcmtzIGRhdGFiYXNlIGFuZCBzZXQgdGhlIHRocmVlIHNlcmllcyBvbiB0aGUgY2hhcnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29ubmVjdGlvblN0cmluZyI+Q29ubmVjdGlvbnN0cmluZyB0byB0aGUgQWR2ZW50dXJld29ya3MgZGI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRlbXBsYXRlIj50aGUgdGVtcGxhdGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dGRpciI+b3V0cHV0IGRpcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTQoc3RyaW5nIGNvbm5lY3Rpb25TdHJpbmcsIEZpbGVJbmZvIHRlbXBsYXRlLCBEaXJlY3RvcnlJbmZvIG91dHB1dGRpcikKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUGFja2FnZSBwID0gbmV3IEV4Y2VsUGFja2FnZSh0ZW1wbGF0ZSwgdHJ1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9TZXQgdXAgdGhlIGhlYWRlcnMKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IHAuV29ya2Jvb2suV29ya3NoZWV0c1sxXTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTIwIl0uVmFsdWUgPSAiRGF0ZSI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkIyMCJdLlZhbHVlID0gIkVPRCBSYXRlIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIwOkQyMCJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siRTIwIl0uVmFsdWUgPSAiQ2hhbmdlIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siRTIwOkcyMCJdLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIwOkUyMCJdLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyQ29udGludW91czsKLSAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByb3cgPSB3cy5DZWxsc1siQTIwOkcyMCJdKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdy5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJvdy5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigyMyw1NSw5MykpOwotICAgICAgICAgICAgICAgICAgICByb3cuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdy5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIxIl0uVmFsdWUgPSAiVVNEL0pQWSI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkMyMSJdLlZhbHVlID0gIlVTRC9FVVIiOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJEMjEiXS5WYWx1ZSA9ICJVU0QvR0JQIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siRTIxIl0uVmFsdWUgPSAiVVNEL0pQWSI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkYyMSJdLlZhbHVlID0gIlVTRC9FVVIiOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJHMjEiXS5WYWx1ZSA9ICJVU0QvR0JQIjsKLSAgICAgICAgICAgICAgICB1c2luZyAoRXhjZWxSYW5nZSByb3cgPSB3cy5DZWxsc1siQTIxOkcyMSJdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDE4NCwgMjA0LCAyMjgpKTsKLSAgICAgICAgICAgICAgICAgICAgcm93LlN0eWxlLkZvbnQuQ29sb3IuU2V0Q29sb3IoQ29sb3IuQmxhY2spOwotICAgICAgICAgICAgICAgICAgICByb3cuU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSAyMjsKLSAgICAgICAgICAgICAgICAvL0Nvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIGFuZCBmaWxsIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAgdXNpbmcgKFNxbENvbm5lY3Rpb24gc3FsQ29ubiA9IG5ldyBTcWxDb25uZWN0aW9uKGNvbm5lY3Rpb25TdHJpbmcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJvdyA9IHN0YXJ0Um93OwotICAgICAgICAgICAgICAgICAgICBzcWxDb25uLk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgdXNpbmcgKFNxbENvbW1hbmQgc3FsQ21kID0gbmV3IFNxbENvbW1hbmQoIlNFTEVDVCBDdXJyZW5jeVJhdGVEYXRlLCBTVU0oQ2FzZSB3aGVuIFRvQ3VycmVuY3lDb2RlID0gJ0pQWScgVGhlbiBFbmRPZkRheVJhdGUgRWxzZSAwIEVORCkgQVMgW0pQWV0sIFNVTShDYXNlIHdoZW4gVG9DdXJyZW5jeUNvZGUgPSAnRVVSJyBUaGVuIEVuZE9mRGF5UmF0ZSBFbHNlIDAgRU5EKSBBUyBbRVVSXSwgU1VNKENhc2Ugd2hlbiBUb0N1cnJlbmN5Q29kZSA9ICdHQlAnIFRoZW4gRW5kT2ZEYXlSYXRlIEVsc2UgMCBFTkQpIEFTIFtHQlBdIEZST00gW0FkdmVudHVyZVdvcmtzXS5bU2FsZXNdLltDdXJyZW5jeVJhdGVdICB3aGVyZSBbRnJvbUN1cnJlbmN5Q29kZV09J1VTRCcgQU5EIFRvQ3VycmVuY3lDb2RlIGluICgnSlBZJywgJ0VVUicsICdHQlAnKSBHUk9VUCBCWSBDdXJyZW5jeVJhdGVEYXRlICBPUkRFUiBCWSBDdXJyZW5jeVJhdGVEYXRlIiwgc3FsQ29ubikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChTcWxEYXRhUmVhZGVyIHNxbFJlYWRlciA9IHNxbENtZC5FeGVjdXRlUmVhZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZGF0YSBhbmQgZmlsbCByb3dzIDIyIG9ud2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3FsUmVhZGVyLlJlYWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMV0uVmFsdWUgPSBzcWxSZWFkZXJbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMl0uVmFsdWUgPSBzcWxSZWFkZXJbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgM10uVmFsdWUgPSBzcWxSZWFkZXJbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgNF0uVmFsdWUgPSBzcWxSZWFkZXJbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBudW1iZXJmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3N0YXJ0Um93LCAxLCByb3cgLSAxLCAxXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktbW0tZGQiOwotICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbc3RhcnRSb3csIDIsIHJvdyAtIDEsIDRdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAwMCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgRm9ybXVsYXMgCi0gICAgICAgICAgICAgICAgICAgICAgICB3cy5DZWxsc1tzdGFydFJvdyArIDEsIDUsIHJvdyAtIDEsIDddLkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJCJHswfS9CezF9LTEiLCBzdGFydFJvdywgc3RhcnRSb3cgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3N0YXJ0Um93LCA1LCByb3cgLSAxLCA3XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIjAuMDAlIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBzZXJpZXMgZm9yIHRoZSBjaGFydC4gVGhlIHNlcmllcyBtdXN0IGV4aXN0IGluIHRoZSB0ZW1wbGF0ZSBvciB0aGUgcHJvZ3JhbSB3aWxsIGNyYXNoLgotICAgICAgICAgICAgICAgICAgICBFeGNlbENoYXJ0IGNoYXJ0ID0gKChFeGNlbENoYXJ0KXdzLkRyYXdpbmdzWyJTYW1wbGVDaGFydCJdKTsgCi0gICAgICAgICAgICAgICAgICAgIGNoYXJ0LlRpdGxlLlRleHQgPSAiRXhjaGFuZ2UgcmF0ZSAlIjsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzBdLkhlYWRlciA9ICJVU0QvSlBZIjsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzBdLlhTZXJpZXMgPSAiJyIgKyB3cy5OYW1lICsgIichIiArIEV4Y2VsUmFuZ2UuR2V0QWRkcmVzcyhzdGFydFJvdysxLCAxLCByb3cgLSAxLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzBdLlNlcmllcyA9ICInIiArIHdzLk5hbWUgKyAiJyEiICsgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKHN0YXJ0Um93ICsgMSwgNSwgcm93IC0gMSwgNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzFdLkhlYWRlciA9ICJVU0QvRVVSIjsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnQuU2VyaWVzWzFdLlhTZXJpZXMgPSAiJyIgKyB3cy5OYW1lICsgIichIiArIEV4Y2VsUmFuZ2UuR2V0QWRkcmVzcyhzdGFydFJvdyArIDEsIDEsIHJvdyAtIDEsIDEpOwotICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMV0uU2VyaWVzID0gIiciICsgd3MuTmFtZSArICInISIgKyBFeGNlbFJhbmdlLkdldEFkZHJlc3Moc3RhcnRSb3cgKyAxLCA2LCByb3cgLSAxLCA2KTsKLQotICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMl0uSGVhZGVyID0gIlVTRC9HQlAiOwotICAgICAgICAgICAgICAgICAgICBjaGFydC5TZXJpZXNbMl0uWFNlcmllcyA9ICInIiArIHdzLk5hbWUgKyAiJyEiICsgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKHN0YXJ0Um93ICsgMSwgMSwgcm93IC0gMSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJ0LlNlcmllc1syXS5TZXJpZXMgPSAiJyIgKyB3cy5OYW1lICsgIichIiArIEV4Y2VsUmFuZ2UuR2V0QWRkcmVzcyhzdGFydFJvdyArIDEsIDcsIHJvdyAtIDEsIDcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0dldCB0aGUgZG9jdW1ldCBhcyBhIGJ5dGUgYXJyYXkgZnJvbSB0aGUgc3RyZWFtIGFuZCBzYXZlIGl0IHRvIGRpc2suICAoVGhpcyBpcyB1c2VmdWxsIGluIGEgd2ViYXBwbGljYXRpb24pIC4uLiAKLSAgICAgICAgICAgICAgICBCeXRlW10gYmluID0gcC5HZXRBc0J5dGVBcnJheSgpOwotCi0gICAgICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSBvdXRwdXRkaXIgKyAiXFxzYW1wbGU0Lnhsc3giOwotICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhmaWxlLCBiaW4pOwotICAgICAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU1LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmMyZjEuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKgotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkwNy1KQU4tMjAxMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsgICAgCi11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLQotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICBjbGFzcyBTYW1wbGU1Ci0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTYW1wbGUgNSAtIG9wZW4gU2FtcGxlIDEgYW5kIGFkZCAyIG5ldyByb3dzIGFuZCBhIFBpZWNoYXJ0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTUoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVJbmZvIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKLSAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNS54bHN4Iik7Ci0gICAgICAgICAgICBpZiAobmV3RmlsZS5FeGlzdHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCi0gICAgICAgICAgICAgICAgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU1Lnhsc3giKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFBhY2thZ2UgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3RmlsZSwgdGVtcGxhdGVGaWxlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL09wZW4gd29ya3NoZWV0IDEKLSAgICAgICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0Lkluc2VydFJvdyg1LCAyKTsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTUiXS5WYWx1ZSA9ICIxMjAxMCI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCNSJdLlZhbHVlID0gIkRyaWxsIjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkM1Il0uVmFsdWUgPSAyMDsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQ1Il0uVmFsdWUgPSA4OwotCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNiJdLlZhbHVlID0gIjEyMDExIjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI2Il0uVmFsdWUgPSAiQ3Jvd2JhciI7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDNiJdLlZhbHVlID0gNzsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQ2Il0uVmFsdWUgPSAyMy40ODsKLQotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRTI6RTYiXS5Gb3JtdWxhUjFDMSA9ICJSQ1stMl0qUkNbLTFdIjsgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IHdvcmtzaGVldC5OYW1lcy5BZGQoIlN1YlRvdGFsTmFtZSIsIHdvcmtzaGVldC5DZWxsc1siQzc6RTciXSk7Ci0gICAgICAgICAgICAgICAgbmFtZS5TdHlsZS5Gb250Lkl0YWxpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbmFtZS5Gb3JtdWxhID0gIlNVQlRPVEFMKDksQzI6QzYpIjsKLQotICAgICAgICAgICAgICAgIC8vRm9ybWF0IHRoZSBuZXcgcm93cwotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzU6QzYiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQ1OkU2Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMC4wMCI7Ci0KLSAgICAgICAgICAgICAgICB2YXIgY2hhcnQgPSAod29ya3NoZWV0LkRyYXdpbmdzLkFkZENoYXJ0KCJQaWVDaGFydCIsIGVDaGFydFR5cGUuUGllM0QpIGFzIEV4Y2VsUGllQ2hhcnQpOwotCi0gICAgICAgICAgICAgICAgY2hhcnQuVGl0bGUuVGV4dCA9ICJUb3RhbCI7Ci0gICAgICAgICAgICAgICAgLy9Gcm9tIHJvdyAxIGNvbHVtIDUgd2l0aCBmaXZlIHBpeGVscyBvZmZzZXQKLSAgICAgICAgICAgICAgICBjaGFydC5TZXRQb3NpdGlvbigwLCAwLCA1LCA1KTsKLSAgICAgICAgICAgICAgICBjaGFydC5TZXRTaXplKDYwMCwgMzAwKTsKLQotICAgICAgICAgICAgICAgIEV4Y2VsQWRkcmVzcyB2YWx1ZUFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKDIsIDUsIDYsIDUpOwotICAgICAgICAgICAgICAgIHZhciBzZXIgPSAoY2hhcnQuU2VyaWVzLkFkZCh2YWx1ZUFkZHJlc3MuQWRkcmVzcywgIkIyOkI2IikgYXMgRXhjZWxQaWVDaGFydFNlcmllKTsKLSAgICAgICAgICAgICAgICBjaGFydC5EYXRhTGFiZWwuU2hvd0NhdGVnb3J5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjaGFydC5EYXRhTGFiZWwuU2hvd1BlcmNlbnQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2hhcnQuTGVnZW5kLkJvcmRlci5MaW5lU3R5bGUgPSBlTGluZVN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIGNoYXJ0LkxlZ2VuZC5Cb3JkZXIuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgICAgIGNoYXJ0LkxlZ2VuZC5Cb3JkZXIuRmlsbC5Db2xvciA9IENvbG9yLkRhcmtCbHVlOwotCi0gICAgICAgICAgICAgICAgLy9Td2l0Y2ggdGhlIFBhZ2VMYXlvdXRWaWV3IGJhY2sgdG8gbm9ybWFsCi0gICAgICAgICAgICAgICAgd29ya3NoZWV0LlZpZXcuUGFnZUxheW91dFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyBzYXZlIG91ciBuZXcgd29ya2Jvb2sgYW5kIHdlIGFyZSBkb25lIQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3RmlsZS5GdWxsTmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU2LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTYuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDEwMDUuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTYuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKgotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1KQU4tMjAxMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmcuSW1hZ2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7Ci1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU2FtcGxlIDYgLSBSZWFkcyB0aGUgZmlsZXN5c3RlbSBhbmQgbWFrZXMgYSByZXBvcnQuCi0gICAgLy8vIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAKLSAgICBjbGFzcyBTYW1wbGU2Ci0gICAgewotICAgICAgICAjcmVnaW9uICJJY29uIEFQSSBmdW5jdGlvbiIKLSAgICAgICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXQotICAgICAgICBwdWJsaWMgc3RydWN0IFNIRklMRUlORk8KLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIEludFB0ciBoSWNvbjsKLSAgICAgICAgICAgIHB1YmxpYyBJbnRQdHIgaUljb247Ci0gICAgICAgICAgICBwdWJsaWMgdWludCBkd0F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQnlWYWxUU3RyLCBTaXplQ29uc3QgPSAyNjApXQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBzekRpc3BsYXlOYW1lOwotICAgICAgICAgICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJ5VmFsVFN0ciwgU2l6ZUNvbnN0ID0gODApXQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBzelR5cGVOYW1lOwotICAgICAgICB9OwotICAgICAgICBwdWJsaWMgY29uc3QgdWludCBTSEdGSV9JQ09OID0gMHgxMDA7Ci0gICAgICAgIHB1YmxpYyBjb25zdCB1aW50IFNIR0ZJX0xBUkdFSUNPTiA9IDB4MDsgICAgLy8gJ0xhcmdlIGljb24KLSAgICAgICAgcHVibGljIGNvbnN0IHVpbnQgU0hHRklfU01BTExJQ09OID0gMHgxOyAgICAvLyAnU21hbGwgaWNvbgotICAgICAgICBbRGxsSW1wb3J0KCJzaGVsbDMyLmRsbCIpXQotICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgU0hHZXRGaWxlSW5mbyhzdHJpbmcgcHN6UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgZHdGaWxlQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiBTSEZJTEVJTkZPIHBzZmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IGNiU2l6ZUZpbGVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCB1RmxhZ3MpOwotICAgICAgICBbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkRsbEltcG9ydCgidXNlcjMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8pXQotICAgICAgICBleHRlcm4gc3RhdGljIGJvb2wgRGVzdHJveUljb24oSW50UHRyIGhhbmRsZSk7Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgcHVibGljIGNsYXNzIFN0YXRJdGVtIDogSUNvbXBhcmFibGU8U3RhdEl0ZW0+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBsb25nIFNpemUgeyBnZXQ7IHNldDsgfQotCi0gICAgICAgICAgICAjcmVnaW9uIElDb21wYXJhYmxlPFN0YXRJdGVtPiBNZW1iZXJzCi0KLSAgICAgICAgICAgIC8vRGVmYXVsdCBjb21wYXJlIFNpemUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKFN0YXRJdGVtIG90aGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBTaXplIDwgb3RoZXIuU2l6ZSA/IC0xIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2l6ZSA+IG90aGVyLlNpemUgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgfQotICAgICAgICBzdGF0aWMgaW50IF9tYXhMZXZlbHM7Ci0KLSAgICAgICAgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBTdGF0SXRlbT4gX2V4dFN0YXQgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFN0YXRJdGVtPigpOwotICAgICAgICBzdGF0aWMgTGlzdDxTdGF0SXRlbT4gX2ZpbGVTaXplID0gbmV3IExpc3Q8U3RhdEl0ZW0+KCk7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNhbXBsZSA2IC0gUmVhZHMgdGhlIGZpbGVzeXN0ZW0gYW5kIG1ha2VzIGEgcmVwb3J0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+T3V0cHV0IGRpcmVjdG9yeTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlyIj5EaXJlY3RvcnkgdG8gc2NhbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVwdGgiPkhvdyBtYW55IGxldmVscz88L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNraXBJY29ucyI+U2tpcCB0aGUgaWNvbnMgaW4gY29sdW1uIEEuIEEgbG90IGZhc3RlcjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFJ1blNhbXBsZTYoRGlyZWN0b3J5SW5mbyBvdXRwdXREaXIsIERpcmVjdG9yeUluZm8gZGlyLCBpbnQgZGVwdGgsIGJvb2wgc2tpcEljb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbWF4TGV2ZWxzID0gZGVwdGg7Ci0KLSAgICAgICAgICAgIEZpbGVJbmZvIG5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNi54bHN4Iik7Ci0gICAgICAgICAgICBpZiAobmV3RmlsZS5FeGlzdHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3RmlsZS5EZWxldGUoKTsgIC8vIGVuc3VyZXMgd2UgY3JlYXRlIGEgbmV3IHdvcmtib29rCi0gICAgICAgICAgICAgICAgbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU2Lnhsc3giKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHdvcmtib29rCi0gICAgICAgICAgICBFeGNlbFBhY2thZ2UgcGNrID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKTsKLSAgICAgICAgICAgIC8vQWRkIHRoZSBDb250ZW50IHNoZWV0Ci0gICAgICAgICAgICB2YXIgd3MgPSBwY2suV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNvbnRlbnQiKTsKLQotICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHdzLkNvbHVtbigxKS5XaWR0aCA9IDIuNTsKLSAgICAgICAgICAgIHdzLkNvbHVtbigyKS5XaWR0aCA9IDYwOwotICAgICAgICAgICAgd3MuQ29sdW1uKDMpLldpZHRoID0gMTY7Ci0gICAgICAgICAgICB3cy5Db2x1bW4oNCkuV2lkdGggPSAyMDsKLSAgICAgICAgICAgIHdzLkNvbHVtbig1KS5XaWR0aCA9MjA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vVGhpcyBzZXQgdGhlIG91dGxpbmUgZm9yIGNvbHVtbiA0IGFuZCA1IGFuZCBoaWRlIHRoZW0KLSAgICAgICAgICAgIHdzLkNvbHVtbig0KS5PdXRsaW5lTGV2ZWwgPSAxOwotICAgICAgICAgICAgd3MuQ29sdW1uKDQpLkNvbGxhcHNlZCA9IHRydWU7Ci0gICAgICAgICAgICB3cy5Db2x1bW4oNSkuT3V0bGluZUxldmVsID0gMTsKLSAgICAgICAgICAgIHdzLkNvbHVtbig1KS5Db2xsYXBzZWQgPSB0cnVlOwotICAgICAgICAgICAgd3MuT3V0TGluZVN1bW1hcnlSaWdodCA9IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vSGVhZGVycwotICAgICAgICAgICAgd3MuQ2VsbHNbIkIxIl0uVmFsdWUgPSAiTmFtZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5WYWx1ZSA9ICJTaXplIjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJEMSJdLlZhbHVlID0gIkNyZWF0ZWQiOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkUxIl0uVmFsdWUgPSAiTGFzdCBtb2RpZmllZCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1siQjE6RTEiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotCi0gICAgICAgICAgICB3cy5WaWV3LkZyZWV6ZVBhbmVzKDIsMSk7Ci0gICAgICAgICAgICB3cy5TZWxlY3QoIkEyIik7Ci0gICAgICAgICAgICAvL2hlaWdodCBpcyAyMCBwaXhlbHMgCi0gICAgICAgICAgICBkb3VibGUgaGVpZ2h0ID0gMjAgKiAwLjc1OwotICAgICAgICAgICAgLy9TdGFydCBhdCByb3cgMjsKLSAgICAgICAgICAgIGludCByb3cgPSAyOwotCi0gICAgICAgICAgICAvL0xvYWQgdGhlIGRpcmVjdG9yeSBjb250ZW50IHRvIHNoZWV0IDEKLSAgICAgICAgICAgIHJvdyA9IEFkZERpcmVjdG9yeSh3cywgZGlyLCByb3csIGhlaWdodCwgMCwgc2tpcEljb25zKTsKLSAgICAgICAgICAgIHdzLk91dExpbmVTdW1tYXJ5QmVsb3cgPSBmYWxzZTsKLQotICAgICAgICAgICAgLy9Gb3JtYXQgY29sdW1ucwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMywgcm93IC0gMSwgM10uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgICAgICAgICB3cy5DZWxsc1sxLCA0LCByb3cgLSAxLCA0XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gInl5eXktTU0tZGQgaGg6bW0iOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNSwgcm93IC0gMSwgNV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJ5eXl5LU1NLWRkIGhoOm1tIjsKLQotICAgICAgICAgICAgLy9BZGQgdGhlIHRleHRib3gKLSAgICAgICAgICAgIHZhciBzaGFwZSA9IHdzLkRyYXdpbmdzLkFkZFNoYXBlKCJ0eHREZXNjIiwgZVNoYXBlU3R5bGUuUmVjdCk7Ci0gICAgICAgICAgICBzaGFwZS5TZXRQb3NpdGlvbigxLCA1LCA2LCA1KTsKLSAgICAgICAgICAgIHNoYXBlLlNldFNpemUoNDAwLCAyMDApOwotCi0gICAgICAgICAgICBzaGFwZS5UZXh0ID0gIlRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSB2YXJpb3VzIGRyYXdpbmcgb2JqZWN0cyBsaWtlIHBpY3R1cmVzLCBzaGFwZXMgYW5kIGNoYXJ0cy5cblxyXG5cclRoZSBmaXJzdCBzaGVldCBjb250YWlucyBhbGwgc3ViZGlyZWN0b3JpZXMgYW5kIGZpbGVzIHdpdGggYW4gaWNvbiwgbmFtZSwgc2l6ZSBhbmQgZGF0ZXMuXG5cclxuXHJUaGUgc2Vjb25kIHNoZWV0IGNvbnRhaW5zIHN0YXRpc3RpY3MgYWJvdXQgZXh0ZW5zaW9ucyBhbmQgdGhlIHRvcC0xMCBsYXJnZXN0IGZpbGVzLiI7Ci0gICAgICAgICAgICBzaGFwZS5GaWxsLlN0eWxlID0gZUZpbGxTdHlsZS5Tb2xpZEZpbGw7Ci0gICAgICAgICAgICBzaGFwZS5GaWxsLkNvbG9yID0gQ29sb3IuRGFya1NsYXRlR3JheTsKLSAgICAgICAgICAgIHNoYXBlLkZpbGwuVHJhbnNwYXJhbmN5ID0gMjA7Ci0gICAgICAgICAgICBzaGFwZS5Cb3JkZXIuRmlsbC5TdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgc2hhcGUuQm9yZGVyLkxpbmVTdHlsZSA9IGVMaW5lU3R5bGUuTG9uZ0Rhc2g7Ci0gICAgICAgICAgICBzaGFwZS5Cb3JkZXIuV2lkdGggPSAxOwotICAgICAgICAgICAgc2hhcGUuQm9yZGVyLkZpbGwuQ29sb3IgPSBDb2xvci5CbGFjazsKLSAgICAgICAgICAgIHNoYXBlLkJvcmRlci5MaW5lQ2FwID0gZUxpbmVDYXAuUm91bmQ7Ci0gICAgICAgICAgICBzaGFwZS5UZXh0QW5jaG9yaW5nID0gZVRleHRBbmNob3JpbmdUeXBlLlRvcDsKLSAgICAgICAgICAgIHNoYXBlLlRleHRWZXJ0aWNhbCA9IGVUZXh0VmVydGljYWxUeXBlLkhvcml6b250YWw7Ci0gICAgICAgICAgICBzaGFwZS5UZXh0QW5jaG9yaW5nQ29udHJvbD1mYWxzZTsKLSAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwyLHJvdyw1XS5BdXRvRml0Q29sdW1ucygpOwotCi0gICAgICAgICAgICAvL0FkZCB0aGUgZ3JhcGggc2hlZXQKLSAgICAgICAgICAgIEFkZEdyYXBocyhwY2ssIHJvdywgZGlyLkZ1bGxOYW1lKTsKLQotICAgICAgICAgICAgLy9BZGQgYSBIeXBlckxpbmsgdG8gdGhlIHN0YXRpc3RpY3Mgc2hlZXQuIAotICAgICAgICAgICAgdmFyIG5hbWVkU3R5bGUgPSBwY2suV29ya2Jvb2suU3R5bGVzLkNyZWF0ZU5hbWVkU3R5bGUoIkh5cGVyTGluayIpOyAgIC8vVGhpcyBvbmUgaXMgbGFuZ3VhZ2UgZGVwZW5kZW50Ci0gICAgICAgICAgICBuYW1lZFN0eWxlLlN0eWxlLkZvbnQuVW5kZXJMaW5lID0gdHJ1ZTsKLSAgICAgICAgICAgIG5hbWVkU3R5bGUuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5CbHVlKTsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJLMTMiXS5IeXBlcmxpbmsgPSBuZXcgRXhjZWxIeXBlckxpbmsoIlN0YXRpc3RpY3MhQTEiLCAiU3RhdGlzdGljcyIpOwotICAgICAgICAgICAgd3MuQ2VsbHNbIksxMyJdLlN0eWxlTmFtZSA9ICJIeXBlckxpbmsiOwotCi0gICAgICAgICAgICAvL1ByaW50ZXIgc2V0dGluZ3MKLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5GaXRUb1BhZ2UgPSB0cnVlOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvV2lkdGggPSAxOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIHdzLlByaW50ZXJTZXR0aW5ncy5SZXBlYXRSb3dzID0gbmV3IEV4Y2VsQWRkcmVzcygiMToxIik7IC8vUHJpbnQgdGl0bGVzCi0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuUHJpbnRBcmVhID0gd3MuQ2VsbHNbMSwgMSwgcm93IC0gMSwgNV07Ci0gICAgICAgICAgICBwY2suV29ya2Jvb2suQ2FsY3VsYXRlKCk7Ci0KLSAgICAgICAgICAgIC8vRG9uZSEgc2F2ZSB0aGUgc2hlZXQKLSAgICAgICAgICAgIHBjay5TYXZlKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGFkZHMgdGhlIGNvbW1lbnQgdG8gdGhlIGhlYWRlciByb3cKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cyI+PC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRDb21tZW50cyhFeGNlbFdvcmtzaGVldCB3cykKLSAgICAgICAgewotICAgICAgICAgICAgLy9BZGQgQ29tbWVudHMgdXNpbmcgdGhlIHJhbmdlIGNsYXNzCi0gICAgICAgICAgICB2YXIgY29tbWVudCA9IHdzLkNlbGxzWyJBMyJdLkFkZENvbW1lbnQoIkphbiBLw6RsbG1hbjpcclxuIiwgIkpLIik7Ci0gICAgICAgICAgICBjb21tZW50LkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgcnQgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiVGhpcyBjb2x1bW4gY29udGFpbnMgdGhlIGV4dGVuc2lvbnMuIik7Ci0gICAgICAgICAgICBydC5Cb2xkID0gZmFsc2U7Ci0gICAgICAgICAgICBjb21tZW50LkF1dG9GaXQgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0FkZCBhIGNvbW1lbnQgdXNpbmcgdGhlIENvbW1lbnQgY29sbGVjdGlvbgotICAgICAgICAgICAgY29tbWVudCA9IHdzLkNvbW1lbnRzLkFkZCh3cy5DZWxsc1siQjMiXSwiVGhpcyBjb2x1bW4gY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGZpbGVzLiIsICJKSyIpOwotICAgICAgICAgICAgLy9UaGlzIHNldHMgdGhlIHNpemUgYW5kIHBvc2l0aW9uLiAoVGhlIHBvc2l0aW9uIGlzIG9ubHkgd2hlbiB0aGUgY29tbWVudCBpcyB2aXNpYmxlKQotICAgICAgICAgICAgY29tbWVudC5Gcm9tLkNvbHVtbiA9IDc7Ci0gICAgICAgICAgICBjb21tZW50LkZyb20uUm93ID0gMzsKLSAgICAgICAgICAgIGNvbW1lbnQuVG8uQ29sdW1uID0gMTY7Ci0gICAgICAgICAgICBjb21tZW50LlRvLlJvdyA9IDg7Ci0gICAgICAgICAgICBjb21tZW50LkJhY2tncm91bmRDb2xvciA9IENvbG9yLldoaXRlOwotICAgICAgICAgICAgY29tbWVudC5SaWNoVGV4dC5BZGQoIlxyXG5UbyBmb3JtYXQgdGhlIG51bWJlcnMgdXNlIHRoZSBOdW1iZXJmb3JtYXQtcHJvcGVydHkgbGlrZTpcclxuIik7Ci0KLSAgICAgICAgICAgIHdzLkNlbGxzWyJCMzpCNDIiXS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwIjsKLQotICAgICAgICAgICAgLy9Gb3JtYXQgdGhlIGNvZGUgdXNpbmcgdGhlIFJpY2hUZXh0IENvbGxlY3Rpb24KLSAgICAgICAgICAgIHZhciByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCIvL0Zvcm1hdCB0aGUgU2l6ZSBhbmQgQ291bnQgY29sdW1uXHJcbiIpOwotICAgICAgICAgICAgcmMuRm9udE5hbWUgPSAiQ291cmllciBOZXciOwotICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigwLCAxMjgsIDApOwotICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgid3MuQ2VsbHNbIik7Ci0gICAgICAgICAgICByYy5Db2xvciA9IENvbG9yLkJsYWNrOwotICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiXCJCMzpCNDJcIiIpOwotICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigxMjMsIDIxLCAyMSk7Ci0gICAgICAgICAgICByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiKTsKLSAgICAgICAgICAgIHJjLkNvbG9yID0gQ29sb3IuQmxhY2s7Ci0gICAgICAgICAgICByYyA9IGNvbW1lbnQuUmljaFRleHQuQWRkKCJcIiMsIyMwXCIiKTsKLSAgICAgICAgICAgIHJjLkNvbG9yID0gQ29sb3IuRnJvbUFyZ2IoMTIzLCAyMSwgMjEpOwotICAgICAgICAgICAgcmMgPSBjb21tZW50LlJpY2hUZXh0LkFkZCgiOyIpOwotICAgICAgICAgICAgcmMuQ29sb3IgPSBDb2xvci5CbGFjazsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgdGhlIHNlY29uZCBzaGVldCBjb250YWluZyB0aGUgZ3JhcGhzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGNrIj5QYWNrYWdlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlYWRlciI+PC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBZGRHcmFwaHMoRXhjZWxQYWNrYWdlIHBjaywgaW50IHJvd3MsIHN0cmluZyBkaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiU3RhdGlzdGljcyIpOwotICAgICAgICAgICAgd3MuVmlldy5TaG93R3JpZExpbmVzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vU2V0IGZpcnN0IHRoZSBoZWFkZXIgYW5kIGZvcm1hdCBpdAotICAgICAgICAgICAgd3MuQ2VsbHNbIkExIl0uVmFsdWUgPSAiU3RhdGlzdGljcyBmb3IgIjsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3cy5DZWxsc1siQTE6TzEiXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIiwgMjIsIEZvbnRTdHlsZS5SZWd1bGFyKSk7Ci0gICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkhvcml6b250YWxBbGlnbm1lbnQgPSBPZmZpY2VPcGVuWG1sLlN0eWxlLkV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXJDb250aW51b3VzOwotICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgci5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5Gcm9tQXJnYigyMywgNTUsIDkzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vVXNlIHRoZSBSaWNoVGV4dCBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGZvbnQgZm9yIHRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgY2VsbAotICAgICAgICAgICAgdmFyIHJ0RGlyID0gd3MuQ2VsbHNbIkExIl0uUmljaFRleHQuQWRkKGRpcik7Ci0gICAgICAgICAgICBydERpci5Gb250TmFtZSA9ICJDb25zb2xhcyI7Ci0gICAgICAgICAgICBydERpci5TaXplPTE4OwotCi0gICAgICAgICAgICAvL1N0YXJ0IHdpdGggdGhlIEV4dGVudGlvbiBTaXplIAotICAgICAgICAgICAgTGlzdDxTdGF0SXRlbT4gbHN0ID0gbmV3IExpc3Q8U3RhdEl0ZW0+KF9leHRTdGF0LlZhbHVlcyk7ICAgICAgICAgICAKLSAgICAgICAgICAgIGxzdC5Tb3J0KCk7Ci0KLSAgICAgICAgICAgIC8vQWRkIHJvd3MKLSAgICAgICAgICAgIGludCByb3c9QWRkU3RhdFJvd3Mod3MsIGxzdCwgMiwgIkV4dGVuc2lvbnMiLCAiU2l6ZSIpOwotCi0gICAgICAgICAgICAvL0FkZCBjb21tZXRzIHRvIHRoZSBFeHRlbnNpb25zIGhlYWRlcgotICAgICAgICAgICAgQWRkQ29tbWVudHMod3MpOwotCi0gICAgICAgICAgICAvL0FkZCB0aGUgcGllY2hhcnQKLSAgICAgICAgICAgIHZhciBwaWVDaGFydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJjcnRFeHRlbnNpb25zU2l6ZSIsIGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCkgYXMgRXhjZWxQaWVDaGFydDsKLSAgICAgICAgICAgIC8vU2V0IHRvcCBsZWZ0IGNvcm5lciB0byByb3cgMSBjb2x1bW4gMgotICAgICAgICAgICAgcGllQ2hhcnQuU2V0UG9zaXRpb24oMSwgMCwgMiwgMCk7Ci0gICAgICAgICAgICBwaWVDaGFydC5TZXRTaXplKDQwMCwgNDAwKTsKLSAgICAgICAgICAgIHBpZUNoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMsIDIsIHJvdy0xLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMsIDEsIHJvdy0xLCAxKSk7Ci0KLSAgICAgICAgICAgIHBpZUNoYXJ0LlRpdGxlLlRleHQgPSAiRXh0ZW5zaW9uIFNpemUiOwotICAgICAgICAgICAgLy9TZXQgZGF0YWxhYmVscyBhbmQgcmVtb3ZlIHRoZSBsZWdlbmQKLSAgICAgICAgICAgIHBpZUNoYXJ0LkRhdGFMYWJlbC5TaG93Q2F0ZWdvcnkgPSB0cnVlOwotICAgICAgICAgICAgcGllQ2hhcnQuRGF0YUxhYmVsLlNob3dQZXJjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIHBpZUNoYXJ0LkRhdGFMYWJlbC5TaG93TGVhZGVyTGluZXMgPSB0cnVlOwotICAgICAgICAgICAgcGllQ2hhcnQuTGVnZW5kLlJlbW92ZSgpOwotCi0gICAgICAgICAgICAvL1Jlc29ydCBvbiBDb3VudCBhbmQgYWRkIHRoZSByb3dzCi0gICAgICAgICAgICBsc3QuU29ydCgoZmlyc3Qsc2Vjb25kKSA9PiBmaXJzdC5Db3VudCA8IHNlY29uZC5Db3VudCA/IC0xIDogZmlyc3QuQ291bnQgPiBzZWNvbmQuQ291bnQgPyAxIDogMCk7Ci0gICAgICAgICAgICByb3c9QWRkU3RhdFJvd3Mod3MsIGxzdCwgMTYsICIiLCAiQ291bnQiKTsKLQotICAgICAgICAgICAgLy9BZGQgdGhlIERvdWdobnV0IGNoYXJ0Ci0gICAgICAgICAgICB2YXIgZG91Z2h0bnV0Q2hhcnQgPSB3cy5EcmF3aW5ncy5BZGRDaGFydCgiY3J0RXh0ZW5zaW9uQ291bnQiLCBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQpIGFzIEV4Y2VsRG91Z2hudXRDaGFydDsKLSAgICAgICAgICAgIC8vU2V0IHBvc2l0aW9uIHRvIHJvdyAxIGNvbHVtbiA3IGFuZCAxNiBwaXhlbHMgb2Zmc2V0Ci0gICAgICAgICAgICBkb3VnaHRudXRDaGFydC5TZXRQb3NpdGlvbigxLCAwLCA4LCAxNik7Ci0gICAgICAgICAgICBkb3VnaHRudXRDaGFydC5TZXRTaXplKDQwMCwgNDAwKTsKLSAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDE2LCAyLCByb3cgLSAxLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDE2LCAxLCByb3cgLSAxLCAxKSk7Ci0KLSAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlRpdGxlLlRleHQgPSAiRXh0ZW5zaW9uIENvdW50IjsKLSAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LkRhdGFMYWJlbC5TaG93UGVyY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBkb3VnaHRudXRDaGFydC5EYXRhTGFiZWwuU2hvd0xlYWRlckxpbmVzID0gdHJ1ZTsKLSAgICAgICAgICAgIGRvdWdodG51dENoYXJ0LlN0eWxlID0gZUNoYXJ0U3R5bGUuU3R5bGUyNjsgLy8zRCBsb29rCi0gICAgICAgICAgICAvL1RvcC0xMCBmaWxlc2l6ZQotICAgICAgICAgICAgX2ZpbGVTaXplLlNvcnQoKTsKLSAgICAgICAgICAgIHJvdz1BZGRTdGF0Um93cyh3cywgX2ZpbGVTaXplLCAyOSwgIkZpbGVzIiwgIlNpemUiKTsKLSAgICAgICAgICAgIHZhciBiYXJDaGFydCA9IHdzLkRyYXdpbmdzLkFkZENoYXJ0KCJjcnRGaWxlcyIsIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QpIGFzIEV4Y2VsQmFyQ2hhcnQ7Ci0gICAgICAgICAgICAvLzNkIFNldHRpbmdzCi0gICAgICAgICAgICBiYXJDaGFydC5WaWV3M0QuUm90WCA9IDA7Ci0gICAgICAgICAgICBiYXJDaGFydC5WaWV3M0QuUGVyc3BlY3RpdmUgPSAwOwotCi0gICAgICAgICAgICBiYXJDaGFydC5TZXRQb3NpdGlvbigyMiwgMCwgMiwgMCk7Ci0gICAgICAgICAgICBiYXJDaGFydC5TZXRTaXplKDgwMCwgMzk4KTsKLSAgICAgICAgICAgIGJhckNoYXJ0LlNlcmllcy5BZGQoRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMwLCAyLCByb3cgLSAxLCAyKSwgRXhjZWxSYW5nZS5HZXRBZGRyZXNzKDMwLCAxLCByb3cgLSAxLCAxKSk7Ci0gICAgICAgICAgICAvL2JhckNoYXJ0LlNlcmllc1swXS5IZWFkZXIgPSAiU2l6ZSI7Ci0gICAgICAgICAgICBiYXJDaGFydC5UaXRsZS5UZXh0ID0gIlRvcCBGaWxlIHNpemUiOwotCi0gICAgICAgICAgICAvL0Zvcm1hdCB0aGUgU2l6ZSBhbmQgQ291bnQgY29sdW1uCi0gICAgICAgICAgICB3cy5DZWxsc1siQjM6QjQyIl0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgICAgICAgICAvL1NldCBhIGJvcmRlciBhcm91bmQKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpBNDMiXS5TdHlsZS5Cb3JkZXIuTGVmdC5TdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuVGhpbjsKLSAgICAgICAgICAgIHdzLkNlbGxzWyJBMTpPMSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47Ci0gICAgICAgICAgICB3cy5DZWxsc1siTzE6TzQzIl0uU3R5bGUuQm9yZGVyLlJpZ2h0LlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOwotICAgICAgICAgICAgd3MuQ2VsbHNbIkE0MzpPNDMiXS5TdHlsZS5Cb3JkZXIuQm90dG9tLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOwotICAgICAgICAgICAgd3MuQ2VsbHNbMSwgMSwgcm93LCAyXS5BdXRvRml0Q29sdW1ucygxKTsKLQotICAgICAgICAgICAgLy9BbmQgbGFzdCB0aGUgcHJpbnRlcnNldHRpbmdzCi0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuT3JpZW50YXRpb24gPSBlT3JpZW50YXRpb24uTGFuZHNjYXBlOwotICAgICAgICAgICAgd3MuUHJpbnRlclNldHRpbmdzLkZpdFRvUGFnZSA9IHRydWU7Ci0gICAgICAgICAgICB3cy5QcmludGVyU2V0dGluZ3MuU2NhbGUgPSA2NzsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgc3RhdGlzdGljLXJvd3MgdG8gdGhlIHN0YXRpc3RpY3Mgc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3MiPldvcmtzaGVldDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibHN0Ij5MaXN0IHdpdGggc3RhdGlzdGljczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3RhcnRSb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGVhZGVyIj5IZWFkZXIgdGV4dDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5TaXplIG9yIENvdW50PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEFkZFN0YXRSb3dzKEV4Y2VsV29ya3NoZWV0IHdzLCBMaXN0PFN0YXRJdGVtPiBsc3QsIGludCBzdGFydFJvdywgc3RyaW5nIGhlYWRlciwgc3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9BZGQgSGVhZGVycwotICAgICAgICAgICAgaW50IHJvdyA9IHN0YXJ0Um93OwotICAgICAgICAgICAgaWYgKGhlYWRlciAhPSAiIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDFdLlZhbHVlID0gaGVhZGVyOwotICAgICAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHIgPSB3cy5DZWxsc1tyb3csIDEsIHJvdywgMl0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByLk1lcmdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgci5TdHlsZS5Gb250LlNldEZyb21Gb250KG5ldyBGb250KCJBcmlhbCIsIDE2LCBGb250U3R5bGUuSXRhbGljKSk7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuSG9yaXpvbnRhbEFsaWdubWVudCA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlckNvbnRpbnVvdXM7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IE9mZmljZU9wZW5YbWwuU3R5bGUuRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgICAgICAgICAgICAgICAgIHIuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuRnJvbUFyZ2IoNzkgLCAxMjksIDE4OSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRibFN0YXJ0PXJvdzsKLSAgICAgICAgICAgIC8vSGVhZGVyIDIKLSAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMV0uVmFsdWUgPSAiTmFtZSI7Ci0gICAgICAgICAgICB3cy5DZWxsc1tyb3csIDJdLlZhbHVlID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgdXNpbmcgKEV4Y2VsUmFuZ2UgciA9IHdzLkNlbGxzW3JvdywgMSwgcm93LCAyXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLlN0eWxlLkZvbnQuU2V0RnJvbUZvbnQobmV3IEZvbnQoIkFyaWFsIiwgMTIsIEZvbnRTdHlsZS5Cb2xkKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgLy9BZGQgdG9wIDEwIHJvd3MKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobHN0LkNvdW50IC0gaSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDFdLlZhbHVlID0gbHN0W2xzdC5Db3VudCAtIGkgLSAxXS5OYW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09ICJTaXplIikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGxzdFtsc3QuQ291bnQgLSBpIC0gMV0uU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMl0uVmFsdWUgPSBsc3RbbHN0LkNvdW50IC0gaSAtIDFdLkNvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0lmIHdlIGhhdmUgbW9yZSB0aGFuIDEwIGl0ZW1zLCBzdW0uLi4KLSAgICAgICAgICAgIGxvbmcgcmVzdCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzdC5Db3VudCAtIDEwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSAiU2l6ZSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN0ICs9IGxzdFtpXS5TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN0ICs9IGxzdFtpXS5Db3VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLy4uLiBhbmQgYWRkIGFub3RoZXJzIHJvdwotICAgICAgICAgICAgaWYgKHJlc3QgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMV0uVmFsdWUgPSAiT3RoZXJzIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDJdLlZhbHVlID0gcmVzdDsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDEsIHJvdywgMl0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgMSwgcm93LCAyXS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5MaWdodEdyYXkpOwotICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgdGJsID0gd3MuVGFibGVzLkFkZCh3cy5DZWxsc1t0YmxTdGFydCwgMSwgcm93IC0gMSwgMl0sIG51bGwpOwotICAgICAgICAgICAgdGJsLlRhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5NZWRpdW0xNjsKLSAgICAgICAgICAgIHRibC5TaG93VG90YWwgPSB0cnVlOwotICAgICAgICAgICAgdGJsLkNvbHVtbnNbMV0uVG90YWxzUm93RnVuY3Rpb24gPSBSb3dGdW5jdGlvbnMuU3VtOwotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBKdXN0IGFsdGVycyB0aGUgY29sb3JzIGluIHRoZSBsaXN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3MiPlRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+U3RhcnRyb3c8L3BhcmFtPgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFsdGVyQ29sb3IoRXhjZWxXb3Jrc2hlZXQgd3MsIGludCByb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nIChFeGNlbFJhbmdlIHJvd1JhbmdlID0gd3MuQ2VsbHNbcm93LCAxLCByb3csIDJdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJvd1JhbmdlLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICBpZihyb3cgJSAyPT0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcm93UmFuZ2UuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmF5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcm93UmFuZ2UuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRZZWxsb3cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBBZGREaXJlY3RvcnkoRXhjZWxXb3Jrc2hlZXQgd3MsIERpcmVjdG9yeUluZm8gZGlyLCBpbnQgcm93LCBkb3VibGUgaGVpZ2h0LCBpbnQgbGV2ZWwsIGJvb2wgc2tpcEljb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0dldCB0aGUgaWNvbiBhcyBhIGJpdG1hcAotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkRpcmVjdG9yeSAiICsgZGlyLk5hbWUpOwotICAgICAgICAgICAgaWYgKCFza2lwSWNvbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGljb24gPSBHZXRJY29uKGRpci5GdWxsTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICB3cy5Sb3cocm93KS5IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLy9BZGQgdGhlIGljb24gYXMgYSBwaWN0dXJlCi0gICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsUGljdHVyZSBwaWMgPSB3cy5EcmF3aW5ncy5BZGRQaWN0dXJlKCJwaWMiICsgKHJvdykuVG9TdHJpbmcoKSwgaWNvbik7Ci0gICAgICAgICAgICAgICAgICAgIHBpYy5TZXRQb3NpdGlvbigoaW50KTIwICogKHJvdyAtIDEpICsgMiwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGRpci5OYW1lOwotICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCA0XS5WYWx1ZSA9IGRpci5DcmVhdGlvblRpbWU7Ci0gICAgICAgICAgICB3cy5DZWxsc1tyb3csIDVdLlZhbHVlID0gZGlyLkxhc3RBY2Nlc3NUaW1lOwotCi0gICAgICAgICAgICB3cy5DZWxsc1tyb3csIDIsIHJvdywgNV0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vU2V0cyB0aGUgb3V0bGluZSBkZXB0aAotICAgICAgICAgICAgd3MuUm93KHJvdykuT3V0bGluZUxldmVsID0gbGV2ZWw7Ci0KLSAgICAgICAgICAgIGludCBwcmV2Um93ID0gcm93OwotICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICAvL0FkZCBzdWJkaXJlY3RvcmllcwotICAgICAgICAgICAgZm9yZWFjaCAoRGlyZWN0b3J5SW5mbyBzdWJEaXIgaW4gZGlyLkdldERpcmVjdG9yaWVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgX21heExldmVscykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdyA9IEFkZERpcmVjdG9yeSh3cywgc3ViRGlyLCByb3csIGhlaWdodCwgbGV2ZWwgKyAxLCBza2lwSWNvbnMpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9BZGQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeQotICAgICAgICAgICAgZm9yZWFjaCAoRmlsZUluZm8gZmlsZSBpbiBkaXIuR2V0RmlsZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNraXBJY29ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcCBmaWxlSWNvbiA9IEdldEljb24oZmlsZS5GdWxsTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3MuUm93KHJvdykuSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUljb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQaWN0dXJlIHBpYyA9IHdzLkRyYXdpbmdzLkFkZFBpY3R1cmUoInBpYyIgKyAocm93KS5Ub1N0cmluZygpLCBmaWxlSWNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaWMuU2V0UG9zaXRpb24oKGludCkyMCAqIChyb3cgLSAxKSArIDIsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCAyXS5WYWx1ZSA9IGZpbGUuTmFtZTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tyb3csIDNdLlZhbHVlID0gZmlsZS5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbcm93LCA0XS5WYWx1ZSA9IGZpbGUuQ3JlYXRpb25UaW1lOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzW3JvdywgNV0uVmFsdWUgPSBmaWxlLkxhc3RBY2Nlc3NUaW1lOwotCi0gICAgICAgICAgICAgICAgd3MuUm93KHJvdykuT3V0bGluZUxldmVsID0gbGV2ZWwrMTsKLQotICAgICAgICAgICAgICAgIEFkZFN0YXRpc3RpY3MoZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BZGQgYSBzdWJ0b3RhbCBmb3IgdGhlIGRpcmVjdG9yeQotICAgICAgICAgICAgaWYgKHJvdyAtMSA+IHByZXZSb3cpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHdzLkNlbGxzW3ByZXZSb3csIDNdLkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVUJUT1RBTCg5LCB7MH0pIiwgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHByZXZSb3cgKyAxLCAzLCByb3cgLSAxLCAzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbcHJldlJvdywgM10uVmFsdWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBzdGF0aXN0aWNzIHRvIHRoZSBjb2xsZWN0aW9ucyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFkZFN0YXRpc3RpY3MoRmlsZUluZm8gZmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy9FeHRlbnNpb24KLSAgICAgICAgICAgIGlmIChfZXh0U3RhdC5Db250YWluc0tleShmaWxlLkV4dGVuc2lvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2V4dFN0YXRbZmlsZS5FeHRlbnNpb25dLkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgX2V4dFN0YXRbZmlsZS5FeHRlbnNpb25dLlNpemUrPWZpbGUuTGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBleHQgPSBmaWxlLkV4dGVuc2lvbi5MZW5ndGggPiAwID8gZmlsZS5FeHRlbnNpb24uUmVtb3ZlKDAsIDEpIDogIiI7Ci0gICAgICAgICAgICAgICAgX2V4dFN0YXQuQWRkKGZpbGUuRXh0ZW5zaW9uLCBuZXcgU3RhdEl0ZW0oKSB7IE5hbWUgPSBleHQsIENvdW50ID0gMSwgU2l6ZSA9IGZpbGUuTGVuZ3RoIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0ZpbGUgdG9wIDEwOwotICAgICAgICAgICAgaWYgKF9maWxlU2l6ZS5Db3VudCA8IDEwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9maWxlU2l6ZS5BZGQobmV3IFN0YXRJdGVtIHsgTmFtZSA9IGZpbGUuTmFtZSwgU2l6ZSA9IGZpbGUuTGVuZ3RoIH0pOwotICAgICAgICAgICAgICAgIGlmIChfZmlsZVNpemUuQ291bnQgPT0gMTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmlsZVNpemUuU29ydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoX2ZpbGVTaXplWzBdLlNpemUgPCBmaWxlLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZmlsZVNpemUuUmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgX2ZpbGVTaXplLkFkZChuZXcgU3RhdEl0ZW0geyBOYW1lID0gZmlsZS5OYW1lLCBTaXplID0gZmlsZS5MZW5ndGggfSk7Ci0gICAgICAgICAgICAgICAgX2ZpbGVTaXplLlNvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSBpY29uIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRmlsZU5hbWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcCBHZXRJY29uKHN0cmluZyBGaWxlTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU0hGSUxFSU5GTyBzaGluZm8gPSBuZXcgU0hGSUxFSU5GTygpOyAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHZhciByZXQgPSBTSEdldEZpbGVJbmZvKEZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiBzaGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludClNYXJzaGFsLlNpemVPZihzaGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hHRklfSUNPTiB8IFNIR0ZJX1NNQUxMSUNPTik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2hpbmZvLmhJY29uID09IEludFB0ci5aZXJvKSByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSBJY29uLkZyb21IYW5kbGUoc2hpbmZvLmhJY29uKS5Ub0JpdG1hcCgpOwotICAgICAgICAgICAgICAgIERlc3Ryb3lJY29uKHNoaW5mby5oSWNvbik7Ci0KLSAgICAgICAgICAgICAgICAvL0ZpeCB0cmFuc3BhcmFudCBjb2xvciAKLSAgICAgICAgICAgICAgICBDb2xvciBJbnZhbGlkQ29sb3IgPSBDb2xvci5Gcm9tQXJnYigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB3ID0gMDsgdyA8IGJtcC5QaHlzaWNhbERpbWVuc2lvbi5XaWR0aDsgdysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaCA9IDA7IGggPCBibXAuUGh5c2ljYWxEaW1lbnNpb24uSGVpZ2h0OyBoKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibXAuR2V0UGl4ZWwodywgaCkgPT0gSW52YWxpZENvbG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC5TZXRQaXhlbCh3LCBoLCBDb2xvci5UcmFuc3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYm1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU3LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTcuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmZmYWQuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTcuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIGNsYXNzIFNhbXBsZTcKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgc2FtcGxlIGxvYWQgYSBudW1iZXIgb2Ygcm93cywgc3R5bGUgdGhlbSBhbmQgaW5zZXJ0IGEgcm93IGF0IHRoZSB0b3AuCi0gICAgICAgIC8vLyBBIHBhc3N3b3JkIGlzIHNldCB0byBwcm90ZWN0IGxvY2tlZCBjZWxscy4gQ29sdW1uIDMgJiA0IHdpbGwgYmUgZWRpdGFibGUsIHRoZSByZXN0IHdpbGwgYmUgbG9ja2VkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3dzIj48L3BhcmFtPgotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSdW5TYW1wbGU3KERpcmVjdG9yeUluZm8gb3V0cHV0RGlyLCBpbnQgUm93cykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU3Lnhsc3giKTsKLSAgICAgICAgICAgIGlmIChuZXdGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLSAgICAgICAgICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTcueGxzeCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0U3RhcnRpbmcuLi4iLCBEYXRlVGltZS5Ob3cpOwotCi0gICAgICAgICAgICAgICAgLy9Mb2FkIHRoZSBzaGVldCB3aXRoIG9uZSBzdHJpbmcgY29sdW1uLCBvbmUgZGF0ZSBjb2x1bW4gYW5kIGEgZmV3IHJhbmRvbSBudW1iZXJzLgotICAgICAgICAgICAgICAgIHZhciB3cyA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIlBlcmZvcm1hbmNlIFRlc3QiKTsKLQotICAgICAgICAgICAgICAgIC8vRm9ybWF0IGFsbCBjZWxscwotICAgICAgICAgICAgICAgIEV4Y2VsUmFuZ2UgY29scyA9IHdzLkNlbGxzWyJBOlhGRCJdOwotICAgICAgICAgICAgICAgIGNvbHMuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIGNvbHMuU3R5bGUuRmlsbC5CYWNrZ3JvdW5kQ29sb3IuU2V0Q29sb3IoQ29sb3IuTGlnaHRHcmF5KTsKLQotICAgICAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8PSBSb3dzOyByb3crKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKHJvdywgMSwgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgU2V0VmFsdWUgbWV0aG9kIGlzIGEgbGl0dGxlIGJpdCBmYXN0ZXIgdGhhbiB1c2luZyB0aGUgVmFsdWUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgd3MuU2V0VmFsdWUocm93LCAyLCBzdHJpbmcuRm9ybWF0KCJSb3cgezB9Iiwgcm93KSk7Ci0gICAgICAgICAgICAgICAgICAgIHdzLlNldFZhbHVlKHJvdywgMywgRGF0ZVRpbWUuVG9kYXkuQWRkRGF5cyhyb3cpKTsKLSAgICAgICAgICAgICAgICAgICAgd3MuU2V0VmFsdWUocm93LCA0LCBybmQuTmV4dERvdWJsZSgpICogMTAwMDApOwotICAgICAgICAgICAgICAgICAgICBpZiAocm93ICUgMTAwMDAgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0V3JpdGluZyByb3cgezF9Li4uIiwgRGF0ZVRpbWUuTm93LCByb3cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdzLkNlbGxzWzEsIDUsIFJvd3MsIDVdLkZvcm11bGFSMUMxID0gIlJDWy00XStSQ1stMV0iOwotCi0gICAgICAgICAgICAgICAgLy9BZGQgYSBzdW0gYXQgdGhlIGVuZAotICAgICAgICAgICAgICAgIHdzLkNlbGxzW1Jvd3MgKyAxLCA1XS5Gb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiU3VtKHswfSkiLCBuZXcgRXhjZWxBZGRyZXNzKDEsIDUsIFJvd3MsIDUpLkFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzW1Jvd3MgKyAxLCA1XS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzW1Jvd3MgKyAxLCA1XS5TdHlsZS5OdW1iZXJmb3JtYXQuRm9ybWF0ID0gIiMsIyMwLjAwIjsKLQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MDpISC5tbS5zc31cdFdyaXRpbmcgcm93IHsxfS4uLiIsIERhdGVUaW1lLk5vdywgUm93cyk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0Rm9ybWF0dGluZy4uLiIsIERhdGVUaW1lLk5vdyk7Ci0gICAgICAgICAgICAgICAgLy9Gb3JtYXQgdGhlIGRhdGUgYW5kIG51bWVyaWMgY29sdW1ucwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWzEsIDEsIFJvd3MsIDFdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWzEsIDMsIFJvd3MsIDNdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiWVlZWS1NTS1ERCI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNCwgUm93cywgNV0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMC4wMCI7Ci0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezA6SEgubW0uc3N9XHRJbnNlcnQgYSByb3cgYXQgdGhlIHRvcC4uLiIsIERhdGVUaW1lLk5vdyk7Ci0gICAgICAgICAgICAgICAgLy9JbnNlcnQgYSByb3cgYXQgdGhlIHRvcC4gTm90ZSB0aGF0IHRoZSBmb3JtdWxhLWFkZHJlc3NlcyBhcmUgc2hpZnRlZCBkb3duCi0gICAgICAgICAgICAgICAgd3MuSW5zZXJ0Um93KDEsIDEpOwotCi0gICAgICAgICAgICAgICAgLy9Xcml0ZSB0aGUgaGVhZGVycyBhbmQgc3R5bGUgdGhlbQotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gIkluZGV4IjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5WYWx1ZSA9ICJUZXh0IjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQzEiXS5WYWx1ZSA9ICJEYXRlIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siRDEiXS5WYWx1ZSA9ICJOdW1iZXIiOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJFMSJdLlZhbHVlID0gIkZvcm11bGEiOwotICAgICAgICAgICAgICAgIHdzLlZpZXcuRnJlZXplUGFuZXMoMiwgMSk7Ci0KLSAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJuZyA9IHdzLkNlbGxzWyJBMTpFMSJdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJuZy5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLldyYXBUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLlZlcnRpY2FsQWxpZ25tZW50ID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5DZW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHJuZy5TdHlsZS5Ib3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcjsKLSAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLkZpbGwuUGF0dGVyblR5cGUgPSBFeGNlbEZpbGxTdHlsZS5Tb2xpZDsKLSAgICAgICAgICAgICAgICAgICAgcm5nLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkRhcmtCbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0NhbGN1bGF0ZSAoQ29tbWVudGVkIGF3YXkgdGhpc2ssIGl0IHdhcyBhIGJpdCB0aW1lIGNvbnN1bWluZy4uLiAvTUEpCi0gICAgICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0Q2FsY3VsYXRlIGZvcm11bGFzLi4uIiwgRGF0ZVRpbWUuTm93KTsKLSAgICAgICAgICAgICAgICAvLyB3cy5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MDpISC5tbS5zc31cdEF1dG9maXQgY29sdW1ucyBhbmQgbG9jayBhbmQgZm9ybWF0IGNlbGxzLi4uIiwgRGF0ZVRpbWUuTm93KTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1tSb3dzIC0gMTAwLCAxLCBSb3dzLCA1XS5BdXRvRml0Q29sdW1ucyg1KTsgICAvL0F1dG8gZml0IHVzaW5nIHRoZSBsYXN0IDEwMCByb3dzIHdpdGggbWluaW11bSB3aWR0aCA1Ci0gICAgICAgICAgICAgICAgd3MuQ29sdW1uKDUpLldpZHRoID0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgbmVlZCB0byBzZXQgdGhlIHdpZHRoIGZvciBjb2x1bW4gRiBtYW51YWxseSBzaW5jZSB0aGUgZW5kIHN1bSBmb3JtdWxhIGlzIHRoZSB3aWRlc3QgY2VsbCBpbiB0aGUgY29sdW1uIChFUFBsdXMgZG9uJ3QgY2FsY3VsYXRlIGFueSBmb3J1bWxhcywgc28gbm8gb3V0cHV0IHRleHQgaXMgYXZhbGlibGUpLiAKLQotICAgICAgICAgICAgICAgIC8vTm93IHdlIHNldCB0aGUgc2hlZXRwcm90ZWN0aW9uIGFuZCBhIHBhc3N3b3JkLgotICAgICAgICAgICAgICAgIHdzLkNlbGxzWzIsIDMsIFJvd3MgKyAxLCA0XS5TdHlsZS5Mb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1syLCAzLCBSb3dzICsgMSwgNF0uU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWzIsIDMsIFJvd3MgKyAxLCA0XS5TdHlsZS5GaWxsLkJhY2tncm91bmRDb2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbMSwgNSwgUm93cyArIDIsIDVdLlN0eWxlLkhpZGRlbiA9IHRydWU7ICAgIC8vSGlkZSB0aGUgZm9ybXVsYQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdzLlByb3RlY3Rpb24uU2V0UGFzc3dvcmQoIkVQUGx1cyIpOwotCi0gICAgICAgICAgICAgICAgd3MuU2VsZWN0KCJDMiIpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MDpISC5tbS5zc31cdFNhdmluZy4uLiIsIERhdGVUaW1lLk5vdyk7Ci0gICAgICAgICAgICAgICAgcGFja2FnZS5Db21wcmVzc2lvbiA9IENvbXByZXNzaW9uTGV2ZWwuQmVzdFNwZWVkOwotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ld0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswOkhILm1tLnNzfVx0RG9uZSEhIiwgRGF0ZVRpbWUuTm93KTsKLSAgICAgICAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZTguY3MgYi9TYW1wbGVBcHAvU2FtcGxlOC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5ODkyMi4uMDAwMDAwMAotLS0gYS9TYW1wbGVBcHAvU2FtcGxlOC5jcworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqCi0gKiAKLSAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKiAKLSAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKLSAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCi0gKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxIE1hciAyMDEwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIFN5c3RlbS5MaW5xOwotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbnFTYW1wbGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byB1c2UgTGlucSB3aXRoIHRoZSBDZWxscyBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0RGlyIj5UaGUgcGF0aCB3aGVyZSBzYW1wbGU3Lnhsc3ggaXM8L3BhcmFtPgotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuTGlucVNhbXBsZShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLSAgICAgICAgewotCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk5vdyBvcGVuIHNhbXBsZSA3IGFnYWluIGFuZCBwZXJmb3JtIHNvbWUgTGlucSBxdWVyaWVzLi4uIik7Ci0JCSAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0JCQlGaWxlSW5mbyBleGlzdGluZ0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlNy54bHN4Iik7Ci0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKGV4aXN0aW5nRmlsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbMV07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9TZWxlY3QgYWxsIGNlbGxzIGluIGNvbHVtbiBkIGJldHdlZW4gOTk5MCBhbmQgMTAwMDAKLSAgICAgICAgICAgICAgICB2YXIgcXVlcnkxPSAoZnJvbSBjZWxsIGluIHNoZWV0LkNlbGxzWyJkOmQiXSB3aGVyZSBjZWxsLlZhbHVlIGlzIGRvdWJsZSAmJiAoZG91YmxlKWNlbGwuVmFsdWUgPj0gOTk5MCAmJiAoZG91YmxlKWNlbGwuVmFsdWUgPD0gMTAwMDAgc2VsZWN0IGNlbGwpOwotCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlByaW50IGFsbCBjZWxscyB3aXRoIHZhbHVlIGJldHdlZW4gOTk5MCBhbmQgMTAwMDAgaW4gY29sdW1uIEQgLi4uIik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcXVlcnkxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNlbGwgezB9IGhhcyB2YWx1ZSB7MTpOMH0iLCBjZWxsLkFkZHJlc3MsIGNlbGwuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gY2VsbHMgZm91bmQgLi4uIixjb3VudCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQotICAgICAgICAgICAgICAgIC8vU2VsZWN0IGFsbCBib2xkIGNlbGxzCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk5vdyBnZXQgYWxsIGJvbGQgY2VsbHMgZnJvbSB0aGUgZW50aXJlIHNoZWV0Li4uIik7Ci0gICAgICAgICAgICAgICAgdmFyIHF1ZXJ5MiA9IChmcm9tIGNlbGwgaW4gc2hlZXQuQ2VsbHNbc2hlZXQuRGltZW5zaW9uLkFkZHJlc3NdIHdoZXJlIGNlbGwuU3R5bGUuRm9udC5Cb2xkIHNlbGVjdCBjZWxsKTsKLSAgICAgICAgICAgICAgICAvL0lmIHlvdSBoYXZlIGEgY2x1ZSB3aGVyZSB0aGUgZGF0YSBpcywgc3BlY2lmeSBhIHNtYWxsZXIgcmFuZ2UgaW4gdGhlIGNlbGxzIGluZGV4ZXIgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSAoZm9yIGV4YW1wbGUgIjE6MSw2NTUzNjo2NTUzNiIgaGVyZSkKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcXVlcnkyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShjZWxsLkZvcm11bGEpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2VsbCB7MH0gaXMgYm9sZCBhbmQgaGFzIGEgZm9ybXVsYSBvZiB7MTpOMH0iLCBjZWxsLkFkZHJlc3MsIGNlbGwuRm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2VsbCB7MH0gaXMgYm9sZCBhbmQgaGFzIGEgdmFsdWUgb2YgezE6TjB9IiwgY2VsbC5BZGRyZXNzLCBjZWxsLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vSGVyZSB3ZSB1c2UgbW9yZSB0aGFuIG9uZSBjb2x1bW4gaW4gdGhlIHdoZXJlIGNsYXVzZS4gV2Ugc3RhcnQgYnkgc2VhcmNoaW5nIGNvbHVtbiBELCB0aGVuIHVzZSB0aGUgT2Zmc2V0IG1ldGhvZCB0byBjaGVjayB0aGUgdmFsdWUgb2YgY29sdW1uIEMuCi0gICAgICAgICAgICAgICAgdmFyIHF1ZXJ5MyA9IChmcm9tIGNlbGwgaW4gc2hlZXQuQ2VsbHNbImQ6ZCJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBjZWxsLlZhbHVlIGlzIGRvdWJsZSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpY2VsbC5WYWx1ZSA+PSA5NTAwICYmIChkb3VibGUpY2VsbC5WYWx1ZSA8PSAxMDAwMCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuT2Zmc2V0KDAsIC0xKS5HZXRWYWx1ZTxEYXRlVGltZT4oKS5ZZWFyID09IERhdGVUaW1lLlRvZGF5LlllYXIrMSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBjZWxsKTsKLQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlByaW50IGFsbCBjZWxscyB3aXRoIGEgdmFsdWUgYmV0d2VlbiA5NTAwIGFuZCAxMDAwMCBpbiBjb2x1bW4gRCBhbmQgdGhlIHllYXIgb2YgQ29sdW1uIEMgaXMgezB9IC4uLiIsIERhdGVUaW1lLlRvZGF5LlllYXIgKyAxKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOyAgICAKLQotICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBxdWVyeTMpICAgIC8vVGhlIGNlbGxzIHJldHVybmVkIGhlcmUgd2lsbCBhbGwgYmUgaW4gY29sdW1uIEQsIHNpbmNlIHRoYXQgaXMgdGhlIGFkZHJlc3MgaW4gdGhlIGluZGV4ZXIuIFVzZSB0aGUgT2Zmc2V0IG1ldGhvZCB0byBwcmludCBhbnkgb3RoZXIgY2VsbHMgZnJvbSB0aGUgc2FtZSByb3cuCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2VsbCB7MH0gaGFzIHZhbHVlIHsxOk4wfSBEYXRlIGlzIHsyOmR9IiwgY2VsbC5BZGRyZXNzLCBjZWxsLlZhbHVlLCBjZWxsLk9mZnNldCgwLCAtMSkuR2V0VmFsdWU8RGF0ZVRpbWU+KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9TYW1wbGU5LmNzIGIvU2FtcGxlQXBwL1NhbXBsZTkuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2M1Y2EuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZTkuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIEVQUGx1cyBpcyBhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IHByb3ZpZGVkIHVuZGVyIHRoZSAKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKgotICogCi0gKiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICogCi0gKiBUaGUgY29kZSBmb3IgdGhpcyBwcm9qZWN0IG1heSBiZSB1c2VkIGFuZCByZWRpc3RyaWJ1dGVkIGJ5IGFueSBtZWFucyBQUk9WSURJTkcgaXQgaXMgCi0gKiBub3Qgc29sZCBmb3IgcHJvZml0IHdpdGhvdXQgdGhlIGF1dGhvcidzIHdyaXR0ZW4gY29uc2VudCwgYW5kIHByb3ZpZGluZyB0aGF0IHRoaXMgbm90aWNlIAotICogYW5kIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhbGwgY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KLSAqIAotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyOCBPY3QgMjAxMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byBsb2FkIENTViBmaWxlcyB1c2luZyB0aGUgTG9hZEZyb21UZXh0IG1ldGhvZCwgaG93IHRvIHVzZSB0YWJsZXMgYW5kCi0gICAgLy8vIGhvdyB0byB1c2UgY2hhcnRzIHdpdGggbW9yZSB0aGFuIG9uZSBjaGFydHR5cGUgYW5kIHNlY29uZGFyeSBheGlzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhbXBsZTkKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvYWRzIHR3byBDU1YgZmlsZXMgaW50byB0YWJsZXMgYW5kIGFkZHMgYSBjaGFydCB0byBlYWNoIHNoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dERpciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUnVuU2FtcGxlOShEaXJlY3RvcnlJbmZvIG91dHB1dERpcikKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGU5Lnhsc3giKTsKLSAgICAgICAgICAgIGlmIChuZXdGaWxlLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLSAgICAgICAgICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTkueGxzeCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB1c2luZyAoRXhjZWxQYWNrYWdlIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTG9hZEZpbGUxKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIExvYWRGaWxlMihwYWNrYWdlKTsKLQotICAgICAgICAgICAgICAgIHBhY2thZ2UuU2F2ZUFzKG5ld0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBMb2FkRmlsZTEoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBXb3Jrc2hlZXQKLSAgICAgICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkNzdjEiKTsKLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIGZvcm1hdCBvYmplY3QgdG8gZGVzY3JpYmUgdGhlIHRleHQgZmlsZQotICAgICAgICAgICAgdmFyIGZvcm1hdCA9IG5ldyBFeGNlbFRleHRGb3JtYXQoKTsKLSAgICAgICAgICAgIGZvcm1hdC5UZXh0UXVhbGlmaWVyID0gJyInOwotICAgICAgICAgICAgZm9ybWF0LlNraXBMaW5lc0JlZ2lubmluZyA9IDI7Ci0gICAgICAgICAgICBmb3JtYXQuU2tpcExpbmVzRW5kID0gMTsKLQotICAgICAgICAgICAgLy9Ob3cgcmVhZCB0aGUgZmlsZSBpbnRvIHRoZSBzaGVldC4gU3RhcnQgZnJvbSBjZWxsIEExLiBDcmVhdGUgYSB0YWJsZSB3aXRoIHN0eWxlIDI3LiBGaXJzdCByb3cgY29udGFpbnMgdGhlIGhlYWRlci4KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMb2FkIHRoZSB0ZXh0IGZpbGUuLi4iKTsKLSAgICAgICAgICAgIHZhciByYW5nZSA9IHNoZWV0LkNlbGxzWyJBMSJdLkxvYWRGcm9tVGV4dChuZXcgRmlsZUluZm8oIi4uXFwuLlxcY3N2XFxTYW1wbGU5LTEudHh0IiksIGZvcm1hdCwgVGFibGVTdHlsZXMuTWVkaXVtMjcsIHRydWUpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRm9ybWF0IHRoZSB0YWJsZS4uLiIpOwotICAgICAgICAgICAgLy9UYWJsZXMgZG9uJ3Qgc3VwcG9ydCBjdXN0b20gc3R5bGluZyBhdCB0aGlzIHN0YWdlKHlvdSBjYW4gb2YgY291cnNlIGZvcm1hdCB0aGUgY2VsbHMpLCBidXQgd2UgY2FuIGNyZWF0ZSBhIE5hbWVkc3R5bGUgZm9yIGEgY29sdW1uLi4uCi0gICAgICAgICAgICB2YXIgZGF0ZVN0eWxlID0gcGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiVGFibGVEYXRlIik7Ci0gICAgICAgICAgICBkYXRlU3R5bGUuU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICJZWVlZLU1NIjsKLQotICAgICAgICAgICAgdmFyIG51bVN0eWxlID0gcGFja2FnZS5Xb3JrYm9vay5TdHlsZXMuQ3JlYXRlTmFtZWRTdHlsZSgiVGFibGVOdW1iZXIiKTsKLSAgICAgICAgICAgIG51bVN0eWxlLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMCI7Ci0KLSAgICAgICAgICAgIC8vTm93IGZvcm1hdCB0aGUgdGFibGUuLi4KLSAgICAgICAgICAgIHZhciB0YmwgPSBzaGVldC5UYWJsZXNbMF07Ci0gICAgICAgICAgICB0YmwuU2hvd1RvdGFsID0gdHJ1ZTsKLSAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLlRvdGFsc1Jvd0xhYmVsID0gIlRvdGFsIjsKLSAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLkRhdGFDZWxsU3R5bGVOYW1lID0gIlRhYmxlRGF0ZSI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1sxXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1sxXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s2XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s2XS5EYXRhQ2VsbFN0eWxlTmFtZSA9ICJUYWJsZU51bWJlciI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDcmVhdGUgdGhlIGNoYXJ0Li4uIik7Ci0gICAgICAgICAgICAvL05vdyBhZGQgYSBzdGFja2VkIGFyZWFjaGFydC4uLgotICAgICAgICAgICAgdmFyIGNoYXJ0ID0gc2hlZXQuRHJhd2luZ3MuQWRkQ2hhcnQoImNoYXJ0MSIsIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQpOwotICAgICAgICAgICAgY2hhcnQuU2V0UG9zaXRpb24oMCwgNjMwKTsKLSAgICAgICAgICAgIGNoYXJ0LlNldFNpemUoODAwLCA2MDApOwotCi0gICAgICAgICAgICAvL0NyZWF0ZSBvbmUgc2VyaWVzIGZvciBlYWNoIGNvbHVtbi4uLgotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMTsgY29sIDwgNzsgY29sKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNlciA9IGNoYXJ0LlNlcmllcy5BZGQocmFuZ2UuT2Zmc2V0KDEsIGNvbCwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpLCByYW5nZS5PZmZzZXQoMSwgMCwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpKTsKLSAgICAgICAgICAgICAgICBzZXIuSGVhZGVyQWRkcmVzcyA9IHJhbmdlLk9mZnNldCgwLCBjb2wsIDEsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL1NldCB0aGUgc3R5bGUgdG8gMjcuCi0gICAgICAgICAgICBjaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjc7Ci0KLSAgICAgICAgICAgIHNoZWV0LlZpZXcuU2hvd0dyaWRMaW5lcyA9IGZhbHNlOwotICAgICAgICAgICAgc2hlZXQuQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICBzaGVldC5DZWxsc1tzaGVldC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTG9hZEZpbGUyKEV4Y2VsUGFja2FnZSBwYWNrYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgV29ya3NoZWV0Ci0gICAgICAgICAgICB2YXIgc2hlZXQgPSBwYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuQWRkKCJDc3YyIik7Ci0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBmb3JtYXQgb2JqZWN0IHRvIGRlc2NyaWJlIHRoZSB0ZXh0IGZpbGUKLSAgICAgICAgICAgIHZhciBmb3JtYXQgPSBuZXcgRXhjZWxUZXh0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBmb3JtYXQuRGVsaW1pdGVyPSdcdCc7IC8vVGFiCi0gICAgICAgICAgICBmb3JtYXQuU2tpcExpbmVzQmVnaW5uaW5nID0gMTsKLSAgICAgICAgICAgIEN1bHR1cmVJbmZvIGNpID0gbmV3IEN1bHR1cmVJbmZvKCJzdi1TRSIpOyAgICAgICAgICAvL1VzZSB5b3VyIGNob2ljZSBvZiBDdWx0dXJlCi0gICAgICAgICAgICBjaS5OdW1iZXJGb3JtYXQuTnVtYmVyRGVjaW1hbFNlcGFyYXRvciA9ICIsIjsgICAgICAgLy9EZWNpbWFsIGlzIGNvbW1hCi0gICAgICAgICAgICBmb3JtYXQuQ3VsdHVyZSA9IGNpOwotCi0gICAgICAgICAgICAvL05vdyByZWFkIHRoZSBmaWxlIGludG8gdGhlIHNoZWV0LgotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxvYWQgdGhlIHRleHQgZmlsZS4uLiIpOwotICAgICAgICAgICAgdmFyIHJhbmdlID0gc2hlZXQuQ2VsbHNbIkExIl0uTG9hZEZyb21UZXh0KG5ldyBGaWxlSW5mbygiLi5cXC4uXFxjc3ZcXFNhbXBsZTktMi50eHQiKSwgZm9ybWF0KTsKLQotICAgICAgICAgICAgLy9BZGQgYSBmb3JtdWxhCi0gICAgICAgICAgICByYW5nZS5PZmZzZXQoMSwgcmFuZ2UuRW5kLkNvbHVtbiwgcmFuZ2UuRW5kLlJvdyAtIHJhbmdlLlN0YXJ0LlJvdywgMSkuRm9ybXVsYVIxQzEgPSAiUkNbLTFdLVJDWy0yXSI7Ci0KLSAgICAgICAgICAgIC8vQWRkIGEgdGFibGUuLi4KLSAgICAgICAgICAgIHZhciB0YmwgPSBzaGVldC5UYWJsZXMuQWRkKHJhbmdlLk9mZnNldCgwLDAscmFuZ2UuRW5kLlJvdy1yYW5nZS5TdGFydC5Sb3crMSwgcmFuZ2UuRW5kLkNvbHVtbi1yYW5nZS5TdGFydC5Db2x1bW4rMiksIlRhYmxlIik7Ci0gICAgICAgICAgICB0YmwuU2hvd1RvdGFsID0gdHJ1ZTsKLSAgICAgICAgICAgIHRibC5Db2x1bW5zWzBdLlRvdGFsc1Jvd0xhYmVsID0gIlRvdGFsIjsKLSAgICAgICAgICAgIHRibC5Db2x1bW5zWzFdLlRvdGFsc1Jvd0Zvcm11bGEgPSAiQ09VTlQoMyxUYWJsZVtQcm9kdWN0XSkiOyAgICAvL0FkZCBhIGN1c3RvbSBmb3JtdWxhCi0gICAgICAgICAgICB0YmwuQ29sdW1uc1syXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1szXS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s0XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5Ub3RhbHNSb3dGdW5jdGlvbiA9IFJvd0Z1bmN0aW9ucy5TdW07Ci0gICAgICAgICAgICB0YmwuQ29sdW1uc1s1XS5OYW1lID0gIlByb2ZpdCI7Ci0gICAgICAgICAgICB0YmwuVGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk1lZGl1bTEwOwotCi0gICAgICAgICAgICBzaGVldC5DZWxsc1tzaGVldC5EaW1lbnNpb24uQWRkcmVzc10uQXV0b0ZpdENvbHVtbnMoKTsKLQotICAgICAgICAgICAgLy9BZGQgYSBjaGFydCB3aXRoIHR3byBjaGFydHR5cGVzIChDb2x1bW4gYW5kIExpbmUpIGFuZCBhIHNlY29uZGFyeSBheGlzLi4uCi0gICAgICAgICAgICB2YXIgY2hhcnQgPSBzaGVldC5EcmF3aW5ncy5BZGRDaGFydCgiY2hhcnQyIiwgZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkKTsKLSAgICAgICAgICAgIGNoYXJ0LlNldFBvc2l0aW9uKDAsIDU0MCk7Ci0gICAgICAgICAgICBjaGFydC5TZXRTaXplKDgwMCwgNjAwKTsKLSAgICAgICAgCi0gICAgICAgICAgICB2YXIgc2VyaWUxPSBjaGFydC5TZXJpZXMuQWRkKHJhbmdlLk9mZnNldCgxLCAzLCByYW5nZS5FbmQuUm93IC0gMSwgMSksIHJhbmdlLk9mZnNldCgxLCAxLCByYW5nZS5FbmQuUm93IC0gMSwgMSkpOwotICAgICAgICAgICAgc2VyaWUxLkhlYWRlciA9ICJQdXJjaGFzZSBQcmljZSI7Ci0gICAgICAgICAgICB2YXIgc2VyaWUyID0gY2hhcnQuU2VyaWVzLkFkZChyYW5nZS5PZmZzZXQoMSwgNSwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpLCByYW5nZS5PZmZzZXQoMSwgMSwgcmFuZ2UuRW5kLlJvdyAtIDEsIDEpKTsKLSAgICAgICAgICAgIHNlcmllMi5IZWFkZXIgPSAiUHJvZml0IjsKLQotICAgICAgICAgICAgLy9BZGQgYSBMaW5lIHNlcmllcwotICAgICAgICAgICAgdmFyIGNoYXJ0VHlwZTIgPSBjaGFydC5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChlQ2hhcnRUeXBlLkxpbmVTdGFja2VkKTsKLSAgICAgICAgICAgIGNoYXJ0VHlwZTIuVXNlU2Vjb25kYXJ5QXhpcyA9IHRydWU7Ci0gICAgICAgICAgICB2YXIgc2VyaWUzID0gY2hhcnRUeXBlMi5TZXJpZXMuQWRkKHJhbmdlLk9mZnNldCgxLCAyLCByYW5nZS5FbmQuUm93IC0gMSwgMSksIHJhbmdlLk9mZnNldCgxLCAwLCByYW5nZS5FbmQuUm93IC0gMSwgMSkpOwotICAgICAgICAgICAgc2VyaWUzLkhlYWRlciA9ICJJdGVtcyBpbiBzdG9jayI7Ci0KLSAgICAgICAgICAgIC8vQnkgZGVmYXVsdCB0aGUgc2Vjb25kYXJ5IFhBeGlzIGlzIG5vdCB2aXNpYmxlLCBidXQgd2Ugd2FudCB0byBzaG93IGl0Li4uCi0gICAgICAgICAgICBjaGFydFR5cGUyLlhBeGlzLkRlbGV0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoYXJ0VHlwZTIuWEF4aXMuVGlja0xhYmVsUG9zaXRpb24gPSBlVGlja0xhYmVsUG9zaXRpb24uSGlnaDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9TZXQgdGhlIG1heCB2YWx1ZSBmb3IgdGhlIFkgYXhpcy4uLgotICAgICAgICAgICAgY2hhcnRUeXBlMi5ZQXhpcy5NYXhWYWx1ZSA9IDUwOwotCi0gICAgICAgICAgICBjaGFydC5TdHlsZSA9IGVDaGFydFN0eWxlLlN0eWxlMjY7Ci0gICAgICAgICAgICBzaGVldC5WaWV3LlNob3dHcmlkTGluZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIHNoZWV0LkNhbGN1bGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZV9BZGRGb3JtdWxhRnVuY3Rpb24uY3MgYi9TYW1wbGVBcHAvU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyZTMwZS4uMDAwMDAwMAotLS0gYS9TYW1wbGVBcHAvU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OwotCi1uYW1lc3BhY2UgRVBQbHVzU2FtcGxlcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBzYW1wbGUgc2hvd3MgaG93IHRvIGFkZCBmdW5jdGlvbnMgdG8gdGhlIEZvcm11bGFQYXJzZXIgb2YgRVBQbHVzLgotICAgIC8vLyAKLSAgICAvLy8gRm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBob3cgdG8gYnVpbGQgZnVuY3Rpb25zLCBoYXZlIGEgbG9vayBpbiB0aGUgRVBQbHVzLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucyBuYW1lc3BhY2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGNsYXNzIFNhbXBsZV9BZGRGb3JtdWxhRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSdW5TYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgTWVtb3J5U3RyZWFtKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGFkZCB5b3VyIGZ1bmN0aW9uIG1vZHVsZSB0byB0aGUgcGFyc2VyCi0gICAgICAgICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5Mb2FkRnVuY3Rpb25Nb2R1bGUobmV3IE15RnVuY3Rpb25Nb2R1bGUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaWYgeW91IGRvbnQgd2FudCB0byB3cml0ZSBhIG1vZHVsZSwgeW91IGNhbiBhbHNvCi0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBmdW5jdGlvbnMgdG8gdGhlIHBhcnNlciB0aGlzIHdheToKLSAgICAgICAgICAgICAgICAvLyBwYWNrYWdlLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkFkZE9yUmVwbGFjZUZ1bmN0aW9uKCJzdW0uYWRkdHdvIiwgbmV3IFN1bUFkZFR3bygpKTstCi0gICAgICAgICAgICAgICAgLy8gcGFja2FnZS5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5BZGRPclJlcGxhY2VGdW5jdGlvbigic2VhbmNvbm5lcnlmeSIsIG5ldyBTZWFuQ29ubmVyeWZ5KCkpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgLy9PdmVycmlkZSB0aGUgYnVpbGRpbiBUZXh0IGZ1bmN0aW9uIHRvIGhhbmRsZSBzd2VkaXNoIGRhdGUgZm9ybWF0dGluZyBzdHJpbmdzLiBFeGNlbCBoYXMgbG9jYWxpemVkIGRhdGUgZm9ybWF0IHN0cmluZ3Mgd2l0aCBpcyBub3cgc3VwcG9ydGVkIGJ5IEVQUGx1cy4KLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkZvcm11bGFQYXJzZXJNYW5hZ2VyLkFkZE9yUmVwbGFjZUZ1bmN0aW9uKCJ0ZXh0IiwgbmV3IFRleHRTd2VkaXNoKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGEgd29ya3NoZWV0IHdpdGggc29tZSBkdW1teSBkYXRhCi0gICAgICAgICAgICAgICAgdmFyIHdzID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgiVGVzdCIpOwotICAgICAgICAgICAgICAgIHdzLkNlbGxzWyJBMSJdLlZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQTIiXS5WYWx1ZSA9IDI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIlAzIl0uRm9ybXVsYSA9ICJTVU0oQTE6QTIpIjsKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjEiXS5WYWx1ZSA9ICJIZWxsbyI7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkMxIl0uVmFsdWUgPSBuZXcgRGF0ZVRpbWUoMjAxMywxMiwzMSk7Ci0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkMyIl0uRm9ybXVsYT0iVGV4dChDMSxcIsOlw6XDpcOlLU1NLWRkXCIpIjsgICAvL1N3ZWRpc2ggZm9ybWF0dGluZwotICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgYWRkZWQgInN1bS5hZGR0d28iIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgd3MuQ2VsbHNbIkE0Il0uRm9ybXVsYSA9ICJTVU0uQUREVFdPKEExOkEyLFAzKSI7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBvdGhlciBmdW5jdGlvbiAic2VhbmNvbm5lcnlmeSIKLSAgICAgICAgICAgICAgICB3cy5DZWxsc1siQjIiXS5Gb3JtdWxhID0gInNlYW5jb25uZXJ5ZnkoQjEpIjsKLQotICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZQotICAgICAgICAgICAgICAgIHdzLkNhbGN1bGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzaG93IHJlc3VsdAotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdW0uYWRkdHdvKEExOkEyLFAzKSBldmFsdWF0ZWQgdG8gezB9Iiwgd3MuQ2VsbHNbIkE0Il0uVmFsdWUpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZWFuY29ubmVyeWZ5KEIxKSBldmFsdWF0ZWQgdG8gezB9Iiwgd3MuQ2VsbHNbIkIyIl0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTXlGdW5jdGlvbk1vZHVsZSA6IElGdW5jdGlvbk1vZHVsZQotICAgIHsKLSAgICAgICAgcHVibGljIE15RnVuY3Rpb25Nb2R1bGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGdW5jdGlvbnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHsic3VtLmFkZHR3byIsIG5ldyBTdW1BZGRUd28oKX0sCi0gICAgICAgICAgICAgICAgICAgIHsic2VhbmNvbm5lcnlmeSIsIG5ldyBTZWFuQ29ubmVyeWZ5KCl9Ci0gICAgICAgICAgICAgICAgfTsgICAgCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPiBGdW5jdGlvbnMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHJlYWxseSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4gQWRkcyB0d28gdG8gYWxsIG51bWJlcnMgaW4gdGhlIHN1cHBsaWVkIHJhbmdlIGFuZCBjYWxjdWxhdGVzIHRoZSBzdW0uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBjbGFzcyBTdW1BZGRUd28gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLCB3aWxsIHNldCBleGNlbCBWQUxVRSBlcnJvciBpZiBtaW4gbGVuZ3RoIGlzIG5vdCBtZXQKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEhlbHBlciBtZXRob2QgdGhhdCBjb252ZXJ0cyBmdW5jdGlvbiBhcmd1bWVudHMgdG8gYW4gZW51bWVyYWJsZSBvZiBkb3VibGVzCi0gICAgICAgICAgICB2YXIgbnVtYmVycyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRG8gdGhlIHdvcmsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSAwZDsKLSAgICAgICAgICAgIG51bWJlcnMuVG9MaXN0KCkuRm9yRWFjaCh4ID0+IHJlc3VsdCArPSAoeCArIDIpKTsKLQotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSByZXN1bHQKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBTd2VkaXNoIGZvcm1hdHRpbmcgc3RyaW5ncy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGNsYXNzIFRleHRTd2VkaXNoIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjaywgd2lsbCBzZXQgZXhjZWwgVkFMVUUgZXJyb3IgaWYgbWluIGxlbmd0aCBpcyBub3QgbWV0Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotCi0gICAgICAgICAgICAvL1JlcGxhY2Ugc3dlZGlzaCB5ZWFyIGZvcm1hdCB3aXRoIGludmFyaWFudCBmb3IgcGFyYW1ldGVyIDIuCi0gICAgICAgICAgICB2YXIgZm9ybWF0ID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZS5Ub1N0cmluZygpLlJlcGxhY2UoIsOlw6XDpcOlIiwgInl5eXkiKTsgICAKLSAgICAgICAgICAgIHZhciBuZXdBcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBhcmd1bWVudHMuRWxlbWVudEF0KDApIH07Ci0gICAgICAgICAgICBuZXdBcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChmb3JtYXQpKTsKLQotICAgICAgICAgICAgLy9Vc2UgdGhlIGJ1aWxkLWluIFRleHQgZnVuY3Rpb24uCi0gICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBUZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gZnVuYy5FeGVjdXRlKG5ld0FyZ3MsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBbiBldmVuIG1vcmUgdW5uZWNlc3NhcnkgZnVuY3Rpb24sIGluc3BpcmVkIGJ5IHRoZSBTZWFuIENvbm5lcnkga2V5Ym9hcmQ7KSBXaWxsIGFkZCAnc2gnIGF0IHRoZSBlbmQgb2YgdGhlIHN1cHBsaWVkIHN0cmluZy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGNsYXNzIFNlYW5Db25uZXJ5ZnkgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLCB3aWxsIHNldCBleGNlbCBWQUxVRSBlcnJvciBpZiBtaW4gbGVuZ3RoIGlzIG5vdCBtZXQKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGFyZwotICAgICAgICAgICAgdmFyIGlucHV0ID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKLQotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSByZXN1bHQKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaW5wdXQgKyAic2giLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZV9Gb3JtdWxhQ2FsYy5jcyBiL1NhbXBsZUFwcC9TYW1wbGVfRm9ybXVsYUNhbGMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYWQzM2MuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1NhbXBsZV9Gb3JtdWxhQ2FsYy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWw7Ci0KLW5hbWVzcGFjZSBFUFBsdXNTYW1wbGVzCi17Ci0gICAgY2xhc3MgU2FtcGxlX0Zvcm11bGFDYWxjCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUnVuU2FtcGxlRm9ybXVsYUNhbGMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdzMSA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIndzMSIpOwotICAgICAgICAgICAgICAgIC8vIEFkZCBzb21lIHZhbHVlcyB0byBzdW0KLSAgICAgICAgICAgICAgICB3czEuQ2VsbHNbIkExIl0uRm9ybXVsYSA9ICIoMioyKS8yIjsKLSAgICAgICAgICAgICAgICB3czEuQ2VsbHNbIkEyIl0uVmFsdWUgPSA0OwotICAgICAgICAgICAgICAgIHdzMS5DZWxsc1siQTMiXS5WYWx1ZSA9IDY7Ci0gICAgICAgICAgICAgICAgd3MxLkNlbGxzWyJBNCJdLkZvcm11bGEgPSAiU1VNKEExOkEzKSI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGFsbCBmb3JtdWxhcyBvbiAgdGhlIHdvcmtzaGVldAotICAgICAgICAgICAgICAgIHdzMS5DYWxjdWxhdGUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFByaW50IHRoZSBjYWxjdWxhdGVkIHZhbHVlCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNVTShBMTpBMykgZXZhbHVhdGVkIHRvIHswfSIsIHdzMS5DZWxsc1siQTQiXS5WYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgYW5vdGhlciB3b3Jrc2hlZXQKLSAgICAgICAgICAgICAgICB2YXIgd3MyID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFkZCgid3MyIik7Ci0gICAgICAgICAgICAgICAgd3MyLkNlbGxzWyJBMSJdLlZhbHVlID0gMzsKLSAgICAgICAgICAgICAgICB3czIuQ2VsbHNbIkEyIl0uRm9ybXVsYSA9ICJTVU0oQTEsd3MxIUE0KSI7Ci0KLSAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgYWxsIGZvcm11bGFzIGluIHRoZSBlbnRpcmUgd29ya2Jvb2sKLSAgICAgICAgICAgICAgICBwYWNrYWdlLldvcmtib29rLkNhbGN1bGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU1VNKEExLHdzMSFBNCkgZXZhbHVhdGVkIHRvIHswfSIsIHdzMi5DZWxsc1siQTIiXS5WYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYSByYW5nZQotICAgICAgICAgICAgICAgIHdzMS5DZWxsc1siQjEiXS5Gb3JtdWxhID0gIklGKFRPREFZKCk8REFURSgyMDE0LDYsMSksXCJCRUZPUkVcIiAmXCIgRklSU1RcIixDT05DQVRFTkFURShcIkZJUlNUXCIsXCIgT0ZcIixcIiBKVU5FIDIwMTQgT1IgTEFURVJcIikpIjsKLSAgICAgICAgICAgICAgICB3czEuQ2VsbHNbIkIxIl0uQ2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSUYoVE9EQVkoKTxEQVRFKDIwMTQsNiwxKSxcIkJFRk9SRVwiICZcIiBGSVJTVFwiLENPTkNBVEVOQVRFKFwiRklSU1RcIixcIiBPRlwiLFwiIEpVTkUgMjAxNCBPUiBMQVRFUlwiKSkgZXZhbHVhdGVkIHRvIHswfSIsIHdzMS5DZWxsc1siQjEiXS5WYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBFdmFsdWF0ZSBhIGZvcm11bGEgc3RyaW5nICh3aXRob3V0IGNhbGN1bGF0ZSBkZXBlbmRpbmcgY2VsbHMpLgotICAgICAgICAgICAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCBpZiBBMSBjb250YWlucyBhIGZvcm11bGEgdGhhdCBoYXNuJ3QgYmVlbiBjYWxjdWxhdGVkIGl0IHRha2UgdGhlIHZhbHVlIGZyb20gYTEsIGJsYW5rIG9yIHplcm8gaWYgaXQncyBhIG5ldyBmb3JtdWxhLgotICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBBMSBoYXMgYmVlbiBjYWxjdWxhdGVkICgyKSwgc28gZXZlcnl0aGluZyBzaG91bGQgYmUgb2shCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIGZvcm11bGEgPSAiKDIrNCkqd3MxIUExIjsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFja2FnZS5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyTWFuYWdlci5QYXJzZShmb3JtdWxhKTsKLQotICAgICAgICAgICAgICAgIC8vIFByaW50IHRoZSBjYWxjdWxhdGVkIHZhbHVlCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIigyKzQpKndzMSFBMiBldmFsdWF0ZWQgdG8gezB9IiwgcmVzdWx0KTsKLQotICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIGEgZm9ybXVsYSBzdHJpbmcgKENhbGN1bGF0ZSBkZXBlbmRpbmcgY2VsbHMpCi0gICAgICAgICAgICAgICAgLy8gQTEgd2lsbCBiZSByZWNhbGN1bGF0ZWQuCi0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdDIgPSB3czEuQ2FsY3VsYXRlKCIoMis0KSpBMSIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL1NhbXBsZV9NYWluLmNzIGIvU2FtcGxlQXBwL1NhbXBsZV9NYWluLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzNlYmY4Li4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9TYW1wbGVfTWFpbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogRVBQbHVzIGlzIGFuIE9wZW4gU291cmNlIHByb2plY3QgcHJvdmlkZWQgdW5kZXIgdGhlIAotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgYXMgcHVibGlzaGVkIGJ5IHRoZSAKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNyBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqCi0gKiAKLSAqIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKiAKLSAqIFRoZSBjb2RlIGZvciB0aGlzIHByb2plY3QgbWF5IGJlIHVzZWQgYW5kIHJlZGlzdHJpYnV0ZWQgYnkgYW55IG1lYW5zIFBST1ZJRElORyBpdCBpcyAKLSAqIG5vdCBzb2xkIGZvciBwcm9maXQgd2l0aG91dCB0aGUgYXV0aG9yJ3Mgd3JpdHRlbiBjb25zZW50LCBhbmQgcHJvdmlkaW5nIHRoYXQgdGhpcyBub3RpY2UgCi0gKiBhbmQgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFsbCBjb3B5cmlnaHQgbm90aWNlcyByZW1haW4gaW50YWN0LgotICogCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBL5GxsbWFuCQlBZGRlZAkJMTAtU0VQLTIwMDkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKLQotbmFtZXNwYWNlIEVQUGx1c1NhbXBsZXMKLXsKLQljbGFzcyBTYW1wbGVfTWFpbgotCXsKLQkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQl0cnkKLQkJCXsKLSAgICAgICAgICAgICAgICAvL1NhbXBsZSAzLCA0IGFuZCAxMiB1c2VzIHRoZSBBZHZlbnR1cmV3b3JrcyBkYXRhYmFzZS4gRW50ZXIgdGhlbiBuYW1lIG9mIHlvdXIgU1FMIHNlcnZlciBpbnRvIHRoZSB2YXJpYWJsZSBiZWxvdy4uLgotICAgICAgICAgICAgICAgIC8vTGVhdmUgdGhpcyBibGFuayBpZiB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIEFkdmVudHVyZXdvcmtzIGRhdGFiYXNlIAotICAgICAgICAgICAgICAgIHN0cmluZyBTcWxTZXJ2ZXJOYW1lID0gIiI7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhpcyBsaW5lIHRvIGNvbnRhaW4gdGhlIHBhdGggdG8gdGhlIG91dHB1dCBmb2xkZXIKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlJbmZvIG91dHB1dERpciA9IG5ldyBEaXJlY3RvcnlJbmZvKEAiYzpcdGVtcFxTYW1wbGVBcHAiKTsKLSAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERpci5FeGlzdHMpIHRocm93IG5ldyBFeGNlcHRpb24oIm91dHB1dERpciBkb2VzIG5vdCBleGlzdCEiKTsKLQotICAgICAgICAgICAgICAgIC8vIFNhbXBsZSAxIC0gc2ltcGx5IGNyZWF0ZXMgYSBuZXcgd29ya2Jvb2sgZnJvbSBzY3JhdGNoCi0gICAgICAgICAgICAgICAgLy8gY29udGFpbmluZyBhIHdvcmtzaGVldCB0aGF0IGFkZHMgYSBmZXcgbnVtYmVycyB0b2dldGhlciAKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMSIpOwotICAgICAgICAgICAgICAgIHN0cmluZyBvdXRwdXQgPSBTYW1wbGUxLlJ1blNhbXBsZTEob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDEgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gU2FtcGxlIDIgLSBzaW1wbHkgcmVhZHMgc29tZSB2YWx1ZXMgZnJvbSB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgc2FtcGxlIDEKLSAgICAgICAgICAgICAgICAvLyBhbmQgb3V0cHV0cyB0aGVtIHRvIHRoZSBjb25zb2xlCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDIiKTsKLSAgICAgICAgICAgICAgICBTYW1wbGUyLlJ1blNhbXBsZTIob3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotICAgICAgICAgICAgICAgIG91dHB1dCA9ICIiOwotCi0gICAgICAgICAgICAgICAgaWYgKFNxbFNlcnZlck5hbWUgIT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29ubmVjdGlvblN0ciA9IHN0cmluZy5Gb3JtYXQoQCJzZXJ2ZXI9ezB9O2RhdGFiYXNlPUFkdmVudHVyZVdvcmtzO0ludGVncmF0ZWQgU2VjdXJpdHk9dHJ1ZTsiLCBTcWxTZXJ2ZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlIDMgLSBjcmVhdGVzIGEgd29ya2Jvb2sgZnJvbSBzY3JhdGNoIAotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIHNhbXBsZSBhcyB0aGUgb3JpZ2luYWwgRXhjZWxwYWNrYWdlLCBzYW1wbGUgNCwgYnV0IHdpdGhvdXQgdGhlIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2FtcGxlIHJlcXVpcmVzIHRoZSBBZHZlbnR1cmVXb3JrcyBkYXRhYmFzZS4gIAotICAgICAgICAgICAgICAgICAgICAvL1Nob3dzIGhvdyB0byB1c2UgUmFuZ2VzLCBTdHlsaW5nLCBOYW1lZHN0eWxlcyBhbmQgSHlwZXJsaW5rcwotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMyIpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGUzLlJ1blNhbXBsZTMob3V0cHV0RGlyLCBjb25uZWN0aW9uU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAzIGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlIDQgLSBjcmVhdGVzIGEgd29ya2Jvb2sgYmFzZWQgb24gYSB0ZW1wbGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGVzIGEgcmFuZ2Ugd2l0aCBkYXRhIGFuZCBzZXQgdGhlIHNlcmllcyBvZiBhIGxpbmVjaGFydC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzYW1wbGUgcmVxdWlyZXMgdGhlIEFkdmVudHVyZVdvcmtzIGRhdGFiYXNlLiAgCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA0Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTQuUnVuU2FtcGxlNChjb25uZWN0aW9uU3RyLCBuZXcgRmlsZUluZm8oIi4uXFwuLlxcR3JhcGhUZW1wbGF0ZS54bHN4IiksIG91dHB1dERpcik7ICAgICAgLy9UZW1wbGF0ZSBwYXRoIGZyb20gL2Jpbi9kZWJ1ZyBvciAvYmluL3JlbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA0IGNyZWF0ZWQ6IHswfSIsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgNQotICAgICAgICAgICAgICAgIC8vT3BlbiBzYW1wbGUgMSBhbmQgYWRkIGEgcGllIGNoYXJ0LgotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA1Iik7Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlNS5SdW5TYW1wbGU1KG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA1IGNyZWF0ZWQ6Iiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgNgotICAgICAgICAgICAgICAgIC8vQ3JlYXRlcyBhbiBhZHZhbmNlZCByZXBvcnQgb24gYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGVzeXN0ZW0uCi0gICAgICAgICAgICAgICAgLy9QYXJhbWV0ZXIgMiBpcyB0aGUgZGlyZWN0b3J5IHRvIHJlcG9ydC4gUGFyYW10ZXIgMyBpcyBob3cgZGVlcCB0aGUgc2NhbiB3aWxsIGdvLiBQYXJhbWV0ZXIgNCBTa2lwcyBJY29ucyBpZiBzZXQgdG8gdHJ1ZSAoVGhlIGljb24gaGFuZGxpbmcgaXMgc2xvdykKLSAgICAgICAgICAgICAgICAvL1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBvdXRsaW5lcywgdGFibGVzLGNvbW1lbnRzLCBzaGFwZXMsIHBpY3R1cmVzIGFuZCBjaGFydHMuICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSA2Iik7Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlNi5SdW5TYW1wbGU2KG91dHB1dERpciwgbmV3IERpcmVjdG9yeUluZm8oIi4uXFwuLiIpLCA1LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSA2IGNyZWF0ZWQ6Iiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgNwotICAgICAgICAgICAgICAgIC8vVGhpcyBzYW1wbGUgc2hvd3MgdGhlIHBlcmZvcm1hbmNlIGNhcGFiaWxpdGllcyBvZiB0aGUgY29tcG9uZW50IGFuZCBzaG93cyBzaGVldCBwcm90ZWN0aW9uLgotICAgICAgICAgICAgICAgIC8vTG9hZCBYKHBhcmFtIDIpIHJvd3Mgd2l0aCBmaXZlIGNvbHVtbnMKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgNyIpOwotICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTcuUnVuU2FtcGxlNyhvdXRwdXREaXIsIDY1NTM0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDcgY3JlYXRlZDoiLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICAvL1NhbXBsZSA4IC0gTGlucQotICAgICAgICAgICAgICAgIC8vT3BlbnMgU2FtcGxlIDcgYW5kIHBlcmZvcm0gc29tZSBMaW5xIHF1ZXJpZXMKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgOC1MaW5xIik7Ci0gICAgICAgICAgICAgICAgTGlucVNhbXBsZS5SdW5MaW5xU2FtcGxlKG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQotICAgICAgICAgICAgICAgIC8vU2FtcGxlIDkgTG9hZHMgdHdvIGNzdiBmaWxlcyBpbnRvIHRhYmxlcyBhbmQgY3JlYXRlcyBhbiBhcmVhIGNoYXJ0IGFuZCBhIENvbHVtbi9MaW5lIGNoYXJ0IG9uIHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIC8vVGhpcyBzYW1wbGUgYWxzbyBzaG93cyBob3cgdG8gdXNlIGEgc2Vjb25kYXJ5IGF4aXMuCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDkiKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBTYW1wbGU5LlJ1blNhbXBsZTkob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDkgY3JlYXRlZDogezB9Iiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgMTAgU3dlZGlzaCBRdWl6IDogU2hvd3MgRW5jcnlwdGlvbiBhbmQgd29ya2Jvb2sgYW5kIHNoZWV0IHByb3RlY3Rpb24uCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDEwIik7Ci0gICAgICAgICAgICAgICAgU2FtcGxlMTAuUnVuU2FtcGxlMTAob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDEwIGNyZWF0ZWQ6IHswfSIsIG91dHB1dERpci5GdWxsTmFtZSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQotICAgICAgICAgICAgICAgIC8vU2FtcGxlIDExIC0gRGF0YSB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDExIik7Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gU2FtcGxlMTEuUnVuU2FtcGxlMTEob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDExIGNyZWF0ZWQgezB9Iiwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgMTIgLSBQaXZvdHRhYmxlcwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMiIpOwotICAgICAgICAgICAgICAgIG91dHB1dCA9IFNhbXBsZTEyLlJ1blNhbXBsZTEyKFNxbFNlcnZlck5hbWUsIG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMiBjcmVhdGVkIHswfSIsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQotICAgICAgICAgICAgICAgIC8vU2FtcGxlIDEzIC0gU2hvd3MgYSBmZXcgd2F5cyB0byBsb2FkIGRhdGEgKERhdGF0YWJsZSwgSUVudW1lcmFibGUgYW5kIG1vcmUpLgotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJSdW5uaW5nIHNhbXBsZSAxMyIpOwotICAgICAgICAgICAgICAgIFNhbXBsZTEzLlJ1blNhbXBsZTEzKG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxMyBjcmVhdGVkIHswfSIsIG91dHB1dERpci5OYW1lKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgMTQgLSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlJ1bm5pbmcgc2FtcGxlIDE0Iik7Ci0gICAgICAgICAgICAgICAgU2FtcGxlMTQuUnVuU2FtcGxlMTQob3V0cHV0RGlyKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2FtcGxlIDE0IGNyZWF0ZWQgezB9Iiwgb3V0cHV0RGlyLk5hbWUpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICAvL1NhbXBsZSAxNSAtIFNob3dzIGhvdyB0byB3b3JrIHdpdGggbWFjcm8tZW5hYmxlZCB3b3JrYm9va3MoVkJBKS4KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBzYW1wbGUgMTUtVkJBIik7Ci0gICAgICAgICAgICAgICAgU2FtcGxlMTUuVkJBU2FtcGxlKG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlNhbXBsZSAxNSBjcmVhdGVkIHswfSIsIG91dHB1dERpci5OYW1lKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgRm9ybXVsYUNhbGMgLSBTaG93cyBob3cgdG8gY2FsY3VsYXRlIGZvcm11bGFzIGluIHRoZSB3b3JrYm9vay4KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBTYW1wbGVfRm9ybXVsYUNhbGMiKTsKLSAgICAgICAgICAgICAgICBTYW1wbGVfRm9ybXVsYUNhbGMuUnVuU2FtcGxlRm9ybXVsYUNhbGMoKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotCi0gICAgICAgICAgICAgICAgLy9TYW1wbGUgQWRkRm9ybXVsYUZ1bmN0aW9uIC0gU2hvd3MgaG93IHRvIGFkZCB5b3VyIG93biBpbXBsZW1lbnRhdGlvbnMgb2YgZXhjZWwgZnVuY3Rpb25zIHRvIEVQUGx1cy4KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUnVubmluZyBTYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uIik7Ci0gICAgICAgICAgICAgICAgU2FtcGxlX0FkZEZvcm11bGFGdW5jdGlvbi5SdW5TYW1wbGVfQWRkRm9ybXVsYUZ1bmN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLSAgICAgICAgICAgIH0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yOiB7MH0iLCBleC5NZXNzYWdlKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiUHJlc3MgdGhlIHJldHVybiBrZXkgdG8gZXhpdC4uLiIpOwotCQkJQ29uc29sZS5SZWFkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvVkJBLUNvZGUvQmF0dGxlc2hpcFNoZWV0LnR4dCBiL1NhbXBsZUFwcC9WQkEtQ29kZS9CYXR0bGVzaGlwU2hlZXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzFhY2E1Li4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9WQkEtQ29kZS9CYXR0bGVzaGlwU2hlZXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAot77u/UHJpdmF0ZSBTdWIgV29ya3NoZWV0X0JlZm9yZURvdWJsZUNsaWNrKEJ5VmFsIFRhcmdldCBBcyBSYW5nZSwgQ2FuY2VsIEFzIEJvb2xlYW4pCi0gICBEaW0gc2hlZXQgQXMgV29ya3NoZWV0Ci0gICBJZiBnX2dhbWVFbmRlZCA9IFRydWUgVGhlbgotICAgIEV4aXQgU3ViCi0gICBFbmQgSWYKLSAgIAotICAgU2V0IHNoZWV0ID0gVGhpc1dvcmtib29rLkFjdGl2ZVNoZWV0Ci0gICBJZiBnX1NoaXBzIElzIE5vdGhpbmcgVGhlbiBDb2RlLkFkZFNoaXBzIEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQxKQotICAgSWYgQ29sbGlkZShUYXJnZXQsIEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQxKSkgVGhlbgotICAgIElmIFRhcmdldC5Cb3JkZXJzKHhsRGlhZ29uYWxVcCkuV2VpZ2h0IDw+IHhsTWVkaXVtIFRoZW4KLSAgICAgICAgIFNldEhpdCBUYXJnZXQKLSAgICAgICAgIERpbSBTaGlwCi0gICAgICAgICBEaW0gaXNIaXQgQXMgQm9vbGVhbgotICAgICAgICAgaXNIaXQgPSBGYWxzZQotICAgICAgICAgRm9yIEVhY2ggU2hpcCBJbiBnX1NoaXBzCi0gICAgICAgICAgICBJZiBTaGlwLmlzSGl0KFRhcmdldC5DZWxscygxLCAxKSwgVHJ1ZSkgVGhlbgotICAgICAgICAgICAgICAgIElmIENoZWNrV2lubmVyKGdfU2hpcHMpIFRoZW4KLSAgICAgICAgICAgICAgICAgICAgTXNnQm94ICJZb3Ugd2luISIsIHZiT0tPbmx5ICsgdmJFeGNsYW1hdGlvbiwgIkJhdHRsZXNoaXBzIgotICAgICAgICAgICAgICAgICAgICBnX2dhbWVFbmRlZCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgQ2FuY2VsID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBFeGl0IFN1YgotICAgICAgICAgICAgICAgIEVuZCBJZgotICAgICAgICAgICAgICAgIGlzSGl0ID0gVHJ1ZQotICAgICAgICAgICAgICAgIEV4aXQgRm9yCi0gICAgICAgICAgICBFbmQgSWYKLSAgICAgICAgIE5leHQKLSAgICAgICAgIElmIGlzSGl0ID0gRmFsc2UgVGhlbgotICAgICAgICAgICAgVW5wcm90ZWN0Ci0gICAgICAgICAgICBCYXR0bGVzaGlwLkNlbGxzKGdfbG9nUm93LCAyKS52YWx1ZSA9ICJZb3UgZ2V0IGEgbWlzcyBvbiAiICYgVGFyZ2V0LkFkZHJlc3MKLSAgICAgICAgICAgIEJhdHRsZXNoaXAuTmFtZXMoIlBsYXllck1pc3NlcyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgPSBCYXR0bGVzaGlwLk5hbWVzKCJQbGF5ZXJNaXNzZXMiKS5SZWZlcnNUb1JhbmdlLnZhbHVlICsgMQotCQkJZ19sb2dSb3cgPSBnX2xvZ1JvdyArIDEKLSAgICAgICAgICAgIFByb3RlY3QgIiIKLSAgICAgICAgIEVuZCBJZgotICAgICAgICAgQ29tcHV0ZXJQbGF5Lk1vdmUKLSAgICAgICAgIAotICAgIEVuZCBJZgotICAgRW5kIElmCi0gICBDYW5jZWwgPSBUcnVlCi1FbmQgU3ViCi1Qcml2YXRlIFN1YiBXb3Jrc2hlZXRfU2VsZWN0aW9uQ2hhbmdlKEJ5VmFsIFRhcmdldCBBcyBSYW5nZSkKLSAgICBUYXJnZXQuQ2VsbHMoMSwgMSkuU2VsZWN0Ci1FbmQgU3ViCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvVkJBLUNvZGUvQ29kZU1vZHVsZS50eHQgYi9TYW1wbGVBcHAvVkJBLUNvZGUvQ29kZU1vZHVsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NGRlNTguLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1ZCQS1Db2RlL0NvZGVNb2R1bGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLe+7v1B1YmxpYyBDb25zdCBib2FyZDEgPSAiezV9IgotUHVibGljIENvbnN0IGJvYXJkMiA9ICJ7Nn0iCi0KLVB1YmxpYyBDb25zdCB1c2VyU2hpcDEgPSAiezB9IgotUHVibGljIENvbnN0IHVzZXJTaGlwMiA9ICJ7MX0iCi1QdWJsaWMgQ29uc3QgdXNlclNoaXAzID0gInsyfSIKLVB1YmxpYyBDb25zdCB1c2VyU2hpcDQgPSAiezN9IgotUHVibGljIENvbnN0IHVzZXJTaGlwNSA9ICJ7NH0iCi0KLUdsb2JhbCBnX2xvZ1JvdyBBcyBJbnRlZ2VyCi1HbG9iYWwgZ19nYW1lRW5kZWQgQXMgQm9vbGVhbgotR2xvYmFsIGdfU2hpcHMgQXMgQ29sbGVjdGlvbgotR2xvYmFsIGdfdXNlclNoaXBzIEFzIENvbGxlY3Rpb24KLVB1YmxpYyBGdW5jdGlvbiBDb2xsaWRlKHIxIEFzIFJhbmdlLCByMiBBcyBSYW5nZSkgQXMgQm9vbGVhbgotSWYgcjEucm93ICsgcjEuUm93cy5Db3VudCA+IHIyLnJvdyBBbmQgcjEucm93IDwgcjIucm93ICsgcjIuUm93cy5Db3VudCBBbmQgXwotICAgICAgcjEuY29sdW1uICsgcjEuQ29sdW1ucy5Db3VudCA+IHIyLmNvbHVtbiBBbmQgcjEuY29sdW1uIDwgcjIuY29sdW1uICsgcjIuQ29sdW1ucy5Db3VudCBUaGVuCi0gICAgICBDb2xsaWRlID0gVHJ1ZQotRWxzZQotICAgIENvbGxpZGUgPSBGYWxzZQotRW5kIElmCi1FbmQgRnVuY3Rpb24KLVB1YmxpYyBTdWIgQWRkU2hpcHMoYm9hcmQgQXMgUmFuZ2UpCi0gICAgU2V0IGdfU2hpcHMgPSBOZXcgQ29sbGVjdGlvbgotICAgIAotICAgIERpbSBzMSBBcyBOZXcgU2hpcAotICAgIAotICAgIHMxLlNpemUgPSA1Ci0gICAgU2V0IHMxLlBvc2l0aW9uID0gR2V0U2hpcFBvcyhib2FyZCwgczEuU2l6ZSkKLSAgICBnX1NoaXBzLkFkZCBzMSwgImNhcnJpZXIiCi0gICAgCi0gICAgRGltIHMyIEFzIE5ldyBTaGlwCi0gICAgczIuU2l6ZSA9IDQKLSAgICBTZXQgczIuUG9zaXRpb24gPSBHZXRTaGlwUG9zKGJvYXJkLCBzMi5TaXplKQotICAgIGdfU2hpcHMuQWRkIHMyLCAiYmF0dGxlc2hpcCIKLQotICAgIERpbSBzMyBBcyBOZXcgU2hpcAotICAgIHMzLlNpemUgPSAzCi0gICAgU2V0IHMzLlBvc2l0aW9uID0gR2V0U2hpcFBvcyhib2FyZCwgczMuU2l6ZSkKLSAgICBnX1NoaXBzLkFkZCBzMywgInN1YiIKLQotICAgIERpbSBzNCBBcyBOZXcgU2hpcAotICAgIHM0LlNpemUgPSAzCi0gICAgU2V0IHM0LlBvc2l0aW9uID0gR2V0U2hpcFBvcyhib2FyZCwgczQuU2l6ZSkKLSAgICBnX1NoaXBzLkFkZCBzNCwgImNydWlzZXIiCi0KLSAgICBEaW0gczUgQXMgTmV3IFNoaXAKLSAgICBzNS5TaXplID0gMgotICAgIFNldCBzNS5Qb3NpdGlvbiA9IEdldFNoaXBQb3MoYm9hcmQsIHM1LlNpemUpCi0gICAgZ19TaGlwcy5BZGQgczUsICJkZXN0cm95ZXIiCi1FbmQgU3ViCi1QdWJsaWMgU3ViIEFkZFVzZXJTaGlwcyhib2FyZCBBcyBSYW5nZSkKLSAgICBTZXQgZ191c2VyU2hpcHMgPSBOZXcgQ29sbGVjdGlvbgotICAgIAotICAgIERpbSBzMSBBcyBOZXcgU2hpcAotICAgIAotICAgIHMxLlNpemUgPSA1Ci0gICAgU2V0IHMxLlBvc2l0aW9uID0gQmF0dGxlc2hpcC5SYW5nZSh1c2VyU2hpcDEpCi0gICAgZ191c2VyU2hpcHMuQWRkIHMxLCAiY2FycmllciIKLSAgICAKLSAgICBEaW0gczIgQXMgTmV3IFNoaXAKLSAgICBzMi5TaXplID0gNAotICAgIFNldCBzMi5Qb3NpdGlvbiA9IEJhdHRsZXNoaXAuUmFuZ2UodXNlclNoaXAyKQotICAgIGdfdXNlclNoaXBzLkFkZCBzMiwgImJhdHRsZXNoaXAiCi0KLSAgICBEaW0gczMgQXMgTmV3IFNoaXAKLSAgICBzMy5TaXplID0gMwotICAgIFNldCBzMy5Qb3NpdGlvbiA9IEJhdHRsZXNoaXAuUmFuZ2UodXNlclNoaXAzKQotICAgIGdfdXNlclNoaXBzLkFkZCBzMywgInN1YiIKLQotICAgIERpbSBzNCBBcyBOZXcgU2hpcAotICAgIHM0LlNpemUgPSAzCi0gICAgU2V0IHM0LlBvc2l0aW9uID0gQmF0dGxlc2hpcC5SYW5nZSh1c2VyU2hpcDQpCi0gICAgZ191c2VyU2hpcHMuQWRkIHM0LCAiY3J1aXNlciIKLQotICAgIERpbSBzNSBBcyBOZXcgU2hpcAotICAgIHM1LlNpemUgPSAyCi0gICAgU2V0IHM1LlBvc2l0aW9uID0gQmF0dGxlc2hpcC5SYW5nZSh1c2VyU2hpcDUpCi0gICAgZ191c2VyU2hpcHMuQWRkIHM1LCAiZGVzdHJveWVyIgotRW5kIFN1YgotUHVibGljIEZ1bmN0aW9uIEdldFNoaXBQb3MoYm9hcmQgQXMgUmFuZ2UsIEJ5VmFsIFNpemUgQXMgSW50ZWdlcikgQXMgUmFuZ2UKLSAgICBEaW0gcm93IEFzIEludGVnZXIsIGNvbHVtbiBBcyBJbnRlZ2VyCi0gICAgRGltIEhvcml6b250YWwgQXMgSW50ZWdlcgotICAgIAotICAgIERvCi0gICAgICAgIFJhbmRvbWl6ZQotICAgICAgICByb3cgPSAoUm5kICogKGJvYXJkLlJvd3MuQ291bnQgLSAxKSkgKyAxCi0gICAgICAgIGNvbHVtbiA9IChSbmQgKiAoYm9hcmQuUm93cy5Db3VudCAtIDEpKSArIDEKLSAgICAgICAgSG9yaXpvbnRhbCA9IFJuZAotICAgIAotICAgICAgICBJZiBIb3Jpem9udGFsID0gMSBUaGVuCi0gICAgICAgICAgICBJZiBjb2x1bW4gLSBTaXplID4gMCBBbmQgY29sdW1uICsgU2l6ZSA8IDEwIFRoZW4KLSAgICAgICAgICAgICAgICBJZiBSbmQgPSAwIFRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCBHZXRTaGlwUG9zID0gYm9hcmQuUmFuZ2UoQ2VsbHMocm93LCBjb2x1bW4pLCBDZWxscyhyb3csIGNvbHVtbiArIFNpemUgLSAxKSkKLSAgICAgICAgICAgICAgICBFbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdywgY29sdW1uIC0gU2l6ZSArIDEpLCBDZWxscyhyb3csIGNvbHVtbikpCi0gICAgICAgICAgICAgICAgRW5kIElmCi0gICAgICAgICAgICBFbHNlSWYgY29sdW1uIC0gU2l6ZSA+IDAgVGhlbgotICAgICAgICAgICAgICAgIFNldCBHZXRTaGlwUG9zID0gYm9hcmQuUmFuZ2UoQ2VsbHMocm93LCBjb2x1bW4gLSBTaXplICsgMSksIENlbGxzKHJvdywgY29sdW1uKSkKLSAgICAgICAgICAgIEVsc2UKLSAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdywgY29sdW1uKSwgQ2VsbHMocm93LCBjb2x1bW4gKyBTaXplIC0gMSkpCi0gICAgICAgICAgICBFbmQgSWYKLSAgICAgICAgRWxzZQotICAgICAgICAgICAgSWYgcm93IC0gU2l6ZSA+IDAgQW5kIHJvdyArIFNpemUgPCAxMCBUaGVuCi0gICAgICAgICAgICAgICAgSWYgUm5kID0gMCBUaGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdywgY29sdW1uKSwgQ2VsbHMocm93ICsgU2l6ZSAtIDEsIGNvbHVtbikpCi0gICAgICAgICAgICAgICAgRWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3cgLSBTaXplICsgMSwgY29sdW1uKSwgQ2VsbHMocm93LCBjb2x1bW4pKQotICAgICAgICAgICAgICAgIEVuZCBJZgotICAgICAgICAgICAgRWxzZUlmIHJvdyAtIFNpemUgPiAwIFRoZW4KLSAgICAgICAgICAgICAgICBTZXQgR2V0U2hpcFBvcyA9IGJvYXJkLlJhbmdlKENlbGxzKHJvdyAtIFNpemUgKyAxLCBjb2x1bW4pLCBDZWxscyhyb3csIGNvbHVtbikpCi0gICAgICAgICAgICBFbHNlCi0gICAgICAgICAgICAgICAgU2V0IEdldFNoaXBQb3MgPSBib2FyZC5SYW5nZShDZWxscyhyb3csIGNvbHVtbiksIENlbGxzKHJvdyArIFNpemUgLSAxLCBjb2x1bW4pKQotICAgICAgICAgICAgRW5kIElmCi0gICAgICAgIEVuZCBJZgotICAgIExvb3AgVW50aWwgVmFsaWRTcG90KEdldFNoaXBQb3MpCi1FbmQgRnVuY3Rpb24KLSdNYWtlIHN1cmUgdGhlIHNwb3QgaXNuJ3Qgb2NjdXBpZWQKLVByaXZhdGUgRnVuY3Rpb24gVmFsaWRTcG90KHIgQXMgUmFuZ2UpIEFzIEJvb2xlYW4KLSAgICBEaW0gb1NoaXAgQXMgU2hpcAotICAgIEZvciBFYWNoIG9TaGlwIEluIGdfU2hpcHMKLSAgICAgICAgSWYgQ29kZS5Db2xsaWRlKHIsIG9TaGlwLlBvc2l0aW9uKSBUaGVuCi0gICAgICAgICAgICBWYWxpZFNwb3QgPSBGYWxzZQotICAgICAgICAgICAgRXhpdCBGdW5jdGlvbgotICAgICAgICBFbmQgSWYKLSAgICBOZXh0Ci0gICAgVmFsaWRTcG90ID0gVHJ1ZQotRW5kIEZ1bmN0aW9uCi0KLVB1YmxpYyBTdWIgU2V0SGl0KFRhcmdldCBBcyBSYW5nZSkKLSAgICBUYXJnZXQuV29ya3NoZWV0LlVucHJvdGVjdAotICAgIFdpdGggVGFyZ2V0LkJvcmRlcnMoeGxEaWFnb25hbERvd24pCi0gICAgIC5MaW5lU3R5bGUgPSB4bENvbnRpbnVvdXMKLSAgICAgLkNvbG9yID0gQ29sb3JDb25zdGFudHMudmJCbGFjawotICAgICAuVGludEFuZFNoYWRlID0gMAotICAgICAuV2VpZ2h0ID0geGxNZWRpdW0KLSAgICBFbmQgV2l0aAotICAgIFdpdGggVGFyZ2V0LkJvcmRlcnMoeGxEaWFnb25hbFVwKQotICAgICAuTGluZVN0eWxlID0geGxDb250aW51b3VzCi0gICAgIC5Db2xvciA9IENvbG9yQ29uc3RhbnRzLnZiQmxhY2sKLSAgICAgLlRpbnRBbmRTaGFkZSA9IDAKLSAgICAgLldlaWdodCA9IHhsTWVkaXVtCi0gICAgRW5kIFdpdGgKLSAgICBUYXJnZXQuV29ya3NoZWV0LlByb3RlY3QgIiIKLUVuZCBTdWIKLVB1YmxpYyBGdW5jdGlvbiBDaGVja1dpbm5lcihzaGlwcyBBcyBDb2xsZWN0aW9uKSBBcyBCb29sZWFuCi0gICAgRGltIG9TaGlwIEFzIFNoaXAKLSAgICBGb3IgRWFjaCBvU2hpcCBJbiBzaGlwcwotICAgICAgICBJZiBvU2hpcC5IaXRzLkNvdW50IDwgb1NoaXAuUG9zaXRpb24uQ2VsbHMuQ291bnQgVGhlbgotICAgICAgICAgICAgQ2hlY2tXaW5uZXIgPSBGYWxzZQotICAgICAgICAgICAgRXhpdCBGdW5jdGlvbgotICAgICAgICBFbmQgSWYKLSAgICBOZXh0Ci0gICAgQ2hlY2tXaW5uZXIgPSBUcnVlCi1FbmQgRnVuY3Rpb24KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9WQkEtQ29kZS9Db21wdXRlclBsYXlNb2R1bGUudHh0IGIvU2FtcGxlQXBwL1ZCQS1Db2RlL0NvbXB1dGVyUGxheU1vZHVsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWZlMDUuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1ZCQS1Db2RlL0NvbXB1dGVyUGxheU1vZHVsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAot77u/RGltIHBvc3NpYmxlQ2VsbHMgQXMgQ29sbGVjdGlvbgotRGltIEhpdHMgQXMgUmFuZ2UKLVB1YmxpYyBTdWIgSW5pdCgpCi0gICAgRGltIGIgQXMgUmFuZ2UKLSAgICBEaW0gY29sIEFzIEludGVnZXIsIHJvdyBBcyBJbnRlZ2VyCi0gICAgICAgIAotICAgIFNldCBwb3NzaWJsZUNlbGxzID0gTmV3IENvbGxlY3Rpb24KLSAgICBTZXQgYiA9IEJhdHRsZXNoaXAuUmFuZ2UoYm9hcmQyKQotICAgIEZvciBjb2wgPSAxIFRvIGIuQ29sdW1ucy5Db3VudAotICAgICAgICBGb3Igcm93ID0gMSBUbyBiLlJvd3MuQ291bnQKLSAgICAgICAgICAgIHBvc3NpYmxlQ2VsbHMuQWRkIChiLkNlbGxzKHJvdywgY29sKS5BZGRyZXNzKQotICAgICAgICBOZXh0Ci0gICAgTmV4dAotRW5kIFN1YgotUHVibGljIFN1YiBNb3ZlKCkKLSAgICBEaW0gaW5kZXggQXMgSW50ZWdlcgotICAgIGluZGV4ID0gLTEKLSAgICBEaW0gb1NoaXAgQXMgU2hpcAotICAgIERpbSBpc0hpdCBBcyBCb29sZWFuCi0gICAgRm9yIEVhY2ggb1NoaXAgSW4gZ191c2VyU2hpcHMKLSAgICAgICAgSWYgb1NoaXAuSGl0cy5Db3VudCA+IDAgQW5kIG9TaGlwLkhpdHMuQ291bnQgPCBvU2hpcC5Qb3NpdGlvbi5DZWxscy5Db3VudCBUaGVuCi0gICAgICAgICAgICBpbmRleCA9IEdldEhpdChvU2hpcCkKLSAgICAgICAgICAgIEV4aXQgRm9yCi0gICAgICAgIEVuZCBJZgotICAgIE5leHQKLSAgICAKLSAgICBJZiBpbmRleCA8IDAgVGhlbgotICAgICAgICBpbmRleCA9IChSbmQgKiAocG9zc2libGVDZWxscy5Db3VudCAtIDEpKSArIDEKLSAgICBFbmQgSWYKLSAgICBEaW0gY2VsbCBBcyBSYW5nZQotICAgIFNldCBjZWxsID0gQmF0dGxlc2hpcC5SYW5nZShwb3NzaWJsZUNlbGxzKGluZGV4KSkKLSAgICBpc0hpdCA9IEZhbHNlCi0gICAgU2V0SGl0IGNlbGwKLSAgICBGb3IgRWFjaCBvU2hpcCBJbiBnX3VzZXJTaGlwcwotICAgICAgICBJZiBvU2hpcC5pc0hpdChjZWxsLCBGYWxzZSkgVGhlbgotICAgICAgICAgICAgSWYgQ2hlY2tXaW5uZXIoZ191c2VyU2hpcHMpIFRoZW4KLSAgICAgICAgICAgICAgICBTZXRTaGlwc1Zpc2libGUKLSAgICAgICAgICAgICAgICBNc2dCb3ggIkNvbXB1dGVyIHdpbnMhIgotICAgICAgICAgICAgICAgIEV4aXQgU3ViCi0gICAgICAgICAgICBFbmQgSWYKLSAgICAgICAgICAgIGlzSGl0ID0gVHJ1ZQotICAgICAgICAgICAgRXhpdCBGb3IKLSAgICAgICAgRW5kIElmCi0gICAgTmV4dAotCi0gICAgSWYgSXNIaXQgPSBGYWxzZSBUaGVuCi0gICAgICAgIEJhdHRsZXNoaXAuVW5wcm90ZWN0Ci0gICAgICAgIEJhdHRsZXNoaXAuQ2VsbHMoZ19sb2dSb3csIDIpLnZhbHVlID0gIlRoZSBDb21wdXRlciBnZXRzIGEgbWlzcyBvbiAiICYgY2VsbC5BZGRyZXNzCi0gICAgICAgIEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVyTWlzc2VzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSA9IEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVyTWlzc2VzIikuUmVmZXJzVG9SYW5nZS52YWx1ZSArIDEKLSAgICAgICAgZ19sb2dSb3cgPSBnX2xvZ1JvdyArIDEKLQkJQmF0dGxlc2hpcC5Qcm90ZWN0ICIiCi0gICAgRW5kIElmCi0gICAgcG9zc2libGVDZWxscy5SZW1vdmUgaW5kZXgKLUVuZCBTdWIKLQotUHJpdmF0ZSBTdWIgU2V0U2hpcHNWaXNpYmxlKCkKLSAgICBCYXR0bGVzaGlwLlVucHJvdGVjdAotICAgIERpbSBvU2hpcCBBcyBTaGlwCi0gICAgRm9yIEVhY2ggb1NoaXAgSW4gZ19TaGlwcwotICAgICAgICBEaW0gY2VsbCBBcyBSYW5nZQotICAgICAgICBGb3IgRWFjaCBjZWxsIEluIG9TaGlwLlBvc2l0aW9uLkNlbGxzCi0gICAgICAgICAgICBJZiBjZWxsLkludGVyaW9yLkNvbG9yIDw+IENvbG9yQ29uc3RhbnRzLnZiUmVkIFRoZW4KLSAgICAgICAgICAgICAgICBjZWxsLkludGVyaW9yLkNvbG9yID0gQ29sb3JDb25zdGFudHMudmJCbGFjawotICAgICAgICAgICAgRW5kIElmCi0gICAgICAgIE5leHQKLSAgICBOZXh0Ci0gICAgQmF0dGxlc2hpcC5Qcm90ZWN0ICIiCi1FbmQgU3ViCi1Qcml2YXRlIEZ1bmN0aW9uIEdldEhpdChvU2hpcCBBcyBTaGlwKSBBcyBJbnRlZ2VyCi0gICAgRGltIGlzSG9yaXpvbnRhbCBBcyBCb29sZWFuCi0gICAgSWYgb1NoaXAuSGl0cy5Db3VudCA9IDEgVGhlbgotICAgICAgICBpc0hvcml6b250YWwgPSBJbnQoKFJuZCAqIDIpKSA9IDEKLSAgICBFbHNlCi0gICAgICAgIElmIG9TaGlwLkhpdHMoMSkucm93ID0gb1NoaXAuSGl0cygyKS5yb3cgVGhlbgotICAgICAgICAgICAgaXNIb3Jpem9udGFsID0gVHJ1ZQotICAgICAgICBFbHNlCi0gICAgICAgICAgICBpc0hvcml6b250YWwgPSBGYWxzZQotICAgICAgICBFbmQgSWYKLSAgICBFbmQgSWYKLSAgICAKLSAgICBEaW0gaW5kZXggQXMgSW50ZWdlcgotICAgIGluZGV4ID0gLTEKLSAgICBXaGlsZSBpbmRleCA9IC0xCi0gICAgICAgIElmIGlzSG9yaXpvbnRhbCBUaGVuCi0gICAgICAgICAgICBGb3IgRWFjaCBIaXQgSW4gb1NoaXAuSGl0cwotICAgICAgICAgICAgICAgIGluZGV4ID0gRmluZFBvc3NpYmxlKEhpdC5PZmZzZXQoMCwgLTEpKQotICAgICAgICAgICAgICAgIElmIGluZGV4ID0gLTEgVGhlbgotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEZpbmRQb3NzaWJsZShIaXQuT2Zmc2V0KDAsIDEpKQotICAgICAgICAgICAgICAgICAgICBJZiBpbmRleCA8PiAtMSBUaGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBFeGl0IEZvcgotICAgICAgICAgICAgICAgICAgICBFbmQgSWYKLSAgICAgICAgICAgICAgICBFbHNlCi0gICAgICAgICAgICAgICAgICAgIEV4aXQgRm9yCi0gICAgICAgICAgICAgICAgRW5kIElmCi0gICAgICAgICAgICBOZXh0Ci0gICAgICAgICAgICBJZiBpbmRleCA9IC0xIFRoZW4KLSAgICAgICAgICAgICAgICBpc0hvcml6b250YWwgPSBGYWxzZQotICAgICAgICAgICAgRW5kIElmCi0gICAgICAgIEVsc2UKLSAgICAgICAgICAgIEZvciBFYWNoIEhpdCBJbiBvU2hpcC5IaXRzCi0gICAgICAgICAgICAgICAgaW5kZXggPSBGaW5kUG9zc2libGUoSGl0Lk9mZnNldCgtMSwgMCkpCi0gICAgICAgICAgICAgICAgSWYgaW5kZXggPSAtMSBUaGVuCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gRmluZFBvc3NpYmxlKEhpdC5PZmZzZXQoMSwgMCkpCi0gICAgICAgICAgICAgICAgICAgIElmIGluZGV4ID4gLTEgVGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgRXhpdCBGb3IKLSAgICAgICAgICAgICAgICAgICAgRW5kIElmCi0gICAgICAgICAgICAgICAgRWxzZQotICAgICAgICAgICAgICAgICAgICBFeGl0IEZvcgotICAgICAgICAgICAgICAgIEVuZCBJZgotICAgICAgICAgICAgTmV4dAotICAgICAgICAgICAgSWYgaW5kZXggPSAtMSBUaGVuCi0gICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsID0gVHJ1ZQotICAgICAgICAgICAgRW5kIElmCi0gICAgICAgIEVuZCBJZgotICAgIFdlbmQKLSAgICBHZXRIaXQgPSBpbmRleAotRW5kIEZ1bmN0aW9uCi1Qcml2YXRlIEZ1bmN0aW9uIEZpbmRQb3NzaWJsZShyIEFzIFJhbmdlKQotRGltIGluZGV4IEFzIEludGVnZXIKLURpbSBjZWxsIEFzIFJhbmdlCi1Gb3IgaW5kZXggPSAxIFRvIHBvc3NpYmxlQ2VsbHMuQ291bnQKLSAgICBJZiBwb3NzaWJsZUNlbGxzKGluZGV4KSA9IHIuQWRkcmVzcyBUaGVuCi0gICAgICAgIEZpbmRQb3NzaWJsZSA9IGluZGV4Ci0gICAgICAgIEV4aXQgRnVuY3Rpb24KLSAgICBFbmQgSWYKLU5leHQKLUZpbmRQb3NzaWJsZSA9IC0xCi1FbmQgRnVuY3Rpb24KZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9WQkEtQ29kZS9TaGlwQ2xhc3MudHh0IGIvU2FtcGxlQXBwL1ZCQS1Db2RlL1NoaXBDbGFzcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTE0NDYuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1ZCQS1Db2RlL1NoaXBDbGFzcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi3vu79EaW0gclBvc2l0aW9uIEFzIFJhbmdlCi1QdWJsaWMgSGl0Q291bnQgQXMgSW50ZWdlcgotRGltIG9TaXplIEFzIEludGVnZXIKLURpbSBtX2hpdHMgQXMgQ29sbGVjdGlvbgotCi1QdWJsaWMgUHJvcGVydHkgR2V0IFBvc2l0aW9uKCkgQXMgUmFuZ2UKLSAgICBTZXQgUG9zaXRpb24gPSByUG9zaXRpb24KLUVuZCBQcm9wZXJ0eQotUHVibGljIFByb3BlcnR5IFNldCBQb3NpdGlvbihCeVZhbCB2YWx1ZSBBcyBSYW5nZSkKLSAgICBTZXQgclBvc2l0aW9uID0gdmFsdWUKLUVuZCBQcm9wZXJ0eQotCi1QdWJsaWMgRnVuY3Rpb24gSXNIaXQoY2VsbCBBcyBSYW5nZSwgaXNQbGF5ZXIgQXMgQm9vbGVhbikgQXMgQm9vbGVhbgotQXR0cmlidXRlIElzSGl0LlZCX0Rlc2NyaXB0aW9uID0gIkNoZWNrcyBpZiB0aGUgY3VycmVudCBtb3ZlIGlzIGEgaGl0IgotQXR0cmlidXRlIElzSGl0LlZCX0hlbHBJRCA9IDEKLSdTYW1wbGUgb2YgYXR0cmlidXRlIHVzZSBvbiBmdW5jdGlvbiBsZXZlbCAoc2hvdyB1cCBpbiB0aGUgb2JqZWN0YnJvd3NlcihGMikgLS0+IE1ldGhvZCAtLT4gUHJvcGVydGllcwotICAgSWYgQ29kZS5Db2xsaWRlKGNlbGwsIFBvc2l0aW9uKSBUaGVuCi0gICAgICAgIGNlbGwuV29ya3NoZWV0LlVucHJvdGVjdAotICAgICAgICBjZWxsLkludGVyaW9yLkNvbG9yID0gdmJSZWQKLSAgICAgICAgaXNIaXQgPSBUcnVlCi0gICAgICAgIEhpdHMuQWRkIGNlbGwKLSAgICAgICAgSWYgSGl0cy5Db3VudCA9IFNpemUgVGhlbgotICAgICAgICAgICAgUG9zaXRpb24uQm9yZGVyQXJvdW5kIFdlaWdodDo9eGxNZWRpdW0KLSAgICAgICAgRW5kIElmCi0gICAgICAgIAotICAgICAgICBJZiBpc1BsYXllciBUaGVuCi0gICAgICAgICAgICBCYXR0bGVzaGlwLkNlbGxzKGdfbG9nUm93LCAyKS52YWx1ZSA9ICJZb3UgZ2V0IGEgaGl0IG9uICIgJiBjZWxsLkFkZHJlc3MgJiAiISIKLSAgICAgICAgICAgIEJhdHRsZXNoaXAuTmFtZXMoIlBsYXllckhpdHMiKS5SZWZlcnNUb1JhbmdlLnZhbHVlID0gQmF0dGxlc2hpcC5OYW1lcygiUGxheWVySGl0cyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgKyAxCi0gICAgICAgIEVsc2UKLSAgICAgICAgICAgIEJhdHRsZXNoaXAuQ2VsbHMoZ19sb2dSb3csIDIpLnZhbHVlID0gIlRoZSBDb21wdXRlciBnZXRzIGEgaGl0IG9uICIgJiBjZWxsLkFkZHJlc3MKLSAgICAgICAgICAgIEJhdHRsZXNoaXAuTmFtZXMoIkNvbXB1dGVySGl0cyIpLlJlZmVyc1RvUmFuZ2UudmFsdWUgPSBCYXR0bGVzaGlwLk5hbWVzKCJDb21wdXRlckhpdHMiKS5SZWZlcnNUb1JhbmdlLnZhbHVlICsgMQotICAgICAgICBFbmQgSWYKLSAgICAgICAgZ19sb2dSb3cgPSBnX2xvZ1JvdyArIDEKLSAgICAgICAgY2VsbC5Xb3Jrc2hlZXQuUHJvdGVjdCAiIgotICAgICAgICBpc0hpdCA9IFRydWUKLSAgIEVsc2UKLSAgICAgICAgaXNIaXQgPSBGYWxzZQotICAgRW5kIElmCi1FbmQgRnVuY3Rpb24KLVB1YmxpYyBQcm9wZXJ0eSBHZXQgSGl0cygpIEFzIENvbGxlY3Rpb24KLSAgICBTZXQgSGl0cyA9IG1faGl0cwotRW5kIFByb3BlcnR5Ci1QdWJsaWMgUHJvcGVydHkgU2V0IEhpdHMoQnlWYWwgdmFsdWUgQXMgQ29sbGVjdGlvbikKLSAgICBTZXQgbV9oaXRzID0gdmFsdWUKLUVuZCBQcm9wZXJ0eQotUHJpdmF0ZSBTdWIgQ2xhc3NfSW5pdGlhbGl6ZSgpCi0gICAgSGl0Q291bnQgPSAwCi0gICAgU2V0IEhpdHMgPSBOZXcgQ29sbGVjdGlvbgotRW5kIFN1YgotUHVibGljIFByb3BlcnR5IEdldCBTaXplKCkgQXMgSW50ZWdlcgotU2l6ZSA9IG9TaXplCi1FbmQgUHJvcGVydHkKLVB1YmxpYyBQcm9wZXJ0eSBMZXQgU2l6ZShCeVZhbCB2TmV3VmFsdWUgQXMgSW50ZWdlcikKLW9TaXplID0gdk5ld1ZhbHVlCi1FbmQgUHJvcGVydHkKZGlmZiAtLWdpdCBhL1NhbXBsZUFwcC9WQkEtQ29kZS9UaGlzV29ya2Jvb2sudHh0IGIvU2FtcGxlQXBwL1ZCQS1Db2RlL1RoaXNXb3JrYm9vay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWM5MDUuLjAwMDAwMDAKLS0tIGEvU2FtcGxlQXBwL1ZCQS1Db2RlL1RoaXNXb3JrYm9vay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLe+7v1ByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKQotICAgIENvZGUuQWRkU2hpcHMgQmF0dGxlc2hpcC5SYW5nZShib2FyZDEpCi0gICAgQ29kZS5BZGRVc2VyU2hpcHMgQmF0dGxlc2hpcC5SYW5nZShib2FyZDIpCi0gICAgQ29tcHV0ZXJQbGF5LkluaXQKLQlnX2dhbWVFbmRlZD1mYWxzZQotCWdfbG9nUm93ID0gQmF0dGxlc2hpcC5OYW1lcygiTG9nU3RhcnQiKS5SZWZlcnNUb1JhbmdlLnJvdysxCi1FbmQgU3ViCmRpZmYgLS1naXQgYS9TYW1wbGVBcHAvYXBwLmNvbmZpZyBiL1NhbXBsZUFwcC9hcHAuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFkYmUwLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9hcHAuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxjb25maWd1cmF0aW9uPgotPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjIuMC41MDcyNyIgc2t1PSJDbGllbnQiLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTEudHh0IGIvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTYxMzRiLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9jc3YvU2FtcGxlOS0xLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLe+7v1RoaXMgZmlsZSBpcyB1c2VkIGluIHNhbXBsZSA5Ci1TYWxlcyBwZXIgcmVnaW9uCi0iUGVyaW9kIiwiRXVyb3BlIiwiQWZyaWNhIiwiQXNpYSIsIk5vcnRoIEFtZXJpY2EiLCJTb3V0aCBBbWVyaWNhIiwiQXVzdHJhaWxhIgotMjAxMC0wMSwxMi4zLDgsNTUuMSwzNSwxNC4xLDEyLjEKLTIwMTAtMDIsMTMuOSw5LjEsNTEuMSwzNS4zLDE0LjQsMTEuMQotMjAxMC0wMywxMS40LDguNyw1NC43LDMyLjEsMTMuMSwxMi4zCi0yMDEwLTA0LDEyLjEsOS4yLDUzLjMsMzUsMTEuMiwxMC40Ci0yMDEwLTA1LDkuNCwxMCw0NS4zLDI1LjgsMTIuNCwxMy4xCi0yMDEwLTA2LDE0LjMsOS44LDQ5LjQsMjkuMiwxNC4xLDE0LjIKLTIwMTAtMDcsNy4zLDExLDUwLjAsMzEuMiwxNC45LDEyLjMKLTIwMTAtMDgsMTkuMywxMC4xLDQ5LjYsMzUsMTMuMywxMC4xCi0yMDEwLTA5LDIxLjAsOC41LDQxLjEsMzUsMTQuNSw5LjMKLTIwMTAtMTAsMjMuOCw5LjEsNDUsMzIsMTYuMSwxMS4xCi0yMDEwLTExLDI1LjYsMTAuOCw0OSwzMy42LDE0LjQsMTMuNAotMjAxMC0xMiwxNy4yLDEyLjEsNDMuMiwzNS4xLDE1LjEsMTUuMQotRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTIudHh0IGIvU2FtcGxlQXBwL2Nzdi9TYW1wbGU5LTIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk1NjYwLi4wMDAwMDAwCi0tLSBhL1NhbXBsZUFwcC9jc3YvU2FtcGxlOS0yLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAot77u/VGhpcyBmaWxlIGlzIHVzZWQgaW4gc2FtcGxlIDkKLUlECVByb2R1Y3QJSXRlbXMgSW4gU3RvY2sJUHVyY2hhc2UgUHJpY2UJUHJpY2UKLTEyMDAxCU5haWxzCTM3CTEsMwkzLDk5Ci0xMjAwMglIYW1tZXIJNQk1LDMzCTEyLDEwCi0xMjAwMwlTYXcJMTIJOCw5OQkxNSwzNwotMTIwMTAJRHJpbGwJMjAJNCwzCTgsMDAKLTEyMDExCUNyb3diYXIJNwkxMyw3NwkyMyw0OApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK