ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDQ1MmZkODEuLjYwNDgzZmYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw1ICsxLDUgQEAKICp+CiAqLmJhawogKi5weWMKKyoucHljLTIuNAogVGh1bWJzLmRiCi0KZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBiODRlMWI2Li5hMTEzYzcxIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00NCw2ICs0NCw4IEBACiAjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLXR5cGUgZiAtbmFtZSAiSUdUYWxrU2Vzc2lvbioiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZikKICMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9kYXRhLyopCiAKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9Db3JwQXBwX2ludGVybWVkaWF0ZXMpCisKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjODA5NTU0Li5mZmVlOTMzIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmRldmVsb3BtZW50IgogICAgICAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIiBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1dJRklfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNIQU5HRV9ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX1dJRklfU1RBVEUiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ERVZJQ0VfUE9XRVIiIC8+CkBAIC00MywxMiArNDQsMTIgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmdvb2dsZS5hbmRyb2lkLmdvb2dsZWFwcHMucGVybWlzc2lvbi5HT09HTEVfQVVUSC5Zb3VUdWJlVXNlciIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJEZXYgVG9vbHMiCi0gICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9kZXZ0b29scyI+CisgICAgICAgICAgICBhbmRyb2lkOmljb249IkBtaXBtYXAvaWNfbGF1bmNoZXJfZGV2dG9vbHMiPgogCiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkRldmVsb3BtZW50IiBhbmRyb2lkOmxhYmVsPSJEZXYgVG9vbHMiCi0gICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9kZXZ0b29scyI+CisgICAgICAgICAgICBhbmRyb2lkOmljb249IkBtaXBtYXAvaWNfbGF1bmNoZXJfZGV2dG9vbHMiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgpAQCAtNzcsNyArNzgsNiBAQAogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkFjY291bnRzVGVzdGVyIiBhbmRyb2lkOmxhYmVsPSJBY2NvdW50c1Rlc3RlciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0IgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUhpZGRlbiI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNZWRpYVNjYW5uZXJBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iTWVkaWEgU2Nhbm5lciI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1lZGlhU2Nhbm5lckFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJNZWRpYSBQcm92aWRlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVEVTVCIgLz4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9hY2NvdW50c190ZXN0ZXIueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwKaW5kZXggZGY3YzczZi4uMjhmMWI0ZSAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwKQEAgLTE0LDEwMCArMTQsMTEwIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxMaW5lYXJMYXlvdXQKLSAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAotICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CiAKLSAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWNjb3VudF90eXBlc19zcGlubmVyX2xhYmVsIgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9zZWxlY3RfYWNjb3VudF90eXBlIi8+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWNjb3VudF90eXBlc19zcGlubmVyX2xhYmVsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9zZWxlY3RfYWNjb3VudF90eXBlIi8+CiAKLSAgICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hY2NvdW50X3R5cGVzX3NwaW5uZXIiCi0gICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hY2NvdW50X3R5cGVzX3NwaW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKLSAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hY2NvdW50c19ieV90eXBlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSIvPgorICAgICAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAotICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIvPgotICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50IgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9hZGRfYWNjb3VudCIvPgorICAgICAgICAgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUiLz4KIAotICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcyIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzIi8+Ci0gICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIvPgogCi0gICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9kZXNpcmVkRmVhdHVyZXMiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfZmVhdHVyZXNfbGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9hZGRfYWNjb3VudCIvPgogCi0gICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfZmVhdHVyZXMiCi0gICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkVtcz0iMTUiLz4KLSAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRGZWF0dXJlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZGVzaXJlZF9hdXRodG9rZW50eXBlX2xhYmVsIi8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcyIvPgogCi0gICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfYXV0aHRva2VudHlwZSIKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluRW1zPSIxNSIvPgotICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW5fYnlfdHlwZV9hbmRfZmVhdHVyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW5fYnlfdHlwZV9hbmRfZmVhdHVyZSIvPgorCisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICAgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9kZXNpcmVkRmVhdHVyZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfZmVhdHVyZXNfbGFiZWwiLz4KKworICAgICAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9kZXNpcmVkX2ZlYXR1cmVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5FbXM9IjE1Ii8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICAgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9kZXNpcmVkRmVhdHVyZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfYXV0aHRva2VudHlwZV9sYWJlbCIvPgorCisgICAgICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfYXV0aHRva2VudHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluRW1zPSIxNSIvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgogICAgIDwvTGluZWFyTGF5b3V0PgogCi0gICAgPExpbmVhckxheW91dAotICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAotICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hY2NvdW50c19saXN0IgotICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgorICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYWNjb3VudHNfbGlzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ii8+CiAKICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2Nvbm5lY3Rpdml0eS54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvY29ubmVjdGl2aXR5LnhtbAppbmRleCA2MTIzMDRmLi5mZjBjNmVhIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvY29ubmVjdGl2aXR5LnhtbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvY29ubmVjdGl2aXR5LnhtbApAQCAtMTcsMTIgKzE3LDE0IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaW5lYXJMYXlvdXQKLSAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgogCisgIDxMaW5lYXJMYXlvdXQKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KICAgICA8TGluZWFyTGF5b3V0CiAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgogICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTIwMiw1ICsyMDQsNTkgQEAKICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY3Jhc2giIC8+CiAgICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWRkX2RlZmF1bHRfcm91dGUiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWRkX2RlZmF1bHRfcm91dGUiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZW1vdmVfZGVmYXVsdF9yb3V0ZSIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZW1vdmVfZGVmYXVsdF9yb3V0ZSIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2RlZmF1bHRfcmVxdWVzdCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kZWZhdWx0X3JlcXVlc3QiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9kZWZhdWx0X3NvY2tldCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kZWZhdWx0X3NvY2tldCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JvdW5kX2h0dHBfcmVxdWVzdCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ib3VuZF9odHRwX3JlcXVlc3QiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9ib3VuZF9zb2NrZXRfcmVxdWVzdCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ib3VuZF9zb2NrZXRfcmVxdWVzdCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JvdXRlZF9odHRwX3JlcXVlc3QiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcm91dGVkX2h0dHBfcmVxdWVzdCIgLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JvdXRlZF9zb2NrZXRfcmVxdWVzdCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yb3V0ZWRfc29ja2V0X3JlcXVlc3QiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgIDwvTGluZWFyTGF5b3V0PgorPC9TY3JvbGxWaWV3PgogCmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZGV2ZWxvcG1lbnRfc2V0dGluZ3MueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2RldmVsb3BtZW50X3NldHRpbmdzLnhtbAppbmRleCAxNmMyY2RmLi5lOWIxZGFkIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZGV2ZWxvcG1lbnRfc2V0dGluZ3MueG1sCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9kZXZlbG9wbWVudF9zZXR0aW5ncy54bWwKQEAgLTc0LDEwICs3NCwxNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmVsb3BtZW50X3NldHRpbmdzX3Nob3dfdXBkYXRlc190ZXh0IiAvPgogCisgICAgICAgIDxTcGlubmVyIGFuZHJvaWQ6aWQ9IkAraWQvc3RyaWN0bW9kZV92aXN1YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3Nob3dfdXBkYXRlcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIgLz4KKwogICAgICAgICA8Q2hlY2tCb3ggYW5kcm9pZDppZD0iQCtpZC9jb21wYXRpYmlsaXR5X21vZGUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3Nob3dfdXBkYXRlcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc3RyaWN0bW9kZV92aXN1YWwiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGV2ZWxvcG1lbnRfc2V0dGluZ3NfY29tcGF0aWJpbGl0eV9tb2RlX3RleHQiIC8+CiAKQEAgLTE1NSw3ICsxNjEsMTQgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZm9udF9oaW50aW5nIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmVsb3BtZW50X3NldHRpbmdzX3Nob3dfeG1wcF90ZXh0IiAvPgotICAgICAgICAgICAgCisKKyAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvd2luZG93X29yaWVudGF0aW9uX2xpc3RlbmVyX2xvZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc2hvd194bXBwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RldmVsb3BtZW50X3NldHRpbmdzX3dpbmRvd19vcmllbnRhdGlvbl9saXN0ZW5lcl9sb2ciIC8+CisKICAgICA8L1JlbGF0aXZlTGF5b3V0PgogCiA8L1Njcm9sbFZpZXc+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZ2V0X2F1dGhfdG9rZW5fdmlldy54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZ2V0X2F1dGhfdG9rZW5fdmlldy54bWwKaW5kZXggYzAxNGNhZC4uY2ZhZWQzMiAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9hdXRoX3Rva2VuX3ZpZXcueG1sCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9nZXRfYXV0aF90b2tlbl92aWV3LnhtbApAQCAtMjEsNyArMjEsOCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAogICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbl9kaWFsb2dfbWVzc2FnZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2VudGVyX2F1dGhfdG9rZW5fdHlwZSIgLz4KIAogICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoX3Rva2VuX3R5cGUiCmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvZ2V0X2ZlYXR1cmVzX3ZpZXcueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9mZWF0dXJlc192aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmZkZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9mZWF0dXJlc192aWV3LnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuX2RpYWxvZ19tZXNzYWdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9lbnRlcl9hdXRoX3Rva2VuX3R5cGUiIC8+CisKKyAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYXV0aF90b2tlbl90eXBlIgorICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOm1pbldpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5PSJ0cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmNhcGl0YWxpemU9Im5vbmUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0b1RleHQ9ImZhbHNlIi8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2ZlYXR1cmVzX2RpYWxvZ19tZXNzYWdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9lbnRlcl9mZWF0dXJlcyIgLz4KKworICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9mZWF0dXJlcyIKKyAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMjUwZGlwIgorICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpjYXBpdGFsaXplPSJub25lIgorICAgICAgICAgICAgICBhbmRyb2lkOmF1dG9UZXh0PSJmYWxzZSIvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9tZWRpYV9zY2FubmVyX2FjdGl2aXR5LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9tZWRpYV9zY2FubmVyX2FjdGl2aXR5LnhtbAppbmRleCA5NzRmNjgzLi40ODA2ODQzIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvbWVkaWFfc2Nhbm5lcl9hY3Rpdml0eS54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L21lZGlhX3NjYW5uZXJfYWN0aXZpdHkueG1sCkBAIC00LDkgKzQsOSBAQAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCisKICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KQEAgLTE0LDEyICsxNCw0NSBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgCSAJCi0JYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0JYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0JYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KIAotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIiBhbmRyb2lkOnRleHRTaXplPSIxNnNwIiBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE2MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NhbmNhcmQiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ic3RhcnRTY2FuIiAvPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMGRpcCI+CisKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL251bXNvbmdzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL251bXNvbmdzIgorICAgICAgICAgICAgYW5kcm9pZDpudW1lcmljPSJpbnRlZ2VyIgorICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5zZXJ0YnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJpbnNlcnRJdGVtcyIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgogCiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbWlwbWFwLWhkcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcHBzL0RldmVsb3BtZW50L3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xhdW5jaGVyX2RldnRvb2xzLnBuZwpyZW5hbWUgdG8gYXBwcy9EZXZlbG9wbWVudC9yZXMvbWlwbWFwLWhkcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbWlwbWFwLW1kcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcHBzL0RldmVsb3BtZW50L3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xhdW5jaGVyX2RldnRvb2xzLnBuZwpyZW5hbWUgdG8gYXBwcy9EZXZlbG9wbWVudC9yZXMvbWlwbWFwLW1kcGkvaWNfbGF1bmNoZXJfZGV2dG9vbHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAxODFjNGZhLi4wZjQ3NjNjIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0zNiw2ICszNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RhcnRfaGlwcmkiPlN0YXJ0IEhpUHJpPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9wX2hpcHJpIj5TdG9wIEhpUHJpPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjcmFzaCI+Q1JBU0g8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFkZF9kZWZhdWx0X3JvdXRlIj5BZGQgRGVmYXVsdCBSb3V0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icmVtb3ZlX2RlZmF1bHRfcm91dGUiPlJlbW92ZSBEZWZhdWx0IFJvdXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3JlcXVlc3QiPk1ha2UgYSBodHRwIHJlcXVlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfc29ja2V0Ij5NYWtlIGEgcmF3IHJlcXVlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJvdW5kX2h0dHBfcmVxdWVzdCI+TWFrZSBib3VuZCBodHRwIHJlcXVlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJvdW5kX3NvY2tldF9yZXF1ZXN0Ij5NYWtlIGJvdW5kIHNvY2tldCByZXF1ZXN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyb3V0ZWRfaHR0cF9yZXF1ZXN0Ij5NYWtlIHJvdXRlZCBodHRwIHJlcXVlc3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJvdXRlZF9zb2NrZXRfcmVxdWVzdCI+TWFrZSByb3V0ZWQgc29ja2V0IHJlcXVlc3Q8L3N0cmluZz4KIAogCiAgICAgICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX2luZm9fZGVmYXVsdCI+dW5rbm93bjwvc3RyaW5nPgpAQCAtMTA1LDYgKzExMyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJkZXZlbG9wbWVudF9zZXR0aW5nc19kZWJ1Z19hcHBfbGFiZWxfdGV4dCI+RGVidWcgQXBwOjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2ZWxvcG1lbnRfc2V0dGluZ3Nfc2hvd19zbGVlcF90ZXh0Ij5TaG93IHNsZWVwIHN0YXRlIG9uIExFRDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2ZWxvcG1lbnRfc2V0dGluZ3Nfa2VlcF9zY3JlZW5fb25fdGV4dCI+S2VlcCBzY3JlZW4gb24gd2hpbGUgcGx1Z2dlZCBpbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGV2ZWxvcG1lbnRfc2V0dGluZ3Nfd2luZG93X29yaWVudGF0aW9uX2xpc3RlbmVyX2xvZyI+RW5hYmxlIHdpbmRvdyBvcmllbnRhdGlvbiBsaXN0ZW5lciBsb2c8L3N0cmluZz4KIAogICAgIDxzdHJpbmcgbmFtZT0ibW9ua2V5X3NjcmVlbl9pbml0aWFsQWN0aXZpdHlfdGV4dCI+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJtb25rZXlfc2NyZWVuX251bWJlcl9vZl9ldmVudHNfbGFiZWwiPk51bWJlciBvZiBFdmVudHM6IDwvc3RyaW5nPgpAQCAtMTYzLDExICsxNzIsMTMgQEAKICAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9wcm9jZXNzX25hbWVfaGVhZGVyIj5Qcm9jZXNzIE5hbWU6PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfcmVtb3ZlX2FjY291bnQiPlJlbW92ZSBBY2NvdW50PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW4iPkdldCBBdXRoIFRva2VuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW5fYnlfdHlwZV9hbmRfZmVhdHVyZSI+R2V0IEF1dGggVG9rZW4gQnkgVHlwZS9GZWF0dXJlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfdGVzdF9oYXNfZmVhdHVyZXMiPkhhcyBGZWF0dXJlczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiI+SW52YWxpZGF0ZSBUb2tlbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2FjY291bnRfY29udGV4dF9tZW51X3RpdGxlIj5hY2NvdW50IG9wZXJhdGlvbnM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9kb19nZXRfYXV0aF90b2tlbiI+T2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9va19idXR0b24iPk9rPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZW50ZXJfYXV0aF90b2tlbl90eXBlIj5FbnRlciB0aGUgYXV0aHRva2VuIHR5cGU6PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZW50ZXJfZmVhdHVyZXMiPkVudGVyIHRoZSBmZWF0dXJlcyBzZXBhcmF0ZWQgYnkgYSBzcGFjZTo8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl91cGRhdGVfY3JlZGVudGlhbHMiPlVwZGF0ZSBDcmVkZW50aWFsczwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2NvbmZpcm1fY3JlZGVudGlhbHMiPkNvbmZpcm0gQ3JlZGVudGlhbHM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9jbGVhcl9wYXNzd29yZCI+Q2xlYXIgUGFzc3dvcmQ8L3N0cmluZz4KQEAgLTIwOCw0ICsyMTksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYmFkX2JlaGF2aW9yX2Fucl9zZXJ2aWNlX2xhYmVsIj5BTlIgc3RhcnRpbmcgYSBTZXJ2aWNlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJiYWRfYmVoYXZpb3JfYW5yX3N5c3RlbV9sYWJlbCI+U3lzdGVtIEFOUiAoaW4gQWN0aXZpdHlNYW5hZ2VyKTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmFkX2JlaGF2aW9yX3dlZGdlX3N5c3RlbV9sYWJlbCI+V2VkZ2Ugc3lzdGVtICg1IG1pbnV0ZSBzeXN0ZW0gQU5SKTwvc3RyaW5nPgorCisgICAgPCEtLSBNZWRpYVNjYW5uZXJBY3Rpdml0eSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNjYW5jYXJkIj5TY2FuIFNEIGNhcmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bXNvbmdzIj4jIG9mIGFsYnVtczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zZXJ0YnV0dG9uIj5JbnNlcnQgJTFzIGFsYnVtczwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQWNjb3VudHNUZXN0ZXIuamF2YQppbmRleCBmOGZmNzM2Li5lMmEwNzg5IDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L0FjY291bnRzVGVzdGVyLmphdmEKQEAgLTQ2LDYgKzQ2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJREFURV9BVVRIX1RPS0VOX0RJQUxPR19JRCA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfSEFTX0ZFQVRVUkVTX0RJQUxPR19JRCA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRElBTE9HX0lEID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0FVVEhfVE9LRU5fQllfVFlQRV9BTkRfRkVBVFVSRV9ESUFMT0dfSUQgPSA2OworCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtRGVzaXJlZEF1dGhUb2tlblR5cGVFZGl0VGV4dDsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1EZXNpcmVkRmVhdHVyZXNFZGl0VGV4dDsKICAgICBwcml2YXRlIHZvbGF0aWxlIENoYXJTZXF1ZW5jZSBtRGlhbG9nTWVzc2FnZTsKQEAgLTY2LDYgKzY4LDggQEAKICAgICAgICAgICAgICAgICBidXR0b25DbGlja0xpc3RlbmVyKTsKICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50KS5zZXRPbkNsaWNrTGlzdGVuZXIoYnV0dG9uQ2xpY2tMaXN0ZW5lcik7CiAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMpLnNldE9uQ2xpY2tMaXN0ZW5lcihidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuX2J5X3R5cGVfYW5kX2ZlYXR1cmUpLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBidXR0b25DbGlja0xpc3RlbmVyKTsKICAgICAgICAgbURlc2lyZWRBdXRoVG9rZW5UeXBlRWRpdFRleHQgPQogICAgICAgICAgICAgICAgIChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfYXV0aHRva2VudHlwZSk7CiAgICAgICAgIG1EZXNpcmVkRmVhdHVyZXNFZGl0VGV4dCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2Rlc2lyZWRfZmVhdHVyZXMpOwpAQCAtMTE5LDggKzEyMywxMCBAQAogICAgICAgICAgICAgICAgIGlmIChkZXNjLnR5cGUuZXF1YWxzKGFjY291bnQudHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZGVzYy5wYWNrYWdlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgYXV0aENvbnRleHQgPSBnZXRDb250ZXh0KCkuY3JlYXRlUGFja2FnZUNvbnRleHQocGFja2FnZU5hbWUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShhdXRoQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShkZXNjLmljb25JZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBhdXRoQ29udGV4dCA9IGdldENvbnRleHQoKS5jcmVhdGVQYWNrYWdlQ29udGV4dChwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZURyYXdhYmxlKGF1dGhDb250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmljb25JZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXJyb3IgZ2V0dGluZyB0aGUgUGFja2FnZSBDb250ZXh0IGZvciAiICsgcGFja2FnZU5hbWUsIGUpOwpAQCAtMTk3LDYgKzIwMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbGxiYWNrVG9EaWFsb2coQWNjb3VudHNUZXN0ZXIudGhpcywgImVkaXQgcHJvcGVydGllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW5fYnlfdHlwZV9hbmRfZmVhdHVyZSA9PSB2LmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKEdFVF9BVVRIX1RPS0VOX0JZX1RZUEVfQU5EX0ZFQVRVUkVfRElBTE9HX0lEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gdW5rbm93biBidXR0b24KICAgICAgICAgICAgIH0KQEAgLTI2NSw0OCArMjczLDkyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGZpbmFsIGludCBpZCkgewotICAgICAgICBpZiAoaWQgPT0gR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEIHx8IGlkID09IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQKLSAgICAgICAgICAgICAgICB8fCBpZCA9PSBVUERBVEVfQ1JFREVOVElBTFNfRElBTE9HX0lEIHx8IGlkID09IFRFU1RfSEFTX0ZFQVRVUkVTX0RJQUxPR19JRCkgewotICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbSh0aGlzKS5pbmZsYXRlKFIubGF5b3V0LmdldF9hdXRoX3Rva2VuX3ZpZXcsIG51bGwpOwotICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmFjY291bnRzX3Rlc3Rlcl9kb19nZXRfYXV0aF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IHZhbHVlID0gKEVkaXRUZXh0KSB2aWV3LmZpbmRWaWV3QnlJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuaWQuYWNjb3VudHNfdGVzdGVyX2F1dGhfdG9rZW5fdHlwZSk7CisgICAgICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgICAgICAgIGNhc2UgR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEOgorICAgICAgICAgICAgY2FzZSBJTlZBTElEQVRFX0FVVEhfVE9LRU5fRElBTE9HX0lEOgorICAgICAgICAgICAgY2FzZSBVUERBVEVfQ1JFREVOVElBTFNfRElBTE9HX0lEOgorICAgICAgICAgICAgY2FzZSBURVNUX0hBU19GRUFUVVJFU19ESUFMT0dfSUQ6IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHRoaXMpLmluZmxhdGUoUi5sYXlvdXQuZ2V0X2F1dGhfdG9rZW5fdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWNjb3VudHNfdGVzdGVyX29rX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRUZXh0IHZhbHVlID0gKEVkaXRUZXh0KSB2aWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmlkLmFjY291bnRzX3Rlc3Rlcl9hdXRoX3Rva2VuX3R5cGUpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUgPSB2YWx1ZS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBtTG9uZ1ByZXNzZWRBY2NvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSBHRVRfQVVUSF9UT0tFTl9ESUFMT0dfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhUb2tlbihhY2NvdW50LCBhdXRoVG9rZW5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbG9naW5PcHRpb25zICovLCBBY2NvdW50c1Rlc3Rlci50aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWxsYmFja1RvRGlhbG9nKEFjY291bnRzVGVzdGVyLnRoaXMsICJnZXQgYXV0aCB0b2tlbiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBJTlZBTElEQVRFX0FVVEhfVE9LRU5fRElBTE9HX0lEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBdXRoVG9rZW4oYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdldEFuZEludmFsaWRhdGVBdXRoVG9rZW5DYWxsYmFjayhhY2NvdW50KSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBURVNUX0hBU19GRUFUVVJFU19ESUFMT0dfSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMgPSBUZXh0VXRpbHMuc3BsaXQoYXV0aFRva2VuVHlwZSwgIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmhhc0ZlYXR1cmVzKGFjY291bnQsIGZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0SGFzRmVhdHVyZXNDYWxsYmFjaygpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIudXBkYXRlQ3JlZGVudGlhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLCBudWxsIC8qIGxvZ2luT3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUgPSB2YWx1ZS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gbUxvbmdQcmVzc2VkQWNjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IEdFVF9BVVRIX1RPS0VOX0RJQUxPR19JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhUb2tlbihhY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGxvZ2luT3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudHNUZXN0ZXIudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbGxiYWNrVG9EaWFsb2coQWNjb3VudHNUZXN0ZXIudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0IGF1dGggdG9rZW4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBJTlZBTElEQVRFX0FVVEhfVE9LRU5fRElBTE9HX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuZ2V0QXV0aFRva2VuKGFjY291bnQsIGF1dGhUb2tlblR5cGUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2V0QW5kSW52YWxpZGF0ZUF1dGhUb2tlbkNhbGxiYWNrKGFjY291bnQpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBURVNUX0hBU19GRUFUVVJFU19ESUFMT0dfSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZlYXR1cmVzID0gVGV4dFV0aWxzLnNwbGl0KGF1dGhUb2tlblR5cGUsICIsIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaGFzRmVhdHVyZXMoYWNjb3VudCwgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0SGFzRmVhdHVyZXNDYWxsYmFjaygpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci51cGRhdGVDcmVkZW50aWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuVHlwZSwgbnVsbCAvKiBsb2dpbk9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWxsYmFja1RvRGlhbG9nKEFjY291bnRzVGVzdGVyLnRoaXMsICJ1cGRhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFZpZXcodmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgR0VUX0FVVEhfVE9LRU5fQllfVFlQRV9BTkRfRkVBVFVSRV9ESUFMT0dfSUQ6IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHRoaXMpLmluZmxhdGUoUi5sYXlvdXQuZ2V0X2ZlYXR1cmVzX3ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmFjY291bnRzX3Rlc3Rlcl9va19idXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0VGV4dCB2YWx1ZSA9IChFZGl0VGV4dCkgdmlldy5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aF90b2tlbl90eXBlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSA9IHZhbHVlLmdldFRleHQoKS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKEVkaXRUZXh0KSB2aWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmlkLmFjY291bnRzX3Rlc3Rlcl9mZWF0dXJlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVzID0gdmFsdWUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gbUxvbmdQcmVzc2VkQWNjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhUb2tlbkJ5RmVhdHVyZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRBdXRoZW50aWNhdG9yKCkudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGZlYXR1cmVzKSA/IG51bGwgOiBmZWF0dXJlcy5zcGxpdCgiICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRzVGVzdGVyLnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENhbGxiYWNrVG9EaWFsb2coQWNjb3VudHNUZXN0ZXIudGhpcywgInVwZGF0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogYWRkQWNjb3VudE9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBnZXRBdXRoVG9rZW5PcHRpb25zICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDYWxsYmFja1RvRGlhbG9nKEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0IGF1dGggdG9rZW4gYnkgZmVhdHVyZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGhhbmRsZXIgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWaWV3KHZpZXcpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRWaWV3KHZpZXcpOworICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRElBTE9HX0lEOiB7CisgICAgICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKG1EaWFsb2dNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoaWQgPT0gTUVTU0FHRV9ESUFMT0dfSUQpIHsKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKG1EaWFsb2dNZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZSgpOwotICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uQ3JlYXRlRGlhbG9nKGlkKTsKICAgICB9CiAKQEAgLTM0NCw3ICszOTYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQWNjb3VudE1hbmFnZXJDYWxsYmFjazxCdW5kbGU+IG5ld0F1dGhUb2tlbnNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgQWNjb3VudE1hbmFnZXJDYWxsYmFjazxCdW5kbGU+IG5ld0F1dGhUb2tlbnNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsCisgICAgICAgICAgICBTdHJpbmdbXSBmZWF0dXJlcykgewogICAgICAgICByZXR1cm4gbmV3IEdldEF1dGhUb2tlbkNhbGxiYWNrKHR5cGUsIGF1dGhUb2tlblR5cGUsIGZlYXR1cmVzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L0Nvbm5lY3Rpdml0eS5qYXZhIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQ29ubmVjdGl2aXR5LmphdmEKaW5kZXggNTkxNTdiZi4uYzcwMjllYyAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQ29ubmVjdGl2aXR5LmphdmEKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQ29ubmVjdGl2aXR5LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTU4LDE5ICs1OSwyNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5Sb3V0ZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkJhc2ljSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuRGVmYXVsdEh0dHBDbGllbnQ7CisKIHB1YmxpYyBjbGFzcyBDb25uZWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb25uZWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGV2VG9vbHMgLSBDb25uZWN0aXZpdHkiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RPR0dMRV9XSUZJID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfVE9HR0xFX1NDUkVFTiA9IDI7CiAKLSAgICBwcml2YXRlIEJ1dHRvbiBtRW5hYmxlV2lmaUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtRGlzYWJsZVdpZmlCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RhcnREZWxheWVkQ3ljbGVCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbVN0b3BEZWxheWVkQ3ljbGVCdXR0b247CiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtRENPbkR1cmF0aW9uRWRpdDsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1EQ09mZkR1cmF0aW9uRWRpdDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1EQ0N5Y2xlQ291bnRWaWV3OwpAQCAtNzgsOCArODcsNiBAQAogICAgIHByaXZhdGUgbG9uZyBtRENPZmZEdXJhdGlvbiA9IDEyMDAwMDsKICAgICBwcml2YXRlIGludCBtRENDeWNsZUNvdW50ID0gMDsKIAotICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydFNjcmVlbkN5Y2xlQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wU2NyZWVuQ3ljbGVCdXR0b247CiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtU0NPbkR1cmF0aW9uRWRpdDsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1TQ09mZkR1cmF0aW9uRWRpdDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TQ0N5Y2xlQ291bnRWaWV3OwpAQCAtODcsMTIgKzk0LDYgQEAKICAgICBwcml2YXRlIGxvbmcgbVNDT2ZmRHVyYXRpb24gPSAxMjAwMDsKICAgICBwcml2YXRlIGludCBtU0NDeWNsZUNvdW50ID0gMDsKIAotICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydE1tc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcE1tc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RhcnRIaVByaUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcEhpUHJpQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1DcmFzaEJ1dHRvbjsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsYXllZEN5Y2xlU3RhcnRlZCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBXaWZpTWFuYWdlciBtV207CkBAIC0xOTEsMTUgKzE5MiwxMSBAQAogICAgICAgICBtUG0gPSAoUG93ZXJNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAKLSAgICAgICAgbUVuYWJsZVdpZmlCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmVuYWJsZVdpZmkpOwotICAgICAgICBtRW5hYmxlV2lmaUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUVuYWJsZVdpZmlDbGlja2VkKTsKLSAgICAgICAgbURpc2FibGVXaWZpQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5kaXNhYmxlV2lmaSk7Ci0gICAgICAgIG1EaXNhYmxlV2lmaUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobURpc2FibGVXaWZpQ2xpY2tlZCk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmVuYWJsZVdpZmkpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmRpc2FibGVXaWZpKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOwogCi0gICAgICAgIG1TdGFydERlbGF5ZWRDeWNsZUJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RhcnREZWxheWVkQ3ljbGUpOwotICAgICAgICBtU3RhcnREZWxheWVkQ3ljbGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdGFydERlbGF5ZWRDeWNsZUNsaWNrZWQpOwotICAgICAgICBtU3RvcERlbGF5ZWRDeWNsZUJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RvcERlbGF5ZWRDeWNsZSk7Ci0gICAgICAgIG1TdG9wRGVsYXllZEN5Y2xlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3RvcERlbGF5ZWRDeWNsZUNsaWNrZWQpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdGFydERlbGF5ZWRDeWNsZSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RvcERlbGF5ZWRDeWNsZSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKICAgICAgICAgbURDT25EdXJhdGlvbkVkaXQgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQuZGNfd2lmaV9vbl9kdXJhdGlvbik7CiAgICAgICAgIG1EQ09uRHVyYXRpb25FZGl0LnNldFRleHQoTG9uZy50b1N0cmluZyhtRENPbkR1cmF0aW9uKSk7CiAgICAgICAgIG1EQ09mZkR1cmF0aW9uRWRpdCA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5kY193aWZpX29mZl9kdXJhdGlvbik7CkBAIC0yMDcsMTAgKzIwNCw4IEBACiAgICAgICAgIG1EQ0N5Y2xlQ291bnRWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmRjX3dpZmlfY3ljbGVzX2RvbmUpOwogICAgICAgICBtRENDeWNsZUNvdW50Vmlldy5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobURDQ3ljbGVDb3VudCkpOwogCi0gICAgICAgIG1TdGFydFNjcmVlbkN5Y2xlQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdGFydFNjcmVlbkN5Y2xlKTsKLSAgICAgICAgbVN0YXJ0U2NyZWVuQ3ljbGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdGFydFNjcmVlbkN5Y2xlQ2xpY2tlZCk7Ci0gICAgICAgIG1TdG9wU2NyZWVuQ3ljbGVCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0b3BTY3JlZW5DeWNsZSk7Ci0gICAgICAgIG1TdG9wU2NyZWVuQ3ljbGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdG9wU2NyZWVuQ3ljbGVDbGlja2VkKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRTY3JlZW5DeWNsZSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RvcFNjcmVlbkN5Y2xlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOwogICAgICAgICBtU0NPbkR1cmF0aW9uRWRpdCA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5zY193aWZpX29uX2R1cmF0aW9uKTsKICAgICAgICAgbVNDT25EdXJhdGlvbkVkaXQuc2V0VGV4dChMb25nLnRvU3RyaW5nKG1TQ09uRHVyYXRpb24pKTsKICAgICAgICAgbVNDT2ZmRHVyYXRpb25FZGl0ID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnNjX3dpZmlfb2ZmX2R1cmF0aW9uKTsKQEAgLTIxOCwxNiArMjEzLDIwIEBACiAgICAgICAgIG1TQ0N5Y2xlQ291bnRWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNjX3dpZmlfY3ljbGVzX2RvbmUpOwogICAgICAgICBtU0NDeWNsZUNvdW50Vmlldy5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobVNDQ3ljbGVDb3VudCkpOwogCi0gICAgICAgIG1TdGFydE1tc0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfbW1zKTsKLSAgICAgICAgbVN0YXJ0TW1zQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3RhcnRNbXNDbGlja2VkKTsKLSAgICAgICAgbVN0b3BNbXNCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0b3BfbW1zKTsKLSAgICAgICAgbVN0b3BNbXNCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdG9wTW1zQ2xpY2tlZCk7Ci0gICAgICAgIG1TdGFydEhpUHJpQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdGFydF9oaXByaSk7Ci0gICAgICAgIG1TdGFydEhpUHJpQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3RhcnRIaVByaUNsaWNrZWQpOwotICAgICAgICBtU3RvcEhpUHJpQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdG9wX2hpcHJpKTsKLSAgICAgICAgbVN0b3BIaVByaUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0b3BIaVByaUNsaWNrZWQpOwotICAgICAgICBtQ3Jhc2hCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmNyYXNoKTsKLSAgICAgICAgbUNyYXNoQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ3Jhc2hDbGlja2VkKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfbW1zKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5zdG9wX21tcykuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfaGlwcmkpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnN0b3BfaGlwcmkpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmNyYXNoKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworCisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFkZF9kZWZhdWx0X3JvdXRlKS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5yZW1vdmVfZGVmYXVsdF9yb3V0ZSkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYm91bmRfaHR0cF9yZXF1ZXN0KS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5ib3VuZF9zb2NrZXRfcmVxdWVzdCkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQucm91dGVkX2h0dHBfcmVxdWVzdCkuc2V0T25DbGlja0xpc3RlbmVyKG1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQucm91dGVkX3NvY2tldF9yZXF1ZXN0KS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5kZWZhdWx0X3JlcXVlc3QpLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmRlZmF1bHRfc29ja2V0KS5zZXRPbkNsaWNrTGlzdGVuZXIobUNsaWNrTGlzdGVuZXIpOwogCiAgICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBuZXcgSW50ZW50RmlsdGVyKENPTk5FQ1RJVklUWV9URVNUX0FMQVJNKSk7CiAgICAgfQpAQCAtMjM5LDYyICsyMzgsMTE0IEBACiAgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3RhcnREZWxheWVkQ3ljbGVDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1EZWxheWVkQ3ljbGVTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbURlbGF5ZWRDeWNsZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EQ09uRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtRENPbkR1cmF0aW9uRWRpdC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1EQ09mZkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobURDT2ZmRHVyYXRpb25FZGl0LmdldFRleHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9OwotICAgICAgICAgICAgICAgIG1EQ0N5Y2xlQ291bnQgPSAwOwotCi0gICAgICAgICAgICAgICAgbVdha2VMb2NrID0gbVBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywgIkNvbm5lY3Rpdml0eVRlc3QiKTsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyMi5zZW5kTWVzc2FnZShtSGFuZGxlcjIub2J0YWluTWVzc2FnZShFVkVOVF9UT0dHTEVfV0lGSSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdG9wRGVsYXllZEN5Y2xlQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGlmIChtRGVsYXllZEN5Y2xlU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG1EZWxheWVkQ3ljbGVTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtV2FrZUxvY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmKG1IYW5kbGVyMi5oYXNNZXNzYWdlcyhFVkVOVF9UT0dHTEVfV0lGSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIyLnJlbW92ZU1lc3NhZ2VzKEVWRU5UX1RPR0dMRV9XSUZJKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5lbmFibGVXaWZpOgorICAgICAgICAgICAgICAgICAgICBtV20uc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5kaXNhYmxlV2lmaToKKyAgICAgICAgICAgICAgICAgICAgbVdtLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0YXJ0RGVsYXllZEN5Y2xlOgorICAgICAgICAgICAgICAgICAgICBvblN0YXJ0RGVsYXllZEN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5zdG9wRGVsYXllZEN5Y2xlOgorICAgICAgICAgICAgICAgICAgICBvblN0b3BEZWxheWVkQ3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0YXJ0U2NyZWVuQ3ljbGU6CisgICAgICAgICAgICAgICAgICAgIG9uU3RhcnRTY3JlZW5DeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RvcFNjcmVlbkN5Y2xlOgorICAgICAgICAgICAgICAgICAgICBvblN0b3BTY3JlZW5DeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc3RhcnRfbW1zOgorICAgICAgICAgICAgICAgICAgICBtQ20uc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuRkVBVFVSRV9FTkFCTEVfTU1TKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0b3BfbW1zOgorICAgICAgICAgICAgICAgICAgICBtQ20uc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5GRUFUVVJFX0VOQUJMRV9NTVMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuZGVmYXVsdF9zb2NrZXQ6CisgICAgICAgICAgICAgICAgICAgIG9uRGVmYXVsdFNvY2tldCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuZGVmYXVsdF9yZXF1ZXN0OgorICAgICAgICAgICAgICAgICAgICBvbkRlZmF1bHRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5yb3V0ZWRfc29ja2V0X3JlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgIG9uUm91dGVkU29ja2V0UmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQucm91dGVkX2h0dHBfcmVxdWVzdDoKKyAgICAgICAgICAgICAgICAgICAgb25Sb3V0ZWRIdHRwUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuYm91bmRfc29ja2V0X3JlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgIG9uQm91bmRTb2NrZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5ib3VuZF9odHRwX3JlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgIG9uQm91bmRIdHRwUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQucmVtb3ZlX2RlZmF1bHRfcm91dGU6CisgICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlRGVmYXVsdFJvdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5hZGRfZGVmYXVsdF9yb3V0ZToKKyAgICAgICAgICAgICAgICAgICAgb25BZGREZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmNyYXNoOgorICAgICAgICAgICAgICAgICAgICBvbkNyYXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFydF9oaXByaToKKyAgICAgICAgICAgICAgICAgICAgbUNtLnN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX0hJUFJJKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLnN0b3BfaGlwcmk6CisgICAgICAgICAgICAgICAgICAgIG1DbS5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX0hJUFJJKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRW5hYmxlV2lmaUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtV20uc2V0V2lmaUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbURpc2FibGVXaWZpQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1XbS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9OwogCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3RhcnRTY3JlZW5DeWNsZUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0KKyAgICBwcml2YXRlIHZvaWQgb25TdGFydERlbGF5ZWRDeWNsZSgpIHsKKyAgICAgICAgaWYgKCFtRGVsYXllZEN5Y2xlU3RhcnRlZCkgeworICAgICAgICAgICAgbURlbGF5ZWRDeWNsZVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU0NPbkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobVNDT25EdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIG1TQ09mZkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobVNDT2ZmRHVyYXRpb25FZGl0LmdldFRleHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtRENPbkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobURDT25EdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1EQ09mZkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobURDT2ZmRHVyYXRpb25FZGl0LmdldFRleHQoKS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH07Ci0gICAgICAgICAgICBtU0NDeWNsZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1EQ0N5Y2xlQ291bnQgPSAwOwogCi0gICAgICAgICAgICBtU2NyZWVub25XYWtlTG9jayA9IG1QbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuRlVMTF9XQUtFX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlUZXN0Iik7Ci0gICAgICAgICAgICBtU2NyZWVub25XYWtlTG9jay5hY3F1aXJlKCk7Ci0KLSAgICAgICAgICAgIHNjaGVkdWxlQWxhcm0oMTAsIFNDUkVFTl9PRkYpOworICAgICAgICAgICAgbVdha2VMb2NrID0gbVBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5GVUxMX1dBS0VfTE9DSywgIkNvbm5lY3Rpdml0eVRlc3QiKTsKKyAgICAgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBtSGFuZGxlcjIuc2VuZE1lc3NhZ2UobUhhbmRsZXIyLm9idGFpbk1lc3NhZ2UoRVZFTlRfVE9HR0xFX1dJRkkpKTsKICAgICAgICAgfQotICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3RvcERlbGF5ZWRDeWNsZSgpIHsKKyAgICAgICAgaWYgKG1EZWxheWVkQ3ljbGVTdGFydGVkKSB7CisgICAgICAgICAgICBtRGVsYXllZEN5Y2xlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1XYWtlTG9jayA9IG51bGw7CisgICAgICAgICAgICBpZihtSGFuZGxlcjIuaGFzTWVzc2FnZXMoRVZFTlRfVE9HR0xFX1dJRkkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIyLnJlbW92ZU1lc3NhZ2VzKEVWRU5UX1RPR0dMRV9XSUZJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblN0YXJ0U2NyZWVuQ3ljbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU0NPbkR1cmF0aW9uID0gTG9uZy5wYXJzZUxvbmcobVNDT25EdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbVNDT2ZmRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhtU0NPZmZEdXJhdGlvbkVkaXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9OworICAgICAgICBtU0NDeWNsZUNvdW50ID0gMDsKKworICAgICAgICBtU2NyZWVub25XYWtlTG9jayA9IG1QbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuRlVMTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgIkNvbm5lY3Rpdml0eVRlc3QiKTsKKyAgICAgICAgbVNjcmVlbm9uV2FrZUxvY2suYWNxdWlyZSgpOworCisgICAgICAgIHNjaGVkdWxlQWxhcm0oMTAsIFNDUkVFTl9PRkYpOworICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUFsYXJtKGxvbmcgZGVsYXlNcywgU3RyaW5nIGV2ZW50VHlwZSkgewogICAgICAgICBBbGFybU1hbmFnZXIgYW0gPSAoQWxhcm1NYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKQEAgLTMxMCw0MiArMzYxLDE4OSBAQAogICAgICAgICBhbS5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIGRlbGF5TXMsIHApOwogICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0b3BTY3JlZW5DeWNsZUNsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgIH0KLSAgICB9OworICAgIHByaXZhdGUgdm9pZCBvblN0b3BTY3JlZW5DeWNsZSgpIHsKKyAgICB9CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdGFydE1tc0NsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ20uc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsIFBob25lLkZFQVRVUkVfRU5BQkxFX01NUyk7Ci0gICAgICAgIH0KLSAgICB9OworICAgIHByaXZhdGUgdm9pZCBvbkNyYXNoKCkgeworICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGZvbyA9IG51bGw7CisgICAgICAgIGZvby5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRSwKKyAgICAgICAgICAgICAgICBQaG9uZS5GRUFUVVJFX0VOQUJMRV9NTVMpOworICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0b3BNbXNDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUNtLnN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsIFBob25lLkZFQVRVUkVfRU5BQkxFX01NUyk7Ci0gICAgICAgIH0KLSAgICB9OworICAgIHByaXZhdGUgdm9pZCBvbkFkZERlZmF1bHRSb3V0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRSb3V0ZSgiZXRoMCIsICIwLjAuMC4wIiwgMCwgIjguOC44LjgiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KIAotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVN0YXJ0SGlQcmlDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUNtLnN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAotICAgICAgICAgICAgICAgICAgICBQaG9uZS5GRUFUVVJFX0VOQUJMRV9ISVBSSSk7Ci0gICAgICAgIH0KLSAgICB9OworICAgIHByaXZhdGUgdm9pZCBvblJlbW92ZURlZmF1bHRSb3V0ZSgpIHsKKyAgICAgICAgTG9nLmUoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIHJldHVybmVkICIrTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZSgiZXRoMCIpKTsKKyAgICB9CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdG9wSGlQcmlDbGlja2VkID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUNtLnN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCi0gICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX0hJUFJJKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSB2b2lkIG9uUm91dGVkSHR0cFJlcXVlc3QoKSB7CisgICAgICAgIG9uUm91dGVkUmVxdWVzdChIVFRQKTsKKyAgICB9CiAKLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DcmFzaENsaWNrZWQgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGZvbyA9IG51bGw7Ci0gICAgICAgICAgICBmb28uc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUsCi0gICAgICAgICAgICAgICAgICAgIFBob25lLkZFQVRVUkVfRU5BQkxFX01NUyk7CisgICAgcHJpdmF0ZSB2b2lkIG9uUm91dGVkU29ja2V0UmVxdWVzdCgpIHsKKyAgICAgICAgb25Sb3V0ZWRSZXF1ZXN0KFNPQ0tFVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNPQ0tFVCA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhUVFAgICA9IDI7CisKKyAgICBwcml2YXRlIHZvaWQgb25Sb3V0ZWRSZXF1ZXN0KGludCB0eXBlKSB7CisgICAgICAgIFN0cmluZyB1cmwgPSAid3d3Lmdvb2dsZS5jb20iOworCisgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHVybCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBmZXRjaGluZyBhZGRyZXNzIGZvciAiICsgdXJsKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIH07CisKKyAgICAgICAgbUNtLnJlcXVlc3RSb3V0ZVRvSG9zdEFkZHJlc3MoQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSwgaW5ldEFkZHJlc3MpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBTT0NLRVQ6CisgICAgICAgICAgICAgICAgb25Cb3VuZFNvY2tldFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSFRUUDoKKyAgICAgICAgICAgICAgICBIdHRwR2V0IGdldCA9IG5ldyBIdHRwR2V0KCJodHRwOi8vIiArIHVybCk7CisgICAgICAgICAgICAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgRGVmYXVsdEh0dHBDbGllbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicm91dGVkIGh0dHAgcmVxdWVzdCBnaXZlcyAiICsgaHR0cFJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicm91dGVkIGh0dHAgcmVxdWVzdCBleGNlcHRpb24gPSAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25Cb3VuZEh0dHBSZXF1ZXN0KCkgeworICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIG5ldHdvcmtJbnRlcmZhY2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV0d29ya0ludGVyZmFjZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKCJybW5ldDAiKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm5ldHdvcmtJbnRlcmZhY2UgaXMgIiArIG5ldHdvcmtJbnRlcmZhY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIGV4Y2VwdGlvbiBnZXRCeU5hbWU6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV0d29ya0ludGVyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBpbmV0QWRkcmVzc2VzcyA9IG5ldHdvcmtJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgICAgICAgd2hpbGUoaW5ldEFkZHJlc3Nlc3MuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIgaW5ldEFkZHJlc3M6IiArICgoSW5ldEFkZHJlc3MpaW5ldEFkZHJlc3Nlc3MubmV4dEVsZW1lbnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSHR0cFBhcmFtcyBodHRwUGFyYW1zID0gbmV3IEJhc2ljSHR0cFBhcmFtcygpOworICAgICAgICBpZiAobmV0d29ya0ludGVyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBDb25uUm91dGVQYXJhbXMuc2V0TG9jYWxBZGRyZXNzKGh0dHBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisgICAgICAgIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQoImh0dHA6Ly93d3cuYmJjLmNvbSIpOworICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudChodHRwUGFyYW1zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC5leGVjdXRlKGdldCk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyZXNwb25zZSBjb2RlID0gIiArIHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gPSAiKyBlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25Cb3VuZFNvY2tldFJlcXVlc3QoKSB7CisgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXR3b3JrSW50ZXJmYWNlID0gTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoInJtbmV0MCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhjZXB0aW9uIGdldEJ5TmFtZTogIiArIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChuZXR3b3JrSW50ZXJmYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ2V0dGluZyBhbnkgbmV0d29ya0ludGVyZmFjZSIpOworICAgICAgICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2UgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCkubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhjZXB0aW9uIGdldHRpbmcgYW55IG5ldHdvcmtJbnRlcmZhY2U6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ldHdvcmtJbnRlcmZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiY291bGRuJ3QgZmluZCBhIGxvY2FsIGludGVyZmFjZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIGluZXRBZGRyZXNzZXNzID0gbmV0d29ya0ludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICAgIHdoaWxlKGluZXRBZGRyZXNzZXNzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICIgYWRkcjoiICsgKChJbmV0QWRkcmVzcylpbmV0QWRkcmVzc2Vzcy5uZXh0RWxlbWVudCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgSW5ldEFkZHJlc3MgbG9jYWwgPSBudWxsOworICAgICAgICBJbmV0QWRkcmVzcyByZW1vdGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jYWwgPSBuZXR3b3JrSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKS5uZXh0RWxlbWVudCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhjZXB0aW9uIGdldHRpbmcgbG9jYWwgSW5ldEFkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVtb3RlID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJ3d3cuZmxpY2tyLmNvbSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhjZXB0aW9uIGdldHRpbmcgcmVtb3RlIEluZXRBZGRyZXNzOiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmQoVEFHLCAicmVtb3RlIGFkZHIgPSIrcmVtb3RlKTsKKyAgICAgICAgTG9nLmQoVEFHLCAibG9jYWwgYWRkciA9Iitsb2NhbCk7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldChyZW1vdGUsIDgwLCBsb2NhbCwgNjAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gY3JlYXRpbmcgc29ja2V0OiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIHRydWUpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIkhpIGZsaWNrciIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHdyaXRpbmcgdG8gc29ja2V0OiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25EZWZhdWx0UmVxdWVzdCgpIHsKKyAgICAgICAgSHR0cFBhcmFtcyBwYXJhbXMgPSBuZXcgQmFzaWNIdHRwUGFyYW1zKCk7CisgICAgICAgIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQoImh0dHA6Ly93d3cuY25uLmNvbSIpOworICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudChwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0KTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInJlc3BvbnNlIGNvZGUgPSAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiA9ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkRlZmF1bHRTb2NrZXQoKSB7CisgICAgICAgIEluZXRBZGRyZXNzIHJlbW90ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZW1vdGUgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoInd3dy5mbGlja3IuY29tIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJleGNlcHRpb24gZ2V0dGluZyByZW1vdGUgSW5ldEFkZHJlc3M6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJyZW1vdGUgYWRkciA9IiArIHJlbW90ZSk7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc29ja2V0ID0gbmV3IFNvY2tldChyZW1vdGUsIDgwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBjcmVhdGluZyBzb2NrZXQ6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgdHJ1ZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiSGkgZmxpY2tyIik7CisgICAgICAgICAgICBMb2cuZShUQUcsICJ3cml0dGVuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gd3JpdGluZyB0byBzb2NrZXQ6ICIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L0RldmVsb3BtZW50U2V0dGluZ3MuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L0RldmVsb3BtZW50U2V0dGluZ3MuamF2YQppbmRleCBjMDFlYTU5Li5mOTA3YTE0IDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9EZXZlbG9wbWVudFNldHRpbmdzLmphdmEKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvRGV2ZWxvcG1lbnRTZXR0aW5ncy5qYXZhCkBAIC0yMywyMyArMjMsMjYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKQEAgLTUzLDYgKzU2LDcgQEAKICAgICBwcml2YXRlIENoZWNrQm94IG1XYWl0Rm9yRGVidWdnZXJDQjsKICAgICBwcml2YXRlIENoZWNrQm94IG1BbHdheXNGaW5pc2hDQjsKICAgICBwcml2YXRlIFNwaW5uZXIgbVBvaW50ZXJMb2NhdGlvblNwaW5uZXI7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1TdHJpY3RNb2RlVmlzdWFsU3Bpbm5lcjsKICAgICBwcml2YXRlIENoZWNrQm94IG1TaG93TG9hZENCOwogICAgIHByaXZhdGUgQ2hlY2tCb3ggbVNob3dDcHVDQjsKICAgICBwcml2YXRlIENoZWNrQm94IG1FbmFibGVHTENCOwpAQCAtNjAsNiArNjQsNyBAQAogICAgIHByaXZhdGUgQ2hlY2tCb3ggbVNob3dCYWNrZ3JvdW5kQ0I7CiAgICAgcHJpdmF0ZSBDaGVja0JveCBtU2hvd1NsZWVwQ0I7CiAgICAgcHJpdmF0ZSBDaGVja0JveCBtU2hvd1htcHBDQjsKKyAgICBwcml2YXRlIENoZWNrQm94IG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ0I7CiAgICAgcHJpdmF0ZSBDaGVja0JveCBtQ29tcGF0aWJpbGl0eU1vZGVDQjsKICAgICBwcml2YXRlIFNwaW5uZXIgbU1heFByb2NzU3Bpbm5lcjsKICAgICBwcml2YXRlIFNwaW5uZXIgbVdpbmRvd0FuaW1hdGlvblNjYWxlU3Bpbm5lcjsKQEAgLTcwLDYgKzc1LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRGb3JEZWJ1Z2dlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbUFsd2F5c0ZpbmlzaDsKICAgICBwcml2YXRlIGludCBtUG9pbnRlckxvY2F0aW9uOworICAgIHByaXZhdGUgaW50IG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nOwogICAgIHByaXZhdGUgaW50IG1Qcm9jZXNzTGltaXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93U2xlZXA7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93WG1wcDsKQEAgLTEwNiw2ICsxMTIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJQb2ludGVyIExvY2F0aW9uIiB9KTsKICAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOwogICAgICAgICBtUG9pbnRlckxvY2F0aW9uU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtU3RyaWN0TW9kZVZpc3VhbFNwaW5uZXIgPSAoU3Bpbm5lcilmaW5kVmlld0J5SWQoUi5pZC5zdHJpY3Rtb2RlX3Zpc3VhbCk7CisgICAgICAgIGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpY3RNb2RlIHZpc3VhbCBpbmRpY2F0b3I6IGJ1aWxkIHZhcmlhbnQgZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaWN0TW9kZSB2aXN1YWwgaW5kaWNhdG9yOiBvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaWN0TW9kZSB2aXN1YWwgaW5kaWNhdG9yOiBvZmYiIH0pOworICAgICAgICBhZGFwdGVyLnNldERyb3BEb3duVmlld1Jlc291cmNlKGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSk7CisgICAgICAgIG1TdHJpY3RNb2RlVmlzdWFsU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtU3RyaWN0TW9kZVZpc3VhbFNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtU3RyaWN0TW9kZVZpc3VhbENoYW5nZWQpOwogICAgICAgICBtU2hvd0xvYWRDQiA9IChDaGVja0JveClmaW5kVmlld0J5SWQoUi5pZC5zaG93X2xvYWQpOwogICAgICAgICBtU2hvd0xvYWRDQi5zZXRPbkNsaWNrTGlzdGVuZXIobVNob3dMb2FkQ2xpY2tlZCk7CiAgICAgICAgIG1TaG93Q3B1Q0IgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQuc2hvd19jcHUpOwpAQCAtMTIxLDYgKzEzOCw4IEBACiAgICAgICAgIG1TaG93U2xlZXBDQi5zZXRPbkNsaWNrTGlzdGVuZXIobVNob3dTbGVlcENsaWNrZWQpOwogICAgICAgICBtU2hvd1htcHBDQiA9IChDaGVja0JveClmaW5kVmlld0J5SWQoUi5pZC5zaG93X3htcHApOwogICAgICAgICBtU2hvd1htcHBDQi5zZXRPbkNsaWNrTGlzdGVuZXIobVNob3dYbXBwQ2xpY2tlZCk7CisgICAgICAgIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ0IgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQud2luZG93X29yaWVudGF0aW9uX2xpc3RlbmVyX2xvZyk7CisgICAgICAgIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ0Iuc2V0T25DbGlja0xpc3RlbmVyKG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ2xpY2tlZCk7CiAgICAgICAgIG1Db21wYXRpYmlsaXR5TW9kZUNCID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLmNvbXBhdGliaWxpdHlfbW9kZSk7CiAgICAgICAgIG1Db21wYXRpYmlsaXR5TW9kZUNCLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ29tcGF0aWJpbGl0eU1vZGVDbGlja2VkKTsKICAgICAgICAgbU1heFByb2NzU3Bpbm5lciA9IChTcGlubmVyKWZpbmRWaWV3QnlJZChSLmlkLm1heF9wcm9jcyk7CkBAIC0xODIsMTEgKzIwMSwxMyBAQAogICAgICAgICB1cGRhdGVEZWJ1Z09wdGlvbnMoKTsKICAgICAgICAgdXBkYXRlRmluaXNoT3B0aW9ucygpOwogICAgICAgICB1cGRhdGVQb2ludGVyTG9jYXRpb25PcHRpb25zKCk7CisgICAgICAgIHVwZGF0ZVN0cmljdE1vZGVWaXN1YWxPcHRpb25zKCk7CiAgICAgICAgIHVwZGF0ZVByb2Nlc3NMaW1pdE9wdGlvbnMoKTsKICAgICAgICAgdXBkYXRlU2hhcmVkT3B0aW9ucygpOwogICAgICAgICB1cGRhdGVGbGluZ2VyT3B0aW9ucygpOwogICAgICAgICB1cGRhdGVTbGVlcE9wdGlvbnMoKTsKICAgICAgICAgdXBkYXRlWG1wcE9wdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlV2luZG93T3JpZW50YXRpb25MaXN0ZW5lckxvZ09wdGlvbnMoKTsKICAgICAgICAgdXBkYXRlQ29tcGF0aWJpbGl0eU9wdGlvbnMoKTsKIAogICAgICAgICB0cnkgewpAQCAtMjQ1LDYgKzI2NiwzNSBAQAogICAgICAgICBtUG9pbnRlckxvY2F0aW9uU3Bpbm5lci5zZXRTZWxlY3Rpb24obVBvaW50ZXJMb2NhdGlvbik7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlV2luZG93T3JpZW50YXRpb25MaXN0ZW5lckxvZ09wdGlvbnMoKSB7CisgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJTkRPV19PUklFTlRBVElPTl9MSVNURU5FUl9MT0csIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlV2luZG93T3JpZW50YXRpb25MaXN0ZW5lckxvZ09wdGlvbnMoKSB7CisgICAgICAgIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChnZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lORE9XX09SSUVOVEFUSU9OX0xJU1RFTkVSX0xPRywgMCk7CisgICAgICAgIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ0Iuc2V0Q2hlY2tlZChtV2luZG93T3JpZW50YXRpb25MaXN0ZW5lckxvZyAhPSAwKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgdGhhdCBjb250cm9scworICAgIC8vIHN0cmljdG1vZGUgZmxhc2hlcy4gIE9uZSBvZjoKKyAgICAvLyAgICAwOiBub3QgZXhwbGljaXRseSBzZXQgb25lIHdheSBvciBhbm90aGVyCisgICAgLy8gICAgMTogb24KKyAgICAvLyAgICAyOiBvZmYKKyAgICAvLyBUaGVzZSBhcmUgdGhlIGluZGljZXMgaW4gdGhlIFNwaW5uZXIncyBBcnJheUFkYXB0ZXIuCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudFN0cmljdE1vZGVBY3RpdmVJbmRleCgpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KFN5c3RlbVByb3BlcnRpZXMuZ2V0KFN0cmljdE1vZGUuVklTVUFMX1BST1BFUlRZKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbihTdHJpY3RNb2RlLlZJU1VBTF9QUk9QRVJUWSwgZmFsc2UpOworICAgICAgICByZXR1cm4gZW5hYmxlZCA/IDEgOiAyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdHJpY3RNb2RlVmlzdWFsT3B0aW9ucygpIHsKKyAgICAgICAgbVN0cmljdE1vZGVWaXN1YWxTcGlubmVyLnNldFNlbGVjdGlvbihjdXJyZW50U3RyaWN0TW9kZUFjdGl2ZUluZGV4KCkpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB3cml0ZVByb2Nlc3NMaW1pdE9wdGlvbnMoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnNldFByb2Nlc3NMaW1pdChtUHJvY2Vzc0xpbWl0KTsKQEAgLTQ0NCw2ICs0OTQsMTMgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nQ2xpY2tlZCA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nID0gKChDaGVja0JveCl2KS5pc0NoZWNrZWQoKSA/IDEgOiAwOworICAgICAgICAgICAgd3JpdGVXaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyTG9nT3B0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKwogICAgIHByaXZhdGUgU3Bpbm5lci5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1Qb2ludGVyTG9jYXRpb25DaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTcGlubmVyLk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IGF2LCBWaWV3IHYsCkBAIC00NTYsNiArNTEzLDQxIEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBTcGlubmVyLk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbVN0cmljdE1vZGVWaXN1YWxDaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBTcGlubmVyLk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IGF2LCBWaWV3IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBjdXJyZW50U3RyaWN0TW9kZUFjdGl2ZUluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZXhpc3RpbmcgcG9zaXRpb24sIHNvIGRvbid0IHNob3cgYSBUb2FzdC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6ICAvLyBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5zZXRTdHJpY3RNb2RlVmlzdWFsSW5kaWNhdG9yUHJlZmVyZW5jZSgiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLnNldFN0cmljdE1vZGVWaXN1YWxJbmRpY2F0b3JQcmVmZXJlbmNlKCIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5zZXRTdHJpY3RNb2RlVmlzdWFsSW5kaWNhdG9yUHJlZmVyZW5jZSgiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJFcnJvciBjYWxsaW5nIHNldFN0cmljdE1vZGVWaXN1YWxJbmRpY2F0b3JQcmVmZXJlbmNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KAorICAgICAgICAgICAgICAgICAgICBEZXZlbG9wbWVudFNldHRpbmdzLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIGNoYW5nZWQ7IHdpbGwgdGFrZSBlZmZlY3QgcGVyLWFwcCBuZXh0IGxhdW5jaCwgb3Igb24gcmVib290IiwKKyAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcpLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3IGF2KSB7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgcHJpdmF0ZSBTcGlubmVyLk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbU1heFByb2NzQ2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgU3Bpbm5lci5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewogICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyBhdiwgVmlldyB2LApkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L01lZGlhU2Nhbm5lckFjdGl2aXR5LmphdmEKaW5kZXggZjc4OTEwYS4uMDRmNjQxNCAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9NZWRpYVNjYW5uZXJBY3Rpdml0eS5qYXZhCkBAIC0xNyw1NiArMTcsMjM5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmRldmVsb3BtZW50OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCiBwdWJsaWMgY2xhc3MgTWVkaWFTY2FubmVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQogeworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHByaXZhdGUgaW50IG1OdW1Ub0luc2VydCA9IDIwOworICAgIHByaXZhdGUgaW50IG1BcnRpc3RzOworICAgIHByaXZhdGUgaW50IG1BbGJ1bXM7CisgICAgcHJpdmF0ZSBpbnQgbVNvbmdzOworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICBwcml2YXRlIFVyaSBtQXVkaW9Vcmk7CisgICAgQ29udGVudFZhbHVlcyBtVmFsdWVzW10gPSBuZXcgQ29udGVudFZhbHVlc1sxMF07CisgICAgUmFuZG9tIG1SYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKICAgICBwdWJsaWMgTWVkaWFTY2FubmVyQWN0aXZpdHkoKSB7CiAgICAgfQotIAorCiAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkIG9yIHJlc3VtZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tZWRpYV9zY2FubmVyX2FjdGl2aXR5KTsKLSAgICAgICAgCisKICAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX1NUQVJURUQpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9GSU5JU0hFRCk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGREYXRhU2NoZW1lKCJmaWxlIik7CiAgICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOwotICAgICAgICAKLSAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgotICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7Ci0gICAgICAgICAgICAKKworICAgICAgICBFZGl0VGV4dCB0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5udW1zb25ncyk7CisgICAgICAgIHQuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1OdW1Ub0luc2VydCA9IEludGVnZXIudmFsdWVPZih0ZXh0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVRvSW5zZXJ0ID0gMjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKICAgICAgICAgbVRpdGxlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIG1UaXRsZS5zZXRUZXh0KCJTZW50IEFDVElPTl9NRURJQV9NT1VOVEVEIHRvIHRyaWdnZXIgdGhlIE1lZGlhIFNjYW5uZXIuIik7CisgICAgICAgIG1SZXNvbHZlciA9IGdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBtQXVkaW9VcmkgPSBNZWRpYVN0b3JlLkF1ZGlvLk1lZGlhLkVYVEVSTkFMX0NPTlRFTlRfVVJJOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbVZhbHVlc1tpXSA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpOwogICAgIH0KIAogICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgZ29pbmcgaW50byB0aGUgYmFja2dyb3VuZCBvciBiZWluZyBkZXN0cm95ZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIG1JbnNlcnRIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9TVEFSVEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsgICAgIAorICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX0ZJTklTSEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIGZpbmlzaGVkIHNjYW5uaW5nICIgKyBpbnRlbnQuZ2V0RGF0YSgpLmdldFBhdGgoKSk7ICAgICAKKyAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dCgiTWVkaWEgU2Nhbm5lciBmaW5pc2hlZCBzY2FubmluZyAiICsgaW50ZW50LmdldERhdGEoKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NhbihWaWV3IHYpIHsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgorICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7CisKKyAgICAgICAgbVRpdGxlLnNldFRleHQoIlNlbnQgQUNUSU9OX01FRElBX01PVU5URUQgdG8gdHJpZ2dlciB0aGUgTWVkaWEgU2Nhbm5lci4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpIHsKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmluc2VydGJ1dHRvbiwgSW50ZWdlci52YWx1ZU9mKG1OdW1Ub0luc2VydCkpOworICAgICAgICBCdXR0b24gYiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmluc2VydGJ1dHRvbik7CisgICAgICAgIGIuc2V0VGV4dChsYWJlbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRJdGVtcyhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JbnNlcnRIYW5kbGVyLmhhc01lc3NhZ2VzKDApKSB7CisgICAgICAgICAgICBtSW5zZXJ0SGFuZGxlci5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnNlcnRIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIYW5kbGVyIG1JbnNlcnRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisKKyAgICAgICAgICAgIGlmIChtTnVtVG9JbnNlcnQtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBbGJ1bSgpOworICAgICAgICAgICAgICAgIHJ1bk9uVWlUaHJlYWQobURpc3BsYXlVcGRhdGVyKTsKKworICAgICAgICAgICAgICAgIGlmICghaXNGaW5pc2hpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtRGlzcGxheVVwZGF0ZXIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJBZGRlZCAiICsgbUFydGlzdHMgKyAiIGFydGlzdHMsICIgKyBtQWxidW1zICsgIiBhbGJ1bXMsICIKKyAgICAgICAgICAgICAgICAgICAgKyBtU29uZ3MgKyAiIHNvbmdzLiIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEFkZCBvbmUgbW9yZSBhbGJ1bSAod2l0aCAxMCBzb25ncykgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIHdpbGwgYmUgYSBjb21waWxhdGlvbiBhbGJ1bSwKKyAgICAvLyB3aXRoIG9uZSBhbGJ1bSBhcnRpc3QgZm9yIHRoZSBhbGJ1bSwgYW5kIGEgc2VwYXJhdGUgYXJ0aXN0IGZvciBlYWNoIHNvbmcuCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsYnVtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGFsYnVtQXJ0aXN0ID0gIlZhcmlvdXMgQXJ0aXN0cyI7CisgICAgICAgICAgICBTdHJpbmcgYWxidW1OYW1lID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgICAgIGludCBiYXNlWWVhciA9IDE5NjkgKyBtUmFuZG9tLm5leHRJbnQoMzApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcnRpc3QgPSBnZXRSYW5kb21OYW1lKCk7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBtYXAgPSBtVmFsdWVzW2ldOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYm9ndXMvIiArIGFsYnVtTmFtZSArICIvIiArIGFydGlzdCArICJfIiArIGkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSYW5kb21Xb3JkKDQpICsgIiAiICsgZ2V0UmFuZG9tV29yZCgyKSArICIgIiArIChpICsgMSkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUlNRV9UWVBFLCAiYXVkaW8vbXAzIik7CisKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLkFSVElTVCwgYXJ0aXN0KTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KCJhbGJ1bV9hcnRpc3QiLCBhbGJ1bUFydGlzdCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5BTEJVTSwgYWxidW1OYW1lKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLlRSQUNLLCBpICsgMSk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5EVVJBVElPTiwgNCo2MCoxMDAwKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLklTX01VU0lDLCAxKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLllFQVIsIGJhc2VZZWFyICsgbVJhbmRvbS5uZXh0SW50KDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVzb2x2ZXIuYnVsa0luc2VydChtQXVkaW9VcmksIG1WYWx1ZXMpOworICAgICAgICAgICAgbVNvbmdzICs9IDEwOworICAgICAgICAgICAgbUFsYnVtcysrOworICAgICAgICAgICAgbUFydGlzdHMgKz0gMTE7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5kKCJAQEBAIiwgImluc2VydCBmYWlsZWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21lIGNvZGUgdG8gZ2VuZXJhdGUgcmFuZG9tIG5hbWVzLiBUaGlzIGp1c3Qgc3RyaW5ncyB0b2dldGhlciByYW5kb20KKyAgICAgKiBzeWxsYWJsZXMsIGFuZCByYW5kb21seSBpbnNlcnRzIGEgbW9kaWZpZXIgYmV0d2VlbiB0aGUgZmlyc3QKKyAgICAgKiBhbmQgbGFzdCBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFiIiwgImFtIiwKKyAgICAgICAgICAgICJicmEiLCAiYnJpIiwKKyAgICAgICAgICAgICJjaSIsICJjbyIsCisgICAgICAgICAgICAiZGUiLCAiZGkiLCAiZG8iLAorICAgICAgICAgICAgImZhIiwgImZpIiwKKyAgICAgICAgICAgICJraSIsCisgICAgICAgICAgICAibGEiLCAibGkiLAorICAgICAgICAgICAgIm1hIiwgIm1lIiwgIm1pIiwgIm1vIiwKKyAgICAgICAgICAgICJuYSIsICJuaSIsCisgICAgICAgICAgICAicGEiLAorICAgICAgICAgICAgInRhIiwgInRpIiwKKyAgICAgICAgICAgICJ2aSIsICJ2byIKKyAgICB9OworCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmFuZG9tV29yZChpbnQgbGVuKSB7CisgICAgICAgIGludCBtYXggPSBlbGVtZW50cy5sZW5ndGg7CisgICAgICAgIG1CdWlsZGVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVsZW1lbnRzW21SYW5kb20ubmV4dEludChtYXgpXSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjID0gbUJ1aWxkZXIuY2hhckF0KDApOworICAgICAgICBjID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOworICAgICAgICBtQnVpbGRlci5zZXRDaGFyQXQoMCwgYyk7CisgICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFJhbmRvbU5hbWUoKSB7CisgICAgICAgIGJvb2xlYW4gbG9uZ2ZpcnN0ID0gbVJhbmRvbS5uZXh0SW50KDUpIDwgMzsKKyAgICAgICAgU3RyaW5nIGZpcnN0ID0gZ2V0UmFuZG9tV29yZChsb25nZmlyc3QgPyAzIDogMik7CisgICAgICAgIFN0cmluZyBsYXN0ID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgc3dpdGNoIChtUmFuZG9tLm5leHRJbnQoNikpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoIWxhc3Quc3RhcnRzV2l0aCgiRGkiKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gImRpICIgKyBsYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsYXN0ID0gInZhbiAiICsgbGFzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBsYXN0ID0gImRlICIgKyBsYXN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXJzdCArICIgIiArIGxhc3Q7CisgICAgfQorCisKKwogfQpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvUGFja2FnZUJyb3dzZXIuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BhY2thZ2VCcm93c2VyLmphdmEKaW5kZXggNjg5MTgzZC4uZWIwMTNiYSAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvUGFja2FnZUJyb3dzZXIuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9QYWNrYWdlQnJvd3Nlci5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CkBAIC0xNDMsOCArMTQ0LDkgQEAKICAgICAgICAgICAgIGlmIChwYWNrYWdlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZ2V0UGFja2FnZU1hbmFnZXIoKS5kZWxldGVQYWNrYWdlKHBhY2thZ2VJbmZvLmluZm8ucGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJUGFja2FnZURlbGV0ZU9ic2VydmVyLlN0dWIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhY2thZ2VEZWxldGVkKGJvb2xlYW4gc3VjY2VlZGVkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFja2FnZURlbGV0ZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcmV0dXJuQ29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFBhY2thZ2VNYW5hZ2VyLkRFTEVURV9TVUNDRUVERUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZUluZm9MaXN0LnJlbW92ZShjdXJTZWxlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvU3luY0FkYXB0ZXJEcml2ZXIuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1N5bmNBZGFwdGVyRHJpdmVyLmphdmEKaW5kZXggYTkxZTBlZC4uMGZkZTczMiAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvU3luY0FkYXB0ZXJEcml2ZXIuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9TeW5jQWRhcHRlckRyaXZlci5qYXZhCkBAIC0zNjcsNyArMzY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TeW5jQWRhcHRlcl91c2VyVmlzaWJsZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0c1VwbG9hZGluZyA9IHNhLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TeW5jQWRhcHRlcl9zdXBwb3J0c1VwbG9hZGluZywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jQWRhcHRlclR5cGUoYXV0aG9yaXR5LCBhY2NvdW50VHlwZSwgdXNlclZpc2libGUsIHN1cHBvcnRzVXBsb2FkaW5nKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzQWx3YXlzU3luY2FibGUgPSBzYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3luY0FkYXB0ZXJfaXNBbHdheXNTeW5jYWJsZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dQYXJhbGxlbFN5bmNzID0gc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlN5bmNBZGFwdGVyX2FsbG93UGFyYWxsZWxTeW5jcywgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY0FkYXB0ZXJUeXBlKGF1dGhvcml0eSwgYWNjb3VudFR5cGUsIHVzZXJWaXNpYmxlLCBzdXBwb3J0c1VwbG9hZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQWx3YXlzU3luY2FibGUsIGFsbG93UGFyYWxsZWxTeW5jcyk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2FwcHMvR2VzdHVyZUJ1aWxkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvR2VzdHVyZUJ1aWxkZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA5YzJmNzk5Li5kNDU2NWEzIDEwMDY0NAotLS0gYS9hcHBzL0dlc3R1cmVCdWlsZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9HZXN0dXJlQnVpbGRlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw3ICsxOSw4IEBACiAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2VzdHVyZS5idWlsZGVyIj4KIAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KLQorICAgIAorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjExIi8+CiAgICAgPGFwcGxpY2F0aW9uPgogCiAgICAgICAgIDxhY3Rpdml0eQpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkLm1rIGIvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRkMTE0Li4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR3JhcGhpY3NMYWIKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL0dyYXBoaWNzTGFiL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWM0ZmEuLjAwMDAwMDAKLS0tIGEvYXBwcy9HcmFwaGljc0xhYi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmFuZHJvaWQuZ3JhcGhpY3NsYWIiPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcyBMYWIiPgotCQk8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHcmFwaGljc0xhYiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotCQk8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9yZXMvZHJhd2FibGUvYmVhY2guanBnIGIvYXBwcy9HcmFwaGljc0xhYi9yZXMvZHJhd2FibGUvYmVhY2guanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk3OTRmLi4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL2JlYWNoLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL25ld3NfaW1nLmpwZyBiL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2RyYXdhYmxlL25ld3NfaW1nLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNWVjYi4uMDAwMDAwMAotLS0gYS9hcHBzL0dyYXBoaWNzTGFiL3Jlcy9kcmF3YWJsZS9uZXdzX2ltZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL3Jlcy9sYXlvdXQvZ3JhcGhpY3NfbGFiLnhtbCBiL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBlNWQ5Li4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvcmVzL2xheW91dC9ncmFwaGljc19sYWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIiBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKLSAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCI+ICAgICAgICAKLTwvTGluZWFyTGF5b3V0PgotCi0KZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvc3JjL2NvbS9hbmRyb2lkL2dyYXBoaWNzbGFiL0dyYXBoaWNzTGFiLmphdmEgYi9hcHBzL0dyYXBoaWNzTGFiL3NyYy9jb20vYW5kcm9pZC9ncmFwaGljc2xhYi9HcmFwaGljc0xhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDVhYzViLi4wMDAwMDAwCi0tLSBhL2FwcHMvR3JhcGhpY3NMYWIvc3JjL2NvbS9hbmRyb2lkL2dyYXBoaWNzbGFiL0dyYXBoaWNzTGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ3JhcGhpY3NsYWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MudXRpbHMuKjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudmlldy4qOwotCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NMYWIgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHVibGljIEdyYXBoaWNzTGFiKCkge30KLQotICAgIHByaXZhdGUgaW50IG1DdXJyVmlldyA9IDE7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTYW1wbGVWaWV3KHRoaXMpKTsKLS8vICAgICAgICBzZXRUaXRsZSgiR3JhcGhpY3MgTGFiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgIGlmIChtQ3VyclZpZXcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2FtcGxlVmlldzIodGhpcykpOwotICAgICAgICAgICAgICAgICAgICBtQ3VyclZpZXcgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTYW1wbGVWaWV3KHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJWaWV3ID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FtcGxlVmlldzIgZXh0ZW5kcyBWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPV1MgPSAxNjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFMgPSAxNjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOU1RSRVRDSF9NU0VDID0gMjUwOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycDsKLSAgICAgICAgcHJpdmF0ZSBCb3VuZGFyeVBhdGNoIG1QYXRjaDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdFtdIG1DdWJpY3M7Ci0gICAgICAgIHByaXZhdGUgZmxvYXRbXSBtT3JpZyA9IG5ldyBmbG9hdFsyNF07Ci0gICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50MDsKLSAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQxOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyckluZGV4ID0gLTE7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVByZXZYOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1QcmV2WTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTYW1wbGVWaWV3MihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGdldFJlc291cmNlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLm5ld3NfaW1nKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbVBhdGNoID0gbmV3IEJvdW5kYXJ5UGF0Y2goKTsKLSAgICAgICAgICAgIG1QYXRjaC5zZXRUZXh0dXJlKGJtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmxvYXQgdW5pdCA9IDkwOwotICAgICAgICAgICAgbUN1YmljcyA9IG5ldyBmbG9hdFtdIHsKLSAgICAgICAgICAgICAgICAwLCAwLCAxLCAwLCAyLCAwLAotICAgICAgICAgICAgICAgIDMsIDAsIDMsIDEsIDMsIDIsCi0gICAgICAgICAgICAgICAgMywgMywgMiwgMywgMSwgMywKLSAgICAgICAgICAgICAgICAwLCAzLCAwLCAyLCAwLCAxCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUN1Ymljc1tpXSAqPSA5MDsKLSAgICAgICAgICAgICAgICBtQ3ViaWNzW2ldICs9IDIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVidWlsZFBhdGNoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1QYWludDAgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgIG1QYWludDAuc2V0QW50aUFsaWFzKHRydWUpOwotICAgICAgICAgICAgbVBhaW50MC5zZXRTdHJva2VXaWR0aCgxMik7Ci0gICAgICAgICAgICBtUGFpbnQwLnNldFN0cm9rZUNhcChQYWludC5DYXAuUk9VTkQpOwotICAgICAgICAgICAgbVBhaW50MSA9IG5ldyBQYWludChtUGFpbnQwKTsKLSAgICAgICAgICAgIG1QYWludDEuc2V0Q29sb3IoMHhGRkZGRkZGRik7Ci0gICAgICAgICAgICBtUGFpbnQxLnNldFN0cm9rZVdpZHRoKDEwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IG53LCBpbnQgbmgsIGludCBvdywgaW50IG9oKSB7Ci0gICAgICAgICAgICBmbG9hdFtdIHB0cyA9IG1DdWJpY3M7Ci0gICAgICAgICAgICBmbG9hdCB4MSA9IG53KjAuMzMzM2Y7Ci0gICAgICAgICAgICBmbG9hdCB5MSA9IG5oKjAuMzMzM2Y7Ci0gICAgICAgICAgICBmbG9hdCB4MiA9IG53KjAuNjY2N2Y7Ci0gICAgICAgICAgICBmbG9hdCB5MiA9IG5oKjAuNjY2N2Y7Ci0gICAgICAgICAgICBwdHNbMCoyKzBdID0gMDsgIHB0c1swKjIrMV0gPSAwOwotICAgICAgICAgICAgcHRzWzEqMiswXSA9IHgxOyBwdHNbMSoyKzFdID0gMDsKLSAgICAgICAgICAgIHB0c1syKjIrMF0gPSB4MjsgcHRzWzIqMisxXSA9IDA7Ci0KLSAgICAgICAgICAgIHB0c1szKjIrMF0gPSBudzsgcHRzWzMqMisxXSA9IDA7Ci0gICAgICAgICAgICBwdHNbNCoyKzBdID0gbnc7IHB0c1s0KjIrMV0gPSB5MTsKLSAgICAgICAgICAgIHB0c1s1KjIrMF0gPSBudzsgcHRzWzUqMisxXSA9IHkyOwotCi0gICAgICAgICAgICBwdHNbNioyKzBdID0gbnc7IHB0c1s2KjIrMV0gPSBuaDsKLSAgICAgICAgICAgIHB0c1s3KjIrMF0gPSB4MjsgcHRzWzcqMisxXSA9IG5oOwotICAgICAgICAgICAgcHRzWzgqMiswXSA9IHgxOyBwdHNbOCoyKzFdID0gbmg7Ci0KLSAgICAgICAgICAgIHB0c1s5KjIrMF0gPSAwOyAgcHRzWzkqMisxXSA9IG5oOwotICAgICAgICAgICAgcHRzWzEwKjIrMF0gPSAwOyBwdHNbMTAqMisxXSA9IHkyOwotICAgICAgICAgICAgcHRzWzExKjIrMF0gPSAwOyBwdHNbMTEqMisxXSA9IHkxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHB0cywgMCwgbU9yaWcsIDAsIDI0KTsKLSAgICAgICAgICAgIHJlYnVpbGRQYXRjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgICAgICBpZiAobUludGVycCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5vdyA9IChpbnQpU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgSW50ZXJwb2xhdG9yLlJlc3VsdCByZXN1bHQgPSBtSW50ZXJwLnRpbWVUb1ZhbHVlcyhub3csIG1DdWJpY3MpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gSW50ZXJwb2xhdG9yLlJlc3VsdC5OT1JNQUwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVycCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWJ1aWxkUGF0Y2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QYXRjaC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVidWlsZFBhdGNoKCkgewotICAgICAgICAgICAgbVBhdGNoLnNldEN1YmljQm91bmRhcnkobUN1YmljcywgMCwgUk9XUywgQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOwotICAgICAgICAgICAgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1PcmlnLCAwLCBtQ3ViaWNzLCAwLCAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAxLjVmOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBkeCA9ICh4IC0gbVByZXZYKSAqIHNjYWxlOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBkeSA9ICh5IC0gbVByZXZZKSAqIHNjYWxlOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGR4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gNDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3ViaWNzW2luZGV4KjIgKyAwXSA9IG1PcmlnW2luZGV4KjIgKyAwXSArIGR4OwotICAgICAgICAgICAgICAgICAgICBtQ3ViaWNzW2luZGV4KjIgKyAyXSA9IG1PcmlnW2luZGV4KjIgKyAyXSArIGR4OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR5IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSA3OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdWJpY3NbaW5kZXgqMiArIDFdID0gbU9yaWdbaW5kZXgqMiArIDFdICsgZHk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWJpY3NbaW5kZXgqMiArIDNdID0gbU9yaWdbaW5kZXgqMiArIDNdICsgZHk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZWJ1aWxkUGF0Y2goKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6Ci0gICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnAgPSBuZXcgSW50ZXJwb2xhdG9yKDI0KTsKLSAgICAgICAgICAgICAgICAgICAgbUludGVycC5zZXRLZXlGcmFtZSgwLCBzdGFydCwgbUN1YmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmxvYXRbXSB7IDAsIDAuNWYsIDAuNWYsIDEgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnAuc2V0S2V5RnJhbWUoMSwgc3RhcnQgKyBVTlNUUkVUQ0hfTVNFQywgbU9yaWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2FtcGxlVmlldyBleHRlbmRzIFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XUyA9IDE2OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MUyA9IDE2OwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBCb3VuZGFyeVBhdGNoIG1QYXRjaDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdFtdIG1DdWJpY3M7Ci0gICAgICAgIHByaXZhdGUgZmxvYXRbXSBtT3JpZyA9IG5ldyBmbG9hdFsyNF07Ci0gICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50MDsKLSAgICAgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQxOwotICAgICAgICBwcml2YXRlIGludCBtQ3VyckluZGV4ID0gLTE7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVByZXZYOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1QcmV2WTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTYW1wbGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICAKLSAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmJlYWNoKTsKLSAgICAgICAgCi0gICAgICAgIG1QYXRjaCA9IG5ldyBCb3VuZGFyeVBhdGNoKCk7Ci0gICAgICAgIG1QYXRjaC5zZXRUZXh0dXJlKGJtKTsKLSAgICAgICAgCi0gICAgICAgIGZsb2F0IHVuaXQgPSA5MDsKLSAgICAgICAgbUN1YmljcyA9IG5ldyBmbG9hdFtdIHsKLSAgICAgICAgICAgIDAsIDAsIDEsIDAsIDIsIDAsCi0gICAgICAgICAgICAzLCAwLCAzLCAxLCAzLCAyLAotICAgICAgICAgICAgMywgMywgMiwgMywgMSwgMywKLSAgICAgICAgICAgIDAsIDMsIDAsIDIsIDAsIDEKLSAgICAgICAgfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ3ViaWNzW2ldICo9IDkwOwotICAgICAgICAgICAgbUN1Ymljc1tpXSArPSAyMDsKLSAgICAgICAgfQotICAgICAgICByZWJ1aWxkUGF0Y2goKTsKLSAgICAgICAgCi0gICAgICAgIG1QYWludDAgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgbVBhaW50MC5zZXRBbnRpQWxpYXModHJ1ZSk7Ci0gICAgICAgIG1QYWludDAuc2V0U3Ryb2tlV2lkdGgoMTIpOwotICAgICAgICBtUGFpbnQwLnNldFN0cm9rZUNhcChQYWludC5DYXAuUk9VTkQpOwotICAgICAgICBtUGFpbnQxID0gbmV3IFBhaW50KG1QYWludDApOwotICAgICAgICBtUGFpbnQxLnNldENvbG9yKDB4RkZGRkZGRkYpOwotICAgICAgICBtUGFpbnQxLnNldFN0cm9rZVdpZHRoKDEwKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoMHhGRkNDQ0NDQyk7Ci0gICAgICAgIG1QYXRjaC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGNhbnZhcy5kcmF3UG9pbnRzKG1DdWJpY3MsIG1QYWludDApOwotICAgICAgICBjYW52YXMuZHJhd1BvaW50cyhtQ3ViaWNzLCBtUGFpbnQxKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRQYXRjaCgpIHsKLSAgICAgICAgbVBhdGNoLnNldEN1YmljQm91bmRhcnkobUN1YmljcywgMCwgUk9XUywgQ09MUyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGZpbmRQdEluZGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgdG9sZXJhbmNlID0gMjU7Ci0gICAgICAgIGZpbmFsIGZsb2F0W10gcHRzID0gbUN1YmljczsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAocHRzLmxlbmd0aCA+PiAxKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMocHRzW2kqMiArIDBdIC0geCkgPD0gdG9sZXJhbmNlICYmCi0gICAgICAgICAgICAgICAgTWF0aC5hYnMocHRzW2kqMiArIDFdIC0geSkgPD0gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGkqMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBvZmZzZXRQdHMoZmxvYXQgZHgsIGZsb2F0IGR5KSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0W10gcHRzID0gbUN1YmljczsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAocHRzLmxlbmd0aCA+PiAxKTsgaSsrKSB7Ci0gICAgICAgICAgICBwdHNbaSoyICsgMF0gKz0gZHg7Ci0gICAgICAgICAgICBwdHNbaSoyICsgMV0gKz0gZHk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVidWlsZFBhdGNoKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZmxvYXQgeCA9IGV2ZW50LmdldFgoKTsKLSAgICAgICAgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKLSAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb24oKSkgewotICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgICAgICBtQ3VyckluZGV4ID0gZmluZFB0SW5kZXgoeCwgeSk7Ci0gICAgICAgICAgICAgICAgbVByZXZYID0geDsKLSAgICAgICAgICAgICAgICBtUHJldlkgPSB5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWJpY3NbbUN1cnJJbmRleCArIDBdID0geDsKLSAgICAgICAgICAgICAgICAgICAgbUN1Ymljc1ttQ3VyckluZGV4ICsgMV0gPSB5OwotICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2V0Q3ViaWNCb3VuZGFyeShtQ3ViaWNzLCAwLCBST1dTLCBDT0xTKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXRQdHMoeCAtIG1QcmV2WCwgeSAtIG1QcmV2WSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2WSA9IHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci19Ci0KZGlmZiAtLWdpdCBhL2FwcHMvU3BhcmVQYXJ0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvYXBwcy9TcGFyZVBhcnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODVkZTdhNC4uMTM3ZjkwNyAxMDA2NDQKLS0tIGEvYXBwcy9TcGFyZVBhcnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9TcGFyZVBhcnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIxLDcgKzIxLDcgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFVFRJTkdTIiAvPgogICAgIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9sYWJlbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2FwcF9pY29uIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQG1pcG1hcC9hcHBfaWNvbiI+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU3BhcmVQYXJ0cyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KZGlmZiAtLWdpdCBhL2FwcHMvU3BhcmVQYXJ0cy9yZXMvZHJhd2FibGUtaGRwaS9hcHBfaWNvbi5wbmcgYi9hcHBzL1NwYXJlUGFydHMvcmVzL21pcG1hcC1oZHBpL2FwcF9pY29uLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXBwcy9TcGFyZVBhcnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9pY29uLnBuZwpyZW5hbWUgdG8gYXBwcy9TcGFyZVBhcnRzL3Jlcy9taXBtYXAtaGRwaS9hcHBfaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBwcy9TcGFyZVBhcnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9pY29uLnBuZyBiL2FwcHMvU3BhcmVQYXJ0cy9yZXMvbWlwbWFwLW1kcGkvYXBwX2ljb24ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcHBzL1NwYXJlUGFydHMvcmVzL2RyYXdhYmxlLW1kcGkvYXBwX2ljb24ucG5nCnJlbmFtZSB0byBhcHBzL1NwYXJlUGFydHMvcmVzL21pcG1hcC1tZHBpL2FwcF9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vQW5kcm9pZC5tayBiL2FwcHMvVGVybS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmY2YzBkLi4wMDAwMDAwCi0tLSBhL2FwcHMvVGVybS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIG1ha2VmaWxlIHNob3dzIGhvdyB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBhbiBhY3Rpdml0eSB0aGF0Ci0jIGJ1bmRsZXMgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBjYWxscyBpdCB1c2luZyBKTkkuCi0KLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXJtCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnRlcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgQWxzbyBidWlsZCBhbGwgb2YgdGhlIHN1Yi10YXJnZXRzIHVuZGVyIHRoaXMgb25lOiB0aGUgc2hhcmVkIGxpYnJhcnkuCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9hcHBzL1Rlcm0vQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4NGQyYy4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlcm0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfdGVybWluYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBsaWNhdGlvbl90ZXJtaW5hbCI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlcm0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJrZXlib2FyZHxrZXlib2FyZEhpZGRlbnxvcmllbnRhdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9ImFkanVzdFJlc2l6ZXxzdGF0ZVZpc2libGUiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlRFU1QiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlcm1QcmVmZXJlbmNlcyIvPgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PiAKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvYXBwcy9UZXJtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL05PVElDRSBiL2FwcHMvVGVybS9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rIGIvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmU0YTc1Li4wMDAwMDAwCi0tLSBhL2FwcHMvVGVybS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBtYWtlZmlsZSBzdXBwbGllcyB0aGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBvZiBKTkkgY29kZSBmb3IKLSMgdXNlIGJ5IG91ciBleGFtcGxlIG9mIGhvdyB0byBidW5kbGUgYSBzaGFyZWQgbGlicmFyeSB3aXRoIGFuIEFQSy4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCi0KLSMgVGhpcyBpcyB0aGUgdGFyZ2V0IGJlaW5nIGJ1aWx0LgotTE9DQUxfTU9EVUxFOj0gbGlidGVybQotCi0KLSMgQWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCB3ZSB3aWxsIGNvbXBpbGUuCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gIHRlcm1FeGVjLmNwcAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1dGlscwotCi0jIE5vIHN0YXRpYyBsaWJyYXJpZXMuCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9Ci0KLSMgQWxzbyBuZWVkIHRoZSBKTkkgaGVhZGVycy4KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCSQoSk5JX0hfSU5DTFVERSkKLQotIyBObyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzLgotTE9DQUxfQ0ZMQUdTICs9Ci0KLSMgRG9uJ3QgcHJlbGluayB0aGlzIGxpYnJhcnkuICBGb3IgbW9yZSBlZmZpY2llbnQgY29kZSwgeW91IG1heSB3YW50Ci0jIHRvIGFkZCB0aGlzIGxpYnJhcnkgdG8gdGhlIHByZWxpbmsgbWFwIGFuZCBzZXQgdGhpcyB0byB0cnVlLiBIb3dldmVyLAotIyBpdCdzIGRpZmZpY3VsdCB0byBkbyB0aGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBsaWVkIGFzCi0jIHBhcnQgb2YgYSBzeXN0ZW0gaW1hZ2UuCi0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9qbmkvdGVybUV4ZWMuY3BwIGIvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjY2Y2MuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkV4ZWMiCi0KLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9taXNjLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0KLXN0YXRpYyBqY2xhc3MgY2xhc3NfZmlsZURlc2NyaXB0b3I7Ci1zdGF0aWMgamZpZWxkSUQgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcjsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2ZpbGVEZXNjcmlwdG9yX2luaXQ7Ci0KLQotY2xhc3MgU3RyaW5nOCB7Ci1wdWJsaWM6Ci0gICAgU3RyaW5nOCgpIHsKLSAgICAgICAgbVN0cmluZyA9IDA7Ci0gICAgfQotICAgIAotICAgIH5TdHJpbmc4KCkgewotICAgICAgICBpZiAobVN0cmluZykgewotICAgICAgICAgICAgZnJlZShtU3RyaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0KGNvbnN0IGNoYXIxNl90KiBvLCBzaXplX3QgbnVtQ2hhcnMpIHsKLSAgICAgICAgbVN0cmluZyA9IChjaGFyKikgbWFsbG9jKG51bUNoYXJzICsgMSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ2hhcnM7IGkrKykgewotICAgICAgICAgICAgbVN0cmluZ1tpXSA9IChjaGFyKSBvW2ldOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpbmdbbnVtQ2hhcnNdID0gJ1wwJzsKLSAgICB9Ci0gICAgCi0gICAgY29uc3QgY2hhciogc3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbVN0cmluZzsKLSAgICB9Ci1wcml2YXRlOgotICAgIGNoYXIqIG1TdHJpbmc7Ci19OwotCi1zdGF0aWMgaW50IGNyZWF0ZV9zdWJwcm9jZXNzKGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqYXJnMCwgY29uc3QgY2hhciAqYXJnMSwKLSAgICBpbnQqIHBQcm9jZXNzSWQpCi17Ci0gICAgY2hhciAqZGV2bmFtZTsKLSAgICBpbnQgcHRtOwotICAgIHBpZF90IHBpZDsKLQotICAgIHB0bSA9IG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUik7IC8vIHwgT19OT0NUVFkpOwotICAgIGlmKHB0bSA8IDApewotICAgICAgICBMT0dFKCJbIGNhbm5vdCBvcGVuIC9kZXYvcHRteCAtICVzIF1cbiIsc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBmY250bChwdG0sIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotCi0gICAgaWYoZ3JhbnRwdChwdG0pIHx8IHVubG9ja3B0KHB0bSkgfHwKLSAgICAgICAoKGRldm5hbWUgPSAoY2hhciopIHB0c25hbWUocHRtKSkgPT0gMCkpewotICAgICAgICBMT0dFKCJbIHRyb3VibGUgd2l0aCAvZGV2L3B0bXggLSAlcyBdXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHBpZCA9IGZvcmsoKTsKLSAgICBpZihwaWQgPCAwKSB7Ci0gICAgICAgIExPR0UoIi0gZm9yayBmYWlsZWQ6ICVzIC1cbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZihwaWQgPT0gMCl7Ci0gICAgICAgIGNsb3NlKHB0bSk7Ci0KLSAgICAgICAgaW50IHB0czsKLQotICAgICAgICBzZXRzaWQoKTsKLSAgICAgICAgCi0gICAgICAgIHB0cyA9IG9wZW4oZGV2bmFtZSwgT19SRFdSKTsKLSAgICAgICAgaWYocHRzIDwgMCkgZXhpdCgtMSk7Ci0KLSAgICAgICAgZHVwMihwdHMsIDApOwotICAgICAgICBkdXAyKHB0cywgMSk7Ci0gICAgICAgIGR1cDIocHRzLCAyKTsKLQotICAgICAgICBleGVjbChjbWQsIGNtZCwgYXJnMCwgYXJnMSwgTlVMTCk7Ci0gICAgICAgIGV4aXQoLTEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwUHJvY2Vzc0lkID0gKGludCkgcGlkOwotICAgICAgICByZXR1cm4gcHRtOwotICAgIH0KLX0KLQotCi1zdGF0aWMgam9iamVjdCBhbmRyb2lkX29zX0V4ZWNfY3JlYXRlU3ViUHJvY2VzcyhKTklFbnYgKmVudiwgam9iamVjdCBjbGF6eiwKLSAgICBqc3RyaW5nIGNtZCwganN0cmluZyBhcmcwLCBqc3RyaW5nIGFyZzEsIGppbnRBcnJheSBwcm9jZXNzSWRBcnJheSkKLXsKLSAgICBjb25zdCBqY2hhciogc3RyID0gY21kID8gZW52LT5HZXRTdHJpbmdDcml0aWNhbChjbWQsIDApIDogMDsKLSAgICBTdHJpbmc4IGNtZF84OwotICAgIGlmIChzdHIpIHsKLSAgICAgICAgY21kXzguc2V0KHN0ciwgZW52LT5HZXRTdHJpbmdMZW5ndGgoY21kKSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NyaXRpY2FsKGNtZCwgc3RyKTsKLSAgICB9Ci0KLSAgICBzdHIgPSBhcmcwID8gZW52LT5HZXRTdHJpbmdDcml0aWNhbChhcmcwLCAwKSA6IDA7Ci0gICAgY29uc3QgY2hhciogYXJnMFN0ciA9IDA7Ci0gICAgU3RyaW5nOCBhcmcwXzg7Ci0gICAgaWYgKHN0cikgewotICAgICAgICBhcmcwXzguc2V0KHN0ciwgZW52LT5HZXRTdHJpbmdMZW5ndGgoYXJnMCkpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDcml0aWNhbChhcmcwLCBzdHIpOwotICAgICAgICBhcmcwU3RyID0gYXJnMF84LnN0cmluZygpOwotICAgIH0KLQotICAgIHN0ciA9IGFyZzEgPyBlbnYtPkdldFN0cmluZ0NyaXRpY2FsKGFyZzEsIDApIDogMDsKLSAgICBjb25zdCBjaGFyKiBhcmcxU3RyID0gMDsKLSAgICBTdHJpbmc4IGFyZzFfODsKLSAgICBpZiAoc3RyKSB7Ci0gICAgICAgIGFyZzFfOC5zZXQoc3RyLCBlbnYtPkdldFN0cmluZ0xlbmd0aChhcmcxKSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NyaXRpY2FsKGFyZzEsIHN0cik7Ci0gICAgICAgIGFyZzFTdHIgPSBhcmcxXzguc3RyaW5nKCk7Ci0gICAgfQotCi0gICAgaW50IHByb2NJZDsKLSAgICBpbnQgcHRtID0gY3JlYXRlX3N1YnByb2Nlc3MoY21kXzguc3RyaW5nKCksIGFyZzBTdHIsIGFyZzFTdHIsICZwcm9jSWQpOwotICAgIAotICAgIGlmIChwcm9jZXNzSWRBcnJheSkgewotICAgICAgICBpbnQgcHJvY0lkTGVuID0gZW52LT5HZXRBcnJheUxlbmd0aChwcm9jZXNzSWRBcnJheSk7Ci0gICAgICAgIGlmIChwcm9jSWRMZW4gPiAwKSB7Ci0gICAgICAgICAgICBqYm9vbGVhbiBpc0NvcHk7Ci0gICAgCi0gICAgICAgICAgICBpbnQqIHBQcm9jSWQgPSAoaW50KikgZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKHByb2Nlc3NJZEFycmF5LCAmaXNDb3B5KTsKLSAgICAgICAgICAgIGlmIChwUHJvY0lkKSB7Ci0gICAgICAgICAgICAgICAgKnBQcm9jSWQgPSBwcm9jSWQ7Ci0gICAgICAgICAgICAgICAgZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChwcm9jZXNzSWRBcnJheSwgcFByb2NJZCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgam9iamVjdCByZXN1bHQgPSBlbnYtPk5ld09iamVjdChjbGFzc19maWxlRGVzY3JpcHRvciwgbWV0aG9kX2ZpbGVEZXNjcmlwdG9yX2luaXQpOwotICAgIAotICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgIExPR0UoIkNvdWxkbid0IGNyZWF0ZSBhIEZpbGVEZXNjcmlwdG9yLiIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChyZXN1bHQsIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IsIHB0bSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgYW5kcm9pZF9vc19FeGVjX3NldFB0eVdpbmRvd1NpemUoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosCi0gICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciwgamludCByb3csIGppbnQgY29sLCBqaW50IHhwaXhlbCwgamludCB5cGl4ZWwpCi17Ci0gICAgaW50IGZkOwotICAgIHN0cnVjdCB3aW5zaXplIHN6OwotCi0gICAgZmQgPSBlbnYtPkdldEludEZpZWxkKGZpbGVEZXNjcmlwdG9yLCBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yKTsKLQotICAgIGlmIChlbnYtPkV4Y2VwdGlvbk9jY3VycmVkKCkgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHN6LndzX3JvdyA9IHJvdzsKLSAgICBzei53c19jb2wgPSBjb2w7Ci0gICAgc3oud3NfeHBpeGVsID0geHBpeGVsOwotICAgIHN6LndzX3lwaXhlbCA9IHlwaXhlbDsKLSAgICAKLSAgICBpb2N0bChmZCwgVElPQ1NXSU5TWiwgJnN6KTsKLX0KLQotc3RhdGljIGludCBhbmRyb2lkX29zX0V4ZWNfd2FpdEZvcihKTklFbnYgKmVudiwgam9iamVjdCBjbGF6eiwKLSAgICBqaW50IHByb2NJZCkgewotICAgIGludCBzdGF0dXM7Ci0gICAgd2FpdHBpZChwcm9jSWQsICZzdGF0dXMsIDApOwotICAgIGludCByZXN1bHQgPSAwOwotICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSkgewotICAgICAgICByZXN1bHQgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBhbmRyb2lkX29zX0V4ZWNfY2xvc2UoSk5JRW52ICplbnYsIGpvYmplY3QgY2xhenosIGpvYmplY3QgZmlsZURlc2NyaXB0b3IpCi17Ci0gICAgaW50IGZkOwotICAgIHN0cnVjdCB3aW5zaXplIHN6OwotCi0gICAgZmQgPSBlbnYtPkdldEludEZpZWxkKGZpbGVEZXNjcmlwdG9yLCBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yKTsKLQotICAgIGlmIChlbnYtPkV4Y2VwdGlvbk9jY3VycmVkKCkgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGNsb3NlKGZkKTsKLX0KLQotCi1zdGF0aWMgaW50IHJlZ2lzdGVyX0ZpbGVEZXNjcmlwdG9yKEpOSUVudiAqZW52KQotewotICAgIGNsYXNzX2ZpbGVEZXNjcmlwdG9yID0gZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGlmIChjbGFzc19maWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IGZpbmQgamF2YS9pby9GaWxlRGVzY3JpcHRvciIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvciA9IGVudi0+R2V0RmllbGRJRChjbGFzc19maWxlRGVzY3JpcHRvciwgImRlc2NyaXB0b3IiLCAiSSIpOwotCi0gICAgaWYgKGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIEZpbGVEZXNjcmlwdG9yLmRlc2NyaXB0b3IiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1ldGhvZF9maWxlRGVzY3JpcHRvcl9pbml0ID0gZW52LT5HZXRNZXRob2RJRChjbGFzc19maWxlRGVzY3JpcHRvciwgIjxpbml0PiIsICIoKVYiKTsKLSAgICBpZiAobWV0aG9kX2ZpbGVEZXNjcmlwdG9yX2luaXQgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIEZpbGVEZXNjcmlwdG9yLmluaXQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICB9Ci0gICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjbGFzc1BhdGhOYW1lID0gImNvbS9hbmRyb2lkL3Rlcm0vRXhlYyI7Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7Ci0gICAgeyAiY3JlYXRlU3VicHJvY2VzcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7W0kpTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKLSAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0V4ZWNfY3JlYXRlU3ViUHJvY2VzcyB9LAotICAgIHsgInNldFB0eVdpbmRvd1NpemUiLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yO0lJSUkpViIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19FeGVjX3NldFB0eVdpbmRvd1NpemV9LAotICAgIHsgIndhaXRGb3IiLCAiKEkpSSIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19FeGVjX3dhaXRGb3J9LAotICAgIHsgImNsb3NlIiwgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIsCi0gICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19FeGVjX2Nsb3NlfQotfTsKLQotLyoKLSAqIFJlZ2lzdGVyIHNldmVyYWwgbmF0aXZlIG1ldGhvZHMgZm9yIG9uZSBjbGFzcy4KLSAqLwotc3RhdGljIGludCByZWdpc3Rlck5hdGl2ZU1ldGhvZHMoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSwKLSAgICBKTklOYXRpdmVNZXRob2QqIGdNZXRob2RzLCBpbnQgbnVtTWV0aG9kcykKLXsKLSAgICBqY2xhc3MgY2xheno7Ci0KLSAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiTmF0aXZlIHJlZ2lzdHJhdGlvbiB1bmFibGUgdG8gZmluZCBjbGFzcyAnJXMnIiwgY2xhc3NOYW1lKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgaWYgKGVudi0+UmVnaXN0ZXJOYXRpdmVzKGNsYXp6LCBnTWV0aG9kcywgbnVtTWV0aG9kcykgPCAwKSB7Ci0gICAgICAgIExPR0UoIlJlZ2lzdGVyTmF0aXZlcyBmYWlsZWQgZm9yICclcyciLCBjbGFzc05hbWUpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBKTklfVFJVRTsKLX0KLQotLyoKLSAqIFJlZ2lzdGVyIG5hdGl2ZSBtZXRob2RzIGZvciBhbGwgY2xhc3NlcyB3ZSBrbm93IGFib3V0LgotICoKLSAqIHJldHVybnMgSk5JX1RSVUUgb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCByZWdpc3Rlck5hdGl2ZXMoSk5JRW52KiBlbnYpCi17Ci0gIGlmICghcmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgY2xhc3NQYXRoTmFtZSwgbWV0aG9kX3RhYmxlLCAKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKG1ldGhvZF90YWJsZSkgLyBzaXplb2YobWV0aG9kX3RhYmxlWzBdKSkpIHsKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBWTSB3aGVuIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBmaXJzdCBsb2FkZWQuCi0gKi8KLSAKLXR5cGVkZWYgdW5pb24gewotICAgIEpOSUVudiogZW52OwotICAgIHZvaWQqIHZlbnY7Ci19IFVuaW9uSk5JRW52VG9Wb2lkOwotCi1qaW50IEpOSV9PbkxvYWQoSmF2YVZNKiB2bSwgdm9pZCogcmVzZXJ2ZWQpIHsKLSAgICBVbmlvbkpOSUVudlRvVm9pZCB1ZW52OwotICAgIHVlbnYudmVudiA9IE5VTEw7Ci0gICAgamludCByZXN1bHQgPSAtMTsKLSAgICBKTklFbnYqIGVudiA9IE5VTEw7Ci0gICAgCi0gICAgTE9HSSgiSk5JX09uTG9hZCIpOwotCi0gICAgaWYgKHZtLT5HZXRFbnYoJnVlbnYudmVudiwgSk5JX1ZFUlNJT05fMV80KSAhPSBKTklfT0spIHsKLSAgICAgICAgTE9HRSgiRVJST1I6IEdldEVudiBmYWlsZWQiKTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLSAgICBlbnYgPSB1ZW52LmVudjsKLSAgICAKLSAgICBpZiAoKHJlc3VsdCA9IHJlZ2lzdGVyX0ZpbGVEZXNjcmlwdG9yKGVudikpIDwgMCkgewotICAgICAgICBMT0dFKCJFUlJPUjogcmVnaXN0ZXJGaWxlRGVzY3JpcHRvciBmYWlsZWQiKTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChyZWdpc3Rlck5hdGl2ZXMoZW52KSAhPSBKTklfVFJVRSkgewotICAgICAgICBMT0dFKCJFUlJPUjogcmVnaXN0ZXJOYXRpdmVzIGZhaWxlZCIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotICAgIAotICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKLSAgICAKLWJhaWw6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9yZXMvZHJhd2FibGUtaGRwaS9hcHBfdGVybWluYWwucG5nIGIvYXBwcy9UZXJtL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF90ZXJtaW5hbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI3OGIyYTUuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF90ZXJtaW5hbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlLWhkcGkvYXRhcmlfc21hbGwucG5nIGIvYXBwcy9UZXJtL3Jlcy9kcmF3YWJsZS1oZHBpL2F0YXJpX3NtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGJkZDYyNC4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlLWhkcGkvYXRhcmlfc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF90ZXJtaW5hbC5wbmcgYi9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlLW1kcGkvYXBwX3Rlcm1pbmFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjM2I0Yi4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlLW1kcGkvYXBwX3Rlcm1pbmFsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9yZXMvZHJhd2FibGUtbWRwaS9hdGFyaV9zbWFsbC5wbmcgYi9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlLW1kcGkvYXRhcmlfc21hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVlMjk1Li4wMDAwMDAwCi0tLSBhL2FwcHMvVGVybS9yZXMvZHJhd2FibGUtbWRwaS9hdGFyaV9zbWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlL2F0YXJpX3NtYWxsX25vdGljZS50eHQgYi9hcHBzL1Rlcm0vcmVzL2RyYXdhYmxlL2F0YXJpX3NtYWxsX25vdGljZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTg1MzkuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL3Jlcy9kcmF3YWJsZS9hdGFyaV9zbWFsbF9ub3RpY2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotQ09NTUVOVCAgQ29weXJpZ2h0IChjKSAxOTk5LCBUaG9tYXMgQS4gRmluZQotQ09NTUVOVAotQ09NTUVOVCAgTGljZW5zZSB0byBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIGZvciBib3RoIGNvbW1lcmNpYWwgYW5kCi1DT01NRU5UICBub24tY29tbWVyY2lhbCB1c2UgaXMgaGVyYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhpcyBub3RpY2UKLUNPTU1FTlQgIGlzIHByZXNlcnZlZC4KLUNPTU1FTlQKLUNPTU1FTlQgIEVtYWlsIHRvIG15IGxhc3QgbmFtZSBhdCBoZWFkLmNmYS5oYXJ2YXJkLmVkdQotQ09NTUVOVCAgaHR0cDovL2hlYS13d3cuaGFydmFyZC5lZHUvfmZpbmUvCi1DT01NRU5UCi1DT01NRU5UICBQcm9kdWNlZCB3aXRoIGJkZmVkaXQsIGEgdGNsL3RrIGZvbnQgZWRpdGluZyBwcm9ncmFtCi1DT01NRU5UICB3cml0dGVuIGJ5IFRob21hcyBBLiBGaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3Jlcy9sYXlvdXQvdGVybV9hY3Rpdml0eS54bWwgYi9hcHBzL1Rlcm0vcmVzL2xheW91dC90ZXJtX2FjdGl2aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlNzcxOS4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL2xheW91dC90ZXJtX2FjdGl2aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxjb20uYW5kcm9pZC50ZXJtLkVtdWxhdG9yVmlldyBhbmRyb2lkOmlkPSJAK2lkL2VtdWxhdG9yVmlldyIKLQkgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotCSAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotCSAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLQkgICAgICAvPgotICAgCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9yZXMvbWVudS9tYWluLnhtbCBiL2FwcHMvVGVybS9yZXMvbWVudS9tYWluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZTlkOC4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL21lbnUvbWFpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfcHJlZmVyZW5jZXMiCi0gICAgCWFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcHJlZmVyZW5jZXMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X3Jlc2V0IgotICAgIAlhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3Jlc2V0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9zZW5kX2VtYWlsIgotICAgIAlhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NlbmRfZW1haWwiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X3NwZWNpYWxfa2V5cyIKLSAgICAJYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9zcGVjaWFsX2tleXMiIC8+Ci08L21lbnU+CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvYXBwcy9UZXJtL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NTdhMi4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImVudHJpZXNfZm9udHNpemVfcHJlZmVyZW5jZSI+Ci0gICAgICAgIDxpdGVtPjQgeCA4IHBpeGVsczwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NiBwdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NyBwdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+OCBwdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+OSBwdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTAgcHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyIHB0PC9pdGVtPgotICAgICAgICA8aXRlbT4xNCBwdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTYgcHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjIwIHB0PC9pdGVtPgotICAgIDwvc3RyaW5nLWFycmF5PgotCi0JPCEtLSBEbyBub3QgbG9jYWxpemUgZW50cnl2YWx1ZXMgLS0+Ci0gICAgPHN0cmluZy1hcnJheSBuYW1lPSJlbnRyeXZhbHVlc19mb250c2l6ZV9wcmVmZXJlbmNlIj4KLSAgICAgICAgPGl0ZW0+MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NjwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NzwvaXRlbT4KLSAgICAgICAgPGl0ZW0+ODwvaXRlbT4KLSAgICAgICAgPGl0ZW0+OTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyPC9pdGVtPgotICAgICAgICA8aXRlbT4xNDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjIwPC9pdGVtPiAgCi0gICAgPC9zdHJpbmctYXJyYXk+Ci0KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImVudHJpZXNfY29sb3JfcHJlZmVyZW5jZSI+Ci0gICAgICAgIDxpdGVtPkJsYWNrIHRleHQgb24gd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPldoaXRlIHRleHQgb24gYmxhY2s8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPldoaXRlIHRleHQgb24gYmx1ZTwvaXRlbT4gIAotICAgIDwvc3RyaW5nLWFycmF5PgotCi0JPCEtLSBEbyBub3QgbG9jYWxpemUgZW50cnl2YWx1ZXMgLS0+Ci0gICAgPHN0cmluZy1hcnJheSBuYW1lPSJlbnRyeXZhbHVlc19jb2xvcl9wcmVmZXJlbmNlIj4KLSAgICAgICAgPGl0ZW0+MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MjwvaXRlbT4gIAotICAgIDwvc3RyaW5nLWFycmF5PgotICAgIAotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iZW50cmllc19jb250cm9sa2V5X3ByZWZlcmVuY2UiPgotICAgICAgICA8aXRlbT5Kb2cgYmFsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+XEAga2V5PC9pdGVtPgotICAgICAgICA8aXRlbT5MZWZ0IEFsdCBrZXk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPlJpZ2h0IEFsdCBrZXk8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci0KLQk8IS0tIERvIG5vdCBsb2NhbGl6ZSBlbnRyeXZhbHVlcyAtLT4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImVudHJ5dmFsdWVzX2NvbnRyb2xrZXlfcHJlZmVyZW5jZSI+Ci0gICAgICAgIDxpdGVtPjA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjE8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjM8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2FwcHMvVGVybS9yZXMvdmFsdWVzL2F0dHJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4N2Q3ZS4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotCi08cmVzb3VyY2VzPgotICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRW11bGF0b3JWaWV3Ij4KLSAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2FwcHMvVGVybS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQ2MjJiLi4wMDAwMDAwCi0tLSBhL2FwcHMvVGVybS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cmVzb3VyY2VzPgotICAgPHN0cmluZyBuYW1lPSJhcHBsaWNhdGlvbl90ZXJtaW5hbCI+VGVybWluYWwgRW11bGF0b3I8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXMiPlByZWZlcmVuY2VzPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9InJlc2V0Ij5SZXNldCB0ZXJtPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9InNlbmRfZW1haWwiPkVtYWlsIHRvPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9InNwZWNpYWxfa2V5cyI+U3BlY2lhbCBrZXlzPC9zdHJpbmc+Ci0KLSAgIDwhLS0gUHJlZmVyZW5jZSBkaWFsb2cgLS0+Ci0gICA8c3RyaW5nIG5hbWU9InRleHRfcHJlZmVyZW5jZXMiPlRleHQ8L3N0cmluZz4KLQotICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9mb250c2l6ZV9wcmVmZXJlbmNlIj5Gb250IHNpemU8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0ic3VtbWFyeV9mb250c2l6ZV9wcmVmZXJlbmNlIj5DaG9vc2UgY2hhcmFjdGVyIGhlaWdodCBpbiBwb2ludHMuPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9ImRpYWxvZ190aXRsZV9mb250c2l6ZV9wcmVmZXJlbmNlIj5Gb250IHNpemU8L3N0cmluZz4KLQotICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9jb2xvcl9wcmVmZXJlbmNlIj5Db2xvcnM8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0ic3VtbWFyeV9jb2xvcl9wcmVmZXJlbmNlIj5DaG9vc2UgdGV4dCBjb2xvci48L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3RpdGxlX2NvbG9yX3ByZWZlcmVuY2UiPlRleHQgY29sb3I8L3N0cmluZz4KLQotICAgPHN0cmluZyBuYW1lPSJrZXlib2FyZF9wcmVmZXJlbmNlcyI+S2V5Ym9hcmQ8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0idGl0bGVfY29udHJvbGtleV9wcmVmZXJlbmNlIj5Db250cm9sIGtleTwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJzdW1tYXJ5X2NvbnRyb2xrZXlfcHJlZmVyZW5jZSI+Q2hvb3NlIGNvbnRyb2wga2V5Ljwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfdGl0bGVfY29udHJvbGtleV9wcmVmZXJlbmNlIj5Db250cm9sIGtleTwvc3RyaW5nPgotCi0gICA8c3RyaW5nIG5hbWU9InNoZWxsX3ByZWZlcmVuY2VzIj5TaGVsbDwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9zaGVsbF9wcmVmZXJlbmNlIj5Db21tYW5kIGxpbmU8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0ic3VtbWFyeV9zaGVsbF9wcmVmZXJlbmNlIj5TcGVjaWZ5IHRoZSBzaGVsbCBjb21tYW5kIGxpbmUuPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9ImRpYWxvZ190aXRsZV9zaGVsbF9wcmVmZXJlbmNlIj5TaGVsbDwvc3RyaW5nPgotCi0gICA8c3RyaW5nIG5hbWU9InRpdGxlX2luaXRpYWxjb21tYW5kX3ByZWZlcmVuY2UiPkluaXRpYWwgY29tbWFuZDwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJzdW1tYXJ5X2luaXRpYWxjb21tYW5kX3ByZWZlcmVuY2UiPlNlbnQgdG8gdGhlIHNoZWxsIHdoZW4gaXQgc3RhcnRzLjwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfdGl0bGVfaW5pdGlhbGNvbW1hbmRfcHJlZmVyZW5jZSI+SW5pdGlhbCBDb21tYW5kPC9zdHJpbmc+Ci0KLSAgIDwhLS0gRG9uJ3QgbG9jYWxpemUgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgLS0+Ci0gICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdmFsdWVfZm9udHNpemVfcHJlZmVyZW5jZSI+MTA8L3N0cmluZz4KLSAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF92YWx1ZV9jb2xvcl9wcmVmZXJlbmNlIj4yPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdmFsdWVfY29udHJvbGtleV9wcmVmZXJlbmNlIj4wPC9zdHJpbmc+Ci0gICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdmFsdWVfc2hlbGxfcHJlZmVyZW5jZSI+L3N5c3RlbS9iaW4vc2ggLTwvc3RyaW5nPgotICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3ZhbHVlX2luaXRpYWxjb21tYW5kX3ByZWZlcmVuY2UiPmV4cG9ydCBQQVRIPS9kYXRhL2xvY2FsL2JpbjokUEFUSDwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvYXBwcy9UZXJtL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1OWY0YS4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IlRoZW1lIiBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbCBiL2FwcHMvVGVybS9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MjE1My4uMDAwMDAwMAotLS0gYS9hcHBzL1Rlcm0vcmVzL3htbC9wcmVmZXJlbmNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08UHJlZmVyZW5jZVNjcmVlbgotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotCi0gICAgPFByZWZlcmVuY2VDYXRlZ29yeQotICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90ZXh0X3ByZWZlcmVuY2VzIj4KLQotICAgICAgICA8TGlzdFByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0iZm9udHNpemUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpkZWZhdWx0VmFsdWU9IkBzdHJpbmcvZGVmYXVsdF92YWx1ZV9mb250c2l6ZV9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfZm9udHNpemVfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9mb250c2l6ZV9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW50cmllcz0iQGFycmF5L2VudHJpZXNfZm9udHNpemVfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJ5VmFsdWVzPSJAYXJyYXkvZW50cnl2YWx1ZXNfZm9udHNpemVfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRpYWxvZ1RpdGxlPSJAc3RyaW5nL2RpYWxvZ190aXRsZV9mb250c2l6ZV9wcmVmZXJlbmNlIiAvPgotCi0gICAgICAgIDxMaXN0UHJlZmVyZW5jZQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJjb2xvciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRlZmF1bHRWYWx1ZT0iQHN0cmluZy9kZWZhdWx0X3ZhbHVlX2NvbG9yX3ByZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9jb2xvcl9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2NvbG9yX3ByZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbnRyaWVzPSJAYXJyYXkvZW50cmllc19jb2xvcl9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW50cnlWYWx1ZXM9IkBhcnJheS9lbnRyeXZhbHVlc19jb2xvcl9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGlhbG9nVGl0bGU9IkBzdHJpbmcvZGlhbG9nX3RpdGxlX2NvbG9yX3ByZWZlcmVuY2UiIC8+Ci0KLSAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KLQotICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKLSAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcva2V5Ym9hcmRfcHJlZmVyZW5jZXMiPgotCi0gICAgICAgIDxMaXN0UHJlZmVyZW5jZQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJjb250cm9sa2V5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVmYXVsdFZhbHVlPSJAc3RyaW5nL2RlZmF1bHRfdmFsdWVfY29udHJvbGtleV9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfY29udHJvbGtleV9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2NvbnRyb2xrZXlfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJpZXM9IkBhcnJheS9lbnRyaWVzX2NvbnRyb2xrZXlfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJ5VmFsdWVzPSJAYXJyYXkvZW50cnl2YWx1ZXNfY29udHJvbGtleV9wcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGlhbG9nVGl0bGU9IkBzdHJpbmcvZGlhbG9nX3RpdGxlX2NvbnRyb2xrZXlfcHJlZmVyZW5jZSIgLz4KLQotICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgotCi0gICAgPFByZWZlcmVuY2VDYXRlZ29yeQotICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NoZWxsX3ByZWZlcmVuY2VzIj4KLQotICAgIDxFZGl0VGV4dFByZWZlcmVuY2UKLSAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJzaGVsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZGVmYXVsdFZhbHVlPSJAc3RyaW5nL2RlZmF1bHRfdmFsdWVfc2hlbGxfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfc2hlbGxfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X3NoZWxsX3ByZWZlcmVuY2UiCi0gICAgICAgICAgICBhbmRyb2lkOmRpYWxvZ1RpdGxlPSJAc3RyaW5nL2RpYWxvZ190aXRsZV9zaGVsbF9wcmVmZXJlbmNlIiAvPgotICAgIDxFZGl0VGV4dFByZWZlcmVuY2UKLSAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJpbml0aWFsY29tbWFuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZGVmYXVsdFZhbHVlPSJAc3RyaW5nL2RlZmF1bHRfdmFsdWVfaW5pdGlhbGNvbW1hbmRfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfaW5pdGlhbGNvbW1hbmRfcHJlZmVyZW5jZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2luaXRpYWxjb21tYW5kX3ByZWZlcmVuY2UiCi0gICAgICAgICAgICBhbmRyb2lkOmRpYWxvZ1RpdGxlPSJAc3RyaW5nL2RpYWxvZ190aXRsZV9pbml0aWFsY29tbWFuZF9wcmVmZXJlbmNlIiAvPgotICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgotPC9QcmVmZXJlbmNlU2NyZWVuPgpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YSBiL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9FeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1M2FjZmMuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlcm07Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGEgc3VicHJvY2Vzcy4KLSAqIDxwPgotICogTm90ZTogVGhlIG5hdGl2ZSBtZXRob2RzIGFjY2VzcyBhIHBhY2thZ2UtcHJpdmF0ZQotICogamF2YS5pby5GaWxlRGVzY3JpcHRvciBmaWVsZCB0byBnZXQgYW5kIHNldCB0aGUgcmF3IExpbnV4Ci0gKiBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgbWlnaHQgYnJlYWsgaWYgdGhlIGltcGxlbWVudGF0aW9uIG9mCi0gKiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGlzIGNoYW5nZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIEV4ZWMKLXsKLSAgICBzdGF0aWMgewotICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoInRlcm0iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzdWJwcm9jZXNzLiBEaWZmZXJzIGZyb20gamF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyIGluCi0gICAgICogdGhhdCBhIHB0eSBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHN1YnByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgRXhlYy5jbG9zZSgpIG9uIHRoZSByZXR1cm5lZAotICAgICAqIGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbWQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gYXJnMSB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBjb21tYW5kLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBwcm9jZXNzSWQgQSBvbmUtZWxlbWVudCBhcnJheSB0byB3aGljaCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUKLSAgICAgKiBzdGFydGVkIHByb2Nlc3Mgd2lsbCBiZSB3cml0dGVuLgotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgc3RhcnRlZCBwcm9jZXNzLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgRmlsZURlc2NyaXB0b3IgY3JlYXRlU3VicHJvY2VzcygKLSAgICAgICAgU3RyaW5nIGNtZCwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBpbnRbXSBwcm9jZXNzSWQpOwotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHdpZG93IHNpemUgZm9yIGEgZ2l2ZW4gcHR5LiBBbGxvd3MgcHJvZ3JhbXMKLSAgICAgKiBjb25uZWN0ZWQgdG8gdGhlIHB0eSBsZWFybiBob3cgbGFyZ2UgdGhlaXIgc2NyZWVuIGlzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc2V0UHR5V2luZG93U2l6ZShGaWxlRGVzY3JpcHRvciBmZCwKLSAgICAgICBpbnQgcm93LCBpbnQgY29sLCBpbnQgeHBpeGVsLCBpbnQgeXBpeGVsKTsKLQotICAgIC8qKgotICAgICAqIENhdXNlcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAqIHJlY2VpdmVyIHRvIGZpbmlzaCBleGVjdXRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBleGl0IHZhbHVlIG9mIHRoZSBQcm9jZXNzIGJlaW5nIHdhaXRlZCBvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHdhaXRGb3IoaW50IHByb2Nlc3NJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGNsb3NlKEZpbGVEZXNjcmlwdG9yIGZkKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm0uamF2YSBiL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzc5NmEuLjAwMDAwMDAKLS0tIGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVybTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JNYXRyaXhDb2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR2VzdHVyZURldGVjdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5CYXNlSW5wdXRDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5Db21wbGV0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRXh0cmFjdGVkVGV4dFJlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKLQotLyoqCi0gKiBBIHRlcm1pbmFsIGVtdWxhdG9yIGFjdGl2aXR5LgotICovCi0KLXB1YmxpYyBjbGFzcyBUZXJtIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIC8qKgotICAgICAqIFNldCB0byB0cnVlIHRvIGFkZCBkZWJ1Z2dpbmcgY29kZSBhbmQgbG9nZ2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNldCB0byB0cnVlIHRvIGxvZyBlYWNoIGNoYXJhY3RlciByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgcHJvY2VzcyB0byB0aGUKLSAgICAgKiBhbmRyb2lkIGxvZywgd2hpY2ggbWFrZXMgaXQgZWFzaWVyIHRvIGRlYnVnIHNvbWUga2luZHMgb2YgcHJvYmxlbXMgd2l0aAotICAgICAqIGVtdWxhdGluZyBlc2NhcGUgc2VxdWVuY2VzIGFuZCBjb250cm9sIGNvZGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfQ0hBUkFDVEVSU19GTEFHID0gREVCVUcgJiYgZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSB0byBsb2cgdW5rbm93biBlc2NhcGUgc2VxdWVuY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfVU5LTk9XTl9FU0NBUEVfU0VRVUVOQ0VTID0gREVCVUcgJiYgZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFnIHdlIHVzZSB3aGVuIGxvZ2dpbmcsIHNvIHRoYXQgb3VyIG1lc3NhZ2VzIGNhbiBiZSBkaXN0aW5ndWlzaGVkCi0gICAgICogZnJvbSBvdGhlciBtZXNzYWdlcyBpbiB0aGUgbG9nLiBQdWJsaWMgYmVjYXVzZSBpdCdzIHVzZWQgYnkgc2V2ZXJhbAotICAgICAqIGNsYXNzZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXJtIjsKLQotICAgIC8qKgotICAgICAqIE91ciBtYWluIHZpZXcuIERpc3BsYXlzIHRoZSBlbXVsYXRlZCB0ZXJtaW5hbCBzY3JlZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbXVsYXRvclZpZXcgbUVtdWxhdG9yVmlldzsKLQotICAgIC8qKgotICAgICAqIFRoZSBwc2V1ZG8tdGVsZXR5cGUgKHB0eSkgZmlsZSBkZXNjcmlwdG9yIHRoYXQgd2UgdXNlIHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiBhbm90aGVyIHByb2Nlc3MsIHR5cGljYWxseSBhIHNoZWxsLgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbVRlcm1GZDsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VuZCBkYXRhIHRvIHRoZSByZW1vdGUgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gbVRlcm1PdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIGtleSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgbW9kaWZpZXIga2V5cyBhbmQgYWxsb3dzIHRoZSBmdWxsIEFTQ0lJCi0gICAgICogY2hhcmFjdGVyIHNldCB0byBiZSBlbnRlcmVkLgotICAgICAqLwotICAgIHByaXZhdGUgVGVybUtleUxpc3RlbmVyIG1LZXlMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIG91ciBlbXVsYXRvciB2aWV3IGluIHRoZSB2aWV3IHJlc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTVVMQVRPUl9WSUVXID0gUi5pZC5lbXVsYXRvclZpZXc7Ci0KLSAgICBwcml2YXRlIGludCBtRm9udFNpemUgPSA5OwotICAgIHByaXZhdGUgaW50IG1Db2xvcklkID0gMjsKLSAgICBwcml2YXRlIGludCBtQ29udHJvbEtleUlkID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UU0laRV9LRVkgPSAiZm9udHNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9LRVkgPSAiY29sb3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MS0VZX0tFWSA9ICJjb250cm9sa2V5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hFTExfS0VZID0gInNoZWxsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTENPTU1BTkRfS0VZID0gImluaXRpYWxjb21tYW5kIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFID0gMHhmZmZmZmZmZjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTEFDSyA9IDB4ZmYwMDAwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRSA9IDB4ZmYzNDRlYmQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIENPTE9SX1NDSEVNRVMgPSB7Ci0gICAgICAgIHtCTEFDSywgV0hJVEV9LCB7V0hJVEUsIEJMQUNLfSwge1dISVRFLCBCTFVFfX07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDT05UUk9MX0tFWV9TQ0hFTUVTID0gewotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0FULAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0FMVF9MRUZULAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0FMVF9SSUdIVAotICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVFJPTF9LRVlfTkFNRSA9IHsKLSAgICAgICAgIkJhbGwiLCAiQCIsICJMZWZ0LUFsdCIsICJSaWdodC1BbHQiCi0gICAgfTsKLQotICAgIHByaXZhdGUgaW50IG1Db250cm9sS2V5Q29kZTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1NIRUxMID0gIi9zeXN0ZW0vYmluL3NoIC0iOwotICAgIHByaXZhdGUgU3RyaW5nIG1TaGVsbDsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0lOSVRJQUxfQ09NTUFORCA9Ci0gICAgICAgICJleHBvcnQgUEFUSD0vZGF0YS9sb2NhbC9iaW46JFBBVEgiOwotICAgIHByaXZhdGUgU3RyaW5nIG1Jbml0aWFsQ29tbWFuZDsKLQotICAgIHByaXZhdGUgU2hhcmVkUHJlZmVyZW5jZXMgbVByZWZzOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBMb2cuZShUZXJtLkxPR19UQUcsICJvbkNyZWF0ZSIpOwotICAgICAgICBtUHJlZnMgPSBQcmVmZXJlbmNlTWFuYWdlci5nZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXModGhpcyk7Ci0gICAgICAgIHJlYWRQcmVmcygpOwotCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRlcm1fYWN0aXZpdHkpOwotCi0gICAgICAgIG1FbXVsYXRvclZpZXcgPSAoRW11bGF0b3JWaWV3KSBmaW5kVmlld0J5SWQoRU1VTEFUT1JfVklFVyk7Ci0KLSAgICAgICAgc3RhcnRMaXN0ZW5pbmcoKTsKLQotICAgICAgICBtS2V5TGlzdGVuZXIgPSBuZXcgVGVybUtleUxpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUVtdWxhdG9yVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIG1FbXVsYXRvclZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgICAgIG1FbXVsYXRvclZpZXcucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIG1FbXVsYXRvclZpZXcucmVnaXN0ZXIobUtleUxpc3RlbmVyKTsKLQotICAgICAgICB1cGRhdGVQcmVmcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIGlmIChtVGVybUZkICE9IG51bGwpIHsKLSAgICAgICAgICAgIEV4ZWMuY2xvc2UobVRlcm1GZCk7Ci0gICAgICAgICAgICBtVGVybUZkID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLSAgICAgICAgaW50W10gcHJvY2Vzc0lkID0gbmV3IGludFsxXTsKLQotICAgICAgICBjcmVhdGVTdWJwcm9jZXNzKHByb2Nlc3NJZCk7Ci0gICAgICAgIGZpbmFsIGludCBwcm9jSWQgPSBwcm9jZXNzSWRbMF07Ci0KLSAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBSdW5uYWJsZSB3YXRjaEZvckRlYXRoID0gbmV3IFJ1bm5hYmxlKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVGVybS5MT0dfVEFHLCAid2FpdGluZyBmb3I6ICIgKyBwcm9jSWQpOwotICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEV4ZWMud2FpdEZvcihwcm9jSWQpOwotICAgICAgICAgICAgICAgIExvZy5pKFRlcm0uTE9HX1RBRywgIlN1YnByb2Nlc3MgZXhpdGVkOiAiICsgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UocmVzdWx0KTsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICAgICAgVGhyZWFkIHdhdGNoZXIgPSBuZXcgVGhyZWFkKHdhdGNoRm9yRGVhdGgpOwotICAgICAgICB3YXRjaGVyLnN0YXJ0KCk7Ci0KLSAgICAgICAgbVRlcm1PdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtVGVybUZkKTsKLQotICAgICAgICBtRW11bGF0b3JWaWV3LmluaXRpYWxpemUobVRlcm1GZCwgbVRlcm1PdXQpOwotCi0gICAgICAgIHNlbmRJbml0aWFsQ29tbWFuZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kSW5pdGlhbENvbW1hbmQoKSB7Ci0gICAgICAgIFN0cmluZyBpbml0aWFsQ29tbWFuZCA9IG1Jbml0aWFsQ29tbWFuZDsKLSAgICAgICAgaWYgKGluaXRpYWxDb21tYW5kID09IG51bGwgfHwgaW5pdGlhbENvbW1hbmQuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgaW5pdGlhbENvbW1hbmQgPSBERUZBVUxUX0lOSVRJQUxfQ09NTUFORDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5pdGlhbENvbW1hbmQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB3cml0ZShpbml0aWFsQ29tbWFuZCArICdccicpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnQoKSB7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkoZ2V0SW50ZW50KCkpOwotICAgICAgICBmaW5pc2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGUoU3RyaW5nIGRhdGEpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UZXJtT3V0LndyaXRlKGRhdGEuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBtVGVybU91dC5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uCi0gICAgICAgICAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBpZiB0aGUgcmVjZWl2ZXIgaXNuJ3QgbGlzdGVuaW5nLgotICAgICAgICAgICAgLy8gV2UganVzdCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gYW5zd2VyIHRoZSBxdWVyeS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdWJwcm9jZXNzKGludFtdIHByb2Nlc3NJZCkgewotICAgICAgICBTdHJpbmcgc2hlbGwgPSBtU2hlbGw7Ci0gICAgICAgIGlmIChzaGVsbCA9PSBudWxsIHx8IHNoZWxsLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHNoZWxsID0gREVGQVVMVF9TSEVMTDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhcmdzID0gcGFyc2Uoc2hlbGwpOwotICAgICAgICBTdHJpbmcgYXJnMCA9IGFyZ3MuZ2V0KDApOwotICAgICAgICBTdHJpbmcgYXJnMSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhcmcyID0gbnVsbDsKLSAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIGFyZzEgPSBhcmdzLmdldCgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJncy5zaXplKCkgPj0gMykgewotICAgICAgICAgICAgYXJnMiA9IGFyZ3MuZ2V0KDIpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXJtRmQgPSBFeGVjLmNyZWF0ZVN1YnByb2Nlc3MoYXJnMCwgYXJnMSwgYXJnMiwgcHJvY2Vzc0lkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IHBhcnNlKFN0cmluZyBjbWQpIHsKLSAgICAgICAgZmluYWwgaW50IFBMQUlOID0gMDsKLSAgICAgICAgZmluYWwgaW50IFdISVRFU1BBQ0UgPSAxOwotICAgICAgICBmaW5hbCBpbnQgSU5RVU9URSA9IDI7Ci0gICAgICAgIGludCBzdGF0ZSA9IFdISVRFU1BBQ0U7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9ICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaW50IGNtZExlbiA9IGNtZC5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbWRMZW47IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gY21kLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQTEFJTikgewotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5kZWxldGUoMCxidWlsZGVyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBXSElURVNQQUNFOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTlFVT1RFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gV0hJVEVTUEFDRSkgewotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5RVU9URTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFBMQUlOOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOUVVPVEUpIHsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGNtZExlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY21kLmNoYXJBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gUExBSU47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRQcmVmcygpIHsKLSAgICAgICAgbUZvbnRTaXplID0gcmVhZEludFByZWYoRk9OVFNJWkVfS0VZLCBtRm9udFNpemUsIDIwKTsKLSAgICAgICAgbUNvbG9ySWQgPSByZWFkSW50UHJlZihDT0xPUl9LRVksIG1Db2xvcklkLCBDT0xPUl9TQ0hFTUVTLmxlbmd0aCAtIDEpOwotICAgICAgICBtQ29udHJvbEtleUlkID0gcmVhZEludFByZWYoQ09OVFJPTEtFWV9LRVksIG1Db250cm9sS2V5SWQsCi0gICAgICAgICAgICAgICAgQ09OVFJPTF9LRVlfU0NIRU1FUy5sZW5ndGggLSAxKTsKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5ld1NoZWxsID0gcmVhZFN0cmluZ1ByZWYoU0hFTExfS0VZLCBtU2hlbGwpOwotICAgICAgICAgICAgaWYgKChuZXdTaGVsbCA9PSBudWxsKSB8fCAhIG5ld1NoZWxsLmVxdWFscyhtU2hlbGwpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TaGVsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRlcm0uTE9HX1RBRywgIk5ldyBzaGVsbCBzZXQuIFJlc3RhcnRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVNoZWxsID0gbmV3U2hlbGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5ld0luaXRpYWxDb21tYW5kID0gcmVhZFN0cmluZ1ByZWYoSU5JVElBTENPTU1BTkRfS0VZLAotICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbENvbW1hbmQpOwotICAgICAgICAgICAgaWYgKChuZXdJbml0aWFsQ29tbWFuZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB8fCAhIG5ld0luaXRpYWxDb21tYW5kLmVxdWFscyhtSW5pdGlhbENvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsQ29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRlcm0uTE9HX1RBRywgIk5ldyBpbml0aWFsIGNvbW1hbmQgc2V0LiBSZXN0YXJ0aW5nLiIpOwotICAgICAgICAgICAgICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Jbml0aWFsQ29tbWFuZCA9IG5ld0luaXRpYWxDb21tYW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWZzKCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGdldFdpbmRvd01hbmFnZXIoKS5nZXREZWZhdWx0RGlzcGxheSgpLmdldE1ldHJpY3MobWV0cmljcyk7Ci0gICAgICAgIG1FbXVsYXRvclZpZXcuc2V0VGV4dFNpemUoKGludCkgKG1Gb250U2l6ZSAqIG1ldHJpY3MuZGVuc2l0eSkpOwotICAgICAgICBzZXRDb2xvcnMoKTsKLSAgICAgICAgbUNvbnRyb2xLZXlDb2RlID0gQ09OVFJPTF9LRVlfU0NIRU1FU1ttQ29udHJvbEtleUlkXTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZWFkSW50UHJlZihTdHJpbmcga2V5LCBpbnQgZGVmYXVsdFZhbHVlLCBpbnQgbWF4VmFsdWUpIHsKLSAgICAgICAgaW50IHZhbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbCA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgbVByZWZzLmdldFN0cmluZyhrZXksIEludGVnZXIudG9TdHJpbmcoZGVmYXVsdFZhbHVlKSkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdmFsID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHZhbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZhbCwgbWF4VmFsdWUpKTsKLSAgICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkU3RyaW5nUHJlZihTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZnMuZ2V0U3RyaW5nKGtleSwgZGVmYXVsdFZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgcmVhZFByZWZzKCk7Ci0gICAgICAgIHVwZGF0ZVByZWZzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0KLSAgICAgICAgbUVtdWxhdG9yVmlldy51cGRhdGVTaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaGFuZGxlQ29udHJvbEtleShrZXlDb2RlLCB0cnVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNTeXN0ZW1LZXkoa2V5Q29kZSwgZXZlbnQpKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBpbnRlcmNlcHQgdGhlIHN5c3RlbSBrZXlzCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVEUGFkKGtleUNvZGUsIHRydWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUga2V5Q29kZSBpbnRvIGFuIEFTQ0lJIGNoYXJhY3Rlci4KLSAgICAgICAgaW50IGxldHRlciA9IG1LZXlMaXN0ZW5lci5rZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLQotICAgICAgICBpZiAobGV0dGVyID49IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVRlcm1PdXQud3JpdGUobGV0dGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgSS9PIGV4Y2VwdGlvbnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaGFuZGxlQ29udHJvbEtleShrZXlDb2RlLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGlzU3lzdGVtS2V5KGtleUNvZGUsIGV2ZW50KSkgewotICAgICAgICAgICAgLy8gRG9uJ3QgaW50ZXJjZXB0IHRoZSBzeXN0ZW0ga2V5cwotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZURQYWQoa2V5Q29kZSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1LZXlMaXN0ZW5lci5rZXlVcChrZXlDb2RlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZUNvbnRyb2xLZXkoaW50IGtleUNvZGUsIGJvb2xlYW4gZG93bikgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBtQ29udHJvbEtleUNvZGUpIHsKLSAgICAgICAgICAgIG1LZXlMaXN0ZW5lci5oYW5kbGVDb250cm9sS2V5KGRvd24pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBkcGFkIGxlZnQtcmlnaHQtdXAtZG93biBldmVudHMuIERvbid0IGhhbmRsZQotICAgICAqIGRwYWQtY2VudGVyLCB0aGF0J3Mgb3VyIGNvbnRyb2wga2V5LgotICAgICAqIEBwYXJhbSBrZXlDb2RlCi0gICAgICogQHBhcmFtIGRvd24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRFBhZChpbnQga2V5Q29kZSwgYm9vbGVhbiBkb3duKSB7Ci0gICAgICAgIGlmIChrZXlDb2RlIDwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQIHx8Ci0gICAgICAgICAgICAgICAga2V5Q29kZSA+IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb3duKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlcm1PdXQud3JpdGUoJ1xyJyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjb2RlOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJ0EnOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJ0InOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0xFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJ0QnOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9ICdDJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1UZXJtT3V0LndyaXRlKDI3KTsgLy8gRVNDCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRW11bGF0b3JWaWV3LmdldEtleXBhZEFwcGxpY2F0aW9uTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVybU91dC53cml0ZSgnTycpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlcm1PdXQud3JpdGUoJ1snKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVGVybU91dC53cml0ZShjb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtS2V5KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICByZXR1cm4gZXZlbnQuaXNTeXN0ZW0oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5tYWluLCBtZW51KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaW50IGlkID0gaXRlbS5nZXRJdGVtSWQoKTsKLSAgICAgICAgaWYgKGlkID09IFIuaWQubWVudV9wcmVmZXJlbmNlcykgewotICAgICAgICAgICAgZG9QcmVmZXJlbmNlcygpOwotICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubWVudV9yZXNldCkgewotICAgICAgICAgICAgZG9SZXNldFRlcm1pbmFsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tZW51X3NlbmRfZW1haWwpIHsKLSAgICAgICAgICAgIGRvRW1haWxUcmFuc2NyaXB0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tZW51X3NwZWNpYWxfa2V5cykgewotICAgICAgICAgICAgZG9Eb2N1bWVudEtleXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1ByZWZlcmVuY2VzKCkgewotICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQodGhpcywgVGVybVByZWZlcmVuY2VzLmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbG9ycygpIHsKLSAgICAgICAgaW50W10gc2NoZW1lID0gQ09MT1JfU0NIRU1FU1ttQ29sb3JJZF07Ci0gICAgICAgIG1FbXVsYXRvclZpZXcuc2V0Q29sb3JzKHNjaGVtZVswXSwgc2NoZW1lWzFdKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9SZXNldFRlcm1pbmFsKCkgewotICAgICAgICByZXN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRW1haWxUcmFuc2NyaXB0KCkgewotICAgICAgICAvLyBEb24ndCByZWFsbHkgd2FudCB0byBzdXBwbHkgYW4gYWRkcmVzcywgYnV0Ci0gICAgICAgIC8vIGN1cnJlbnRseSBpdCdzIHJlcXVpcmVkLCBvdGhlcndpc2Ugd2UgZ2V0IGFuCi0gICAgICAgIC8vIGV4Y2VwdGlvbi4KLSAgICAgICAgU3RyaW5nIGFkZHIgPSAidXNlckBleGFtcGxlLmNvbSI7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPQotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9TRU5EVE8sIFVyaS5wYXJzZSgibWFpbHRvOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYWRkcikpOwotCi0gICAgICAgIGludGVudC5wdXRFeHRyYSgiYm9keSIsIG1FbXVsYXRvclZpZXcuZ2V0VHJhbnNjcmlwdFRleHQoKSk7Ci0gICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9Eb2N1bWVudEtleXMoKSB7Ci0gICAgICAgIFN0cmluZyBjb250cm9sS2V5ID0gQ09OVFJPTF9LRVlfTkFNRVttQ29udHJvbEtleUlkXTsKLSAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcykuCi0gICAgICAgICAgICBzZXRUaXRsZSgiUHJlc3MgIiArIGNvbnRyb2xLZXkgKyAiIGFuZCBLZXkiKS4KLSAgICAgICAgICAgIHNldE1lc3NhZ2UoY29udHJvbEtleSArICIgU3BhY2UgPT0+IENvbnRyb2wtQCAoTlVMKVxuIgotICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xLZXkgKyAiIEEuLlogPT0+IENvbnRyb2wtQS4uWlxuIgotICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xLZXkgKyAiIDEgPT0+IENvbnRyb2wtWyAoRVNDKVxuIgotICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xLZXkgKyAiIDUgPT0+IENvbnRyb2wtX1xuIgotICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xLZXkgKyAiIC4gPT0+IENvbnRyb2wtXFxcbiIKLSAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sS2V5ICsgIiAwID09PiBDb250cm9sLV1cbiIKLSAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sS2V5ICsgIiA2ID09PiBDb250cm9sLV4iKS4KLSAgICAgICAgICAgIHNob3coKTsKLSAgICAgfQotfQotCi0KLS8qKgotICogQW4gYWJzdHJhY3Qgc2NyZWVuIGludGVyZmFjZS4gQSB0ZXJtaW5hbCBzY3JlZW4gc3RvcmVzIGxpbmVzIG9mIHRleHQuIChUaGUKLSAqIHJlYXNvbiB0byBhYnN0cmFjdCBpdCBpcyB0byBhbGxvdyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zLCBhbmQgdG8gaGlkZQotICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBmcm9tIGNsaWVudHMuKQotICovCi1pbnRlcmZhY2UgU2NyZWVuIHsKLQotICAgIC8qKgotICAgICAqIFNldCBsaW5lIHdyYXAgZmxhZyBmb3IgYSBnaXZlbiByb3cuIEFmZmVjdHMgaG93IGxpbmVzIGFyZSBsb2dpY2FsbHkKLSAgICAgKiB3cmFwcGVkIHdoZW4gY2hhbmdpbmcgc2NyZWVuIHNpemUgb3IgY29udmVydGluZyB0byBhIHRyYW5zY3JpcHQuCi0gICAgICovCi0gICAgdm9pZCBzZXRMaW5lV3JhcChpbnQgcm93KTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlIGJ5dGUgYiBpbnRvIHRoZSBzY3JlZW4gYXQgbG9jYXRpb24gKHgsIHkpCi0gICAgICoKLSAgICAgKiBAcGFyYW0geCBYIGNvb3JkaW5hdGUgKGFsc28ga25vd24gYXMgY29sdW1uKQotICAgICAqIEBwYXJhbSB5IFkgY29vcmRpbmF0ZSAoYWxzbyBrbm93biBhcyByb3cpCi0gICAgICogQHBhcmFtIGIgQVNDSUkgY2hhcmFjdGVyIHRvIHN0b3JlCi0gICAgICogQHBhcmFtIGZvcmVDb2xvciB0aGUgZm9yZWdyb3VuZCBjb2xvcgotICAgICAqIEBwYXJhbSBiYWNrQ29sb3IgdGhlIGJhY2tncm91bmQgY29sb3IKLSAgICAgKi8KLSAgICB2b2lkIHNldChpbnQgeCwgaW50IHksIGJ5dGUgYiwgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcik7Ci0KLSAgICAvKioKLSAgICAgKiBTY3JvbGwgdGhlIHNjcmVlbiBkb3duIG9uZSBsaW5lLiBUbyBzY3JvbGwgdGhlIHdob2xlIHNjcmVlbiBvZiBhIDI0IGxpbmUKLSAgICAgKiBzY3JlZW4sIHRoZSBhcmd1bWVudHMgd291bGQgYmUgKDAsIDI0KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0b3BNYXJnaW4gRmlyc3QgbGluZSB0aGF0IGlzIHNjcm9sbGVkLgotICAgICAqIEBwYXJhbSBib3R0b21NYXJnaW4gT25lIGxpbmUgYWZ0ZXIgdGhlIGxhc3QgbGluZSB0aGF0IGlzIHNjcm9sbGVkLgotICAgICAqLwotICAgIHZvaWQgc2Nyb2xsKGludCB0b3BNYXJnaW4sIGludCBib3R0b21NYXJnaW4sIGludCBmb3JlQ29sb3IsIGludCBiYWNrQ29sb3IpOwotCi0gICAgLyoqCi0gICAgICogQmxvY2sgY29weSBjaGFyYWN0ZXJzIGZyb20gb25lIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gdG8gYW5vdGhlci4gVGhlIHR3bwotICAgICAqIHBvc2l0aW9ucyBjYW4gb3ZlcmxhcC4gQWxsIGNoYXJhY3RlcnMgb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbXVzdAotICAgICAqIGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBzY3JlZW4sIG9yIGVsc2UgYW4gSW52YWxpZFBhcmVtZXRlckV4Y2VwdGlvbgotICAgICAqIHdpbGwgYmUgdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIHN4IHNvdXJjZSBYIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gc3kgc291cmNlIFkgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB3IHdpZHRoCi0gICAgICogQHBhcmFtIGggaGVpZ2h0Ci0gICAgICogQHBhcmFtIGR4IGRlc3RpbmF0aW9uIFggY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSBkeSBkZXN0aW5hdGlvbiBZIGNvb3JkaW5hdGUKLSAgICAgKi8KLSAgICB2b2lkIGJsb2NrQ29weShpbnQgc3gsIGludCBzeSwgaW50IHcsIGludCBoLCBpbnQgZHgsIGludCBkeSk7Ci0KLSAgICAvKioKLSAgICAgKiBCbG9jayBzZXQgY2hhcmFjdGVycy4gQWxsIGNoYXJhY3RlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKLSAgICAgKiBzY3JlZW4sIG9yIGVsc2UgYW5kIEludmFsaWRQYXJlbWV0ZXJFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIFR5cGljYWxseQotICAgICAqIHRoaXMgaXMgY2FsbGVkIHdpdGggYSAidmFsIiBhcmd1bWVudCBvZiAzMiB0byBjbGVhciBhIGJsb2NrIG9mCi0gICAgICogY2hhcmFjdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeCBzb3VyY2UgWAotICAgICAqIEBwYXJhbSBzeSBzb3VyY2UgWQotICAgICAqIEBwYXJhbSB3IHdpZHRoCi0gICAgICogQHBhcmFtIGggaGVpZ2h0Ci0gICAgICogQHBhcmFtIHZhbCB2YWx1ZSB0byBzZXQuCi0gICAgICogQHBhcmFtIGZvcmVDb2xvciB0aGUgZm9yZWdyb3VuZCBjb2xvcgotICAgICAqIEBwYXJhbSBiYWNrQ29sb3IgdGhlIGJhY2tncm91bmQgY29sb3IKLSAgICAgKi8KLSAgICB2b2lkIGJsb2NrU2V0KGludCBzeCwgaW50IHN5LCBpbnQgdywgaW50IGgsIGludCB2YWwsIGludCBmb3JlQ29sb3IsIGludAotICAgICAgICAgICAgYmFja0NvbG9yKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zY3JpcHQgYnVmZmVyIGFzIGEgdGV4dCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNjcmlwdCBidWZmZXIuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRyYW5zY3JpcHRUZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgdGhlIHNjcmVlbgotICAgICAqIEBwYXJhbSBjb2x1bW5zCi0gICAgICogQHBhcmFtIHJvd3MKLSAgICAgKi8KLSAgICB2b2lkIHJlc2l6ZShpbnQgY29sdW1ucywgaW50IHJvd3MsIGludCBmb3JlQ29sb3IsIGludCBiYWNrQ29sb3IpOwotfQotCi0KLS8qKgotICogQSBUcmFuc2NyaXB0U2NyZWVuIGlzIGEgc2NyZWVuIHRoYXQgcmVtZW1iZXJzIGRhdGEgdGhhdCdzIGJlZW4gc2Nyb2xsZWQuIFRoZQotICogb2xkIGRhdGEgaXMgc3RvcmVkIGluIGEgcmluZyBidWZmZXIgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBjb3B5aW5nIHRoYXQKLSAqIG5lZWRzIHRvIGJlIGRvbmUuIFRoZSB0cmFuc2NyaXB0IGRvZXMgaXRzIG93biBkcmF3aW5nLCB0byBhdm9pZCBoYXZpbmcgdG8KLSAqIGV4cG9zZSBpdHMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgotICovCi1jbGFzcyBUcmFuc2NyaXB0U2NyZWVuIGltcGxlbWVudHMgU2NyZWVuIHsKLQotICAgIC8qKgotICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgdHJhbnNjcmlwdCwgaW4gY2hhcmFjdGVycy4gRml4ZWQgYXQgaW5pdGlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUNvbHVtbnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRyYW5zY3JpcHQgYW5kIHRoZSBzY3JlZW4uIEZpeGVkIGF0Ci0gICAgICogaW5pdGlhbGl6YXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbVRvdGFsUm93czsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgYWN0aXZlIHBvcnRpb24gb2YgdGhlIHRyYW5zY3JpcHQuIERvZXNuJ3QKLSAgICAgKiBpbmNsdWRlIHRoZSBzY3JlZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVRyYW5zY3JpcHRSb3dzOwotCi0gICAgLyoqCi0gICAgICogV2hpY2ggcm93IGlzIGN1cnJlbnRseSB0aGUgdG9wbW9zdCBsaW5lIG9mIHRoZSB0cmFuc2NyaXB0LiBVc2VkIHRvCi0gICAgICogaW1wbGVtZW50IGEgY2lyY3VsYXIgYnVmZmVyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1IZWFkOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBhY3RpdmUgcm93cywgaW5jbHVkZXMgYm90aCB0aGUgdHJhbnNjcmlwdCBhbmQgdGhlIHNjcmVlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQWN0aXZlUm93czsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc2NyZWVuLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1TY3JlZW5Sb3dzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRhdGEgZm9yIGJvdGggdGhlIHNjcmVlbiBhbmQgdGhlIHRyYW5zY3JpcHQuIFRoZSBmaXJzdCBtU2NyZWVuUm93cyAqCi0gICAgICogbUxpbmVXaWR0aCBjaGFyYWN0ZXJzIGFyZSB0aGUgc2NyZWVuLCB0aGUgcmVzdCBhcmUgdGhlIHRyYW5zY3JpcHQuCi0gICAgICogVGhlIGxvdyBieXRlIGVuY29kZXMgdGhlIEFTQ0lJIGNoYXJhY3RlciwgdGhlIGhpZ2ggYnl0ZSBlbmNvZGVzIHRoZQotICAgICAqIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCBwbHVzIHVuZGVybGluZSBhbmQgYm9sZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNoYXJbXSBtRGF0YTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkYXRhJ3Mgc3RvcmVkIGFzIGNvbG9yLWVuY29kZWQgY2hhcnMsIGJ1dCB0aGUgZHJhd2luZyByb3V0aW5lcyByZXF1aXJlIGNoYXJzLCBzbyB3ZQotICAgICAqIG5lZWQgYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgYSByb3cncyB3b3J0aCBvZiBjaGFyYWN0ZXJzLgotICAgICAqLwotICAgIHByaXZhdGUgY2hhcltdIG1Sb3dCdWZmZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFncyB0aGF0IGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgY3VycmVudCBsaW5lIGxvZ2ljYWxseSB3cmFwcyB0byB0aGUKLSAgICAgKiBuZXh0IGxpbmUuIFRoaXMgaXMgdXNlZCB3aGVuIHJlc2l6aW5nIHRoZSBzY3JlZW4gYW5kIHdoZW4gY29weWluZyB0byB0aGUKLSAgICAgKiBjbGlwYm9hcmQgb3IgYW4gZW1haWwgYXR0YWNobWVudAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuW10gbUxpbmVXcmFwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdHJhbnNjcmlwdCBzY3JlZW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1ucyB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbiBpbiBjaGFyYWN0ZXJzLgotICAgICAqIEBwYXJhbSB0b3RhbFJvd3MgdGhlIGhlaWdodCBvZiB0aGUgZW50aXJlIHRleHQgYXJlYSwgaW4gcm93cyBvZiB0ZXh0LgotICAgICAqIEBwYXJhbSBzY3JlZW5Sb3dzIHRoZSBoZWlnaHQgb2YganVzdCB0aGUgc2NyZWVuLCBub3QgaW5jbHVkaW5nIHRoZQotICAgICAqICAgICAgICB0cmFuc2NyaXB0IHRoYXQgaG9sZHMgbGluZXMgdGhhdCBoYXZlIHNjcm9sbGVkIG9mZiB0aGUgdG9wIG9mIHRoZQotICAgICAqICAgICAgICBzY3JlZW4uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zY3JpcHRTY3JlZW4oaW50IGNvbHVtbnMsIGludCB0b3RhbFJvd3MsIGludCBzY3JlZW5Sb3dzLAotICAgICAgICAgICAgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcikgewotICAgICAgICBpbml0KGNvbHVtbnMsIHRvdGFsUm93cywgc2NyZWVuUm93cywgZm9yZUNvbG9yLCBiYWNrQ29sb3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KGludCBjb2x1bW5zLCBpbnQgdG90YWxSb3dzLCBpbnQgc2NyZWVuUm93cywgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcikgewotICAgICAgICBtQ29sdW1ucyA9IGNvbHVtbnM7Ci0gICAgICAgIG1Ub3RhbFJvd3MgPSB0b3RhbFJvd3M7Ci0gICAgICAgIG1BY3RpdmVUcmFuc2NyaXB0Um93cyA9IDA7Ci0gICAgICAgIG1IZWFkID0gMDsKLSAgICAgICAgbUFjdGl2ZVJvd3MgPSBzY3JlZW5Sb3dzOwotICAgICAgICBtU2NyZWVuUm93cyA9IHNjcmVlblJvd3M7Ci0gICAgICAgIGludCB0b3RhbFNpemUgPSBjb2x1bW5zICogdG90YWxSb3dzOwotICAgICAgICBtRGF0YSA9IG5ldyBjaGFyW3RvdGFsU2l6ZV07Ci0gICAgICAgIGJsb2NrU2V0KDAsIDAsIG1Db2x1bW5zLCBtU2NyZWVuUm93cywgJyAnLCBmb3JlQ29sb3IsIGJhY2tDb2xvcik7Ci0gICAgICAgIG1Sb3dCdWZmZXIgPSBuZXcgY2hhcltjb2x1bW5zXTsKLSAgICAgICAgbUxpbmVXcmFwID0gbmV3IGJvb2xlYW5bdG90YWxSb3dzXTsKLSAgICAgICAgY29uc2lzdGVuY3lDaGVjaygpOwotICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIHJvdyB2YWx1ZSBmcm9tIHRoZSBwdWJsaWMgZXh0ZXJuYWwgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gb3VyCi0gICAgICogaW50ZXJuYWwgcHJpdmF0ZSBjb29yZGluYXRlIHN5c3RlbS4gRXh0ZXJuYWwgY29vcmRpbmF0ZSBzeXN0ZW06Ci0gICAgICogLW1BY3RpdmVUcmFuc2NyaXB0Um93cyB0byBtU2NyZWVuUm93cy0xLCB3aXRoIHRoZSBzY3JlZW4gYmVpbmcKLSAgICAgKiAwLi5tU2NyZWVuUm93cy0xIEludGVybmFsIGNvb3JkaW5hdGUgc3lzdGVtOiAwLi5tU2NyZWVuUm93cy0xIHJvd3Mgb2YKLSAgICAgKiBtRGF0YSBhcmUgdGhlIHZpc2libGUgcm93cy4gbVNjcmVlblJvd3MuLm1BY3RpdmVSb3dzIC0gMSBhcmUgdGhlCi0gICAgICogdHJhbnNjcmlwdCwgc3RvcmVkIGFzIGEgY2lyY3VsYXIgYnVmZmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdyBhIHJvdyBpbiB0aGUgZXh0ZXJuYWwgY29vcmRpbmF0ZSBzeXN0ZW0uCi0gICAgICogQHJldHVybiBUaGUgcm93IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGFyZ3VtZW50IGluIHRoZSBwcml2YXRlCi0gICAgICogICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBleHRlcm5hbFRvSW50ZXJuYWxSb3coaW50IHJvdykgewotICAgICAgICBpZiAocm93IDwgLW1BY3RpdmVUcmFuc2NyaXB0Um93cyB8fCByb3cgPj0gbVNjcmVlblJvd3MpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm93ID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiByb3c7IC8vIFRoaXMgaXMgYSB2aXNpYmxlIHJvdy4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNjcmVlblJvd3MKLSAgICAgICAgICAgICAgICArICgobUhlYWQgKyBtQWN0aXZlVHJhbnNjcmlwdFJvd3MgKyByb3cpICUgbUFjdGl2ZVRyYW5zY3JpcHRSb3dzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRPZmZzZXQoaW50IGV4dGVybmFsTGluZSkgewotICAgICAgICByZXR1cm4gZXh0ZXJuYWxUb0ludGVybmFsUm93KGV4dGVybmFsTGluZSkgKiBtQ29sdW1uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHJldHVybiBnZXRPZmZzZXQoeSkgKyB4OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpbmVXcmFwKGludCByb3cpIHsKLSAgICAgICAgbUxpbmVXcmFwW2V4dGVybmFsVG9JbnRlcm5hbFJvdyhyb3cpXSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgYnl0ZSBiIGludG8gdGhlIHNjcmVlbiBhdCBsb2NhdGlvbiAoeCwgeSkKLSAgICAgKgotICAgICAqIEBwYXJhbSB4IFggY29vcmRpbmF0ZSAoYWxzbyBrbm93biBhcyBjb2x1bW4pCi0gICAgICogQHBhcmFtIHkgWSBjb29yZGluYXRlIChhbHNvIGtub3duIGFzIHJvdykKLSAgICAgKiBAcGFyYW0gYiBBU0NJSSBjaGFyYWN0ZXIgdG8gc3RvcmUKLSAgICAgKiBAcGFyYW0gZm9yZUNvbG9yIHRoZSBmb3JlZ3JvdW5kIGNvbG9yCi0gICAgICogQHBhcmFtIGJhY2tDb2xvciB0aGUgYmFja2dyb3VuZCBjb2xvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChpbnQgeCwgaW50IHksIGJ5dGUgYiwgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcikgewotICAgICAgICBtRGF0YVtnZXRPZmZzZXQoeCwgeSldID0gZW5jb2RlKGIsIGZvcmVDb2xvciwgYmFja0NvbG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNoYXIgZW5jb2RlKGludCBiLCBpbnQgZm9yZUNvbG9yLCBpbnQgYmFja0NvbG9yKSB7Ci0gICAgICAgIHJldHVybiAoY2hhcikgKChmb3JlQ29sb3IgPDwgMTIpIHwgKGJhY2tDb2xvciA8PCA4KSB8IGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjcm9sbCB0aGUgc2NyZWVuIGRvd24gb25lIGxpbmUuIFRvIHNjcm9sbCB0aGUgd2hvbGUgc2NyZWVuIG9mIGEgMjQgbGluZQotICAgICAqIHNjcmVlbiwgdGhlIGFyZ3VtZW50cyB3b3VsZCBiZSAoMCwgMjQpLgotICAgICAqCi0gICAgICogQHBhcmFtIHRvcE1hcmdpbiBGaXJzdCBsaW5lIHRoYXQgaXMgc2Nyb2xsZWQuCi0gICAgICogQHBhcmFtIGJvdHRvbU1hcmdpbiBPbmUgbGluZSBhZnRlciB0aGUgbGFzdCBsaW5lIHRoYXQgaXMgc2Nyb2xsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2Nyb2xsKGludCB0b3BNYXJnaW4sIGludCBib3R0b21NYXJnaW4sIGludCBmb3JlQ29sb3IsCi0gICAgICAgICAgICBpbnQgYmFja0NvbG9yKSB7Ci0gICAgICAgIGlmICh0b3BNYXJnaW4gPiBib3R0b21NYXJnaW4gLSAyIHx8IHRvcE1hcmdpbiA+IG1TY3JlZW5Sb3dzIC0gMgotICAgICAgICAgICAgICAgIHx8IGJvdHRvbU1hcmdpbiA+IG1TY3JlZW5Sb3dzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGp1c3QgdGhlIHRyYW5zY3JpcHQgc28gdGhhdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSB0cmFuc2NyaXB0Ci0gICAgICAgIC8vIGlzIHJlYWR5IHRvIHJlY2VpdmUgdGhlIG5ld2x5IHNjcm9sbGVkIGRhdGEKLSAgICAgICAgY29uc2lzdGVuY3lDaGVjaygpOwotICAgICAgICBpbnQgZXhwYW5zaW9uUm93cyA9IE1hdGgubWluKDEsIG1Ub3RhbFJvd3MgLSBtQWN0aXZlUm93cyk7Ci0gICAgICAgIGludCByb2xsUm93cyA9IDEgLSBleHBhbnNpb25Sb3dzOwotICAgICAgICBtQWN0aXZlUm93cyArPSBleHBhbnNpb25Sb3dzOwotICAgICAgICBtQWN0aXZlVHJhbnNjcmlwdFJvd3MgKz0gZXhwYW5zaW9uUm93czsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFuc2NyaXB0Um93cyA+IDApIHsKLSAgICAgICAgICAgIG1IZWFkID0gKG1IZWFkICsgcm9sbFJvd3MpICUgbUFjdGl2ZVRyYW5zY3JpcHRSb3dzOwotICAgICAgICB9Ci0gICAgICAgIGNvbnNpc3RlbmN5Q2hlY2soKTsKLQotICAgICAgICAvLyBCbG9jayBtb3ZlIHRoZSBzY3JvbGwgbGluZSB0byB0aGUgdHJhbnNjcmlwdAotICAgICAgICBpbnQgdG9wT2Zmc2V0ID0gZ2V0T2Zmc2V0KHRvcE1hcmdpbik7Ci0gICAgICAgIGludCBkZXN0T2Zmc2V0ID0gZ2V0T2Zmc2V0KC0xKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRGF0YSwgdG9wT2Zmc2V0LCBtRGF0YSwgZGVzdE9mZnNldCwgbUNvbHVtbnMpOwotCi0gICAgICAgIGludCB0b3BMaW5lID0gZXh0ZXJuYWxUb0ludGVybmFsUm93KHRvcE1hcmdpbik7Ci0gICAgICAgIGludCBkZXN0TGluZSA9IGV4dGVybmFsVG9JbnRlcm5hbFJvdygtMSk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUxpbmVXcmFwLCB0b3BMaW5lLCBtTGluZVdyYXAsIGRlc3RMaW5lLCAxKTsKLQotICAgICAgICAvLyBCbG9jayBtb3ZlIHRoZSBzY3JvbGxlZCBkYXRhIHVwCi0gICAgICAgIGludCBudW1TY3JvbGxDaGFycyA9IChib3R0b21NYXJnaW4gLSB0b3BNYXJnaW4gLSAxKSAqIG1Db2x1bW5zOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1EYXRhLCB0b3BPZmZzZXQgKyBtQ29sdW1ucywgbURhdGEsIHRvcE9mZnNldCwKLSAgICAgICAgICAgICAgICBudW1TY3JvbGxDaGFycyk7Ci0gICAgICAgIGludCBudW1TY3JvbGxMaW5lcyA9IChib3R0b21NYXJnaW4gLSB0b3BNYXJnaW4gLSAxKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTGluZVdyYXAsIHRvcExpbmUgKyAxLCBtTGluZVdyYXAsIHRvcExpbmUsCi0gICAgICAgICAgICAgICAgbnVtU2Nyb2xsTGluZXMpOwotCi0gICAgICAgIC8vIEVyYXNlIHRoZSBib3R0b20gbGluZSBvZiB0aGUgc2Nyb2xsIHJlZ2lvbgotICAgICAgICBibG9ja1NldCgwLCBib3R0b21NYXJnaW4gLSAxLCBtQ29sdW1ucywgMSwgJyAnLCBmb3JlQ29sb3IsIGJhY2tDb2xvcik7Ci0gICAgICAgIG1MaW5lV3JhcFtleHRlcm5hbFRvSW50ZXJuYWxSb3coYm90dG9tTWFyZ2luLTEpXSA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25zaXN0ZW5jeUNoZWNrKCkgewotICAgICAgICBjaGVja1Bvc2l0aXZlKG1Db2x1bW5zKTsKLSAgICAgICAgY2hlY2tQb3NpdGl2ZShtVG90YWxSb3dzKTsKLSAgICAgICAgY2hlY2tSYW5nZSgwLCBtQWN0aXZlVHJhbnNjcmlwdFJvd3MsIG1Ub3RhbFJvd3MpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYW5zY3JpcHRSb3dzID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrRXF1YWwobUhlYWQsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tSYW5nZSgwLCBtSGVhZCwgbUFjdGl2ZVRyYW5zY3JpcHRSb3dzLTEpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrRXF1YWwobVNjcmVlblJvd3MgKyBtQWN0aXZlVHJhbnNjcmlwdFJvd3MsIG1BY3RpdmVSb3dzKTsKLSAgICAgICAgY2hlY2tSYW5nZSgwLCBtU2NyZWVuUm93cywgbVRvdGFsUm93cyk7Ci0KLSAgICAgICAgY2hlY2tFcXVhbChtVG90YWxSb3dzLCBtTGluZVdyYXAubGVuZ3RoKTsKLSAgICAgICAgY2hlY2tFcXVhbChtVG90YWxSb3dzKm1Db2x1bW5zLCBtRGF0YS5sZW5ndGgpOwotICAgICAgICBjaGVja0VxdWFsKG1Db2x1bW5zLCBtUm93QnVmZmVyLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUG9zaXRpdmUoaW50IG4pIHsKLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGVja1Bvc2l0aXZlICIgKyBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JhbmdlKGludCBhLCBpbnQgYiwgaW50IGMpIHsKLSAgICAgICAgaWYgKGEgPiBiIHx8IGIgPiBjKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGVja1JhbmdlICIgKyBhICsgIiA8PSAiICsgYiArICIgPD0gIiArIGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWwoaW50IGEsIGludCBiKSB7Ci0gICAgICAgIGlmIChhICE9IGIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNoZWNrRXF1YWwgIiArIGEgKyAiID09ICIgKyBiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJsb2NrIGNvcHkgY2hhcmFjdGVycyBmcm9tIG9uZSBwb3NpdGlvbiBpbiB0aGUgc2NyZWVuIHRvIGFub3RoZXIuIFRoZSB0d28KLSAgICAgKiBwb3NpdGlvbnMgY2FuIG92ZXJsYXAuIEFsbCBjaGFyYWN0ZXJzIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QKLSAgICAgKiBiZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgc2NyZWVuLCBvciBlbHNlIGFuIEludmFsaWRQYXJlbWV0ZXJFeGNlcHRpb24KLSAgICAgKiB3aWxsIGJlIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzeCBzb3VyY2UgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN5IHNvdXJjZSBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gdyB3aWR0aAotICAgICAqIEBwYXJhbSBoIGhlaWdodAotICAgICAqIEBwYXJhbSBkeCBkZXN0aW5hdGlvbiBYIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gZHkgZGVzdGluYXRpb24gWSBjb29yZGluYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmxvY2tDb3B5KGludCBzeCwgaW50IHN5LCBpbnQgdywgaW50IGgsIGludCBkeCwgaW50IGR5KSB7Ci0gICAgICAgIGlmIChzeCA8IDAgfHwgc3ggKyB3ID4gbUNvbHVtbnMgfHwgc3kgPCAwIHx8IHN5ICsgaCA+IG1TY3JlZW5Sb3dzCi0gICAgICAgICAgICAgICAgfHwgZHggPCAwIHx8IGR4ICsgdyA+IG1Db2x1bW5zIHx8IGR5IDwgMAotICAgICAgICAgICAgICAgIHx8IGR5ICsgaCA+IG1TY3JlZW5Sb3dzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN5IDw9IGR5KSB7Ci0gICAgICAgICAgICAvLyBNb3ZlIGluIGluY3JlYXNpbmcgb3JkZXIKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY09mZnNldCA9IGdldE9mZnNldChzeCwgc3kgKyB5KTsKLSAgICAgICAgICAgICAgICBpbnQgZHN0T2Zmc2V0ID0gZ2V0T2Zmc2V0KGR4LCBkeSArIHkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobURhdGEsIHNyY09mZnNldCwgbURhdGEsIGRzdE9mZnNldCwgdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNb3ZlIGluIGRlY3JlYXNpbmcgb3JkZXIKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHkyID0gaCAtICh5ICsgMSk7Ci0gICAgICAgICAgICAgICAgaW50IHNyY09mZnNldCA9IGdldE9mZnNldChzeCwgc3kgKyB5Mik7Ci0gICAgICAgICAgICAgICAgaW50IGRzdE9mZnNldCA9IGdldE9mZnNldChkeCwgZHkgKyB5Mik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRGF0YSwgc3JjT2Zmc2V0LCBtRGF0YSwgZHN0T2Zmc2V0LCB3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJsb2NrIHNldCBjaGFyYWN0ZXJzLiBBbGwgY2hhcmFjdGVycyBtdXN0IGJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZQotICAgICAqIHNjcmVlbiwgb3IgZWxzZSBhbmQgSW52YWxpZFBhcmVtZXRlckV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gVHlwaWNhbGx5Ci0gICAgICogdGhpcyBpcyBjYWxsZWQgd2l0aCBhICJ2YWwiIGFyZ3VtZW50IG9mIDMyIHRvIGNsZWFyIGEgYmxvY2sgb2YKLSAgICAgKiBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN4IHNvdXJjZSBYCi0gICAgICogQHBhcmFtIHN5IHNvdXJjZSBZCi0gICAgICogQHBhcmFtIHcgd2lkdGgKLSAgICAgKiBAcGFyYW0gaCBoZWlnaHQKLSAgICAgKiBAcGFyYW0gdmFsIHZhbHVlIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBibG9ja1NldChpbnQgc3gsIGludCBzeSwgaW50IHcsIGludCBoLCBpbnQgdmFsLAotICAgICAgICAgICAgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcikgewotICAgICAgICBpZiAoc3ggPCAwIHx8IHN4ICsgdyA+IG1Db2x1bW5zIHx8IHN5IDwgMCB8fCBzeSArIGggPiBtU2NyZWVuUm93cykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJbXSBkYXRhID0gbURhdGE7Ci0gICAgICAgIGNoYXIgZW5jb2RlZFZhbCA9IGVuY29kZSh2YWwsIGZvcmVDb2xvciwgYmFja0NvbG9yKTsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXQoc3gsIHN5ICsgeSk7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgewotICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgeF0gPSBlbmNvZGVkVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhdyBhIHJvdyBvZiB0ZXh0LiBPdXQtb2YtYm91bmRzIHJvd3MgYXJlIGJsYW5rLCBub3QgZXJyb3JzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdyBUaGUgcm93IG9mIHRleHQgdG8gZHJhdy4KLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgdG8gZHJhdyB0by4KLSAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9yaWdpbiBvZiB0aGUgZHJhd2luZwotICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb3JpZ2luIG9mIHRoZSBkcmF3aW5nCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIFRoZSByZW5kZXJlciB0byB1c2UgdG8gZHJhdyB0aGUgdGV4dAotICAgICAqIEBwYXJhbSBjeCB0aGUgY3Vyc29yIFggY29vcmRpbmF0ZSwgLTEgbWVhbnMgZG9uJ3QgZHJhdyBpdAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRyYXdUZXh0KGludCByb3csIENhbnZhcyBjYW52YXMsIGZsb2F0IHgsIGZsb2F0IHksCi0gICAgICAgICAgICBUZXh0UmVuZGVyZXIgcmVuZGVyZXIsIGludCBjeCkgewotCi0gICAgICAgIC8vIE91dC1vZi1ib3VuZHMgcm93cyBhcmUgYmxhbmsuCi0gICAgICAgIGlmIChyb3cgPCAtbUFjdGl2ZVRyYW5zY3JpcHRSb3dzIHx8IHJvdyA+PSBtU2NyZWVuUm93cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBieXRlIGFycmF5IHRvIGEgY2hhciBhcnJheSBzbyB0aGV5IGNhbgotICAgICAgICAvLyBiZSBkcmF3bi4KLQotICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KHJvdyk7Ci0gICAgICAgIGNoYXJbXSByb3dCdWZmZXIgPSBtUm93QnVmZmVyOwotICAgICAgICBjaGFyW10gZGF0YSA9IG1EYXRhOwotICAgICAgICBpbnQgY29sdW1ucyA9IG1Db2x1bW5zOwotICAgICAgICBpbnQgbGFzdENvbG9ycyA9IDA7Ci0gICAgICAgIGludCBsYXN0UnVuU3RhcnQgPSAtMTsKLSAgICAgICAgZmluYWwgaW50IENVUlNPUl9NQVNLID0gMHgxMDAwMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IGRhdGFbb2Zmc2V0ICsgaV07Ci0gICAgICAgICAgICBpbnQgY29sb3JzID0gKGNoYXIpIChjICYgMHhmZjAwKTsKLSAgICAgICAgICAgIGlmIChjeCA9PSBpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IGN1cnNvciBiYWNrZ3JvdW5kIGNvbG9yOgotICAgICAgICAgICAgICAgIGNvbG9ycyB8PSBDVVJTT1JfTUFTSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvd0J1ZmZlcltpXSA9IChjaGFyKSAoYyAmIDB4MDBmZik7Ci0gICAgICAgICAgICBpZiAoY29sb3JzICE9IGxhc3RDb2xvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFJ1blN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1RleHRSdW4oY2FudmFzLCB4LCB5LCBsYXN0UnVuU3RhcnQsIHJvd0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UnVuU3RhcnQsIGkgLSBsYXN0UnVuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RDb2xvcnMgJiBDVVJTT1JfTUFTSykgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYgJiAobGFzdENvbG9ycyA+PiAxMiksIDB4ZiAmIChsYXN0Q29sb3JzID4+IDgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGFzdENvbG9ycyA9IGNvbG9yczsKLSAgICAgICAgICAgICAgICBsYXN0UnVuU3RhcnQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0UnVuU3RhcnQgPj0gMCkgewotICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1RleHRSdW4oY2FudmFzLCB4LCB5LCBsYXN0UnVuU3RhcnQsIHJvd0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgbGFzdFJ1blN0YXJ0LCBjb2x1bW5zIC0gbGFzdFJ1blN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAobGFzdENvbG9ycyAmIENVUlNPUl9NQVNLKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAweGYgJiAobGFzdENvbG9ycyA+PiAxMiksIDB4ZiAmIChsYXN0Q29sb3JzID4+IDgpKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvdW50IG9mIGFjdGl2ZSByb3dzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY291bnQgb2YgYWN0aXZlIHJvd3MuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRBY3RpdmVSb3dzKCkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVJvd3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb3VudCBvZiBhY3RpdmUgdHJhbnNjcmlwdCByb3dzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY291bnQgb2YgYWN0aXZlIHRyYW5zY3JpcHQgcm93cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEFjdGl2ZVRyYW5zY3JpcHRSb3dzKCkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYW5zY3JpcHRSb3dzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNjcmlwdFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcm5hbEdldFRyYW5zY3JpcHRUZXh0KHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGludGVybmFsR2V0VHJhbnNjcmlwdFRleHQoYm9vbGVhbiBzdHJpcENvbG9ycykgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBjaGFyW10gcm93QnVmZmVyID0gbVJvd0J1ZmZlcjsKLSAgICAgICAgY2hhcltdIGRhdGEgPSBtRGF0YTsKLSAgICAgICAgaW50IGNvbHVtbnMgPSBtQ29sdW1uczsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gLW1BY3RpdmVUcmFuc2NyaXB0Um93czsgcm93IDwgbVNjcmVlblJvd3M7IHJvdysrKSB7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KHJvdyk7Ci0gICAgICAgICAgICBpbnQgbGFzdFByaW50aW5nQ2hhciA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgY29sdW1uczsgY29sdW1uKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSBkYXRhW29mZnNldCArIGNvbHVtbl07Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmlwQ29sb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSAoY2hhcikgKGMgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjICYgMHhmZikgIT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RQcmludGluZ0NoYXIgPSBjb2x1bW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJvd0J1ZmZlcltjb2x1bW5dID0gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTGluZVdyYXBbZXh0ZXJuYWxUb0ludGVybmFsUm93KHJvdyldKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocm93QnVmZmVyLCAwLCBjb2x1bW5zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocm93QnVmZmVyLCAwLCBsYXN0UHJpbnRpbmdDaGFyICsgMSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNpemUoaW50IGNvbHVtbnMsIGludCByb3dzLCBpbnQgZm9yZUNvbG9yLCBpbnQgYmFja0NvbG9yKSB7Ci0gICAgICAgIGluaXQoY29sdW1ucywgbVRvdGFsUm93cywgcm93cywgZm9yZUNvbG9yLCBiYWNrQ29sb3IpOwotICAgIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIHRleHQgaW50byBhIHNjcmVlbi4gQ29udGFpbnMgYWxsIHRoZSB0ZXJtaW5hbC1zcGVjaWZpYyBrbm93bGVnZSBhbmQKLSAqIHN0YXRlLiBFbXVsYXRlcyBhIHN1YnNldCBvZiB0aGUgWCBXaW5kb3cgU3lzdGVtIHh0ZXJtIHRlcm1pbmFsLCB3aGljaCBpbiB0dXJuCi0gKiBpcyBhbiBlbXVsYXRvciBmb3IgYSBzdWJzZXQgb2YgdGhlIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIHZ0MTAwCi0gKiB0ZXJtaW5hbC4gTWlzc2luZyBmdW5jdGlvbmFsaXR5OiB0ZXh0IGF0dHJpYnV0ZXMgKGJvbGQsIHVuZGVybGluZSwgcmV2ZXJzZQotICogdmlkZW8sIGNvbG9yKSBhbHRlcm5hdGUgc2NyZWVuIGN1cnNvciBrZXkgYW5kIGtleXBhZCBlc2NhcGUgc2VxdWVuY2VzLgotICovCi1jbGFzcyBUZXJtaW5hbEVtdWxhdG9yIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJzb3Igcm93LiBOdW1iZXJlZCAwLi5tUm93cy0xLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1DdXJzb3JSb3c7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3Vyc29yIGNvbHVtbi4gTnVtYmVyZWQgMC4ubUNvbHVtbnMtMS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQ3Vyc29yQ29sOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgcm93cyBpbiB0aGUgdGVybWluYWwgc2NyZWVuLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Sb3dzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgY29sdW1ucyBpbiB0aGUgdGVybWluYWwgc2NyZWVuLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Db2x1bW5zOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzZW5kIGRhdGEgdG8gdGhlIHJlbW90ZSBwcm9jZXNzLiBOZWVkZWQgdG8gaW1wbGVtZW50IHRoZSB2YXJpb3VzCi0gICAgICogInJlcG9ydCIgZXNjYXBlIHNlcXVlbmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gbVRlcm1PdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgb24gdGhlIHNjcmVlbiBvZiB0aGUgZW11bGF0ZWQgdGVybWluYWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTY3JlZW4gbVNjcmVlbjsKLQotICAgIC8qKgotICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGFyZ3VtZW50IG9mIHRoZSBjdXJyZW50IGVzY2FwZSBzZXF1ZW5jZS4KLSAgICAgKiBSYW5nZXMgZnJvbSAwIHRvIE1BWF9FU0NBUEVfUEFSQU1FVEVSUy0xLiAoVHlwaWNhbGx5IGp1c3QgMCBvciAxLikKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQXJnSW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlciBhcmd1bWVudHMuIFRoaXMgbmFtZSBjb21lcyBmcm9tIHRoZSBBTlNJIHN0YW5kYXJkCi0gICAgICogZm9yIHRlcm1pbmFsIGVzY2FwZSBjb2Rlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0VTQ0FQRV9QQVJBTUVURVJTID0gMTY7Ci0KLSAgICAvKioKLSAgICAgKiBIb2xkcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBjdXJyZW50IGVzY2FwZSBzZXF1ZW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludFtdIG1BcmdzID0gbmV3IGludFtNQVhfRVNDQVBFX1BBUkFNRVRFUlNdOwotCi0gICAgLy8gRXNjYXBlIHByb2Nlc3Npbmcgc3RhdGVzOgotCi0gICAgLyoqCi0gICAgICogRXNjYXBlIHByb2Nlc3Npbmcgc3RhdGU6IE5vdCBjdXJyZW50bHkgaW4gYW4gZXNjYXBlIHNlcXVlbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFU0NfTk9ORSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFc2NhcGUgcHJvY2Vzc2luZyBzdGF0ZTogSGF2ZSBzZWVuIGFuIEVTQyBjaGFyYWN0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVNDID0gMTsKLQotICAgIC8qKgotICAgICAqIEVzY2FwZSBwcm9jZXNzaW5nIHN0YXRlOiBIYXZlIHNlZW4gRVNDIFBPVU5ECi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ19QT1VORCA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBFc2NhcGUgcHJvY2Vzc2luZyBzdGF0ZTogSGF2ZSBzZWVuIEVTQyBhbmQgYSBjaGFyYWN0ZXItc2V0LXNlbGVjdCBjaGFyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ19TRUxFQ1RfTEVGVF9QQVJFTiA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBFc2NhcGUgcHJvY2Vzc2luZyBzdGF0ZTogSGF2ZSBzZWVuIEVTQyBhbmQgYSBjaGFyYWN0ZXItc2V0LXNlbGVjdCBjaGFyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ19TRUxFQ1RfUklHSFRfUEFSRU4gPSA0OwotCi0gICAgLyoqCi0gICAgICogRXNjYXBlIHByb2Nlc3Npbmcgc3RhdGU6IEVTQyBbCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ19MRUZUX1NRVUFSRV9CUkFDS0VUID0gNTsKLQotICAgIC8qKgotICAgICAqIEVzY2FwZSBwcm9jZXNzaW5nIHN0YXRlOiBFU0MgWyA/Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVTQ19MRUZUX1NRVUFSRV9CUkFDS0VUX1FVRVNUSU9OX01BUksgPSA2OwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudCBlc2NhcGUgc2VxdWVuY2Ugc2hvdWxkIGNvbnRpbnVlLCBmYWxzZSBpZiB0aGUgY3VycmVudAotICAgICAqIGVzY2FwZSBzZXF1ZW5jZSBzaG91bGQgYmUgdGVybWluYXRlZC4gVXNlZCB3aGVuIHBhcnNpbmcgYSBzaW5nbGUKLSAgICAgKiBjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Db250aW51ZVNlcXVlbmNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVzY2FwZSBzZXF1ZW5jZSBzdGF0ZSBtYWNoaW5lLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Fc2NhcGVTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFNhdmVkIHN0YXRlIG9mIHRoZSBjdXJzb3Igcm93LCBVc2VkIHRvIGltcGxlbWVudCB0aGUgc2F2ZS9yZXN0b3JlIGN1cnNvcgotICAgICAqIHBvc2l0aW9uIGVzY2FwZSBzZXF1ZW5jZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbVNhdmVkQ3Vyc29yUm93OwotCi0gICAgLyoqCi0gICAgICogU2F2ZWQgc3RhdGUgb2YgdGhlIGN1cnNvciBjb2x1bW4sIFVzZWQgdG8gaW1wbGVtZW50IHRoZSBzYXZlL3Jlc3RvcmUKLSAgICAgKiBjdXJzb3IgcG9zaXRpb24gZXNjYXBlIHNlcXVlbmNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtU2F2ZWRDdXJzb3JDb2w7Ci0KLSAgICAvLyBEZWNTZXQgYm9vbGVhbnMKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWFzayBpbmRpY2F0ZXMgMTMyLWNvbHVtbiBtb2RlIGlzIHNldC4gKEFzIG9wcG9zZWQgdG8gODAtY29sdW1uCi0gICAgICogbW9kZS4pCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtfMTMyX0NPTFVNTl9NT0RFX01BU0sgPSAxIDw8IDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1hc2sgaW5kaWNhdGVzIHRoYXQgb3JpZ2luIG1vZGUgaXMgc2V0LiAoQ3Vyc29yIGFkZHJlc3NpbmcgaXMKLSAgICAgKiByZWxhdGl2ZSB0byB0aGUgYWJzb2x1dGUgc2NyZWVuIHNpemUsIHJhdGhlciB0aGFuIHRoZSBjdXJyZW50bHkgc2V0IHRvcAotICAgICAqIGFuZCBib3R0b20gbWFyZ2lucy4pCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtfT1JJR0lOX01PREVfTUFTSyA9IDEgPDwgNjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWFzayBpbmRpY2F0ZXMgdGhhdCB3cmFwYXJvdW5kIG1vZGUgaXMgc2V0LiAoQXMgb3Bwb3NlZCB0bwotICAgICAqIHN0b3AtYXQtcmlnaHQtY29sdW1uIG1vZGUuKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLX1dSQVBBUk9VTkRfTU9ERV9NQVNLID0gMSA8PCA3OwotCi0gICAgLyoqCi0gICAgICogSG9sZHMgbXVsdGlwbGUgREVDU0VUIGZsYWdzLiBUaGUgZGF0YSBpcyBzdG9yZWQgdGhpcyB3YXksIHJhdGhlciB0aGFuIGluCi0gICAgICogc2VwYXJhdGUgYm9vbGVhbnMsIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGltcGxlbWVudCB0aGUgc2F2ZS1hbmQtcmVzdG9yZQotICAgICAqIHNlbWFudGljcy4gVGhlIHZhcmlvdXMgaypNb2RlTWFzayBtYXNrcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGFuZCBtb2RpZnkKLSAgICAgKiB0aGUgaW5kaXZpZHVhbCBmbGFncyBjdXJyZW50IHN0YXRlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtRGVjRmxhZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlcyBhd2F5IGEgc25hcHNob3Qgb2YgdGhlIERFQ1NFVCBmbGFncy4gVXNlZCB0byBpbXBsZW1lbnQgc2F2ZSBhbmQKLSAgICAgKiByZXN0b3JlIGVzY2FwZSBzZXF1ZW5jZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbVNhdmVkRGVjRmxhZ3M7Ci0KLSAgICAvLyBNb2RlcyBzZXQgd2l0aCBTZXQgTW9kZSAvIFJlc2V0IE1vZGUKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgaW5zZXJ0IG1vZGUgKGFzIG9wcG9zZWQgdG8gcmVwbGFjZSBtb2RlKSBpcyBhY3RpdmUuIEluIGluc2VydAotICAgICAqIG1vZGUgbmV3IGNoYXJhY3RlcnMgYXJlIGluc2VydGVkLCBwdXNoaW5nIGV4aXN0aW5nIHRleHQgdG8gdGhlIHJpZ2h0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5zZXJ0TW9kZTsKLQotICAgIC8qKgotICAgICAqIEF1dG9tYXRpYyBuZXdsaW5lIG1vZGUuIENvbmZpZ3VyZXMgd2hldGhlciBwcmVzc2luZyByZXR1cm4gb24gdGhlCi0gICAgICoga2V5Ym9hcmQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgYSByZXR1cm4gYXMgd2VsbC4gTm90IGN1cnJlbnRseQotICAgICAqIGltcGxlbWVudGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXV0b21hdGljTmV3bGluZU1vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcnJheSBvZiB0YWIgc3RvcHMuIG1UYWJTdG9wW2ldIGlzIHRydWUgaWYgdGhlcmUgaXMgYSB0YWIgc3RvcCBzZXQgZm9yCi0gICAgICogY29sdW1uIGkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuW10gbVRhYlN0b3A7Ci0KLSAgICAvLyBUaGUgbWFyZ2lucyBhbGxvdyBwb3J0aW9ucyBvZiB0aGUgc2NyZWVuIHRvIGJlIGxvY2tlZC4KLQotICAgIC8qKgotICAgICAqIFRoZSB0b3AgbWFyZ2luIG9mIHRoZSBzY3JlZW4sIGZvciBzY3JvbGxpbmcgcHVycG9zZXMuIFJhbmdlcyBmcm9tIDAgdG8KLSAgICAgKiBtUm93cy0yLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Ub3BNYXJnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYm90dG9tIG1hcmdpbiBvZiB0aGUgc2NyZWVuLCBmb3Igc2Nyb2xsaW5nIHB1cnBvc2VzLiBSYW5nZXMgZnJvbQotICAgICAqIG1Ub3BNYXJnaW4gKyAyIHRvIG1Sb3dzLiAoRGVmaW5lcyB0aGUgZmlyc3Qgcm93IGFmdGVyIHRoZSBzY3JvbGxpbmcKLSAgICAgKiByZWdpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUJvdHRvbU1hcmdpbjsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGVtaXR0ZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgdG8KLSAgICAgKiB0aGUgbmV4dCBsaW5lLiBVc2VkIHRvIGRpc2FtYmlndWF0ZSB0aGUgY2FzZSB3aGVyZSB0aGUgY3Vyc29yIGlzCi0gICAgICogcG9zaXRpb25lZCBvbiBjb2x1bW4gbUNvbHVtbnMtMS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUFib3V0VG9BdXRvV3JhcDsKLQotICAgIC8qKgotICAgICAqIFVzZWQgZm9yIGRlYnVnZ2luZywgY291bnRzIGhvdyBtYW55IGNoYXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbVByb2Nlc3NlZENoYXJDb3VudDsKLQotICAgIC8qKgotICAgICAqIEZvcmVncm91bmQgY29sb3IsIDAuLjcsIG1hc2sgd2l0aCA4IGZvciBib2xkCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUZvcmVDb2xvcjsKLQotICAgIC8qKgotICAgICAqIEJhY2tncm91bmQgY29sb3IsIDAuLjcsIG1hc2sgd2l0aCA4IGZvciB1bmRlcmxpbmUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQmFja0NvbG9yOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1JbnZlcnNlQ29sb3JzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1iS2V5cGFkQXBwbGljYXRpb25Nb2RlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BbHRlcm5hdGVDaGFyU2V0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgdGVybWluYWwgZW11bGF0b3IgdGhhdCB1c2VzIHRoZSBzdXBwbGllZCBzY3JlZW4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzY3JlZW4gdGhlIHNjcmVlbiB0byByZW5kZXIgY2hhcmFjdGVycyBpbnRvLgotICAgICAqIEBwYXJhbSBjb2x1bW5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBlbXVsYXRlCi0gICAgICogQHBhcmFtIHJvd3MgdGhlIG51bWJlciBvZiByb3dzIHRvIGVtdWxhdGUKLSAgICAgKiBAcGFyYW0gdGVybU91dCB0aGUgb3V0cHV0IGZpbGUgZGVzY3JpcHRvciB0aGF0IHRhbGtzIHRvIHRoZSBwc2V1ZG8tdHR5LgotICAgICAqLwotICAgIHB1YmxpYyBUZXJtaW5hbEVtdWxhdG9yKFNjcmVlbiBzY3JlZW4sIGludCBjb2x1bW5zLCBpbnQgcm93cywKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gdGVybU91dCkgewotICAgICAgICBtU2NyZWVuID0gc2NyZWVuOwotICAgICAgICBtUm93cyA9IHJvd3M7Ci0gICAgICAgIG1Db2x1bW5zID0gY29sdW1uczsKLSAgICAgICAgbVRhYlN0b3AgPSBuZXcgYm9vbGVhblttQ29sdW1uc107Ci0gICAgICAgIG1UZXJtT3V0ID0gdGVybU91dDsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTaXplKGludCBjb2x1bW5zLCBpbnQgcm93cykgewotICAgICAgICBpZiAobVJvd3MgPT0gcm93cyAmJiBtQ29sdW1ucyA9PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRyYW5zY3JpcHRUZXh0ID0gbVNjcmVlbi5nZXRUcmFuc2NyaXB0VGV4dCgpOwotCi0gICAgICAgIG1TY3JlZW4ucmVzaXplKGNvbHVtbnMsIHJvd3MsIG1Gb3JlQ29sb3IsIG1CYWNrQ29sb3IpOwotCi0gICAgICAgIGlmIChtUm93cyAhPSByb3dzKSB7Ci0gICAgICAgICAgICBtUm93cyA9IHJvd3M7Ci0gICAgICAgICAgICBtVG9wTWFyZ2luID0gMDsKLSAgICAgICAgICAgIG1Cb3R0b21NYXJnaW4gPSBtUm93czsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbHVtbnMgIT0gY29sdW1ucykgewotICAgICAgICAgICAgaW50IG9sZENvbHVtbnMgPSBtQ29sdW1uczsKLSAgICAgICAgICAgIG1Db2x1bW5zID0gY29sdW1uczsKLSAgICAgICAgICAgIGJvb2xlYW5bXSBvbGRUYWJTdG9wID0gbVRhYlN0b3A7Ci0gICAgICAgICAgICBtVGFiU3RvcCA9IG5ldyBib29sZWFuW21Db2x1bW5zXTsKLSAgICAgICAgICAgIGludCB0b1RyYW5zZmVyID0gTWF0aC5taW4ob2xkQ29sdW1ucywgY29sdW1ucyk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9sZFRhYlN0b3AsIDAsIG1UYWJTdG9wLCAwLCB0b1RyYW5zZmVyKTsKLSAgICAgICAgICAgIHdoaWxlIChtQ3Vyc29yQ29sID49IGNvbHVtbnMpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yQ29sIC09IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgbUN1cnNvclJvdyA9IE1hdGgubWluKG1Cb3R0b21NYXJnaW4tMSwgbUN1cnNvclJvdyArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3JSb3cgPSAwOwotICAgICAgICBtQ3Vyc29yQ29sID0gMDsKLSAgICAgICAgbUFib3V0VG9BdXRvV3JhcCA9IGZhbHNlOwotCi0gICAgICAgIGludCBlbmQgPSB0cmFuc2NyaXB0VGV4dC5sZW5ndGgoKS0xOwotICAgICAgICB3aGlsZSAoKGVuZCA+PSAwKSAmJiB0cmFuc2NyaXB0VGV4dC5jaGFyQXQoZW5kKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBlbmQtLTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlIGMgPSAoYnl0ZSkgdHJhbnNjcmlwdFRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIHNldEN1cnNvckNvbCgwKTsKLSAgICAgICAgICAgICAgICBkb0xpbmVmZWVkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVtaXQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnNvcidzIGN1cnJlbnQgcm93LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3Vyc29yJ3MgY3VycmVudCByb3cuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJzb3JSb3coKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yUm93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3Vyc29yJ3MgY3VycmVudCBjb2x1bW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJzb3IncyBjdXJyZW50IGNvbHVtbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnNvckNvbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3JDb2w7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ2V0S2V5cGFkQXBwbGljYXRpb25Nb2RlKCkgewotICAgICAgICByZXR1cm4gbWJLZXlwYWRBcHBsaWNhdGlvbk1vZGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRUYWJTdG9wcygpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGFiU3RvcFtpXSA9IChpICYgNykgPT0gMCAmJiBpICE9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2NlcHQgYnl0ZXMgKHR5cGljYWxseSBmcm9tIHRoZSBwc2V1ZG8tdGVsZXR5cGUpIGFuZCBwcm9jZXNzIHRoZW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVmZmVyIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gYmFzZSB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIGFycmF5IHRvIHByb2Nlc3MKLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5IHRvIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmQoYnl0ZVtdIGJ1ZmZlciwgaW50IGJhc2UsIGludCBsZW5ndGgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnl0ZSBiID0gYnVmZmVyW2Jhc2UgKyBpXTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRlcm0uTE9HX0NIQVJBQ1RFUlNfRkxBRykgewotICAgICAgICAgICAgICAgICAgICBjaGFyIHByaW50YWJsZUIgPSAoY2hhcikgYjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCAzMiB8fCBiID4gMTI2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGFibGVCID0gJyAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRlcm0uTE9HX1RBRywgIiciICsgQ2hhcmFjdGVyLnRvU3RyaW5nKHByaW50YWJsZUIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyAoIiArIEludGVnZXIudG9TdHJpbmcoYikgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9jZXNzKGIpOwotICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRDaGFyQ291bnQrKzsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVGVybS5MT0dfVEFHLCAiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgY2hhcmFjdGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b1N0cmluZyhtUHJvY2Vzc2VkQ2hhckNvdW50KSArICIgY29kZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9TdHJpbmcoYiksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoYnl0ZSBiKSB7Ci0gICAgICAgIHN3aXRjaCAoYikgewotICAgICAgICBjYXNlIDA6IC8vIE5VTAotICAgICAgICAgICAgLy8gRG8gbm90aGluZwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA3OiAvLyBCRUwKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgODogLy8gQlMKLSAgICAgICAgICAgIHNldEN1cnNvckNvbChNYXRoLm1heCgwLCBtQ3Vyc29yQ29sIC0gMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA5OiAvLyBIVAotICAgICAgICAgICAgLy8gTW92ZSB0byBuZXh0IHRhYiBzdG9wLCBidXQgbm90IHBhc3QgZWRnZSBvZiBzY3JlZW4KLSAgICAgICAgICAgIHNldEN1cnNvckNvbChuZXh0VGFiU3RvcChtQ3Vyc29yQ29sKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgc2V0Q3Vyc29yQ29sKDApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMDogLy8gQ1IKLSAgICAgICAgY2FzZSAxMTogLy8gVlQKLSAgICAgICAgY2FzZSAxMjogLy8gTEYKLSAgICAgICAgICAgIGRvTGluZWZlZWQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTQ6IC8vIFNPOgotICAgICAgICAgICAgc2V0QWx0Q2hhclNldCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTU6IC8vIFNJOgotICAgICAgICAgICAgc2V0QWx0Q2hhclNldChmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgIGNhc2UgMjQ6IC8vIENBTgotICAgICAgICBjYXNlIDI2OiAvLyBTVUIKLSAgICAgICAgICAgIGlmIChtRXNjYXBlU3RhdGUgIT0gRVNDX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtRXNjYXBlU3RhdGUgPSBFU0NfTk9ORTsKLSAgICAgICAgICAgICAgICBlbWl0KChieXRlKSAxMjcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzogLy8gRVNDCi0gICAgICAgICAgICAvLyBBbHdheXMgc3RhcnRzIGFuIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgc3RhcnRFc2NhcGVTZXF1ZW5jZShFU0MpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoYnl0ZSkgMHg5YjogLy8gQ1NJCi0gICAgICAgICAgICBzdGFydEVzY2FwZVNlcXVlbmNlKEVTQ19MRUZUX1NRVUFSRV9CUkFDS0VUKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtQ29udGludWVTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICAgICAgc3dpdGNoIChtRXNjYXBlU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgRVNDX05PTkU6Ci0gICAgICAgICAgICAgICAgaWYgKGIgPj0gMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdChiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVNDOgotICAgICAgICAgICAgICAgIGRvRXNjKGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVTQ19QT1VORDoKLSAgICAgICAgICAgICAgICBkb0VzY1BvdW5kKGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVTQ19TRUxFQ1RfTEVGVF9QQVJFTjoKLSAgICAgICAgICAgICAgICBkb0VzY1NlbGVjdExlZnRQYXJlbihiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFU0NfU0VMRUNUX1JJR0hUX1BBUkVOOgotICAgICAgICAgICAgICAgIGRvRXNjU2VsZWN0UmlnaHRQYXJlbihiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFU0NfTEVGVF9TUVVBUkVfQlJBQ0tFVDoKLSAgICAgICAgICAgICAgICBkb0VzY0xlZnRTcXVhcmVCcmFja2V0KGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVTQ19MRUZUX1NRVUFSRV9CUkFDS0VUX1FVRVNUSU9OX01BUks6Ci0gICAgICAgICAgICAgICAgZG9Fc2NMU0JRdWVzdChiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB1bmtub3duU2VxdWVuY2UoYik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250aW51ZVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUVzY2FwZVN0YXRlID0gRVNDX05PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRBbHRDaGFyU2V0KGJvb2xlYW4gYWx0ZXJuYXRlQ2hhclNldCkgewotICAgICAgICBtQWx0ZXJuYXRlQ2hhclNldCA9IGFsdGVybmF0ZUNoYXJTZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgbmV4dFRhYlN0b3AoaW50IGN1cnNvckNvbCkgewotICAgICAgICBmb3IgKGludCBpID0gY3Vyc29yQ29sOyBpIDwgbUNvbHVtbnM7IGkrKykgewotICAgICAgICAgICAgaWYgKG1UYWJTdG9wW2ldKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Db2x1bW5zIC0gMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9Fc2NMU0JRdWVzdChieXRlIGIpIHsKLSAgICAgICAgaW50IG1hc2sgPSBnZXREZWNGbGFnc01hc2soZ2V0QXJnMCgwKSk7Ci0gICAgICAgIHN3aXRjaCAoYikgewotICAgICAgICBjYXNlICdoJzogLy8gRXNjIFsgPyBQbiBoIC0gREVDU0VUCi0gICAgICAgICAgICBtRGVjRmxhZ3MgfD0gbWFzazsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2wnOiAvLyBFc2MgWyA/IFBuIGwgLSBERUNSU1QKLSAgICAgICAgICAgIG1EZWNGbGFncyAmPSB+bWFzazsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3InOiAvLyBFc2MgWyA/IFBuIHIgLSByZXN0b3JlCi0gICAgICAgICAgICBtRGVjRmxhZ3MgPSAobURlY0ZsYWdzICYgfm1hc2spIHwgKG1TYXZlZERlY0ZsYWdzICYgbWFzayk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdzJzogLy8gRXNjIFsgPyBQbiBzIC0gc2F2ZQotICAgICAgICAgICAgbVNhdmVkRGVjRmxhZ3MgPSAobVNhdmVkRGVjRmxhZ3MgJiB+bWFzaykgfCAobURlY0ZsYWdzICYgbWFzayk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcGFyc2VBcmcoYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDEzMiBjb2x1bW4gbW9kZQotICAgICAgICBpZiAoKG1hc2sgJiBLXzEzMl9DT0xVTU5fTU9ERV9NQVNLKSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBzZXQgMTMyIGNvbHMsIGJ1dCB3ZSBkbyB3YW50IHRoZQotICAgICAgICAgICAgLy8gc2lkZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHNjcmVlbiBhbmQgaG9taW5nIHRoZSBjdXJzb3IuCi0gICAgICAgICAgICBibG9ja0NsZWFyKDAsIDAsIG1Db2x1bW5zLCBtUm93cyk7Ci0gICAgICAgICAgICBzZXRDdXJzb3JSb3dDb2woMCwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvcmlnaW4gbW9kZQotICAgICAgICBpZiAoKG1hc2sgJiBLX09SSUdJTl9NT0RFX01BU0spICE9IDApIHsKLSAgICAgICAgICAgIC8vIEhvbWUgdGhlIGN1cnNvci4KLSAgICAgICAgICAgIHNldEN1cnNvclBvc2l0aW9uKDAsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RGVjRmxhZ3NNYXNrKGludCBhcmd1bWVudCkgewotICAgICAgICBpZiAoYXJndW1lbnQgPj0gMSAmJiBhcmd1bWVudCA8PSA5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKDEgPDwgYXJndW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0RXNjYXBlU2VxdWVuY2UoaW50IGVzY2FwZVN0YXRlKSB7Ci0gICAgICAgIG1Fc2NhcGVTdGF0ZSA9IGVzY2FwZVN0YXRlOwotICAgICAgICBtQXJnSW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE1BWF9FU0NBUEVfUEFSQU1FVEVSUzsgaisrKSB7Ci0gICAgICAgICAgICBtQXJnc1tqXSA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvTGluZWZlZWQoKSB7Ci0gICAgICAgIGludCBuZXdDdXJzb3JSb3cgPSBtQ3Vyc29yUm93ICsgMTsKLSAgICAgICAgaWYgKG5ld0N1cnNvclJvdyA+PSBtQm90dG9tTWFyZ2luKSB7Ci0gICAgICAgICAgICBzY3JvbGwoKTsKLSAgICAgICAgICAgIG5ld0N1cnNvclJvdyA9IG1Cb3R0b21NYXJnaW4gLSAxOwotICAgICAgICB9Ci0gICAgICAgIHNldEN1cnNvclJvdyhuZXdDdXJzb3JSb3cpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb250aW51ZVNlcXVlbmNlKCkgewotICAgICAgICBtQ29udGludWVTZXF1ZW5jZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnRpbnVlU2VxdWVuY2UoaW50IHN0YXRlKSB7Ci0gICAgICAgIG1Fc2NhcGVTdGF0ZSA9IHN0YXRlOwotICAgICAgICBtQ29udGludWVTZXF1ZW5jZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRXNjU2VsZWN0TGVmdFBhcmVuKGJ5dGUgYikgewotICAgICAgICBkb1NlbGVjdENoYXJTZXQodHJ1ZSwgYik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRXNjU2VsZWN0UmlnaHRQYXJlbihieXRlIGIpIHsKLSAgICAgICAgZG9TZWxlY3RDaGFyU2V0KGZhbHNlLCBiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3RDaGFyU2V0KGJvb2xlYW4gaXNHMENoYXJTZXQsIGJ5dGUgYikgewotICAgICAgICBzd2l0Y2ggKGIpIHsKLSAgICAgICAgY2FzZSAnQSc6IC8vIFVuaXRlZCBLaW5nZG9tIGNoYXJhY3RlciBzZXQKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdCJzogLy8gQVNDSUkgc2V0Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnMCc6IC8vIFNwZWNpYWwgR3JhcGhpY3MKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcxJzogLy8gQWx0ZXJuYXRlIGNoYXJhY3RlciBzZXQKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdW5rbm93blNlcXVlbmNlKGIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRXNjUG91bmQoYnl0ZSBiKSB7Ci0gICAgICAgIHN3aXRjaCAoYikgewotICAgICAgICBjYXNlICc4JzogLy8gRXNjICMgOCAtIERFQ0FMTiBhbGlnbm1lbnQgdGVzdAotICAgICAgICAgICAgbVNjcmVlbi5ibG9ja1NldCgwLCAwLCBtQ29sdW1ucywgbVJvd3MsICdFJywKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rm9yZUNvbG9yKCksIGdldEJhY2tDb2xvcigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB1bmtub3duU2VxdWVuY2UoYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0VzYyhieXRlIGIpIHsKLSAgICAgICAgc3dpdGNoIChiKSB7Ci0gICAgICAgIGNhc2UgJyMnOgotICAgICAgICAgICAgY29udGludWVTZXF1ZW5jZShFU0NfUE9VTkQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICBjb250aW51ZVNlcXVlbmNlKEVTQ19TRUxFQ1RfTEVGVF9QQVJFTik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICcpJzoKLSAgICAgICAgICAgIGNvbnRpbnVlU2VxdWVuY2UoRVNDX1NFTEVDVF9SSUdIVF9QQVJFTik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICc3JzogLy8gREVDU0Mgc2F2ZSBjdXJzb3IKLSAgICAgICAgICAgIG1TYXZlZEN1cnNvclJvdyA9IG1DdXJzb3JSb3c7Ci0gICAgICAgICAgICBtU2F2ZWRDdXJzb3JDb2wgPSBtQ3Vyc29yQ29sOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnOCc6IC8vIERFQ1JDIHJlc3RvcmUgY3Vyc29yCi0gICAgICAgICAgICBzZXRDdXJzb3JSb3dDb2wobVNhdmVkQ3Vyc29yUm93LCBtU2F2ZWRDdXJzb3JDb2wpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnRCc6IC8vIElOREVYCi0gICAgICAgICAgICBkb0xpbmVmZWVkKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdFJzogLy8gTkVMCi0gICAgICAgICAgICBzZXRDdXJzb3JDb2woMCk7Ci0gICAgICAgICAgICBkb0xpbmVmZWVkKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdGJzogLy8gQ3Vyc29yIHRvIGxvd2VyLWxlZnQgY29ybmVyIG9mIHNjcmVlbgotICAgICAgICAgICAgc2V0Q3Vyc29yUm93Q29sKDAsIG1Cb3R0b21NYXJnaW4gLSAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0gnOiAvLyBUYWIgc2V0Ci0gICAgICAgICAgICBtVGFiU3RvcFttQ3Vyc29yQ29sXSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdNJzogLy8gUmV2ZXJzZSBpbmRleAotICAgICAgICAgICAgaWYgKG1DdXJzb3JSb3cgPT0gMCkgewotICAgICAgICAgICAgICAgIG1TY3JlZW4uYmxvY2tDb3B5KDAsIG1Ub3BNYXJnaW4gKyAxLCBtQ29sdW1ucywgbUJvdHRvbU1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgLSAobVRvcE1hcmdpbiArIDEpLCAwLCBtVG9wTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBibG9ja0NsZWFyKDAsIG1Cb3R0b21NYXJnaW4gLSAxLCBtQ29sdW1ucyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1DdXJzb3JSb3ctLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnTic6IC8vIFNTMgotICAgICAgICAgICAgdW5pbXBsZW1lbnRlZFNlcXVlbmNlKGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnMCc6IC8vIFNTMwotICAgICAgICAgICAgdW5pbXBsZW1lbnRlZFNlcXVlbmNlKGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnUCc6IC8vIERldmljZSBjb250cm9sIHN0cmluZwotICAgICAgICAgICAgdW5pbXBsZW1lbnRlZFNlcXVlbmNlKGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnWic6IC8vIHJldHVybiB0ZXJtaW5hbCBJRAotICAgICAgICAgICAgc2VuZERldmljZUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgY29udGludWVTZXF1ZW5jZShFU0NfTEVGVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICc9JzogLy8gREVDS1BBTQotICAgICAgICAgICAgbWJLZXlwYWRBcHBsaWNhdGlvbk1vZGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnPicgOiAvLyBERUNLUE5NCi0gICAgICAgICAgICBtYktleXBhZEFwcGxpY2F0aW9uTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVua25vd25TZXF1ZW5jZShiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRXNjTGVmdFNxdWFyZUJyYWNrZXQoYnl0ZSBiKSB7Ci0gICAgICAgIHN3aXRjaCAoYikgewotICAgICAgICBjYXNlICdAJzogLy8gRVNDIFsgUG4gQCAtIElDSCBJbnNlcnQgQ2hhcmFjdGVycwotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY2hhcnNBZnRlckN1cnNvciA9IG1Db2x1bW5zIC0gbUN1cnNvckNvbDsKLSAgICAgICAgICAgIGludCBjaGFyc1RvSW5zZXJ0ID0gTWF0aC5taW4oZ2V0QXJnMCgxKSwgY2hhcnNBZnRlckN1cnNvcik7Ci0gICAgICAgICAgICBpbnQgY2hhcnNUb01vdmUgPSBjaGFyc0FmdGVyQ3Vyc29yIC0gY2hhcnNUb0luc2VydDsKLSAgICAgICAgICAgIG1TY3JlZW4uYmxvY2tDb3B5KG1DdXJzb3JDb2wsIG1DdXJzb3JSb3csIGNoYXJzVG9Nb3ZlLCAxLAotICAgICAgICAgICAgICAgICAgICBtQ3Vyc29yQ29sICsgY2hhcnNUb0luc2VydCwgbUN1cnNvclJvdyk7Ci0gICAgICAgICAgICBibG9ja0NsZWFyKG1DdXJzb3JDb2wsIG1DdXJzb3JSb3csIGNoYXJzVG9JbnNlcnQpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdBJzogLy8gRVNDIFsgUG4gQSAtIEN1cnNvciBVcAotICAgICAgICAgICAgc2V0Q3Vyc29yUm93KE1hdGgubWF4KG1Ub3BNYXJnaW4sIG1DdXJzb3JSb3cgLSBnZXRBcmcwKDEpKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdCJzogLy8gRVNDIFsgUG4gQiAtIEN1cnNvciBEb3duCi0gICAgICAgICAgICBzZXRDdXJzb3JSb3coTWF0aC5taW4obUJvdHRvbU1hcmdpbiAtIDEsIG1DdXJzb3JSb3cgKyBnZXRBcmcwKDEpKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdDJzogLy8gRVNDIFsgUG4gQyAtIEN1cnNvciBSaWdodAotICAgICAgICAgICAgc2V0Q3Vyc29yQ29sKE1hdGgubWluKG1Db2x1bW5zIC0gMSwgbUN1cnNvckNvbCArIGdldEFyZzAoMSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0QnOiAvLyBFU0MgWyBQbiBEIC0gQ3Vyc29yIExlZnQKLSAgICAgICAgICAgIHNldEN1cnNvckNvbChNYXRoLm1heCgwLCBtQ3Vyc29yQ29sIC0gZ2V0QXJnMCgxKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnRyc6IC8vIEVTQyBbIFBuIEcgLSBDdXJzb3IgSG9yaXpvbnRhbCBBYnNvbHV0ZQotICAgICAgICAgICAgc2V0Q3Vyc29yQ29sKE1hdGgubWluKE1hdGgubWF4KDEsIGdldEFyZzAoMSkpLCBtQ29sdW1ucykgLSAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ0gnOiAvLyBFU0MgWyBQbiA7IEggLSBDdXJzb3IgUG9zaXRpb24KLSAgICAgICAgICAgIHNldEhvcml6b250YWxWZXJ0aWNhbFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdKJzogLy8gRVNDIFsgUG4gSiAtIEVyYXNlIGluIERpc3BsYXkKLSAgICAgICAgICAgIHN3aXRjaCAoZ2V0QXJnMCgwKSkgewotICAgICAgICAgICAgY2FzZSAwOiAvLyBDbGVhciBiZWxvdwotICAgICAgICAgICAgICAgIGJsb2NrQ2xlYXIobUN1cnNvckNvbCwgbUN1cnNvclJvdywgbUNvbHVtbnMgLSBtQ3Vyc29yQ29sKTsKLSAgICAgICAgICAgICAgICBibG9ja0NsZWFyKDAsIG1DdXJzb3JSb3cgKyAxLCBtQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3R0b21NYXJnaW4gLSAobUN1cnNvclJvdyArIDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvLyBFcmFzZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2NyZWVuIHRvIHRoZSBjdXJzb3IuCi0gICAgICAgICAgICAgICAgYmxvY2tDbGVhcigwLCBtVG9wTWFyZ2luLCBtQ29sdW1ucywgbUN1cnNvclJvdyAtIG1Ub3BNYXJnaW4pOwotICAgICAgICAgICAgICAgIGJsb2NrQ2xlYXIoMCwgbUN1cnNvclJvdywgbUN1cnNvckNvbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8vIENsZWFyIGFsbAotICAgICAgICAgICAgICAgIGJsb2NrQ2xlYXIoMCwgbVRvcE1hcmdpbiwgbUNvbHVtbnMsIG1Cb3R0b21NYXJnaW4gLSBtVG9wTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB1bmtub3duU2VxdWVuY2UoYik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdLJzogLy8gRVNDIFsgUG4gSyAtIEVyYXNlIGluIExpbmUKLSAgICAgICAgICAgIHN3aXRjaCAoZ2V0QXJnMCgwKSkgewotICAgICAgICAgICAgY2FzZSAwOiAvLyBDbGVhciB0byByaWdodAotICAgICAgICAgICAgICAgIGJsb2NrQ2xlYXIobUN1cnNvckNvbCwgbUN1cnNvclJvdywgbUNvbHVtbnMgLSBtQ3Vyc29yQ29sKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvLyBFcmFzZSBzdGFydCBvZiBsaW5lIHRvIGN1cnNvciAoaW5jbHVkaW5nIGN1cnNvcikKLSAgICAgICAgICAgICAgICBibG9ja0NsZWFyKDAsIG1DdXJzb3JSb3csIG1DdXJzb3JDb2wgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOiAvLyBDbGVhciB3aG9sZSBsaW5lCi0gICAgICAgICAgICAgICAgYmxvY2tDbGVhcigwLCBtQ3Vyc29yUm93LCBtQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdW5rbm93blNlcXVlbmNlKGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnTCc6IC8vIEluc2VydCBMaW5lcwotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGluZXNBZnRlckN1cnNvciA9IG1Cb3R0b21NYXJnaW4gLSBtQ3Vyc29yUm93OwotICAgICAgICAgICAgaW50IGxpbmVzVG9JbnNlcnQgPSBNYXRoLm1pbihnZXRBcmcwKDEpLCBsaW5lc0FmdGVyQ3Vyc29yKTsKLSAgICAgICAgICAgIGludCBsaW5lc1RvTW92ZSA9IGxpbmVzQWZ0ZXJDdXJzb3IgLSBsaW5lc1RvSW5zZXJ0OwotICAgICAgICAgICAgbVNjcmVlbi5ibG9ja0NvcHkoMCwgbUN1cnNvclJvdywgbUNvbHVtbnMsIGxpbmVzVG9Nb3ZlLCAwLAotICAgICAgICAgICAgICAgICAgICBtQ3Vyc29yUm93ICsgbGluZXNUb0luc2VydCk7Ci0gICAgICAgICAgICBibG9ja0NsZWFyKDAsIG1DdXJzb3JSb3csIG1Db2x1bW5zLCBsaW5lc1RvSW5zZXJ0KTsKLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnTSc6IC8vIERlbGV0ZSBMaW5lcwotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGluZXNBZnRlckN1cnNvciA9IG1Cb3R0b21NYXJnaW4gLSBtQ3Vyc29yUm93OwotICAgICAgICAgICAgaW50IGxpbmVzVG9EZWxldGUgPSBNYXRoLm1pbihnZXRBcmcwKDEpLCBsaW5lc0FmdGVyQ3Vyc29yKTsKLSAgICAgICAgICAgIGludCBsaW5lc1RvTW92ZSA9IGxpbmVzQWZ0ZXJDdXJzb3IgLSBsaW5lc1RvRGVsZXRlOwotICAgICAgICAgICAgbVNjcmVlbi5ibG9ja0NvcHkoMCwgbUN1cnNvclJvdyArIGxpbmVzVG9EZWxldGUsIG1Db2x1bW5zLAotICAgICAgICAgICAgICAgICAgICBsaW5lc1RvTW92ZSwgMCwgbUN1cnNvclJvdyk7Ci0gICAgICAgICAgICBibG9ja0NsZWFyKDAsIG1DdXJzb3JSb3cgKyBsaW5lc1RvTW92ZSwgbUNvbHVtbnMsIGxpbmVzVG9EZWxldGUpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdQJzogLy8gRGVsZXRlIENoYXJhY3RlcnMKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNoYXJzQWZ0ZXJDdXJzb3IgPSBtQ29sdW1ucyAtIG1DdXJzb3JDb2w7Ci0gICAgICAgICAgICBpbnQgY2hhcnNUb0RlbGV0ZSA9IE1hdGgubWluKGdldEFyZzAoMSksIGNoYXJzQWZ0ZXJDdXJzb3IpOwotICAgICAgICAgICAgaW50IGNoYXJzVG9Nb3ZlID0gY2hhcnNBZnRlckN1cnNvciAtIGNoYXJzVG9EZWxldGU7Ci0gICAgICAgICAgICBtU2NyZWVuLmJsb2NrQ29weShtQ3Vyc29yQ29sICsgY2hhcnNUb0RlbGV0ZSwgbUN1cnNvclJvdywKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNUb01vdmUsIDEsIG1DdXJzb3JDb2wsIG1DdXJzb3JSb3cpOwotICAgICAgICAgICAgYmxvY2tDbGVhcihtQ3Vyc29yQ29sICsgY2hhcnNUb01vdmUsIG1DdXJzb3JSb3csIGNoYXJzVG9EZWxldGUpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdUJzogLy8gTW91c2UgdHJhY2tpbmcKLSAgICAgICAgICAgIHVuaW1wbGVtZW50ZWRTZXF1ZW5jZShiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJz8nOiAvLyBFc2MgWyA/IC0tIHN0YXJ0IG9mIGEgcHJpdmF0ZSBtb2RlIHNldAotICAgICAgICAgICAgY29udGludWVTZXF1ZW5jZShFU0NfTEVGVF9TUVVBUkVfQlJBQ0tFVF9RVUVTVElPTl9NQVJLKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2MnOiAvLyBTZW5kIGRldmljZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICBzZW5kRGV2aWNlQXR0cmlidXRlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIEVTQyBbIFBuIGQgLSBWZXJ0IFBvc2l0aW9uIEFic29sdXRlCi0gICAgICAgICAgICBzZXRDdXJzb3JSb3coTWF0aC5taW4oTWF0aC5tYXgoMSwgZ2V0QXJnMCgxKSksIG1Sb3dzKSAtIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIEhvcml6b250YWwgYW5kIFZlcnRpY2FsIFBvc2l0aW9uCi0gICAgICAgICAgICBzZXRIb3Jpem9udGFsVmVydGljYWxQb3NpdGlvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZyc6IC8vIENsZWFyIHRhYiBzdG9wCi0gICAgICAgICAgICBzd2l0Y2ggKGdldEFyZzAoMCkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBtVGFiU3RvcFttQ3Vyc29yQ29sXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UYWJTdG9wW2ldID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmllZCB0byBoYXZlIG5vIGVmZmVjdC4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2gnOiAvLyBTZXQgTW9kZQotICAgICAgICAgICAgZG9TZXRNb2RlKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnbCc6IC8vIFJlc2V0IE1vZGUKLSAgICAgICAgICAgIGRvU2V0TW9kZShmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdtJzogLy8gRXNjIFsgUG4gbSAtIGNoYXJhY3RlciBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgc2VsZWN0R3JhcGhpY1JlbmRpdGlvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncic6IC8vIEVzYyBbIFBuIDsgUG4gciAtIHNldCB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSB0b3AgbWFyZ2luIGRlZmF1bHRzIHRvIDEsIHRoZSBib3R0b20gbWFyZ2luCi0gICAgICAgICAgICAvLyAodW51c3VhbGx5IGZvciBhcmd1bWVudHMpIGRlZmF1bHRzIHRvIG1Sb3dzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRoZSBlc2NhcGUgc2VxdWVuY2UgbnVtYmVycyB0b3AgMS4uMjMsIGJ1dCB3ZQotICAgICAgICAgICAgLy8gbnVtYmVyIHRvcCAwLi4yMi4KLSAgICAgICAgICAgIC8vIFRoZSBlc2NhcGUgc2VxdWVuY2UgbnVtYmVycyBib3R0b20gMi4uMjQsIGFuZAotICAgICAgICAgICAgLy8gc28gZG8gd2UgKGJlY2F1c2Ugd2UgdXNlIGEgemVybyBiYXNlZCBudW1iZXJpbmcKLSAgICAgICAgICAgIC8vIHNjaGVtZSwgYnV0IHdlIHN0b3JlIHRoZSBmaXJzdCBsaW5lIGJlbG93IHRoZQotICAgICAgICAgICAgLy8gYm90dG9tLW1vc3Qgc2Nyb2xsaW5nIGxpbmUuCi0gICAgICAgICAgICAvLyBBcyBhIHJlc3VsdCwgd2UgYWRqdXN0IHRoZSB0b3AgbGluZSBieSAtMSwgYnV0Ci0gICAgICAgICAgICAvLyB3ZSBsZWF2ZSB0aGUgYm90dG9tIGxpbmUgYWxvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQWxzbyByZXF1aXJlIHRoYXQgdG9wICsgMiA8PSBib3R0b20KLQotICAgICAgICAgICAgaW50IHRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGdldEFyZzAoMSkgLSAxLCBtUm93cyAtIDIpKTsKLSAgICAgICAgICAgIGludCBib3R0b20gPSBNYXRoLm1heCh0b3AgKyAyLCBNYXRoLm1pbihnZXRBcmcxKG1Sb3dzKSwgbVJvd3MpKTsKLSAgICAgICAgICAgIG1Ub3BNYXJnaW4gPSB0b3A7Ci0gICAgICAgICAgICBtQm90dG9tTWFyZ2luID0gYm90dG9tOwotCi0gICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIHBsYWNlZCBpbiB0aGUgaG9tZSBwb3NpdGlvbgotICAgICAgICAgICAgc2V0Q3Vyc29yUm93Q29sKG1Ub3BNYXJnaW4sIDApOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcGFyc2VBcmcoYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZWxlY3RHcmFwaGljUmVuZGl0aW9uKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBtQXJnSW5kZXg7IGkrKykgewotICAgICAgICAgICAgaW50IGNvZGUgPSBtQXJnc1tpXTsKLSAgICAgICAgICAgIGlmICggY29kZSA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobUFyZ0luZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb2RlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7IC8vIHJlc2V0Ci0gICAgICAgICAgICAgICAgbUludmVyc2VDb2xvcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtRm9yZUNvbG9yID0gNzsKLSAgICAgICAgICAgICAgICBtQmFja0NvbG9yID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAxKSB7IC8vIGJvbGQKLSAgICAgICAgICAgICAgICBtRm9yZUNvbG9yIHw9IDB4ODsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSA0KSB7IC8vIHVuZGVyc2NvcmUKLSAgICAgICAgICAgICAgICBtQmFja0NvbG9yIHw9IDB4ODsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSA3KSB7IC8vIGludmVyc2UKLSAgICAgICAgICAgICAgICBtSW52ZXJzZUNvbG9ycyA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMzAgJiYgY29kZSA8PSAzNykgeyAvLyBmb3JlZ3JvdW5kIGNvbG9yCi0gICAgICAgICAgICAgICAgbUZvcmVDb2xvciA9IChtRm9yZUNvbG9yICYgMHg4KSB8IChjb2RlIC0gMzApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDQwICYmIGNvZGUgPD0gNDcpIHsgLy8gYmFja2dyb3VuZCBjb2xvcgotICAgICAgICAgICAgICAgIG1CYWNrQ29sb3IgPSAobUJhY2tDb2xvciAmIDB4OCkgfCAoY29kZSAtIDQwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRlcm0uTE9HX1VOS05PV05fRVNDQVBFX1NFUVVFTkNFUykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUZXJtLkxPR19UQUcsIFN0cmluZy5mb3JtYXQoIlNHUiB1bmtub3duIGNvZGUgJWQiLCBjb2RlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJsb2NrQ2xlYXIoaW50IHN4LCBpbnQgc3ksIGludCB3KSB7Ci0gICAgICAgIGJsb2NrQ2xlYXIoc3gsIHN5LCB3LCAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmxvY2tDbGVhcihpbnQgc3gsIGludCBzeSwgaW50IHcsIGludCBoKSB7Ci0gICAgICAgIG1TY3JlZW4uYmxvY2tTZXQoc3gsIHN5LCB3LCBoLCAnICcsIGdldEZvcmVDb2xvcigpLCBnZXRCYWNrQ29sb3IoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Rm9yZUNvbG9yKCkgewotICAgICAgICByZXR1cm4gbUludmVyc2VDb2xvcnMgPwotICAgICAgICAgICAgICAgICgobUJhY2tDb2xvciAmIDB4NykgfCAobUZvcmVDb2xvciAmIDB4OCkpIDogbUZvcmVDb2xvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRCYWNrQ29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBtSW52ZXJzZUNvbG9ycyA/Ci0gICAgICAgICAgICAgICAgKChtRm9yZUNvbG9yICYgMHg3KSB8IChtQmFja0NvbG9yICYgMHg4KSkgOiBtQmFja0NvbG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NldE1vZGUoYm9vbGVhbiBuZXdWYWx1ZSkgewotICAgICAgICBpbnQgbW9kZUJpdCA9IGdldEFyZzAoMCk7Ci0gICAgICAgIHN3aXRjaCAobW9kZUJpdCkgewotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBtSW5zZXJ0TW9kZSA9IG5ld1ZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgIG1BdXRvbWF0aWNOZXdsaW5lTW9kZSA9IG5ld1ZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVua25vd25QYXJhbWV0ZXIobW9kZUJpdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRIb3Jpem9udGFsVmVydGljYWxQb3NpdGlvbigpIHsKLQotICAgICAgICAvLyBQYXJhbWV0ZXJzIGFyZSBSb3cgOyBDb2x1bW4KLQotICAgICAgICBzZXRDdXJzb3JQb3NpdGlvbihnZXRBcmcxKDEpIC0gMSwgZ2V0QXJnMCgxKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgeCwgaW50IHkpIHsKLSAgICAgICAgaW50IGVmZmVjdGl2ZVRvcE1hcmdpbiA9IDA7Ci0gICAgICAgIGludCBlZmZlY3RpdmVCb3R0b21NYXJnaW4gPSBtUm93czsKLSAgICAgICAgaWYgKChtRGVjRmxhZ3MgJiBLX09SSUdJTl9NT0RFX01BU0spICE9IDApIHsKLSAgICAgICAgICAgIGVmZmVjdGl2ZVRvcE1hcmdpbiA9IG1Ub3BNYXJnaW47Ci0gICAgICAgICAgICBlZmZlY3RpdmVCb3R0b21NYXJnaW4gPSBtQm90dG9tTWFyZ2luOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXdSb3cgPQotICAgICAgICAgICAgICAgIE1hdGgubWF4KGVmZmVjdGl2ZVRvcE1hcmdpbiwgTWF0aC5taW4oZWZmZWN0aXZlVG9wTWFyZ2luICsgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUJvdHRvbU1hcmdpbiAtIDEpKTsKLSAgICAgICAgaW50IG5ld0NvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHgsIG1Db2x1bW5zIC0gMSkpOwotICAgICAgICBzZXRDdXJzb3JSb3dDb2wobmV3Um93LCBuZXdDb2wpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kRGV2aWNlQXR0cmlidXRlcygpIHsKLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHVzIGFzIGEgREVDIHZ0MTAwIHdpdGggYWR2YW5jZWQKLSAgICAgICAgLy8gdmlkZW8gb3B0aW9ucy4gVGhpcyBpcyB3aGF0IHRoZSB4dGVybSB0ZXJtaW5hbAotICAgICAgICAvLyBlbXVsYXRvciBzZW5kcy4KLSAgICAgICAgYnl0ZVtdIGF0dHJpYnV0ZXMgPQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBWVDEwMCAqLwotICAgICAgICAgICAgICAgICAoYnl0ZSkgMjcsIChieXRlKSAnWycsIChieXRlKSAnPycsIChieXRlKSAnMScsCi0gICAgICAgICAgICAgICAgIChieXRlKSAnOycsIChieXRlKSAnMicsIChieXRlKSAnYycKLQotICAgICAgICAgICAgICAgIC8qIFZUMjIwCi0gICAgICAgICAgICAgICAgKGJ5dGUpIDI3LCAoYnl0ZSkgJ1snLCAoYnl0ZSkgJz8nLCAoYnl0ZSkgJzYnLAotICAgICAgICAgICAgICAgIChieXRlKSAnMCcsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnMScsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnMicsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnNicsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnOCcsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnOScsICAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnMScsICAoYnl0ZSkgJzUnLCAoYnl0ZSkgJzsnLAotICAgICAgICAgICAgICAgIChieXRlKSAnYycKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgd3JpdGUoYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBkYXRhIHRvIHRoZSBzaGVsbCBwcm9jZXNzCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGUoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UZXJtT3V0LndyaXRlKGRhdGEpOwotICAgICAgICAgICAgbVRlcm1PdXQuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbgotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgdGhlIHJlY2VpdmVyIGlzbid0IGxpc3RlbmluZy4KLSAgICAgICAgICAgIC8vIFdlIGp1c3QgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIGFuc3dlciB0aGUgcXVlcnkuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2Nyb2xsKCkgewotICAgICAgICBtU2NyZWVuLnNjcm9sbChtVG9wTWFyZ2luLCBtQm90dG9tTWFyZ2luLAotICAgICAgICAgICAgICAgIGdldEZvcmVDb2xvcigpLCBnZXRCYWNrQ29sb3IoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgbmV4dCBBU0NJSSBjaGFyYWN0ZXIgb2YgYSBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYiBUaGUgbmV4dCBBU0NJSSBjaGFyYWN0ZXIgb2YgdGhlIHBhcmFtYXRlciBzZXF1ZW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VBcmcoYnl0ZSBiKSB7Ci0gICAgICAgIGlmIChiID49ICcwJyAmJiBiIDw9ICc5JykgewotICAgICAgICAgICAgaWYgKG1BcmdJbmRleCA8IG1BcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGludCBvbGRWYWx1ZSA9IG1BcmdzW21BcmdJbmRleF07Ci0gICAgICAgICAgICAgICAgaW50IHRoaXNEaWdpdCA9IGIgLSAnMCc7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gb2xkVmFsdWUgKiAxMCArIHRoaXNEaWdpdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXNEaWdpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFyZ3NbbUFyZ0luZGV4XSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWVTZXF1ZW5jZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGIgPT0gJzsnKSB7Ci0gICAgICAgICAgICBpZiAobUFyZ0luZGV4IDwgbUFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgbUFyZ0luZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZVNlcXVlbmNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmtub3duU2VxdWVuY2UoYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRBcmcwKGludCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFyZygwLCBkZWZhdWx0VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEFyZzEoaW50IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICByZXR1cm4gZ2V0QXJnKDEsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QXJnKGludCBpbmRleCwgaW50IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBpbnQgcmVzdWx0ID0gbUFyZ3NbaW5kZXhdOwotICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVuaW1wbGVtZW50ZWRTZXF1ZW5jZShieXRlIGIpIHsKLSAgICAgICAgaWYgKFRlcm0uTE9HX1VOS05PV05fRVNDQVBFX1NFUVVFTkNFUykgewotICAgICAgICAgICAgbG9nRXJyb3IoInVuaW1wbGVtZW50ZWQiLCBiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5pc2hTZXF1ZW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1bmtub3duU2VxdWVuY2UoYnl0ZSBiKSB7Ci0gICAgICAgIGlmIChUZXJtLkxPR19VTktOT1dOX0VTQ0FQRV9TRVFVRU5DRVMpIHsKLSAgICAgICAgICAgIGxvZ0Vycm9yKCJ1bmtub3duIiwgYik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluaXNoU2VxdWVuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5rbm93blBhcmFtZXRlcihpbnQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIGlmIChUZXJtLkxPR19VTktOT1dOX0VTQ0FQRV9TRVFVRU5DRVMpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlVua25vd24gcGFyYW1ldGVyIik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICBsb2dFcnJvcihidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yVHlwZSwgYnl0ZSBiKSB7Ci0gICAgICAgIGlmIChUZXJtLkxPR19VTktOT1dOX0VTQ0FQRV9TRVFVRU5DRVMpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZXJyb3JUeXBlKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBzZXF1ZW5jZSAiKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBFc2NhcGVTdGF0ZTogIik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG1Fc2NhcGVTdGF0ZSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIgY2hhcjogJyIpOwotICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgYik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCInICgiKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIpIik7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0QXJnID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1BcmdJbmRleDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gbUFyZ3NbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0QXJnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiYXJncyA9ICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJWQ7ICIsIHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAoVGVybS5MT0dfVU5LTk9XTl9FU0NBUEVfU0VRVUVOQ0VTKSB7Ci0gICAgICAgICAgICBMb2cuZShUZXJtLkxPR19UQUcsIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBmaW5pc2hTZXF1ZW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaW5pc2hTZXF1ZW5jZSgpIHsKLSAgICAgICAgbUVzY2FwZVN0YXRlID0gRVNDX05PTkU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGF1dG9XcmFwRW5hYmxlZCgpIHsKLSAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBhdXRvIHdyYXAsIGJlY2F1c2UgaXQncyB1c2VmdWwgb24gYSBzbWFsbCBzY3JlZW4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIC8vIHJldHVybiAobURlY0ZsYWdzICYgS19XUkFQQVJPVU5EX01PREVfTUFTSykgIT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGFuIEFTQ0lJIGNoYXJhY3RlciB0byB0aGUgc2NyZWVuLgotICAgICAqCi0gICAgICogQHBhcmFtIGIgdGhlIEFTQ0lJIGNoYXJhY3RlciB0byBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlbWl0KGJ5dGUgYikgewotICAgICAgICBib29sZWFuIGF1dG9XcmFwID0gYXV0b1dyYXBFbmFibGVkKCk7Ci0KLSAgICAgICAgaWYgKGF1dG9XcmFwKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnNvckNvbCA9PSBtQ29sdW1ucyAtIDEgJiYgbUFib3V0VG9BdXRvV3JhcCkgewotICAgICAgICAgICAgICAgIG1TY3JlZW4uc2V0TGluZVdyYXAobUN1cnNvclJvdyk7Ci0gICAgICAgICAgICAgICAgbUN1cnNvckNvbCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJzb3JSb3cgKyAxIDwgbUJvdHRvbU1hcmdpbikgewotICAgICAgICAgICAgICAgICAgICBtQ3Vyc29yUm93Kys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nyb2xsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnNlcnRNb2RlKSB7IC8vIE1vdmUgY2hhcmFjdGVyIHRvIHJpZ2h0IG9uZSBzcGFjZQotICAgICAgICAgICAgaW50IGRlc3RDb2wgPSBtQ3Vyc29yQ29sICsgMTsKLSAgICAgICAgICAgIGlmIChkZXN0Q29sIDwgbUNvbHVtbnMpIHsKLSAgICAgICAgICAgICAgICBtU2NyZWVuLmJsb2NrQ29weShtQ3Vyc29yQ29sLCBtQ3Vyc29yUm93LCBtQ29sdW1ucyAtIGRlc3RDb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAxLCBkZXN0Q29sLCBtQ3Vyc29yUm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1TY3JlZW4uc2V0KG1DdXJzb3JDb2wsIG1DdXJzb3JSb3csIGIsIGdldEZvcmVDb2xvcigpLCBnZXRCYWNrQ29sb3IoKSk7Ci0KLSAgICAgICAgaWYgKGF1dG9XcmFwKSB7Ci0gICAgICAgICAgICBtQWJvdXRUb0F1dG9XcmFwID0gKG1DdXJzb3JDb2wgPT0gbUNvbHVtbnMgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJzb3JDb2wgPSBNYXRoLm1pbihtQ3Vyc29yQ29sICsgMSwgbUNvbHVtbnMgLSAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q3Vyc29yUm93KGludCByb3cpIHsKLSAgICAgICAgbUN1cnNvclJvdyA9IHJvdzsKLSAgICAgICAgbUFib3V0VG9BdXRvV3JhcCA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDdXJzb3JDb2woaW50IGNvbCkgewotICAgICAgICBtQ3Vyc29yQ29sID0gY29sOwotICAgICAgICBtQWJvdXRUb0F1dG9XcmFwID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEN1cnNvclJvd0NvbChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIG1DdXJzb3JSb3cgPSBNYXRoLm1pbihyb3csIG1Sb3dzLTEpOwotICAgICAgICBtQ3Vyc29yQ29sID0gTWF0aC5taW4oY29sLCBtQ29sdW1ucy0xKTsKLSAgICAgICAgbUFib3V0VG9BdXRvV3JhcCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSB0ZXJtaW5hbCBlbXVsYXRvciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbUN1cnNvclJvdyA9IDA7Ci0gICAgICAgIG1DdXJzb3JDb2wgPSAwOwotICAgICAgICBtQXJnSW5kZXggPSAwOwotICAgICAgICBtQ29udGludWVTZXF1ZW5jZSA9IGZhbHNlOwotICAgICAgICBtRXNjYXBlU3RhdGUgPSBFU0NfTk9ORTsKLSAgICAgICAgbVNhdmVkQ3Vyc29yUm93ID0gMDsKLSAgICAgICAgbVNhdmVkQ3Vyc29yQ29sID0gMDsKLSAgICAgICAgbURlY0ZsYWdzID0gMDsKLSAgICAgICAgbVNhdmVkRGVjRmxhZ3MgPSAwOwotICAgICAgICBtSW5zZXJ0TW9kZSA9IGZhbHNlOwotICAgICAgICBtQXV0b21hdGljTmV3bGluZU1vZGUgPSBmYWxzZTsKLSAgICAgICAgbVRvcE1hcmdpbiA9IDA7Ci0gICAgICAgIG1Cb3R0b21NYXJnaW4gPSBtUm93czsKLSAgICAgICAgbUFib3V0VG9BdXRvV3JhcCA9IGZhbHNlOwotICAgICAgICBtRm9yZUNvbG9yID0gNzsKLSAgICAgICAgbUJhY2tDb2xvciA9IDA7Ci0gICAgICAgIG1JbnZlcnNlQ29sb3JzID0gZmFsc2U7Ci0gICAgICAgIG1iS2V5cGFkQXBwbGljYXRpb25Nb2RlID0gZmFsc2U7Ci0gICAgICAgIG1BbHRlcm5hdGVDaGFyU2V0ID0gZmFsc2U7Ci0gICAgICAgIC8vIG1Qcm9jZXNzZWRDaGFyQ291bnQgaXMgcHJlc2VydmVkIHVuY2hhbmdlZC4KLSAgICAgICAgc2V0RGVmYXVsdFRhYlN0b3BzKCk7Ci0gICAgICAgIGJsb2NrQ2xlYXIoMCwgMCwgbUNvbHVtbnMsIG1Sb3dzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zY3JpcHRUZXh0KCkgewotICAgICAgICByZXR1cm4gbVNjcmVlbi5nZXRUcmFuc2NyaXB0VGV4dCgpOwotICAgIH0KLX0KLQotLyoqCi0gKiBUZXh0IHJlbmRlcmVyIGludGVyZmFjZQotICovCi0KLWludGVyZmFjZSBUZXh0UmVuZGVyZXIgewotICAgIGludCBnZXRDaGFyYWN0ZXJXaWR0aCgpOwotICAgIGludCBnZXRDaGFyYWN0ZXJIZWlnaHQoKTsKLSAgICB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjYW52YXMsIGZsb2F0IHgsIGZsb2F0IHksCi0gICAgICAgICAgICBpbnQgbGluZU9mZnNldCwgY2hhcltdIHRleHQsCi0gICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb3VudCwgYm9vbGVhbiBjdXJzb3IsIGludCBmb3JlQ29sb3IsIGludCBiYWNrQ29sb3IpOwotfQotCi1hYnN0cmFjdCBjbGFzcyBCYXNlVGV4dFJlbmRlcmVyIGltcGxlbWVudHMgVGV4dFJlbmRlcmVyIHsKLSAgICBwcm90ZWN0ZWQgaW50W10gbUZvcmVQYWludCA9IHsKLSAgICAgICAgICAgIDB4ZmYwMDAwMDAsIC8vIEJsYWNrCi0gICAgICAgICAgICAweGZmZmYwMDAwLCAvLyBSZWQKLSAgICAgICAgICAgIDB4ZmYwMGZmMDAsIC8vIGdyZWVuCi0gICAgICAgICAgICAweGZmZmZmZjAwLCAvLyB5ZWxsb3cKLSAgICAgICAgICAgIDB4ZmYwMDAwZmYsIC8vIGJsdWUKLSAgICAgICAgICAgIDB4ZmZmZjAwZmYsIC8vIG1hZ2VudGEKLSAgICAgICAgICAgIDB4ZmYwMGZmZmYsIC8vIGN5YW4KLSAgICAgICAgICAgIDB4ZmZmZmZmZmYgIC8vIHdoaXRlIC0tIGlzIG92ZXJyaWRkZW4gYnkgY29uc3RydWN0b3IKLSAgICB9OwotICAgIHByb3RlY3RlZCBpbnRbXSBtQmFja1BhaW50ID0gewotICAgICAgICAgICAgMHhmZjAwMDAwMCwgLy8gQmxhY2sgLS0gaXMgb3ZlcnJpZGRlbiBieSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgMHhmZmNjMDAwMCwgLy8gUmVkCi0gICAgICAgICAgICAweGZmMDBjYzAwLCAvLyBncmVlbgotICAgICAgICAgICAgMHhmZmNjY2MwMCwgLy8geWVsbG93Ci0gICAgICAgICAgICAweGZmMDAwMGNjLCAvLyBibHVlCi0gICAgICAgICAgICAweGZmZmYwMGNjLCAvLyBtYWdlbnRhCi0gICAgICAgICAgICAweGZmMDBjY2NjLCAvLyBjeWFuCi0gICAgICAgICAgICAweGZmZmZmZmZmICAvLyB3aGl0ZQotICAgIH07Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgbUN1cnNvclBhaW50ID0gMHhmZjgwODA4MDsKLQotICAgIHB1YmxpYyBCYXNlVGV4dFJlbmRlcmVyKGludCBmb3JlUGFpbnRDb2xvciwgaW50IGJhY2tQYWludENvbG9yKSB7Ci0gICAgICAgIG1Gb3JlUGFpbnRbN10gPSBmb3JlUGFpbnRDb2xvcjsKLSAgICAgICAgbUJhY2tQYWludFswXSA9IGJhY2tQYWludENvbG9yOwotCi0gICAgfQotfQotCi1jbGFzcyBCaXRtYXA0eDhGb250UmVuZGVyZXIgZXh0ZW5kcyBCYXNlVGV4dFJlbmRlcmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQga0NoYXJhY3RlcldpZHRoID0gNDsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQga0NoYXJhY3RlckhlaWdodCA9IDg7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUZvbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRGb3JlQ29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCYWNrQ29sb3I7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1Db2xvck1hdHJpeDsKLSAgICBwcml2YXRlIFBhaW50IG1QYWludDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBCWVRFX1NDQUxFID0gMS4wZiAvIDI1NS4wZjsKLQotICAgIHB1YmxpYyBCaXRtYXA0eDhGb250UmVuZGVyZXIoUmVzb3VyY2VzIHJlc291cmNlcywKLSAgICAgICAgICAgIGludCBmb3JlUGFpbnRDb2xvciwgaW50IGJhY2tQYWludENvbG9yKSB7Ci0gICAgICAgIHN1cGVyKGZvcmVQYWludENvbG9yLCBiYWNrUGFpbnRDb2xvcik7Ci0gICAgICAgIG1Gb250ID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShyZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5hdGFyaV9zbWFsbCk7Ci0gICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIGtDaGFyYWN0ZXJXaWR0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENoYXJhY3RlckhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIGtDaGFyYWN0ZXJIZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGNhbnZhcywgZmxvYXQgeCwgZmxvYXQgeSwKLSAgICAgICAgICAgIGludCBsaW5lT2Zmc2V0LCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICBib29sZWFuIGN1cnNvciwgaW50IGZvcmVDb2xvciwgaW50IGJhY2tDb2xvcikgewotICAgICAgICBzZXRDb2xvck1hdHJpeChtRm9yZVBhaW50W2ZvcmVDb2xvciAmIDddLAotICAgICAgICAgICAgICAgIGN1cnNvciA/IG1DdXJzb3JQYWludCA6IG1CYWNrUGFpbnRbYmFja0NvbG9yICYgN10pOwotICAgICAgICBpbnQgZGVzdFggPSAoaW50KSB4ICsga0NoYXJhY3RlcldpZHRoICogbGluZU9mZnNldDsKLSAgICAgICAgaW50IGRlc3RZID0gKGludCkgeTsKLSAgICAgICAgUmVjdCBzcmNSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgUmVjdCBkZXN0UmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGRlc3RSZWN0LnRvcCA9IChkZXN0WSAtIGtDaGFyYWN0ZXJIZWlnaHQpOwotICAgICAgICBkZXN0UmVjdC5ib3R0b20gPSBkZXN0WTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHRleHRbaSArIGluZGV4XTsKLSAgICAgICAgICAgIGlmICgoY3Vyc29yIHx8IChjICE9IDMyKSkgJiYgKGMgPCAxMjgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNlbGxYID0gYyAmIDMxOwotICAgICAgICAgICAgICAgIGludCBjZWxsWSA9IChjID4+IDUpICYgMzsKLSAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IGNlbGxYICoga0NoYXJhY3RlcldpZHRoOwotICAgICAgICAgICAgICAgIGludCBzcmNZID0gY2VsbFkgKiBrQ2hhcmFjdGVySGVpZ2h0OwotICAgICAgICAgICAgICAgIHNyY1JlY3Quc2V0KHNyY1gsIHNyY1ksCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNYICsga0NoYXJhY3RlcldpZHRoLCBzcmNZICsga0NoYXJhY3RlckhlaWdodCk7Ci0gICAgICAgICAgICAgICAgZGVzdFJlY3QubGVmdCA9IGRlc3RYOwotICAgICAgICAgICAgICAgIGRlc3RSZWN0LnJpZ2h0ID0gZGVzdFggKyBrQ2hhcmFjdGVyV2lkdGg7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUZvbnQsIHNyY1JlY3QsIGRlc3RSZWN0LCBtUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdFggKz0ga0NoYXJhY3RlcldpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbG9yTWF0cml4KGludCBmb3JlQ29sb3IsIGludCBiYWNrQ29sb3IpIHsKLSAgICAgICAgaWYgKChmb3JlQ29sb3IgIT0gbUN1cnJlbnRGb3JlQ29sb3IpCi0gICAgICAgICAgICAgICAgfHwgKGJhY2tDb2xvciAhPSBtQ3VycmVudEJhY2tDb2xvcikKLSAgICAgICAgICAgICAgICB8fCAobUNvbG9yTWF0cml4ID09IG51bGwpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEZvcmVDb2xvciA9IGZvcmVDb2xvcjsKLSAgICAgICAgICAgIG1DdXJyZW50QmFja0NvbG9yID0gYmFja0NvbG9yOwotICAgICAgICAgICAgaWYgKG1Db2xvck1hdHJpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbG9yTWF0cml4ID0gbmV3IGZsb2F0WzIwXTsKLSAgICAgICAgICAgICAgICBtQ29sb3JNYXRyaXhbMThdID0gMS4wZjsgLy8gSnVzdCBjb3B5IEFscGhhCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCAzOyBjb21wb25lbnQrKykgewotICAgICAgICAgICAgICAgIGludCByaWdodFNoaWZ0ID0gKDIgLSBjb21wb25lbnQpIDw8IDM7Ci0gICAgICAgICAgICAgICAgaW50IGZvcmUgPSAweGZmICYgKGZvcmVDb2xvciA+PiByaWdodFNoaWZ0KTsKLSAgICAgICAgICAgICAgICBpbnQgYmFjayA9IDB4ZmYgJiAoYmFja0NvbG9yID4+IHJpZ2h0U2hpZnQpOwotICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGJhY2sgLSBmb3JlOwotICAgICAgICAgICAgICAgIG1Db2xvck1hdHJpeFtjb21wb25lbnQgKiA2XSA9IGRlbHRhICogQllURV9TQ0FMRTsKLSAgICAgICAgICAgICAgICBtQ29sb3JNYXRyaXhbY29tcG9uZW50ICogNSArIDRdID0gZm9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QYWludC5zZXRDb2xvckZpbHRlcihuZXcgQ29sb3JNYXRyaXhDb2xvckZpbHRlcihtQ29sb3JNYXRyaXgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY2xhc3MgUGFpbnRSZW5kZXJlciBleHRlbmRzIEJhc2VUZXh0UmVuZGVyZXIgewotICAgIHB1YmxpYyBQYWludFJlbmRlcmVyKGludCBmb250U2l6ZSwgaW50IGZvcmVQYWludENvbG9yLCBpbnQgYmFja1BhaW50Q29sb3IpIHsKLSAgICAgICAgc3VwZXIoZm9yZVBhaW50Q29sb3IsIGJhY2tQYWludENvbG9yKTsKLSAgICAgICAgbVRleHRQYWludCA9IG5ldyBQYWludCgpOwotICAgICAgICBtVGV4dFBhaW50LnNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgIG1UZXh0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwotICAgICAgICBtVGV4dFBhaW50LnNldFRleHRTaXplKGZvbnRTaXplKTsKLQotICAgICAgICBtQ2hhckhlaWdodCA9IChpbnQpIE1hdGguY2VpbChtVGV4dFBhaW50LmdldEZvbnRTcGFjaW5nKCkpOwotICAgICAgICBtQ2hhckFzY2VudCA9IChpbnQpIE1hdGguY2VpbChtVGV4dFBhaW50LmFzY2VudCgpKTsKLSAgICAgICAgbUNoYXJEZXNjZW50ID0gbUNoYXJIZWlnaHQgKyBtQ2hhckFzY2VudDsKLSAgICAgICAgbUNoYXJXaWR0aCA9IChpbnQpIG1UZXh0UGFpbnQubWVhc3VyZVRleHQoRVhBTVBMRV9DSEFSLCAwLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgY2FudmFzLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgbGluZU9mZnNldCwKLSAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgIGJvb2xlYW4gY3Vyc29yLCBpbnQgZm9yZUNvbG9yLCBpbnQgYmFja0NvbG9yKSB7Ci0gICAgICAgIGlmIChjdXJzb3IpIHsKLSAgICAgICAgICAgIG1UZXh0UGFpbnQuc2V0Q29sb3IobUN1cnNvclBhaW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UZXh0UGFpbnQuc2V0Q29sb3IobUJhY2tQYWludFtiYWNrQ29sb3IgJiAweDddKTsKLSAgICAgICAgfQotICAgICAgICBmbG9hdCBsZWZ0ID0geCArIGxpbmVPZmZzZXQgKiBtQ2hhcldpZHRoOwotICAgICAgICBjYW52YXMuZHJhd1JlY3QobGVmdCwgeSArIG1DaGFyQXNjZW50LAotICAgICAgICAgICAgICAgIGxlZnQgKyBjb3VudCAqIG1DaGFyV2lkdGgsIHkgKyBtQ2hhckRlc2NlbnQsCi0gICAgICAgICAgICAgICAgbVRleHRQYWludCk7Ci0gICAgICAgIGJvb2xlYW4gYm9sZCA9ICggZm9yZUNvbG9yICYgMHg4ICkgIT0gMDsKLSAgICAgICAgYm9vbGVhbiB1bmRlcmxpbmUgPSAoYmFja0NvbG9yICYgMHg4KSAhPSAwOwotICAgICAgICBpZiAoYm9sZCkgewotICAgICAgICAgICAgbVRleHRQYWludC5zZXRGYWtlQm9sZFRleHQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZGVybGluZSkgewotICAgICAgICAgICAgbVRleHRQYWludC5zZXRVbmRlcmxpbmVUZXh0KHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXh0UGFpbnQuc2V0Q29sb3IobUZvcmVQYWludFtmb3JlQ29sb3IgJiAweDddKTsKLSAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIGluZGV4LCBjb3VudCwgbGVmdCwgeSwgbVRleHRQYWludCk7Ci0gICAgICAgIGlmIChib2xkKSB7Ci0gICAgICAgICAgICBtVGV4dFBhaW50LnNldEZha2VCb2xkVGV4dChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZGVybGluZSkgewotICAgICAgICAgICAgbVRleHRQYWludC5zZXRVbmRlcmxpbmVUZXh0KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVySGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbUNoYXJIZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1DaGFyV2lkdGg7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFBhaW50IG1UZXh0UGFpbnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUNoYXJXaWR0aDsKLSAgICBwcml2YXRlIGludCBtQ2hhckhlaWdodDsKLSAgICBwcml2YXRlIGludCBtQ2hhckFzY2VudDsKLSAgICBwcml2YXRlIGludCBtQ2hhckRlc2NlbnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYQU1QTEVfQ0hBUiA9IHsnWCd9OwotICAgIH0KLQotLyoqCi0gKiBBIG11bHRpLXRocmVhZC1zYWZlIHByb2R1Y2UtY29uc3VtZXIgYnl0ZSBhcnJheS4KLSAqIE9ubHkgYWxsb3dzIG9uZSBwcm9kdWNlciBhbmQgb25lIGNvbnN1bWVyLgotICovCi0KLWNsYXNzIEJ5dGVRdWV1ZSB7Ci0gICAgcHVibGljIEJ5dGVRdWV1ZShpbnQgc2l6ZSkgewotICAgICAgICBtQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRCeXRlc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RvcmVkQnl0ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxlbmd0aCArIG9mZnNldCA+IGJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoICsgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoIDwgMCIpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgd2hpbGUgKG1TdG9yZWRCeXRlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgd2FpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHRvdGFsUmVhZCA9IDA7Ci0gICAgICAgICAgICBpbnQgYnVmZmVyTGVuZ3RoID0gbUJ1ZmZlci5sZW5ndGg7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0Z1bGwgPSBidWZmZXJMZW5ndGggPT0gbVN0b3JlZEJ5dGVzOwotICAgICAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDAgJiYgbVN0b3JlZEJ5dGVzID4gMCkgewotICAgICAgICAgICAgICAgIGludCBvbmVSdW4gPSBNYXRoLm1pbihidWZmZXJMZW5ndGggLSBtSGVhZCwgbVN0b3JlZEJ5dGVzKTsKLSAgICAgICAgICAgICAgICBpbnQgYnl0ZXNUb0NvcHkgPSBNYXRoLm1pbihsZW5ndGgsIG9uZVJ1bik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtQnVmZmVyLCBtSGVhZCwgYnVmZmVyLCBvZmZzZXQsIGJ5dGVzVG9Db3B5KTsKLSAgICAgICAgICAgICAgICBtSGVhZCArPSBieXRlc1RvQ29weTsKLSAgICAgICAgICAgICAgICBpZiAobUhlYWQgPj0gYnVmZmVyTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IZWFkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0b3JlZEJ5dGVzIC09IGJ5dGVzVG9Db3B5OwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBieXRlc1RvQ29weTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNUb0NvcHk7Ci0gICAgICAgICAgICAgICAgdG90YWxSZWFkICs9IGJ5dGVzVG9Db3B5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdhc0Z1bGwpIHsKLSAgICAgICAgICAgICAgICBub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0b3RhbFJlYWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsZW5ndGggKyBvZmZzZXQgPiBidWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCArIG9mZnNldCA+IGJ1ZmZlci5sZW5ndGgiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCA8IDAiKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICBpbnQgYnVmZmVyTGVuZ3RoID0gbUJ1ZmZlci5sZW5ndGg7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0VtcHR5ID0gbVN0b3JlZEJ5dGVzID09IDA7Ci0gICAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHdoaWxlKGJ1ZmZlckxlbmd0aCA9PSBtU3RvcmVkQnl0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgdGFpbCA9IG1IZWFkICsgbVN0b3JlZEJ5dGVzOwotICAgICAgICAgICAgICAgIGludCBvbmVSdW47Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgPj0gYnVmZmVyTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhaWwgPSB0YWlsIC0gYnVmZmVyTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBvbmVSdW4gPSBtSGVhZCAtIHRhaWw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25lUnVuID0gYnVmZmVyTGVuZ3RoIC0gdGFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGJ5dGVzVG9Db3B5ID0gTWF0aC5taW4ob25lUnVuLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBvZmZzZXQsIG1CdWZmZXIsIHRhaWwsIGJ5dGVzVG9Db3B5KTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNUb0NvcHk7Ci0gICAgICAgICAgICAgICAgbVN0b3JlZEJ5dGVzICs9IGJ5dGVzVG9Db3B5OwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBieXRlc1RvQ29weTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3YXNFbXB0eSkgewotICAgICAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gbUJ1ZmZlcjsKLSAgICBwcml2YXRlIGludCBtSGVhZDsKLSAgICBwcml2YXRlIGludCBtU3RvcmVkQnl0ZXM7Ci19Ci0vKioKLSAqIEEgdmlldyBvbiBhIHRyYW5zY3JpcHQgYW5kIGEgdGVybWluYWwgZW11bGF0b3IuIERpc3BsYXlzIHRoZSB0ZXh0IG9mIHRoZQotICogdHJhbnNjcmlwdCBhbmQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIG9mIHRoZSB0ZXJtaW5hbCBlbXVsYXRvci4KLSAqLwotY2xhc3MgRW11bGF0b3JWaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEdlc3R1cmVEZXRlY3Rvci5Pbkdlc3R1cmVMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBXZSBkZWZlciBzb21lIGluaXRpYWxpemF0aW9uIHVudGlsIHdlIGhhdmUgYmVlbiBsYXllZCBvdXQgaW4gdGhlIHZpZXcKLSAgICAgKiBoaWVyYXJjaHkuIFRoZSBib29sZWFuIHRyYWNrcyB3aGVuIHdlIGtub3cgd2hhdCBvdXIgc2l6ZSBpcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUtub3duU2l6ZTsKLQotICAgIC8qKgotICAgICAqIE91ciB0cmFuc2NyaXB0LiBDb250YWlucyB0aGUgc2NyZWVuIGFuZCB0aGUgdHJhbnNjcmlwdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRyYW5zY3JpcHRTY3JlZW4gbVRyYW5zY3JpcHRTY3JlZW47Ci0KLSAgICAvKioKLSAgICAgKiBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgdHJhbnNjcmlwdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNDUklQVF9ST1dTID0gMTAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUb3RhbCB3aWR0aCBvZiBlYWNoIGNoYXJhY3RlciwgaW4gcGl4ZWxzCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUNoYXJhY3RlcldpZHRoOwotCi0gICAgLyoqCi0gICAgICogVG90YWwgaGVpZ2h0IG9mIGVhY2ggY2hhcmFjdGVyLCBpbiBwaXhlbHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQ2hhcmFjdGVySGVpZ2h0OwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byByZW5kZXIgdGV4dAotICAgICAqLwotICAgIHByaXZhdGUgVGV4dFJlbmRlcmVyIG1UZXh0UmVuZGVyZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXh0IHNpemUuIFplcm8gbWVhbnMgNCB4IDggZm9udC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtVGV4dFNpemU7Ci0KLSAgICAvKioKLSAgICAgKiBGb3JlZ3JvdW5kIGNvbG9yLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Gb3JlZ3JvdW5kOwotCi0gICAgLyoqCi0gICAgICogQmFja2dyb3VuZCBjb2xvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZDsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gcGFpbnQgdGhlIGN1cnNvcgotICAgICAqLwotICAgIHByaXZhdGUgUGFpbnQgbUN1cnNvclBhaW50OwotCi0gICAgcHJpdmF0ZSBQYWludCBtQmFja2dyb3VuZFBhaW50OwotCi0gICAgLyoqCi0gICAgICogT3VyIHRlcm1pbmFsIGVtdWxhdG9yLiBXZSB1c2UgdGhpcyB0byBnZXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgVGVybWluYWxFbXVsYXRvciBtRW11bGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgdGV4dCB0byBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Sb3dzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRleHQgdG8gZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtQ29sdW1uczsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSBkaXNwbGF5LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpc2libGVDb2x1bW5zOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRvcCByb3cgb2YgdGV4dCB0byBkaXNwbGF5LiBSYW5nZXMgZnJvbSAtYWN0aXZlVHJhbnNjcmlwdFJvd3MgdG8gMAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1Ub3BSb3c7Ci0KLSAgICBwcml2YXRlIGludCBtTGVmdENvbHVtbjsKLQotICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbVRlcm1GZDsKLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSByZW1vdGUgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSBtVGVybUluOwotCi0gICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIG1UZXJtT3V0OwotCi0gICAgcHJpdmF0ZSBCeXRlUXVldWUgbUJ5dGVRdWV1ZTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gdGVtcG9yYXJpbHkgaG9sZCBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBwcm9jZXNzLiBBbGxvY2F0ZWQKLSAgICAgKiBvbmNlIGFuZCB1c2VkIHBlcm1hbmVudGx5IHRvIG1pbmltaXplIGhlYXAgdGhyYXNoaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1SZWNlaXZlQnVmZmVyOwotCi0gICAgLyoqCi0gICAgICogT3VyIHByaXZhdGUgbWVzc2FnZSBpZCwgd2hpY2ggd2UgdXNlIHRvIHJlY2VpdmUgbmV3IGlucHV0IGZyb20gdGhlCi0gICAgICogcmVtb3RlIHByb2Nlc3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJlYWQgdGhhdCBwb2xscyBmb3IgaW5wdXQgZnJvbSB0aGUgcmVtb3RlIHByb2Nlc3MKLSAgICAgKi8KLQotICAgIHByaXZhdGUgVGhyZWFkIG1Qb2xsaW5nVGhyZWFkOwotCi0gICAgcHJpdmF0ZSBHZXN0dXJlRGV0ZWN0b3IgbUdlc3R1cmVEZXRlY3RvcjsKLSAgICBwcml2YXRlIGZsb2F0IG1TY3JvbGxSZW1haW5kZXI7Ci0gICAgcHJpdmF0ZSBUZXJtS2V5TGlzdGVuZXIgbUtleUxpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogT3VyIG1lc3NhZ2UgaGFuZGxlciBjbGFzcy4gSW1wbGVtZW50cyBhIHBlcmlvZGljIGNhbGxiYWNrLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIHRoZSBjYWxsYmFjayBtZXNzYWdlLiBDYWxsIG91ciBlbmNsb3NpbmcgY2xhc3MncyB1cGRhdGUKLSAgICAgICAgICogbWV0aG9kLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbXNnIFRoZSBjYWxsYmFjayBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBVUERBVEUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgRW11bGF0b3JWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgY29tbW9uQ29uc3RydWN0b3IoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoVGVybUtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1LZXlMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbG9ycyhpbnQgZm9yZWdyb3VuZCwgaW50IGJhY2tncm91bmQpIHsKLSAgICAgICAgbUZvcmVncm91bmQgPSBmb3JlZ3JvdW5kOwotICAgICAgICBtQmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0gICAgICAgIHVwZGF0ZVRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zY3JpcHRUZXh0KCkgewotICAgICAgICByZXR1cm4gbUVtdWxhdG9yLmdldFRyYW5zY3JpcHRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRUZXJtaW5hbCgpIHsKLSAgICAgICAgbUVtdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNoZWNrSXNUZXh0RWRpdG9yKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW5wdXRDb25uZWN0aW9uIG9uQ3JlYXRlSW5wdXRDb25uZWN0aW9uKEVkaXRvckluZm8gb3V0QXR0cnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCYXNlSW5wdXRDb25uZWN0aW9uKHRoaXMsIGZhbHNlKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYmVnaW5CYXRjaEVkaXQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2xlYXJNZXRhS2V5U3RhdGVzKGludCBzdGF0ZXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRDb21wbGV0aW9uKENvbXBsZXRpb25JbmZvIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgbmV3Q3Vyc29yUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBzZW5kVGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVTdXJyb3VuZGluZ1RleHQoaW50IGxlZnRMZW5ndGgsIGludCByaWdodExlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuZEJhdGNoRWRpdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2hDb21wb3NpbmdUZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3Vyc29yQ2Fwc01vZGUoaW50IHJlcU1vZGVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEV4dHJhY3RlZFRleHQgZ2V0RXh0cmFjdGVkVGV4dChFeHRyYWN0ZWRUZXh0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRBZnRlckN1cnNvcihpbnQgbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0QmVmb3JlQ3Vyc29yKGludCBuLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRWRpdG9yQWN0aW9uKGludCBhY3Rpb25Db2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYoYWN0aW9uQ29kZSA9PSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlICJyZXR1cm4iIGtleSBoYXMgYmVlbiBwcmVzc2VkIG9uIHRoZSBJTUUuCi0gICAgICAgICAgICAgICAgICAgIHNlbmRUZXh0KCJcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1Db250ZXh0TWVudUFjdGlvbihpbnQgaWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtUHJpdmF0ZUNvbW1hbmQoU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZW5kS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGV2ZW50LmdldEtleUNvZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfREVMOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENoYXIoMTI3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNldENvbXBvc2luZ1RleHQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBuZXdDdXJzb3JQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNldFNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRDaGFyKGludCBjKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFwQW5kU2VuZChjKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwQW5kU2VuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBtYXBBbmRTZW5kKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIG1UZXJtT3V0LndyaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUtleUxpc3RlbmVyLm1hcENvbnRyb2xDaGFyKGMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRLZXlwYWRBcHBsaWNhdGlvbk1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtRW11bGF0b3IuZ2V0S2V5cGFkQXBwbGljYXRpb25Nb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVtdWxhdG9yVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW11bGF0b3JWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLAotICAgICAgICAgICAgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGFuZHJvaWQuUi5zdHlsZWFibGUuVmlldyk7Ci0gICAgICAgIGluaXRpYWxpemVTY3JvbGxiYXJzKGEpOwotICAgICAgICBhLnJlY3ljbGUoKTsKLSAgICAgICAgY29tbW9uQ29uc3RydWN0b3IoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbW1vbkNvbnN0cnVjdG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtVGV4dFJlbmRlcmVyID0gbnVsbDsKLSAgICAgICAgbUN1cnNvclBhaW50ID0gbmV3IFBhaW50KCk7Ci0gICAgICAgIG1DdXJzb3JQYWludC5zZXRBUkdCKDI1NSwxMjgsMTI4LDEyOCk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kUGFpbnQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgbVRvcFJvdyA9IDA7Ci0gICAgICAgIG1MZWZ0Q29sdW1uID0gMDsKLSAgICAgICAgbUdlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwgdGhpcywgbnVsbCk7Ci0gICAgICAgIG1HZXN0dXJlRGV0ZWN0b3Iuc2V0SXNMb25ncHJlc3NFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0VmVydGljYWxTY3JvbGxCYXJFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtVHJhbnNjcmlwdFNjcmVlbi5nZXRBY3RpdmVSb3dzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxFeHRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUm93czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UcmFuc2NyaXB0U2NyZWVuLmdldEFjdGl2ZVJvd3MoKSArIG1Ub3BSb3cgLSBtUm93czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgdG8gaW5pdGlhbGl6ZSB0aGUgdmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXJtRmQgdGhlIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIEBwYXJhbSB0ZXJtT3V0IHRoZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgcHNldWRvLXRlbGV0eXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShGaWxlRGVzY3JpcHRvciB0ZXJtRmQsIEZpbGVPdXRwdXRTdHJlYW0gdGVybU91dCkgewotICAgICAgICBtVGVybU91dCA9IHRlcm1PdXQ7Ci0gICAgICAgIG1UZXJtRmQgPSB0ZXJtRmQ7Ci0gICAgICAgIG1UZXh0U2l6ZSA9IDEwOwotICAgICAgICBtRm9yZWdyb3VuZCA9IFRlcm0uV0hJVEU7Ci0gICAgICAgIG1CYWNrZ3JvdW5kID0gVGVybS5CTEFDSzsKLSAgICAgICAgdXBkYXRlVGV4dCgpOwotICAgICAgICBtVGVybUluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtVGVybUZkKTsKLSAgICAgICAgbVJlY2VpdmVCdWZmZXIgPSBuZXcgYnl0ZVs0ICogMTAyNF07Ci0gICAgICAgIG1CeXRlUXVldWUgPSBuZXcgQnl0ZVF1ZXVlKDQgKiAxMDI0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2NlcHQgYSBzZXF1ZW5jZSBvZiBieXRlcyAodHlwaWNhbGx5IGZyb20gdGhlIHBzZXVkby10dHkpIGFuZCBwcm9jZXNzCi0gICAgICogdGhlbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICogQHBhcmFtIGJhc2UgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgdG8gcHJvY2VzcwotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byBwcm9jZXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kKGJ5dGVbXSBidWZmZXIsIGludCBiYXNlLCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIG1FbXVsYXRvci5hcHBlbmQoYnVmZmVyLCBiYXNlLCBsZW5ndGgpOwotICAgICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKCk7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYWdlIHRoZSB0ZXJtaW5hbCB2aWV3IChzY3JvbGwgaXQgdXAgb3IgZG93biBieSBkZWx0YSBzY3JlZW5mdWxscy4pCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGEgdGhlIG51bWJlciBvZiBzY3JlZW5zIHRvIHNjcm9sbC4gUG9zaXRpdmUgbWVhbnMgc2Nyb2xsIGRvd24sCi0gICAgICogICAgICAgIG5lZ2F0aXZlIG1lYW5zIHNjcm9sbCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWdlKGludCBkZWx0YSkgewotICAgICAgICBtVG9wUm93ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1pbigwLCBNYXRoLm1heCgtKG1UcmFuc2NyaXB0U2NyZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlVHJhbnNjcmlwdFJvd3MoKSksIG1Ub3BSb3cgKyBtUm93cyAqIGRlbHRhKSk7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYWdlIHRoZSB0ZXJtaW5hbCB2aWV3IGhvcml6b250YWxseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWx0YUNvbHVtbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIHNjcm9sbC4gUG9zaXRpdmUgc2Nyb2xscyB0bwotICAgICAqICAgICAgICB0aGUgcmlnaHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFnZUhvcml6b250YWwoaW50IGRlbHRhQ29sdW1ucykgewotICAgICAgICBtTGVmdENvbHVtbiA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4obUxlZnRDb2x1bW4gKyBkZWx0YUNvbHVtbnMsIG1Db2x1bW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAtIG1WaXNpYmxlQ29sdW1ucykpOwotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGV4dCBzaXplLCB3aGljaCBpbiB0dXJuIHNldHMgdGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9udFNpemUgdGhlIG5ldyBmb250IHNpemUsIGluIHBpeGVscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0U2l6ZShpbnQgZm9udFNpemUpIHsKLSAgICAgICAgbVRleHRTaXplID0gZm9udFNpemU7Ci0gICAgICAgIHVwZGF0ZVRleHQoKTsKLSAgICB9Ci0KLSAgICAvLyBCZWdpbiBHZXN0dXJlRGV0ZWN0b3IuT25HZXN0dXJlTGlzdGVuZXIgbWV0aG9kcwotCi0gICAgcHVibGljIGJvb2xlYW4gb25TaW5nbGVUYXBVcChNb3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uTG9uZ1ByZXNzKE1vdGlvbkV2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvblNjcm9sbChNb3Rpb25FdmVudCBlMSwgTW90aW9uRXZlbnQgZTIsCi0gICAgICAgICAgICBmbG9hdCBkaXN0YW5jZVgsIGZsb2F0IGRpc3RhbmNlWSkgewotICAgICAgICBkaXN0YW5jZVkgKz0gbVNjcm9sbFJlbWFpbmRlcjsKLSAgICAgICAgaW50IGRlbHRhUm93cyA9IChpbnQpIChkaXN0YW5jZVkgLyBtQ2hhcmFjdGVySGVpZ2h0KTsKLSAgICAgICAgbVNjcm9sbFJlbWFpbmRlciA9IGRpc3RhbmNlWSAtIGRlbHRhUm93cyAqIG1DaGFyYWN0ZXJIZWlnaHQ7Ci0gICAgICAgIG1Ub3BSb3cgPQotICAgICAgICAgICAgTWF0aC5taW4oMCwgTWF0aC5tYXgoLShtVHJhbnNjcmlwdFNjcmVlbgotICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlVHJhbnNjcmlwdFJvd3MoKSksIG1Ub3BSb3cgKyBkZWx0YVJvd3MpKTsKLSAgICAgICAgaW52YWxpZGF0ZSgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TaW5nbGVUYXBDb25maXJtZWQoTW90aW9uRXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSnVtcFRhcERvd24oTW90aW9uRXZlbnQgZTEsIE1vdGlvbkV2ZW50IGUyKSB7Ci0gICAgICAgLy8gU2Nyb2xsIHRvIGJvdHRvbQotICAgICAgIG1Ub3BSb3cgPSAwOwotICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkp1bXBUYXBVcChNb3Rpb25FdmVudCBlMSwgTW90aW9uRXZlbnQgZTIpIHsKLSAgICAgICAgLy8gU2Nyb2xsIHRvIHRvcAotICAgICAgICBtVG9wUm93ID0gLW1UcmFuc2NyaXB0U2NyZWVuLmdldEFjdGl2ZVRyYW5zY3JpcHRSb3dzKCk7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25GbGluZyhNb3Rpb25FdmVudCBlMSwgTW90aW9uRXZlbnQgZTIsIGZsb2F0IHZlbG9jaXR5WCwKLSAgICAgICAgICAgIGZsb2F0IHZlbG9jaXR5WSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgYW5pbWF0aW9uIG1hbidzIChub24gYW5pbWF0ZWQpIGZsaW5nCi0gICAgICAgIG1TY3JvbGxSZW1haW5kZXIgPSAwLjBmOwotICAgICAgICBvblNjcm9sbChlMSwgZTIsIDIgKiB2ZWxvY2l0eVgsIC0yICogdmVsb2NpdHlZKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TaG93UHJlc3MoTW90aW9uRXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uRG93bihNb3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIG1TY3JvbGxSZW1haW5kZXIgPSAwLjBmOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgR2VzdHVyZURldGVjdG9yLk9uR2VzdHVyZUxpc3RlbmVyIG1ldGhvZHMKLQotICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1HZXN0dXJlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGV4dCgpIHsKLSAgICAgICAgaWYgKG1UZXh0U2l6ZSA+IDApIHsKLSAgICAgICAgICAgIG1UZXh0UmVuZGVyZXIgPSBuZXcgUGFpbnRSZW5kZXJlcihtVGV4dFNpemUsIG1Gb3JlZ3JvdW5kLAotICAgICAgICAgICAgICAgICAgICBtQmFja2dyb3VuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtVGV4dFJlbmRlcmVyID0gbmV3IEJpdG1hcDR4OEZvbnRSZW5kZXJlcihnZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgbUZvcmVncm91bmQsIG1CYWNrZ3JvdW5kKTsKLSAgICAgICAgfQotICAgICAgICBtQmFja2dyb3VuZFBhaW50LnNldENvbG9yKG1CYWNrZ3JvdW5kKTsKLSAgICAgICAgbUNoYXJhY3RlcldpZHRoID0gbVRleHRSZW5kZXJlci5nZXRDaGFyYWN0ZXJXaWR0aCgpOwotICAgICAgICBtQ2hhcmFjdGVySGVpZ2h0ID0gbVRleHRSZW5kZXJlci5nZXRDaGFyYWN0ZXJIZWlnaHQoKTsKLQotICAgICAgICBpZiAobUtub3duU2l6ZSkgewotICAgICAgICAgICAgdXBkYXRlU2l6ZShnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG9sZHcsIGludCBvbGRoKSB7Ci0gICAgICAgIHVwZGF0ZVNpemUodywgaCk7Ci0gICAgICAgIGlmICghbUtub3duU2l6ZSkgewotICAgICAgICAgICAgbUtub3duU2l6ZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCBhIHRocmVhZCB0byByZWFkIGlucHV0IGZyb20gdGhlCi0gICAgICAgICAgICAvLyBwc2V1ZG8tdGVsZXR5cGU6Ci0KLSAgICAgICAgICAgIG1Qb2xsaW5nVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYWQgPSBtVGVybUluLnJlYWQobUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVRdWV1ZS53cml0ZShtQnVmZmVyLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoVVBEQVRFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaXZhdGUgYnl0ZVtdIG1CdWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbVBvbGxpbmdUaHJlYWQuc2V0TmFtZSgiSW5wdXQgcmVhZGVyIik7Ci0gICAgICAgICAgICBtUG9sbGluZ1RocmVhZC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNpemUoaW50IHcsIGludCBoKSB7Ci0gICAgICAgIG1Db2x1bW5zID0gdyAvIG1DaGFyYWN0ZXJXaWR0aDsKLSAgICAgICAgbVJvd3MgPSBoIC8gbUNoYXJhY3RlckhlaWdodDsKLQotICAgICAgICAvLyBJbmZvcm0gdGhlIGF0dGFjaGVkIHB0eSBvZiBvdXIgbmV3IHNpemU6Ci0gICAgICAgIEV4ZWMuc2V0UHR5V2luZG93U2l6ZShtVGVybUZkLCBtUm93cywgbUNvbHVtbnMsIHcsIGgpOwotCi0KLSAgICAgICAgaWYgKG1UcmFuc2NyaXB0U2NyZWVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FbXVsYXRvci51cGRhdGVTaXplKG1Db2x1bW5zLCBtUm93cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVHJhbnNjcmlwdFNjcmVlbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2NyaXB0U2NyZWVuKG1Db2x1bW5zLCBUUkFOU0NSSVBUX1JPV1MsIG1Sb3dzLCAwLCA3KTsKLSAgICAgICAgICAgIG1FbXVsYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXJtaW5hbEVtdWxhdG9yKG1UcmFuc2NyaXB0U2NyZWVuLCBtQ29sdW1ucywgbVJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlcm1PdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3VyIHBhZ2luZzoKLSAgICAgICAgbVRvcFJvdyA9IDA7Ci0gICAgICAgIG1MZWZ0Q29sdW1uID0gMDsKLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVTaXplKCkgewotICAgICAgICBpZiAobUtub3duU2l6ZSkgewotICAgICAgICAgICAgdXBkYXRlU2l6ZShnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciBuZXcgaW5wdXQgZnJvbSB0aGUgcHR0eSwgc2VuZCBpdCB0byB0aGUgdGVybWluYWwgZW11bGF0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgaW50IGJ5dGVzQXZhaWxhYmxlID0gbUJ5dGVRdWV1ZS5nZXRCeXRlc0F2YWlsYWJsZSgpOwotICAgICAgICBpbnQgYnl0ZXNUb1JlYWQgPSBNYXRoLm1pbihieXRlc0F2YWlsYWJsZSwgbVJlY2VpdmVCdWZmZXIubGVuZ3RoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBtQnl0ZVF1ZXVlLnJlYWQobVJlY2VpdmVCdWZmZXIsIDAsIGJ5dGVzVG9SZWFkKTsKLSAgICAgICAgICAgIGFwcGVuZChtUmVjZWl2ZUJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgaW50IHcgPSBnZXRXaWR0aCgpOwotICAgICAgICBpbnQgaCA9IGdldEhlaWdodCgpOwotICAgICAgICBjYW52YXMuZHJhd1JlY3QoMCwgMCwgdywgaCwgbUJhY2tncm91bmRQYWludCk7Ci0gICAgICAgIG1WaXNpYmxlQ29sdW1ucyA9IHcgLyBtQ2hhcmFjdGVyV2lkdGg7Ci0gICAgICAgIGZsb2F0IHggPSAtbUxlZnRDb2x1bW4gKiBtQ2hhcmFjdGVyV2lkdGg7Ci0gICAgICAgIGZsb2F0IHkgPSBtQ2hhcmFjdGVySGVpZ2h0OwotICAgICAgICBpbnQgZW5kTGluZSA9IG1Ub3BSb3cgKyBtUm93czsKLSAgICAgICAgaW50IGN4ID0gbUVtdWxhdG9yLmdldEN1cnNvckNvbCgpOwotICAgICAgICBpbnQgY3kgPSBtRW11bGF0b3IuZ2V0Q3Vyc29yUm93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBtVG9wUm93OyBpIDwgZW5kTGluZTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgY3Vyc29yWCA9IC0xOwotICAgICAgICAgICAgaWYgKGkgPT0gY3kpIHsKLSAgICAgICAgICAgICAgICBjdXJzb3JYID0gY3g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVHJhbnNjcmlwdFNjcmVlbi5kcmF3VGV4dChpLCBjYW52YXMsIHgsIHksIG1UZXh0UmVuZGVyZXIsIGN1cnNvclgpOwotICAgICAgICAgICAgeSArPSBtQ2hhcmFjdGVySGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUN1cnNvclZpc2libGUoKSB7Ci0gICAgICAgIG1Ub3BSb3cgPSAwOwotICAgICAgICBpZiAobVZpc2libGVDb2x1bW5zID4gMCkgewotICAgICAgICAgICAgaW50IGN4ID0gbUVtdWxhdG9yLmdldEN1cnNvckNvbCgpOwotICAgICAgICAgICAgaW50IHZpc2libGVDdXJzb3JYID0gbUVtdWxhdG9yLmdldEN1cnNvckNvbCgpIC0gbUxlZnRDb2x1bW47Ci0gICAgICAgICAgICBpZiAodmlzaWJsZUN1cnNvclggPCAwKSB7Ci0gICAgICAgICAgICAgICAgbUxlZnRDb2x1bW4gPSBjeDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlzaWJsZUN1cnNvclggPj0gbVZpc2libGVDb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgbUxlZnRDb2x1bW4gPSAoY3ggLSBtVmlzaWJsZUNvbHVtbnMpICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKioKLSAqIEFuIEFTQ0lJIGtleSBsaXN0ZW5lci4gU3VwcG9ydHMgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBlc2NhcGUuIEtlZXBzIHRyYWNrIG9mCi0gKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYWx0LCBzaGlmdCwgYW5kIGNvbnRyb2wga2V5cy4KLSAqLwotY2xhc3MgVGVybUtleUxpc3RlbmVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGUgZW5naW5lIGZvciBhIG1vZGlmaWVyIGtleS4gQ2FuIGJlIHByZXNzZWQsIHJlbGVhc2VkLCBsb2NrZWQsCi0gICAgICogYW5kIHNvIG9uLgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBNb2RpZmllcktleSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBSRVNTRUQgPSAwOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVTU0VEID0gMTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRUQgPSAyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVU0VEID0gMzsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS0VEID0gNDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGEgbW9kaWZpZXIga2V5LiBVTlBSRVNTRUQgYnkgZGVmYXVsdC4KLSAgICAgICAgICoKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNb2RpZmllcktleSgpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFVOUFJFU1NFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlc3MoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQUkVTU0VEOgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXQgYmVmb3JlIHVzZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSRUxFQVNFRDoKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBMT0NLRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFVTRUQ6Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcGVhdCBhZnRlciB1c2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTE9DS0VEOgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFVOUFJFU1NFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gUFJFU1NFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFVTRUQ6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVU5QUkVTU0VEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQUkVTU0VEOgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFJFTEVBU0VEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBMZWF2ZSBzdGF0ZSBhbG9uZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRqdXN0QWZ0ZXJLZXlwcmVzcygpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFBSRVNTRUQ6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVVNFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVMRUFTRUQ6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVU5QUkVTU0VEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBMZWF2ZSBzdGF0ZSBhbG9uZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0YXRlICE9IFVOUFJFU1NFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTW9kaWZpZXJLZXkgbUFsdEtleSA9IG5ldyBNb2RpZmllcktleSgpOwotCi0gICAgcHJpdmF0ZSBNb2RpZmllcktleSBtQ2FwS2V5ID0gbmV3IE1vZGlmaWVyS2V5KCk7Ci0KLSAgICBwcml2YXRlIE1vZGlmaWVyS2V5IG1Db250cm9sS2V5ID0gbmV3IE1vZGlmaWVyS2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSB0ZXJtIGtleSBsaXN0ZW5lci4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBUZXJtS2V5TGlzdGVuZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlQ29udHJvbEtleShib29sZWFuIGRvd24pIHsKLSAgICAgICAgaWYgKGRvd24pIHsKLSAgICAgICAgICAgIG1Db250cm9sS2V5Lm9uUHJlc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Db250cm9sS2V5Lm9uUmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtYXBDb250cm9sQ2hhcihpbnQgY2gpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IGNoOwotICAgICAgICBpZiAobUNvbnRyb2xLZXkuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgLy8gU2VhcmNoIGlzIHRoZSBjb250cm9sIGtleS4KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gJ2EnICYmIHJlc3VsdCA8PSAneicpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoY2hhcikgKHJlc3VsdCAtICdhJyArICdcMDAxJyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAnICcpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzdWx0ID09ICdbJykgfHwgKHJlc3VsdCA9PSAnMScpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMjc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChyZXN1bHQgPT0gJ1xcJykgfHwgKHJlc3VsdCA9PSAnLicpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMjg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChyZXN1bHQgPT0gJ10nKSB8fCAocmVzdWx0ID09ICcwJykpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAyOTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJlc3VsdCA9PSAnXicpIHx8IChyZXN1bHQgPT0gJzYnKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDMwOyAvLyBjb250cm9sLV4KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJlc3VsdCA9PSAnXycpIHx8IChyZXN1bHQgPT0gJzUnKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA+IC0xKSB7Ci0gICAgICAgICAgICBtQWx0S2V5LmFkanVzdEFmdGVyS2V5cHJlc3MoKTsKLSAgICAgICAgICAgIG1DYXBLZXkuYWRqdXN0QWZ0ZXJLZXlwcmVzcygpOwotICAgICAgICAgICAgbUNvbnRyb2xLZXkuYWRqdXN0QWZ0ZXJLZXlwcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIGEga2V5RG93biBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlDb2RlIHRoZSBrZXljb2RlIG9mIHRoZSBrZXlEb3duIGV2ZW50Ci0gICAgICogQHJldHVybiB0aGUgQVNDSUkgYnl0ZSB0byB0cmFuc21pdCB0byB0aGUgcHNldWRvLXRlbGV0eXBlLCBvciAtMSBpZiB0aGlzCi0gICAgICogICAgICAgICBldmVudCBkb2VzIG5vdCBwcm9kdWNlIGFuIEFTQ0lJIGJ5dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBrZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQUxUX1JJR0hUOgotICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQUxUX0xFRlQ6Ci0gICAgICAgICAgICBtQWx0S2V5Lm9uUHJlc3MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9MRUZUOgotICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQ6Ci0gICAgICAgICAgICBtQ2FwS2V5Lm9uUHJlc3MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKLSAgICAgICAgICAgIC8vIENvbnZlcnQgbmV3bGluZXMgaW50byByZXR1cm5zLiBUaGUgdnQxMDAgc2VuZHMgYQotICAgICAgICAgICAgLy8gJ1xyJyB3aGVuIHRoZSAnUmV0dXJuJyBrZXkgaXMgcHJlc3NlZCwgYnV0IG91cgotICAgICAgICAgICAgLy8gS2V5RXZlbnQgdHJhbnNsYXRlcyB0aGlzIGFzIGEgJ1xuJy4KLSAgICAgICAgICAgIHJlc3VsdCA9ICdccic7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfREVMOgotICAgICAgICAgICAgLy8gQ29udmVydCBERUwgaW50byAxMjcgKGluc3RlYWQgb2YgOCkKLSAgICAgICAgICAgIHJlc3VsdCA9IDEyNzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGV2ZW50LmdldFVuaWNvZGVDaGFyKAotICAgICAgICAgICAgICAgICAgIChtQ2FwS2V5LmlzQWN0aXZlKCkgPyBLZXlFdmVudC5NRVRBX1NISUZUX09OIDogMCkgfAotICAgICAgICAgICAgICAgICAgIChtQWx0S2V5LmlzQWN0aXZlKCkgPyBLZXlFdmVudC5NRVRBX0FMVF9PTiA6IDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gbWFwQ29udHJvbENoYXIocmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBhIGtleVVwIGV2ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleUNvZGUgb2YgdGhlIGtleVVwIGV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQga2V5VXAoaW50IGtleUNvZGUpIHsKLSAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9BTFRfTEVGVDoKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0FMVF9SSUdIVDoKLSAgICAgICAgICAgIG1BbHRLZXkub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQ6Ci0gICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVDoKLSAgICAgICAgICAgIG1DYXBLZXkub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIElnbm9yZSBvdGhlciBrZXlVcHMKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm1QcmVmZXJlbmNlcy5qYXZhIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm1QcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTAyOTYzLi4wMDAwMDAwCi0tLSBhL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlcm07Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5OwotCi1wdWJsaWMgY2xhc3MgVGVybVByZWZlcmVuY2VzIGV4dGVuZHMgUHJlZmVyZW5jZUFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICAvLyBMb2FkIHRoZSBwcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCByZXNvdXJjZQotICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5wcmVmZXJlbmNlcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9hcHBzL1dpZGdldFByZXZpZXcvQW5kcm9pZC5tayBiL2FwcHMvV2lkZ2V0UHJldmlldy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTQ5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL1dpZGdldFByZXZpZXcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gV2lkZ2V0UHJldmlldworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2FwcHMvV2lkZ2V0UHJldmlldy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvYXBwcy9XaWRnZXRQcmV2aWV3L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MGUwYwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvV2lkZ2V0UHJldmlldy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQud2lkZ2V0cHJldmlldyI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfQVBQV0lER0VUIiAvPgorICAgICAgICAKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxMSIvPgorICAgIAorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcGxpY2F0aW9uX2xhYmVsIj4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IldpZGdldFByZXZpZXdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcGxpY2F0aW9uX2xhYmVsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX3dpZGdldF9wcmV2aWV3Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9hcHBzL1dpZGdldFByZXZpZXcvcmVzL2RyYXdhYmxlLWhkcGkvaWNfd2lkZ2V0X3ByZXZpZXcucG5nIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3dpZGdldF9wcmV2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhjZGRhCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3dpZGdldF9wcmV2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL1dpZGdldFByZXZpZXcvcmVzL2RyYXdhYmxlLW1kcGkvaWNfd2lkZ2V0X3ByZXZpZXcucG5nIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3dpZGdldF9wcmV2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWM3NjYxCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3dpZGdldF9wcmV2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcHBzL1dpZGdldFByZXZpZXcvcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbCBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvbGF5b3V0L2FjdGl2aXR5X21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2QyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL1dpZGdldFByZXZpZXcvcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyMGRwIj4KKyAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtYWlsX2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtYWlsX2J1dHRvbiIgLz4KKyAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NuYXBzaG90X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvZW1haWxfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NuYXBzaG90X2J1dHRvbiIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBpZC9zbmFwc2hvdF9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIj4KKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX2ZyYW1lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvRnJhbWVMYXlvdXQ+Cis8L1JlbGF0aXZlTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbCBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWEyNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9IndvcmtzcGFjZV9jZWxsX3dpZHRoIj4xMDZkaXA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJ3b3Jrc3BhY2VfY2VsbF9oZWlnaHQiPjc0ZGlwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0id29ya3NwYWNlX3dpZHRoX2dhcCI+MGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0id29ya3NwYWNlX2hlaWdodF9nYXAiPjBkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLXBvcnQvZGltZW5zLnhtbCBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLXBvcnQvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc2ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMtcG9ydC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9IndvcmtzcGFjZV9jZWxsX3dpZHRoIj44MGRpcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9IndvcmtzcGFjZV9jZWxsX2hlaWdodCI+MTAwZGlwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0id29ya3NwYWNlX3dpZHRoX2dhcCI+MGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0id29ya3NwYWNlX2hlaWdodF9nYXAiPjBkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNWRmZQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9IndvcmtzcGFjZV9jZWxsX3dpZHRoIj45NmRpcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9IndvcmtzcGFjZV9jZWxsX2hlaWdodCI+OTZkaXA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJ3b3Jrc3BhY2Vfd2lkdGhfZ2FwIj4wZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJ3b3Jrc3BhY2VfaGVpZ2h0X2dhcCI+MGRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliOGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvV2lkZ2V0UHJldmlldy9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0icHJldmlld19jZWxsX3NpemUiPjk2ZGlwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9hcHBzL1dpZGdldFByZXZpZXcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M5Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcGxpY2F0aW9uX2xhYmVsIj5XaWRnZXQgUHJldmlldzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2aW5nX3ByZXZpZXciPlNhdmluZyB3aWRnZXQgcHJldmlldy4uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJldmlld19zYXZlZCI+V2lkZ2V0IHByZXZpZXcgc2F2ZWQhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19wcmV2aWV3Ij5QbGVhc2UgdGFrZSBhIHNuYXBzaG90IGZpcnN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcmV2aWV3X3NhdmVfZXJyb3IiPkVycm9yIHNhdmluZyBwcmV2aWV3PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWd1cmVfZXJyb3IiPkVycm9yIGNvbmZpZ3VyaW5nLCBubyBjb25maWd1cmF0aW9uIGFjdGl2aXR5IGZvdW5kPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWFpbF9zdWJqZWN0Ij5XaWRnZXQgcHJldmlldzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW1haWxfYm9keSI+QXR0YWNoZWQgaXMgdGhlIHByZXZpZXcgb2YgeW91ciBBcHBXaWRnZXQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic25hcHNob3RfYnV0dG9uIj5UYWtlIFNuYXBzaG90PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbWFpbF9idXR0b24iPkVtYWlsIFByZXZpZXc8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9XaWRnZXRQcmV2aWV3L3NyYy9jb20vYW5kcm9pZC93aWRnZXRwcmV2aWV3L1dpZGdldFByZXZpZXdBY3Rpdml0eS5qYXZhIGIvYXBwcy9XaWRnZXRQcmV2aWV3L3NyYy9jb20vYW5kcm9pZC93aWRnZXRwcmV2aWV3L1dpZGdldFByZXZpZXdBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjZiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL1dpZGdldFByZXZpZXcvc3JjL2NvbS9hbmRyb2lkL3dpZGdldHByZXZpZXcvV2lkZ2V0UHJldmlld0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldHByZXZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRIb3N0OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldEhvc3RWaWV3OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0UHJvdmlkZXJJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFdpZGdldFByZXZpZXdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIldpZGdldFByZXZpZXdBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUFdJREdFVF9IT1NUX0lEID0gMjA0ODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9XSURHRVQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPTkZJR1VSRSA9IDE7CisKKyAgICBwcml2YXRlIEFwcFdpZGdldEhvc3QgbUFwcFdpZGdldEhvc3QgPSBudWxsOworICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUFwcFdpZGdldEZyYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIEFwcFdpZGdldEhvc3RWaWV3IG1BcHBXaWRnZXRWaWV3ID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBtQXBwV2lkZ2V0SWQgPSBBcHBXaWRnZXRNYW5hZ2VyLklOVkFMSURfQVBQV0lER0VUX0lEOworICAgIHByaXZhdGUgU3RyaW5nIG1BcHBXaWRnZXROYW1lOworICAgIHByaXZhdGUgaW50IG1QcmV2aWV3V2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZpZXdIZWlnaHQ7CisKKyAgICBwcml2YXRlIEJ1dHRvbiBtU25hcHNob3RCdXR0b24gPSBudWxsOworICAgIHByaXZhdGUgQnV0dG9uIG1FbWFpbEJ1dHRvbiA9IG51bGw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjdGl2aXR5X21haW4pOworICAgICAgICBtQXBwV2lkZ2V0RnJhbWUgPSAoRnJhbWVMYXlvdXQpZmluZFZpZXdCeUlkKFIuaWQubWFpbl9mcmFtZSk7CisgICAgICAgIG1TbmFwc2hvdEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc25hcHNob3RfYnV0dG9uKTsKKyAgICAgICAgbVNuYXBzaG90QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUVtYWlsQnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5lbWFpbF9idXR0b24pOworICAgICAgICBtRW1haWxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworCisgICAgICAgIG1BcHBXaWRnZXRIb3N0ID0gbmV3IEFwcFdpZGdldEhvc3QoZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIEFQUFdJREdFVF9IT1NUX0lEKTsKKworICAgICAgICBmaW5hbCBPYmplY3QgcmV0YWluZWRPYmogPSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgIGlmIChyZXRhaW5lZE9iaiBpbnN0YW5jZW9mIEFwcFdpZGdldFByb3ZpZGVySW5mbykgeworICAgICAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gPSAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKSByZXRhaW5lZE9iajsKKyAgICAgICAgICAgIGludCBpZCA9IG1BcHBXaWRnZXRIb3N0LmFsbG9jYXRlQXBwV2lkZ2V0SWQoKTsKKyAgICAgICAgICAgIEFwcFdpZGdldE1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0QmFzZUNvbnRleHQoKSkuYmluZEFwcFdpZGdldElkKGlkLCBpbmZvLnByb3ZpZGVyKTsKKyAgICAgICAgICAgIHNldEFwcFdpZGdldChpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydENob29zZUFjdGl2aXR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIG1BcHBXaWRnZXRIb3N0LnN0YXJ0TGlzdGVuaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKKyAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gPSBBcHBXaWRnZXRNYW5hZ2VyLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgIGdldEJhc2VDb250ZXh0KCkpLmdldEFwcFdpZGdldEluZm8obUFwcFdpZGdldElkKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q2hvb3NlQWN0aXZpdHkoKSB7CisgICAgICAgIGludCBpZCA9IG1BcHBXaWRnZXRIb3N0LmFsbG9jYXRlQXBwV2lkZ2V0SWQoKTsKKyAgICAgICAgSW50ZW50IHNlbGVjdEludGVudCA9IG5ldyBJbnRlbnQoQXBwV2lkZ2V0TWFuYWdlci5BQ1RJT05fQVBQV0lER0VUX1BJQ0spOworICAgICAgICBzZWxlY3RJbnRlbnQucHV0RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsIGlkKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChzZWxlY3RJbnRlbnQsIFJFUVVFU1RfV0lER0VUKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIGlmIChyZXF1ZXN0Q29kZSA9PSBSRVFVRVNUX1dJREdFVCkgeworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBhcHBXaWRnZXRJZCA9IEFwcFdpZGdldE1hbmFnZXIuSU5WQUxJRF9BUFBXSURHRVRfSUQ7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzRXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcFdpZGdldElkID0gZGF0YS5nZXRFeHRyYXMoKS5nZXRJbnQoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IFJFU1VMVF9PSykgeworICAgICAgICAgICAgICAgICAgICBzZXRBcHBXaWRnZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BcHBXaWRnZXRIb3N0LmRlbGV0ZUFwcFdpZGdldElkKGFwcFdpZGdldElkKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Q29kZSA9PSBSRVFVRVNUX0NPTkZJR1VSRSkgeworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBhcHBXaWRnZXRJZCA9IGRhdGEuZ2V0RXh0cmFzKCkuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsIEFwcFdpZGdldE1hbmFnZXIuSU5WQUxJRF9BUFBXSURHRVRfSUQpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IFJFU1VMVF9PSykgeworICAgICAgICAgICAgICAgICAgICBmaW5pc2hTZXRBcHBXaWRnZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BcHBXaWRnZXRIb3N0LmRlbGV0ZUFwcFdpZGdldElkKGFwcFdpZGdldElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCkgeworICAgICAgICBpZiAobUFwcFdpZGdldElkICE9IEFwcFdpZGdldE1hbmFnZXIuSU5WQUxJRF9BUFBXSURHRVRfSUQpIHsKKyAgICAgICAgICAgIG1BcHBXaWRnZXRIb3N0LmRlbGV0ZUFwcFdpZGdldElkKG1BcHBXaWRnZXRJZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBmb3IgY29uZmlndXJhdGlvbiAqLworICAgICAgICBBcHBXaWRnZXRQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvID0KKyAgICAgICAgICAgIEFwcFdpZGdldE1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0QmFzZUNvbnRleHQoKSkuZ2V0QXBwV2lkZ2V0SW5mbyhhcHBXaWRnZXRJZCk7CisKKyAgICAgICAgaWYgKHByb3ZpZGVySW5mby5jb25maWd1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZW50IGNvbmZpZ3VyZUludGVudCA9IG5ldyBJbnRlbnQoQXBwV2lkZ2V0TWFuYWdlci5BQ1RJT05fQVBQV0lER0VUX0NPTkZJR1VSRSk7CisgICAgICAgICAgICBjb25maWd1cmVJbnRlbnQuc2V0Q29tcG9uZW50KHByb3ZpZGVySW5mby5jb25maWd1cmUpOworICAgICAgICAgICAgY29uZmlndXJlSW50ZW50LnB1dEV4dHJhKEFwcFdpZGdldE1hbmFnZXIuRVhUUkFfQVBQV0lER0VUX0lELCBhcHBXaWRnZXRJZCk7CisKKyAgICAgICAgICAgIGlmIChjb25maWd1cmVJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoY29uZmlndXJlSW50ZW50LCBSRVFVRVNUX0NPTkZJR1VSRSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJDb25maWd1cmF0aW9uIGFjdGl2aXR5IG5vdCBmb3VuZDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICBUb2FzdCBlcnJvclRvYXN0ID0gVG9hc3QubWFrZVRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFzZUNvbnRleHQoKSwgUi5zdHJpbmcuY29uZmlndXJlX2Vycm9yLCBUb2FzdC5MRU5HVEhfU0hPUlQpOworICAgICAgICAgICAgICAgICAgICBlcnJvclRvYXN0LnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5pc2hTZXRBcHBXaWRnZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaFNldEFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQpIHsKKyAgICAgICAgQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIHByb3ZpZGVySW5mbyA9CisgICAgICAgICAgICBBcHBXaWRnZXRNYW5hZ2VyLmdldEluc3RhbmNlKGdldEJhc2VDb250ZXh0KCkpLmdldEFwcFdpZGdldEluZm8oYXBwV2lkZ2V0SWQpOworICAgICAgICBpZiAocHJvdmlkZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BcHBXaWRnZXRWaWV3ID0KKyAgICAgICAgICAgICAgICAgICAgbUFwcFdpZGdldEhvc3QuY3JlYXRlVmlldyhnZXRCYXNlQ29udGV4dCgpLCBhcHBXaWRnZXRJZCwgcHJvdmlkZXJJbmZvKTsKKworICAgICAgICAgICAgaW50IFtdIGRpbWVuc2lvbnMgPQorICAgICAgICAgICAgICAgICAgICBnZXRMYXVuY2hlckNlbGxEaW1lbnNpb25zKHByb3ZpZGVySW5mby5taW5XaWR0aCwgcHJvdmlkZXJJbmZvLm1pbkhlaWdodCk7CisKKyAgICAgICAgICAgIG1QcmV2aWV3V2lkdGggPSBkaW1lbnNpb25zWzBdOworICAgICAgICAgICAgbVByZXZpZXdIZWlnaHQgPSBkaW1lbnNpb25zWzFdOworCisgICAgICAgICAgICBtQXBwV2lkZ2V0TmFtZSA9CisgICAgICAgICAgICAgICAgQXBwV2lkZ2V0TWFuYWdlci5nZXRJbnN0YW5jZShnZXRCYXNlQ29udGV4dCgpKS5nZXRBcHBXaWRnZXRJbmZvKGFwcFdpZGdldElkKS5sYWJlbDsKKyAgICAgICAgICAgIG1BcHBXaWRnZXROYW1lID0gbUFwcFdpZGdldE5hbWUucmVwbGFjZUFsbCgiW15hLXpBLVowLTldIiwgIl8iKTsKKworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwID0gbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICBtQXBwV2lkZ2V0Vmlldy5zZXRMYXlvdXRQYXJhbXMocCk7CisgICAgICAgICAgICBtQXBwV2lkZ2V0RnJhbWUucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIG1BcHBXaWRnZXRIb3N0LmRlbGV0ZUFwcFdpZGdldElkKG1BcHBXaWRnZXRJZCk7CisgICAgICAgICAgICBtQXBwV2lkZ2V0RnJhbWUuYWRkVmlldyhtQXBwV2lkZ2V0VmlldywgbVByZXZpZXdXaWR0aCwgbVByZXZpZXdIZWlnaHQpOworICAgICAgICAgICAgbUFwcFdpZGdldElkID0gYXBwV2lkZ2V0SWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUYWtlbiBmcm9tIENlbGxMYXlvdXQuamF2YQorICAgIHB1YmxpYyBpbnRbXSBnZXRMYXVuY2hlckNlbGxEaW1lbnNpb25zKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAvLyBBbHdheXMgYXNzdW1lIHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgc21hbGxlc3Qgc3BhbiB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgLy8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UgaW4gYm90aCBvcmllbnRhdGlvbnMuCisgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgaW50IGNlbGxXaWR0aCA9IHJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi53b3Jrc3BhY2VfY2VsbF93aWR0aCk7CisgICAgICAgIGludCBjZWxsSGVpZ2h0ID0gcmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLndvcmtzcGFjZV9jZWxsX2hlaWdodCk7CisgICAgICAgIGludCB3aWR0aEdhcCA9IHJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi53b3Jrc3BhY2Vfd2lkdGhfZ2FwKTsKKyAgICAgICAgaW50IGhlaWdodEdhcCA9IHJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi53b3Jrc3BhY2VfaGVpZ2h0X2dhcCk7CisgICAgICAgIGludCBwcmV2aWV3Q2VsbFNpemUgPSByZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ucHJldmlld19jZWxsX3NpemUpOworCisgICAgICAgIC8vIFRoaXMgbG9naWMgaW1pdGF0ZXMgTGF1bmNoZXIncyBDZWxsTGF5b3V0LnJlY3RUb0NlbGwuCisgICAgICAgIC8vIEFsd2F5cyByb3VuZCB1cCB0byBuZXh0IGxhcmdlc3QgY2VsbAorICAgICAgICBpbnQgc21hbGxlclNpemUgPSBNYXRoLm1pbihjZWxsV2lkdGgsIGNlbGxIZWlnaHQpOworICAgICAgICBpbnQgc3BhblggPSAod2lkdGggKyBzbWFsbGVyU2l6ZSkgLyBzbWFsbGVyU2l6ZTsKKyAgICAgICAgaW50IHNwYW5ZID0gKGhlaWdodCArIHNtYWxsZXJTaXplKSAvIHNtYWxsZXJTaXplOworCisgICAgICAgIC8vIFdlIHVzZSBhIGZpeGVkIHByZXZpZXcgY2VsbCBzaXplIHNvIHRoYXQgeW91IGdldCB0aGUgc2FtZSBwcmV2aWV3IGltYWdlIGZvcgorICAgICAgICAvLyB0aGUgc2FtZSBjZWxsLXNpemVkIHdpZGdldHMgYWNyb3NzIGFsbCBkZXZpY2VzCisgICAgICAgIHdpZHRoID0gc3BhblggKiBwcmV2aWV3Q2VsbFNpemUgKyAoKHNwYW5YIC0gMSkgKiB3aWR0aEdhcCk7CisgICAgICAgIGhlaWdodCA9IHNwYW5ZICogcHJldmlld0NlbGxTaXplICsgKChzcGFuWSAtIDEpICogaGVpZ2h0R2FwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IHdpZHRoLCBoZWlnaHQgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgYnVpbGRGaWxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICghRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBwYXRoID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlUHVibGljRGlyZWN0b3J5KAorICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMpOworICAgICAgICBpbnQgb3JpZW50YXRpb25Db2RlID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLm9yaWVudGF0aW9uOworICAgICAgICBTdHJpbmcgb3JpZW50YXRpb247CisgICAgICAgIGlmIChnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gImxhbmRzY2FwZSI7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb25Db2RlID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fUE9SVFJBSVQpIHsKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gInBvcnRyYWl0IjsKKyAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbkNvZGUgPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9TUVVBUkUpIHsKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gInNxdWFyZSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmllbnRhdGlvbiA9ICJ1bmRlZmluZWQiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoLCBuYW1lICsgIl9vcmlfIiArIG9yaWVudGF0aW9uICsgIi5wbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0bWFwIGdldFByZXZpZXdCaXRtYXAoKSB7CisgICAgICAgIG1BcHBXaWRnZXRWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgQml0bWFwIGJtcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoCisgICAgICAgICAgICAgICAgbUFwcFdpZGdldFZpZXcuZ2V0V2lkdGgoKSwgbUFwcFdpZGdldFZpZXcuZ2V0SGVpZ2h0KCksIENvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICBDYW52YXMgYyA9IG5ldyBDYW52YXMoYm1wKTsKKyAgICAgICAgbUFwcFdpZGdldFZpZXcuZHJhdyhjKTsKKyAgICAgICAgcmV0dXJuIGJtcDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZUltYWdlKEJpdG1hcCBibXAsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIEZpbGUgcGljID0gYnVpbGRGaWxlKG1BcHBXaWRnZXROYW1lKTsKKyAgICAgICAgaWYgKHBpYyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRXh0ZXJuYWwgc3RvcmFnZSBub3QgcHJlc2VudCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcGljLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwaWMpOworICAgICAgICAgICAgaWYgKCFibXAuY29tcHJlc3MoQ29tcHJlc3NGb3JtYXQuUE5HLCAxMDAsIGZvdXQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkZhaWxlZCB0byBjb21wcmVzcyBpbWFnZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRXJyb3Igd3JpdGluZyB0byBkaXNrOiAiICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChmb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiQ291bGQgbm90IGNsb3NlIGZpbGU6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKKyAgICAgICAgaWYgKCFnZXRGcmFnbWVudE1hbmFnZXIoKS5wb3BCYWNrU3RhY2tJbW1lZGlhdGUoKSkgeworICAgICAgICAgICAgc3RhcnRDaG9vc2VBY3Rpdml0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgaWYgKHYgPT0gbVNuYXBzaG90QnV0dG9uKSB7CisgICAgICAgICAgICBpbnQgdGV4dElkID0gUi5zdHJpbmcuc2F2aW5nX3ByZXZpZXc7CisKKyAgICAgICAgICAgIFRvYXN0IHByZVRvYXN0ID0gVG9hc3QubWFrZVRleHQoZ2V0QmFzZUNvbnRleHQoKSwgdGV4dElkLCBUb2FzdC5MRU5HVEhfU0hPUlQpOworICAgICAgICAgICAgcHJlVG9hc3Quc2hvdygpOworCisgICAgICAgICAgICBCaXRtYXAgYm1wID0gZ2V0UHJldmlld0JpdG1hcCgpOworICAgICAgICAgICAgaWYgKHNhdmVJbWFnZShibXAsIG1BcHBXaWRnZXROYW1lKSkgeworICAgICAgICAgICAgICAgIHRleHRJZCA9IFIuc3RyaW5nLnByZXZpZXdfc2F2ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHRJZCA9IFIuc3RyaW5nLnByZXZpZXdfc2F2ZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVG9hc3QgcG9zdFRvYXN0ID0gVG9hc3QubWFrZVRleHQoZ2V0QmFzZUNvbnRleHQoKSwgdGV4dElkLCBUb2FzdC5MRU5HVEhfU0hPUlQpOworICAgICAgICAgICAgcG9zdFRvYXN0LnNob3coKTsKKyAgICAgICAgfSBlbHNlIGlmICh2ID09IG1FbWFpbEJ1dHRvbikgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gYnVpbGRGaWxlKG1BcHBXaWRnZXROYW1lKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgSW50ZW50IGVtYWlsSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1NFTkQpOworICAgICAgICAgICAgICAgIGVtYWlsSW50ZW50LnNldFR5cGUoImltYWdlL3BuZyIpOworICAgICAgICAgICAgICAgIGVtYWlsSW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9TVUJKRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmVtYWlsX3N1YmplY3QpKTsKKyAgICAgICAgICAgICAgICBlbWFpbEludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5lbWFpbF9ib2R5KSk7CisgICAgICAgICAgICAgICAgZW1haWxJbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX1NUUkVBTSwgVXJpLmZyb21GaWxlKGZpbGUpKTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGVtYWlsSW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVG9hc3QgcG9zdFRvYXN0ID0gVG9hc3QubWFrZVRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRCYXNlQ29udGV4dCgpLCBSLnN0cmluZy5ub19wcmV2aWV3LCBUb2FzdC5MRU5HVEhfU0hPUlQpOworICAgICAgICAgICAgICAgIHBvc3RUb2FzdC5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9idWlsZC9BbmRyb2lkLm1rIGIvYnVpbGQvQW5kcm9pZC5tawppbmRleCAyODY0ZWEzLi43ZTVkMTgwIDEwMDY0NAotLS0gYS9idWlsZC9BbmRyb2lkLm1rCisrKyBiL2J1aWxkL0FuZHJvaWQubWsKQEAgLTY0LDMgKzY0LDE0IEBACiAJJChoaWRlKSQoQUNQKSAkPCAkQAogCiBBTExfU0RLX0ZJTEVTICs9ICQoYW5kcm9pZF9qYXJfZnVsbF90YXJnZXQpCisKKworYW5kcm9pZC1zdXBwb3J0LXY0X2J1aWxkX21vZHVsZSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQtc3VwcG9ydC12NF9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyCithbmRyb2lkLXN1cHBvcnQtdjRfaW50ZXJtZWRpYXRlcyA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9hbmRyb2lkLXN1cHBvcnQtdjRfaW50ZXJtZWRpYXRlcworYW5kcm9pZC1zdXBwb3J0LXY0X2Z1bGxfdGFyZ2V0IDo9ICQoYW5kcm9pZC1zdXBwb3J0LXY0X2ludGVybWVkaWF0ZXMpL2FuZHJvaWQtc3VwcG9ydC12NC5qYXIKKyQoYW5kcm9pZC1zdXBwb3J0LXY0X2Z1bGxfdGFyZ2V0KTogJChhbmRyb2lkLXN1cHBvcnQtdjRfYnVpbGRfbW9kdWxlKQorCUBlY2hvIFBhY2thZ2UgYW5kcm9pZC1zdXBwb3J0LXY0LmphcjogJEAKKwkkKGhpZGUpbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSQoQUNQKSAkPCAkQAorCitBTExfU0RLX0ZJTEVTICs9ICQoYW5kcm9pZC1zdXBwb3J0LXY0X2Z1bGxfdGFyZ2V0KQpkaWZmIC0tZ2l0IGEvYnVpbGQvc2RrLmF0cmVlIGIvYnVpbGQvc2RrLmF0cmVlCmluZGV4IGE5ODhmMDYuLmE0ZjRkNzYgMTAwNjQ0Ci0tLSBhL2J1aWxkL3Nkay5hdHJlZQorKysgYi9idWlsZC9zZGsuYXRyZWUKQEAgLTEsNCArMSw0IEBACi0jCisgIwogIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTQxLDEyICs0MSwxMiBAQAogYmluL2FkYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRvb2xzL2FkYgogYmluL2FhcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRvb2xzL2FhcHQKIGJpbi9haWRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybS10b29scy9haWRsCitiaW4vbGx2bS1ycy1jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0tdG9vbHMvbGx2bS1ycy1jYwogIyBkeAogYmluL2R4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRvb2xzL2R4CiBiaW4vZGV4ZHVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0tdG9vbHMvZGV4ZHVtcAogZnJhbWV3b3JrL2R4LmphciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRvb2xzL2xpYi9keC5qYXIKIAotc2RrL2ZpbGVzL3Nka19maWxlc19OT1RJQ0UudHh0ICAgICAgICAgICAgICAgIHBsYXRmb3JtLXRvb2xzL05PVElDRS50eHQKIGRldmVsb3BtZW50L3Nkay9wbGF0X3Rvb2xzX3NvdXJjZS5wcm9wZXJ0aWVzICBwbGF0Zm9ybS10b29scy9zb3VyY2UucHJvcGVydGllcwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTU0LDEwICs1NCwxMCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgdmVyc2lvbiBmaWxlcyBmb3IgdGhlIFNESyB1cGRhdGVyLCBmcm9tIHNkay5naXQKLWRldmVsb3BtZW50L3Nkay9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcyBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9zb3VyY2UucHJvcGVydGllcworZGV2ZWxvcG1lbnQvc2RrL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NvdXJjZS5wcm9wZXJ0aWVzCiAKICMgY29weSBidWlsZCBwcm9wIGZyb20gb3V0Ly4uLi9zZGsvCi1zZGsvc2RrLWJ1aWxkLnByb3AgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vYnVpbGQucHJvcAorc2RrL3Nkay1idWlsZC5wcm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2J1aWxkLnByb3AKIAogIyB0aGUgdXBlci1qYXIgZmlsZSB0aGF0IGFwcHMgbGluayBhZ2FpbnN0LiBUaGlzIGlzIHRoZSBwdWJsaWMgQVBJCiAke09VVF9ESVJ9L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hbmRyb2lkX2phcl9pbnRlcm1lZGlhdGVzL2FuZHJvaWQuamFyIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2FuZHJvaWQuamFyCkBAIC02NSw2ICs2NSwxMSBAQAogIyB0aGUgYWlkbCBwcmVjb21waWxlZCBpbmNsdWRlCiBvYmovZnJhbWV3b3JrLmFpZGwgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vZnJhbWV3b3JrLmFpZGwKIAorIyBGcmFtZXdvcmsgaW5jbHVkZSBmb3IgUmVuZGVyc2NyaXB0CitmcmFtZXdvcmtzL2Jhc2UvbGlicy9ycy9zY3JpcHRjICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9yZW5kZXJzY3JpcHQvaW5jbHVkZQorZXh0ZXJuYWwvY2xhbmcvbGliL0hlYWRlcnMgICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUKK2V4dGVybmFsL2NsYW5nL0xJQ0VOU0UuVFhUICAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3JlbmRlcnNjcmlwdC9jbGFuZy1pbmNsdWRlL0xJQ0VOU0UuVFhUCisKICMgU3lzdGVtIGltYWdlcyArIEtlcm5lbAogc3lzdGVtLmltZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2ltYWdlcy8ke1RBUkdFVF9DUFVfQUJJfS9zeXN0ZW0uaW1nCiByYW1kaXNrLmltZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vaW1hZ2VzLyR7VEFSR0VUX0NQVV9BQkl9L3JhbWRpc2suaW1nCkBAIC03MiwxNSArNzcsMTYgQEAKIHByZWJ1aWx0L2FuZHJvaWQtJHtUQVJHRVRfQVJDSH0va2VybmVsL2tlcm5lbC1xZW11IHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L2ltYWdlcy8ke1RBUkdFVF9DUFVfQUJJfS9rZXJuZWwtcWVtdQogCiAjIGVtdWxhdG9yIHNraW5zIGZyb20gc2RrLmdpdAotZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3Ivc2tpbnMvUVZHQSAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1FWR0EKLWRldmVsb3BtZW50L3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dRVkdBNDMyICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9za2lucy9XUVZHQTQzMgotZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1FWR0E0MDAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dRVkdBNDAwCi1kZXZlbG9wbWVudC90b29scy9lbXVsYXRvci9za2lucy9IVkdBICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvSFZHQQotZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1ZHQTgwMCAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dWR0E4MDAKLWRldmVsb3BtZW50L3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dWR0E4NTQgICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9za2lucy9XVkdBODU0CisjZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3Ivc2tpbnMvUVZHQSAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1FWR0EKKyNkZXZlbG9wbWVudC90b29scy9lbXVsYXRvci9za2lucy9XUVZHQTQzMiAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1FWR0E0MzIKKyNkZXZlbG9wbWVudC90b29scy9lbXVsYXRvci9za2lucy9XUVZHQTQwMCAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1FWR0E0MDAKKyNkZXZlbG9wbWVudC90b29scy9lbXVsYXRvci9za2lucy9IVkdBICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvSFZHQQorI2RldmVsb3BtZW50L3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dWR0E4MDAgICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9za2lucy9XVkdBODAwCisjZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1ZHQTg1NCAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3NraW5zL1dWR0E4NTQKK2RldmVsb3BtZW50L3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EgICAgICAgcGxhdGZvcm1zLyR7UExBVEZPUk1fTkFNRX0vc2tpbnMvV1hHQQogCiAjIFBsYXRmb3JtIFNESyBwcm9wZXJ0aWVzCi1zZGsvZmlsZXMvc2RrLnByb3BlcnRpZXMgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3Nkay5wcm9wZXJ0aWVzCitkZXZlbG9wbWVudC9zZGsvc2RrLnByb3BlcnRpZXMgICAgICAgICAgICAgICBwbGF0Zm9ybXMvJHtQTEFURk9STV9OQU1FfS9zZGsucHJvcGVydGllcwogCiAjIHNkay5naXQgQW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBmaWxlcwogc2RrL3RlbXBsYXRlcy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUgICAgICAgIHBsYXRmb3Jtcy8ke1BMQVRGT1JNX05BTUV9L3RlbXBsYXRlcy9BbmRyb2lkTWFuaWZlc3QudGVtcGxhdGUKQEAgLTEzOCw0OCArMTQ0LDcwIEBACiAKICMgc2FtcGxlcyB0byBpbmNsdWRlIGluIHRoZSBzZGsgc2FtcGxlcyBwYWNrYWdlCiAjCi0jIHRoZSBsaXN0IGhlcmUgc2hvdWxkIG1hdGNoIHRoZSBsaXN0IG9mIHNhbXBsZXMgdGhhdCB3ZSBnZW5lcmF0ZSBkb2NzIGZvciwgCisjIHRoZSBsaXN0IGhlcmUgc2hvdWxkIG1hdGNoIHRoZSBsaXN0IG9mIHNhbXBsZXMgdGhhdCB3ZSBnZW5lcmF0ZSBkb2NzIGZvciwKICMgKHNlZSB3ZWJfZG9jc19zYW1wbGVfY29kZV9mbGFncyBpbiBmcmFtZXdvcmtzL2Jhc2UvQW5kcm9pZC5taykKIGRldmVsb3BtZW50L2FwcHMvR2VzdHVyZUJ1aWxkZXIgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9HZXN0dXJlQnVpbGRlcgogZGV2ZWxvcG1lbnQvc2FtcGxlcy9zb3VyY2UucHJvcGVydGllcyAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L3NvdXJjZS5wcm9wZXJ0aWVzCiAjCiAjIFBMRUFTRSBLRUVQIFRIRSBTQU1QTEVTIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4KICMKLWRldmVsb3BtZW50L3NhbXBsZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9BY2Nlc3NpYmlsaXR5U2VydmljZQotZGV2ZWxvcG1lbnQvc2FtcGxlcy9BY2NlbGVyb21ldGVyUGxheSAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0FjY2VsZXJvbWV0ZXJQbGF5Ci1kZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQXBpRGVtb3MKLWRldmVsb3BtZW50L3NhbXBsZXMvQmFja3VwUmVzdG9yZSAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9CYWNrdXBSZXN0b3JlCi1kZXZlbG9wbWVudC9zYW1wbGVzL0Jhc2ljR0xTdXJmYWNlVmlldyAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQmFzaWNHTFN1cmZhY2VWaWV3Ci1kZXZlbG9wbWVudC9zYW1wbGVzL0JsdWV0b290aENoYXQgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQmx1ZXRvb3RoQ2hhdAotZGV2ZWxvcG1lbnQvc2FtcGxlcy9Db250YWN0TWFuYWdlciAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0NvbnRhY3RNYW5hZ2VyCi1kZXZlbG9wbWVudC9zYW1wbGVzL0Nyb3NzQ29tcGF0aWJpbGl0eSAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQ3Jvc3NDb21wYXRpYmlsaXR5Ci1kZXZlbG9wbWVudC9zYW1wbGVzL0N1YmVMaXZlV2FsbHBhcGVyICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQ3ViZUxpdmVXYWxscGFwZXIKLWRldmVsb3BtZW50L3NhbXBsZXMvSG9tZSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9Ib21lCi1kZXZlbG9wbWVudC9zYW1wbGVzL0pldEJveSAgICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vSmV0Qm95Ci1kZXZlbG9wbWVudC9zYW1wbGVzL0x1bmFyTGFuZGVyICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTHVuYXJMYW5kZXIKLWRldmVsb3BtZW50L3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9NdWx0aVJlc29sdXRpb24KLWRldmVsb3BtZW50L3NhbXBsZXMvTkZDRGVtbyAgICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9ORkNEZW1vCi1kZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQgICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTm90ZVBhZAotZGV2ZWxvcG1lbnQvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlciAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1NhbXBsZVN5bmNBZGFwdGVyCi1kZXZlbG9wbWVudC9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5ICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU2VhcmNoYWJsZURpY3Rpb25hcnkKLWRldmVsb3BtZW50L3NhbXBsZXMvU2lwRGVtbyAgICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9TaXBEZW1vCi1kZXZlbG9wbWVudC9zYW1wbGVzL1NrZWxldG9uQXBwICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU2tlbGV0b25BcHAKLWRldmVsb3BtZW50L3NhbXBsZXMvU25ha2UgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9TbmFrZQotZGV2ZWxvcG1lbnQvc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1NvZnRLZXlib2FyZAotZGV2ZWxvcG1lbnQvc2FtcGxlcy9TcGlubmVyICAgICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1NwaW5uZXIKLWRldmVsb3BtZW50L3NhbXBsZXMvU3Bpbm5lclRlc3QgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9TcGlubmVyVGVzdAotZGV2ZWxvcG1lbnQvc2FtcGxlcy9UaWNUYWNUb2VMaWIgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1RpY1RhY1RvZUxpYgotZGV2ZWxvcG1lbnQvc2FtcGxlcy9UaWNUYWNUb2VNYWluICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1RpY1RhY1RvZU1haW4KLWRldmVsb3BtZW50L3NhbXBsZXMvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9Wb2ljZVJlY29nbml0aW9uU2VydmljZQotZGV2ZWxvcG1lbnQvc2FtcGxlcy9XaWt0aW9uYXJ5ICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1dpa3Rpb25hcnkKLWRldmVsb3BtZW50L3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9XaWt0aW9uYXJ5U2ltcGxlCitkZXZlbG9wbWVudC9zYW1wbGVzL0FjY2Vzc2liaWxpdHlTZXJ2aWNlICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9BY2Nlc3NpYmlsaXR5U2VydmljZQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9BY2NlbGVyb21ldGVyUGxheSAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQWNjZWxlcm9tZXRlclBsYXkKK2RldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MgICAgICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0FwaURlbW9zCiske09VVF9ESVJ9L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hbmRyb2lkLXN1cHBvcnQtdjRfaW50ZXJtZWRpYXRlcy9hbmRyb2lkLXN1cHBvcnQtdjQuamFyICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9BcGlEZW1vcy9saWJzL2FuZHJvaWQtc3VwcG9ydC12NC5qYXIKK2RldmVsb3BtZW50L3NhbXBsZXMvQmFja3VwUmVzdG9yZSAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0JhY2t1cFJlc3RvcmUKK2RldmVsb3BtZW50L3NhbXBsZXMvQmFzaWNHTFN1cmZhY2VWaWV3ICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0Jhc2ljR0xTdXJmYWNlVmlldworZGV2ZWxvcG1lbnQvc2FtcGxlcy9CbHVldG9vdGhDaGF0ICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQmx1ZXRvb3RoQ2hhdAorZGV2ZWxvcG1lbnQvc2FtcGxlcy9Db250YWN0TWFuYWdlciAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQ29udGFjdE1hbmFnZXIKK2RldmVsb3BtZW50L3NhbXBsZXMvQ3Jvc3NDb21wYXRpYmlsaXR5ICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0Nyb3NzQ29tcGF0aWJpbGl0eQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlciAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vQ3ViZUxpdmVXYWxscGFwZXIKK2RldmVsb3BtZW50L3NhbXBsZXMvSG9tZSAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0hvbWUKK2RldmVsb3BtZW50L3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeSAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0hvbmV5Y29tYkdhbGxlcnkKK2RldmVsb3BtZW50L3NhbXBsZXMvSmV0Qm95ICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L0pldEJveQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9MdW5hckxhbmRlciAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTHVuYXJMYW5kZXIKK2RldmVsb3BtZW50L3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L011bHRpUmVzb2x1dGlvbgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9Ob3RlUGFkICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTm90ZVBhZAorZGV2ZWxvcG1lbnQvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlciAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU2FtcGxlU3luY0FkYXB0ZXIKK2RldmVsb3BtZW50L3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1NlYXJjaGFibGVEaWN0aW9uYXJ5CitkZXZlbG9wbWVudC9zYW1wbGVzL1NpcERlbW8gICAgICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9TaXBEZW1vCitkZXZlbG9wbWVudC9zYW1wbGVzL1NrZWxldG9uQXBwICAgICAgICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9Ta2VsZXRvbkFwcAorZGV2ZWxvcG1lbnQvc2FtcGxlcy9TbmFrZSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU25ha2UKK2RldmVsb3BtZW50L3NhbXBsZXMvU29mdEtleWJvYXJkICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1NvZnRLZXlib2FyZAorZGV2ZWxvcG1lbnQvc2FtcGxlcy9TcGlubmVyICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU3Bpbm5lcgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9TcGlubmVyVGVzdCAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vU3Bpbm5lclRlc3QKK2RldmVsb3BtZW50L3NhbXBsZXMvVGljVGFjVG9lTGliICAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1RpY1RhY1RvZUxpYgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9UaWNUYWNUb2VNYWluICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVGljVGFjVG9lTWFpbgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVVNCL01pc3NpbGVMYXVuY2hlcgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9VU0IvQWRiVGVzdCAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVVNCL0FkYlRlc3QKK2RldmVsb3BtZW50L3NhbXBsZXMvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlCitkZXZlbG9wbWVudC9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0ICAgICAgICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9XZWF0aGVyTGlzdFdpZGdldAorZGV2ZWxvcG1lbnQvYXBwcy9XaWRnZXRQcmV2aWV3ICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vV2lkZ2V0UHJldmlldworZGV2ZWxvcG1lbnQvc2FtcGxlcy9XaWt0aW9uYXJ5ICAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vV2lrdGlvbmFyeQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vV2lrdGlvbmFyeVNpbXBsZQorZGV2ZWxvcG1lbnQvc2FtcGxlcy9YbWxBZGFwdGVycyAgICAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vWG1sQWRhcHRlcnMKK2RldmVsb3BtZW50L3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1JlbmRlclNjcmlwdC9CYWxscworZGV2ZWxvcG1lbnQvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4gICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vUmVuZGVyU2NyaXB0L0ZvdW50YWluCitkZXZlbG9wbWVudC9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlCitkZXZlbG9wbWVudC9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkICAgIHNhbXBsZXMvJHtQTEFURk9STV9OQU1FfS9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZAorZGV2ZWxvcG1lbnQvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzCiAKICMgTk9USUNFIGZpbGVzIGFyZSBjb3BpZWQgYnkgYnVpbGQvY29yZS9NYWtlZmlsZSBmcm9tIHNkay5naXQKIHNkay9maWxlcy9zZGtfZmlsZXNfTk9USUNFLnR4dCBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTk9USUNFLnR4dAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2FtcGxlcyBDb21wb25lbnQKKyMgQWRkLW9uIEZvbGRlcgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgZW1wdHkgYWRkLW9uIGZvbGRlciB3aXRoIGp1c3QgYSByZWFkbWUgY29waWVkIGZyb20gc2RrLmdpdAogc2RrL2ZpbGVzL1JFQURNRV9hZGQtb25zLnR4dCBhZGQtb25zL1JFQURNRS50eHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEV4dHJhIENvbXBvbmVudDogQ29tcGF0aWJpbGl0eQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RldmVsb3BtZW50L3Nkay9jb21wYXRpYmlsaXR5X3NvdXJjZS5wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9zb3VyY2UucHJvcGVydGllcworZGV2ZWxvcG1lbnQvc2RrL2NvbXBhdGliaWxpdHlfUkVBRE1FLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMvYW5kcm9pZC9jb21wYXRpYmlsaXR5L1JFQURNRS50eHQKK3Nkay9maWxlcy9zZGtfZmlsZXNfTk9USUNFLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzL2FuZHJvaWQvY29tcGF0aWJpbGl0eS9OT1RJQ0UudHh0Ciske09VVF9ESVJ9L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hbmRyb2lkLXN1cHBvcnQtdjRfaW50ZXJtZWRpYXRlcy9hbmRyb2lkLXN1cHBvcnQtdjQuamFyICAgIGV4dHJhcy9hbmRyb2lkL2NvbXBhdGliaWxpdHkvdjQvYW5kcm9pZC1zdXBwb3J0LXY0LmphcgorZnJhbWV3b3Jrcy9zdXBwb3J0L3Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMvYW5kcm9pZC9jb21wYXRpYmlsaXR5L3Y0L3NyYworZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMvYW5kcm9pZC9jb21wYXRpYmlsaXR5L3Y0L3NhbXBsZXMvQXBpRGVtb3MKZGlmZiAtLWdpdCBhL2J1aWxkL3Rvb2xzL3BhdGNoX3dpbmRvd3Nfc2RrLnNoIGIvYnVpbGQvdG9vbHMvcGF0Y2hfd2luZG93c19zZGsuc2gKaW5kZXggYmFhYTE3My4uMTc0MjRiNyAxMDA3NTUKLS0tIGEvYnVpbGQvdG9vbHMvcGF0Y2hfd2luZG93c19zZGsuc2gKKysrIGIvYnVpbGQvdG9vbHMvcGF0Y2hfd2luZG93c19zZGsuc2gKQEAgLTU5LDExICs1OSwxMyBAQAogTElCPSRURU1QX1NES19ESVIvdG9vbHMvbGliCiBybSAkViAkVE9PTFMve2RtdHJhY2VkdW1wLGV0YzF0b29sLGhwcm9mLWNvbnYsc3FsaXRlMyx6aXBhbGlnbn0KIHJtICRWICRMSUIvKi9zd3QuamFyCi1ybSAkViAkUExBVEZPUk1fVE9PTFMve2FkYixhYXB0LGFpZGwsZHgsZGV4ZHVtcH0KK3JtICRWICRQTEFURk9STV9UT09MUy97YWRiLGFhcHQsYWlkbCxkeCxkZXhkdW1wLGxsdm0tcnMtY2N9CiAKICMgQ29weSBhbGwgdGhlIG5ldyBzdHVmZiBpbiB0b29scwogIyBOb3RlOiBzb21lIHRvb2xzIGFyZSBmaXJzdCBjb3BpZWQgaGVyZSBhbmQgdGhlbiBtb3ZlZCBpbiBwbGF0Zm9ybXMvPG5hbWU+L3Rvb2xzLwogY3AgJFYgJFdJTl9PVVRfRElSL2hvc3Qvd2luZG93cy14ODYvYmluLyoue2V4ZSxkbGx9ICRUT09MUy8KKyMgUmVtb3ZlIHNvbWUgdG9vbHMgd2UgZG9uJ3Qgd2FudCB0byB0YWtlIGluIHRoZSBTREsKK3JtICRWIC1mICRUT09MUy97ZmFzdGJvb3QuZXhlLHJzLXNwZWMtZ2VuLmV4ZSx0YmxnZW4uZXhlfQogbWtkaXIgLXB2ICRMSUIveDg2CiBjcCAkViAke1RPUERJUn1wcmVidWlsdC93aW5kb3dzL3N3dC9zd3QuamFyICAgICAgICAgJExJQi94ODYvCiBta2RpciAtcHYgJExJQi94ODZfNjQKQEAgLTk3LDcgKzk5LDkgQEAKIAogIyBDb3B5IG9yIG1vdmUgcGxhdGZvcm0gc3BlY2lmaWMgdG9vbHMgdG8gdGhlIGRlZmF1bHQgcGxhdGZvcm0uCiBjcCAkViAke1RPUERJUn1kYWx2aWsvZHgvZXRjL2R4LmJhdCAkUExBVEZPUk1fVE9PTFMvCi1tdiAkViAkVE9PTFMve2FkYi5leGUsYWFwdC5leGUsYWlkbC5leGUsZGV4ZHVtcC5leGV9ICRUT09MUy9BZGIqLmRsbCAkUExBVEZPUk1fVE9PTFMvCittdiAkViAkVE9PTFMve2FkYi5leGUsYWFwdC5leGUsYWlkbC5leGUsZGV4ZHVtcC5leGV9ICRQTEFURk9STV9UT09MUy8KK212ICRWICRUT09MUy9sbHZtLXJzLWNjLmV4ZSAkUExBVEZPUk1fVE9PTFMvCittdiAkViAkVE9PTFMvQWRiKi5kbGwgJFBMQVRGT1JNX1RPT0xTLwogCiAjIEZpeCBFT0wgY2hhcnMgdG8gbWFrZSB3aW5kb3cgdXNlcnMgaGFwcHkgLSBmaXggYWxsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwKICMgYXMgd2VsbCBhcyBhbGwgYmF0Y2ggZmlsZXMgaW5jbHVkaW5nIHRob3NlIGluIHBsYXRmb3Jtcy88bmFtZT4vdG9vbHMvCmRpZmYgLS1naXQgYS9idWlsZC90b29scy93aW5kb3dzX3Nkay5tayBiL2J1aWxkL3Rvb2xzL3dpbmRvd3Nfc2RrLm1rCmluZGV4IDFmOGJjNDUuLjg0MjFhOTEgMTAwNjQ0Ci0tLSBhL2J1aWxkL3Rvb2xzL3dpbmRvd3Nfc2RrLm1rCisrKyBiL2J1aWxkL3Rvb2xzL3dpbmRvd3Nfc2RrLm1rCkBAIC0yNCwxNyArMjQsMjggQEAKIAogaW5jbHVkZSAkKFRPUERJUilzZGsvYnVpbGQvd2luZG93c19zZGtfdG9vbHMubWsKIAorIyBUaGlzIGlzIHRoZSBsaXN0IG9mIHRhcmdldCB0aGF0IHdlIHdhbnQgdG8gZ2VuZXJhdGUgYXMKKyMgV2luZG93cyBleGVjdXRhYmxlcy4KIFdJTl9UQVJHRVRTIDo9IFwKIAlhYXB0IGFkYiBhaWRsIFwKIAlldGMxdG9vbCBcCiAJZGV4ZHVtcCBkbXRyYWNlZHVtcCBcCiAJZmFzdGJvb3QgXAogCWhwcm9mLWNvbnYgXAorCWxsdm0tcnMtY2MgXAogCXByZWJ1aWx0IFwKIAlzcWxpdGUzIFwKIAl6aXBhbGlnbiBcCiAJJChXSU5fU0RLX1RBUkdFVFMpCiAKKyMgVGhpcyBpcyB0aGUgbGlzdCBvZiAqTGludXgqIGJ1aWxkIHRvb2xzIHRoYXQgd2UgbmVlZAorIyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG1ha2UgdGhlIFdJTl9UQVJHRVRTLiBUaGV5IGFyZQorIyBidWlsZCBwcmVyZXF1aXNpdGVzLgorV0lOX0JVSUxEX1BSRVJFUSA6PSBcCisJYWNwIFwKKwlsbHZtLXJzLWNjCisKKwogIyBNQUlOX1NES19OQU1FL0RJUiBpcyBzZXQgaW4gYnVpbGQvY29yZS9NYWtlZmlsZQogV0lOX1NES19OQU1FIDo9ICQoc3Vic3QgJChIT1NUX09TKS0kKEhPU1RfQVJDSCksd2luZG93cywkKE1BSU5fU0RLX05BTUUpKQogV0lOX1NES19ESVIgIDo9ICQoc3Vic3QgJChIT1NUX09TKS0kKEhPU1RfQVJDSCksd2luZG93cywkKE1BSU5fU0RLX0RJUikpCkBAIC02MCw3ICs3MSw3IEBACiB3aW5fc2RrOiAkKFdJTl9TREtfWklQKQogCSQoY2FsbCB3aW5zZGstYmFubmVyLERvbmUpCiAKLXdpbnNkay10b29sczogYWNwCit3aW5zZGstdG9vbHM6ICQoV0lOX0JVSUxEX1BSRVJFUSkKIAkkKGNhbGwgd2luc2RrLWJhbm5lcixCdWlsZCBXaW5kb3dzIFRvb2xzKQogCSQoaGlkZSkgVVNFX01JTkdXPTEgVVNFX0NDQUNIRT0iIiAkKE1BS0UpIFBST0RVQ1QtJChUQVJHRVRfUFJPRFVDVCktJChzdHJpcCAkKFdJTl9UQVJHRVRTKSkgJChpZiAkKGhpZGUpLCxzaG93Y29tbWFuZHMpCiAKQEAgLTczLDEwICs4NCw3IEBACiAJJChoaWRlKSBVU0JfRFJJVkVSX0hPT0s9JChVU0JfRFJJVkVSX0hPT0spIFwKIAkJJChUT1BESVIpZGV2ZWxvcG1lbnQvYnVpbGQvdG9vbHMvcGF0Y2hfd2luZG93c19zZGsuc2ggJChzdWJzdCBALC1xLCQoaGlkZSkpIFwKIAkJJChXSU5fU0RLX0RJUikvJChXSU5fU0RLX05BTUUpICQoT1VUX0RJUikgJChUT1BESVIpCi0JIyBUT0RPIHJlbW92ZSB0ZXN0IG9uY2UgbGx2bS1ycy1jYyBpcyBtZXJnZWQKLQkkKGhpZGUpIGlmIFsgLWYgJChXSU5fU0RLX0RJUikvJChXSU5fU0RLX05BTUUpL3BsYXRmb3JtLXRvb2xzL2xsdm0tcnMtY2MuZXhlIF07IHRoZW4gXAotCQkJc3RyaXAgLS1zdHJpcC1hbGwgJChXSU5fU0RLX0RJUikvJChXSU5fU0RLX05BTUUpL3BsYXRmb3JtLXRvb2xzL2xsdm0tcnMtY2MuZXhlOyBcCi0JCWZpCisJJChoaWRlKSBzdHJpcCAtLXN0cmlwLWFsbCAkKFdJTl9TREtfRElSKS8kKFdJTl9TREtfTkFNRSkvcGxhdGZvcm0tdG9vbHMvbGx2bS1ycy1jYy5leGUKIAkkKGhpZGUpICQoVE9QRElSKXNkay9idWlsZC9wYXRjaF93aW5kb3dzX3Nkay5zaCAkKHN1YnN0IEAsLXEsJChoaWRlKSkgXAogCQkkKFdJTl9TREtfRElSKS8kKFdJTl9TREtfTkFNRSkgJChPVVRfRElSKSAkKFRPUERJUikKIAkkKGhpZGUpICggXApkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvbW9ua2V5IGIvY21kcy9tb25rZXkvbW9ua2V5CmluZGV4IDQ1ZjQzYTQuLmJiZTI3ZjYgMTAwNzU1Ci0tLSBhL2NtZHMvbW9ua2V5L21vbmtleQorKysgYi9jbWRzL21vbmtleS9tb25rZXkKQEAgLTMsNSArMyw2IEBACiAjCiBiYXNlPS9zeXN0ZW0KIGV4cG9ydCBDTEFTU1BBVEg9JGJhc2UvZnJhbWV3b3JrL21vbmtleS5qYXIKK3RyYXAgIiIgSFVQCiBleGVjIGFwcF9wcm9jZXNzICRiYXNlL2JpbiBjb20uYW5kcm9pZC5jb21tYW5kcy5tb25rZXkuTW9ua2V5ICQqCiAKZGlmZiAtLWdpdCBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5LmphdmEgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleS5qYXZhCmluZGV4IGExZjMwNjAuLjM0M2MzNDQgMTAwNjQ0Ci0tLSBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5LmphdmEKKysrIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXkuamF2YQpAQCAtMTM2LDYgKzEzNiwxNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdEFwcENyYXNoQnVncmVwb3J0ID0gZmFsc2U7CiAKKyAgICAvKipSZXF1ZXN0IHRoZSBidWdyZXBvcnQgYmFzZWQgb24gdGhlIG1CdWdyZXBvcnRGcmVxdWVuY3kuICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1HZXRQZXJpb2RpY0J1Z3JlcG9ydCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBidWdyZXBvcnQgYmFzZWQgb24gdGhlIG1CdWdyZXBvcnRGcmVxdWVuY3kuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0UGVyaW9kaWNCdWdyZXBvcnQgPSBmYWxzZTsKKworICAgIC8qKiBCdWdyZXBvcnQgZnJlcXVlbmN5LiAqLworICAgIHByaXZhdGUgbG9uZyBtQnVncmVwb3J0RnJlcXVlbmN5ID0gMTA7CisKICAgICAvKiogRmFpbHVyZSBwcm9jZXNzIG5hbWUgKi8KICAgICBwcml2YXRlIFN0cmluZyBtUmVwb3J0UHJvY2Vzc05hbWU7CiAKQEAgLTMzNyw5ICszNDgsOCBAQAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTW9ua2V5LnRoaXMpIHsKICAgICAgICAgICAgICAgICAgICAgbUFib3J0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChtS2lsbFByb2Nlc3NBZnRlckVycm9yKSA/IC0xIDogMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIChtS2lsbFByb2Nlc3NBZnRlckVycm9yKSA/IC0xIDogMTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDUyLDkgKzQ2Miw2IEBACiAgICAgICogQHBhcmFtIGFyZ3MgVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIC8vIFNldCByby5tb25rZXkgaWYgaXQncyBub3Qgc2V0IHlldC4KLSAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoInJvLm1vbmtleSIsICJ0cnVlIik7Ci0KICAgICAgICAgLy8gU2V0IHRoZSBwcm9jZXNzIG5hbWUgc2hvd2luZyBpbiAicHMiIG9yICJ0b3AiCiAgICAgICAgIFByb2Nlc3Muc2V0QXJnVjAoImNvbS5hbmRyb2lkLmNvbW1hbmRzLm1vbmtleSIpOwogCkBAIC01NTEsMTMgKzU1OCwxMyBAQAogICAgICAgICAgICAgbUNvdW50RXZlbnRzID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAobVNjcmlwdEZpbGVOYW1lcyAhPSBudWxsICYmIG1TY3JpcHRGaWxlTmFtZXMuc2l6ZSgpID4gMSkgewogICAgICAgICAgICAgaWYgKG1TZXR1cEZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRXZlbnRTb3VyY2UgPSBuZXcgTW9ua2V5U291cmNlUmFuZG9tU2NyaXB0KG1TZXR1cEZpbGVOYW1lLCAKKyAgICAgICAgICAgICAgICBtRXZlbnRTb3VyY2UgPSBuZXcgTW9ua2V5U291cmNlUmFuZG9tU2NyaXB0KG1TZXR1cEZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgbVNjcmlwdEZpbGVOYW1lcywgbVRocm90dGxlLCBtUmFuZG9taXplVGhyb3R0bGUsIG1SYW5kb20sCiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZVdhaXRUaW1lLCBtRGV2aWNlU2xlZXBUaW1lLCBtUmFuZG9taXplU2NyaXB0KTsKICAgICAgICAgICAgICAgICBtQ291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUV2ZW50U291cmNlID0gbmV3IE1vbmtleVNvdXJjZVJhbmRvbVNjcmlwdChtU2NyaXB0RmlsZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlLCBtUmFuZG9taXplVGhyb3R0bGUsIG1SYW5kb20sIAorICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlLCBtUmFuZG9taXplVGhyb3R0bGUsIG1SYW5kb20sCiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZmlsZVdhaXRUaW1lLCBtRGV2aWNlU2xlZXBUaW1lLCBtUmFuZG9taXplU2NyaXB0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1FdmVudFNvdXJjZS5zZXRWZXJib3NlKG1WZXJib3NlKTsKQEAgLTYxNSwxMiArNjIyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVJlcXVlc3RBcHBDcmFzaEJ1Z3JlcG9ydCl7CiAgICAgICAgICAgICAgICAgZ2V0QnVncmVwb3J0KCJhcHBfY3Jhc2giICsgbVJlcG9ydFByb2Nlc3NOYW1lICsgIl8iKTsKLSAgICAgICAgICAgICAgICBtUmVxdWVzdEFuckJ1Z3JlcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1SZXF1ZXN0QXBwQ3Jhc2hCdWdyZXBvcnQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtUmVxdWVzdER1bXBzeXNNZW1JbmZvKSB7CiAgICAgICAgICAgICAgICAgcmVwb3J0RHVtcHN5c01lbUluZm8oKTsKICAgICAgICAgICAgICAgICBtUmVxdWVzdER1bXBzeXNNZW1JbmZvID0gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlcXVlc3RQZXJpb2RpY0J1Z3JlcG9ydCl7CisgICAgICAgICAgICAgICAgZ2V0QnVncmVwb3J0KCJCdWdyZXBvcnRfIik7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RQZXJpb2RpY0J1Z3JlcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1HZW5lcmF0ZUhwcm9mKSB7CkBAIC03MzIsNiArNzQzLDkgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tcGN0LWFueWV2ZW50IikpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBNb25rZXlTb3VyY2VSYW5kb20uRkFDVE9SX0FOWVRISU5HOwogICAgICAgICAgICAgICAgICAgICBtRmFjdG9yc1tpXSA9IC1uZXh0T3B0aW9uTG9uZygiYW55IGV2ZW50cyBwZXJjZW50YWdlIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLXBjdC1waW5jaHpvb20iKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IE1vbmtleVNvdXJjZVJhbmRvbS5GQUNUT1JfUElOQ0haT09NOworICAgICAgICAgICAgICAgICAgICBtRmFjdG9yc1tpXSA9IC1uZXh0T3B0aW9uTG9uZygicGluY2ggem9vbSBldmVudHMgcGVyY2VudGFnZSIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1wa2ctYmxhY2tsaXN0LWZpbGUiKSkgewogICAgICAgICAgICAgICAgICAgICBtUGtnQmxhY2tsaXN0RmlsZSA9IG5leHRPcHRpb25EYXRhKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLXBrZy13aGl0ZWxpc3QtZmlsZSIpKSB7CkBAIC03NjIsNiArNzc2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVNjcmlwdExvZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWJ1Z3JlcG9ydCIpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0QnVncmVwb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tcGVyaW9kaWMtYnVncmVwb3J0IikpeworICAgICAgICAgICAgICAgICAgICBtR2V0UGVyaW9kaWNCdWdyZXBvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtQnVncmVwb3J0RnJlcXVlbmN5ID0gbmV4dE9wdGlvbkxvbmcoIk51bWJlciBvZiBpdGVyYXRpb25zIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItaCIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNob3dVc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC04NjEsMTggKzg3OCw2IEBACiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgcmVhZHkgdG8gcm9jay4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJbnRlcm5hbENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIC8vIENoZWNrIEtFWUNPREUgbmFtZSBhcnJheSwgbWFrZSBzdXJlIGl0J3MgdXAgdG8gZGF0ZS4KLQotICAgICAgICBTdHJpbmcgbGFzdEtleU5hbWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGFzdEtleU5hbWUgPSBNb25rZXlTb3VyY2VSYW5kb20uZ2V0TGFzdEtleU5hbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEiVEFHX0xBU1RfS0VZQ09ERSIuZXF1YWxzKGxhc3RLZXlOYW1lKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqKiBFcnJvcjogS2V5IG5hbWVzIGFycmF5IG1hbGZvcm1lZCAoaW50ZXJuYWwgZXJyb3IpLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0xMDAzLDcgKzEwMDgsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0QXBwQ3Jhc2hCdWdyZXBvcnQpewogICAgICAgICAgICAgICAgICAgICBnZXRCdWdyZXBvcnQoImFwcF9jcmFzaCIgKyBtUmVwb3J0UHJvY2Vzc05hbWUgKyAiXyIpOwotICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdEFuckJ1Z3JlcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdEFwcENyYXNoQnVncmVwb3J0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdFBlcmlvZGljQnVncmVwb3J0KXsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QnVncmVwb3J0KCJCdWdyZXBvcnRfIik7CisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0UGVyaW9kaWNCdWdyZXBvcnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0RHVtcHN5c01lbUluZm8pIHsKICAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3REdW1wc3lzTWVtSW5mbyA9IGZhbHNlOwpAQCAtMTA5NCw2ICsxMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgaWYgKCFtQ291bnRFdmVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgY3ljbGVDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2NyaXB0TG9nKGN5Y2xlQ291bnRlcik7CisgICAgICAgICAgICAgICAgICAgIC8vQ2FwdHVyZSB0aGUgYnVncmVwb3J0IGFmdGVyIG4gaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChtR2V0UGVyaW9kaWNCdWdyZXBvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY3ljbGVDb3VudGVyICUgbUJ1Z3JlcG9ydEZyZXF1ZW5jeSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0UGVyaW9kaWNCdWdyZXBvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgU291cmNlIGhhcyBzaWduYWxlZCB0aGF0IHdlIGhhdmUgbm8gbW9yZSBldmVudHMgdG8gcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyNTgsNyArMTI3Myw3IEBACiAgICAgICAgIHVzYWdlLmFwcGVuZCgiICAgICAgICAgICAgICBbLS1wY3QtdHJhY2tiYWxsIFBFUkNFTlRdIFstLXBjdC1zeXNrZXlzIFBFUkNFTlRdXG4iKTsKICAgICAgICAgdXNhZ2UuYXBwZW5kKCIgICAgICAgICAgICAgIFstLXBjdC1uYXYgUEVSQ0VOVF0gWy0tcGN0LW1ham9ybmF2IFBFUkNFTlRdXG4iKTsKICAgICAgICAgdXNhZ2UuYXBwZW5kKCIgICAgICAgICAgICAgIFstLXBjdC1hcHBzd2l0Y2ggUEVSQ0VOVF0gWy0tcGN0LWZsaXAgUEVSQ0VOVF1cbiIpOwotICAgICAgICB1c2FnZS5hcHBlbmQoIiAgICAgICAgICAgICAgWy0tcGN0LWFueWV2ZW50IFBFUkNFTlRdXG4iKTsKKyAgICAgICAgdXNhZ2UuYXBwZW5kKCIgICAgICAgICAgICAgIFstLXBjdC1hbnlldmVudCBQRVJDRU5UXSBbLS1wY3QtcGluY2h6b29tIFBFUkNFTlRdXG4iKTsKICAgICAgICAgdXNhZ2UuYXBwZW5kKCIgICAgICAgICAgICAgIFstLXBrZy1ibGFja2xpc3QtZmlsZSBQQUNLQUdFX0JMQUNLTElTVF9GSUxFXVxuIik7CiAgICAgICAgIHVzYWdlLmFwcGVuZCgiICAgICAgICAgICAgICBbLS1wa2ctd2hpdGVsaXN0LWZpbGUgUEFDS0FHRV9XSElURUxJU1RfRklMRV1cbiIpOwogICAgICAgICB1c2FnZS5hcHBlbmQoIiAgICAgICAgICAgICAgWy0td2FpdC1kYmddIFstLWRiZy1uby1ldmVudHNdXG4iKTsKQEAgLTEyNzEsNiArMTI4Niw3IEBACiAgICAgICAgIHVzYWdlLmFwcGVuZCgiICAgICAgICAgICAgICBbLS1yYW5kb21pemUtc2NyaXB0XVxuIik7CiAgICAgICAgIHVzYWdlLmFwcGVuZCgiICAgICAgICAgICAgICBbLS1zY3JpcHQtbG9nXVxuIik7CiAgICAgICAgIHVzYWdlLmFwcGVuZCgiICAgICAgICAgICAgICBbLS1idWdyZXBvcnRdXG4iKTsKKyAgICAgICAgdXNhZ2UuYXBwZW5kKCIgICAgICAgICAgICAgIFstLXBlcmlvZGljLWJ1Z3JlcG9ydF1cbiIpOwogICAgICAgICB1c2FnZS5hcHBlbmQoIiAgICAgICAgICAgICAgQ09VTlRcbiIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odXNhZ2UudG9TdHJpbmcoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlBY3Rpdml0eUV2ZW50LmphdmEgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUFjdGl2aXR5RXZlbnQuamF2YQppbmRleCAyNjIzNzdhLi40NjYxZDhjIDEwMDY0NAotLS0gYS9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUFjdGl2aXR5RXZlbnQuamF2YQorKysgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUFjdGl2aXR5RXZlbnQuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIG1vbmtleSBhY3Rpdml0eSBldmVudApAQCAtNTcsNyArNTYsNyBAQAogICAgIHB1YmxpYyBpbnQgaW5qZWN0RXZlbnQoSVdpbmRvd01hbmFnZXIgaXdtLCBJQWN0aXZpdHlNYW5hZ2VyIGlhbSwgaW50IHZlcmJvc2UpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IGdldEV2ZW50KCk7CiAgICAgICAgIGlmICh2ZXJib3NlID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI6U3dpdGNoOiAiICsgaW50ZW50LnRvVVJJKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI6U3dpdGNoOiAiICsgaW50ZW50LnRvVXJpKDApKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQWxhcm1UaW1lICE9IDApewpAQCAtNzUsNyArNzQsNyBAQAogICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSA+IDApIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqIFBlcm1pc3Npb25zIGVycm9yIHN0YXJ0aW5nIGFjdGl2aXR5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZW50LnRvVVJJKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlbnQudG9VcmkoMCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE1vbmtleUV2ZW50LklOSkVDVF9FUlJPUl9TRUNVUklUWV9FWENFUFRJT047CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5RXZlbnQuamF2YSBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5RXZlbnQuamF2YQppbmRleCAyNzgzZGRlLi4xZjcwM2VhIDEwMDY0NAotLS0gYS9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUV2ZW50LmphdmEKKysrIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlFdmVudC5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9ua2V5RXZlbnQgewogICAgIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfS0VZID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX1BPSU5URVIgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfVE9VQ0ggPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1RZUEVfVFJBQ0tCQUxMID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX0FDVElWSVRZID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9UWVBFX0ZMSVAgPSA0OyAvLyBLZXlib2FyZCBmbGlwCmRpZmYgLS1naXQgYS9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUtleUV2ZW50LmphdmEgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleUtleUV2ZW50LmphdmEKaW5kZXggZDljNjhhZi4uNDU1YzAwOSAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlLZXlFdmVudC5qYXZhCisrKyBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5S2V5RXZlbnQuamF2YQpAQCAtMTE3LDExICsxMTcsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjpTZW5kS2V5ICgiICsgbm90ZSArICIpOiAiCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI6U2VuZGluZyBLZXkgKCIgKyBub3RlICsgIik6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgbUtleUNvZGUgKyAiICAgIC8vICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgTW9ua2V5U291cmNlUmFuZG9tLmdldEtleU5hbWUobUtleUNvZGUpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI6U2VuZEtleSAoQUNUSU9OX1VQKTogIgorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiOlNlbmRpbmcgS2V5ICgiICsgbm90ZSArICIpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIG1LZXlDb2RlICsgIiAgICAvLyBVbmtub3duIGtleSBldmVudCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleU1vdGlvbkV2ZW50LmphdmEgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleU1vdGlvbkV2ZW50LmphdmEKaW5kZXggODFjNjRiNC4uYzU5MzgyZiAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlNb3Rpb25FdmVudC5qYXZhCisrKyBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5TW90aW9uRXZlbnQuamF2YQpAQCAtMTksMTQ0ICsxOSwxODQgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCiAKIC8qKgogICogbW9ua2V5IG1vdGlvbiBldmVudAogICovCi1wdWJsaWMgY2xhc3MgTW9ua2V5TW90aW9uRXZlbnQgZXh0ZW5kcyBNb25rZXlFdmVudCB7Ci0gICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZSA9IC0xOwotICAgIHByaXZhdGUgbG9uZyBtRXZlbnRUaW1lID0gLTE7ICAgIAotICAgIHByaXZhdGUgaW50IG1BY3Rpb24gPSAtMTsKLSAgICBwcml2YXRlIGZsb2F0IG1YID0gLTE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWSA9IC0xOwotICAgIHByaXZhdGUgZmxvYXQgbVByZXNzdXJlID0gLTE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtU2l6ZSA9IC0xOwotICAgIHByaXZhdGUgaW50IG1NZXRhU3RhdGUgPSAtMTsKLSAgICBwcml2YXRlIGZsb2F0IG1YUHJlY2lzaW9uID0gLTE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWVByZWNpc2lvbiA9IC0xOwotICAgIHByaXZhdGUgaW50IG1EZXZpY2VJZCA9IC0xOwotICAgIHByaXZhdGUgaW50IG1FZGdlRmxhZ3MgPSAtMTsKLSAgICAKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb25rZXlNb3Rpb25FdmVudCBleHRlbmRzIE1vbmtleUV2ZW50IHsKKyAgICBwcml2YXRlIGxvbmcgbURvd25UaW1lOworICAgIHByaXZhdGUgbG9uZyBtRXZlbnRUaW1lOworICAgIHByaXZhdGUgaW50IG1BY3Rpb247CisgICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzPiBtUG9pbnRlcnM7CisgICAgcHJpdmF0ZSBpbnQgbU1ldGFTdGF0ZTsKKyAgICBwcml2YXRlIGZsb2F0IG1YUHJlY2lzaW9uOworICAgIHByaXZhdGUgZmxvYXQgbVlQcmVjaXNpb247CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlkOworICAgIHByaXZhdGUgaW50IG1Tb3VyY2U7CisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzOworICAgIHByaXZhdGUgaW50IG1FZGdlRmxhZ3M7CisKICAgICAvL0lmIHRydWUsIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgKG1vcmUgdmVyYm9zZSBsb2dnaW5nLCBvbmx5KQotICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJtZWRpYXRlTm90ZTsgIAotICAgICAgICAKLSAgICBwdWJsaWMgTW9ua2V5TW90aW9uRXZlbnQoaW50IHR5cGUsIGxvbmcgZG93bkF0LCBpbnQgYWN0aW9uLCAKLSAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBtZXRhU3RhdGUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUludGVybWVkaWF0ZU5vdGU7CisKKyAgICBwcm90ZWN0ZWQgTW9ua2V5TW90aW9uRXZlbnQoaW50IHR5cGUsIGludCBzb3VyY2UsIGludCBhY3Rpb24pIHsKICAgICAgICAgc3VwZXIodHlwZSk7Ci0gICAgICAgIG1Eb3duVGltZSA9IGRvd25BdDsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgbURvd25UaW1lID0gLTE7CisgICAgICAgIG1FdmVudFRpbWUgPSAtMTsKICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgbVggPSB4OwotICAgICAgICBtWSA9IHk7Ci0gICAgICAgIG1NZXRhU3RhdGUgPSBtZXRhU3RhdGU7CisgICAgICAgIG1Qb2ludGVycyA9IG5ldyBTcGFyc2VBcnJheTxNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzPigpOworICAgICAgICBtWFByZWNpc2lvbiA9IDE7CisgICAgICAgIG1ZUHJlY2lzaW9uID0gMTsKICAgICB9Ci0gICAgCi0gICAgcHVibGljIE1vbmtleU1vdGlvbkV2ZW50KGludCB0eXBlLCBsb25nIGRvd25UaW1lLCBsb25nIGV2ZW50VGltZSwgaW50IGFjdGlvbiwKLSAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBmbG9hdCBzaXplLCBpbnQgbWV0YVN0YXRlLAotICAgICAgICAgICAgZmxvYXQgeFByZWNpc2lvbiwgZmxvYXQgeVByZWNpc2lvbiwgaW50IGRldmljZUlkLCBpbnQgZWRnZUZsYWdzKSB7Ci0gICAgICAgIHN1cGVyKHR5cGUpOwotICAgICAgICBtRG93blRpbWUgPSBkb3duVGltZTsKLSAgICAgICAgbUV2ZW50VGltZSA9IGV2ZW50VGltZTsKLSAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgbVggPSB4OwotICAgICAgICBtWSA9IHk7Ci0gICAgICAgIG1QcmVzc3VyZSA9IHByZXNzdXJlOwotICAgICAgICBtU2l6ZSA9IHNpemU7Ci0gICAgICAgIG1NZXRhU3RhdGUgPSBtZXRhU3RhdGU7Ci0gICAgICAgIG1YUHJlY2lzaW9uID0geFByZWNpc2lvbjsKLSAgICAgICAgbVlQcmVjaXNpb24gPSB5UHJlY2lzaW9uOwotICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICAgICAgbUVkZ2VGbGFncyA9IGVkZ2VGbGFnczsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEludGVybWVkaWF0ZU5vdGUoYm9vbGVhbiBiKSB7CisKKyAgICBwdWJsaWMgTW9ua2V5TW90aW9uRXZlbnQgYWRkUG9pbnRlcihpbnQgaWQsIGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgcmV0dXJuIGFkZFBvaW50ZXIoaWQsIHgsIHksIDAsIDApOworICAgIH0KKworICAgIHB1YmxpYyBNb25rZXlNb3Rpb25FdmVudCBhZGRQb2ludGVyKGludCBpZCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGZsb2F0IHByZXNzdXJlLCBmbG9hdCBzaXplKSB7CisgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMgYyA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgIGMueCA9IHg7CisgICAgICAgIGMueSA9IHk7CisgICAgICAgIGMucHJlc3N1cmUgPSBwcmVzc3VyZTsKKyAgICAgICAgYy5zaXplID0gc2l6ZTsKKyAgICAgICAgbVBvaW50ZXJzLmFwcGVuZChpZCwgYyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNb25rZXlNb3Rpb25FdmVudCBzZXRJbnRlcm1lZGlhdGVOb3RlKGJvb2xlYW4gYikgewogICAgICAgICBtSW50ZXJtZWRpYXRlTm90ZSA9IGI7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIGdldEludGVybWVkaWF0ZU5vdGUoKSB7CiAgICAgICAgIHJldHVybiBtSW50ZXJtZWRpYXRlTm90ZTsKICAgICB9Ci0gICAgCi0gICAgcHVibGljIGZsb2F0IGdldFgoKSB7Ci0gICAgICAgIHJldHVybiBtWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZsb2F0IGdldFkoKSB7Ci0gICAgICAgIHJldHVybiBtWTsKLSAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldEFjdGlvbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3Rpb247CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGxvbmcgZ2V0RG93blRpbWUoKSB7CiAgICAgICAgIHJldHVybiBtRG93blRpbWU7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGxvbmcgZ2V0RXZlbnRUaW1lKCkgewogICAgICAgICByZXR1cm4gbUV2ZW50VGltZTsKICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RG93blRpbWUobG9uZyBkb3duVGltZSkgeworCisgICAgcHVibGljIE1vbmtleU1vdGlvbkV2ZW50IHNldERvd25UaW1lKGxvbmcgZG93blRpbWUpIHsKICAgICAgICAgbURvd25UaW1lID0gZG93blRpbWU7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudFRpbWUobG9uZyBldmVudFRpbWUpIHsKKworICAgIHB1YmxpYyBNb25rZXlNb3Rpb25FdmVudCBzZXRFdmVudFRpbWUobG9uZyBldmVudFRpbWUpIHsKICAgICAgICAgbUV2ZW50VGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQotICAgIAorCisgICAgcHVibGljIE1vbmtleU1vdGlvbkV2ZW50IHNldE1ldGFTdGF0ZShpbnQgbWV0YVN0YXRlKSB7CisgICAgICAgIG1NZXRhU3RhdGUgPSBtZXRhU3RhdGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNb25rZXlNb3Rpb25FdmVudCBzZXRQcmVjaXNpb24oZmxvYXQgeFByZWNpc2lvbiwgZmxvYXQgeVByZWNpc2lvbikgeworICAgICAgICBtWFByZWNpc2lvbiA9IHhQcmVjaXNpb247CisgICAgICAgIG1ZUHJlY2lzaW9uID0geVByZWNpc2lvbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1vbmtleU1vdGlvbkV2ZW50IHNldERldmljZUlkKGludCBkZXZpY2VJZCkgeworICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1vbmtleU1vdGlvbkV2ZW50IHNldEVkZ2VGbGFncyhpbnQgZWRnZUZsYWdzKSB7CisgICAgICAgIG1FZGdlRmxhZ3MgPSBlZGdlRmxhZ3M7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgYSBtb3Rpb24gZXZlbnQKICAgICAgKi8KICAgICBwcml2YXRlIE1vdGlvbkV2ZW50IGdldEV2ZW50KCkgewotICAgICAgICBpZiAobURldmljZUlkIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE1vdGlvbkV2ZW50Lm9idGFpbihtRG93blRpbWUsIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCAKLSAgICAgICAgICAgICAgICBtQWN0aW9uLCBtWCwgbVksIG1NZXRhU3RhdGUpOworICAgICAgICBpbnQgcG9pbnRlckNvdW50ID0gbVBvaW50ZXJzLnNpemUoKTsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbcG9pbnRlckNvdW50XTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1twb2ludGVyQ291bnRdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvaW50ZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBwb2ludGVySWRzW2ldID0gbVBvaW50ZXJzLmtleUF0KGkpOworICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG1Qb2ludGVycy52YWx1ZUF0KGkpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBmb3Igc2NyaXB0cwotICAgICAgICByZXR1cm4gTW90aW9uRXZlbnQub2J0YWluKG1Eb3duVGltZSwgbUV2ZW50VGltZSwgCi0gICAgICAgICAgICAgICAgbUFjdGlvbiwgbVgsIG1ZLCBtUHJlc3N1cmUsIG1TaXplLCBtTWV0YVN0YXRlLAotICAgICAgICAgICAgICAgIG1YUHJlY2lzaW9uLCBtWVByZWNpc2lvbiwgbURldmljZUlkLCBtRWRnZUZsYWdzKTsKKworICAgICAgICBNb3Rpb25FdmVudCBldiA9IE1vdGlvbkV2ZW50Lm9idGFpbihtRG93blRpbWUsCisgICAgICAgICAgICAgICAgbUV2ZW50VGltZSA8IDAgPyBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSA6IG1FdmVudFRpbWUsCisgICAgICAgICAgICAgICAgbUFjdGlvbiwgcG9pbnRlckNvdW50LCBwb2ludGVySWRzLCBwb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgIG1NZXRhU3RhdGUsIG1YUHJlY2lzaW9uLCBtWVByZWNpc2lvbiwgbURldmljZUlkLCBtRWRnZUZsYWdzLCBtU291cmNlLCBtRmxhZ3MpOworICAgICAgICByZXR1cm4gZXY7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNUaHJvdHRsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApOworICAgICAgICByZXR1cm4gKGdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBpbmplY3RFdmVudChJV2luZG93TWFuYWdlciBpd20sIElBY3Rpdml0eU1hbmFnZXIgaWFtLCBpbnQgdmVyYm9zZSkgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5vdGU7CisgICAgICAgIE1vdGlvbkV2ZW50IG1lID0gZ2V0RXZlbnQoKTsKICAgICAgICAgaWYgKCh2ZXJib3NlID4gMCAmJiAhbUludGVybWVkaWF0ZU5vdGUpIHx8IHZlcmJvc2UgPiAxKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgICAgIG5vdGUgPSAiRE9XTiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgbm90ZSA9ICJVUCI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vdGUgPSAiTU9WRSI7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCI6U2VuZGluZyAiKTsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoZ2V0VHlwZUxhYmVsKCkpLmFwcGVuZCgiICgiKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWUuZ2V0QWN0aW9uTWFza2VkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJBQ1RJT05fRE9XTiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJBQ1RJT05fTU9WRSIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiQUNUSU9OX1VQIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiQUNUSU9OX0NBTkNFTCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV046CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIkFDVElPTl9QT0lOVEVSX0RPV04gIikuYXBwZW5kKG1lLmdldFBvaW50ZXJJZChtZS5nZXRBY3Rpb25JbmRleCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIkFDVElPTl9QT0lOVEVSX1VQICIpLmFwcGVuZChtZS5nZXRQb2ludGVySWQobWUuZ2V0QWN0aW9uSW5kZXgoKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKG1lLmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjpTZW5kaW5nIFBvaW50ZXIgQUNUSU9OXyIgKyBub3RlICsgCi0gICAgICAgICAgICAgICAgICAgICIgeD0iICsgbVggKyAiIHk9IiArIG1ZKTsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIik6Iik7CisKKyAgICAgICAgICAgIGludCBwb2ludGVyQ291bnQgPSBtZS5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCIgIikuYXBwZW5kKG1lLmdldFBvaW50ZXJJZChpKSk7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiOigiKS5hcHBlbmQobWUuZ2V0WChpKSkuYXBwZW5kKCIsIikuYXBwZW5kKG1lLmdldFkoaSkpLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZy50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHR5cGUgPSB0aGlzLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgTW90aW9uRXZlbnQgbWUgPSBnZXRFdmVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKHR5cGUgPT0gTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9QT0lOVEVSICYmIAotICAgICAgICAgICAgICAgICAgICAhaXdtLmluamVjdFBvaW50ZXJFdmVudChtZSwgZmFsc2UpKQotICAgICAgICAgICAgICAgICAgICB8fCAodHlwZSA9PSBNb25rZXlFdmVudC5FVkVOVF9UWVBFX1RSQUNLQkFMTCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXdtLmluamVjdFRyYWNrYmFsbEV2ZW50KG1lLCBmYWxzZSkpKSB7CisgICAgICAgICAgICBpZiAoIWluamVjdE1vdGlvbkV2ZW50KGl3bSwgbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1vbmtleUV2ZW50LklOSkVDVF9GQUlMOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHJldHVybiBNb25rZXlFdmVudC5JTkpFQ1RfRVJST1JfUkVNT1RFX0VYQ0VQVElPTjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1lLnJlY3ljbGUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTW9ua2V5RXZlbnQuSU5KRUNUX1NVQ0NFU1M7CiAgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlTGFiZWwoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpbmplY3RNb3Rpb25FdmVudChJV2luZG93TWFuYWdlciBpd20sIE1vdGlvbkV2ZW50IG1lKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5U291cmNlTmV0d29yay5qYXZhIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VOZXR3b3JrLmphdmEKaW5kZXggYTlhMWRiNC4uMGI0ZTI2OSAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VOZXR3b3JrLmphdmEKKysrIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VOZXR3b3JrLmphdmEKQEAgLTE1OSw4ICsxNTksOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUFSRzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlRXZlbnQobmV3IE1vbmtleU1vdGlvbkV2ZW50KE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfUE9JTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBhY3Rpb24sIHgsIHksIDApKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlRXZlbnQobmV3IE1vbmtleVRvdWNoRXZlbnQoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgeCwgeSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBFQVJHOwpAQCAtMTg3LDggKzE4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkdvdCBzb21ldGhpbmcgdGhhdCB3YXNuJ3QgYSBudW1iZXIiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVBUkc7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1ZXVlLmVucXVldWVFdmVudChuZXcgTW9ua2V5TW90aW9uRXZlbnQoTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UUkFDS0JBTEwsIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUsIGR4LCBkeSwgMCkpOworICAgICAgICAgICAgICAgIHF1ZXVlLmVucXVldWVFdmVudChuZXcgTW9ua2V5VHJhY2tiYWxsRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCBkeCwgZHkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAKICAgICAgICAgICAgIH0KQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBhbiBhcnJheSBvZiBLZXlFdmVudCdzIGZvcgogICAgICAgICAgICAgICAgIC8vIHRoZSBidWlsdCBpbiBrZXltYXAuCiAgICAgICAgICAgICAgICAgS2V5Q2hhcmFjdGVyTWFwIGtleUNoYXJhY3Rlck1hcCA9IEtleUNoYXJhY3Rlck1hcC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQoS2V5Q2hhcmFjdGVyTWFwLkJVSUxUX0lOX0tFWUJPQVJEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQoS2V5Q2hhcmFjdGVyTWFwLlZJUlRVQUxfS0VZQk9BUkQpOwogICAgICAgICAgICAgICAgIEtleUV2ZW50W10gZXZlbnRzID0ga2V5Q2hhcmFjdGVyTWFwLmdldEV2ZW50cyhjaGFycyk7CiAKICAgICAgICAgICAgICAgICAvLyBlbnF1ZXVlIGFsbCB0aGUgZXZlbnRzIHdlIGp1c3QgZ290LgpAQCAtMzQxLDEyICszNDEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVBUkc7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZUV2ZW50KG5ldyBNb25rZXlNb3Rpb25FdmVudChNb25rZXlFdmVudC5FVkVOVF9UWVBFX1BPSU5URVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCAwKSk7Ci0gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZUV2ZW50KG5ldyBNb25rZXlNb3Rpb25FdmVudChNb25rZXlFdmVudC5FVkVOVF9UWVBFX1BPSU5URVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgTW90aW9uRXZlbnQuQUNUSU9OX1VQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgMCkpOworICAgICAgICAgICAgICAgIHF1ZXVlLmVucXVldWVFdmVudChuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQb2ludGVyKDAsIHgsIHkpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlRXZlbnQobmV3IE1vbmtleVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX1VQKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgeCwgeSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBFQVJHOwpkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VSYW5kb20uamF2YSBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5U291cmNlUmFuZG9tLmphdmEKaW5kZXggM2Q3ODM0Yy4uYWY3NDBiMyAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VSYW5kb20uamF2YQorKysgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleVNvdXJjZVJhbmRvbS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbW1hbmRzLm1vbmtleTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKQEAgLTQ4LDcgKzQ5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTWVNfS0VZUyA9IHsKICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9IT01FLCBLZXlFdmVudC5LRVlDT0RFX0JBQ0ssCiAgICAgICAgIEtleUV2ZW50LktFWUNPREVfQ0FMTCwgS2V5RXZlbnQuS0VZQ09ERV9FTkRDQUxMLAotICAgICAgICBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCwgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiwKKyAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVAsIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04sIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX01VVEUsCiAgICAgICAgIEtleUV2ZW50LktFWUNPREVfTVVURSwKICAgICB9OwogICAgIC8qKiBJZiBhIHBoeXNpY2FsIGtleSBleGlzdHM/ICovCkBAIC02MywxMzQgKzY0LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogTmljZSBuYW1lcyBmb3IgYWxsIGtleSBldmVudHMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gS0VZX05BTUVTID0gewotICAgICAgICAiS0VZQ09ERV9VTktOT1dOIiwKLSAgICAgICAgIktFWUNPREVfU09GVF9MRUZUIiwKLSAgICAgICAgIktFWUNPREVfU09GVF9SSUdIVCIsCi0gICAgICAgICJLRVlDT0RFX0hPTUUiLAotICAgICAgICAiS0VZQ09ERV9CQUNLIiwKLSAgICAgICAgIktFWUNPREVfQ0FMTCIsCi0gICAgICAgICJLRVlDT0RFX0VORENBTEwiLAotICAgICAgICAiS0VZQ09ERV8wIiwKLSAgICAgICAgIktFWUNPREVfMSIsCi0gICAgICAgICJLRVlDT0RFXzIiLAotICAgICAgICAiS0VZQ09ERV8zIiwKLSAgICAgICAgIktFWUNPREVfNCIsCi0gICAgICAgICJLRVlDT0RFXzUiLAotICAgICAgICAiS0VZQ09ERV82IiwKLSAgICAgICAgIktFWUNPREVfNyIsCi0gICAgICAgICJLRVlDT0RFXzgiLAotICAgICAgICAiS0VZQ09ERV85IiwKLSAgICAgICAgIktFWUNPREVfU1RBUiIsCi0gICAgICAgICJLRVlDT0RFX1BPVU5EIiwKLSAgICAgICAgIktFWUNPREVfRFBBRF9VUCIsCi0gICAgICAgICJLRVlDT0RFX0RQQURfRE9XTiIsCi0gICAgICAgICJLRVlDT0RFX0RQQURfTEVGVCIsCi0gICAgICAgICJLRVlDT0RFX0RQQURfUklHSFQiLAotICAgICAgICAiS0VZQ09ERV9EUEFEX0NFTlRFUiIsCi0gICAgICAgICJLRVlDT0RFX1ZPTFVNRV9VUCIsCi0gICAgICAgICJLRVlDT0RFX1ZPTFVNRV9ET1dOIiwKLSAgICAgICAgIktFWUNPREVfUE9XRVIiLAotICAgICAgICAiS0VZQ09ERV9DQU1FUkEiLAotICAgICAgICAiS0VZQ09ERV9DTEVBUiIsCi0gICAgICAgICJLRVlDT0RFX0EiLAotICAgICAgICAiS0VZQ09ERV9CIiwKLSAgICAgICAgIktFWUNPREVfQyIsCi0gICAgICAgICJLRVlDT0RFX0QiLAotICAgICAgICAiS0VZQ09ERV9FIiwKLSAgICAgICAgIktFWUNPREVfRiIsCi0gICAgICAgICJLRVlDT0RFX0ciLAotICAgICAgICAiS0VZQ09ERV9IIiwKLSAgICAgICAgIktFWUNPREVfSSIsCi0gICAgICAgICJLRVlDT0RFX0oiLAotICAgICAgICAiS0VZQ09ERV9LIiwKLSAgICAgICAgIktFWUNPREVfTCIsCi0gICAgICAgICJLRVlDT0RFX00iLAotICAgICAgICAiS0VZQ09ERV9OIiwKLSAgICAgICAgIktFWUNPREVfTyIsCi0gICAgICAgICJLRVlDT0RFX1AiLAotICAgICAgICAiS0VZQ09ERV9RIiwKLSAgICAgICAgIktFWUNPREVfUiIsCi0gICAgICAgICJLRVlDT0RFX1MiLAotICAgICAgICAiS0VZQ09ERV9UIiwKLSAgICAgICAgIktFWUNPREVfVSIsCi0gICAgICAgICJLRVlDT0RFX1YiLAotICAgICAgICAiS0VZQ09ERV9XIiwKLSAgICAgICAgIktFWUNPREVfWCIsCi0gICAgICAgICJLRVlDT0RFX1kiLAotICAgICAgICAiS0VZQ09ERV9aIiwKLSAgICAgICAgIktFWUNPREVfQ09NTUEiLAotICAgICAgICAiS0VZQ09ERV9QRVJJT0QiLAotICAgICAgICAiS0VZQ09ERV9BTFRfTEVGVCIsCi0gICAgICAgICJLRVlDT0RFX0FMVF9SSUdIVCIsCi0gICAgICAgICJLRVlDT0RFX1NISUZUX0xFRlQiLAotICAgICAgICAiS0VZQ09ERV9TSElGVF9SSUdIVCIsCi0gICAgICAgICJLRVlDT0RFX1RBQiIsCi0gICAgICAgICJLRVlDT0RFX1NQQUNFIiwKLSAgICAgICAgIktFWUNPREVfU1lNIiwKLSAgICAgICAgIktFWUNPREVfRVhQTE9SRVIiLAotICAgICAgICAiS0VZQ09ERV9FTlZFTE9QRSIsCi0gICAgICAgICJLRVlDT0RFX0VOVEVSIiwKLSAgICAgICAgIktFWUNPREVfREVMIiwKLSAgICAgICAgIktFWUNPREVfR1JBVkUiLAotICAgICAgICAiS0VZQ09ERV9NSU5VUyIsCi0gICAgICAgICJLRVlDT0RFX0VRVUFMUyIsCi0gICAgICAgICJLRVlDT0RFX0xFRlRfQlJBQ0tFVCIsCi0gICAgICAgICJLRVlDT0RFX1JJR0hUX0JSQUNLRVQiLAotICAgICAgICAiS0VZQ09ERV9CQUNLU0xBU0giLAotICAgICAgICAiS0VZQ09ERV9TRU1JQ09MT04iLAotICAgICAgICAiS0VZQ09ERV9BUE9TVFJPUEhFIiwKLSAgICAgICAgIktFWUNPREVfU0xBU0giLAotICAgICAgICAiS0VZQ09ERV9BVCIsCi0gICAgICAgICJLRVlDT0RFX05VTSIsCi0gICAgICAgICJLRVlDT0RFX0hFQURTRVRIT09LIiwKLSAgICAgICAgIktFWUNPREVfRk9DVVMiLAotICAgICAgICAiS0VZQ09ERV9QTFVTIiwKLSAgICAgICAgIktFWUNPREVfTUVOVSIsCi0gICAgICAgICJLRVlDT0RFX05PVElGSUNBVElPTiIsCi0gICAgICAgICJLRVlDT0RFX1NFQVJDSCIsCi0gICAgICAgICJLRVlDT0RFX1BMQVlQQVVTRSIsCi0gICAgICAgICJLRVlDT0RFX1NUT1AiLAotICAgICAgICAiS0VZQ09ERV9ORVhUU09ORyIsCi0gICAgICAgICJLRVlDT0RFX1BSRVZJT1VTU09ORyIsCi0gICAgICAgICJLRVlDT0RFX1JFV0lORCIsCi0gICAgICAgICJLRVlDT0RFX0ZPUldBUkQiLAotICAgICAgICAiS0VZQ09ERV9NVVRFIiwKLSAgICAgICAgIktFWUNPREVfUEFHRV9VUCIsCi0gICAgICAgICJLRVlDT0RFX1BBR0VfRE9XTiIsCi0gICAgICAgICJLRVlDT0RFX1BJQ1RTWU1CT0xTIiwKLSAgICAgICAgIktFWUNPREVfU1dJVENIX0NIQVJTRVQiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fQSIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9CIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX0MiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fWCIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9ZIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX1oiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fTDEiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fUjEiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fTDIiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fUjIiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fVEhVTUJMIiwKLSAgICAgICAgIktFWUNPREVfQlVUVE9OX1RIVU1CUiIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9TVEFSVCIsCi0gICAgICAgICJLRVlDT0RFX0JVVFRPTl9TRUxFQ1QiLAotICAgICAgICAiS0VZQ09ERV9CVVRUT05fTU9ERSIsCi0KLSAgICAgICAgIlRBR19MQVNUX0tFWUNPREUiICAgICAgLy8gRU9MLiAgdXNlZCB0byBrZWVwIHRoZSBsaXN0cyBpbiBzeW5jCi0gICAgfTsKLQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9UT1VDSCAgICAgICAgPSAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9NT1RJT04gICAgICAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9UUkFDS0JBTEwgICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9OQVYgICAgICAgICAgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9NQUpPUk5BViAgICAgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9TWVNPUFMgICAgICAgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9BUFBTV0lUQ0ggICAgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9GTElQICAgICAgICAgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUl9BTllUSElORyAgICAgPSA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUlpfQ09VTlQgICAgICAgPSA5OyAgICAvLyBzaG91bGQgYmUgbGFzdCsxCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX1BJTkNIWk9PTSAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX1RSQUNLQkFMTCAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX05BViAgICAgICAgICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX01BSk9STkFWICAgICA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX1NZU09QUyAgICAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX0FQUFNXSVRDSCAgICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX0ZMSVAgICAgICAgICA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SX0FOWVRISU5HICAgICA9IDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SWl9DT1VOVCAgICAgICA9IDEwOyAgICAvLyBzaG91bGQgYmUgbGFzdCsxCiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9UQVAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVNUVVJFX0RSQUcgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVNUVVJFX1BJTkNIX09SX1pPT00gPSAyOwogCiAgICAgLyoqIHBlcmNlbnRhZ2VzIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuICBUaGVzZSB3aWxsIGJlIHJlbWFwcGVkIHRvIHdvcmtpbmcKICAgICAgKiB2YWx1ZXMgYWZ0ZXIgd2UgcmVhZCBhbnkgb3B0aW9uYWwgdmFsdWVzLgpAQCAtMjA1LDE1ICs5Myw4IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUtleWJvYXJkT3BlbiA9IGZhbHNlOwogCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBuYW1lIGluIHRoZSBrZXkgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhc3RLZXlOYW1lKCkgewotICAgICAgICByZXR1cm4gS0VZX05BTUVTW0tleUV2ZW50LmdldE1heEtleUNvZGUoKSArIDFdOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleU5hbWUoaW50IGtleWNvZGUpIHsKLSAgICAgICAgcmV0dXJuIEtFWV9OQU1FU1trZXljb2RlXTsKKyAgICAgICAgcmV0dXJuIEtleUV2ZW50LmtleUNvZGVUb1N0cmluZyhrZXljb2RlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyNCwxMiArMTA1LDcgQEAKICAgICAgKiBAcmV0dXJucyB0aGUgaW50ZW5nZXIga2V5Q29kZSB2YWx1ZSwgb3IgLTEgaWYgbm90IGZvdW5kCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0S2V5Q29kZShTdHJpbmcga2V5TmFtZSkgewotICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IEtFWV9OQU1FUy5sZW5ndGg7IHgrKykgewotICAgICAgICAgICAgaWYgKEtFWV9OQU1FU1t4XS5lcXVhbHMoa2V5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBLZXlFdmVudC5rZXlDb2RlRnJvbVN0cmluZyhrZXlOYW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgTW9ua2V5U291cmNlUmFuZG9tKFJhbmRvbSByYW5kb20sIEFycmF5TGlzdDxDb21wb25lbnROYW1lPiBNYWluQXBwcywKQEAgLTI0NSw3ICsxMjEsOCBAQAogICAgICAgICBtRmFjdG9yc1tGQUNUT1JfU1lTT1BTXSA9IDIuMGY7CiAgICAgICAgIG1GYWN0b3JzW0ZBQ1RPUl9BUFBTV0lUQ0hdID0gMi4wZjsKICAgICAgICAgbUZhY3RvcnNbRkFDVE9SX0ZMSVBdID0gMS4wZjsKLSAgICAgICAgbUZhY3RvcnNbRkFDVE9SX0FOWVRISU5HXSA9IDE1LjBmOworICAgICAgICBtRmFjdG9yc1tGQUNUT1JfQU5ZVEhJTkddID0gMTMuMGY7CisgICAgICAgIG1GYWN0b3JzW0ZBQ1RPUl9QSU5DSFpPT01dID0gMi4wZjsKIAogICAgICAgICBtUmFuZG9tID0gcmFuZG9tOwogICAgICAgICBtTWFpbkFwcHMgPSBNYWluQXBwczsKQEAgLTM2Nyw0NiArMjQ0LDg0IEBACiAgICAgICogZ2VuZXJhdGUgZmxpbmcgZ2VzdHVyZXMsIHdoaWNoIGFyZSBpbXBvcnRhbnQpLgogICAgICAqCiAgICAgICogQHBhcmFtIHJhbmRvbSBSYW5kb20gbnVtYmVyIHNvdXJjZSBmb3IgcG9zaXRpb25pbmcKLSAgICAgKiBAcGFyYW0gbW90aW9uRXZlbnQgSWYgZmFsc2UsIHRvdWNoL3JlbGVhc2UuICBJZiB0cnVlLCB0b3VjaC9tb3ZlL3JlbGVhc2UuCisgICAgICogQHBhcmFtIGdlc3R1cmUgVGhlIGdlc3R1cmUgdG8gcGVyZm9ybS4KICAgICAgKgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1vdGlvbkV2ZW50KFJhbmRvbSByYW5kb20sIGJvb2xlYW4gbW90aW9uRXZlbnQpewotCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUG9pbnRlckV2ZW50KFJhbmRvbSByYW5kb20sIGludCBnZXN0dXJlKXsKICAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmdldERlZmF1bHREaXNwbGF5KCk7CiAKLSAgICAgICAgZmxvYXQgeCA9IE1hdGguYWJzKHJhbmRvbS5uZXh0SW50KCkgJSBkaXNwbGF5LmdldFdpZHRoKCkpOwotICAgICAgICBmbG9hdCB5ID0gTWF0aC5hYnMocmFuZG9tLm5leHRJbnQoKSAlIGRpc3BsYXkuZ2V0SGVpZ2h0KCkpOwotICAgICAgICBsb25nIGRvd25BdCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb25nIGV2ZW50VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBpZiAoZG93bkF0ID09IC0xKSB7Ci0gICAgICAgICAgICBkb3duQXQgPSBldmVudFRpbWU7Ci0gICAgICAgIH0KKyAgICAgICAgUG9pbnRGIHAxID0gcmFuZG9tUG9pbnQocmFuZG9tLCBkaXNwbGF5KTsKKyAgICAgICAgUG9pbnRGIHYxID0gcmFuZG9tVmVjdG9yKHJhbmRvbSk7CiAKLSAgICAgICAgTW9ua2V5TW90aW9uRXZlbnQgZSA9IG5ldyBNb25rZXlNb3Rpb25FdmVudChNb25rZXlFdmVudC5FVkVOVF9UWVBFX1BPSU5URVIsCi0gICAgICAgICAgICAgICAgZG93bkF0LCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgeCwgeSwgMCk7Ci0gICAgICAgIGUuc2V0SW50ZXJtZWRpYXRlTm90ZShmYWxzZSk7Ci0gICAgICAgIG1RLmFkZExhc3QoZSk7CisgICAgICAgIGxvbmcgZG93bkF0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisKKyAgICAgICAgbVEuYWRkTGFzdChuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikKKyAgICAgICAgICAgICAgICAuc2V0RG93blRpbWUoZG93bkF0KQorICAgICAgICAgICAgICAgIC5hZGRQb2ludGVyKDAsIHAxLngsIHAxLnkpCisgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUoZmFsc2UpKTsKIAogICAgICAgICAvLyBzb21ldGltZXMgd2UnbGwgbW92ZSBkdXJpbmcgdGhlIHRvdWNoCi0gICAgICAgIGlmIChtb3Rpb25FdmVudCkgeworICAgICAgICBpZiAoZ2VzdHVyZSA9PSBHRVNUVVJFX0RSQUcpIHsKICAgICAgICAgICAgIGludCBjb3VudCA9IHJhbmRvbS5uZXh0SW50KDEwKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHNvbWUgc2xvcCBpbiB0aGUgdXAgZXZlbnQKLSAgICAgICAgICAgICAgICB4ID0gKHggKyAocmFuZG9tLm5leHRJbnQoKSAlIDEwKSkgJSBkaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgeSA9ICh5ICsgKHJhbmRvbS5uZXh0SW50KCkgJSAxMCkpICUgZGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICByYW5kb21XYWxrKHJhbmRvbSwgZGlzcGxheSwgcDEsIHYxKTsKIAotICAgICAgICAgICAgICAgIGUgPSBuZXcgTW9ua2V5TW90aW9uRXZlbnQoTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9QT0lOVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkF0LCBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgeCwgeSwgMCk7Ci0gICAgICAgICAgICAgICAgZS5zZXRJbnRlcm1lZGlhdGVOb3RlKHRydWUpOwotICAgICAgICAgICAgICAgIG1RLmFkZExhc3QoZSk7CisgICAgICAgICAgICAgICAgbVEuYWRkTGFzdChuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREb3duVGltZShkb3duQXQpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCBwMS54LCBwMS55KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUodHJ1ZSkpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdlc3R1cmUgPT0gR0VTVFVSRV9QSU5DSF9PUl9aT09NKSB7CisgICAgICAgICAgICBQb2ludEYgcDIgPSByYW5kb21Qb2ludChyYW5kb20sIGRpc3BsYXkpOworICAgICAgICAgICAgUG9pbnRGIHYyID0gcmFuZG9tVmVjdG9yKHJhbmRvbSk7CisKKyAgICAgICAgICAgIHJhbmRvbVdhbGsocmFuZG9tLCBkaXNwbGF5LCBwMSwgdjEpOworICAgICAgICAgICAgbVEuYWRkTGFzdChuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMSA8PCBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXREb3duVGltZShkb3duQXQpCisgICAgICAgICAgICAgICAgICAgIC5hZGRQb2ludGVyKDAsIHAxLngsIHAxLnkpLmFkZFBvaW50ZXIoMSwgcDIueCwgcDIueSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUodHJ1ZSkpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSByYW5kb20ubmV4dEludCgxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICByYW5kb21XYWxrKHJhbmRvbSwgZGlzcGxheSwgcDEsIHYxKTsKKyAgICAgICAgICAgICAgICByYW5kb21XYWxrKHJhbmRvbSwgZGlzcGxheSwgcDIsIHYyKTsKKworICAgICAgICAgICAgICAgIG1RLmFkZExhc3QobmV3IE1vbmtleVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RG93blRpbWUoZG93bkF0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgcDEueCwgcDEueSkuYWRkUG9pbnRlcigxLCBwMi54LCBwMi55KQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUodHJ1ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYW5kb21XYWxrKHJhbmRvbSwgZGlzcGxheSwgcDEsIHYxKTsKKyAgICAgICAgICAgIHJhbmRvbVdhbGsocmFuZG9tLCBkaXNwbGF5LCBwMiwgdjIpOworICAgICAgICAgICAgbVEuYWRkTGFzdChuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDEgPDwgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpKQorICAgICAgICAgICAgICAgICAgICAuc2V0RG93blRpbWUoZG93bkF0KQorICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCBwMS54LCBwMS55KS5hZGRQb2ludGVyKDEsIHAyLngsIHAyLnkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcm1lZGlhdGVOb3RlKHRydWUpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFRPRE8gZ2VuZXJhdGUgc29tZSBzbG9wIGluIHRoZSB1cCBldmVudAotICAgICAgICBlID0gbmV3IE1vbmtleU1vdGlvbkV2ZW50KE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfUE9JTlRFUiwKLSAgICAgICAgICAgICAgICBkb3duQXQsIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgeCwgeSwgMCk7Ci0gICAgICAgIGUuc2V0SW50ZXJtZWRpYXRlTm90ZShmYWxzZSk7Ci0gICAgICAgIG1RLmFkZExhc3QoZSk7CisgICAgICAgIHJhbmRvbVdhbGsocmFuZG9tLCBkaXNwbGF5LCBwMSwgdjEpOworICAgICAgICBtUS5hZGRMYXN0KG5ldyBNb25rZXlUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9VUCkKKyAgICAgICAgICAgICAgICAuc2V0RG93blRpbWUoZG93bkF0KQorICAgICAgICAgICAgICAgIC5hZGRQb2ludGVyKDAsIHAxLngsIHAxLnkpCisgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUoZmFsc2UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBvaW50RiByYW5kb21Qb2ludChSYW5kb20gcmFuZG9tLCBEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludEYocmFuZG9tLm5leHRJbnQoZGlzcGxheS5nZXRXaWR0aCgpKSwgcmFuZG9tLm5leHRJbnQoZGlzcGxheS5nZXRIZWlnaHQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgUG9pbnRGIHJhbmRvbVZlY3RvcihSYW5kb20gcmFuZG9tKSB7CisgICAgICAgIHJldHVybiBuZXcgUG9pbnRGKChyYW5kb20ubmV4dEZsb2F0KCkgLSAwLjVmKSAqIDUwLCAocmFuZG9tLm5leHRGbG9hdCgpIC0gMC41ZikgKiA1MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJhbmRvbVdhbGsoUmFuZG9tIHJhbmRvbSwgRGlzcGxheSBkaXNwbGF5LCBQb2ludEYgcG9pbnQsIFBvaW50RiB2ZWN0b3IpIHsKKyAgICAgICAgcG9pbnQueCA9IChmbG9hdCkgTWF0aC5tYXgoTWF0aC5taW4ocG9pbnQueCArIHJhbmRvbS5uZXh0RmxvYXQoKSAqIHZlY3Rvci54LAorICAgICAgICAgICAgICAgIGRpc3BsYXkuZ2V0V2lkdGgoKSksIDApOworICAgICAgICBwb2ludC55ID0gKGZsb2F0KSBNYXRoLm1heChNYXRoLm1pbihwb2ludC55ICsgcmFuZG9tLm5leHRGbG9hdCgpICogdmVjdG9yLnksCisgICAgICAgICAgICAgICAgZGlzcGxheS5nZXRIZWlnaHQoKSksIDApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDI4LDM0ICszNDMsMjkgQEAKIAogICAgICAgICBib29sZWFuIGRyb3AgPSBmYWxzZTsKICAgICAgICAgaW50IGNvdW50ID0gcmFuZG9tLm5leHRJbnQoMTApOwotICAgICAgICBNb25rZXlNb3Rpb25FdmVudCBlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGEgc21hbGwgcmFuZG9tIHN0ZXAKICAgICAgICAgICAgIGludCBkWCA9IHJhbmRvbS5uZXh0SW50KDEwKSAtIDU7CiAgICAgICAgICAgICBpbnQgZFkgPSByYW5kb20ubmV4dEludCgxMCkgLSA1OwogCi0KLSAgICAgICAgICAgIGUgPSBuZXcgTW9ua2V5TW90aW9uRXZlbnQoTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UUkFDS0JBTEwsIC0xLAotICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgZFgsIGRZLCAwKTsKLSAgICAgICAgICAgIGUuc2V0SW50ZXJtZWRpYXRlTm90ZShpID4gMCk7Ci0gICAgICAgICAgICBtUS5hZGRMYXN0KGUpOworICAgICAgICAgICAgbVEuYWRkTGFzdChuZXcgTW9ua2V5VHJhY2tiYWxsRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpCisgICAgICAgICAgICAgICAgICAgIC5hZGRQb2ludGVyKDAsIGRYLCBkWSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUoaSA+IDApKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIDEwJSBvZiB0cmFja2JhbGwgbW92ZXMgZW5kIHdpdGggYSBjbGljawogICAgICAgICBpZiAoMCA9PSByYW5kb20ubmV4dEludCgxMCkpIHsKICAgICAgICAgICAgIGxvbmcgZG93bkF0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAKKyAgICAgICAgICAgIG1RLmFkZExhc3QobmV3IE1vbmtleVRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKQorICAgICAgICAgICAgICAgICAgICAuc2V0RG93blRpbWUoZG93bkF0KQorICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJtZWRpYXRlTm90ZSh0cnVlKSk7CiAKLSAgICAgICAgICAgIGUgPSBuZXcgTW9ua2V5TW90aW9uRXZlbnQoTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UUkFDS0JBTEwsIGRvd25BdCwKLSAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDAsIDAsIDApOwotICAgICAgICAgICAgZS5zZXRJbnRlcm1lZGlhdGVOb3RlKHRydWUpOwotICAgICAgICAgICAgbVEuYWRkTGFzdChlKTsKLQotCi0gICAgICAgICAgICBlID0gbmV3IE1vbmtleU1vdGlvbkV2ZW50KE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfVFJBQ0tCQUxMLCBkb3duQXQsCi0gICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICBlLnNldEludGVybWVkaWF0ZU5vdGUoZmFsc2UpOwotICAgICAgICAgICAgbVEuYWRkTGFzdChlKTsKKyAgICAgICAgICAgIG1RLmFkZExhc3QobmV3IE1vbmtleVRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9VUCkKKyAgICAgICAgICAgICAgICAgICAgLnNldERvd25UaW1lKGRvd25BdCkKKyAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgMCwgMCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVybWVkaWF0ZU5vdGUoZmFsc2UpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDY2LDE0ICszNzYsMTYgQEAKICAgICAgICAgZmxvYXQgY2xzID0gbVJhbmRvbS5uZXh0RmxvYXQoKTsKICAgICAgICAgaW50IGxhc3RLZXkgPSAwOwogCi0gICAgICAgIGJvb2xlYW4gdG91Y2hFdmVudCA9IGNscyA8IG1GYWN0b3JzW0ZBQ1RPUl9UT1VDSF07Ci0gICAgICAgIGJvb2xlYW4gbW90aW9uRXZlbnQgPSAhdG91Y2hFdmVudCAmJiAoY2xzIDwgbUZhY3RvcnNbRkFDVE9SX01PVElPTl0pOwotICAgICAgICBpZiAodG91Y2hFdmVudCB8fCBtb3Rpb25FdmVudCkgewotICAgICAgICAgICAgZ2VuZXJhdGVNb3Rpb25FdmVudChtUmFuZG9tLCBtb3Rpb25FdmVudCk7CisgICAgICAgIGlmIChjbHMgPCBtRmFjdG9yc1tGQUNUT1JfVE9VQ0hdKSB7CisgICAgICAgICAgICBnZW5lcmF0ZVBvaW50ZXJFdmVudChtUmFuZG9tLCBHRVNUVVJFX1RBUCk7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xzIDwgbUZhY3RvcnNbRkFDVE9SX1RSQUNLQkFMTF0pIHsKKyAgICAgICAgfSBlbHNlIGlmIChjbHMgPCBtRmFjdG9yc1tGQUNUT1JfTU9USU9OXSkgeworICAgICAgICAgICAgZ2VuZXJhdGVQb2ludGVyRXZlbnQobVJhbmRvbSwgR0VTVFVSRV9EUkFHKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChjbHMgPCBtRmFjdG9yc1tGQUNUT1JfUElOQ0haT09NXSkgeworICAgICAgICAgICAgZ2VuZXJhdGVQb2ludGVyRXZlbnQobVJhbmRvbSwgR0VTVFVSRV9QSU5DSF9PUl9aT09NKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChjbHMgPCBtRmFjdG9yc1tGQUNUT1JfVFJBQ0tCQUxMXSkgewogICAgICAgICAgICAgZ2VuZXJhdGVUcmFja2JhbGxFdmVudChtUmFuZG9tKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VTY3JpcHQuamF2YSBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5U291cmNlU2NyaXB0LmphdmEKaW5kZXggNmRlZmNiMC4uMDllYzhlOSAxMDA2NDQKLS0tIGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlTb3VyY2VTY3JpcHQuamF2YQorKysgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleVNvdXJjZVNjcmlwdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTExMiw2ICsxMTMsMTAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9LRVlXT1JEX0lOUFVUX1NUUklORyA9ICJEaXNwYXRjaFN0cmluZyI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfS0VZV09SRF9QUkVTU0FOREhPTEQgPSAiUHJlc3NBbmRIb2xkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9LRVlXT1JEX0RSQUcgPSAiRHJhZyI7CisKICAgICAvLyBhIGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUSU5HX0RBVEFfTElORSA9ICJzdGFydCBkYXRhID4+IjsKIApAQCAtMjY3LDEyICsyNzIsMjEgQEAKICAgICAgICAgICAgICAgICBmbG9hdCB5UHJlY2lzaW9uID0gRmxvYXQucGFyc2VGbG9hdChhcmdzWzldKTsKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlID0gSW50ZWdlci5wYXJzZUludChhcmdzWzEwXSk7CiAgICAgICAgICAgICAgICAgaW50IGVkZ2VGbGFncyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxMV0pOwotICAgICAgICAgICAgICAgIGludCB0eXBlID0gTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UUkFDS0JBTEw7CisKKyAgICAgICAgICAgICAgICBNb25rZXlNb3Rpb25FdmVudCBlOwogICAgICAgICAgICAgICAgIGlmIChzLmluZGV4T2YoIlBvaW50ZXIiKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyBNb25rZXlUb3VjaEV2ZW50KGFjdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyBNb25rZXlUcmFja2JhbGxFdmVudChhY3Rpb24pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNb25rZXlNb3Rpb25FdmVudCBlID0gbmV3IE1vbmtleU1vdGlvbkV2ZW50KHR5cGUsIGRvd25UaW1lLCBldmVudFRpbWUsIGFjdGlvbiwgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHksIHByZXNzdXJlLCBzaXplLCBtZXRhU3RhdGUsIHhQcmVjaXNpb24sIHlQcmVjaXNpb24sIGRldmljZSwgZWRnZUZsYWdzKTsKKworICAgICAgICAgICAgICAgIGUuc2V0RG93blRpbWUoZG93blRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXZlbnRUaW1lKGV2ZW50VGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhU3RhdGUobWV0YVN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZWNpc2lvbih4UHJlY2lzaW9uLCB5UHJlY2lzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERldmljZUlkKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFZGdlRmxhZ3MoZWRnZUZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgeCwgeSwgcHJlc3N1cmUsIHNpemUpOwogICAgICAgICAgICAgICAgIG1RLmFkZExhc3QoZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgfQpAQCAtMjg3LDI1ICszMDEsNDUgQEAKIAogICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGZsb2F0IHByZXNzdXJlID0gMTsKLSAgICAgICAgICAgICAgICBmbG9hdCB4UHJlY2lzaW9uID0gMTsKLSAgICAgICAgICAgICAgICBmbG9hdCB5UHJlY2lzaW9uID0gMTsKLSAgICAgICAgICAgICAgICBpbnQgZWRnZUZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBmbG9hdCBzaXplID0gNTsKLSAgICAgICAgICAgICAgICBpbnQgZGV2aWNlID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgbWV0YVN0YXRlID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfUE9JTlRFUjsKIAotICAgICAgICAgICAgICAgIE1vbmtleU1vdGlvbkV2ZW50IGUxID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb25rZXlNb3Rpb25FdmVudCh0eXBlLCBkb3duVGltZSwgZG93blRpbWUsIEtleUV2ZW50LkFDVElPTl9ET1dOLCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBwcmVzc3VyZSwgc2l6ZSwgbWV0YVN0YXRlLCB4UHJlY2lzaW9uLCB5UHJlY2lzaW9uLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VGbGFncyk7Ci0gICAgICAgICAgICAgICAgTW9ua2V5TW90aW9uRXZlbnQgZTIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vbmtleU1vdGlvbkV2ZW50KHR5cGUsIGRvd25UaW1lLCBkb3duVGltZSwgS2V5RXZlbnQuQUNUSU9OX1VQLCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBwcmVzc3VyZSwgc2l6ZSwgbWV0YVN0YXRlLCB4UHJlY2lzaW9uLCB5UHJlY2lzaW9uLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VGbGFncyk7CisgICAgICAgICAgICAgICAgTW9ua2V5TW90aW9uRXZlbnQgZTEgPSBuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREb3duVGltZShkb3duVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFdmVudFRpbWUoZG93blRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCB4LCB5LCAxLCA1KTsKKyAgICAgICAgICAgICAgICBNb25rZXlNb3Rpb25FdmVudCBlMiA9IG5ldyBNb25rZXlUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9VUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREb3duVGltZShkb3duVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFdmVudFRpbWUoZG93blRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCB4LCB5LCAxLCA1KTsKICAgICAgICAgICAgICAgICBtUS5hZGRMYXN0KGUxKTsKICAgICAgICAgICAgICAgICBtUS5hZGRMYXN0KGUyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIvLyAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vSGFuZGxlIHRoZSBwcmVzcyBhbmQgaG9sZAorICAgICAgICBpZiAoKHMuaW5kZXhPZihFVkVOVF9LRVlXT1JEX1BSRVNTQU5ESE9MRCkgPj0gMCkgJiYgYXJncy5sZW5ndGggPT0gMykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmbG9hdCB4ID0gRmxvYXQucGFyc2VGbG9hdChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB5ID0gRmxvYXQucGFyc2VGbG9hdChhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBsb25nIHByZXNzRHVyYXRpb24gPSBMb25nLnBhcnNlTG9uZyhhcmdzWzJdKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgTW9ua2V5TW90aW9uRXZlbnQgZTEgPSBuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREb3duVGltZShkb3duVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFdmVudFRpbWUoZG93blRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUG9pbnRlcigwLCB4LCB5LCAxLCA1KTsKKyAgICAgICAgICAgICAgICBNb25rZXlXYWl0RXZlbnQgZTIgPSBuZXcgTW9ua2V5V2FpdEV2ZW50KHByZXNzRHVyYXRpb24pOworICAgICAgICAgICAgICAgIE1vbmtleU1vdGlvbkV2ZW50IGUzID0gbmV3IE1vbmtleVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX1VQKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldERvd25UaW1lKGRvd25UaW1lICsgcHJlc3NEdXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFdmVudFRpbWUoZG93blRpbWUgKyBwcmVzc0R1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBvaW50ZXIoMCwgeCwgeSwgMSwgNSk7CisgICAgICAgICAgICAgICAgbVEuYWRkTGFzdChlMSk7CisgICAgICAgICAgICAgICAgbVEuYWRkTGFzdChlMik7CisgICAgICAgICAgICAgICAgbVEuYWRkTGFzdChlMik7CiAKICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIvLyAiICsgZS50b1N0cmluZygpKTsKQEAgLTMxMyw2ICszNDcsNDQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIC8vIEhhbmRsZSBkcmFnIGV2ZW50CisgICAgICAgIGlmICgocy5pbmRleE9mKEVWRU5UX0tFWVdPUkRfRFJBRykgPj0gMCkgJiYgYXJncy5sZW5ndGggPT0gNSkgeworICAgICAgICAgICAgZmxvYXQgeFN0YXJ0ID0gRmxvYXQucGFyc2VGbG9hdChhcmdzWzBdKTsKKyAgICAgICAgICAgIGZsb2F0IHlTdGFydCA9IEZsb2F0LnBhcnNlRmxvYXQoYXJnc1sxXSk7CisgICAgICAgICAgICBmbG9hdCB4RW5kID0gRmxvYXQucGFyc2VGbG9hdChhcmdzWzJdKTsKKyAgICAgICAgICAgIGZsb2F0IHlFbmQgPSBGbG9hdC5wYXJzZUZsb2F0KGFyZ3NbM10pOworICAgICAgICAgICAgaW50IHN0ZXBDb3VudCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1s0XSk7CisKKyAgICAgICAgICAgIGZsb2F0IHggPSB4U3RhcnQ7CisgICAgICAgICAgICBmbG9hdCB5ID0geVN0YXJ0OworICAgICAgICAgICAgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9uZyBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgaWYgKHN0ZXBDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB4U3RlcCA9ICh4RW5kIC0geFN0YXJ0KSAvIHN0ZXBDb3VudDsKKyAgICAgICAgICAgICAgICBmbG9hdCB5U3RlcCA9ICh5RW5kIC0geVN0YXJ0KSAvIHN0ZXBDb3VudDsKKworICAgICAgICAgICAgICAgIE1vbmtleU1vdGlvbkV2ZW50IGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vbmtleVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pLnNldERvd25UaW1lKGRvd25UaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXZlbnRUaW1lKGV2ZW50VGltZSkuYWRkUG9pbnRlcigwLCB4LCB5LCAxLCA1KTsKKyAgICAgICAgICAgICAgICBtUS5hZGRMYXN0KGUpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICB4ICs9IHhTdGVwOworICAgICAgICAgICAgICAgICAgICB5ICs9IHlTdGVwOworICAgICAgICAgICAgICAgICAgICBldmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyBNb25rZXlUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKS5zZXREb3duVGltZShkb3duVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFdmVudFRpbWUoZXZlbnRUaW1lKS5hZGRQb2ludGVyKDAsIHgsIHksIDEsIDUpOworICAgICAgICAgICAgICAgICAgICBtUS5hZGRMYXN0KGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV2ZW50VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGUgPSBuZXcgTW9ua2V5VG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fVVApLnNldERvd25UaW1lKGRvd25UaW1lKQorICAgICAgICAgICAgICAgICAgICAuc2V0RXZlbnRUaW1lKGV2ZW50VGltZSkuYWRkUG9pbnRlcigwLCB4LCB5LCAxLCA1KTsKKyAgICAgICAgICAgICAgICBtUS5hZGRMYXN0KGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gSGFuZGxlIGZsaXAgZXZlbnRzCiAgICAgICAgIGlmIChzLmluZGV4T2YoRVZFTlRfS0VZV09SRF9GTElQKSA+PSAwICYmIGFyZ3MubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgIGJvb2xlYW4ga2V5Ym9hcmRPcGVuID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXJnc1swXSk7CkBAIC01OTcsNDEgKzY2OSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkanVzdCBtb3Rpb24gZG93bnRpbWUgYW5kIGV2ZW50dGltZSBhY2NvcmRpbmcgdG8gYm90aCByZWNvcmRlZCB2YWx1ZXMKLSAgICAgKiBhbmQgY3VycmVudCBzeXN0ZW0gdGltZS4KKyAgICAgKiBBZGp1c3QgbW90aW9uIGRvd250aW1lIGFuZCBldmVudHRpbWUgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc3lzdGVtIHRpbWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZSBBIEtleUV2ZW50CiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGFkanVzdE1vdGlvbkV2ZW50VGltZShNb25rZXlNb3Rpb25FdmVudCBlKSB7CisgICAgICAgIGxvbmcgdXBkYXRlZERvd25UaW1lID0gMDsKKwogICAgICAgICBpZiAoZS5nZXRFdmVudFRpbWUoKSA8IDApIHsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRoaXNEb3duVGltZSA9IDA7Ci0gICAgICAgIGxvbmcgdGhpc0V2ZW50VGltZSA9IDA7Ci0gICAgICAgIGxvbmcgZXhwZWN0ZWREZWxheSA9IDA7Ci0KLSAgICAgICAgaWYgKG1MYXN0UmVjb3JkZWRFdmVudFRpbWUgPD0gMCkgewotICAgICAgICAgICAgLy8gZmlyc3QgdGltZSBldmVudAotICAgICAgICAgICAgdGhpc0Rvd25UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB0aGlzRXZlbnRUaW1lID0gdGhpc0Rvd25UaW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGUuZ2V0RG93blRpbWUoKSAhPSBtTGFzdFJlY29yZGVkRG93blRpbWVNb3Rpb24pIHsKLSAgICAgICAgICAgICAgICB0aGlzRG93blRpbWUgPSBlLmdldERvd25UaW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXNEb3duVGltZSA9IG1MYXN0RXhwb3J0RG93blRpbWVNb3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHBlY3RlZERlbGF5ID0gKGxvbmcpICgoZS5nZXRFdmVudFRpbWUoKSAtIG1MYXN0UmVjb3JkZWRFdmVudFRpbWUpICogbVNwZWVkKTsKLSAgICAgICAgICAgIHRoaXNFdmVudFRpbWUgPSBtTGFzdEV4cG9ydEV2ZW50VGltZSArIGV4cGVjdGVkRGVsYXk7Ci0gICAgICAgICAgICAvLyBhZGQgc2xlZXAgdG8gc2ltdWxhdGUgZXZlcnl0aGluZyBpbiByZWNvcmRpbmcKLSAgICAgICAgICAgIG5lZWRTbGVlcChleHBlY3RlZERlbGF5IC0gU0xFRVBfQ09NUEVOU0FURV9ESUZGKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1MYXN0UmVjb3JkZWREb3duVGltZU1vdGlvbiA9IGUuZ2V0RG93blRpbWUoKTsKLSAgICAgICAgbUxhc3RSZWNvcmRlZEV2ZW50VGltZSA9IGUuZ2V0RXZlbnRUaW1lKCk7Ci0gICAgICAgIGUuc2V0RG93blRpbWUodGhpc0Rvd25UaW1lKTsKLSAgICAgICAgZS5zZXRFdmVudFRpbWUodGhpc0V2ZW50VGltZSk7Ci0gICAgICAgIG1MYXN0RXhwb3J0RG93blRpbWVNb3Rpb24gPSB0aGlzRG93blRpbWU7Ci0gICAgICAgIG1MYXN0RXhwb3J0RXZlbnRUaW1lID0gdGhpc0V2ZW50VGltZTsKKyAgICAgICAgfSAgICAgIAorICAgICAgICB1cGRhdGVkRG93blRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgZS5zZXREb3duVGltZSh1cGRhdGVkRG93blRpbWUpOworICAgICAgICBlLnNldEV2ZW50VGltZSh1cGRhdGVkRG93blRpbWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjY1LDcgKzcxNSw3IEBACiAKICAgICAgICAgaWYgKGV2LmdldEV2ZW50VHlwZSgpID09IE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfS0VZKSB7CiAgICAgICAgICAgICBhZGp1c3RLZXlFdmVudFRpbWUoKE1vbmtleUtleUV2ZW50KSBldik7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXYuZ2V0RXZlbnRUeXBlKCkgPT0gTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9QT0lOVEVSCisgICAgICAgIH0gZWxzZSBpZiAoZXYuZ2V0RXZlbnRUeXBlKCkgPT0gTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UT1VDSAogICAgICAgICAgICAgICAgIHx8IGV2LmdldEV2ZW50VHlwZSgpID09IE1vbmtleUV2ZW50LkVWRU5UX1RZUEVfVFJBQ0tCQUxMKSB7CiAgICAgICAgICAgICBhZGp1c3RNb3Rpb25FdmVudFRpbWUoKE1vbmtleU1vdGlvbkV2ZW50KSBldik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5VG91Y2hFdmVudC5qYXZhIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlUb3VjaEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5MWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvbW9ua2V5L3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9tb25rZXkvTW9ua2V5VG91Y2hFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbW1hbmRzLm1vbmtleTsKKworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCisKKy8qKgorICogbW9ua2V5IHRvdWNoIGV2ZW50CisgKi8KK3B1YmxpYyBjbGFzcyBNb25rZXlUb3VjaEV2ZW50IGV4dGVuZHMgTW9ua2V5TW90aW9uRXZlbnQgeworICAgIHB1YmxpYyBNb25rZXlUb3VjaEV2ZW50KGludCBhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIoTW9ua2V5RXZlbnQuRVZFTlRfVFlQRV9UT1VDSCwgSW5wdXREZXZpY2UuU09VUkNFX1RPVUNIU0NSRUVOLCBhY3Rpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gIlRvdWNoIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmplY3RNb3Rpb25FdmVudChJV2luZG93TWFuYWdlciBpd20sIE1vdGlvbkV2ZW50IG1lKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpd20uaW5qZWN0UG9pbnRlckV2ZW50KG1lLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlUcmFja2JhbGxFdmVudC5qYXZhIGIvY21kcy9tb25rZXkvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL21vbmtleS9Nb25rZXlUcmFja2JhbGxFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzNiZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL21vbmtleS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvbW9ua2V5L01vbmtleVRyYWNrYmFsbEV2ZW50LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY29tbWFuZHMubW9ua2V5OworCitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKKworLyoqCisgKiBtb25rZXkgdHJhY2tiYWxsIGV2ZW50CisgKi8KK3B1YmxpYyBjbGFzcyBNb25rZXlUcmFja2JhbGxFdmVudCBleHRlbmRzIE1vbmtleU1vdGlvbkV2ZW50IHsKKyAgICBwdWJsaWMgTW9ua2V5VHJhY2tiYWxsRXZlbnQoaW50IGFjdGlvbikgeworICAgICAgICBzdXBlcihNb25rZXlFdmVudC5FVkVOVF9UWVBFX1RSQUNLQkFMTCwgSW5wdXREZXZpY2UuU09VUkNFX1RSQUNLQkFMTCwgYWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICJUcmFja2JhbGwiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGluamVjdE1vdGlvbkV2ZW50KElXaW5kb3dNYW5hZ2VyIGl3bSwgTW90aW9uRXZlbnQgbWUpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGl3bS5pbmplY3RUcmFja2JhbGxFdmVudChtZSwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9hc20udHh0IGIvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2FzbS50eHQKaW5kZXggZGEwM2Y0Ny4uZjMzYzg2ZCAxMDA2NDQKLS0tIGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2FzbS50eHQKKysrIGIvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2FzbS50eHQKQEAgLTEsNCArMSw0IEBACi07IENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7IENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiA7CiA7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvYmFzaC50eHQgYi9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvYmFzaC50eHQKaW5kZXggN2EwY2JkNC4uYWU5MGE4NyAxMDA2NDQKLS0tIGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2Jhc2gudHh0CisrKyBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9iYXNoLnR4dApAQCAtMSw2ICsxLDYgQEAKICMhL2Jpbi9iYXNoCiAjCi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvYnNkL2MudHh0IGIvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2JzZC9jLnR4dAppbmRleCA1NmU1Mjk0Li4zOWU3N2YwIDEwMDY0NAotLS0gYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvYnNkL2MudHh0CisrKyBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9ic2QvYy50eHQKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2MudHh0IGIvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2MudHh0CmluZGV4IGUzZGQ1ZWUuLmVmYTUwZjMgMTAwNjQ0Ci0tLSBhL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9jLnR4dAorKysgYi9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvYy50eHQKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvamF2YS50eHQgYi9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvamF2YS50eHQKaW5kZXggZTNkZDVlZS4uZWZhNTBmMyAxMDA2NDQKLS0tIGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL2phdmEudHh0CisrKyBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9qYXZhLnR4dApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9tYWtlLnR4dCBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9tYWtlLnR4dAppbmRleCAwMWEwZmYzLi44NTFhN2E4IDEwMDY0NAotLS0gYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvbWFrZS50eHQKKysrIGIvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL21ha2UudHh0CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL3BsYWluLnR4dCBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9wbGFpbi50eHQKaW5kZXggZGE5N2QyOS4uMTJmMTAxNiAxMDA2NDQKLS0tIGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL3BsYWluLnR4dAorKysgYi9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvcGxhaW4udHh0CkBAIC0xLDQgKzEsNCBAQAotQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0NvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL3NoLnR4dCBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy9zaC50eHQKaW5kZXggZmJlOWQ1ZS4uN2EzYWRiOCAxMDA2NDQKLS0tIGEvZG9jcy9jb3B5cmlnaHQtdGVtcGxhdGVzL3NoLnR4dAorKysgYi9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMvc2gudHh0CkBAIC0xLDYgKzEsNiBAQAogIyEvYmluL3NoCiAjCi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kb2NzL2NvcHlyaWdodC10ZW1wbGF0ZXMveG1sLnR4dCBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy94bWwudHh0CmluZGV4IGI0Nzk2NTQuLjFiZTAxOTEgMTAwNjQ0Ci0tLSBhL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy94bWwudHh0CisrKyBiL2RvY3MvY29weXJpZ2h0LXRlbXBsYXRlcy94bWwudHh0CkBAIC0xLDUgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aCBiL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKaW5kZXggZGViZjlhMS4uMTMyMzI4NyAxMDA2NDQKLS0tIGEvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aAorKysgYi9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCkBAIC0xLDYgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9BY2NvdW50c0FuZFN5bmNTZXR0aW5ncy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9hcHBzL0JsdWV0b290aC9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9hcHBzL0Jyb3dzZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9DYWxlbmRhci9zcmMiLz4KQEAgLTEwLDYgKzksOCBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvQ29udGFjdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9EZXNrQ2xvY2svc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9FbWFpbC9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9hcHBzL0VtYWlsL2VtYWlsY29tbW9uL3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvRXhjaGFuZ2Uvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9HYWxsZXJ5M0Qvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9IVE1MVmlld2VyL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvTGF1bmNoZXIyL3NyYyIvPgpAQCAtMjEsNyArMjIsNiBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvU2V0dGluZ3Mvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvYXBwcy9Tb3VuZFJlY29yZGVyL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvU3RrL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvVGFnL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL2FwcHMvVm9pY2VEaWFsZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0NhbGVuZGFyUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0NvbnRhY3RzUHJvdmlkZXIvc3JjIi8+CkBAIC0yOSwyMCArMjksMjIgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvRHJtUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL01lZGlhUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL1RlbGVwaG9ueVByb3ZpZGVyL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9hd3QiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9hbS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9pbnB1dC9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9wbS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9zdmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jb3JlL2NvbmZpZy9zZGsiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvZHJtL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvZ3JhcGhpY3MvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9pY3U0ai9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2tleXN0b3JlL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvbG9jYXRpb24vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL29iZXgiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvb3BlbmdsL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMvU3lzdGVtVUkvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3BvbGljeS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvc2F4L2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvamF2YSIvPgpAQCAtNTEsNyArNTMsOSBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS92b2lwL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdnBuL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2Uvd2lmaS9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9leC9jYXJvdXNlbC9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9leC9jb21tb24vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3Mvb3B0L3ZjYXJkL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvdGVzdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvc2FtcGxlcy9Db21wYXNzL3NyYyIvPgpAQCAtNjksNyArNzMsNiBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvU25ha2UvdGVzdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvYXBwcy9UZXJtL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvZGFsdmlrL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2ljdS9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9qc29uL3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2p1bml0L3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2x1bmkvc3JjL21haW4vamF2YSIvPgpAQCAtNzgsMTAgKzgxLDEzIEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvQnJvd3Nlcl9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9DYWxlbmRhclByb3ZpZGVyX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0NvbnRhY3RzUHJvdmlkZXJfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvRW1haWxfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvTGF1bmNoZXIyX2ludGVybWVkaWF0ZXMvc3JjL3JlbmRlcnNjcmlwdC9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9NZWRpYVByb3ZpZGVyX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL011c2ljX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL1Bob25lX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL1F1aWNrU2VhcmNoQm94X2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkLWNvbW1vbi1jYXJvdXNlbF9pbnRlcm1lZGlhdGVzL3NyYy9yZW5kZXJzY3JpcHQvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvbS5hbmRyb2lkLmVtYWlsY29tbW9uX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9sb2NhdGlvbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9tZWRpYS9qYXZhIi8+CkBAIC05MSwxMCArOTcsMTUgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3dpZmkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9zZXJ2aWNlc19pbnRlcm1lZGlhdGVzL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL1IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC90YWdzb3VwL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2FwYWNoZS1odHRwL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2JvdW5jeWNhc3RsZS9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC9uaXN0LXNpcC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvdGFnc291cC9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYm91bmN5Y2FzdGxlX2ludGVybWVkaWF0ZXMvY2xhc3Nlcy1qYXJqYXIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQtc3VwcG9ydC12NF9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2dvb2dsZS1jb21tb25faW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9nc2YtY2xpZW50X2ludGVybWVkaWF0ZXMvamF2YWxpYi5qYXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZ3VhdmFfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InBhY2thZ2VzL2FwcHMvQ2FsY3VsYXRvci9hcml0eS0yLjEuMi5qYXIiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZF9zdHVic19jdXJyZW50X2ludGVybWVkaWF0ZXMvY2xhc3NlcyIvPgpkaWZmIC0tZ2l0IGEvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2FyY2gtYXJtL2xpYi9saWJhbmRyb2lkLnNvIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2FyY2gtYXJtL2xpYi9saWJhbmRyb2lkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkY2U4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvYXJjaC1hcm0vbGliL2xpYmFuZHJvaWQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2FyY2gtYXJtL3N5bWJvbHMvbGliYW5kcm9pZC5zby50eHQgYi9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvYXJjaC1hcm0vc3ltYm9scy9saWJhbmRyb2lkLnNvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFhN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2FyY2gtYXJtL3N5bWJvbHMvbGliYW5kcm9pZC5zby50eHQKQEAgLTAsMCArMSwxNTMgQEAKK0FBc3NldERpcl9jbG9zZQorQUFzc2V0RGlyX2dldE5leHRGaWxlTmFtZQorQUFzc2V0RGlyX3Jld2luZAorQUFzc2V0TWFuYWdlcl9mcm9tSmF2YQorQUFzc2V0TWFuYWdlcl9vcGVuCitBQXNzZXRNYW5hZ2VyX29wZW5EaXIKK0FBc3NldF9jbG9zZQorQUFzc2V0X2dldEJ1ZmZlcgorQUFzc2V0X2dldExlbmd0aAorQUFzc2V0X2dldExlbmd0aDY0CitBQXNzZXRfZ2V0UmVtYWluaW5nTGVuZ3RoCitBQXNzZXRfZ2V0UmVtYWluaW5nTGVuZ3RoNjQKK0FBc3NldF9pc0FsbG9jYXRlZAorQUFzc2V0X29wZW5GaWxlRGVzY3JpcHRvcgorQUFzc2V0X29wZW5GaWxlRGVzY3JpcHRvcjY0CitBQXNzZXRfcmVhZAorQUFzc2V0X3NlZWsKK0FBc3NldF9zZWVrNjQKK0FDb25maWd1cmF0aW9uX2NvcHkKK0FDb25maWd1cmF0aW9uX2RlbGV0ZQorQUNvbmZpZ3VyYXRpb25fZGlmZgorQUNvbmZpZ3VyYXRpb25fZnJvbUFzc2V0TWFuYWdlcgorQUNvbmZpZ3VyYXRpb25fZ2V0Q291bnRyeQorQUNvbmZpZ3VyYXRpb25fZ2V0RGVuc2l0eQorQUNvbmZpZ3VyYXRpb25fZ2V0S2V5Ym9hcmQKK0FDb25maWd1cmF0aW9uX2dldEtleXNIaWRkZW4KK0FDb25maWd1cmF0aW9uX2dldExhbmd1YWdlCitBQ29uZmlndXJhdGlvbl9nZXRNY2MKK0FDb25maWd1cmF0aW9uX2dldE1uYworQUNvbmZpZ3VyYXRpb25fZ2V0TmF2SGlkZGVuCitBQ29uZmlndXJhdGlvbl9nZXROYXZpZ2F0aW9uCitBQ29uZmlndXJhdGlvbl9nZXRPcmllbnRhdGlvbgorQUNvbmZpZ3VyYXRpb25fZ2V0U2NyZWVuTG9uZworQUNvbmZpZ3VyYXRpb25fZ2V0U2NyZWVuU2l6ZQorQUNvbmZpZ3VyYXRpb25fZ2V0U2RrVmVyc2lvbgorQUNvbmZpZ3VyYXRpb25fZ2V0VG91Y2hzY3JlZW4KK0FDb25maWd1cmF0aW9uX2dldFVpTW9kZU5pZ2h0CitBQ29uZmlndXJhdGlvbl9nZXRVaU1vZGVUeXBlCitBQ29uZmlndXJhdGlvbl9pc0JldHRlclRoYW4KK0FDb25maWd1cmF0aW9uX21hdGNoCitBQ29uZmlndXJhdGlvbl9uZXcKK0FDb25maWd1cmF0aW9uX3NldENvdW50cnkKK0FDb25maWd1cmF0aW9uX3NldERlbnNpdHkKK0FDb25maWd1cmF0aW9uX3NldEtleWJvYXJkCitBQ29uZmlndXJhdGlvbl9zZXRLZXlzSGlkZGVuCitBQ29uZmlndXJhdGlvbl9zZXRMYW5ndWFnZQorQUNvbmZpZ3VyYXRpb25fc2V0TWNjCitBQ29uZmlndXJhdGlvbl9zZXRNbmMKK0FDb25maWd1cmF0aW9uX3NldE5hdkhpZGRlbgorQUNvbmZpZ3VyYXRpb25fc2V0TmF2aWdhdGlvbgorQUNvbmZpZ3VyYXRpb25fc2V0T3JpZW50YXRpb24KK0FDb25maWd1cmF0aW9uX3NldFNjcmVlbkxvbmcKK0FDb25maWd1cmF0aW9uX3NldFNjcmVlblNpemUKK0FDb25maWd1cmF0aW9uX3NldFNka1ZlcnNpb24KK0FDb25maWd1cmF0aW9uX3NldFRvdWNoc2NyZWVuCitBQ29uZmlndXJhdGlvbl9zZXRVaU1vZGVOaWdodAorQUNvbmZpZ3VyYXRpb25fc2V0VWlNb2RlVHlwZQorQUlucHV0RXZlbnRfZ2V0RGV2aWNlSWQKK0FJbnB1dEV2ZW50X2dldFNvdXJjZQorQUlucHV0RXZlbnRfZ2V0VHlwZQorQUlucHV0UXVldWVfYXR0YWNoTG9vcGVyCitBSW5wdXRRdWV1ZV9kZXRhY2hMb29wZXIKK0FJbnB1dFF1ZXVlX2ZpbmlzaEV2ZW50CitBSW5wdXRRdWV1ZV9nZXRFdmVudAorQUlucHV0UXVldWVfaGFzRXZlbnRzCitBSW5wdXRRdWV1ZV9wcmVEaXNwYXRjaEV2ZW50CitBS2V5RXZlbnRfZ2V0QWN0aW9uCitBS2V5RXZlbnRfZ2V0RG93blRpbWUKK0FLZXlFdmVudF9nZXRFdmVudFRpbWUKK0FLZXlFdmVudF9nZXRGbGFncworQUtleUV2ZW50X2dldEtleUNvZGUKK0FLZXlFdmVudF9nZXRNZXRhU3RhdGUKK0FLZXlFdmVudF9nZXRSZXBlYXRDb3VudAorQUtleUV2ZW50X2dldFNjYW5Db2RlCitBTG9vcGVyX2FjcXVpcmUKK0FMb29wZXJfYWRkRmQKK0FMb29wZXJfZm9yVGhyZWFkCitBTG9vcGVyX3BvbGxBbGwKK0FMb29wZXJfcG9sbE9uY2UKK0FMb29wZXJfcHJlcGFyZQorQUxvb3Blcl9yZWxlYXNlCitBTG9vcGVyX3JlbW92ZUZkCitBTG9vcGVyX3dha2UKK0FNb3Rpb25FdmVudF9nZXRBY3Rpb24KK0FNb3Rpb25FdmVudF9nZXREb3duVGltZQorQU1vdGlvbkV2ZW50X2dldEVkZ2VGbGFncworQU1vdGlvbkV2ZW50X2dldEV2ZW50VGltZQorQU1vdGlvbkV2ZW50X2dldEZsYWdzCitBTW90aW9uRXZlbnRfZ2V0SGlzdG9yaWNhbEV2ZW50VGltZQorQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxQcmVzc3VyZQorQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxTaXplCitBTW90aW9uRXZlbnRfZ2V0SGlzdG9yaWNhbFgKK0FNb3Rpb25FdmVudF9nZXRIaXN0b3JpY2FsWQorQU1vdGlvbkV2ZW50X2dldEhpc3RvcnlTaXplCitBTW90aW9uRXZlbnRfZ2V0TWV0YVN0YXRlCitBTW90aW9uRXZlbnRfZ2V0T3JpZW50YXRpb24KK0FNb3Rpb25FdmVudF9nZXRQb2ludGVyQ291bnQKK0FNb3Rpb25FdmVudF9nZXRQb2ludGVySWQKK0FNb3Rpb25FdmVudF9nZXRQcmVzc3VyZQorQU1vdGlvbkV2ZW50X2dldFJhd1gKK0FNb3Rpb25FdmVudF9nZXRSYXdZCitBTW90aW9uRXZlbnRfZ2V0U2l6ZQorQU1vdGlvbkV2ZW50X2dldFRvb2xNYWpvcgorQU1vdGlvbkV2ZW50X2dldFRvb2xNaW5vcgorQU1vdGlvbkV2ZW50X2dldFRvdWNoTWFqb3IKK0FNb3Rpb25FdmVudF9nZXRUb3VjaE1pbm9yCitBTW90aW9uRXZlbnRfZ2V0WAorQU1vdGlvbkV2ZW50X2dldFhPZmZzZXQKK0FNb3Rpb25FdmVudF9nZXRYUHJlY2lzaW9uCitBTW90aW9uRXZlbnRfZ2V0WQorQU1vdGlvbkV2ZW50X2dldFlPZmZzZXQKK0FNb3Rpb25FdmVudF9nZXRZUHJlY2lzaW9uCitBTmF0aXZlQWN0aXZpdHlfZmluaXNoCitBTmF0aXZlQWN0aXZpdHlfaGlkZVNvZnRJbnB1dAorQU5hdGl2ZUFjdGl2aXR5X3NldFdpbmRvd0ZsYWdzCitBTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93Rm9ybWF0CitBTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dAorQU5hdGl2ZVdpbmRvd19hY3F1aXJlCitBTmF0aXZlV2luZG93X2Zyb21TdXJmYWNlCitBTmF0aXZlV2luZG93X2dldEZvcm1hdAorQU5hdGl2ZVdpbmRvd19nZXRIZWlnaHQKK0FOYXRpdmVXaW5kb3dfZ2V0V2lkdGgKK0FOYXRpdmVXaW5kb3dfbG9jaworQU5hdGl2ZVdpbmRvd19yZWxlYXNlCitBTmF0aXZlV2luZG93X3NldEJ1ZmZlcnNHZW9tZXRyeQorQU5hdGl2ZVdpbmRvd191bmxvY2tBbmRQb3N0CitBT2JiSW5mb19kZWxldGUKK0FPYmJJbmZvX2dldEZsYWdzCitBT2JiSW5mb19nZXRQYWNrYWdlTmFtZQorQU9iYkluZm9fZ2V0VmVyc2lvbgorQU9iYlNjYW5uZXJfZ2V0T2JiSW5mbworQVNlbnNvckV2ZW50UXVldWVfZGlzYWJsZVNlbnNvcgorQVNlbnNvckV2ZW50UXVldWVfZW5hYmxlU2Vuc29yCitBU2Vuc29yRXZlbnRRdWV1ZV9nZXRFdmVudHMKK0FTZW5zb3JFdmVudFF1ZXVlX2hhc0V2ZW50cworQVNlbnNvckV2ZW50UXVldWVfc2V0RXZlbnRSYXRlCitBU2Vuc29yTWFuYWdlcl9jcmVhdGVFdmVudFF1ZXVlCitBU2Vuc29yTWFuYWdlcl9kZXN0cm95RXZlbnRRdWV1ZQorQVNlbnNvck1hbmFnZXJfZ2V0RGVmYXVsdFNlbnNvcgorQVNlbnNvck1hbmFnZXJfZ2V0SW5zdGFuY2UKK0FTZW5zb3JNYW5hZ2VyX2dldFNlbnNvckxpc3QKK0FTZW5zb3JfZ2V0TWluRGVsYXkKK0FTZW5zb3JfZ2V0TmFtZQorQVNlbnNvcl9nZXRSZXNvbHV0aW9uCitBU2Vuc29yX2dldFR5cGUKK0FTZW5zb3JfZ2V0VmVuZG9yCitBU3RvcmFnZU1hbmFnZXJfZGVsZXRlCitBU3RvcmFnZU1hbmFnZXJfZ2V0TW91bnRlZE9iYlBhdGgKK0FTdG9yYWdlTWFuYWdlcl9pc09iYk1vdW50ZWQKK0FTdG9yYWdlTWFuYWdlcl9tb3VudE9iYgorQVN0b3JhZ2VNYW5hZ2VyX25ldworQVN0b3JhZ2VNYW5hZ2VyX3VubW91bnRPYmIKKwpkaWZmIC0tZ2l0IGEvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9hc3NldF9tYW5hZ2VyLmggYi9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvaW5jbHVkZS9hbmRyb2lkL2Fzc2V0X21hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWRmNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9hc3NldF9tYW5hZ2VyLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9BU1NFVF9NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9BU1NFVF9NQU5BR0VSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQUFzc2V0TWFuYWdlcjsKK3R5cGVkZWYgc3RydWN0IEFBc3NldE1hbmFnZXIgQUFzc2V0TWFuYWdlcjsKKworc3RydWN0IEFBc3NldERpcjsKK3R5cGVkZWYgc3RydWN0IEFBc3NldERpciBBQXNzZXREaXI7CisKK3N0cnVjdCBBQXNzZXQ7Cit0eXBlZGVmIHN0cnVjdCBBQXNzZXQgQUFzc2V0OworCisvKiBBdmFpbGFibGUgbW9kZXMgZm9yIG9wZW5pbmcgYXNzZXRzICovCitlbnVtIHsKKyAgICBBQVNTRVRfTU9ERV9VTktOT1dOICAgICAgPSAwLAorICAgIEFBU1NFVF9NT0RFX1JBTkRPTSAgICAgICA9IDEsCisgICAgQUFTU0VUX01PREVfU1RSRUFNSU5HICAgID0gMiwKKyAgICBBQVNTRVRfTU9ERV9CVUZGRVIgICAgICAgPSAzCit9OworCisKKy8qKgorICogT3BlbiB0aGUgbmFtZWQgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXNzZXQgaGllcmFyY2h5LiAgVGhlIGRpcmVjdG9yeSBjYW4gdGhlbgorICogYmUgaW5zcGVjdGVkIHdpdGggdGhlIEFBc3NldERpciBmdW5jdGlvbnMuICBUbyBvcGVuIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LAorICogcGFzcyBpbiAiIiBhcyB0aGUgZGlyTmFtZS4KKyAqCisgKiBUaGUgb2JqZWN0IHJldHVybmVkIGhlcmUgc2hvdWxkIGJlIGZyZWVkIGJ5IGNhbGxpbmcgQUFzc2V0RGlyX2Nsb3NlKCkuCisgKi8KK0FBc3NldERpciogQUFzc2V0TWFuYWdlcl9vcGVuRGlyKEFBc3NldE1hbmFnZXIqIG1nciwgY29uc3QgY2hhciogZGlyTmFtZSk7CisKKy8qKgorICogT3BlbiBhbiBhc3NldC4KKyAqCisgKiBUaGUgb2JqZWN0IHJldHVybmVkIGhlcmUgc2hvdWxkIGJlIGZyZWVkIGJ5IGNhbGxpbmcgQUFzc2V0X2Nsb3NlKCkuCisgKi8KK0FBc3NldCogQUFzc2V0TWFuYWdlcl9vcGVuKEFBc3NldE1hbmFnZXIqIG1nciwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBtb2RlKTsKKworLyoqCisgKiBJdGVyYXRlIG92ZXIgdGhlIGZpbGVzIGluIGFuIGFzc2V0IGRpcmVjdG9yeS4gIEEgTlVMTCBzdHJpbmcgaXMgcmV0dXJuZWQKKyAqIHdoZW4gYWxsIHRoZSBmaWxlIG5hbWVzIGhhdmUgYmVlbiByZXR1cm5lZC4KKyAqCisgKiBUaGUgcmV0dXJuZWQgZmlsZSBuYW1lIGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEFBc3NldE1hbmFnZXJfb3BlbigpLgorICoKKyAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgaGVyZSBpcyBvd25lZCBieSB0aGUgQXNzZXREaXIgaW1wbGVtZW50YXRpb24gYW5kIGlzIG5vdAorICogZ3VhcmFudGVlZCB0byByZW1haW4gdmFsaWQgaWYgYW55IG90aGVyIGNhbGxzIGFyZSBtYWRlIG9uIHRoaXMgQUFzc2V0RGlyCisgKiBpbnN0YW5jZS4KKyAqLworY29uc3QgY2hhciogQUFzc2V0RGlyX2dldE5leHRGaWxlTmFtZShBQXNzZXREaXIqIGFzc2V0RGlyKTsKKworLyoqCisgKiBSZXNldCB0aGUgaXRlcmF0aW9uIHN0YXRlIG9mIEFBc3NldERpcl9nZXROZXh0RmlsZU5hbWUoKSB0byB0aGUgYmVnaW5uaW5nLgorICovCit2b2lkIEFBc3NldERpcl9yZXdpbmQoQUFzc2V0RGlyKiBhc3NldERpcik7CisKKy8qKgorICogQ2xvc2UgYW4gb3BlbmVkIEFBc3NldERpciwgZnJlZWluZyBhbnkgcmVsYXRlZCByZXNvdXJjZXMuCisgKi8KK3ZvaWQgQUFzc2V0RGlyX2Nsb3NlKEFBc3NldERpciogYXNzZXREaXIpOworCisvKioKKyAqIEF0dGVtcHQgdG8gcmVhZCAnY291bnQnIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgY3VycmVudCBvZmZzZXQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIHplcm8gb24gRU9GLCBvciA8IDAgb24gZXJyb3IuCisgKi8KK2ludCBBQXNzZXRfcmVhZChBQXNzZXQqIGFzc2V0LCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCk7CisKKy8qKgorICogU2VlayB0byB0aGUgc3BlY2lmaWVkIG9mZnNldCB3aXRoaW4gdGhlIGFzc2V0IGRhdGEuICAnd2hlbmNlJyB1c2VzIHRoZQorICogc2FtZSBjb25zdGFudHMgYXMgbHNlZWsoKS9mc2VlaygpLgorICoKKyAqIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbiBvbiBzdWNjZXNzLCBvciAob2ZmX3QpIC0xIG9uIGVycm9yLgorICovCitvZmZfdCBBQXNzZXRfc2VlayhBQXNzZXQqIGFzc2V0LCBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOworCisvKioKKyAqIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgd2l0aGluIHRoZSBhc3NldCBkYXRhLiAgJ3doZW5jZScgdXNlcyB0aGUKKyAqIHNhbWUgY29uc3RhbnRzIGFzIGxzZWVrKCkvZnNlZWsoKS4KKyAqCisgKiBVc2VzIDY0LWJpdCBkYXRhIHR5cGUgZm9yIGxhcmdlIGZpbGVzIGFzIG9wcG9zZWQgdG8gdGhlIDMyLWJpdCB0eXBlIHVzZWQKKyAqIGJ5IEFBc3NldF9zZWVrLgorICoKKyAqIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbiBvbiBzdWNjZXNzLCBvciAob2ZmNjRfdCkgLTEgb24gZXJyb3IuCisgKi8KK29mZjY0X3QgQUFzc2V0X3NlZWs2NChBQXNzZXQqIGFzc2V0LCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSk7CisKKy8qKgorICogQ2xvc2UgdGhlIGFzc2V0LCBmcmVlaW5nIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqLwordm9pZCBBQXNzZXRfY2xvc2UoQUFzc2V0KiBhc3NldCk7CisKKy8qKgorICogR2V0IGEgcG9pbnRlciB0byBhIGJ1ZmZlciBob2xkaW5nIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGFzc3NldC4KKyAqCisgKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KKyAqLworY29uc3Qgdm9pZCogQUFzc2V0X2dldEJ1ZmZlcihBQXNzZXQqIGFzc2V0KTsKKworLyoqCisgKiBSZXBvcnQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGFzc2V0IGRhdGEuCisgKi8KK29mZl90IEFBc3NldF9nZXRMZW5ndGgoQUFzc2V0KiBhc3NldCk7CisKKy8qKgorICogUmVwb3J0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBhc3NldCBkYXRhLiBSZXBvcnRzIHRoZSBzaXplIHVzaW5nIGEgNjQtYml0CisgKiBudW1iZXIgaW5zdGVkIG9mIDMyLWJpdCBhcyBBQXNzZXRfZ2V0TGVuZ3RoLgorICovCitvZmY2NF90IEFBc3NldF9nZXRMZW5ndGg2NChBQXNzZXQqIGFzc2V0KTsKKworLyoqCisgKiBSZXBvcnQgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldCBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworb2ZmX3QgQUFzc2V0X2dldFJlbWFpbmluZ0xlbmd0aChBQXNzZXQqIGFzc2V0KTsKKworLyoqCisgKiBSZXBvcnQgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldCBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqCisgKiBVc2VzIGEgNjQtYml0IG51bWJlciBpbnN0ZWFkIG9mIGEgMzItYml0IG51bWJlciBhcyBBQXNzZXRfZ2V0UmVtYWluaW5nTGVuZ3RoIGRvZXMuCisgKi8KK29mZjY0X3QgQUFzc2V0X2dldFJlbWFpbmluZ0xlbmd0aDY0KEFBc3NldCogYXNzZXQpOworCisvKioKKyAqIE9wZW4gYSBuZXcgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgYXNzZXQgZGF0YS4gSWYgdGhlCisgKiBzdGFydCBvciBsZW5ndGggY2Fubm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgMzItYml0IG51bWJlciwgaXQgd2lsbCBiZQorICogdHJ1bmNhdGVkLiBJZiB0aGUgZmlsZSBpcyBsYXJnZSwgdXNlIEFBc3NldF9vcGVuRmlsZURlc2NyaXB0b3I2NCBpbnN0ZWFkLgorICoKKyAqIFJldHVybnMgPCAwIGlmIGRpcmVjdCBmZCBhY2Nlc3MgaXMgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgaWYgdGhlIGFzc2V0IGlzCisgKiBjb21wcmVzc2VkKS4KKyAqLworaW50IEFBc3NldF9vcGVuRmlsZURlc2NyaXB0b3IoQUFzc2V0KiBhc3NldCwgb2ZmX3QqIG91dFN0YXJ0LCBvZmZfdCogb3V0TGVuZ3RoKTsKKworLyoqCisgKiBPcGVuIGEgbmV3IGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGFzc2V0IGRhdGEuCisgKgorICogVXNlcyBhIDY0LWJpdCBudW1iZXIgZm9yIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBpbnN0ZWFkIG9mIDMyLWJpdCBpbnN0ZWFkIG9mCisgKiBhcyBBQXNzZXRfb3BlbkZpbGVEZXNjcmlwdG9yIGRvZXMuCisgKgorICogUmV0dXJucyA8IDAgaWYgZGlyZWN0IGZkIGFjY2VzcyBpcyBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCBpZiB0aGUgYXNzZXQgaXMKKyAqIGNvbXByZXNzZWQpLgorICovCitpbnQgQUFzc2V0X29wZW5GaWxlRGVzY3JpcHRvcjY0KEFBc3NldCogYXNzZXQsIG9mZjY0X3QqIG91dFN0YXJ0LCBvZmY2NF90KiBvdXRMZW5ndGgpOworCisvKioKKyAqIFJldHVybnMgd2hldGhlciB0aGlzIGFzc2V0J3MgaW50ZXJuYWwgYnVmZmVyIGlzIGFsbG9jYXRlZCBpbiBvcmRpbmFyeSBSQU0gKGkuZS4gbm90CisgKiBtbWFwcGVkKS4KKyAqLworaW50IEFBc3NldF9pc0FsbG9jYXRlZChBQXNzZXQqIGFzc2V0KTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYgICAgICAvLyBBTkRST0lEX0FTU0VUX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9pbnB1dC5oIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTY2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvaW5jbHVkZS9hbmRyb2lkL2lucHV0LmgKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX0lOUFVUX0gKKyNkZWZpbmUgX0FORFJPSURfSU5QVVRfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSU1QT1JUQU5UIE5PVElDRToKKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEFuZHJvaWQncyBzZXQgb2Ygc3RhYmxlIHN5c3RlbSBoZWFkZXJzCisgKiAgIGV4cG9zZWQgYnkgdGhlIEFuZHJvaWQgTkRLIChOYXRpdmUgRGV2ZWxvcG1lbnQgS2l0KS4KKyAqCisgKiAgIFRoaXJkLXBhcnR5IHNvdXJjZSBBTkQgYmluYXJ5IGNvZGUgcmVsaWVzIG9uIHRoZSBkZWZpbml0aW9ucworICogICBoZXJlIHRvIGJlIEZST1pFTiBPTiBBTEwgVVBDT01JTkcgUExBVEZPUk0gUkVMRUFTRVMuCisgKgorICogICAtIERPIE5PVCBNT0RJRlkgRU5VTVMgKEVYQ0VQVCBJRiBZT1UgQUREIE5FVyAzMi1CSVQgVkFMVUVTKQorICogICAtIERPIE5PVCBNT0RJRlkgQ09OU1RBTlRTIE9SIEZVTkNUSU9OQUwgTUFDUk9TCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgU0lHTkFUVVJFIE9GIEZVTkNUSU9OUyBJTiBBTlkgV0FZCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgTEFZT1VUIE9SIFNJWkUgT0YgU1RSVUNUVVJFUworICovCisKKy8qCisgKiBTdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBpbnB1dCBldmVudHMgaW4KKyAqIG5hdGl2ZSBjb2RlLgorICoKKyAqIE5PVEU6IFRoZXNlIGZ1bmN0aW9ucyBNVVNUIGJlIGltcGxlbWVudGVkIGJ5IC9zeXN0ZW0vbGliL2xpYnVpLnNvCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBLZXkgc3RhdGVzIChtYXkgYmUgcmV0dXJuZWQgYnkgcXVlcmllcyBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhCisgKiBwYXJ0aWN1bGFyIGtleSBjb2RlLCBzY2FuIGNvZGUgb3Igc3dpdGNoKS4KKyAqLworZW51bSB7CisgICAgLyogVGhlIGtleSBzdGF0ZSBpcyB1bmtub3duIG9yIHRoZSByZXF1ZXN0ZWQga2V5IGl0c2VsZiBpcyBub3Qgc3VwcG9ydGVkLiAqLworICAgIEFLRVlfU1RBVEVfVU5LTk9XTiA9IC0xLAorCisgICAgLyogVGhlIGtleSBpcyB1cC4gKi8KKyAgICBBS0VZX1NUQVRFX1VQID0gMCwKKworICAgIC8qIFRoZSBrZXkgaXMgZG93bi4gKi8KKyAgICBBS0VZX1NUQVRFX0RPV04gPSAxLAorCisgICAgLyogVGhlIGtleSBpcyBkb3duIGJ1dCBpcyBhIHZpcnR1YWwga2V5IHByZXNzIHRoYXQgaXMgYmVpbmcgZW11bGF0ZWQgYnkgdGhlIHN5c3RlbS4gKi8KKyAgICBBS0VZX1NUQVRFX1ZJUlRVQUwgPSAyCit9OworCisvKgorICogTWV0YSBrZXkgLyBtb2RpZmVyIHN0YXRlLgorICovCitlbnVtIHsKKyAgICAvKiBObyBtZXRhIGtleXMgYXJlIHByZXNzZWQuICovCisgICAgQU1FVEFfTk9ORSA9IDAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9uZSBvZiB0aGUgQUxUIG1ldGEga2V5cyBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX0FMVF9PTiA9IDB4MDIsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBsZWZ0IEFMVCBtZXRhIGtleSBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX0FMVF9MRUZUX09OID0gMHgxMCwKKworICAgIC8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHJpZ2h0IEFMVCBtZXRhIGtleSBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX0FMVF9SSUdIVF9PTiA9IDB4MjAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9uZSBvZiB0aGUgU0hJRlQgbWV0YSBrZXlzIGlzIHByZXNzZWQuICovCisgICAgQU1FVEFfU0hJRlRfT04gPSAweDAxLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbGVmdCBTSElGVCBtZXRhIGtleSBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX1NISUZUX0xFRlRfT04gPSAweDQwLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcmlnaHQgU0hJRlQgbWV0YSBrZXkgaXMgcHJlc3NlZC4gKi8KKyAgICBBTUVUQV9TSElGVF9SSUdIVF9PTiA9IDB4ODAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBTWU0gbWV0YSBrZXkgaXMgcHJlc3NlZC4gKi8KKyAgICBBTUVUQV9TWU1fT04gPSAweDA0LAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgRlVOQ1RJT04gbWV0YSBrZXkgaXMgcHJlc3NlZC4gKi8KKyAgICBBTUVUQV9GVU5DVElPTl9PTiA9IDB4MDgsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9uZSBvZiB0aGUgQ1RSTCBtZXRhIGtleXMgaXMgcHJlc3NlZC4gKi8KKyAgICBBTUVUQV9DVFJMX09OID0gMHgxMDAwLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgbGVmdCBDVFJMIG1ldGEga2V5IGlzIHByZXNzZWQuICovCisgICAgQU1FVEFfQ1RSTF9MRUZUX09OID0gMHgyMDAwLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcmlnaHQgQ1RSTCBtZXRhIGtleSBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX0NUUkxfUklHSFRfT04gPSAweDQwMDAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9uZSBvZiB0aGUgTUVUQSBtZXRhIGtleXMgaXMgcHJlc3NlZC4gKi8KKyAgICBBTUVUQV9NRVRBX09OID0gMHgxMDAwMCwKKworICAgIC8qIFRoaXMgbWFzayBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGxlZnQgTUVUQSBtZXRhIGtleSBpcyBwcmVzc2VkLiAqLworICAgIEFNRVRBX01FVEFfTEVGVF9PTiA9IDB4MjAwMDAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSByaWdodCBNRVRBIG1ldGEga2V5IGlzIHByZXNzZWQuICovCisgICAgQU1FVEFfTUVUQV9SSUdIVF9PTiA9IDB4NDAwMDAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBDQVBTIExPQ0sgbWV0YSBrZXkgaXMgb24uICovCisgICAgQU1FVEFfQ0FQU19MT0NLX09OID0gMHgxMDAwMDAsCisKKyAgICAvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBOVU0gTE9DSyBtZXRhIGtleSBpcyBvbi4gKi8KKyAgICBBTUVUQV9OVU1fTE9DS19PTiA9IDB4MjAwMDAwLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgU0NST0xMIExPQ0sgbWV0YSBrZXkgaXMgb24uICovCisgICAgQU1FVEFfU0NST0xMX0xPQ0tfT04gPSAweDQwMDAwMCwKK307CisKKy8qCisgKiBJbnB1dCBldmVudHMuCisgKgorICogSW5wdXQgZXZlbnRzIGFyZSBvcGFxdWUgc3RydWN0dXJlcy4gIFVzZSB0aGUgcHJvdmlkZWQgYWNjZXNzb3JzIGZ1bmN0aW9ucyB0bworICogcmVhZCB0aGVpciBwcm9wZXJ0aWVzLgorICovCitzdHJ1Y3QgQUlucHV0RXZlbnQ7Cit0eXBlZGVmIHN0cnVjdCBBSW5wdXRFdmVudCBBSW5wdXRFdmVudDsKKworLyoKKyAqIElucHV0IGV2ZW50IHR5cGVzLgorICovCitlbnVtIHsKKyAgICAvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgZXZlbnQgaXMgYSBrZXkgZXZlbnQuICovCisgICAgQUlOUFVUX0VWRU5UX1RZUEVfS0VZID0gMSwKKworICAgIC8qIEluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBldmVudCBpcyBhIG1vdGlvbiBldmVudC4gKi8KKyAgICBBSU5QVVRfRVZFTlRfVFlQRV9NT1RJT04gPSAyCit9OworCisvKgorICogS2V5IGV2ZW50IGFjdGlvbnMuCisgKi8KK2VudW0geworICAgIC8qIFRoZSBrZXkgaGFzIGJlZW4gcHJlc3NlZCBkb3duLiAqLworICAgIEFLRVlfRVZFTlRfQUNUSU9OX0RPV04gPSAwLAorCisgICAgLyogVGhlIGtleSBoYXMgYmVlbiByZWxlYXNlZC4gKi8KKyAgICBBS0VZX0VWRU5UX0FDVElPTl9VUCA9IDEsCisKKyAgICAvKiBNdWx0aXBsZSBkdXBsaWNhdGUga2V5IGV2ZW50cyBoYXZlIG9jY3VycmVkIGluIGEgcm93LCBvciBhIGNvbXBsZXggc3RyaW5nIGlzCisgICAgICogYmVpbmcgZGVsaXZlcmVkLiAgVGhlIHJlcGVhdF9jb3VudCBwcm9wZXJ0eSBvZiB0aGUga2V5IGV2ZW50IGNvbnRhaW5zIHRoZSBudW1iZXIKKyAgICAgKiBvZiB0aW1lcyB0aGUgZ2l2ZW4ga2V5IGNvZGUgc2hvdWxkIGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIEFLRVlfRVZFTlRfQUNUSU9OX01VTFRJUExFID0gMgorfTsKKworLyoKKyAqIEtleSBldmVudCBmbGFncy4KKyAqLworZW51bSB7CisgICAgLyogVGhpcyBtYXNrIGlzIHNldCBpZiB0aGUgZGV2aWNlIHdva2UgYmVjYXVzZSBvZiB0aGlzIGtleSBldmVudC4gKi8KKyAgICBBS0VZX0VWRU5UX0ZMQUdfV09LRV9IRVJFID0gMHgxLAorCisgICAgLyogVGhpcyBtYXNrIGlzIHNldCBpZiB0aGUga2V5IGV2ZW50IHdhcyBnZW5lcmF0ZWQgYnkgYSBzb2Z0d2FyZSBrZXlib2FyZC4gKi8KKyAgICBBS0VZX0VWRU5UX0ZMQUdfU09GVF9LRVlCT0FSRCA9IDB4MiwKKworICAgIC8qIFRoaXMgbWFzayBpcyBzZXQgaWYgd2UgZG9uJ3Qgd2FudCB0aGUga2V5IGV2ZW50IHRvIGNhdXNlIHVzIHRvIGxlYXZlIHRvdWNoIG1vZGUuICovCisgICAgQUtFWV9FVkVOVF9GTEFHX0tFRVBfVE9VQ0hfTU9ERSA9IDB4NCwKKworICAgIC8qIFRoaXMgbWFzayBpcyBzZXQgaWYgYW4gZXZlbnQgd2FzIGtub3duIHRvIGNvbWUgZnJvbSBhIHRydXN0ZWQgcGFydAorICAgICAqIG9mIHRoZSBzeXN0ZW0uICBUaGF0IGlzLCB0aGUgZXZlbnQgaXMga25vd24gdG8gY29tZSBmcm9tIHRoZSB1c2VyLAorICAgICAqIGFuZCBjb3VsZCBub3QgaGF2ZSBiZWVuIHNwb29mZWQgYnkgYSB0aGlyZCBwYXJ0eSBjb21wb25lbnQuICovCisgICAgQUtFWV9FVkVOVF9GTEFHX0ZST01fU1lTVEVNID0gMHg4LAorCisgICAgLyogVGhpcyBtYXNrIGlzIHVzZWQgZm9yIGNvbXBhdGliaWxpdHksIHRvIGlkZW50aWZ5IGVudGVyIGtleXMgdGhhdCBhcmUKKyAgICAgKiBjb21pbmcgZnJvbSBhbiBJTUUgd2hvc2UgZW50ZXIga2V5IGhhcyBiZWVuIGF1dG8tbGFiZWxsZWQgIm5leHQiIG9yCisgICAgICogImRvbmUiLiAgVGhpcyBhbGxvd3MgVGV4dFZpZXcgdG8gZGlzcGF0Y2ggdGhlc2UgYXMgbm9ybWFsIGVudGVyIGtleXMKKyAgICAgKiBmb3Igb2xkIGFwcGxpY2F0aW9ucywgYnV0IHN0aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbgorICAgICAqIHJlY2VpdmluZyB0aGVtLiAqLworICAgIEFLRVlfRVZFTlRfRkxBR19FRElUT1JfQUNUSU9OID0gMHgxMCwKKworICAgIC8qIFdoZW4gYXNzb2NpYXRlZCB3aXRoIHVwIGtleSBldmVudHMsIHRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGtleSBwcmVzcworICAgICAqIGhhcyBiZWVuIGNhbmNlbGVkLiAgVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCB3aXRoIHZpcnR1YWwgdG91Y2ggc2NyZWVuCisgICAgICoga2V5cywgd2hlcmUgdGhlIHVzZXIgY2FuIHNsaWRlIGZyb20gdGhlIHZpcnR1YWwga2V5IGFyZWEgb24gdG8gdGhlCisgICAgICogZGlzcGxheTogaW4gdGhhdCBjYXNlLCB0aGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIGEgY2FuY2VsZWQgdXAKKyAgICAgKiBldmVudCBhbmQgc2hvdWxkIG5vdCBwZXJmb3JtIHRoZSBhY3Rpb24gbm9ybWFsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIGtleS4gIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrLCB0aGUgYXBwbGljYXRpb24gY2FuIG5vdCBwZXJmb3JtIGFuCisgICAgICogYWN0aW9uIGZvciBhIGtleSB1bnRpbCBpdCByZWNlaXZlcyBhbiB1cCBvciB0aGUgbG9uZyBwcmVzcyB0aW1lb3V0IGhhcworICAgICAqIGV4cGlyZWQuICovCisgICAgQUtFWV9FVkVOVF9GTEFHX0NBTkNFTEVEID0gMHgyMCwKKworICAgIC8qIFRoaXMga2V5IGV2ZW50IHdhcyBnZW5lcmF0ZWQgYnkgYSB2aXJ0dWFsIChvbi1zY3JlZW4pIGhhcmQga2V5IGFyZWEuCisgICAgICogVHlwaWNhbGx5IHRoaXMgaXMgYW4gYXJlYSBvZiB0aGUgdG91Y2hzY3JlZW4sIG91dHNpZGUgb2YgdGhlIHJlZ3VsYXIKKyAgICAgKiBkaXNwbGF5LCBkZWRpY2F0ZWQgdG8gImhhcmR3YXJlIiBidXR0b25zLiAqLworICAgIEFLRVlfRVZFTlRfRkxBR19WSVJUVUFMX0hBUkRfS0VZID0gMHg0MCwKKworICAgIC8qIFRoaXMgZmxhZyBpcyBzZXQgZm9yIHRoZSBmaXJzdCBrZXkgcmVwZWF0IHRoYXQgb2NjdXJzIGFmdGVyIHRoZQorICAgICAqIGxvbmcgcHJlc3MgdGltZW91dC4gKi8KKyAgICBBS0VZX0VWRU5UX0ZMQUdfTE9OR19QUkVTUyA9IDB4ODAsCisKKyAgICAvKiBTZXQgd2hlbiBhIGtleSBldmVudCBoYXMgQUtFWV9FVkVOVF9GTEFHX0NBTkNFTEVEIHNldCBiZWNhdXNlIGEgbG9uZworICAgICAqIHByZXNzIGFjdGlvbiB3YXMgZXhlY3V0ZWQgd2hpbGUgaXQgd2FzIGRvd24uICovCisgICAgQUtFWV9FVkVOVF9GTEFHX0NBTkNFTEVEX0xPTkdfUFJFU1MgPSAweDEwMCwKKworICAgIC8qIFNldCBmb3IgQUtFWV9FVkVOVF9BQ1RJT05fVVAgd2hlbiB0aGlzIGV2ZW50J3Mga2V5IGNvZGUgaXMgc3RpbGwgYmVpbmcKKyAgICAgKiB0cmFja2VkIGZyb20gaXRzIGluaXRpYWwgZG93bi4gIFRoYXQgaXMsIHNvbWVib2R5IHJlcXVlc3RlZCB0aGF0IHRyYWNraW5nCisgICAgICogc3RhcnRlZCBvbiB0aGUga2V5IGRvd24gYW5kIGEgbG9uZyBwcmVzcyBoYXMgbm90IGNhdXNlZAorICAgICAqIHRoZSB0cmFja2luZyB0byBiZSBjYW5jZWxlZC4gKi8KKyAgICBBS0VZX0VWRU5UX0ZMQUdfVFJBQ0tJTkcgPSAweDIwMCwKKworICAgIC8qIFNldCB3aGVuIGEga2V5IGV2ZW50IGhhcyBiZWVuIHN5bnRoZXNpemVkIHRvIGltcGxlbWVudCBkZWZhdWx0IGJlaGF2aW9yCisgICAgICogZm9yIGFuIGV2ZW50IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRpZCBub3QgaGFuZGxlLgorICAgICAqIEZhbGxiYWNrIGtleSBldmVudHMgYXJlIGdlbmVyYXRlZCBieSB1bmhhbmRsZWQgdHJhY2tiYWxsIG1vdGlvbnMKKyAgICAgKiAodG8gZW11bGF0ZSBhIGRpcmVjdGlvbmFsIGtleXBhZCkgYW5kIGJ5IGNlcnRhaW4gdW5oYW5kbGVkIGtleSBwcmVzc2VzCisgICAgICogdGhhdCBhcmUgZGVjbGFyZWQgaW4gdGhlIGtleSBtYXAgKHN1Y2ggYXMgc3BlY2lhbCBmdW5jdGlvbiBudW1lcmljIGtleXBhZAorICAgICAqIGtleXMgd2hlbiBudW1sb2NrIGlzIG9mZikuICovCisgICAgQUtFWV9FVkVOVF9GTEFHX0ZBTExCQUNLID0gMHg0MDAsCit9OworCisvKgorICogTW90aW9uIGV2ZW50IGFjdGlvbnMuCisgKi8KKworLyogQml0IHNoaWZ0IGZvciB0aGUgYWN0aW9uIGJpdHMgaG9sZGluZyB0aGUgcG9pbnRlciBpbmRleCBhcworICogZGVmaW5lZCBieSBBTU9USU9OX0VWRU5UX0FDVElPTl9QT0lOVEVSX0lOREVYX01BU0suCisgKi8KKyNkZWZpbmUgQU1PVElPTl9FVkVOVF9BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCA4CisKK2VudW0geworICAgIC8qIEJpdCBtYXNrIG9mIHRoZSBwYXJ0cyBvZiB0aGUgYWN0aW9uIGNvZGUgdGhhdCBhcmUgdGhlIGFjdGlvbiBpdHNlbGYuCisgICAgICovCisgICAgQU1PVElPTl9FVkVOVF9BQ1RJT05fTUFTSyA9IDB4ZmYsCisKKyAgICAvKiBCaXRzIGluIHRoZSBhY3Rpb24gY29kZSB0aGF0IHJlcHJlc2VudCBhIHBvaW50ZXIgaW5kZXgsIHVzZWQgd2l0aAorICAgICAqIEFNT1RJT05fRVZFTlRfQUNUSU9OX1BPSU5URVJfRE9XTiBhbmQgQU1PVElPTl9FVkVOVF9BQ1RJT05fUE9JTlRFUl9VUC4gIFNoaWZ0aW5nCisgICAgICogZG93biBieSBBTU9USU9OX0VWRU5UX0FDVElPTl9QT0lOVEVSX0lOREVYX1NISUZUIHByb3ZpZGVzIHRoZSBhY3R1YWwgcG9pbnRlcgorICAgICAqIGluZGV4IHdoZXJlIHRoZSBkYXRhIGZvciB0aGUgcG9pbnRlciBnb2luZyB1cCBvciBkb3duIGNhbiBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBBTU9USU9OX0VWRU5UX0FDVElPTl9QT0lOVEVSX0lOREVYX01BU0sgID0gMHhmZjAwLAorCisgICAgLyogQSBwcmVzc2VkIGdlc3R1cmUgaGFzIHN0YXJ0ZWQsIHRoZSBtb3Rpb24gY29udGFpbnMgdGhlIGluaXRpYWwgc3RhcnRpbmcgbG9jYXRpb24uCisgICAgICovCisgICAgQU1PVElPTl9FVkVOVF9BQ1RJT05fRE9XTiA9IDAsCisKKyAgICAvKiBBIHByZXNzZWQgZ2VzdHVyZSBoYXMgZmluaXNoZWQsIHRoZSBtb3Rpb24gY29udGFpbnMgdGhlIGZpbmFsIHJlbGVhc2UgbG9jYXRpb24KKyAgICAgKiBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhdGUgcG9pbnRzIHNpbmNlIHRoZSBsYXN0IGRvd24gb3IgbW92ZSBldmVudC4KKyAgICAgKi8KKyAgICBBTU9USU9OX0VWRU5UX0FDVElPTl9VUCA9IDEsCisKKyAgICAvKiBBIGNoYW5nZSBoYXMgaGFwcGVuZWQgZHVyaW5nIGEgcHJlc3MgZ2VzdHVyZSAoYmV0d2VlbiBBTU9USU9OX0VWRU5UX0FDVElPTl9ET1dOIGFuZAorICAgICAqIEFNT1RJT05fRVZFTlRfQUNUSU9OX1VQKS4gIFRoZSBtb3Rpb24gY29udGFpbnMgdGhlIG1vc3QgcmVjZW50IHBvaW50LCBhcyB3ZWxsIGFzCisgICAgICogYW55IGludGVybWVkaWF0ZSBwb2ludHMgc2luY2UgdGhlIGxhc3QgZG93biBvciBtb3ZlIGV2ZW50LgorICAgICAqLworICAgIEFNT1RJT05fRVZFTlRfQUNUSU9OX01PVkUgPSAyLAorCisgICAgLyogVGhlIGN1cnJlbnQgZ2VzdHVyZSBoYXMgYmVlbiBhYm9ydGVkLgorICAgICAqIFlvdSB3aWxsIG5vdCByZWNlaXZlIGFueSBtb3JlIHBvaW50cyBpbiBpdC4gIFlvdSBzaG91bGQgdHJlYXQgdGhpcyBhcworICAgICAqIGFuIHVwIGV2ZW50LCBidXQgbm90IHBlcmZvcm0gYW55IGFjdGlvbiB0aGF0IHlvdSBub3JtYWxseSB3b3VsZC4KKyAgICAgKi8KKyAgICBBTU9USU9OX0VWRU5UX0FDVElPTl9DQU5DRUwgPSAzLAorCisgICAgLyogQSBtb3ZlbWVudCBoYXMgaGFwcGVuZWQgb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGJvdW5kcyBvZiB0aGUgVUkgZWxlbWVudC4KKyAgICAgKiBUaGlzIGRvZXMgbm90IHByb3ZpZGUgYSBmdWxsIGdlc3R1cmUsIGJ1dCBvbmx5IHRoZSBpbml0aWFsIGxvY2F0aW9uIG9mIHRoZSBtb3ZlbWVudC90b3VjaC4KKyAgICAgKi8KKyAgICBBTU9USU9OX0VWRU5UX0FDVElPTl9PVVRTSURFID0gNCwKKworICAgIC8qIEEgbm9uLXByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSBkb3duLgorICAgICAqIFRoZSBiaXRzIGluIEFNT1RJT05fRVZFTlRfQUNUSU9OX1BPSU5URVJfSU5ERVhfTUFTSyBpbmRpY2F0ZSB3aGljaCBwb2ludGVyIGNoYW5nZWQuCisgICAgICovCisgICAgQU1PVElPTl9FVkVOVF9BQ1RJT05fUE9JTlRFUl9ET1dOID0gNSwKKworICAgIC8qIEEgbm9uLXByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSB1cC4KKyAgICAgKiBUaGUgYml0cyBpbiBBTU9USU9OX0VWRU5UX0FDVElPTl9QT0lOVEVSX0lOREVYX01BU0sgaW5kaWNhdGUgd2hpY2ggcG9pbnRlciBjaGFuZ2VkLgorICAgICAqLworICAgIEFNT1RJT05fRVZFTlRfQUNUSU9OX1BPSU5URVJfVVAgPSA2Cit9OworCisvKgorICogTW90aW9uIGV2ZW50IGZsYWdzLgorICovCitlbnVtIHsKKyAgICAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHdpbmRvdyB0aGF0IHJlY2VpdmVkIHRoaXMgbW90aW9uIGV2ZW50IGlzIHBhcnRseQorICAgICAqIG9yIHdob2xseSBvYnNjdXJlZCBieSBhbm90aGVyIHZpc2libGUgd2luZG93IGFib3ZlIGl0LiAgVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlCisgICAgICogZXZlbiBpZiB0aGUgZXZlbnQgZGlkIG5vdCBkaXJlY3RseSBwYXNzIHRocm91Z2ggdGhlIG9ic2N1cmVkIGFyZWEuCisgICAgICogQSBzZWN1cml0eSBzZW5zaXRpdmUgYXBwbGljYXRpb24gY2FuIGNoZWNrIHRoaXMgZmxhZyB0byBpZGVudGlmeSBzaXR1YXRpb25zIGluIHdoaWNoCisgICAgICogYSBtYWxpY2lvdXMgYXBwbGljYXRpb24gbWF5IGhhdmUgY292ZXJlZCB1cCBwYXJ0IG9mIGl0cyBjb250ZW50IGZvciB0aGUgcHVycG9zZQorICAgICAqIG9mIG1pc2xlYWRpbmcgdGhlIHVzZXIgb3IgaGlqYWNraW5nIHRvdWNoZXMuICBBbiBhcHByb3ByaWF0ZSByZXNwb25zZSBtaWdodCBiZQorICAgICAqIHRvIGRyb3AgdGhlIHN1c3BlY3QgdG91Y2hlcyBvciB0byB0YWtlIGFkZGl0aW9uYWwgcHJlY2F1dGlvbnMgdG8gY29uZmlybSB0aGUgdXNlcidzCisgICAgICogYWN0dWFsIGludGVudC4KKyAgICAgKi8KKyAgICBBTU9USU9OX0VWRU5UX0ZMQUdfV0lORE9XX0lTX09CU0NVUkVEID0gMHgxLAorfTsKKworLyoKKyAqIE1vdGlvbiBldmVudCBlZGdlIHRvdWNoIGZsYWdzLgorICovCitlbnVtIHsKKyAgICAvKiBObyBlZGdlcyBpbnRlcnNlY3RlZCAqLworICAgIEFNT1RJT05fRVZFTlRfRURHRV9GTEFHX05PTkUgPSAwLAorCisgICAgLyogRmxhZyBpbmRpY2F0aW5nIHRoZSBtb3Rpb24gZXZlbnQgaW50ZXJzZWN0ZWQgdGhlIHRvcCBlZGdlIG9mIHRoZSBzY3JlZW4uICovCisgICAgQU1PVElPTl9FVkVOVF9FREdFX0ZMQUdfVE9QID0gMHgwMSwKKworICAgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGUgbW90aW9uIGV2ZW50IGludGVyc2VjdGVkIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgc2NyZWVuLiAqLworICAgIEFNT1RJT05fRVZFTlRfRURHRV9GTEFHX0JPVFRPTSA9IDB4MDIsCisKKyAgICAvKiBGbGFnIGluZGljYXRpbmcgdGhlIG1vdGlvbiBldmVudCBpbnRlcnNlY3RlZCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzY3JlZW4uICovCisgICAgQU1PVElPTl9FVkVOVF9FREdFX0ZMQUdfTEVGVCA9IDB4MDQsCisKKyAgICAvKiBGbGFnIGluZGljYXRpbmcgdGhlIG1vdGlvbiBldmVudCBpbnRlcnNlY3RlZCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgc2NyZWVuLiAqLworICAgIEFNT1RJT05fRVZFTlRfRURHRV9GTEFHX1JJR0hUID0gMHgwOAorfTsKKworLyoKKyAqIElucHV0IHNvdXJjZXMuCisgKgorICogUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb24gYW5kcm9pZC52aWV3LklucHV0RGV2aWNlIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgaW5wdXQgc291cmNlcworICogYW5kIHRoZWlyIGNvcnJlY3QgaW50ZXJwcmV0YXRpb24uCisgKi8KK2VudW0geworICAgIEFJTlBVVF9TT1VSQ0VfQ0xBU1NfTUFTSyA9IDB4MDAwMDAwZmYsCisKKyAgICBBSU5QVVRfU09VUkNFX0NMQVNTX0JVVFRPTiA9IDB4MDAwMDAwMDEsCisgICAgQUlOUFVUX1NPVVJDRV9DTEFTU19QT0lOVEVSID0gMHgwMDAwMDAwMiwKKyAgICBBSU5QVVRfU09VUkNFX0NMQVNTX05BVklHQVRJT04gPSAweDAwMDAwMDA0LAorICAgIEFJTlBVVF9TT1VSQ0VfQ0xBU1NfUE9TSVRJT04gPSAweDAwMDAwMDA4LAorfTsKKworZW51bSB7CisgICAgQUlOUFVUX1NPVVJDRV9VTktOT1dOID0gMHgwMDAwMDAwMCwKKworICAgIEFJTlBVVF9TT1VSQ0VfS0VZQk9BUkQgPSAweDAwMDAwMTAwIHwgQUlOUFVUX1NPVVJDRV9DTEFTU19CVVRUT04sCisgICAgQUlOUFVUX1NPVVJDRV9EUEFEID0gMHgwMDAwMDIwMCB8IEFJTlBVVF9TT1VSQ0VfQ0xBU1NfQlVUVE9OLAorICAgIEFJTlBVVF9TT1VSQ0VfVE9VQ0hTQ1JFRU4gPSAweDAwMDAxMDAwIHwgQUlOUFVUX1NPVVJDRV9DTEFTU19QT0lOVEVSLAorICAgIEFJTlBVVF9TT1VSQ0VfTU9VU0UgPSAweDAwMDAyMDAwIHwgQUlOUFVUX1NPVVJDRV9DTEFTU19QT0lOVEVSLAorICAgIEFJTlBVVF9TT1VSQ0VfVFJBQ0tCQUxMID0gMHgwMDAxMDAwMCB8IEFJTlBVVF9TT1VSQ0VfQ0xBU1NfTkFWSUdBVElPTiwKKyAgICBBSU5QVVRfU09VUkNFX1RPVUNIUEFEID0gMHgwMDEwMDAwMCB8IEFJTlBVVF9TT1VSQ0VfQ0xBU1NfUE9TSVRJT04sCisKKyAgICBBSU5QVVRfU09VUkNFX0FOWSA9IDB4ZmZmZmZmMDAsCit9OworCisvKgorICogS2V5Ym9hcmQgdHlwZXMuCisgKgorICogUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb24gYW5kcm9pZC52aWV3LklucHV0RGV2aWNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KK2VudW0geworICAgIEFJTlBVVF9LRVlCT0FSRF9UWVBFX05PTkUgPSAwLAorICAgIEFJTlBVVF9LRVlCT0FSRF9UWVBFX05PTl9BTFBIQUJFVElDID0gMSwKKyAgICBBSU5QVVRfS0VZQk9BUkRfVFlQRV9BTFBIQUJFVElDID0gMiwKK307CisKKy8qCisgKiBDb25zdGFudHMgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmFuZ2Ugb2YgbW90aW9uIGZvciBhIHBhcnRpY3VsYXIKKyAqIGNvb3JkaW5hdGUgb2YgYSBtb3Rpb24gZXZlbnQuCisgKgorICogUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb24gYW5kcm9pZC52aWV3LklucHV0RGV2aWNlIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgaW5wdXQgc291cmNlcworICogYW5kIHRoZWlyIGNvcnJlY3QgaW50ZXJwcmV0YXRpb24uCisgKi8KK2VudW0geworICAgIEFJTlBVVF9NT1RJT05fUkFOR0VfWCA9IDAsCisgICAgQUlOUFVUX01PVElPTl9SQU5HRV9ZID0gMSwKKyAgICBBSU5QVVRfTU9USU9OX1JBTkdFX1BSRVNTVVJFID0gMiwKKyAgICBBSU5QVVRfTU9USU9OX1JBTkdFX1NJWkUgPSAzLAorICAgIEFJTlBVVF9NT1RJT05fUkFOR0VfVE9VQ0hfTUFKT1IgPSA0LAorICAgIEFJTlBVVF9NT1RJT05fUkFOR0VfVE9VQ0hfTUlOT1IgPSA1LAorICAgIEFJTlBVVF9NT1RJT05fUkFOR0VfVE9PTF9NQUpPUiA9IDYsCisgICAgQUlOUFVUX01PVElPTl9SQU5HRV9UT09MX01JTk9SID0gNywKKyAgICBBSU5QVVRfTU9USU9OX1JBTkdFX09SSUVOVEFUSU9OID0gOCwKK307CisKKworLyoKKyAqIElucHV0IGV2ZW50IGFjY2Vzc29ycy4KKyAqCisgKiBOb3RlIHRoYXQgbW9zdCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCBvbiBpbnB1dCBldmVudHMgdGhhdCBhcmUgb2YgYSBnaXZlbiB0eXBlLgorICogQ2FsbGluZyB0aGVzZSBmdW5jdGlvbnMgb24gaW5wdXQgZXZlbnRzIG9mIG90aGVyIHR5cGVzIHdpbGwgeWllbGQgdW5kZWZpbmVkIGJlaGF2aW9yLgorICovCisKKy8qKiogQWNjZXNzb3JzIGZvciBhbGwgaW5wdXQgZXZlbnRzLiAqKiovCisKKy8qIEdldCB0aGUgaW5wdXQgZXZlbnQgdHlwZS4gKi8KK2ludDMyX3QgQUlucHV0RXZlbnRfZ2V0VHlwZShjb25zdCBBSW5wdXRFdmVudCogZXZlbnQpOworCisvKiBHZXQgdGhlIGlkIGZvciB0aGUgZGV2aWNlIHRoYXQgYW4gaW5wdXQgZXZlbnQgY2FtZSBmcm9tLgorICoKKyAqIElucHV0IGV2ZW50cyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IG11bHRpcGxlIGRpZmZlcmVudCBpbnB1dCBkZXZpY2VzLgorICogVXNlIHRoZSBpbnB1dCBkZXZpY2UgaWQgdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dAorICogZGV2aWNlIHRoYXQgd2FzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgcGFydGljdWxhciBldmVudC4KKyAqCisgKiBBbiBpbnB1dCBkZXZpY2UgaWQgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgZXZlbnQgZGlkbid0IGNvbWUgZnJvbSBhIHBoeXNpY2FsIGRldmljZTsKKyAqIG90aGVyIG51bWJlcnMgYXJlIGFyYml0cmFyeSBhbmQgeW91IHNob3VsZG4ndCBkZXBlbmQgb24gdGhlIHZhbHVlcy4KKyAqIFVzZSB0aGUgcHJvdmlkZWQgaW5wdXQgZGV2aWNlIHF1ZXJ5IEFQSSB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaW5wdXQgZGV2aWNlcy4KKyAqLworaW50MzJfdCBBSW5wdXRFdmVudF9nZXREZXZpY2VJZChjb25zdCBBSW5wdXRFdmVudCogZXZlbnQpOworCisvKiBHZXQgdGhlIGlucHV0IGV2ZW50IHNvdXJjZS4gKi8KK2ludDMyX3QgQUlucHV0RXZlbnRfZ2V0U291cmNlKGNvbnN0IEFJbnB1dEV2ZW50KiBldmVudCk7CisKKy8qKiogQWNjZXNzb3JzIGZvciBrZXkgZXZlbnRzIG9ubHkuICoqKi8KKworLyogR2V0IHRoZSBrZXkgZXZlbnQgYWN0aW9uLiAqLworaW50MzJfdCBBS2V5RXZlbnRfZ2V0QWN0aW9uKGNvbnN0IEFJbnB1dEV2ZW50KiBrZXlfZXZlbnQpOworCisvKiBHZXQgdGhlIGtleSBldmVudCBmbGFncy4gKi8KK2ludDMyX3QgQUtleUV2ZW50X2dldEZsYWdzKGNvbnN0IEFJbnB1dEV2ZW50KiBrZXlfZXZlbnQpOworCisvKiBHZXQgdGhlIGtleSBjb2RlIG9mIHRoZSBrZXkgZXZlbnQuCisgKiBUaGlzIGlzIHRoZSBwaHlzaWNhbCBrZXkgdGhhdCB3YXMgcHJlc3NlZCwgbm90IHRoZSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KK2ludDMyX3QgQUtleUV2ZW50X2dldEtleUNvZGUoY29uc3QgQUlucHV0RXZlbnQqIGtleV9ldmVudCk7CisKKy8qIEdldCB0aGUgaGFyZHdhcmUga2V5IGlkIG9mIHRoaXMga2V5IGV2ZW50LgorICogVGhlc2UgdmFsdWVzIGFyZSBub3QgcmVsaWFibGUgYW5kIHZhcnkgZnJvbSBkZXZpY2UgdG8gZGV2aWNlLiAqLworaW50MzJfdCBBS2V5RXZlbnRfZ2V0U2NhbkNvZGUoY29uc3QgQUlucHV0RXZlbnQqIGtleV9ldmVudCk7CisKKy8qIEdldCB0aGUgbWV0YSBrZXkgc3RhdGUuICovCitpbnQzMl90IEFLZXlFdmVudF9nZXRNZXRhU3RhdGUoY29uc3QgQUlucHV0RXZlbnQqIGtleV9ldmVudCk7CisKKy8qIEdldCB0aGUgcmVwZWF0IGNvdW50IG9mIHRoZSBldmVudC4KKyAqIEZvciBib3RoIGtleSB1cCBhbiBrZXkgZG93biBldmVudHMsIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUga2V5IGhhcworICogcmVwZWF0ZWQgd2l0aCB0aGUgZmlyc3QgZG93biBzdGFydGluZyBhdCAwIGFuZCBjb3VudGluZyB1cCBmcm9tIHRoZXJlLiAgRm9yCisgKiBtdWx0aXBsZSBrZXkgZXZlbnRzLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgZG93bi91cCBwYWlycyB0aGF0IGhhdmUgb2NjdXJyZWQuICovCitpbnQzMl90IEFLZXlFdmVudF9nZXRSZXBlYXRDb3VudChjb25zdCBBSW5wdXRFdmVudCoga2V5X2V2ZW50KTsKKworLyogR2V0IHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCBrZXkgZG93biBldmVudCwgaW4gdGhlCisgKiBqYXZhLmxhbmcuU3lzdGVtLm5hbm9UaW1lKCkgdGltZSBiYXNlLiAgSWYgdGhpcyBpcyBhIGRvd24gZXZlbnQsCisgKiB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgZXZlbnRUaW1lLgorICogTm90ZSB0aGF0IHdoZW4gY2hvcmRpbmcga2V5cywgdGhpcyB2YWx1ZSBpcyB0aGUgZG93biB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudGx5CisgKiBwcmVzc2VkIGtleSwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZSBwaHlzaWNhbCBrZXkgb2YgdGhpcyBldmVudC4gKi8KK2ludDY0X3QgQUtleUV2ZW50X2dldERvd25UaW1lKGNvbnN0IEFJbnB1dEV2ZW50KiBrZXlfZXZlbnQpOworCisvKiBHZXQgdGhlIHRpbWUgdGhpcyBldmVudCBvY2N1cnJlZCwgaW4gdGhlCisgKiBqYXZhLmxhbmcuU3lzdGVtLm5hbm9UaW1lKCkgdGltZSBiYXNlLiAqLworaW50NjRfdCBBS2V5RXZlbnRfZ2V0RXZlbnRUaW1lKGNvbnN0IEFJbnB1dEV2ZW50KiBrZXlfZXZlbnQpOworCisvKioqIEFjY2Vzc29ycyBmb3IgbW90aW9uIGV2ZW50cyBvbmx5LiAqKiovCisKKy8qIEdldCB0aGUgY29tYmluZWQgbW90aW9uIGV2ZW50IGFjdGlvbiBjb2RlIGFuZCBwb2ludGVyIGluZGV4LiAqLworaW50MzJfdCBBTW90aW9uRXZlbnRfZ2V0QWN0aW9uKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQpOworCisvKiBHZXQgdGhlIG1vdGlvbiBldmVudCBmbGFncy4gKi8KK2ludDMyX3QgQU1vdGlvbkV2ZW50X2dldEZsYWdzKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQpOworCisvKiBHZXQgdGhlIHN0YXRlIG9mIGFueSBtZXRhIC8gbW9kaWZpZXIga2V5cyB0aGF0IHdlcmUgaW4gZWZmZWN0IHdoZW4gdGhlCisgKiBldmVudCB3YXMgZ2VuZXJhdGVkLiAqLworaW50MzJfdCBBTW90aW9uRXZlbnRfZ2V0TWV0YVN0YXRlKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQpOworCisvKiBHZXQgYSBiaXRmaWVsZCBpbmRpY2F0aW5nIHdoaWNoIGVkZ2VzLCBpZiBhbnksIHdlcmUgdG91Y2hlZCBieSB0aGlzIG1vdGlvbiBldmVudC4KKyAqIEZvciB0b3VjaCBldmVudHMsIGNsaWVudHMgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgdXNlcidzIGZpbmdlciB3YXMKKyAqIHRvdWNoaW5nIHRoZSBlZGdlIG9mIHRoZSBkaXNwbGF5LiAqLworaW50MzJfdCBBTW90aW9uRXZlbnRfZ2V0RWRnZUZsYWdzKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQpOworCisvKiBHZXQgdGhlIHRpbWUgd2hlbiB0aGUgdXNlciBvcmlnaW5hbGx5IHByZXNzZWQgZG93biB0byBzdGFydCBhIHN0cmVhbSBvZgorICogcG9zaXRpb24gZXZlbnRzLCBpbiB0aGUgamF2YS5sYW5nLlN5c3RlbS5uYW5vVGltZSgpIHRpbWUgYmFzZS4gKi8KK2ludDY0X3QgQU1vdGlvbkV2ZW50X2dldERvd25UaW1lKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQpOworCisvKiBHZXQgdGhlIHRpbWUgd2hlbiB0aGlzIHNwZWNpZmljIGV2ZW50IHdhcyBnZW5lcmF0ZWQsCisgKiBpbiB0aGUgamF2YS5sYW5nLlN5c3RlbS5uYW5vVGltZSgpIHRpbWUgYmFzZS4gKi8KK2ludDY0X3QgQU1vdGlvbkV2ZW50X2dldEV2ZW50VGltZShjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50KTsKKworLyogR2V0IHRoZSBYIGNvb3JkaW5hdGUgb2Zmc2V0LgorICogRm9yIHRvdWNoIGV2ZW50cyBvbiB0aGUgc2NyZWVuLCB0aGlzIGlzIHRoZSBkZWx0YSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcmF3CisgKiBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gYWRqdXN0IGZvciB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNvbnRhaW5pbmcgd2luZG93cworICogYW5kIHZpZXdzLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFhPZmZzZXQoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCk7CisKKy8qIEdldCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBZIGNvb3JkaW5hdGVzIGJlaW5nIHJlcG9ydGVkLgorICogRm9yIHRvdWNoIGV2ZW50cyBvbiB0aGUgc2NyZWVuLCB0aGlzIGlzIHRoZSBkZWx0YSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcmF3CisgKiBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gYWRqdXN0IGZvciB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNvbnRhaW5pbmcgd2luZG93cworICogYW5kIHZpZXdzLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFlPZmZzZXQoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCk7CisKKy8qIEdldCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBYIGNvb3JkaW5hdGVzIGJlaW5nIHJlcG9ydGVkLgorICogWW91IGNhbiBtdWx0aXBseSB0aGlzIG51bWJlciB3aXRoIGFuIFggY29vcmRpbmF0ZSBzYW1wbGUgdG8gZmluZCB0aGUKKyAqIGFjdHVhbCBoYXJkd2FyZSB2YWx1ZSBvZiB0aGUgWCBjb29yZGluYXRlLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFhQcmVjaXNpb24oY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCk7CisKKy8qIEdldCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBZIGNvb3JkaW5hdGVzIGJlaW5nIHJlcG9ydGVkLgorICogWW91IGNhbiBtdWx0aXBseSB0aGlzIG51bWJlciB3aXRoIGEgWSBjb29yZGluYXRlIHNhbXBsZSB0byBmaW5kIHRoZQorICogYWN0dWFsIGhhcmR3YXJlIHZhbHVlIG9mIHRoZSBZIGNvb3JkaW5hdGUuICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0WVByZWNpc2lvbihjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50KTsKKworLyogR2V0IHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgb2YgZGF0YSBjb250YWluZWQgaW4gdGhpcyBldmVudC4KKyAqIEFsd2F5cyA+PSAxLiAqLworc2l6ZV90IEFNb3Rpb25FdmVudF9nZXRQb2ludGVyQ291bnQoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCk7CisKKy8qIEdldCB0aGUgcG9pbnRlciBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcG9pbnRlcgorICogZGF0YSBpbmRleCBpcyB0aGlzIGV2ZW50LiAgVGhlIGlkZW50aWZpZXIgdGVsbHMgeW91IHRoZSBhY3R1YWwgcG9pbnRlcgorICogbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSwgYWNjb3VudGluZyBmb3IgaW5kaXZpZHVhbCBwb2ludGVycworICogZ29pbmcgdXAgYW5kIGRvd24gc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGdlc3R1cmUuICovCitpbnQzMl90IEFNb3Rpb25FdmVudF9nZXRQb2ludGVySWQoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIG9yaWdpbmFsIHJhdyBYIGNvb3JkaW5hdGUgb2YgdGhpcyBldmVudC4KKyAqIEZvciB0b3VjaCBldmVudHMgb24gdGhlIHNjcmVlbiwgdGhpcyBpcyB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50CisgKiBvbiB0aGUgc2NyZWVuLCBiZWZvcmUgaXQgaGFkIGJlZW4gYWRqdXN0ZWQgZm9yIHRoZSBjb250YWluaW5nIHdpbmRvdworICogYW5kIHZpZXdzLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFJhd1goY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIG9yaWdpbmFsIHJhdyBYIGNvb3JkaW5hdGUgb2YgdGhpcyBldmVudC4KKyAqIEZvciB0b3VjaCBldmVudHMgb24gdGhlIHNjcmVlbiwgdGhpcyBpcyB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50CisgKiBvbiB0aGUgc2NyZWVuLCBiZWZvcmUgaXQgaGFkIGJlZW4gYWRqdXN0ZWQgZm9yIHRoZSBjb250YWluaW5nIHdpbmRvdworICogYW5kIHZpZXdzLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFJhd1koY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIGN1cnJlbnQgWCBjb29yZGluYXRlIG9mIHRoaXMgZXZlbnQgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4LgorICogV2hvbGUgbnVtYmVycyBhcmUgcGl4ZWxzOyB0aGUgdmFsdWUgbWF5IGhhdmUgYSBmcmFjdGlvbiBmb3IgaW5wdXQgZGV2aWNlcworICogdGhhdCBhcmUgc3ViLXBpeGVsIHByZWNpc2UuICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0WChjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCk7CisKKy8qIEdldCB0aGUgY3VycmVudCBZIGNvb3JkaW5hdGUgb2YgdGhpcyBldmVudCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIgaW5kZXguCisgKiBXaG9sZSBudW1iZXJzIGFyZSBwaXhlbHM7IHRoZSB2YWx1ZSBtYXkgaGF2ZSBhIGZyYWN0aW9uIGZvciBpbnB1dCBkZXZpY2VzCisgKiB0aGF0IGFyZSBzdWItcGl4ZWwgcHJlY2lzZS4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRZKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4KTsKKworLyogR2V0IHRoZSBjdXJyZW50IHByZXNzdXJlIG9mIHRoaXMgZXZlbnQgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4LgorICogVGhlIHByZXNzdXJlIGdlbmVyYWxseSByYW5nZXMgZnJvbSAwIChubyBwcmVzc3VyZSBhdCBhbGwpIHRvIDEgKG5vcm1hbCBwcmVzc3VyZSksCisgKiBob3dldmVyIHZhbHVlcyBoaWdoZXIgdGhhbiAxIG1heSBiZSBnZW5lcmF0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjYWxpYnJhdGlvbiBvZgorICogdGhlIGlucHV0IGRldmljZS4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRQcmVzc3VyZShjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCk7CisKKy8qIEdldCB0aGUgY3VycmVudCBzY2FsZWQgdmFsdWUgb2YgdGhlIGFwcHJveGltYXRlIHNpemUgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4LgorICogVGhpcyByZXByZXNlbnRzIHNvbWUgYXBwcm94aW1hdGlvbiBvZiB0aGUgYXJlYSBvZiB0aGUgc2NyZWVuIGJlaW5nCisgKiBwcmVzc2VkOyB0aGUgYWN0dWFsIHZhbHVlIGluIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogdG91Y2ggaXMgbm9ybWFsaXplZCB3aXRoIHRoZSBkZXZpY2Ugc3BlY2lmaWMgcmFuZ2Ugb2YgdmFsdWVzCisgKiBhbmQgc2NhbGVkIHRvIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLiAgVGhlIHZhbHVlIG9mIHNpemUgY2FuIGJlIHVzZWQgdG8KKyAqIGRldGVybWluZSBmYXQgdG91Y2ggZXZlbnRzLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldFNpemUoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBtYWpvciBheGlzIG9mIGFuIGVsbGlwc2UgdGhhdCBkZXNjcmliZXMgdGhlIHRvdWNoIGFyZWEKKyAqIGF0IHRoZSBwb2ludCBvZiBjb250YWN0IGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleC4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRUb3VjaE1ham9yKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4KTsKKworLyogR2V0IHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgbWlub3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoYXQgZGVzY3JpYmVzIHRoZSB0b3VjaCBhcmVhCisgKiBhdCB0aGUgcG9pbnQgb2YgY29udGFjdCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIgaW5kZXguICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0VG91Y2hNaW5vcihjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCk7CisKKy8qIEdldCB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlIG1ham9yIGF4aXMgb2YgYW4gZWxsaXBzZSB0aGF0IGRlc2NyaWJlcyB0aGUgc2l6ZQorICogb2YgdGhlIGFwcHJvYWNoaW5nIHRvb2wgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4LgorICogVGhlIHRvb2wgYXJlYSByZXByZXNlbnRzIHRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgZmluZ2VyIG9yIHBlbiB0aGF0IGlzCisgKiB0b3VjaGluZyB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG9mIGl0cyBhY3R1YWwgdG91Y2ggYXJlYSBhdCB0aGUgcG9pbnQgb2YgY29udGFjdC4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRUb29sTWFqb3IoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBtaW5vciBheGlzIG9mIGFuIGVsbGlwc2UgdGhhdCBkZXNjcmliZXMgdGhlIHNpemUKKyAqIG9mIHRoZSBhcHByb2FjaGluZyB0b29sIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleC4KKyAqIFRoZSB0b29sIGFyZWEgcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIGZpbmdlciBvciBwZW4gdGhhdCBpcworICogdG91Y2hpbmcgdGhlIGRldmljZSBpbmRlcGVuZGVudCBvZiBpdHMgYWN0dWFsIHRvdWNoIGFyZWEgYXQgdGhlIHBvaW50IG9mIGNvbnRhY3QuICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0VG9vbE1pbm9yKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4KTsKKworLyogR2V0IHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIG9mIHRoZSB0b3VjaCBhcmVhIGFuZCB0b29sIGFyZWEgaW4gcmFkaWFucyBjbG9ja3dpc2UgZnJvbQorICogdmVydGljYWwgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4LgorICogQW4gYW5nbGUgb2YgMCBkZWdyZWVzIGluZGljYXRlcyB0aGF0IHRoZSBtYWpvciBheGlzIG9mIGNvbnRhY3QgaXMgb3JpZW50ZWQKKyAqIHVwd2FyZHMsIGlzIHBlcmZlY3RseSBjaXJjdWxhciBvciBpcyBvZiB1bmtub3duIG9yaWVudGF0aW9uLiAgQSBwb3NpdGl2ZSBhbmdsZQorICogaW5kaWNhdGVzIHRoYXQgdGhlIG1ham9yIGF4aXMgb2YgY29udGFjdCBpcyBvcmllbnRlZCB0byB0aGUgcmlnaHQuICBBIG5lZ2F0aXZlIGFuZ2xlCisgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFqb3IgYXhpcyBvZiBjb250YWN0IGlzIG9yaWVudGVkIHRvIHRoZSBsZWZ0LgorICogVGhlIGZ1bGwgcmFuZ2UgaXMgZnJvbSAtUEkvMiByYWRpYW5zIChmaW5nZXIgcG9pbnRpbmcgZnVsbHkgbGVmdCkgdG8gUEkvMiByYWRpYW5zCisgKiAoZmluZ2VyIHBvaW50aW5nIGZ1bGx5IHJpZ2h0KS4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRPcmllbnRhdGlvbihjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCk7CisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGhpc3RvcmljYWwgcG9pbnRzIGluIHRoaXMgZXZlbnQuICBUaGVzZSBhcmUgbW92ZW1lbnRzIHRoYXQKKyAqIGhhdmUgb2NjdXJyZWQgYmV0d2VlbiB0aGlzIGV2ZW50IGFuZCB0aGUgcHJldmlvdXMgZXZlbnQuICBUaGlzIG9ubHkgYXBwbGllcworICogdG8gQU1PVElPTl9FVkVOVF9BQ1RJT05fTU9WRSBldmVudHMgLS0gYWxsIG90aGVyIGFjdGlvbnMgd2lsbCBoYXZlIGEgc2l6ZSBvZiAwLgorICogSGlzdG9yaWNhbCBzYW1wbGVzIGFyZSBpbmRleGVkIGZyb20gb2xkZXN0IHRvIG5ld2VzdC4gKi8KK3NpemVfdCBBTW90aW9uRXZlbnRfZ2V0SGlzdG9yeVNpemUoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCk7CisKKy8qIEdldCB0aGUgdGltZSB0aGF0IGEgaGlzdG9yaWNhbCBtb3ZlbWVudCBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kCisgKiB0aGUgcHJldmlvdXMgZXZlbnQsIGluIHRoZSBqYXZhLmxhbmcuU3lzdGVtLm5hbm9UaW1lKCkgdGltZSBiYXNlLiAqLworaW50NjRfdCBBTW90aW9uRXZlbnRfZ2V0SGlzdG9yaWNhbEV2ZW50VGltZShBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LAorICAgICAgICBzaXplX3QgaGlzdG9yeV9pbmRleCk7CisKKy8qIEdldCB0aGUgaGlzdG9yaWNhbCByYXcgWCBjb29yZGluYXRlIG9mIHRoaXMgZXZlbnQgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4IHRoYXQKKyAqIG9jY3VycmVkIGJldHdlZW4gdGhpcyBldmVudCBhbmQgdGhlIHByZXZpb3VzIG1vdGlvbiBldmVudC4KKyAqIEZvciB0b3VjaCBldmVudHMgb24gdGhlIHNjcmVlbiwgdGhpcyBpcyB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGV2ZW50CisgKiBvbiB0aGUgc2NyZWVuLCBiZWZvcmUgaXQgaGFkIGJlZW4gYWRqdXN0ZWQgZm9yIHRoZSBjb250YWluaW5nIHdpbmRvdworICogYW5kIHZpZXdzLgorICogV2hvbGUgbnVtYmVycyBhcmUgcGl4ZWxzOyB0aGUgdmFsdWUgbWF5IGhhdmUgYSBmcmFjdGlvbiBmb3IgaW5wdXQgZGV2aWNlcworICogdGhhdCBhcmUgc3ViLXBpeGVsIHByZWNpc2UuICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0SGlzdG9yaWNhbFJhd1goY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgpOworCisvKiBHZXQgdGhlIGhpc3RvcmljYWwgcmF3IFkgY29vcmRpbmF0ZSBvZiB0aGlzIGV2ZW50IGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBGb3IgdG91Y2ggZXZlbnRzIG9uIHRoZSBzY3JlZW4sIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGxvY2F0aW9uIG9mIHRoZSBldmVudAorICogb24gdGhlIHNjcmVlbiwgYmVmb3JlIGl0IGhhZCBiZWVuIGFkanVzdGVkIGZvciB0aGUgY29udGFpbmluZyB3aW5kb3cKKyAqIGFuZCB2aWV3cy4KKyAqIFdob2xlIG51bWJlcnMgYXJlIHBpeGVsczsgdGhlIHZhbHVlIG1heSBoYXZlIGEgZnJhY3Rpb24gZm9yIGlucHV0IGRldmljZXMKKyAqIHRoYXQgYXJlIHN1Yi1waXhlbCBwcmVjaXNlLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxSYXdZKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4KTsKKworLyogR2V0IHRoZSBoaXN0b3JpY2FsIFggY29vcmRpbmF0ZSBvZiB0aGlzIGV2ZW50IGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBXaG9sZSBudW1iZXJzIGFyZSBwaXhlbHM7IHRoZSB2YWx1ZSBtYXkgaGF2ZSBhIGZyYWN0aW9uIGZvciBpbnB1dCBkZXZpY2VzCisgKiB0aGF0IGFyZSBzdWItcGl4ZWwgcHJlY2lzZS4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRIaXN0b3JpY2FsWChBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCwKKyAgICAgICAgc2l6ZV90IGhpc3RvcnlfaW5kZXgpOworCisvKiBHZXQgdGhlIGhpc3RvcmljYWwgWSBjb29yZGluYXRlIG9mIHRoaXMgZXZlbnQgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4IHRoYXQKKyAqIG9jY3VycmVkIGJldHdlZW4gdGhpcyBldmVudCBhbmQgdGhlIHByZXZpb3VzIG1vdGlvbiBldmVudC4KKyAqIFdob2xlIG51bWJlcnMgYXJlIHBpeGVsczsgdGhlIHZhbHVlIG1heSBoYXZlIGEgZnJhY3Rpb24gZm9yIGlucHV0IGRldmljZXMKKyAqIHRoYXQgYXJlIHN1Yi1waXhlbCBwcmVjaXNlLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxZKEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4LAorICAgICAgICBzaXplX3QgaGlzdG9yeV9pbmRleCk7CisKKy8qIEdldCB0aGUgaGlzdG9yaWNhbCBwcmVzc3VyZSBvZiB0aGlzIGV2ZW50IGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBUaGUgcHJlc3N1cmUgZ2VuZXJhbGx5IHJhbmdlcyBmcm9tIDAgKG5vIHByZXNzdXJlIGF0IGFsbCkgdG8gMSAobm9ybWFsIHByZXNzdXJlKSwKKyAqIGhvd2V2ZXIgdmFsdWVzIGhpZ2hlciB0aGFuIDEgbWF5IGJlIGdlbmVyYXRlZCBkZXBlbmRpbmcgb24gdGhlIGNhbGlicmF0aW9uIG9mCisgKiB0aGUgaW5wdXQgZGV2aWNlLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxQcmVzc3VyZShBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCwKKyAgICAgICAgc2l6ZV90IGhpc3RvcnlfaW5kZXgpOworCisvKiBHZXQgdGhlIGN1cnJlbnQgc2NhbGVkIHZhbHVlIG9mIHRoZSBhcHByb3hpbWF0ZSBzaXplIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBUaGlzIHJlcHJlc2VudHMgc29tZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBhcmVhIG9mIHRoZSBzY3JlZW4gYmVpbmcKKyAqIHByZXNzZWQ7IHRoZSBhY3R1YWwgdmFsdWUgaW4gcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiB0b3VjaCBpcyBub3JtYWxpemVkIHdpdGggdGhlIGRldmljZSBzcGVjaWZpYyByYW5nZSBvZiB2YWx1ZXMKKyAqIGFuZCBzY2FsZWQgdG8gYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuICBUaGUgdmFsdWUgb2Ygc2l6ZSBjYW4gYmUgdXNlZCB0bworICogZGV0ZXJtaW5lIGZhdCB0b3VjaCBldmVudHMuICovCitmbG9hdCBBTW90aW9uRXZlbnRfZ2V0SGlzdG9yaWNhbFNpemUoQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgsCisgICAgICAgIHNpemVfdCBoaXN0b3J5X2luZGV4KTsKKworLyogR2V0IHRoZSBoaXN0b3JpY2FsIGxlbmd0aCBvZiB0aGUgbWFqb3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoYXQgZGVzY3JpYmVzIHRoZSB0b3VjaCBhcmVhCisgKiBhdCB0aGUgcG9pbnQgb2YgY29udGFjdCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIgaW5kZXggdGhhdAorICogb2NjdXJyZWQgYmV0d2VlbiB0aGlzIGV2ZW50IGFuZCB0aGUgcHJldmlvdXMgbW90aW9uIGV2ZW50LiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxUb3VjaE1ham9yKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4LAorICAgICAgICBzaXplX3QgaGlzdG9yeV9pbmRleCk7CisKKy8qIEdldCB0aGUgaGlzdG9yaWNhbCBsZW5ndGggb2YgdGhlIG1pbm9yIGF4aXMgb2YgYW4gZWxsaXBzZSB0aGF0IGRlc2NyaWJlcyB0aGUgdG91Y2ggYXJlYQorICogYXQgdGhlIHBvaW50IG9mIGNvbnRhY3QgZm9yIHRoZSBnaXZlbiBwb2ludGVyIGluZGV4IHRoYXQKKyAqIG9jY3VycmVkIGJldHdlZW4gdGhpcyBldmVudCBhbmQgdGhlIHByZXZpb3VzIG1vdGlvbiBldmVudC4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRIaXN0b3JpY2FsVG91Y2hNaW5vcihjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCwKKyAgICAgICAgc2l6ZV90IGhpc3RvcnlfaW5kZXgpOworCisvKiBHZXQgdGhlIGhpc3RvcmljYWwgbGVuZ3RoIG9mIHRoZSBtYWpvciBheGlzIG9mIGFuIGVsbGlwc2UgdGhhdCBkZXNjcmliZXMgdGhlIHNpemUKKyAqIG9mIHRoZSBhcHByb2FjaGluZyB0b29sIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBUaGUgdG9vbCBhcmVhIHJlcHJlc2VudHMgdGhlIGVzdGltYXRlZCBzaXplIG9mIHRoZSBmaW5nZXIgb3IgcGVuIHRoYXQgaXMKKyAqIHRvdWNoaW5nIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgb2YgaXRzIGFjdHVhbCB0b3VjaCBhcmVhIGF0IHRoZSBwb2ludCBvZiBjb250YWN0LiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxUb29sTWFqb3IoY29uc3QgQUlucHV0RXZlbnQqIG1vdGlvbl9ldmVudCwgc2l6ZV90IHBvaW50ZXJfaW5kZXgsCisgICAgICAgIHNpemVfdCBoaXN0b3J5X2luZGV4KTsKKworLyogR2V0IHRoZSBoaXN0b3JpY2FsIGxlbmd0aCBvZiB0aGUgbWlub3IgYXhpcyBvZiBhbiBlbGxpcHNlIHRoYXQgZGVzY3JpYmVzIHRoZSBzaXplCisgKiBvZiB0aGUgYXBwcm9hY2hpbmcgdG9vbCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIgaW5kZXggdGhhdAorICogb2NjdXJyZWQgYmV0d2VlbiB0aGlzIGV2ZW50IGFuZCB0aGUgcHJldmlvdXMgbW90aW9uIGV2ZW50LgorICogVGhlIHRvb2wgYXJlYSByZXByZXNlbnRzIHRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgZmluZ2VyIG9yIHBlbiB0aGF0IGlzCisgKiB0b3VjaGluZyB0aGUgZGV2aWNlIGluZGVwZW5kZW50IG9mIGl0cyBhY3R1YWwgdG91Y2ggYXJlYSBhdCB0aGUgcG9pbnQgb2YgY29udGFjdC4gKi8KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRIaXN0b3JpY2FsVG9vbE1pbm9yKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsIHNpemVfdCBwb2ludGVyX2luZGV4LAorICAgICAgICBzaXplX3QgaGlzdG9yeV9pbmRleCk7CisKKy8qIEdldCB0aGUgaGlzdG9yaWNhbCBvcmllbnRhdGlvbiBvZiB0aGUgdG91Y2ggYXJlYSBhbmQgdG9vbCBhcmVhIGluIHJhZGlhbnMgY2xvY2t3aXNlIGZyb20KKyAqIHZlcnRpY2FsIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpbmRleCB0aGF0CisgKiBvY2N1cnJlZCBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kIHRoZSBwcmV2aW91cyBtb3Rpb24gZXZlbnQuCisgKiBBbiBhbmdsZSBvZiAwIGRlZ3JlZXMgaW5kaWNhdGVzIHRoYXQgdGhlIG1ham9yIGF4aXMgb2YgY29udGFjdCBpcyBvcmllbnRlZAorICogdXB3YXJkcywgaXMgcGVyZmVjdGx5IGNpcmN1bGFyIG9yIGlzIG9mIHVua25vd24gb3JpZW50YXRpb24uICBBIHBvc2l0aXZlIGFuZ2xlCisgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFqb3IgYXhpcyBvZiBjb250YWN0IGlzIG9yaWVudGVkIHRvIHRoZSByaWdodC4gIEEgbmVnYXRpdmUgYW5nbGUKKyAqIGluZGljYXRlcyB0aGF0IHRoZSBtYWpvciBheGlzIG9mIGNvbnRhY3QgaXMgb3JpZW50ZWQgdG8gdGhlIGxlZnQuCisgKiBUaGUgZnVsbCByYW5nZSBpcyBmcm9tIC1QSS8yIHJhZGlhbnMgKGZpbmdlciBwb2ludGluZyBmdWxseSBsZWZ0KSB0byBQSS8yIHJhZGlhbnMKKyAqIChmaW5nZXIgcG9pbnRpbmcgZnVsbHkgcmlnaHQpLiAqLworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxPcmllbnRhdGlvbihjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LCBzaXplX3QgcG9pbnRlcl9pbmRleCwKKyAgICAgICAgc2l6ZV90IGhpc3RvcnlfaW5kZXgpOworCisKKy8qCisgKiBJbnB1dCBxdWV1ZQorICoKKyAqIEFuIGlucHV0IHF1ZXVlIGlzIHRoZSBmYWNpbGl0eSB0aHJvdWdoIHdoaWNoIHlvdSByZXRyaWV2ZSBpbnB1dAorICogZXZlbnRzLgorICovCitzdHJ1Y3QgQUlucHV0UXVldWU7Cit0eXBlZGVmIHN0cnVjdCBBSW5wdXRRdWV1ZSBBSW5wdXRRdWV1ZTsKKworLyoKKyAqIEFkZCB0aGlzIGlucHV0IHF1ZXVlIHRvIGEgbG9vcGVyIGZvciBwcm9jZXNzaW5nLiAgU2VlCisgKiBBTG9vcGVyX2FkZEZkKCkgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBpZGVudCwgY2FsbGJhY2ssIGFuZCBkYXRhIHBhcmFtcy4KKyAqLwordm9pZCBBSW5wdXRRdWV1ZV9hdHRhY2hMb29wZXIoQUlucHV0UXVldWUqIHF1ZXVlLCBBTG9vcGVyKiBsb29wZXIsCisgICAgICAgIGludCBpZGVudCwgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2ssIHZvaWQqIGRhdGEpOworCisvKgorICogUmVtb3ZlIHRoZSBpbnB1dCBxdWV1ZSBmcm9tIHRoZSBsb29wZXIgaXQgaXMgY3VycmVudGx5IGF0dGFjaGVkIHRvLgorICovCit2b2lkIEFJbnB1dFF1ZXVlX2RldGFjaExvb3BlcihBSW5wdXRRdWV1ZSogcXVldWUpOworCisvKgorICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBldmVudHMgYXZhaWxhYmxlIGluIHRoZQorICogaW5wdXQgcXVldWUuICBSZXR1cm5zIDEgaWYgdGhlIHF1ZXVlIGhhcyBldmVudHM7IDAgaWYKKyAqIGl0IGRvZXMgbm90IGhhdmUgZXZlbnRzOyBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqLworaW50MzJfdCBBSW5wdXRRdWV1ZV9oYXNFdmVudHMoQUlucHV0UXVldWUqIHF1ZXVlKTsKKworLyoKKyAqIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGV2ZW50IGZyb20gdGhlIHF1ZXVlLiAgUmV0dXJucyBhIG5lZ2F0aXZlCisgKiB2YWx1ZSBpZiBubyBldmVudHMgYXJlIGF2YWlsYWJsZSBvciBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCisgKi8KK2ludDMyX3QgQUlucHV0UXVldWVfZ2V0RXZlbnQoQUlucHV0UXVldWUqIHF1ZXVlLCBBSW5wdXRFdmVudCoqIG91dEV2ZW50KTsKKworLyoKKyAqIFNlbmRzIHRoZSBrZXkgZm9yIHN0YW5kYXJkIHByZS1kaXNwYXRjaGluZyAtLSB0aGF0IGlzLCBwb3NzaWJseSBkZWxpdmVyCisgKiBpdCB0byB0aGUgY3VycmVudCBJTUUgdG8gYmUgY29uc3VtZWQgYmVmb3JlIHRoZSBhcHAuICBSZXR1cm5zIDAgaWYgaXQKKyAqIHdhcyBub3QgcHJlLWRpc3BhdGNoZWQsIG1lYW5pbmcgeW91IGNhbiBwcm9jZXNzIGl0IHJpZ2h0IG5vdy4gIElmIG5vbi16ZXJvCisgKiBpcyByZXR1cm5lZCwgeW91IG11c3QgYWJhbmRvbiB0aGUgY3VycmVudCBldmVudCBwcm9jZXNzaW5nIGFuZCBhbGxvdyB0aGUKKyAqIGV2ZW50IHRvIGFwcGVhciBhZ2FpbiBpbiB0aGUgZXZlbnQgcXVldWUgKGlmIGl0IGRvZXMgbm90IGdldCBjb25zdW1lZCBkdXJpbmcKKyAqIHByZS1kaXNwYXRjaGluZykuCisgKi8KK2ludDMyX3QgQUlucHV0UXVldWVfcHJlRGlzcGF0Y2hFdmVudChBSW5wdXRRdWV1ZSogcXVldWUsIEFJbnB1dEV2ZW50KiBldmVudCk7CisKKy8qCisgKiBSZXBvcnQgdGhhdCBkaXNwYXRjaGluZyBoYXMgZmluaXNoZWQgd2l0aCB0aGUgZ2l2ZW4gZXZlbnQuCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmluZyBhbiBldmVudCB3aXRoIEFJbnB1dFF1ZXVlX2dldF9ldmVudCgpLgorICovCit2b2lkIEFJbnB1dFF1ZXVlX2ZpbmlzaEV2ZW50KEFJbnB1dFF1ZXVlKiBxdWV1ZSwgQUlucHV0RXZlbnQqIGV2ZW50LCBpbnQgaGFuZGxlZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfQU5EUk9JRF9JTlBVVF9ICmRpZmYgLS1naXQgYS9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvaW5jbHVkZS9hbmRyb2lkL2tleWNvZGVzLmggYi9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvaW5jbHVkZS9hbmRyb2lkL2tleWNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNmEwYwotLS0gL2Rldi9udWxsCisrKyBiL25kay9wbGF0Zm9ybXMvYW5kcm9pZC0xMS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaApAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FORFJPSURfS0VZQ09ERVNfSAorI2RlZmluZSBfQU5EUk9JRF9LRVlDT0RFU19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJTVBPUlRBTlQgTk9USUNFOgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQW5kcm9pZCdzIHNldCBvZiBzdGFibGUgc3lzdGVtIGhlYWRlcnMKKyAqICAgZXhwb3NlZCBieSB0aGUgQW5kcm9pZCBOREsgKE5hdGl2ZSBEZXZlbG9wbWVudCBLaXQpLgorICoKKyAqICAgVGhpcmQtcGFydHkgc291cmNlIEFORCBiaW5hcnkgY29kZSByZWxpZXMgb24gdGhlIGRlZmluaXRpb25zCisgKiAgIGhlcmUgdG8gYmUgRlJPWkVOIE9OIEFMTCBVUENPTUlORyBQTEFURk9STSBSRUxFQVNFUy4KKyAqCisgKiAgIC0gRE8gTk9UIE1PRElGWSBFTlVNUyAoRVhDRVBUIElGIFlPVSBBREQgTkVXIDMyLUJJVCBWQUxVRVMpCisgKiAgIC0gRE8gTk9UIE1PRElGWSBDT05TVEFOVFMgT1IgRlVOQ1RJT05BTCBNQUNST1MKKyAqICAgLSBETyBOT1QgQ0hBTkdFIFRIRSBTSUdOQVRVUkUgT0YgRlVOQ1RJT05TIElOIEFOWSBXQVkKKyAqICAgLSBETyBOT1QgQ0hBTkdFIFRIRSBMQVlPVVQgT1IgU0laRSBPRiBTVFJVQ1RVUkVTCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBLZXkgY29kZXMuCisgKi8KK2VudW0geworICAgIEFLRVlDT0RFX1VOS05PV04gICAgICAgICA9IDAsCisgICAgQUtFWUNPREVfU09GVF9MRUZUICAgICAgID0gMSwKKyAgICBBS0VZQ09ERV9TT0ZUX1JJR0hUICAgICAgPSAyLAorICAgIEFLRVlDT0RFX0hPTUUgICAgICAgICAgICA9IDMsCisgICAgQUtFWUNPREVfQkFDSyAgICAgICAgICAgID0gNCwKKyAgICBBS0VZQ09ERV9DQUxMICAgICAgICAgICAgPSA1LAorICAgIEFLRVlDT0RFX0VORENBTEwgICAgICAgICA9IDYsCisgICAgQUtFWUNPREVfMCAgICAgICAgICAgICAgID0gNywKKyAgICBBS0VZQ09ERV8xICAgICAgICAgICAgICAgPSA4LAorICAgIEFLRVlDT0RFXzIgICAgICAgICAgICAgICA9IDksCisgICAgQUtFWUNPREVfMyAgICAgICAgICAgICAgID0gMTAsCisgICAgQUtFWUNPREVfNCAgICAgICAgICAgICAgID0gMTEsCisgICAgQUtFWUNPREVfNSAgICAgICAgICAgICAgID0gMTIsCisgICAgQUtFWUNPREVfNiAgICAgICAgICAgICAgID0gMTMsCisgICAgQUtFWUNPREVfNyAgICAgICAgICAgICAgID0gMTQsCisgICAgQUtFWUNPREVfOCAgICAgICAgICAgICAgID0gMTUsCisgICAgQUtFWUNPREVfOSAgICAgICAgICAgICAgID0gMTYsCisgICAgQUtFWUNPREVfU1RBUiAgICAgICAgICAgID0gMTcsCisgICAgQUtFWUNPREVfUE9VTkQgICAgICAgICAgID0gMTgsCisgICAgQUtFWUNPREVfRFBBRF9VUCAgICAgICAgID0gMTksCisgICAgQUtFWUNPREVfRFBBRF9ET1dOICAgICAgID0gMjAsCisgICAgQUtFWUNPREVfRFBBRF9MRUZUICAgICAgID0gMjEsCisgICAgQUtFWUNPREVfRFBBRF9SSUdIVCAgICAgID0gMjIsCisgICAgQUtFWUNPREVfRFBBRF9DRU5URVIgICAgID0gMjMsCisgICAgQUtFWUNPREVfVk9MVU1FX1VQICAgICAgID0gMjQsCisgICAgQUtFWUNPREVfVk9MVU1FX0RPV04gICAgID0gMjUsCisgICAgQUtFWUNPREVfUE9XRVIgICAgICAgICAgID0gMjYsCisgICAgQUtFWUNPREVfQ0FNRVJBICAgICAgICAgID0gMjcsCisgICAgQUtFWUNPREVfQ0xFQVIgICAgICAgICAgID0gMjgsCisgICAgQUtFWUNPREVfQSAgICAgICAgICAgICAgID0gMjksCisgICAgQUtFWUNPREVfQiAgICAgICAgICAgICAgID0gMzAsCisgICAgQUtFWUNPREVfQyAgICAgICAgICAgICAgID0gMzEsCisgICAgQUtFWUNPREVfRCAgICAgICAgICAgICAgID0gMzIsCisgICAgQUtFWUNPREVfRSAgICAgICAgICAgICAgID0gMzMsCisgICAgQUtFWUNPREVfRiAgICAgICAgICAgICAgID0gMzQsCisgICAgQUtFWUNPREVfRyAgICAgICAgICAgICAgID0gMzUsCisgICAgQUtFWUNPREVfSCAgICAgICAgICAgICAgID0gMzYsCisgICAgQUtFWUNPREVfSSAgICAgICAgICAgICAgID0gMzcsCisgICAgQUtFWUNPREVfSiAgICAgICAgICAgICAgID0gMzgsCisgICAgQUtFWUNPREVfSyAgICAgICAgICAgICAgID0gMzksCisgICAgQUtFWUNPREVfTCAgICAgICAgICAgICAgID0gNDAsCisgICAgQUtFWUNPREVfTSAgICAgICAgICAgICAgID0gNDEsCisgICAgQUtFWUNPREVfTiAgICAgICAgICAgICAgID0gNDIsCisgICAgQUtFWUNPREVfTyAgICAgICAgICAgICAgID0gNDMsCisgICAgQUtFWUNPREVfUCAgICAgICAgICAgICAgID0gNDQsCisgICAgQUtFWUNPREVfUSAgICAgICAgICAgICAgID0gNDUsCisgICAgQUtFWUNPREVfUiAgICAgICAgICAgICAgID0gNDYsCisgICAgQUtFWUNPREVfUyAgICAgICAgICAgICAgID0gNDcsCisgICAgQUtFWUNPREVfVCAgICAgICAgICAgICAgID0gNDgsCisgICAgQUtFWUNPREVfVSAgICAgICAgICAgICAgID0gNDksCisgICAgQUtFWUNPREVfViAgICAgICAgICAgICAgID0gNTAsCisgICAgQUtFWUNPREVfVyAgICAgICAgICAgICAgID0gNTEsCisgICAgQUtFWUNPREVfWCAgICAgICAgICAgICAgID0gNTIsCisgICAgQUtFWUNPREVfWSAgICAgICAgICAgICAgID0gNTMsCisgICAgQUtFWUNPREVfWiAgICAgICAgICAgICAgID0gNTQsCisgICAgQUtFWUNPREVfQ09NTUEgICAgICAgICAgID0gNTUsCisgICAgQUtFWUNPREVfUEVSSU9EICAgICAgICAgID0gNTYsCisgICAgQUtFWUNPREVfQUxUX0xFRlQgICAgICAgID0gNTcsCisgICAgQUtFWUNPREVfQUxUX1JJR0hUICAgICAgID0gNTgsCisgICAgQUtFWUNPREVfU0hJRlRfTEVGVCAgICAgID0gNTksCisgICAgQUtFWUNPREVfU0hJRlRfUklHSFQgICAgID0gNjAsCisgICAgQUtFWUNPREVfVEFCICAgICAgICAgICAgID0gNjEsCisgICAgQUtFWUNPREVfU1BBQ0UgICAgICAgICAgID0gNjIsCisgICAgQUtFWUNPREVfU1lNICAgICAgICAgICAgID0gNjMsCisgICAgQUtFWUNPREVfRVhQTE9SRVIgICAgICAgID0gNjQsCisgICAgQUtFWUNPREVfRU5WRUxPUEUgICAgICAgID0gNjUsCisgICAgQUtFWUNPREVfRU5URVIgICAgICAgICAgID0gNjYsCisgICAgQUtFWUNPREVfREVMICAgICAgICAgICAgID0gNjcsCisgICAgQUtFWUNPREVfR1JBVkUgICAgICAgICAgID0gNjgsCisgICAgQUtFWUNPREVfTUlOVVMgICAgICAgICAgID0gNjksCisgICAgQUtFWUNPREVfRVFVQUxTICAgICAgICAgID0gNzAsCisgICAgQUtFWUNPREVfTEVGVF9CUkFDS0VUICAgID0gNzEsCisgICAgQUtFWUNPREVfUklHSFRfQlJBQ0tFVCAgID0gNzIsCisgICAgQUtFWUNPREVfQkFDS1NMQVNIICAgICAgID0gNzMsCisgICAgQUtFWUNPREVfU0VNSUNPTE9OICAgICAgID0gNzQsCisgICAgQUtFWUNPREVfQVBPU1RST1BIRSAgICAgID0gNzUsCisgICAgQUtFWUNPREVfU0xBU0ggICAgICAgICAgID0gNzYsCisgICAgQUtFWUNPREVfQVQgICAgICAgICAgICAgID0gNzcsCisgICAgQUtFWUNPREVfTlVNICAgICAgICAgICAgID0gNzgsCisgICAgQUtFWUNPREVfSEVBRFNFVEhPT0sgICAgID0gNzksCisgICAgQUtFWUNPREVfRk9DVVMgICAgICAgICAgID0gODAsICAgLy8gKkNhbWVyYSogZm9jdXMKKyAgICBBS0VZQ09ERV9QTFVTICAgICAgICAgICAgPSA4MSwKKyAgICBBS0VZQ09ERV9NRU5VICAgICAgICAgICAgPSA4MiwKKyAgICBBS0VZQ09ERV9OT1RJRklDQVRJT04gICAgPSA4MywKKyAgICBBS0VZQ09ERV9TRUFSQ0ggICAgICAgICAgPSA4NCwKKyAgICBBS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFPSA4NSwKKyAgICBBS0VZQ09ERV9NRURJQV9TVE9QICAgICAgPSA4NiwKKyAgICBBS0VZQ09ERV9NRURJQV9ORVhUICAgICAgPSA4NywKKyAgICBBS0VZQ09ERV9NRURJQV9QUkVWSU9VUyAgPSA4OCwKKyAgICBBS0VZQ09ERV9NRURJQV9SRVdJTkQgICAgPSA4OSwKKyAgICBBS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQgPSA5MCwKKyAgICBBS0VZQ09ERV9NVVRFICAgICAgICAgICAgPSA5MSwKKyAgICBBS0VZQ09ERV9QQUdFX1VQICAgICAgICAgPSA5MiwKKyAgICBBS0VZQ09ERV9QQUdFX0RPV04gICAgICAgPSA5MywKKyAgICBBS0VZQ09ERV9QSUNUU1lNQk9MUyAgICAgPSA5NCwKKyAgICBBS0VZQ09ERV9TV0lUQ0hfQ0hBUlNFVCAgPSA5NSwKKyAgICBBS0VZQ09ERV9CVVRUT05fQSAgICAgICAgPSA5NiwKKyAgICBBS0VZQ09ERV9CVVRUT05fQiAgICAgICAgPSA5NywKKyAgICBBS0VZQ09ERV9CVVRUT05fQyAgICAgICAgPSA5OCwKKyAgICBBS0VZQ09ERV9CVVRUT05fWCAgICAgICAgPSA5OSwKKyAgICBBS0VZQ09ERV9CVVRUT05fWSAgICAgICAgPSAxMDAsCisgICAgQUtFWUNPREVfQlVUVE9OX1ogICAgICAgID0gMTAxLAorICAgIEFLRVlDT0RFX0JVVFRPTl9MMSAgICAgICA9IDEwMiwKKyAgICBBS0VZQ09ERV9CVVRUT05fUjEgICAgICAgPSAxMDMsCisgICAgQUtFWUNPREVfQlVUVE9OX0wyICAgICAgID0gMTA0LAorICAgIEFLRVlDT0RFX0JVVFRPTl9SMiAgICAgICA9IDEwNSwKKyAgICBBS0VZQ09ERV9CVVRUT05fVEhVTUJMICAgPSAxMDYsCisgICAgQUtFWUNPREVfQlVUVE9OX1RIVU1CUiAgID0gMTA3LAorICAgIEFLRVlDT0RFX0JVVFRPTl9TVEFSVCAgICA9IDEwOCwKKyAgICBBS0VZQ09ERV9CVVRUT05fU0VMRUNUICAgPSAxMDksCisgICAgQUtFWUNPREVfQlVUVE9OX01PREUgICAgID0gMTEwLAorICAgIEFLRVlDT0RFX0VTQ0FQRSAgICAgICAgICA9IDExMSwKKyAgICBBS0VZQ09ERV9GT1JXQVJEX0RFTCAgICAgPSAxMTIsCisgICAgQUtFWUNPREVfQ1RSTF9MRUZUICAgICAgID0gMTEzLAorICAgIEFLRVlDT0RFX0NUUkxfUklHSFQgICAgICA9IDExNCwKKyAgICBBS0VZQ09ERV9DQVBTX0xPQ0sgICAgICAgPSAxMTUsCisgICAgQUtFWUNPREVfU0NST0xMX0xPQ0sgICAgID0gMTE2LAorICAgIEFLRVlDT0RFX01FVEFfTEVGVCAgICAgICA9IDExNywKKyAgICBBS0VZQ09ERV9NRVRBX1JJR0hUICAgICAgPSAxMTgsCisgICAgQUtFWUNPREVfRlVOQ1RJT04gICAgICAgID0gMTE5LAorICAgIEFLRVlDT0RFX1NZU1JRICAgICAgICAgICA9IDEyMCwKKyAgICBBS0VZQ09ERV9CUkVBSyAgICAgICAgICAgPSAxMjEsCisgICAgQUtFWUNPREVfTU9WRV9IT01FICAgICAgID0gMTIyLAorICAgIEFLRVlDT0RFX01PVkVfRU5EICAgICAgICA9IDEyMywKKyAgICBBS0VZQ09ERV9JTlNFUlQgICAgICAgICAgPSAxMjQsCisgICAgQUtFWUNPREVfRk9SV0FSRCAgICAgICAgID0gMTI1LAorICAgIEFLRVlDT0RFX01FRElBX1BMQVkgICAgICA9IDEyNiwKKyAgICBBS0VZQ09ERV9NRURJQV9QQVVTRSAgICAgPSAxMjcsCisgICAgQUtFWUNPREVfTUVESUFfQ0xPU0UgICAgID0gMTI4LAorICAgIEFLRVlDT0RFX01FRElBX0VKRUNUICAgICA9IDEyOSwKKyAgICBBS0VZQ09ERV9NRURJQV9SRUNPUkQgICAgPSAxMzAsCisgICAgQUtFWUNPREVfRjEgICAgICAgICAgICAgID0gMTMxLAorICAgIEFLRVlDT0RFX0YyICAgICAgICAgICAgICA9IDEzMiwKKyAgICBBS0VZQ09ERV9GMyAgICAgICAgICAgICAgPSAxMzMsCisgICAgQUtFWUNPREVfRjQgICAgICAgICAgICAgID0gMTM0LAorICAgIEFLRVlDT0RFX0Y1ICAgICAgICAgICAgICA9IDEzNSwKKyAgICBBS0VZQ09ERV9GNiAgICAgICAgICAgICAgPSAxMzYsCisgICAgQUtFWUNPREVfRjcgICAgICAgICAgICAgID0gMTM3LAorICAgIEFLRVlDT0RFX0Y4ICAgICAgICAgICAgICA9IDEzOCwKKyAgICBBS0VZQ09ERV9GOSAgICAgICAgICAgICAgPSAxMzksCisgICAgQUtFWUNPREVfRjEwICAgICAgICAgICAgID0gMTQwLAorICAgIEFLRVlDT0RFX0YxMSAgICAgICAgICAgICA9IDE0MSwKKyAgICBBS0VZQ09ERV9GMTIgICAgICAgICAgICAgPSAxNDIsCisgICAgQUtFWUNPREVfTlVNX0xPQ0sgICAgICAgID0gMTQzLAorICAgIEFLRVlDT0RFX05VTVBBRF8wICAgICAgICA9IDE0NCwKKyAgICBBS0VZQ09ERV9OVU1QQURfMSAgICAgICAgPSAxNDUsCisgICAgQUtFWUNPREVfTlVNUEFEXzIgICAgICAgID0gMTQ2LAorICAgIEFLRVlDT0RFX05VTVBBRF8zICAgICAgICA9IDE0NywKKyAgICBBS0VZQ09ERV9OVU1QQURfNCAgICAgICAgPSAxNDgsCisgICAgQUtFWUNPREVfTlVNUEFEXzUgICAgICAgID0gMTQ5LAorICAgIEFLRVlDT0RFX05VTVBBRF82ICAgICAgICA9IDE1MCwKKyAgICBBS0VZQ09ERV9OVU1QQURfNyAgICAgICAgPSAxNTEsCisgICAgQUtFWUNPREVfTlVNUEFEXzggICAgICAgID0gMTUyLAorICAgIEFLRVlDT0RFX05VTVBBRF85ICAgICAgICA9IDE1MywKKyAgICBBS0VZQ09ERV9OVU1QQURfRElWSURFICAgPSAxNTQsCisgICAgQUtFWUNPREVfTlVNUEFEX01VTFRJUExZID0gMTU1LAorICAgIEFLRVlDT0RFX05VTVBBRF9TVUJUUkFDVCA9IDE1NiwKKyAgICBBS0VZQ09ERV9OVU1QQURfQUREICAgICAgPSAxNTcsCisgICAgQUtFWUNPREVfTlVNUEFEX0RPVCAgICAgID0gMTU4LAorICAgIEFLRVlDT0RFX05VTVBBRF9DT01NQSAgICA9IDE1OSwKKyAgICBBS0VZQ09ERV9OVU1QQURfRU5URVIgICAgPSAxNjAsCisgICAgQUtFWUNPREVfTlVNUEFEX0VRVUFMUyAgID0gMTYxLAorICAgIEFLRVlDT0RFX05VTVBBRF9MRUZUX1BBUkVOID0gMTYyLAorICAgIEFLRVlDT0RFX05VTVBBRF9SSUdIVF9QQVJFTiA9IDE2MywKKyAgICBBS0VZQ09ERV9WT0xVTUVfTVVURSAgICAgPSAxNjQsCisgICAgQUtFWUNPREVfSU5GTyAgICAgICAgICAgID0gMTY1LAorICAgIEFLRVlDT0RFX0NIQU5ORUxfVVAgICAgICA9IDE2NiwKKyAgICBBS0VZQ09ERV9DSEFOTkVMX0RPV04gICAgPSAxNjcsCisgICAgQUtFWUNPREVfWk9PTV9JTiAgICAgICAgID0gMTY4LAorICAgIEFLRVlDT0RFX1pPT01fT1VUICAgICAgICA9IDE2OSwKKyAgICBBS0VZQ09ERV9UViAgICAgICAgICAgICAgPSAxNzAsCisgICAgQUtFWUNPREVfV0lORE9XICAgICAgICAgID0gMTcxLAorICAgIEFLRVlDT0RFX0dVSURFICAgICAgICAgICA9IDE3MiwKKyAgICBBS0VZQ09ERV9EVlIgICAgICAgICAgICAgPSAxNzMsCisgICAgQUtFWUNPREVfQk9PS01BUksgICAgICAgID0gMTc0LAorICAgIEFLRVlDT0RFX0NBUFRJT05TICAgICAgICA9IDE3NSwKKyAgICBBS0VZQ09ERV9TRVRUSU5HUyAgICAgICAgPSAxNzYsCisgICAgQUtFWUNPREVfVFZfUE9XRVIgICAgICAgID0gMTc3LAorICAgIEFLRVlDT0RFX1RWX0lOUFVUICAgICAgICA9IDE3OCwKKyAgICBBS0VZQ09ERV9TVEJfUE9XRVIgICAgICAgPSAxNzksCisgICAgQUtFWUNPREVfU1RCX0lOUFVUICAgICAgID0gMTgwLAorICAgIEFLRVlDT0RFX0FWUl9QT1dFUiAgICAgICA9IDE4MSwKKyAgICBBS0VZQ09ERV9BVlJfSU5QVVQgICAgICAgPSAxODIsCisgICAgQUtFWUNPREVfUFJPR19SRUQgICAgICAgID0gMTgzLAorICAgIEFLRVlDT0RFX1BST0dfR1JFRU4gICAgICA9IDE4NCwKKyAgICBBS0VZQ09ERV9QUk9HX1lFTExPVyAgICAgPSAxODUsCisgICAgQUtFWUNPREVfUFJPR19CTFVFICAgICAgID0gMTg2LAorICAgIEFLRVlDT0RFX0FQUF9TV0lUQ0ggICAgICA9IDE4NywKKworICAgIC8vIE5PVEU6IElmIHlvdSBhZGQgYSBuZXcga2V5Y29kZSBoZXJlIHlvdSBtdXN0IGFsc28gYWRkIGl0IHRvIHNldmVyYWwgb3RoZXIgZmlsZXMuCisgICAgLy8gICAgICAgUmVmZXIgdG8gZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuamF2YSBmb3IgdGhlIGZ1bGwgbGlzdC4KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfQU5EUk9JRF9LRVlDT0RFU19ICmRpZmYgLS1naXQgYS9uZGsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvaW5jbHVkZS9hbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5oIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYxODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLTExL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX05BVElWRV9BQ1RJVklUWV9ICisjZGVmaW5lIEFORFJPSURfTkFUSVZFX0FDVElWSVRZX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Fzc2V0X21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2lucHV0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFOYXRpdmVBY3Rpdml0eUNhbGxiYWNrczsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBuYXRpdmUgc2lkZSBvZiBhbiBhbmRyb2lkLmFwcC5OYXRpdmVBY3Rpdml0eS4KKyAqIEl0IGlzIGNyZWF0ZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGhhbmRlZCB0byB0aGUgYXBwbGljYXRpb24ncyBuYXRpdmUKKyAqIGNvZGUgYXMgaXQgaXMgYmVpbmcgbGF1bmNoZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFOYXRpdmVBY3Rpdml0eSB7CisgICAgLyoqCisgICAgICogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGFibGUgb2YgdGhlIG5hdGl2ZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBZb3UgY2FuIHNldCB0aGUgZnVuY3Rpb25zIGhlcmUgdG8geW91ciBvd24gY2FsbGJhY2tzLiAgVGhlIGNhbGxiYWNrcworICAgICAqIHBvaW50ZXIgaXRzZWxmIGhlcmUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkOyBpdCBpcyBhbGxvY2F0ZWQgYW5kIG1hbmFnZWQKKyAgICAgKiBmb3IgeW91IGJ5IHRoZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgc3RydWN0IEFOYXRpdmVBY3Rpdml0eUNhbGxiYWNrcyogY2FsbGJhY2tzOworCisgICAgLyoqCisgICAgICogVGhlIGdsb2JhbCBoYW5kbGUgb24gdGhlIHByb2Nlc3MncyBKYXZhIFZNLgorICAgICAqLworICAgIEphdmFWTSogdm07CisKKyAgICAvKioKKyAgICAgKiBKTkkgY29udGV4dCBmb3IgdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBhcHAuICBOb3RlIHRoYXQgdGhpcyBmaWVsZAorICAgICAqIGNhbiBPTkxZIGJlIHVzZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3M7IHRoYXQgaXMsIHRoZQorICAgICAqIHRocmVhZCB0aGF0IGNhbGxzIGludG8gdGhlIEFOYXRpdmVBY3Rpdml0eUNhbGxiYWNrcy4KKyAgICAgKi8KKyAgICBKTklFbnYqIGVudjsKKworICAgIC8qKgorICAgICAqIFRoZSBOYXRpdmVBY3Rpdml0eSBKYXZhIGNsYXNzLgorICAgICAqLworICAgIGpvYmplY3QgY2xheno7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIHRvIHRoaXMgYXBwbGljYXRpb24ncyBpbnRlcm5hbCBkYXRhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBpbnRlcm5hbERhdGFQYXRoOworICAgIAorICAgIC8qKgorICAgICAqIFBhdGggdG8gdGhpcyBhcHBsaWNhdGlvbidzIGV4dGVybmFsIChyZW1vdmFibGUvbW91bnRhYmxlKSBkYXRhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBleHRlcm5hbERhdGFQYXRoOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwbGF0Zm9ybSdzIFNESyB2ZXJzaW9uIGNvZGUuCisgICAgICovCisgICAgaW50MzJfdCBzZGtWZXJzaW9uOworICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG5hdGl2ZSBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24uICBJdCBpcyBub3QgdXNlZCBieQorICAgICAqIHRoZSBmcmFtZXdvcmssIGJ1dCBjYW4gYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBpdHMgb3duIGluc3RhbmNlCisgICAgICogc3RhdGUuCisgICAgICovCisgICAgdm9pZCogaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIHRoZSBBc3NldCBNYW5hZ2VyIGluc3RhbmNlIGZvciB0aGUgYXBwbGljYXRpb24uICBUaGUgYXBwbGljYXRpb24KKyAgICAgKiB1c2VzIHRoaXMgdG8gYWNjZXNzIGJpbmFyeSBhc3NldHMgYnVuZGxlZCBpbnNpZGUgaXRzIG93biAuYXBrIGZpbGUuCisgICAgICovCisgICAgQUFzc2V0TWFuYWdlciogYXNzZXRNYW5hZ2VyOworCisgICAgLyoqCisgICAgICogQXZhaWxhYmxlIHN0YXJ0aW5nIHdpdGggSG9uZXljb21iOiBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZworICAgICAqIHRoZSBhcHBsaWNhdGlvbidzIE9CQiBmaWxlcyAoaWYgYW55KS4gIElmIHRoZSBhcHAgZG9lc24ndCBoYXZlIGFueQorICAgICAqIE9CQiBmaWxlcywgdGhpcyBkaXJlY3RvcnkgbWF5IG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBvYmJQYXRoOworfSBBTmF0aXZlQWN0aXZpdHk7CisKKy8qKgorICogVGhlc2UgYXJlIHRoZSBjYWxsYmFja3MgdGhlIGZyYW1ld29yayBtYWtlcyBpbnRvIGEgbmF0aXZlIGFwcGxpY2F0aW9uLgorICogQWxsIG9mIHRoZXNlIGNhbGxiYWNrcyBoYXBwZW4gb24gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAqIEJ5IGRlZmF1bHQsIGFsbCBjYWxsYmFja3MgYXJlIE5VTEw7IHNldCB0byBhIHBvaW50ZXIgdG8geW91ciBvd24gZnVuY3Rpb24KKyAqIHRvIGhhdmUgaXQgY2FsbGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBBTmF0aXZlQWN0aXZpdHlDYWxsYmFja3MgeworICAgIC8qKgorICAgICAqIE5hdGl2ZUFjdGl2aXR5IGhhcyBzdGFydGVkLiAgU2VlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgQWN0aXZpdHkub25TdGFydCgpCisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdm9pZCAoKm9uU3RhcnQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHkpOworICAgIAorICAgIC8qKgorICAgICAqIE5hdGl2ZUFjdGl2aXR5IGhhcyByZXN1bWVkLiAgU2VlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgQWN0aXZpdHkub25SZXN1bWUoKQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZvaWQgKCpvblJlc3VtZSkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSk7CisgICAgCisgICAgLyoqCisgICAgICogRnJhbWV3b3JrIGlzIGFza2luZyBOYXRpdmVBY3Rpdml0eSB0byBzYXZlIGl0cyBjdXJyZW50IGluc3RhbmNlIHN0YXRlLgorICAgICAqIFNlZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIEFjdGl2aXR5Lm9uU2F2ZUluc3RhbmNlU3RhdGUoKSBmb3IgbW9yZQorICAgICAqIGluZm9ybWF0aW9uLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgbmVlZHMgdG8gYmUgY3JlYXRlZCB3aXRoIG1hbGxvYygpOworICAgICAqIHRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIGZyZWUoKSBvbiBpdCBmb3IgeW91LiAgWW91IGFsc28gbXVzdCBmaWxsIGluCisgICAgICogb3V0U2l6ZSB3aXRoIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFsbG9jYXRpb24uICBOb3RlIHRoYXQgdGhlCisgICAgICogc2F2ZWQgc3RhdGUgd2lsbCBiZSBwZXJzaXN0ZWQsIHNvIGl0IGNhbiBub3QgY29udGFpbiBhbnkgYWN0aXZlCisgICAgICogZW50aXRpZXMgKHBvaW50ZXJzIHRvIG1lbW9yeSwgZmlsZSBkZXNjcmlwdG9ycywgZXRjKS4KKyAgICAgKi8KKyAgICB2b2lkKiAoKm9uU2F2ZUluc3RhbmNlU3RhdGUpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIHNpemVfdCogb3V0U2l6ZSk7CisgICAgCisgICAgLyoqCisgICAgICogTmF0aXZlQWN0aXZpdHkgaGFzIHBhdXNlZC4gIFNlZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIEFjdGl2aXR5Lm9uUGF1c2UoKQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZvaWQgKCpvblBhdXNlKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBOYXRpdmVBY3Rpdml0eSBoYXMgc3RvcHBlZC4gIFNlZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIEFjdGl2aXR5Lm9uU3RvcCgpCisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdm9pZCAoKm9uU3RvcCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSk7CisgICAgCisgICAgLyoqCisgICAgICogTmF0aXZlQWN0aXZpdHkgaXMgYmVpbmcgZGVzdHJveWVkLiAgU2VlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgQWN0aXZpdHkub25EZXN0cm95KCkKKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqb25EZXN0cm95KShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KTsKKworICAgIC8qKgorICAgICAqIEZvY3VzIGhhcyBjaGFuZ2VkIGluIHRoaXMgTmF0aXZlQWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGlzIG9mdGVuIHVzZWQsCisgICAgICogZm9yIGV4YW1wbGUsIHRvIHBhdXNlIGEgZ2FtZSB3aGVuIGl0IGxvc2VzIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIHZvaWQgKCpvbldpbmRvd0ZvY3VzQ2hhbmdlZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgaW50IGhhc0ZvY3VzKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZHJhd2luZyB3aW5kb3cgZm9yIHRoaXMgbmF0aXZlIGFjdGl2aXR5IGhhcyBiZWVuIGNyZWF0ZWQuICBZb3UKKyAgICAgKiBjYW4gdXNlIHRoZSBnaXZlbiBuYXRpdmUgd2luZG93IG9iamVjdCB0byBzdGFydCBkcmF3aW5nLgorICAgICAqLworICAgIHZvaWQgKCpvbk5hdGl2ZVdpbmRvd0NyZWF0ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZHJhd2luZyB3aW5kb3cgZm9yIHRoaXMgbmF0aXZlIGFjdGl2aXR5IGhhcyBiZWVuIHJlc2l6ZWQuICBZb3Ugc2hvdWxkCisgICAgICogcmV0cmlldmUgdGhlIG5ldyBzaXplIGZyb20gdGhlIHdpbmRvdyBhbmQgZW5zdXJlIHRoYXQgeW91ciByZW5kZXJpbmcgaW4KKyAgICAgKiBpdCBub3cgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICB2b2lkICgqb25OYXRpdmVXaW5kb3dSZXNpemVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisgICAgLyoqCisgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBuZWVkcyB0byBiZSByZWRyYXduLiAgVG8gYXZvaWQKKyAgICAgKiB0cmFuc2llbnQgYXJ0aWZhY3RzIGR1cmluZyBzY3JlZW4gY2hhbmdlcyAoc3VjaCByZXNpemluZyBhZnRlciByb3RhdGlvbiksCisgICAgICogYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiB1bnRpbCB0aGV5IGhhdmUgZmluaXNoZWQKKyAgICAgKiBkcmF3aW5nIHRoZWlyIHdpbmRvdyBpbiBpdHMgY3VycmVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkICgqb25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFOYXRpdmVXaW5kb3cqIHdpbmRvdyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZHJhd2luZyB3aW5kb3cgZm9yIHRoaXMgbmF0aXZlIGFjdGl2aXR5IGlzIGdvaW5nIHRvIGJlIGRlc3Ryb3llZC4KKyAgICAgKiBZb3UgTVVTVCBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHRvdWNoIHRoZSB3aW5kb3cgb2JqZWN0IGFmdGVyIHJldHVybmluZworICAgICAqIGZyb20gdGhpcyBmdW5jdGlvbjogaW4gdGhlIGNvbW1vbiBjYXNlIG9mIGRyYXdpbmcgdG8gdGhlIHdpbmRvdyBmcm9tCisgICAgICogYW5vdGhlciB0aHJlYWQsIHRoYXQgbWVhbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2FsbGJhY2sgbXVzdAorICAgICAqIHByb3Blcmx5IHN5bmNocm9uaXplIHdpdGggdGhlIG90aGVyIHRocmVhZCB0byBzdG9wIGl0cyBkcmF3aW5nIGJlZm9yZQorICAgICAqIHJldHVybmluZyBmcm9tIGhlcmUuCisgICAgICovCisgICAgdm9pZCAoKm9uTmF0aXZlV2luZG93RGVzdHJveWVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBxdWV1ZSBmb3IgdGhpcyBuYXRpdmUgYWN0aXZpdHkncyB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKiBZb3UgY2FuIHVzZSB0aGUgZ2l2ZW4gaW5wdXQgcXVldWUgdG8gc3RhcnQgcmV0cmlldmluZyBpbnB1dCBldmVudHMuCisgICAgICovCisgICAgdm9pZCAoKm9uSW5wdXRRdWV1ZUNyZWF0ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFJbnB1dFF1ZXVlKiBxdWV1ZSk7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IHF1ZXVlIGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSdzIHdpbmRvdyBpcyBiZWluZyBkZXN0cm95ZWQuCisgICAgICogWW91IHNob3VsZCBubyBsb25nZXIgdHJ5IHRvIHJlZmVyZW5jZSB0aGlzIG9iamVjdCB1cG9uIHJldHVybmluZyBmcm9tIHRoaXMKKyAgICAgKiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqb25JbnB1dFF1ZXVlRGVzdHJveWVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBSW5wdXRRdWV1ZSogcXVldWUpOworCisgICAgLyoqCisgICAgICogVGhlIHJlY3RhbmdsZSBpbiB0aGUgd2luZG93IGluIHdoaWNoIGNvbnRlbnQgc2hvdWxkIGJlIHBsYWNlZCBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkICgqb25Db250ZW50UmVjdENoYW5nZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGNvbnN0IEFSZWN0KiByZWN0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGRldmljZSBBQ29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZC4gIFRoZSBuZXcgY29uZmlndXJhdGlvbiBjYW4KKyAgICAgKiBiZSByZXRyaWV2ZWQgZnJvbSBhc3NldE1hbmFnZXIuCisgICAgICovCisgICAgdm9pZCAoKm9uQ29uZmlndXJhdGlvbkNoYW5nZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHkpOworCisgICAgLyoqCisgICAgICogVGhlIHN5c3RlbSBpcyBydW5uaW5nIGxvdyBvbiBtZW1vcnkuICBVc2UgdGhpcyBjYWxsYmFjayB0byByZWxlYXNlCisgICAgICogcmVzb3VyY2VzIHlvdSBkbyBub3QgbmVlZCwgdG8gaGVscCB0aGUgc3lzdGVtIGF2b2lkIGtpbGxpbmcgbW9yZQorICAgICAqIGltcG9ydGFudCBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCAoKm9uTG93TWVtb3J5KShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KTsKK30gQU5hdGl2ZUFjdGl2aXR5Q2FsbGJhY2tzOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBpbiB0aGUgbmF0aXZlIGNvZGUgdG8gaW5zdGFudGlhdGUgdGhlCisgKiBhcHBsaWNhdGlvbidzIG5hdGl2ZSBhY3Rpdml0eS4gIEl0IGlzIGNhbGxlZCB3aXRoIHRoZSBhY3Rpdml0eSBpbnN0YW5jZSAoc2VlCisgKiBhYm92ZSk7IGlmIHRoZSBjb2RlIGlzIGJlaW5nIGluc3RhbnRpYXRlZCBmcm9tIGEgcHJldmlvdXNseSBzYXZlZCBpbnN0YW5jZSwKKyAqIHRoZSBzYXZlZFN0YXRlIHdpbGwgYmUgbm9uLU5VTEwgYW5kIHBvaW50IHRvIHRoZSBzYXZlZCBkYXRhLiAgWW91IG11c3QgbWFrZQorICogYW55IGNvcHkgb2YgdGhpcyBkYXRhIHlvdSBuZWVkIC0tIGl0IHdpbGwgYmUgcmVsZWFzZWQgYWZ0ZXIgeW91IHJldHVybiBmcm9tCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHZvaWQgQU5hdGl2ZUFjdGl2aXR5X2NyZWF0ZUZ1bmMoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwKKyAgICAgICAgdm9pZCogc2F2ZWRTdGF0ZSwgc2l6ZV90IHNhdmVkU3RhdGVTaXplKTsKKworLyoqCisgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBOYXRpdmVJbnN0YW5jZSBsb29rcyBmb3Igd2hlbiBsYXVuY2hpbmcgaXRzCisgKiBuYXRpdmUgY29kZS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZnVuY3Rpb24gdGhhdCBpcyB1c2VkLCB5b3UgY2FuIHNwZWNpZnkKKyAqICJhbmRyb2lkLmFwcC5mdW5jX25hbWUiIHN0cmluZyBtZXRhLWRhdGEgaW4geW91ciBtYW5pZmVzdCB0byB1c2UgYSBkaWZmZXJlbnQKKyAqIGZ1bmN0aW9uLgorICovCitleHRlcm4gQU5hdGl2ZUFjdGl2aXR5X2NyZWF0ZUZ1bmMgQU5hdGl2ZUFjdGl2aXR5X29uQ3JlYXRlOworCisvKioKKyAqIEZpbmlzaCB0aGUgZ2l2ZW4gYWN0aXZpdHkuICBJdHMgZmluaXNoKCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLCBjYXVzaW5nIGl0CisgKiB0byBiZSBzdG9wcGVkIGFuZCBkZXN0cm95ZWQuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tCisgKiAqYW55KiB0aHJlYWQ7IGl0IHdpbGwgc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzCisgKiB3aGVyZSB0aGUgSmF2YSBmaW5pc2ggY2FsbCB3aWxsIHRha2UgcGxhY2UuCisgKi8KK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X2ZpbmlzaChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KTsKKworLyoqCisgKiBDaGFuZ2UgdGhlIHdpbmRvdyBmb3JtYXQgb2YgdGhlIGdpdmVuIGFjdGl2aXR5LiAgQ2FsbHMgZ2V0V2luZG93KCkuc2V0Rm9ybWF0KCkKKyAqIG9mIHRoZSBnaXZlbiBhY3Rpdml0eS4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZyb20KKyAqICphbnkqIHRocmVhZDsgaXQgd2lsbCBzZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3MKKyAqIHdoZXJlIHRoZSBKYXZhIGZpbmlzaCBjYWxsIHdpbGwgdGFrZSBwbGFjZS4KKyAqLwordm9pZCBBTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93Rm9ybWF0KEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZm9ybWF0KTsKKworLyoqCisgKiBDaGFuZ2UgdGhlIHdpbmRvdyBmbGFncyBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkuICBDYWxscyBnZXRXaW5kb3coKS5zZXRGbGFncygpCisgKiBvZiB0aGUgZ2l2ZW4gYWN0aXZpdHkuICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tCisgKiAqYW55KiB0aHJlYWQ7IGl0IHdpbGwgc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzCisgKiB3aGVyZSB0aGUgSmF2YSBmaW5pc2ggY2FsbCB3aWxsIHRha2UgcGxhY2UuICBTZWUgd2luZG93LmggZm9yIGZsYWcgY29uc3RhbnRzLgorICovCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9zZXRXaW5kb3dGbGFncyhBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LAorICAgICAgICB1aW50MzJfdCBhZGRGbGFncywgdWludDMyX3QgcmVtb3ZlRmxhZ3MpOworCisvKioKKyAqIEZsYWdzIGZvciBBTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dDsgc2VlIHRoZSBKYXZhIElucHV0TWV0aG9kTWFuYWdlcgorICogQVBJIGZvciBkb2N1bWVudGF0aW9uLgorICovCitlbnVtIHsKKyAgICBBTkFUSVZFQUNUSVZJVFlfU0hPV19TT0ZUX0lOUFVUX0lNUExJQ0lUID0gMHgwMDAxLAorICAgIEFOQVRJVkVBQ1RJVklUWV9TSE9XX1NPRlRfSU5QVVRfRk9SQ0VEID0gMHgwMDAyLAorfTsKKworLyoqCisgKiBTaG93IHRoZSBJTUUgd2hpbGUgaW4gdGhlIGdpdmVuIGFjdGl2aXR5LiAgQ2FsbHMgSW5wdXRNZXRob2RNYW5hZ2VyLnNob3dTb2Z0SW5wdXQoKQorICogZm9yIHRoZSBnaXZlbiBhY3Rpdml0eS4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGZyb20KKyAqICphbnkqIHRocmVhZDsgaXQgd2lsbCBzZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIHByb2Nlc3MKKyAqIHdoZXJlIHRoZSBKYXZhIGZpbmlzaCBjYWxsIHdpbGwgdGFrZSBwbGFjZS4KKyAqLwordm9pZCBBTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogRmxhZ3MgZm9yIEFOYXRpdmVBY3Rpdml0eV9oaWRlU29mdElucHV0OyBzZWUgdGhlIEphdmEgSW5wdXRNZXRob2RNYW5hZ2VyCisgKiBBUEkgZm9yIGRvY3VtZW50YXRpb24uCisgKi8KK2VudW0geworICAgIEFOQVRJVkVBQ1RJVklUWV9ISURFX1NPRlRfSU5QVVRfSU1QTElDSVRfT05MWSA9IDB4MDAwMSwKKyAgICBBTkFUSVZFQUNUSVZJVFlfSElERV9TT0ZUX0lOUFVUX05PVF9BTFdBWVMgPSAweDAwMDIsCit9OworCisvKioKKyAqIEhpZGUgdGhlIElNRSB3aGlsZSBpbiB0aGUgZ2l2ZW4gYWN0aXZpdHkuICBDYWxscyBJbnB1dE1ldGhvZE1hbmFnZXIuaGlkZVNvZnRJbnB1dCgpCisgKiBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZnJvbQorICogKmFueSogdGhyZWFkOyBpdCB3aWxsIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2VzcworICogd2hlcmUgdGhlIEphdmEgZmluaXNoIGNhbGwgd2lsbCB0YWtlIHBsYWNlLgorICovCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9oaWRlU29mdElucHV0KEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIHVpbnQzMl90IGZsYWdzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZiAvLyBBTkRST0lEX05BVElWRV9BQ1RJVklUWV9ICisKZGlmZiAtLWdpdCBhL3Bkay9QZGsubWsgYi9wZGsvUGRrLm1rCmluZGV4IDY3NmY1ZGMuLmFmZTRkYzYgMTAwNjQ0Ci0tLSBhL3Bkay9QZGsubWsKKysrIGIvcGRrL1Bkay5tawpAQCAtNzcsNyArNzcsNyBAQAogIyAgIGRlc2NyaXB0aW9ucyBmb3IgdGhlIG5ldyBoZWFkZXJzIGFuZCBwb2ludCB0byB0aGUgbmV3IGRveHlnZW4gY3JlYXRlZCBodG1sLgogcGRrX2hlYWRlcnMgOj0gXAogICAgICQocGRrX2xlZ2FjeV9oYXJkd2FyZV9kaXIpL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuaCBcCi0gICAgJChwZGtfbGVnYWN5X2hhcmR3YXJlX2RpcikvZ3BzLmggXAorICAgICQocGRrX2hhcmR3YXJlX2RpcikvZ3BzLmggXAogICAgICQocGRrX2xlZ2FjeV9oYXJkd2FyZV9kaXIpL3dpZmkuaCBcCiAgICAgJChwZGtfY2FtZXJhX2RpcikvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBcCiAgICAgJChwZGtfaGFyZHdhcmVfZGlyKS9zZW5zb3JzLmggXApAQCAtMTgyLDcgKzE4Miw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBwZGstdGltZXN0YW1wIHNhbXBsZXMvc2FtcGxlam5pL3NyYy9jb20vZXhhbXBsZS9qbmlleGFtcGxlL0pOSUV4YW1wbGUuamF2YSAgCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gZGV2ZWxvcG1lbnQvcGRrL3BuZGsvc2FtcGxlcy9zYW1wbGVqbmkvc3JjL2NvbS9leGFtcGxlL2puaWV4YW1wbGUKLUxPQ0FMX0RST0lERE9DX1NPVVJDRV9QQVRIIDo9ICQoZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfU09VUkNFX1BBVEgpCiBMT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSAuLi8uLi8uLi8kKHBka19hcHBfZW5nX3Jvb3QpCiAKIExPQ0FMX01PRFVMRSA6PSBvbmxpbmUtcGRrCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMy92ZXJzaW9ucy5qZCBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvMi4zL3ZlcnNpb25zLmpkCmluZGV4IDVmNjM0ZWQuLjViN2ZjZWUgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvMi4zL3ZlcnNpb25zLmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvMi4zL3ZlcnNpb25zLmpkCkBAIC0xNSw2ICsxNSw1IEBACiA8cD5UaGUgdmFsdWUgb2YgPGNvZGU+YW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlJFTEVBU0U8L2NvZGU+IGZvciBBbmRyb2lkIDIuMwogTVVTVCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOjwvcD4KIDx1bD4KLTxsaT4yLjM8L2xpPgotPGxpPjIuMy4xPC9saT4KKzxsaT4yLjMuMzwvbGk+CiA8L3VsPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMy4zLWNkZC5wZGYgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4zLjMtY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmExOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMy4zLWNkZC5wZGYKQEAgLTAsMCArMSw1NTg0IEBACislUERGLTEuNA0KKyWTjIueIFJlcG9ydExhYiBHZW5lcmF0ZWQgUERGIGRvY3VtZW50IGh0dHA6Ly93d3cucmVwb3J0bGFiLmNvbQ0KKyUgJ0Jhc2ljRm9udHMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEgMCBvYmoNCislIFRoZSBzdGFuZGFyZCBmb250cyBkaWN0aW9uYXJ5DQorPDwgL0YxIDIgMCBSDQorIC9GMiA0IDAgUg0KKyAvRjMgMTM5IDAgUg0KKyAvRjQgMTQxIDAgUg0KKyAvRjUgMTUyIDAgUiA+Pg0KK2VuZG9iag0KKyUgJ0YxJzogY2xhc3MgUERGVHlwZTFGb250IA0KKzIgMCBvYmoNCislIEZvbnQgSGVsdmV0aWNhDQorPDwgL0Jhc2VGb250IC9IZWx2ZXRpY2ENCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0YxDQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Zvcm1Yb2IuMjk0ZjViOTQ1OTAxNjgyY2Q5NzVhMjc2N2I2MDBmNjMnOiBjbGFzcyBQREZJbWFnZVhPYmplY3QgDQorMyAwIG9iag0KKzw8IC9CaXRzUGVyQ29tcG9uZW50IDgNCisgL0NvbG9yU3BhY2UgL0RldmljZVJHQg0KKyAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0RDVERlY29kZSBdDQorIC9IZWlnaHQgNDkNCisgL0xlbmd0aCAxMTU0OA0KKyAvU3VidHlwZSAvSW1hZ2UNCisgL1R5cGUgL1hPYmplY3QNCisgL1dpZHRoIDM2OSA+Pg0KK3N0cmVhbQ0KK3M0SUEwISJfYWw4T2BbXCE8PCojISEqJyJzNUYuWThPR2pQOmY6KFk4UERQUSE8RTAjIjcwSDhFLDVSVSEhJGtSRkUxOEw2NktCNT1zKygnISEzLS8hIkp1RiEnIkNzRilYRUE6ZVVpaHp6enp6enA9OTNFemRrLCFJRSw1TFN6enp6enp6enp6eiEiTyRPPV10ZSohQSIzTiEjMCdKPV10ZSohQy1WYiEjL21FPV10ZSohRTklISEjMFghRS0pJ1shR0RINSEjL3BWQDpUPzwhSU9rSSElYC5pO0Y6RWEhTjV0dSEiTlhAO0Y6RWEhT3IrMCEiTkk7O0Y6RWEhUVk2QCEiTzBeQjY0K1IhU0BBUCEmLzskQmwzbk4hWEpjKyEnIk0jRig1MU0hXkhfYyErXVZdQHIyMkchaSxlciE7XlBMRGUmaEoiLyNWbyElOz5yRWNfOV0iMzpIQiEka1pMPXMqZUZ6UyMtL2M5TjsmbSFqR2QwPXMqZUZ6Mi5IVWRUQmNJVyk2bTpIPXMqZUZ6LS1aRGknQGQnX1tgKT9PPXMqZUZ6b0BPJEQhISEhIignbnRuMUdTcTEhISEhIiRiJCo5ImRdMmdvMmJubCM6VFdRclJfKUxxbVpWKnJNQlBwIjUzX1RfIk04XEVjcUVfeiEhKixGISEkTU9FY3FFX3ohISosRiEhJE1PRWNxRV96ISEqLEYhISUxUEI2NCtSeiEhKiciZDwjP2chISEhInpkPCM/ZyEhISEiemQ8Iz9nISEhISIhISRuSUJsM25OeiEmK0JRVy40ako7WkhkdDFkRCRAV14kT2EtQzRdNCcmKkJkOmQ+IVw8J1VFYjFHXSI0MUddIjQxR2BRUUYoNTFNeiEiKTduK0E+VGYwSyhjZ3p6enp6enp6enp6enp6enp6enohISRrUEZea0NPeiEibzgzISI8YVM6LzppaSEibzgzITllQkQ6ZklEcCEibzgzITllS0k7YWdaZCEibzgzITllJC83UypSWyEibzgzITlkcyU2cVtMWyEibzgzITllYEI2VltVXSEibzgzITllJDg3VCczZCEibzgzITllMCs4bCxLZiEibzgzITllITM8RHJrdCEibzgzITllQjw6ZVVpaCEibzgzITllQkQ2O2RkYCEibzgzITllITg3OGowZCEibzgzITllYEI8KicmIiEibzgzITllSEc7SDNccyEibzgzITllMzo5MllgaSEibzgzITlkcyk2cSUoVSEibzgzITllPDo6LnRXZiEibzgzITllLT04UTVaaSEibzgzITlhRFIhKU5ZPCEpKkFoISZGVS8hJmFnNyEhJGtRRGUmaEp6LDRHUjQtQkozLSEhJ2tTODpVWz96enohISUrUEddV29jISEjQilFLVpKPEI0dUIwNiNeZFpBTG5ycURJWTpNKz5QVykzPDkqPCEnaXR0QmtAPkY5aGJVOyEhISEpISEuamghIUU5JSEhKiciISNiaDshISEhI1RFNSlyISEhISIhISElPlRFPi9zISEhISIhISEhUnpzNFtOQCEhMzAlITxFMyYhPEUzJiFXaUUpIjlTXSwhV2lOLSI5U2MyIlU1LzgiVSwmNiM3MVk/IzcoUDwiVUdKQSNSTGVFJDQ2dEIkT2RDTSRqZDdKJE5KaVw2Tkk1aSFXaUUpIlRuaTEkM2dZPCQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0P2dLISJmSjowYGM3ciE/cUxGJkhNdEchV1UoPCpybDlBIlRcVykhPEUzJHohISEhIiFXclEvInBZRD8kNEhtUCE0PEA8IVdgQiohWCZULyJVInIuISEuS0shV3JFKiZIcmRqMGdRIVc7LjBcUkU+MTBaT2VFJSo2RiI/QTtVT3RaMUxiQlYjbXFGYShgPTU8LTc6MmouUHMiQDJgTmZZNlVYQDQ3bj8zRDtjSGF0PScvVS9AcTkuX0I0dSFvRiopUEpHQmVDWks3bnI1TFBVZUVQKjsscVFDIXUsUlxIUlFWNUMvaFdOKjgxWydkP09cQEsyZl9vME82YTJsQkZkYVFecmYlOFItZz5WJk9qUTVPZWtpcUMmbygyTUhwQG5AWHFaIko2KnJ1P0QhPEUzJSE8RTMlITw8KiIhISEhIiFXclEvInBZRD8kNEhtUCE0PEM9IVdgPyoiOVNjMyJVInIuITxSSEYhPE4/OCI5ZnInInFqNCEjQFZUYyt1NF1UJ0xJcVVaLCRfazFLKl1XQFdLaicoKmtgcS0xTWNnKSZhaEwtbi1XJzJFKlRVM15aOyg3UnAhQDhsSlxoPGBgQys+JTspU0FuUGRrQzMrSz5HJ0ExVkhAZ2QmS25iQT1NMklJW1BhLlEkUiRqRDtVU09gYFZsNlNwWkVwcEdbXldjV10jKUEnYFEjcz5haWAmXGVDRS4lZlwsITxqNWY9YWtOTTBxbygyTUhwQG5AWHFaIzdMJGotTTEhWUdNSCEnXkpeZUctTkMwMXUiLG5HYEZmYTRlNGNwTSI6Yzg4UENuMT5MLCJNXT5TOm9rL0NibG5Xb2gmI0ZZbXBzWipmNmgnOG1JT11eY2RraSFjJlA3L05ndE1PZXFhK00uJUFeSDkxK1lbRmAqNWU8KjBNaSFJTnM1KW5FN2JUIl9vKFpuUlBQMk5oWy5nOUczX2dOS28tbExyNXU0V1w/UG9XNXAzQGp0czhsPzwkYkltdSJoLUdfXVk5Y25AI0taKy89JmhnV102aFVTQkFPWFhaUWI1dXRGZi0/MFxiQUMhaFdrNTQ/P0NIJytYbztPLGpaRz9yO0wlcTREXClYK2A0bFVmZSwwYTldaW0hUDgoPy1rJm1kaU9cUCU0Tj9uKW4kUSU4YjVGcCFuJyk6QSFLYSdYZFQkMEpuajpXKmNxZWomWVpmakJSJ0ZlKD4sQ0dqJEdicVAsMCVDOE8jXkBJRztqQ0oqKmtcYFFiR1tCUmxHRD8pMmJIJ1AhTW8uSjdJLmhhYlBLZkFwKkVgTjsvaGwlKl5gQFskY1BNJlRQQyxkSipacDFbKSpDaXRrWWMtc2w+SStuZ0hmTy9NKVY0QyhuayNVSklCOzFTWU1fSDpBIXNkaiwtXj5EODJEOERsMkJbUj0/K1MhLDE3M3IjWEVIOWdcMF0qWnIvZHJmdVRYZE8wdHVLKU9cPzZIbG1BKzVSMUMkX05kZUs/LG1gLmZIJ1QtWE0mMD8tdGhGciNwXHVaZ2FJcjhacGs2KVMhJXRTaytPbEI9Ok5vUVAjPFAyXTpXcjJmPSJEcktiLyxIczlnZzZXcm9cXXA/IUkvOTs9NWwtUTUtWi0rM0VOWy0pQT9tbC4zK0hMbV49NWpiV11xRy9UYEVKbWtvVCtmVy1oLG9bck9kKW9ObjZQMj1DVGRGKExVbFc3YltgJzohOFBZQTxMLDxfSyFRZDQkPmMvbGZJQzFBUEZdS1AxRGFCWGk3JTQuZSRbXUtVO1o8W2RiXTMyJTtxPkwiXWI+SlpbdVY9PTFoQjkqMC0nIzk7PFVKOjlBI2szcTpkP09ENjhIbl5XIVx1IytnL2JZQkxBWlJNWkQwaD5NTSVfJElVTkknRSRqXCg/TldHUDRCM3UwX3FTTVFJIm49ND9pVkIvOUlEOk9nJT1qPDdiQUBeKVI5YjNpRDowJWhQMWRvJXAjYC5AKFZrQikkMkVMVU0qPDlWcmslMExDdEtbVzk8RSkmRyQyVV8xRnQ3TClDY0xQMmA8RVZhMCZBJVtZNy5aSCdSOWlmIWpkY1pyJzgoRmJMTiw1UXFqITVRcWpea240altFMm9aYWJdIVJULUJcXC9cVjJYZmpdTmdqNlIvQEQ8WDReUCpDNk5FSFpdQT08QjddXmlUa280MCs/MTBmZDxPWC0+NTcxXGpgMl1gY0NBZEc4MXJXSlc6MVBDXT1BSXIhaFY3J2tyKyhuSFhrWltGRmw0N1tcJDkydClQRkByTkFkUCFCJihhbCRkOFdKZVZqSzldJmtNRzZTLVVxKXNkMDM2ZHVEVkpJOUZILCEmVTpMT0M8QHAvSlNmUUMjWTtGS0s/RiUyUmUpVit1Z1k2IVpaPEs/NygwKzcpJz1AOF1rXERuOi48bEkoLCFXcixpV0wxaj4pU0hHUitOJSlCOD1MVF8vUy5NUy9nUmwzTiVoUTtjLlY4J1czUWBHLiFYTWxMKzpqL1RiSTUzWFJAJldUJCxRQlFtTEM+MkhyKEIvVFZEOW9OLlQ4Sj4/IkVKMDkqImwjMFRhbEhJJlMjXjxhXV9mbS5pXW9hXixEQCFcISZBc28iNnNaNTtPX10hOShDZUVdJ0oqOk8ucUxdXmFQcTchJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhJT1TISE5WDgySHJmYHRfN3A4ak40YF5hX1ZKZytAPjxKaW8kOGZmNjZJTl5pRTVZOV9PYlBeKXVeMStpL1BaLl9pN1dTbjRoRCIsLT9AMjdSLHQjQlJmXnQrOFIwUnBNVURrPV9XPSZlK0VTc2RQckEoYXM7XVk6YTJXZihdWSYycT1aSFZgN19VNWljPXIkLlFEMGZHWi9oW0M4NnVgaGNWSTVoJGRNZS5aUHQzYSFeQDhwNE1qMWEvcHVebz47L0c+P3Q+ZCRnUzI9IVRPXV1YO09UMTttaEFjLDkyOHNTZXBBa21Ic0RoXzdoPi9uQV5hUG03MTU5O2AkO2U+Sitzb2RPRSFFUCJCVHUsQmEmSGohMSNlPjU+QiQkMiVlPURuTCJmKWQoQSNlMDBaXWZKYHBbO0grXlFPOWxyczRVIXQyJ3VcYUA6MGorM2BDM2tIM2g0YEtRVik4WzxpNHMuaDxiKy1lXl8pNzNmMWoqbEhLYkdyWCd0QGRublMnWklaWjFYJnJUS2lFa2srOipSZ1diYjBUPmhcZVYuZjxLXWxwbyEnPUwpcFZhYThSQyIvWjU+QFAmMTJhWHI3NXVgJiEtImUvWCUiOEhZRlBeXEIzR0twO1Q7IlJSbClbNzZiRj9BKFsjP15WIWQrQ0deViVMLEZOJW1hSVhtPSMhNy1BZ1oxcVlKWipvUl5pSzBjV1IhUjA3UmwocVMsNTpDZyY0K1svWHFBRDRBSUQpQF1xcnI+MyhRVDtzTzJnWj10clgoYUZFOUdGPkYvcCYlIlBsSFAqb2BDXypeL0dRcnI8TiQ6XShUWF10PDUsWGZbWiRUKywiLWdTQF1MSzRtU0BKTnRPcyxpRiEzOlpHYV5xXGVXWj5YLFNjYCEyLHBKUERaZCZfW2cuKl9NcCEiXVA7biEiTSd0a0pnUV9dSSNFZlUmQ2Yob3U+UFxLTkJJbmMvJXU2P1lCOyNGXTFyJklqOmNZUWklTz5pSThKQzYpODpmKTpcO1dYcz90TmZidWxHTjBCNEJKZFNdXCE8IyIyVj5QQi9kQGtwcG44KlAtZjxpYCVgMUhjVitMZWM0JFY4Ry9hXmAqbyl0VkI4KlVDaF5pMWo8ZzpbbipEZUpjamxFdXFWcjhiTlYwKUNIaFBrWG07RVljNUJVSiwpJSwmLHVYXklhZTtzOE0yTjA3aEJZbTpQQCFecGtuVUQ8c100VEtnYy5lTkJKOCFlcz1lVG0kak8pVW1vJlRUQ0RDPiJiNG9ZZVVSJzwuZUtvcTVJQWFmNSE5amMqPHQqX2EmMC11OFRBNmQoRkNuV14sQWw1LW1fMSkjVUZFMi1gbSldQDpjOzU1MSZzIzNtb3UxTWIxQWlgPWA+U3JTIWlxZ2xsKS9yIj1UJTVQRlU6USokITwkcUFoOjB1UHVMYmBGUjtIaDZwNVt1Qj4lUDkkIjUpaVRlJFNnbklmTzBWVURrKTRGXTtKayppV0YqLERvY1c6PUhfLVlxY2g9UjMjSmYucjArTWBfKFY1WCsvMFwjLEF1X1JSYWwnZTkhIyghOCFCYkZeTVckLU9pMWtgJFAzIT5OaVYnTWo3REYqbkYlJTwlb2E0Nzlqc3RaOSNPU0BgSG9eYFhoW1s6UGkhWzozQykzVHNoaWk5Ri5fYWBYJytxY3EhPydnJ2pFQF5XcSJPWWlwbEZFMV9gUTBKbEpEW2tkTlpBZjBKczcoVmpLa1BfdSwmJVF0KkxSR0I+M2I/OGlPO1EhPkBYJy5iSksoczgsbFVwLzoxaylcLztEVW1MaGI9JnJkQy9xVGBRSkYqPVQ+cUolU2VUWWdCNyRoPClIOmVDMkIpN0ZbJz10I2dPaE9KTDZIZD1MJCdadWFNaURtbG5lMWpadE88aiNyZFYzJTc5KFMhKj5KMkRXNmx0bTMiLVxtJkIlcVBdZiVjcnI9JTFJMDhDPHIwWTpfcmE2WWJyZjRSaV5bUCJFcScpOSpySmBXNSE5bEFLRD0rWkdoaHM3O0E4QTJPZ0NNVFhKcCdqVDtpNUdqWC8pNltEMStwIjh1LGJlN1ljaSg0cTgrWDJhay4pb14tJl1VXGNVI0NSQ3IqWW0pcig9M08mJ21kZysyV1M8VEgjRWg0TCE7PzA8am1eVThZNkZdYShgJDMlaTs2LWJgclhEKlg1S1NibUImI11KJygtYyYsUHNbcnI+V2VXO2NqNzQnUU0jITA9bClsdS05J0BAREc5UTczVmpcc29KdSZfbXBsSCgiVldcQHJtK1RgbDkqMzVsVFtbXzErbC48ZzN0OywrTStIQyUvIidTIXIxNiNWTTNUSykhP1xCamZOQSwmKFNUPkJEKHIlP2hTbjpUI0UnXXBAODk9LCFWJUtKSXIjb0ZlOiNVQ0xqK0VdSG1nIl1gPVQwOThvRFhqK04jPSkuSk4ibWtpTixhYU5WdUAiWFUpZDFRW110NGJhKXRvKSFUQUtDVHVaJ3JqXjJAYid1XW8kJzRBJShscytPMG5TNGZ0JnVPW1Ffal1sPUdKO2UiLVcyYGxdQTJhO0I6SkBCcFYuXDMraHJSWjIyJ01MOmhKNFRlMFJTPTZnJFwkP3JjO2ZiSUlLRzM4OUM0VVFFdGlqV3AtNnAkLiYhZi1NZzJEdVRlYiYrTSVIXjhMdTJkXlEoJkopcXJBKzgrb0tvW2JDOlU7XTYtJUhWXztAaU9QQmRPTkg4WzVvMTNuO2pSI3JtZEE4ISFoS1FRW2w0Oy0wYjlGYFIqL2tvXGxYakxrcW5kJipOQkJQZCQoIV9kR0Eua104dUhUSD1hM29Ja3MtcnI8UkFkZEFCTT9eJl1nbTc3aTBqQF4uPzRpb2RAOjZnVjNGb01IYDsjIzg3ISsvV1Jra0hbQXJPQlcnZ3BNWS5xUiQ4JmRIT3UnRz9ZWjpUdTwxcG8kX1E6NGxtQzVRYSsyZlQzSzhvVnRQJU9bPkxHajlabTxuSVFMM20mJlU7dCVmWk9mKHQ9Sy0pRj5iLFs1PEhuQWNzU1JTdE1AbyNHTi4oXidCJThuPzltJT51TDozKUsiVEFsJCRuVk1vQU0nN0tmS0dVdU9PQCtTPkUqcmxgKElEcik2LyEzZkIkITlkLWA2MnBvZmduIzFVR2Q/NVA/U2goLU4pT3JGTk8iTidlKSViWFVHQypibEJyW3BYXnRCaVJXVFU+TUdEUXMjc3AtIWJCbDFcW3NhLW1VcSUuY1QkP2ZDajArMTkiNmFuaG10cEJgbVshX0U+SzcyOVdHak9vVEI3OCk1aj1mJTVqPUZuODEnNVYnWSZrKyxgM0hZKHMhcEdeMlgpUEpyZSJqbjk5Vl0xJyReQGJYKXViIVxvbiJgLXUxMExYPyYkajlvVyMhKylyMSE5YldATyJBUUdHY2lPPzBHQTZUOmxRODMyOCVycy8mJlxbJF1MUlJqNF9KUG4xUFouaHUzY0pWaSgtaCRxJnM0PHEjb0huazNXKycjdGlPT2MkREQsYi9CYkI5RyEyM2BqJkliWzdYMlhnR2pNSiZHUiUvXl5EUGsyXHJVLW5LcVBoYCpkKkpiYEBYKE00UTglIjg5XFFXQCdzTTRCY25KdDgtOWMqT25EbDcuc1tCZ3BiPF41cjlvIlZwZkxIKVNdIVhFWkMiWmFZK3FoKCh1W1FnUmZhODAuNWFrUkRrbE5kYEFONU4yP2VrNGsoQmw2V2dZaUNQOEBGbjZOInB0MmoxTlEmQDhFWCJOTCEoY1wscGFBInJYTTRsaVkzISxeUTdbQ2AnU1NoYCMhJGFXZ0dnKUkkS2NoUCs4SVlLIlRKSlJZKWlTX1VoNzdYXUwwVl8lLmMjLjAhb1VTX3BNSW0vayQ0VGVYVFFQViJOVURIS2JvXExHRWNAN29BZFFwPisvRy1AIVBaX0InSGU7bSdAZ2VdT1hcTnVKP0wvVj5VKUUxb2BtYWk+N0M+UFBdKUQxIj48Pk40Q3UiaW0/UClSXFtqbShJYVRPaTghbzNzLjRcMFtEXXEqQWE0Omg+QEpjXCRZb1JpPFpRJmRQWDMrWiNbK0I6ZydHXEB0RUY/LGJGKFw/Ni9ucWc9b0AhQC9OUipSYkJdYC8lbktsbSF0PElycjw6PG0/LEYoR2NaQjFANSsmVzVNJSwwcHQ7aiNmZ2FLT2FqIkIybTNkQGJyL2BqNyxkNDcqbSFtcmc/T3BiXU5cKlc2M2tRJDFAUyo+XC43dCtWXEpiPjJnQF1yUHJXcG8jKl5AVjpYX2g5MD46JGpSYUgzbHVOSydFL1kzJTo4IVB1bW9gR20hLmBNS11XbStMQSlYdD9FMmkwKUFWKlJITyNjLmt0JjhhKD8wJSQmUCVITGlkKTFINTRGVDIkcmozLnVBUSErM2EnXGFML01yXTsnT2BgSjBIZF9hMD4kJSJPKWJ0NXNAVzQtbmxJSUhBPm83TGJobCNVMXNyWChbRCdZJjpscGomcjQmN1FsSThgR19zSEJlV25sJyNDM185XmsvXzRNUEFHQVo3R0RbTDR0SUZbXCkpZC1kOCxYdTwzK11HazRudFIzJUElZCJsWlA2U0I/TkBfaUZFbGJIaGFyZygwRTstP3JgVHRxWGg2UT9vM083X2RqImVsSnJzN0gvS21zNCw+S0IkNE9eMCFcQCtWWFNramIsWSVqQVspIS8tcWJcX2BUQz1DL1BVQnM0YU4sNU5abTNMRzA+JGZDZU9FNEJeLnJUY1Y0Y2VYJG0xXEU9SkA3QSFHYGlIOF0/QzBRIStXNz08QSkrLVFaQyJJPmBeYmAsayk5UjFPXUsrZGRfXi5lU1pzXEl0bWctTkxkRVtqT0drJyk/QlI1OCEvYjhhWigvI0VdX21ASWIjOmNwVjQsJl9lVj9XRkkhZVdZWHI7ZCIiVUBjK0tHVVwiRUInJDlPSFtcQnBMUj9IQShTdShAXF07YjIhWEQma1ZwIjltbTRPTzNbPyctSDdePy5UZnEkaXVVVmxoIVlDbmd0VEphbSdjO25bLSZwIj5uUSYwNFQzIi4pPkhTO1tsdGJaXUpsaFRWVHJlLkhgNlgoKTBJbl4yXV4qQyJEISk0Ti9oVzAmLHVXSkl0aUQubk85WDkyLiRsLylGOycpQD1uKC9qLHReMzMhKURQLWpkXUZKZC1NOWFmSzldcGFAWSJsPz1yVylyUWFRWDRiO2A+R0hYVkVYbSVsMWtuYDhfOF1aa0R0XWR0b3JTKCdlYiJeazA4QWxRXFs5Rl9gbVtRLjpHP0F0NDNWQV1XRDNYVy0nIThTSkJnLlMhIyheOUdlPkE9KihNUUZXQFRtJCkob1xdV2pfViZmJ2A3WWBgOE9PO1NVPE0kZmFhc21mbi5KbkRvJEBuU3UoJFklOT1qZyJJUV9CNWZWR09vUEspLGs3I0hPOlJFUCE1bGppKCZuOCVoYzlbVl5wcERCciJNRjBELU9lMDh0aEM4RGhHJU0mXD9HcGs/Z1xvZWVWJz9IZWc6P2lcbyVpLFkkXDcpW15DK0RWZ2MkKSJiIzxgOGBoUDJyWnJLJWcuYE0pUC5PPlwqZk1PLVRIMjRnSyhjOj9kUjMzUCssJXNhM1hiY25GPnJNcnJDRyplTmBPVTNwP1BZcm5QNnRJTyJXbmY+NHFCKmkjT2U/ZD5uLmJBXj9dVWxnWlApM2o1Y00jX0tcLV4kIUdyckBYaT1QOGBDcG00a29aMkw/UV9cJk1LaGxuN2NGNFY5VGlnOUFdWWQwJkVeVmAzKC5uSjY6b2QhLCs7dXJPampwZSNGSHU8YkhBQ28pYW8/SzRrX1hvZz5YdGdaRFYmUmtWOy1IU2laaFchRXJIO1EyJD9dPysyVUEzSlU1Sm9SbDknIlloIlk9O210bVlEbUEnL19SLm8zOUF1TjE6PWkpcz9aJEM1SGpjQUQvPTw0MCIxUUhdQjxmLV1cci02Wl5IWC9SLXJMMSxVTT0nNSdqZGUha0AxajpsaDZZM2JGLGxZR29aXC1AXFgqWmAvKkBYJyohUzxHQzZgOUdicF5HRD5kcmc8UDBwPXU4dDBrYDo8KlYvMVpEM0tZRElSQmYhNDhNS2xWRU1oK0ElVUVIOScnTjk+MThaN0BEY1FOWyEtKTklIiVpKkJGRWE2XTVTRFw7MnFIbGZyUG0nVEtbLFpiYzRuc0pKRGNhJCsnTkVCU2lTPXBmKio9ZC9gbTFmLjUndWFcSUA7IzhkYHRhPkxFTkA3al4zKy07KV5zRms5Mi0mTW1uZjktZGFxSEdMJTBmVDpXTko4ZzEqWFlwaE9DLyVvTGQmWzA0IiZCZUFIaVBtal8pOEopUmwpcCdEPlxLMVZScDpnPD9pcDRxRF9vJiZWbkQ5IkVYNTMjJE5KXnQyVmN1IiU8QHFkPFw0JFJXL0JVIycmP2dKVVw8ZDpZcGhYSlxcQEwxbU1McEpNTis6JEpoNSRkMVtzSiVCW183c1RdPWxGPExVcVdqT2wuNWo4XnEtJj5bJEBiZCpFOmEuLWhNSCYmPGcoLyxMZkAiMy8lbHEhN0dgPVJjb1ZEXzE5Jl42KjojREJVYTFqZlRXVWJAQzpkZ2AzSV4iYG9XXXI8NVc8InRxKzppcGg3Q21WUCcyRChScDpfaj1gVjZKTjVncCxrOy1vQy1bVXIrNUJMOEBAclJMTW8lIUBGcFVhJ3BLLmBXK191JzkhMW9KJjJWZHRsV04sU29GZm8rIVJSc0c+V2RIWls5IjZrI2RoKUdeNFdVQXJOOlNccG5Ray5fVDlBT2k7V2QnWUg3RDFZOVNYNSJDYmM8LFw5PWEhUTtVXHJwRGwiYz5kMiNlPlxiclImaHF1OSVdU09PITdzJm1lNCtqZzNcKlpcSjY5YFJiYVE8aSxAP2xqI3NTdVsqKEZZQj1sdHMrTDciUWU4OF4qPDRHcC82XClFcWo6Ni0iYz9hVDc/ZUopZmhcM1hnblskLnUrJExmbDhwcT0oN2JVaE5bQ0xqXUI2Ykw3RCs+UCYuUyc1aCknaV8qSTAmOyQySS45PWcyPCQ4OHJtXGFfW0UySyQ8Ny5oMSMlVCM6RzpaKF9IJClqby41OlRYP0VCczMnbyZlUUg/UyUxVVsoa3BOdFxULjoicXFmX0o9XmcyRnNmZyMpTGtmNyMxREdOIXRyTSJMWGNBYiUuISNwYD9RWjpNbFRAPm8qLEttbUlRazhlUmVwb1hFWUkhIy8qaSo0Tl5bYm5FT1goaE8yQG5BIV9RU1lqR0Zhb1pNOGNkJ0U4XGM1P08wISNyV3BoPmU7b0UsNlxXI2NdWDMsPFpxJm9cO009RGw9XFpHTDFeQ1lLbldDb14rSiY/YmpoQmhZTW0lYVJcJEw6VHVvLzBQO3AkZDxBSVVYVXFjQihGS2VVYHI8KiJpYDs/PTNSQEM0QC0hLUJlOWRQTW04IzNgWDFzcFhkIi1XM1koXiFLSyFKNWZuaiUmWi03YFAmbDJxcUxYVXRDMmYuXGowMU0lNGFCcS0zLiFLRk1yb19mWFA2Tm4pYEV1WT1tQihwZU1RdGBJSVdZU0h1IWcjRyVhJmxbZF85JlJTcWNDSTdZUC4iOkdAMmdTRl9INlApLz0mJ1ZcLDE7QzksX11PXFxoUXUxJU1FX1VDKT4tWF4kPWk4UGdIb003ODxHMFdgLCJzKGdvTUc4Mzoya21KWUpuUV8scjZgPyZjXW5YSExQJnA6Iik4LTE4MFlrckFBIm1ILGNmMXRRZzJhYVwtUU5pKEttJikhLkQ9Yy1XdUJQczUqQSNXZmAmaTg4ZWxXXy0uY2JiL05HUVlqcG11ImMjVXM1Z21saD01Q1hLSWMxUHU4YktoV2BRTDFzQGtkJidMSUM3WGEjSjtTX2RuMTdpRFMwWyk5I2A2TnQkLCZyOE0+aDpPIV0hXiFdNXVXMGRkV190Zm4qSTc5KnVUPC1qNEQ0VDpMRVZBamZQPzFkXUtxNHA/YGh1bV5bTz8pX2A1STtCJGpjKT0nYmVpJUd1SiE1ajk8R2dVbXBISjFaaEJiJHJJbHNOWEBBOyNSXjJNOFpAZ1JTMlpOYmRpLi5GUi5lKkEiWi9LMmxMKzZGcz1rUVlmSnFqYUxQL11DY1xGXFBoZV5JL0VlUHBdbmZmL0dPcWdycj5wY2EraiU/I2JmYG5Ob0ApbGcvLm5CQDozVWdANms3YCxpZSEpOSdqPC9JMDNhRTBDOF09WDZJPj5kT29JQEktWURcZXJbOGUnajhuZyNiW0I0YWhaZzlIMzdLSTc8SS8/PlckL141QThbI2lmcG5HRCU5OSVwWEYpTEksOExvcmw4PWtwby9Qc1gnWi1XWU1rLyc3W0tsUXElLjpCWTQwVlctTD84ZTNXam09YkBfW20lLlhUVU8yIyxsTEFKWkNZLW45MCUvYF0tbkZQSldkVGtHLWFWPlxSaVpuOGFQdHRcYEdJQFxVcT9zdV49MmR0Zm4pNGVyWTdvKz4lOiYxRUlKKEF0Q1FoQiQ4Q2hxYSE2aF9uSjhiYEROOGw5NS1HNkcrS2NCIjkoYipqN3E5Y0tTZFhLPDdDTzxAP0ZMIkpAbV42bz05V0BvRz40dC1rck1HI0ZCY2RPaGRkQVsjLjUmOmtvMTUkSzh0ZmdNPCEiJUpnWjldQ2M4a1JicEZfNy1kQipFaHJLXVNHIThmITVHSmJOLDgmNFImbF4lRCZwSCUwLi9gW0RNSEJtOFskYTtXMWVpOGJxYVFRQTA2M3NjMmtILzEuZ2IiSCpFUy9LOD11IXEzXkVTWHNjO2NJO1NfS0M6R0FkRVxJdW1SKmk3aSJ1JE1dODRmPlxtS3IkKHE3aiIla01wYDk4dS0yc2BkKjdjZ0ZMLVZlW2JUMDsrJi1tXUxwJEgrKWY4YjRgcF5jQkFMLUhWPkRyVjozZ0hNJSw5W0JRXFA2UTU2LT4/Il5gYC9sWio5L0VEN25wTUIuKlpnPGNSYTtpYisiKVZbbytZSlA0NzsqVjRGLSFkZFBGJ1d1NE4sWi9qZFo0c2taKXJNP2tfOlBRO0JaaEM1biMxTzkvUkdqTmI8JjBIXTg7TkQzYz5xLUtkdWlQN15NNXVmaEM0Kk48UkFBYlUxb2hWXCFlYnBUWFw4ayMrOmlJIUshQEQlRSotL1ttT0twNzloZWllWUEqIm1PaVhfQFxCXjJcQWdZOT0xK2U7UUw9NTZlWypxQm1kQWNTSG1SM1pvSC9kOSk6OCVcRylHUy5fdEhvM2A1O2EoOC5mISNkIjNlMW03SW5KcnJCQixtMitjQypVJysnRFl1ciRwayVNYjg+YGYoUS9hO01eMk8tRWVbQE5JPC8pQ05qLD1vUWIpNWlfU2VtLHFLdTFdbEd1OlZyQnU0UjJlWUM8Zkg5OD1xZyhjKWJhXVs/PGFhWSoqM2RjMklqa3VWaEwiO20mXjhrXiMzTUkvMS9acEM5LGA8Y0lGRDtXUzdFWj9wIVcoRVdwYEpHJlNKVVlRQElTJ2w0QC5zZjplYVleOmN0XWJSN1VJIkFpQ2liYU49VitZPTVCSTRaOjJdZHIlIWo+MSJyU0RXI2JXQCRHNTVOSWIsMipQaGw+YGpyREMnOnAtXj44clhBNEMpXWRyS2s4OWBdVFQpYE1maD9eIypWaC4rPk0+XTxnWUtxWl86O2cuK2peajQydHUiaic7bzs2XzNAWjclKlghaz1rUklLWyJQSDJESUNoQFwxYDsmNlxHUD9nLUBRKzVlXj1BJExpJE5TPVZCdSlvbGErPFA4aHNhRUtKXyp0RD5mIU9lUDFea3Q+QmhnWy4yX1xUbj9aV2k4Yl1DKmk3ST4rbkBSVjVWYHFgT0ZNPkIlUk5pQldlTGhWPU1ES2lhIVs5JjwjIzZ1LzMkX1NDO1cnKjM5XSQuV1E9IURvKUFRYVs7Y1chWW5VblMrTWIsTzVRRj44YGFcZEgtZz1HalQ1TUEnMypdM0MnbTckTzFgKitPQzA1ZS9vPkZTISZIT1tTTDpqSCxTPTdbQz8tNTMjQCk8Vm1SWUFzKV1NXk9ALy1gVkU3JC5fJmIyIU9DajdpO1M9MkYnaCxoLSlYOmwxYzZSJXRfYVsucyFfIUMwXTFfVm4vWDdEbk9tbC1Kcm4pcnJAXGQmQUM6K2JaXFZQbkVUSzlJX1hCYkMrWEghTSFcZVpZdU8vSkBuJ1UicEw9PlFub3QyTSZUMyVXSWI0UVBuR2BLRERaMSslQkp0MGFjZlxWPj49dHEvODVtYFZSUkJzUD1OMW1cT3ExS0E1L08mLjZpSjdjLCRCOzZiLjNMJz9yTEZFamF0LUVcV2hCZmsxc3ROKT5iNGY9Ik9yVElyN0lOcHNbOCVoZ2xgYDRyQ3VfPG82YGFOb0ApbGcvLzAiW2prWERcdGhnWUVTdFtvLC8qR0VKa01YaWsxVVFuYVRKT09qITpUKlZrVW9HI0VkQkxrLiZXV0FERkZwUVdkTzQ2XWtVJ0NANWMuUGFoKWMtZ1ZIJ0lpKkRgXzBZcyZdPkppXUEnXzNVX11BQFIoNEQkbyteOioxMzZqM0szJzgqZGc7aCMuMF8lKkBoaEpfN0xWLEtrSFoqXSNpcChsKCUjRzVYaS1gVTlnYCc3Uj42PjRYaTdHWT4/O3UvMiNwJ2haT28mOi4zJm5XaDApOTYzU3NtJyo2QEckakkiP3E4QlZMQ10iJlBfTC1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlpWyFVNW5rQzVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1UXFqITVUZyRafj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdGMic6IGNsYXNzIFBERlR5cGUxRm9udCANCis0IDAgb2JqDQorJSBGb250IEhlbHZldGljYS1Cb2xkDQorPDwgL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZA0KKyAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZw0KKyAvTmFtZSAvRjINCisgL1N1YnR5cGUgL1R5cGUxDQorIC9UeXBlIC9Gb250ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChtYWlsdG86Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbSkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyA1NQ0KKyA2MjYuMTI1DQorIDE0NS4xMzUNCisgNjM3LjM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Ny4yNjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU2NC45Mzc1DQorIDExNy41Mjc1DQorIDU3Ni4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNTUNCisgNDU4LjU3NjMNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTUzLjY4NzUNCisgMTE0LjE4MjUNCisgNTY0LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NDEuMTM4OA0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA1NDIuNDM3NQ0KKyAxMDcuOTM1DQorIDU1My42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNTUNCisgMzU3Ljg2DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDUyOS4xODc1DQorIDE5MC4wNDUNCisgNTQwLjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNTUNCisgMjE2LjczNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1MTcuOTM3NQ0KKyAxNzIuMTINCisgNTI5LjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNTUNCisgMTQwLjQyNzUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDUwNC42ODc1DQorIDE2MS42ODc1DQorIDUxNS45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ0IDAgUg0KKyAvWFlaDQorIDU1DQorIDUyMS42MTUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ5My40Mzc1DQorIDE3OC4zNjc1DQorIDUwNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ0IDAgUg0KKyAvWFlaDQorIDU1DQorIDUyMS42MTUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ4Mi4xODc1DQorIDE4NC42MjI1DQorIDQ5My40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NCAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NTcuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0NjguOTM3NQ0KKyAyMjEuNzI1DQorIDQ4MC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NCAwIFINCisgL1hZWg0KKyA1NQ0KKyA5MS42MTUNCisgMCBdDQorIC9SZWN0IFsgMTE1DQorIDQ1Ny42ODc1DQorIDE5NS40Ng0KKyA0NjguOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDUgMCBSDQorIC9YWVoNCisgNTUNCisgNjc3LjExNQ0KKyAwIF0NCisgL1JlY3QgWyAxMTUNCisgNDQ2LjQzNzUNCisgMjA2LjcxNzUNCisgNDU3LjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ1IDAgUg0KKyAvWFlaDQorIDU1DQorIDU4MS4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTE1DQorIDQzNS4xODc1DQorIDIwMC40Nw0KKyA0NDYuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDUgMCBSDQorIC9YWVoNCisgNTUNCisgNTE2LjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNDIxLjkzNzUNCisgMTgwLjAzMjUNCisgNDMzLjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU4IDAgUg0KKyAvWFlaDQorIDU1DQorIDcxMC4wNDc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDQxMC42ODc1DQorIDE2MC4wMjI1DQorIDQyMS45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1OCAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MjIuNDkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDM5Ny40Mzc1DQorIDE5Ny41Mw0KKyA0MDguNjg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTggMCBSDQorIC9YWVoNCisgNTUNCisgMjQ5LjQ5DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAzODYuMTg3NQ0KKyAxOTMuMzYNCisgMzk3LjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTYyIDAgUg0KKyAvWFlaDQorIDU1DQorIDY5OC43OTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDM3Mi45Mzc1DQorIDE5NC4yMDc1DQorIDM4NC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE2MiAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MzEuMTcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAzNjEuNjg3NQ0KKyAxNTcuNTMyNQ0KKyAzNzIuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjIgMCBSDQorIC9YWVoNCisgNTUNCisgMTA1LjU0NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzUwLjQzNzUNCisgMTk2LjI4NQ0KKyAzNjEuNjg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNzIgMCBSDQorIC9YWVoNCisgNTUNCisgNjc4LjA0NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzM5LjE4NzUNCisgMTkxLjcwMjUNCisgMzUwLjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzI2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTcyIDAgUg0KKyAvWFlaDQorIDU1DQorIDYxMi45OQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzI1LjkzNzUNCisgMTQ3Ljk0DQorIDMzNy4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3MiAwIFINCisgL1hZWg0KKyA1NQ0KKyA0OTQuNDkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDMxNC42ODc1DQorIDE2MS42OTUNCisgMzI1LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzI4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTcyIDAgUg0KKyAvWFlaDQorIDU1DQorIDM4Ny4yNA0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzAzLjQzNzUNCisgMTQ0LjYxDQorIDMxNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAyMTQuMjQNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDI5Mi4xODc1DQorIDE0My4zNTc1DQorIDMwMy40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAxNjEuNDkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDI4MC45Mzc1DQorIDE3NC4xOTc1DQorIDI5Mi4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszMSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3NyAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MzIuNjM4Nw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNjcuNjg3NQ0KKyAxOTcuMTMyNQ0KKyAyNzguOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNzcgMCBSDQorIC9YWVoNCisgNTUNCisgNTI4LjIwMTINCisgMCBdDQorIC9SZWN0IFsgNzANCisgMjU2LjQzNzUNCisgMTU5LjYwMjUNCisgMjY3LjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzMzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTc3IDAgUg0KKyAvWFlaDQorIDU1DQorIDQ0NC45MjI1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDI0My4xODc1DQorIDE0Ny41Mjc1DQorIDI1NC40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3NyAwIFINCisgL1hZWg0KKyA1NQ0KKyAyOTIuNTQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAyMzEuOTM3NQ0KKyAxNjAuNDUNCisgMjQzLjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIzMSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzM1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTc4IDAgUg0KKyAvWFlaDQorIDU1DQorIDM5NC43OTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDIyMC42ODc1DQorIDE2MC4wMzc1DQorIDIzMS45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3OSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MjEuOTExNg0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAyMDkuNDM3NQ0KKyAxNTUuMDM1DQorIDIyMC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE3OSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzMDMuMjg2Ng0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAxOTguMTg3NQ0KKyAxNDcuMTIyNQ0KKyAyMDkuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxODQgMCBSDQorIC9YWVoNCisgNTUNCisgNTE3LjM4ODcNCisgMCBdDQorIC9SZWN0IFsgNzANCisgMTg0LjkzNzUNCisgMTc0LjE5NzUNCisgMTk2LjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIzNSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzM5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTg0IDAgUg0KKyAvWFlaDQorIDU1DQorIDI3NS43MDEzDQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDE3My42ODc1DQorIDE1NS44NTI1DQorIDE4NC45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE4OCAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NTcuMjk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAxNjAuNDM3NQ0KKyAxNzAuODY3NQ0KKyAxNzEuNjg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxODggMCBSDQorIC9YWVoNCisgNTUNCisgNTgwLjk5DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxNDcuMTg3NQ0KKyAxOTUuMDQ3NQ0KKyAxNTguNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxODggMCBSDQorIC9YWVoNCisgNTUNCisgMjc5LjQ5DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxMzUuOTM3NQ0KKyAxNzEuNjg1DQorIDE0Ny4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE4OCAwIFINCisgL1hZWg0KKyA1NQ0KKyAyMzcuOTkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDEyNC42ODc1DQorIDIwNS4wNTI1DQorIDEzNS45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE4OCAwIFINCisgL1hZWg0KKyA1NQ0KKyAxNzMuOTkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDExMy40Mzc1DQorIDE4My4zNzc1DQorIDEyNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE5MSAwIFINCisgL1hZWg0KKyA1NQ0KKyA3MTAuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxMDIuMTg3NQ0KKyAyMDEuNzA3NQ0KKyAxMTMuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTEgMCBSDQorIC9YWVoNCisgNTUNCisgNTA0Ljc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgODguOTM3NQ0KKyAxNDUuMDMNCisgMTAwLjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMSc6IGNsYXNzIFBERlBhZ2UgDQorNDcgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyA1IDAgUg0KKyA2IDAgUg0KKyA3IDAgUg0KKyA4IDAgUg0KKyA5IDAgUg0KKyAxMCAwIFINCisgMTEgMCBSDQorIDEyIDAgUg0KKyAxMyAwIFINCisgMTQgMCBSDQorIDE1IDAgUg0KKyAxNiAwIFINCisgMTcgMCBSDQorIDE4IDAgUg0KKyAxOSAwIFINCisgMjAgMCBSDQorIDIxIDAgUg0KKyAyMiAwIFINCisgMjMgMCBSDQorIDI0IDAgUg0KKyAyNSAwIFINCisgMjYgMCBSDQorIDI3IDAgUg0KKyAyOCAwIFINCisgMjkgMCBSDQorIDMwIDAgUg0KKyAzMSAwIFINCisgMzIgMCBSDQorIDMzIDAgUg0KKyAzNCAwIFINCisgMzUgMCBSDQorIDM2IDAgUg0KKyAzNyAwIFINCisgMzggMCBSDQorIDM5IDAgUg0KKyA0MCAwIFINCisgNDEgMCBSDQorIDQyIDAgUg0KKyA0MyAwIFINCisgNDQgMCBSDQorIDQ1IDAgUg0KKyA0NiAwIFIgXQ0KKyAvQ29udGVudHMgMzIxIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdDQorIC9YT2JqZWN0IDw8IC9Gb3JtWG9iLjI5NGY1Yjk0NTkwMTY4MmNkOTc1YTI3NjdiNjAwZjYzIDMgMCBSID4+ID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE5MSAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NTAuOTkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDczMC42Nzc1DQorIDE1Mi45NQ0KKyA3NDEuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQ0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTEgMCBSDQorIC9YWVoNCisgNTUNCisgMzEzLjI0DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA3MTkuNDI3NQ0KKyAxOTIuOTYyNQ0KKyA3MzAuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQ1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTEgMCBSDQorIC9YWVoNCisgNTUNCisgMjEzLjI0DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA3MDguMTc3NQ0KKyAxNzMuNzg1DQorIDcxOS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE5MSAwIFINCisgL1hZWg0KKyA1NQ0KKyAxMTcuMjQNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDY5Ni45Mjc1DQorIDE4Mi41NDUNCisgNzA4LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzUyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTk2IDAgUg0KKyAvWFlaDQorIDU1DQorIDY3MC4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDY4My42Nzc1DQorIDEyNy4xMDUNCisgNjk0LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzUzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTk2IDAgUg0KKyAvWFlaDQorIDU1DQorIDQyOC4yNA0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNjcwLjQyNzUNCisgMTY5LjE5NQ0KKyA2ODEuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQ5JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTYgMCBSDQorIC9YWVoNCisgNTUNCisgMzEyLjk5DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA2NTkuMTc3NQ0KKyAxNjkuMjAyNQ0KKyA2NzAuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjUwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTYgMCBSDQorIC9YWVoNCisgNTUNCisgMTk3Ljc0DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA2NDcuOTI3NQ0KKyAxMzYuNjkNCisgNjU5LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzU2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTk2IDAgUg0KKyAvWFlaDQorIDU1DQorIDE0NC45OQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNjM2LjY3NzUNCisgMTU3LjExMjUNCisgNjQ3LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzU3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTk4IDAgUg0KKyAvWFlaDQorIDU1DQorIDcwOC44NjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDYyNS40Mjc1DQorIDE1NS44Ng0KKyA2MzYuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjUzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTggMCBSDQorIC9YWVoNCisgNTUNCisgNjMzLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNjE0LjE3NzUNCisgMTY1Ljg1NzUNCisgNjI1LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzU5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTk4IDAgUg0KKyAvWFlaDQorIDU1DQorIDU2OS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDYwMi45Mjc1DQorIDE1OS42MTc1DQorIDYxNC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE5OCAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MjcuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA1OTEuNjc3NQ0KKyAxNzcuNTI3NQ0KKyA2MDIuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTggMCBSDQorIC9YWVoNCisgNTUNCisgNDUxLjc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTc4LjQyNzUNCisgMTU4LjM2NQ0KKyA1ODkuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTggMCBSDQorIC9YWVoNCisgNTUNCisgMzg2Ljc0DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA1NjUuMTc3NQ0KKyAxNTUuODY3NQ0KKyA1NzYuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxOTggMCBSDQorIC9YWVoNCisgNTUNCisgMjQ1Ljc0DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA1NTMuOTI3NQ0KKyAxODUuMDM1DQorIDU2NS4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE5OCAwIFINCisgL1hZWg0KKyA1NQ0KKyAxOTIuOTkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDU0Mi42Nzc1DQorIDE1Mi41Mzc1DQorIDU1My45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxMCAwIFINCisgL1hZWg0KKyA1NQ0KKyA3NDIuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyA1MzEuNDI3NQ0KKyAyMTMuNzgyNQ0KKyA1NDIuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMTAgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMTkzLjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNTIwLjE3NzUNCisgMjE1Ljg2DQorIDUzMS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2NyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxMyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA3NDUuNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1MDYuOTI3NQ0KKyAxMzAuMDE1DQorIDUxOC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxMyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA2NTguMjQNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ5My42Nzc1DQorIDE5MC44NjI1DQorIDUwNC45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2OSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxMyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA1MjIuNDkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ4Mi40Mjc1DQorIDE5Mi4xMTUNCisgNDkzLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2NSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjEzIDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDI4Ni43NA0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNDcxLjE3NzUNCisgMTkzLjM3NQ0KKyA0ODIuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjY2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMTQgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgNjMzLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNDU5LjkyNzUNCisgMTg2LjI4NzUNCisgNDcxLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjE0IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDU2OS4wNDc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDQ0Ni42Nzc1DQorIDE2OS42MjI1DQorIDQ1Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis3MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxNCAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA1MDMuOTkNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQzMy40Mjc1DQorIDIyMy4zNzUNCisgNDQ0LjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzc0IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjE0IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDMzMi43NA0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNDIyLjE3NzUNCisgMjEyLjE0NzUNCisgNDMzLjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3MCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzc1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjE4IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDc0NS43OTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDQwOC45Mjc1DQorIDExNS4wMTUNCisgNDIwLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzc2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjE4IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDYwNS43NjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDM5NS42Nzc1DQorIDE2Ni4yNzc1DQorIDQwNi45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis3NyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxOCAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzNzIuMDc2Mw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAzODQuNDI3NQ0KKyAxNzIuOTQ1DQorIDM5NS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis3OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIxOCAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAyNzcuNTQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAzNzEuMTc3NQ0KKyAxNDAuNDMyNQ0KKyAzODIuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMTggMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMjAwLjQyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzU5LjkyNzUNCisgMTg2LjI5NQ0KKyAzNzEuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorODAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMTggMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMTIzLjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzQ4LjY3NzUNCisgMTc4LjM1MjUNCisgMzU5LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzgxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMjIxIDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDcxMC4wNDc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDMzNy40Mjc1DQorIDIxMi41Ng0KKyAzNDguNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorODIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMjEgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzI1LjUxMzgNCisgMCBdDQorIC9SZWN0IFsgNzANCisgMzI0LjE3NzUNCisgMTgzLjc5DQorIDMzNS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIyMSAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAyMTAuMjM1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDMxMC45Mjc1DQorIDE4Mi41Mzc1DQorIDMyMi4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIyNSAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA2OTguNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAyOTkuNjc3NQ0KKyAxNDQuNjAyNQ0KKyAzMTAuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjgwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorODUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMjUgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgNTM1LjE3MjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMjg4LjQyNzUNCisgMTgwLjg4DQorIDI5OS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4NiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIyNSAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MjUuMzg4OA0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNzUuMTc3NQ0KKyAxNDguMzc1DQorIDI4Ni40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4NyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIyNSAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAxOTguNDUxMw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNjMuOTI3NQ0KKyAxMTkuNjA1DQorIDI3NS4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDIyNiAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA3NDcuMjYzNw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNTIuNjc3NQ0KKyAyMDAuMDY1DQorIDI2My45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTInOiBjbGFzcyBQREZQYWdlIA0KKzg5IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgNDggMCBSDQorIDQ5IDAgUg0KKyA1MCAwIFINCisgNTEgMCBSDQorIDUyIDAgUg0KKyA1MyAwIFINCisgNTQgMCBSDQorIDU1IDAgUg0KKyA1NiAwIFINCisgNTcgMCBSDQorIDU4IDAgUg0KKyA1OSAwIFINCisgNjAgMCBSDQorIDYxIDAgUg0KKyA2MiAwIFINCisgNjMgMCBSDQorIDY0IDAgUg0KKyA2NSAwIFINCisgNjYgMCBSDQorIDY3IDAgUg0KKyA2OCAwIFINCisgNjkgMCBSDQorIDcwIDAgUg0KKyA3MSAwIFINCisgNzIgMCBSDQorIDczIDAgUg0KKyA3NCAwIFINCisgNzUgMCBSDQorIDc2IDAgUg0KKyA3NyAwIFINCisgNzggMCBSDQorIDc5IDAgUg0KKyA4MCAwIFINCisgODEgMCBSDQorIDgyIDAgUg0KKyA4MyAwIFINCisgODQgMCBSDQorIDg1IDAgUg0KKyA4NiAwIFINCisgODcgMCBSDQorIDg4IDAgUiBdDQorIC9Db250ZW50cyAzMjIgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzkwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDQxOS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMTI1Ljg2NzUNCisgNjYzLjg2NQ0KKyAxNzAuMDUNCisgNjc1LjExNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjg1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorOTEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAyMjEgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzI1LjUxMzgNCisgMCBdDQorIC9SZWN0IFsgMjM3LjE2DQorIDU3OS4xMTUNCisgMjcyLjU5NzUNCisgNTkwLjM2NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjg2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorOTIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzkyLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyA0MDEuODA3NQ0KKyA1NjcuODY1DQorIDQ0NS45OQ0KKyA1NzkuMTE1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODcnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzkzIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIxMTkudHh0KSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4OS42MjUNCisgNDA3LjE3NzUNCisgMjk3LjE2NzUNCisgNDE4LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4OCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5L2luZGV4Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjA1LjQ1DQorIDM5My45Mjc1DQorIDM2OS42Nzc1DQorIDQwNS4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODknOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk1IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Ny45NjUNCisgMzgwLjY3NzUNCisgMjU0LjY3MjUNCisgMzkxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5MCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTYgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvcGFja2FnZXMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxODQuMjMyNQ0KKyAzNjcuNDI3NQ0KKyAzNjMuNDgyNQ0KKyAzNzguNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjkxJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis5NyAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb24uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzIuOTUyNQ0KKyAzNTQuMTc3NQ0KKyA0MTMuODgyNQ0KKyAzNjUuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjkyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis5OCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTU3Ljk2DQorIDM0MC45Mjc1DQorIDM1OC44ODUNCisgMzUyLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5Myc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTkgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5LzIuMy92ZXJzaW9ucy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4Ni43MTUNCisgMzI3LjY3NzUNCisgMzczLjQ1DQorIDMzOC45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTQnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwMCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTcxLjcNCisgMzE0LjQyNzUNCisgNDAwLjk2DQorIDMyNS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTUnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwMSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS8pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgOTUuMDA1DQorIDMwMS4xNzc1DQorIDMwNy4xNTc1DQorIDMxMi40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTYnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwMiAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjb2ZmbGluZSkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNTkuOTU1DQorIDI4Ny45Mjc1DQorIDMyNy41Mg0KKyAyOTkuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjk3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMDMgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI3ZpZGVvKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDEzMS4yDQorIDI3NC42Nzc1DQorIDI5Ni42OA0KKyAyODUuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjk4JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMDQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3d3dy53My5vcmcvVFIvZ2VvbG9jYXRpb24tQVBJLykgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzIuMDQ1DQorIDI2MS40Mjc1DQorIDMwMC44NDI1DQorIDI3Mi42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTknOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwNSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vd3d3LnczLm9yZy9UUi93ZWJkYXRhYmFzZS8pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTc4LjMNCisgMjQ4LjE3NzUNCisgMjk4Ljc2NQ0KKyAyNTkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwMCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTA2IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cudzMub3JnL1RSL0luZGV4ZWREQi8pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTcwLjc5MjUNCisgMjM0LjkyNzUNCisgMjgzLjc1DQorIDI0Ni4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAxJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMDcgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy93aWRnZXRfZGVzaWduLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTE0LjUyNzUNCisgMjA4LjQyNzUNCisgMzc0LjIzDQorIDIxOS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMDggMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvdWkvbm90aWZpZXJzL25vdGlmaWNhdGlvbnMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTQuOTQNCisgMTk1LjE3NzUNCisgMzQ2LjI5MjUNCisgMjA2LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMDMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwOSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vY29kZS5nb29nbGUuY29tL2FuZHJvaWQvcmVmZXJlbmNlL2F2YWlsYWJsZS1yZXNvdXJjZXMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNDguNzA1DQorIDE4MS45Mjc1DQorIDM2OC44DQorIDE5My4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA0JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMTAgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbi5odG1sI3N0YXR1c2JhcnN0cnVjdHVyZSkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNjIuODg3NQ0KKyAxNjguNjc3NQ0KKyA0NzcuMTk3NQ0KKyAxNzkuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwNSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTExIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMjkuNTM1DQorIDE1NS40Mjc1DQorIDM3MS43MzI1DQorIDE2Ni42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA2JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMTIgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvVG9hc3QuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyA5Ni42MDI1DQorIDE0Mi4xNzc1DQorIDMxMy4zNjc1DQorIDE1My40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMTMgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTI3LjQ0MjUNCisgMTI4LjkyNzUNCisgMzUxLjI2NQ0KKyAxNDAuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTE0IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9pbmRleC5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDI0NS44NDUNCisgMTE1LjY3NzUNCisgNDUzLjg2NQ0KKyAxMjYuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTE1IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2NC4xMzI1DQorIDEwMi40Mjc1DQorIDM2NC42NDUNCisgMTEzLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTAnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzExNiAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDExNy44NTc1DQorIDg5LjE3NzUNCisgMzQ5LjIwMjUNCisgMTAwLjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMyc6IGNsYXNzIFBERlBhZ2UgDQorMTE3IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgOTAgMCBSDQorIDkxIDAgUg0KKyA5MiAwIFINCisgOTMgMCBSDQorIDk0IDAgUg0KKyA5NSAwIFINCisgOTYgMCBSDQorIDk3IDAgUg0KKyA5OCAwIFINCisgOTkgMCBSDQorIDEwMCAwIFINCisgMTAxIDAgUg0KKyAxMDIgMCBSDQorIDEwMyAwIFINCisgMTA0IDAgUg0KKyAxMDUgMCBSDQorIDEwNiAwIFINCisgMTA3IDAgUg0KKyAxMDggMCBSDQorIDEwOSAwIFINCisgMTEwIDAgUg0KKyAxMTEgMCBSDQorIDExMiAwIFINCisgMTEzIDAgUg0KKyAxMTQgMCBSDQorIDExNSAwIFINCisgMTE2IDAgUiBdDQorIC9Db250ZW50cyAzMjMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTEnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzExOCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvbW9ua2V5Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTM4LjcwNzUNCisgNzMwLjY3NzUNCisgMzU1LjA2DQorIDc0MS45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMTkgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTc5Ljk2NQ0KKyA3MTcuNDI3NQ0KKyA0NTIuMTc3NQ0KKyA3MjguNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExMyc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTIwIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Ny44ODI1DQorIDcwNC4xNzc1DQorIDM4OS4yMw0KKyA3MTUuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTIxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdXRpbC9EaXNwbGF5TWV0cmljcy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2MS42MTI1DQorIDY5MC45Mjc1DQorIDM5Ni4yOA0KKyA3MDIuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTIyIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4NC45ODI1DQorIDY3Ny42Nzc1DQorIDQ0My4wMg0KKyA2ODguOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNic6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTIzIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNTcuMDUyNQ0KKyA2NjQuNDI3NQ0KKyA0MDcuNTgyNQ0KKyA2NzUuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNyc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTI0IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY2thZ2Utc3VtbWFyeS5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDExOS45NTc1DQorIDY1MS4xNzc1DQorIDM4OC44MjUNCisgNjYyLjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTgnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEyNSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2NvbXBhdGliaWxpdHkvbmRlZi1wdXNoLXByb3RvY29sLnBkZikgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNDMuMjgyNQ0KKyA2MzcuOTI3NQ0KKyAzNDguMzcNCisgNjQ5LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTknOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEyNiAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vd3d3Lm54cC5jb20vZG9jdW1lbnRzL2RhdGFfc2hlZXQvTUYxUzUwM3gucGRmKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE0Mi4wMw0KKyA2MjQuNjc3NQ0KKyAzMzYuMjg3NQ0KKyA2MzUuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyMCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTI3IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cubnhwLmNvbS9kb2N1bWVudHMvZGF0YV9zaGVldC9NRjFTNzAzeC5wZGYpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTQyLjAzDQorIDYxMS40Mjc1DQorIDMzNi4yODc1DQorIDYyMi42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTIxJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMjggMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3d3dy5ueHAuY29tL2RvY3VtZW50cy9kYXRhX3NoZWV0L01GMElDVTEucGRmKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDEzNi42DQorIDU5OC4xNzc1DQorIDMyNi42OA0KKyA2MDkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyMic6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTI5IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cubnhwLmNvbS9kb2N1bWVudHMvc2hvcnRfZGF0YV9zaGVldC9NRjBJQ1UyX1NEUy5wZGYpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTM2LjYNCisgNTg0LjkyNzUNCisgMzY3LjExMjUNCisgNTk2LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMjMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEzMCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vd3d3Lm54cC5jb20vZG9jdW1lbnRzL2FwcGxpY2F0aW9uX25vdGUvQU4xMzA1MTEucGRmKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDEzOS45NTI1DQorIDU3MS42Nzc1DQorIDM1MC44OQ0KKyA1ODIuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyNCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTMxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cubnhwLmNvbS9kb2N1bWVudHMvYXBwbGljYXRpb25fbm90ZS9BTjEzMDQxMS5wZGYpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTM5Ljk1MjUNCisgNTU4LjQyNzUNCisgMzUwLjg5DQorIDU2OS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI1JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMzIgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuaHRtbCNzZXREaXNwbGF5T3JpZW50YXRpb25cKGludFwpKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE1Mi4wNDI1DQorIDU0NS4xNzc1DQorIDQ3NC42NjI1DQorIDU1Ni40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI2JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMzMgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNjEuMjA3NQ0KKyA1MzEuOTI3NQ0KKyAzOTUuNDcNCisgNTQzLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMjcnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEzNCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3RvcGljcy9zZWN1cml0eS9zZWN1cml0eS5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDIyMC4zOTc1DQorIDUxOC42Nzc1DQorIDQyOS42NDc1DQorIDUyOS45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI4JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxMzUgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FwcHMtZm9yLWFuZHJvaWQpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTI5Ljk1NQ0KKyA1MDUuNDI3NQ0KKyAyNjkuMTkyNQ0KKyA1MTYuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzNzkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2MC42MTUNCisgMjkwLjExNQ0KKyA1MDQuNzk3NQ0KKyAzMDEuMzY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTM3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM2Ni4zNjUNCisgMCBdDQorIC9SZWN0IFsgNDcwLjk5NQ0KKyAxMDcuNDkNCisgNTE1LjE3NzUNCisgMTE4Ljc0IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTQnOiBjbGFzcyBQREZQYWdlIA0KKzEzOCAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDExOCAwIFINCisgMTE5IDAgUg0KKyAxMjAgMCBSDQorIDEyMSAwIFINCisgMTIyIDAgUg0KKyAxMjMgMCBSDQorIDEyNCAwIFINCisgMTI1IDAgUg0KKyAxMjYgMCBSDQorIDEyNyAwIFINCisgMTI4IDAgUg0KKyAxMjkgMCBSDQorIDEzMCAwIFINCisgMTMxIDAgUg0KKyAxMzIgMCBSDQorIDEzMyAwIFINCisgMTM0IDAgUg0KKyAxMzUgMCBSDQorIDEzNiAwIFINCisgMTM3IDAgUiBdDQorIC9Db250ZW50cyAzMjQgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdGMyc6IGNsYXNzIFBERlR5cGUxRm9udCANCisxMzkgMCBvYmoNCislIEZvbnQgQ291cmllcg0KKzw8IC9CYXNlRm9udCAvQ291cmllcg0KKyAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZw0KKyAvTmFtZSAvRjMNCisgL1N1YnR5cGUgL1R5cGUxDQorIC9UeXBlIC9Gb250ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM1My4xMTUNCisgMCBdDQorIC9SZWN0IFsgMzM2LjI3MjUNCisgNzA5LjkyNzUNCisgMzgwLjQ1NQ0KKyA3MjEuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Y0JzogY2xhc3MgUERGVHlwZTFGb250IA0KKzE0MSAwIG9iag0KKyUgRm9udCBUaW1lcy1Sb21hbg0KKzw8IC9CYXNlRm9udCAvVGltZXMtUm9tYW4NCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0Y0DQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEzMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE0MiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzMzkuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDM1MC4xOQ0KKyA2MzMuOTI3NQ0KKyAzOTQuMzcyNQ0KKyA2NDUuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2U1JzogY2xhc3MgUERGUGFnZSANCisxNDMgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNDAgMCBSDQorIDE0MiAwIFIgXQ0KKyAvQ29udGVudHMgMzI1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTYnOiBjbGFzcyBQREZQYWdlIA0KKzE0NCAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0NvbnRlbnRzIDMyNiAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2U3JzogY2xhc3MgUERGUGFnZSANCisxNDUgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAzMjcgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNDYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzI2LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNjENCisgNjY0LjgwMjUNCisgNDI1Ljc5MjUNCisgNjc2LjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNDcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzEzLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzMDcuNTkyNQ0KKyAzOTEuODAyNQ0KKyAzNTEuNzc1DQorIDQwMy4wNTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTM1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAzMDAuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDE4My44MTI1DQorIDM1OS44MDI1DQorIDIzMi4xNjUNCisgMzcxLjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNDkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI4Ni44NjUNCisgMCBdDQorIC9SZWN0IFsgMTIyLjEyNQ0KKyAzNDYuNTUyNQ0KKyAxNzAuNDc3NQ0KKyAzNTcuODAyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEzNyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE1MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjczLjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAxMDguNzc1DQorIDMzMy4zMDI1DQorIDE1Ny4xMjc1DQorIDM0NC41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTM4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTUxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNjAuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDM0My40MzUNCisgMzEyLjU1MjUNCisgMzkxLjc4NzUNCisgMzIzLjgwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdGNSc6IGNsYXNzIFBERlR5cGUxRm9udCANCisxNTIgMCBvYmoNCislIEZvbnQgSGVsdmV0aWNhLU9ibGlxdWUNCis8PCAvQmFzZUZvbnQgL0hlbHZldGljYS1PYmxpcXVlDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GNQ0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI0Ny4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTEwLjQ0NzUNCisgMzAxLjMwMjUNCisgMTU4LjgNCisgMzEyLjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNDAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzEzLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxNjAuNDU3NQ0KKyAxNDEuMzAyNQ0KKyAyMDQuNjQNCisgMTUyLjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNDEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDMwMC4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTgzLjgxMjUNCisgMTA5LjMwMjUNCisgMjMyLjE2NQ0KKyAxMjAuNTUyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE0Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE1NiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjg2Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMjIuMTI1DQorIDk2LjA1MjUNCisgMTcwLjQ3NzUNCisgMTA3LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNDMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI3My42MTUNCisgMCBdDQorIC9SZWN0IFsgMTA4Ljc3NQ0KKyA4Mi44MDI1DQorIDE1Ny4xMjc1DQorIDk0LjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlOCc6IGNsYXNzIFBERlBhZ2UgDQorMTU4IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTQ2IDAgUg0KKyAxNDcgMCBSDQorIDE0OCAwIFINCisgMTQ5IDAgUg0KKyAxNTAgMCBSDQorIDE1MSAwIFINCisgMTUzIDAgUg0KKyAxNTQgMCBSDQorIDE1NSAwIFINCisgMTU2IDAgUg0KKyAxNTcgMCBSIF0NCisgL0NvbnRlbnRzIDMyOCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE0NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE1OSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjYwLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzNDMuNDM1DQorIDczMC42Nzc1DQorIDM5MS43ODc1DQorIDc0MS45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTQ1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTYwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNDcuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDExMC40NDc1DQorIDcxOS40Mjc1DQorIDE1OC44DQorIDczMC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTQ2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTYxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM5Mi44NjUNCisgMCBdDQorIC9SZWN0IFsgMTI1LjQ0NzUNCisgNjQyLjMwMjUNCisgMTY5LjYzDQorIDY1My41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTknOiBjbGFzcyBQREZQYWdlIA0KKzE2MiAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE1OSAwIFINCisgMTYwIDAgUg0KKyAxNjEgMCBSIF0NCisgL0NvbnRlbnRzIDMyOSAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE0Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE2MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjMzLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyA1MDAuMTQ3NQ0KKyA3MzAuNjc3NQ0KKyA1NDguNQ0KKyA3NDEuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE0OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE2NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjIwLjYxNQ0KKyAwIF0NCisgL1JlY3QgWyA1MTUuMTQ3NQ0KKyA1ODAuMDUyNQ0KKyA1NTMuMDc1DQorIDU5MS4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTQ5JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTY1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyMjAuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDU1DQorIDU2OC44MDI1DQorIDYzLjM0DQorIDU4MC4wNTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTUwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTY2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyMDcuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDMxMy4wNDUNCisgNDYxLjU1MjUNCisgMzYxLjM5NzUNCisgNDcyLjgwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNjcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDE5NC4xMTUNCisgMCBdDQorIC9SZWN0IFsgNDQ4LjA2DQorIDQyOS41NTI1DQorIDQ5Ni40MTI1DQorIDQ0MC44MDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTUyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTY4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxODAuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDEyNC42MTUNCisgNDE4LjMwMjUNCisgMTcyLjk2NzUNCisgNDI5LjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNjkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDE2Ny42MTUNCisgMCBdDQorIC9SZWN0IFsgMTMyLjUzNQ0KKyAzNTQuMzAyNQ0KKyAxODAuODg3NQ0KKyAzNjUuNTUyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE1NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE3MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTU0LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMTcuOTA3NQ0KKyAxODEuMzAyNQ0KKyAyNjYuMjYNCisgMTkyLjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNzEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDE0MS4xMTUNCisgMCBdDQorIC9SZWN0IFsgNzMuNzU3NQ0KKyAxMTcuMzAyNQ0KKyAxMjIuMTENCisgMTI4LjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTAnOiBjbGFzcyBQREZQYWdlIA0KKzE3MiAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE2MyAwIFINCisgMTY0IDAgUg0KKyAxNjUgMCBSDQorIDE2NiAwIFINCisgMTY3IDAgUg0KKyAxNjggMCBSDQorIDE2OSAwIFINCisgMTcwIDAgUg0KKyAxNzEgMCBSIF0NCisgL0NvbnRlbnRzIDMzMCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE1Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE3MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTI3Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyA0OTkuNTkyNQ0KKyA1ODEuMjQNCisgNTQ3Ljk0NQ0KKyA1OTIuNDkgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNzQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDExNC42MTUNCisgMCBdDQorIC9SZWN0IFsgMjU3Ljk4NzUNCisgNTYwLjQ5DQorIDMwNi4zNA0KKyA1NzEuNzQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNzUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDEwMS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMzczLjAzNzUNCisgNTYwLjQ5DQorIDQyMS4zOQ0KKyA1NzEuNzQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNzYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDIzMy44NjUNCisgMCBdDQorIC9SZWN0IFsgNDkzLjUwMjUNCisgNTYwLjQ5DQorIDU0MS44NTUNCisgNTcxLjc0IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTExJzogY2xhc3MgUERGUGFnZSANCisxNzcgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNzMgMCBSDQorIDE3NCAwIFINCisgMTc1IDAgUg0KKyAxNzYgMCBSIF0NCisgL0NvbnRlbnRzIDMzMSAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxMic6IGNsYXNzIFBERlBhZ2UgDQorMTc4IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQ29udGVudHMgMzMyIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTEzJzogY2xhc3MgUERGUGFnZSANCisxNzkgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAzMzMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNjAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxODAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcyOS42MTUNCisgMCBdDQorIC9SZWN0IFsgMzc4Ljg5NQ0KKyA1MzguNDI3NQ0KKyA0MjcuMjQ3NQ0KKyA1NDkuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE2MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE4MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTI3Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMDcuMQ0KKyA0MzMuOTkNCisgMjU1LjQ1MjUNCisgNDQ1LjI0IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTYyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTgyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxMjcuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDIzOS42Mjc1DQorIDM5OC4yNA0KKyAyODcuOTgNCisgNDA5LjQ5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTYzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTgzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3NDIuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDk4LjM0MjUNCisgMzYyLjQ5DQorIDE0Ni42OTUNCisgMzczLjc0IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE0JzogY2xhc3MgUERGUGFnZSANCisxODQgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxODAgMCBSDQorIDE4MSAwIFINCisgMTgyIDAgUg0KKyAxODMgMCBSIF0NCisgL0NvbnRlbnRzIDMzNCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE2NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE4NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNzI5LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzOTIuNzkyNQ0KKyA2NjYuNjc3NQ0KKyA0NDEuMTQ1DQorIDY3Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTY1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTg2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MTYuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDI1OC4wMDI1DQorIDYwMC44MDI1DQorIDMwNi4zNTUNCisgNjEyLjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNjYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxODcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgNDYyLjgzNQ0KKyAyNDYuNTUyNQ0KKyA1MTEuMTg3NQ0KKyAyNTcuODAyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxNSc6IGNsYXNzIFBERlBhZ2UgDQorMTg4IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTg1IDAgUg0KKyAxODYgMCBSDQorIDE4NyAwIFIgXQ0KKyAvQ29udGVudHMgMzM1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTY3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTg5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA2ODkuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDI1OS40Mg0KKyAzMjEuODAyNQ0KKyAzMDcuNzcyNQ0KKyAzMzMuMDUyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE2OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE5MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNjg5Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNzkNCisgMjQ2LjMwMjUNCisgNDMwLjE0MjUNCisgMjU3LjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTYnOiBjbGFzcyBQREZQYWdlIA0KKzE5MSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE4OSAwIFINCisgMTkwIDAgUiBdDQorIC9Db250ZW50cyAzMzYgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNjknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxOTIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDY4OS44NjUNCisgMCBdDQorIC9SZWN0IFsgMzA0Ljc4NzUNCisgNzA0LjE3NzUNCisgMzUzLjE0DQorIDcxNS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTcwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTkzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2OC4xOQ0KKyA1ODEuODAyNQ0KKyA1MTYuNTQyNQ0KKyA1OTMuMDUyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE3MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE5NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNjc2LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzODIuMjENCisgMzYxLjMwMjUNCisgNDMwLjU2MjUNCisgMzcyLjU1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNzInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxOTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDY3Ni42MTUNCisgMCBdDQorIC9SZWN0IFsgMzgyLjIxDQorIDI0Ni4wNTI1DQorIDQzMC41NjI1DQorIDI1Ny4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE3JzogY2xhc3MgUERGUGFnZSANCisxOTYgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxOTIgMCBSDQorIDE5MyAwIFINCisgMTk0IDAgUg0KKyAxOTUgMCBSIF0NCisgL0NvbnRlbnRzIDMzNyAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE3Myc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE5NyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNjYzLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAyOTcuNjAyNQ0KKyAxNDguODAyNQ0KKyAzNDUuOTU1DQorIDE2MC4wNTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE4JzogY2xhc3MgUERGUGFnZSANCisxOTggMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxOTcgMCBSIF0NCisgL0NvbnRlbnRzIDMzOCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE3NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE5OSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNzI5LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyA2OC4zMzUNCisgNjY2LjY3NzUNCisgMTE2LjY4NzUNCisgNjc3LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNzUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMDAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDY1MC4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTYyLjEwNzUNCisgNDgzLjE3NzUNCisgMjEwLjQ2DQorIDQ5NC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTc2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjAxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA2MzYuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDE5NC42MDUNCisgMzk0LjQyNzUNCisgMjQyLjk1NzUNCisgNDA1LjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNzcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMDIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDYyMy42MTUNCisgMCBdDQorIC9SZWN0IFsgMjg5LjY0NQ0KKyAzOTQuNDI3NQ0KKyAzMzcuOTk3NQ0KKyA0MDUuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE3OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIwMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNjEwLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxOTUuODUNCisgMzgxLjE3NzUNCisgMjQ0LjIwMjUNCisgMzkyLjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNzknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMDQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDU5Ny4xMTUNCisgMCBdDQorIC9SZWN0IFsgMjg2LjcxMjUNCisgMzgxLjE3NzUNCisgMzM1LjA2NQ0KKyAzOTIuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE4MCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIwNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNTgzLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMjYuNzA1DQorIDM2Ny45Mjc1DQorIDI3NS4wNTc1DQorIDM3OS4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTgxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjA2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA1NzAuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDMyMC45Mg0KKyAzNjcuOTI3NQ0KKyAzNjkuMjcyNQ0KKyAzNzkuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE4Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIwNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNzI5LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyA1MTAuNzQ1DQorIDMxMy4xNzc1DQorIDU0OC42NzI1DQorIDMyNC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTgzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjA4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDc3LjUNCisgMzAxLjkyNzUNCisgODUuODQNCisgMzEzLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxODQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMDkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcyOS42MTUNCisgMCBdDQorIC9SZWN0IFsgMzMxLjUxNzUNCisgMjQ1LjQyNzUNCisgMzc5Ljg3DQorIDI1Ni42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE5JzogY2xhc3MgUERGUGFnZSANCisyMTAgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxOTkgMCBSDQorIDIwMCAwIFINCisgMjAxIDAgUg0KKyAyMDIgMCBSDQorIDIwMyAwIFINCisgMjA0IDAgUg0KKyAyMDUgMCBSDQorIDIwNiAwIFINCisgMjA3IDAgUg0KKyAyMDggMCBSDQorIDIwOSAwIFIgXQ0KKyAvQ29udGVudHMgMzM5IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTg1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjExIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA1NTcuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDMwNC40Mg0KKyAzNTcuNTUyNQ0KKyAzNTIuNzcyNQ0KKyAzNjguODAyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE4Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIxMiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNTQ0LjExNQ0KKyAwIF0NCisgL1JlY3QgWyA0MzYuODENCisgMTA3LjA1MjUNCisgNDg1LjE2MjUNCisgMTE4LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMjAnOiBjbGFzcyBQREZQYWdlIA0KKzIxMyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDIxMSAwIFINCisgMjEyIDAgUiBdDQorIC9Db250ZW50cyAzNDAgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdQYWdlMjEnOiBjbGFzcyBQREZQYWdlIA0KKzIxNCAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0NvbnRlbnRzIDM0MSAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE4Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIxNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNTMwLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMTguMzk1DQorIDMwOS40Mjc1DQorIDI2Ni43NDc1DQorIDMyMC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTg4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjE2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTM4IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA1MzAuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ3Ni44Mzc1DQorIDIzMi4zMDI1DQorIDUyNS4xOQ0KKyAyNDMuNTUyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE4OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIxNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzOCAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNTMwLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAzNjkuNzIyNQ0KKyAxMzIuNjc3NQ0KKyA0MTguMDc1DQorIDE0My45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTIyJzogY2xhc3MgUERGUGFnZSANCisyMTggMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAyMTUgMCBSDQorIDIxNiAwIFINCisgMjE3IDAgUiBdDQorIC9Db250ZW50cyAzNDIgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMTkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDUzMC44NjUNCisgMCBdDQorIC9SZWN0IFsgMTAyLjENCisgNzE5LjQyNzUNCisgMTUwLjQ1MjUNCisgNzMwLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOTEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMjAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgNDA2LjExNQ0KKyAwIF0NCisgL1JlY3QgWyAzMzQuNjYNCisgMTY0Ljk5DQorIDM3OC44NDI1DQorIDE3Ni4yNCBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UyMyc6IGNsYXNzIFBERlBhZ2UgDQorMjIxIDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMjE5IDAgUg0KKyAyMjAgMCBSIF0NCisgL0NvbnRlbnRzIDM0MyAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE5Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIyMiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MDYuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDMyNi4zNjUNCisgNzE5LjQyNzUNCisgMzcwLjU0NzUNCisgNzMwLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMjMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDUxNy42MTUNCisgMCBdDQorIC9SZWN0IFsgMTk5LjU0NzUNCisgNDY5LjE3NzUNCisgMjQ3LjkNCisgNDgwLjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOTQnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzIyNCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChtYWlsdG86Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbSkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAyMDUuMDgyNQ0KKyAxNDcuMDUyNQ0KKyAyOTUuMjE3NQ0KKyAxNTguMzAyNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UyNCc6IGNsYXNzIFBERlBhZ2UgDQorMjI1IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMjIyIDAgUg0KKyAyMjMgMCBSDQorIDIyNCAwIFIgXQ0KKyAvQ29udGVudHMgMzQ0IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzIwIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTI1JzogY2xhc3MgUERGUGFnZSANCisyMjYgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAzNDUgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMjAgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdQYWdlMjYnOiBjbGFzcyBQREZQYWdlIA0KKzIyNyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0NvbnRlbnRzIDM0NiAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMyMCAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1IyMjgnOiBjbGFzcyBQREZDYXRhbG9nIA0KKzIyOCAwIG9iag0KKyUgRG9jdW1lbnQgUm9vdA0KKzw8IC9PdXRsaW5lcyAyMzAgMCBSDQorIC9QYWdlTW9kZSAvVXNlTm9uZQ0KKyAvUGFnZXMgMzIwIDAgUg0KKyAvVHlwZSAvQ2F0YWxvZyA+Pg0KK2VuZG9iag0KKyUgJ1IyMjknOiBjbGFzcyBQREZJbmZvIA0KKzIyOSAwIG9iag0KKzw8IC9BdXRob3IgKCkNCisgL0NyZWF0aW9uRGF0ZSAoRDoyMDExMDIyMjE0NDM1MSswOCcwMCcpDQorIC9LZXl3b3JkcyAoKQ0KKyAvUHJvZHVjZXIgKHBpc2EgSFRNTCB0byBQREYgPGh0dHA6Ly93d3cuaHRtbHRvcGRmLm9yZz4pDQorIC9TdWJqZWN0ICgpDQorIC9UaXRsZSAoQW5kcm9pZCAyLjMgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ1IyMzAnOiBjbGFzcyBQREZPdXRsaW5lcyANCisyMzAgMCBvYmoNCis8PCAvQ291bnQgMTcNCisgL0ZpcnN0IDIzMSAwIFINCisgL0xhc3QgMjMxIDAgUg0KKyAvVHlwZSAvT3V0bGluZXMgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMxIDAgb2JqDQorPDwgL0NvdW50IC0xNA0KKyAvRGVzdCBbIDQ3IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDIzMiAwIFINCisgL0xhc3QgMzE0IDAgUg0KKyAvUGFyZW50IDIzMCAwIFINCisgL1RpdGxlIChBbmRyb2lkIDIuMyBDb21wYXRpYmlsaXR5IERlZmluaXRpb24pID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMyIDAgb2JqDQorPDwgL0Rlc3QgWyA0NyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzMyAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9UaXRsZSAoVGFibGUgb2YgQ29udGVudHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMzIDAgb2JqDQorPDwgL0Rlc3QgWyAxMTcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMzQgMCBSDQorIC9QYXJlbnQgMjMxIDAgUg0KKyAvUHJldiAyMzIgMCBSDQorIC9UaXRsZSAoMS4gSW50cm9kdWN0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzNCAwIG9iag0KKzw8IC9EZXN0IFsgMTE3IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjM1IDAgUg0KKyAvUGFyZW50IDIzMSAwIFINCisgL1ByZXYgMjMzIDAgUg0KKyAvVGl0bGUgKDIuIFJlc291cmNlcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMzUgMCBvYmoNCis8PCAvQ291bnQgLTgNCisgL0Rlc3QgWyAxMzggMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjM2IDAgUg0KKyAvTGFzdCAyNTIgMCBSDQorIC9OZXh0IDI1OCAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9QcmV2IDIzNCAwIFINCisgL1RpdGxlICgzLiBTb2Z0d2FyZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMzYgMCBvYmoNCis8PCAvRGVzdCBbIDEzOCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzNyAwIFINCisgL1BhcmVudCAyMzUgMCBSDQorIC9UaXRsZSAoMy4xLiBNYW5hZ2VkIEFQSSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzNyAwIG9iag0KKzw8IC9Db3VudCAtNw0KKyAvRGVzdCBbIDEzOCAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyMzggMCBSDQorIC9MYXN0IDI0NCAwIFINCisgL05leHQgMjQ1IDAgUg0KKyAvUGFyZW50IDIzNSAwIFINCisgL1ByZXYgMjM2IDAgUg0KKyAvVGl0bGUgKDMuMi4gU29mdCBBUEkgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMzggMCBvYmoNCis8PCAvRGVzdCBbIDEzOCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzOSAwIFINCisgL1BhcmVudCAyMzcgMCBSDQorIC9UaXRsZSAoMy4yLjEuIFBlcm1pc3Npb25zKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzOSAwIG9iag0KKzw8IC9EZXN0IFsgMTQzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjQwIDAgUg0KKyAvUGFyZW50IDIzNyAwIFINCisgL1ByZXYgMjM4IDAgUg0KKyAvVGl0bGUgKDMuMi4yLiBCdWlsZCBQYXJhbWV0ZXJzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI0MCAwIG9iag0KKzw8IC9EZXN0IFsgMTQ0IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjQxIDAgUg0KKyAvUGFyZW50IDIzNyAwIFINCisgL1ByZXYgMjM5IDAgUg0KKyAvVGl0bGUgKDMuMi4zLiBJbnRlbnQgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDEgMCBvYmoNCis8PCAvRGVzdCBbIDE0NCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI0MiAwIFINCisgL1BhcmVudCAyMzcgMCBSDQorIC9QcmV2IDI0MCAwIFINCisgL1RpdGxlICgzLjIuMy4xLiBDb3JlIEFwcGxpY2F0aW9uIEludGVudHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS40LjQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjQyIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNDMgMCBSDQorIC9QYXJlbnQgMjM3IDAgUg0KKyAvUHJldiAyNDEgMCBSDQorIC9UaXRsZSAoMy4yLjMuMi4gSW50ZW50IE92ZXJyaWRlcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuNSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDMgMCBvYmoNCis8PCAvRGVzdCBbIDE0NSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI0NCAwIFINCisgL1BhcmVudCAyMzcgMCBSDQorIC9QcmV2IDI0MiAwIFINCisgL1RpdGxlICgzLjIuMy4zLiBJbnRlbnQgTmFtZXNwYWNlcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuNic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDQgMCBvYmoNCis8PCAvRGVzdCBbIDE0NSAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMjM3IDAgUg0KKyAvUHJldiAyNDMgMCBSDQorIC9UaXRsZSAoMy4yLjMuNC4gQnJvYWRjYXN0IEludGVudHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjQ1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNDUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNDYgMCBSDQorIC9QYXJlbnQgMjM1IDAgUg0KKyAvUHJldiAyMzcgMCBSDQorIC9UaXRsZSAoMy4zLiBOYXRpdmUgQVBJIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjQ2IDAgb2JqDQorPDwgL0NvdW50IC0yDQorIC9EZXN0IFsgMTU4IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDI0NyAwIFINCisgL0xhc3QgMjQ4IDAgUg0KKyAvTmV4dCAyNDkgMCBSDQorIC9QYXJlbnQgMjM1IDAgUg0KKyAvUHJldiAyNDUgMCBSDQorIC9UaXRsZSAoMy40LiBXZWIgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjUuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDcgMCBvYmoNCis8PCAvRGVzdCBbIDE1OCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI0OCAwIFINCisgL1BhcmVudCAyNDYgMCBSDQorIC9UaXRsZSAoMy40LjEuIFdlYlZpZXcgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjUuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDggMCBvYmoNCis8PCAvRGVzdCBbIDE1OCAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMjQ2IDAgUg0KKyAvUHJldiAyNDcgMCBSDQorIC9UaXRsZSAoMy40LjIuIEJyb3dzZXIgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNDkgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI1MCAwIFINCisgL1BhcmVudCAyMzUgMCBSDQorIC9QcmV2IDI0NiAwIFINCisgL1RpdGxlICgzLjUuIEFQSSBCZWhhdmlvcmFsIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjUwIDAgb2JqDQorPDwgL0Rlc3QgWyAxNjIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNTEgMCBSDQorIC9QYXJlbnQgMjM1IDAgUg0KKyAvUHJldiAyNDkgMCBSDQorIC9UaXRsZSAoMy42LiBBUEkgTmFtZXNwYWNlcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuNic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNTEgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI1MiAwIFINCisgL1BhcmVudCAyMzUgMCBSDQorIC9QcmV2IDI1MCAwIFINCisgL1RpdGxlICgzLjcuIFZpcnR1YWwgTWFjaGluZSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy43JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI1MiAwIG9iag0KKzw8IC9Db3VudCAtNQ0KKyAvRGVzdCBbIDE3MiAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyNTMgMCBSDQorIC9MYXN0IDI1NyAwIFINCisgL1BhcmVudCAyMzUgMCBSDQorIC9QcmV2IDI1MSAwIFINCisgL1RpdGxlICgzLjguIFVzZXIgSW50ZXJmYWNlIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjUzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNzIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNTQgMCBSDQorIC9QYXJlbnQgMjUyIDAgUg0KKyAvVGl0bGUgKDMuOC4xLiBXaWRnZXRzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNi4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI1NCAwIG9iag0KKzw8IC9EZXN0IFsgMTcyIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjU1IDAgUg0KKyAvUGFyZW50IDI1MiAwIFINCisgL1ByZXYgMjUzIDAgUg0KKyAvVGl0bGUgKDMuOC4yLiBOb3RpZmljYXRpb25zKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNi4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI1NSAwIG9iag0KKzw8IC9EZXN0IFsgMTcyIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjU2IDAgUg0KKyAvUGFyZW50IDI1MiAwIFINCisgL1ByZXYgMjU0IDAgUg0KKyAvVGl0bGUgKDMuOC4zLiBTZWFyY2gpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjU2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNzIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNTcgMCBSDQorIC9QYXJlbnQgMjUyIDAgUg0KKyAvUHJldiAyNTUgMCBSDQorIC9UaXRsZSAoMy44LjQuIFRvYXN0cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjYuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNTcgMCBvYmoNCis8PCAvRGVzdCBbIDE3MiAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMjUyIDAgUg0KKyAvUHJldiAyNTYgMCBSDQorIC9UaXRsZSAoMy44LjUuIExpdmUgV2FsbHBhcGVycykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNTggMCBvYmoNCis8PCAvRGVzdCBbIDE3NyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI1OSAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9QcmV2IDIzNSAwIFINCisgL1RpdGxlICg0LiBBcHBsaWNhdGlvbiBQYWNrYWdpbmcgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuNSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNTkgMCBvYmoNCis8PCAvQ291bnQgLTUNCisgL0Rlc3QgWyAxNzcgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjYwIDAgUg0KKyAvTGFzdCAyNjQgMCBSDQorIC9OZXh0IDI2NSAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9QcmV2IDI1OCAwIFINCisgL1RpdGxlICg1LiBNdWx0aW1lZGlhIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjYwIDAgb2JqDQorPDwgL0Rlc3QgWyAxNzcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNjEgMCBSDQorIC9QYXJlbnQgMjU5IDAgUg0KKyAvVGl0bGUgKDUuMS4gTWVkaWEgQ29kZWNzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNy4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI2MSAwIG9iag0KKzw8IC9EZXN0IFsgMTc3IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjYyIDAgUg0KKyAvUGFyZW50IDI1OSAwIFINCisgL1ByZXYgMjYwIDAgUg0KKyAvVGl0bGUgKDUuMS4xLiBNZWRpYSBEZWNvZGVycykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjcuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNjIgMCBvYmoNCis8PCAvRGVzdCBbIDE3OCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI2MyAwIFINCisgL1BhcmVudCAyNTkgMCBSDQorIC9QcmV2IDI2MSAwIFINCisgL1RpdGxlICg1LjEuMi4gTWVkaWEgRW5jb2RlcnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjYzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNzkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNjQgMCBSDQorIC9QYXJlbnQgMjU5IDAgUg0KKyAvUHJldiAyNjIgMCBSDQorIC9UaXRsZSAoNS4yLiBBdWRpbyBSZWNvcmRpbmcpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjY0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNzkgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDI1OSAwIFINCisgL1ByZXYgMjYzIDAgUg0KKyAvVGl0bGUgKDUuMy4gQXVkaW8gTGF0ZW5jeSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuNic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNjUgMCBvYmoNCis8PCAvRGVzdCBbIDE4NCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI2NiAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9QcmV2IDI1OSAwIFINCisgL1RpdGxlICg2LiBEZXZlbG9wZXIgVG9vbCBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi43JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI2NiAwIG9iag0KKzw8IC9Db3VudCAtNw0KKyAvRGVzdCBbIDE4NCAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyNjcgMCBSDQorIC9MYXN0IDMwMSAwIFINCisgL05leHQgMzAyIDAgUg0KKyAvUGFyZW50IDIzMSAwIFINCisgL1ByZXYgMjY1IDAgUg0KKyAvVGl0bGUgKDcuIEhhcmR3YXJlIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjY3IDAgb2JqDQorPDwgL0NvdW50IC01DQorIC9EZXN0IFsgMTg4IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDI2OCAwIFINCisgL0xhc3QgMjcyIDAgUg0KKyAvTmV4dCAyNzMgMCBSDQorIC9QYXJlbnQgMjY2IDAgUg0KKyAvVGl0bGUgKDcuMS4gRGlzcGxheSBhbmQgR3JhcGhpY3MpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS45LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjY4IDAgb2JqDQorPDwgL0Rlc3QgWyAxODggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNjkgMCBSDQorIC9QYXJlbnQgMjY3IDAgUg0KKyAvVGl0bGUgKDcuMS4xLiBTY3JlZW4gQ29uZmlndXJhdGlvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS45LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjY5IDAgb2JqDQorPDwgL0Rlc3QgWyAxODggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNzAgMCBSDQorIC9QYXJlbnQgMjY3IDAgUg0KKyAvUHJldiAyNjggMCBSDQorIC9UaXRsZSAoNy4xLjIuIERpc3BsYXkgTWV0cmljcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjkuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNzAgMCBvYmoNCis8PCAvRGVzdCBbIDE4OCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI3MSAwIFINCisgL1BhcmVudCAyNjcgMCBSDQorIC9QcmV2IDI2OSAwIFINCisgL1RpdGxlICg3LjEuMy4gRGVjbGFyZWQgU2NyZWVuIFN1cHBvcnQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS45LjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjcxIDAgb2JqDQorPDwgL0Rlc3QgWyAxODggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNzIgMCBSDQorIC9QYXJlbnQgMjY3IDAgUg0KKyAvUHJldiAyNzAgMCBSDQorIC9UaXRsZSAoNy4xLjQuIFNjcmVlbiBPcmllbnRhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjkuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNzIgMCBvYmoNCis8PCAvRGVzdCBbIDE5MSAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMjY3IDAgUg0KKyAvUHJldiAyNzEgMCBSDQorIC9UaXRsZSAoNy4xLjUuIDNEIEdyYXBoaWNzIEFjY2VsZXJhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNzMgMCBvYmoNCis8PCAvQ291bnQgLTQNCisgL0Rlc3QgWyAxOTEgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjc0IDAgUg0KKyAvTGFzdCAyNzcgMCBSDQorIC9OZXh0IDI3OCAwIFINCisgL1BhcmVudCAyNjYgMCBSDQorIC9QcmV2IDI2NyAwIFINCisgL1RpdGxlICg3LjIuIElucHV0IERldmljZXMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI3NCAwIG9iag0KKzw8IC9EZXN0IFsgMTkxIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjc1IDAgUg0KKyAvUGFyZW50IDI3MyAwIFINCisgL1RpdGxlICg3LjIuMS4gS2V5Ym9hcmQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMC4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI3NSAwIG9iag0KKzw8IC9EZXN0IFsgMTkxIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjc2IDAgUg0KKyAvUGFyZW50IDI3MyAwIFINCisgL1ByZXYgMjc0IDAgUg0KKyAvVGl0bGUgKDcuMi4yLiBOb24tdG91Y2ggTmF2aWdhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjc2IDAgb2JqDQorPDwgL0Rlc3QgWyAxOTEgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNzcgMCBSDQorIC9QYXJlbnQgMjczIDAgUg0KKyAvUHJldiAyNzUgMCBSDQorIC9UaXRsZSAoNy4yLjMuIE5hdmlnYXRpb24ga2V5cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjc3IDAgb2JqDQorPDwgL0Rlc3QgWyAxOTEgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDI3MyAwIFINCisgL1ByZXYgMjc2IDAgUg0KKyAvVGl0bGUgKDcuMi40LiBUb3VjaHNjcmVlbiBpbnB1dCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNzggMCBvYmoNCis8PCAvQ291bnQgLTgNCisgL0Rlc3QgWyAxOTYgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjc5IDAgUg0KKyAvTGFzdCAyODYgMCBSDQorIC9OZXh0IDI4NyAwIFINCisgL1BhcmVudCAyNjYgMCBSDQorIC9QcmV2IDI3MyAwIFINCisgL1RpdGxlICg3LjMuIFNlbnNvcnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI3OSAwIG9iag0KKzw8IC9EZXN0IFsgMTk2IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjgwIDAgUg0KKyAvUGFyZW50IDI3OCAwIFINCisgL1RpdGxlICg3LjMuMS4gQWNjZWxlcm9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjgwIDAgb2JqDQorPDwgL0Rlc3QgWyAxOTYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyODEgMCBSDQorIC9QYXJlbnQgMjc4IDAgUg0KKyAvUHJldiAyNzkgMCBSDQorIC9UaXRsZSAoNy4zLjIuIE1hZ25ldG9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjgxIDAgb2JqDQorPDwgL0Rlc3QgWyAxOTYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyODIgMCBSDQorIC9QYXJlbnQgMjc4IDAgUg0KKyAvUHJldiAyODAgMCBSDQorIC9UaXRsZSAoNy4zLjMuIEdQUykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjgyIDAgb2JqDQorPDwgL0Rlc3QgWyAxOTYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyODMgMCBSDQorIC9QYXJlbnQgMjc4IDAgUg0KKyAvUHJldiAyODEgMCBSDQorIC9UaXRsZSAoNy4zLjQuIEd5cm9zY29wZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjgzIDAgb2JqDQorPDwgL0Rlc3QgWyAxOTggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyODQgMCBSDQorIC9QYXJlbnQgMjc4IDAgUg0KKyAvUHJldiAyODIgMCBSDQorIC9UaXRsZSAoNy4zLjUuIEJhcm9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjg0IDAgb2JqDQorPDwgL0Rlc3QgWyAxOTggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyODUgMCBSDQorIC9QYXJlbnQgMjc4IDAgUg0KKyAvUHJldiAyODMgMCBSDQorIC9UaXRsZSAoNy4zLjcuIFRoZXJtb21ldGVyKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTEuNic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyODUgMCBvYmoNCis8PCAvRGVzdCBbIDE5OCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI4NiAwIFINCisgL1BhcmVudCAyNzggMCBSDQorIC9QcmV2IDI4NCAwIFINCisgL1RpdGxlICg3LjMuNy4gUGhvdG9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjcnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjg2IDAgb2JqDQorPDwgL0Rlc3QgWyAxOTggMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDI3OCAwIFINCisgL1ByZXYgMjg1IDAgUg0KKyAvVGl0bGUgKDcuMy44LiBQcm94aW1pdHkgU2Vuc29yKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI4NyAwIG9iag0KKzw8IC9Db3VudCAtNQ0KKyAvRGVzdCBbIDE5OCAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyODggMCBSDQorIC9MYXN0IDI5MiAwIFINCisgL05leHQgMjkzIDAgUg0KKyAvUGFyZW50IDI2NiAwIFINCisgL1ByZXYgMjc4IDAgUg0KKyAvVGl0bGUgKDcuNC4gRGF0YSBDb25uZWN0aXZpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMi4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI4OCAwIG9iag0KKzw8IC9EZXN0IFsgMTk4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjg5IDAgUg0KKyAvUGFyZW50IDI4NyAwIFINCisgL1RpdGxlICg3LjQuMS4gVGVsZXBob255KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTIuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyODkgMCBvYmoNCis8PCAvRGVzdCBbIDE5OCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI5MCAwIFINCisgL1BhcmVudCAyODcgMCBSDQorIC9QcmV2IDI4OCAwIFINCisgL1RpdGxlICg3LjQuMi4gSUVFRSA4MDIuMTEgXChXaUZpXCkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMi4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI5MCAwIG9iag0KKzw8IC9EZXN0IFsgMTk4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjkxIDAgUg0KKyAvUGFyZW50IDI4NyAwIFINCisgL1ByZXYgMjg5IDAgUg0KKyAvVGl0bGUgKDcuNC4zLiBCbHVldG9vdGgpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMi4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI5MSAwIG9iag0KKzw8IC9EZXN0IFsgMjEwIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjkyIDAgUg0KKyAvUGFyZW50IDI4NyAwIFINCisgL1ByZXYgMjkwIDAgUg0KKyAvVGl0bGUgKDcuNC40LiBOZWFyLUZpZWxkIENvbW11bmljYXRpb25zKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTIuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyOTIgMCBvYmoNCis8PCAvRGVzdCBbIDIxMCAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMjg3IDAgUg0KKyAvUHJldiAyOTEgMCBSDQorIC9UaXRsZSAoNy40LjUuIE1pbmltdW0gTmV0d29yayBDYXBhYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI5MyAwIG9iag0KKzw8IC9Db3VudCAtNA0KKyAvRGVzdCBbIDIxMyAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyOTQgMCBSDQorIC9MYXN0IDI5NyAwIFINCisgL05leHQgMjk4IDAgUg0KKyAvUGFyZW50IDI2NiAwIFINCisgL1ByZXYgMjg3IDAgUg0KKyAvVGl0bGUgKDcuNS4gQ2FtZXJhcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEzLjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjk0IDAgb2JqDQorPDwgL0Rlc3QgWyAyMTMgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyOTUgMCBSDQorIC9QYXJlbnQgMjkzIDAgUg0KKyAvVGl0bGUgKDcuNS4xLiBSZWFyLUZhY2luZyBDYW1lcmEpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMy4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI5NSAwIG9iag0KKzw8IC9EZXN0IFsgMjEzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjk2IDAgUg0KKyAvUGFyZW50IDI5MyAwIFINCisgL1ByZXYgMjk0IDAgUg0KKyAvVGl0bGUgKDcuNS4yLiBGcm9udC1GYWNpbmcgQ2FtZXJhKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTMuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyOTYgMCBvYmoNCis8PCAvRGVzdCBbIDIxMyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI5NyAwIFINCisgL1BhcmVudCAyOTMgMCBSDQorIC9QcmV2IDI5NSAwIFINCisgL1RpdGxlICg3LjUuMy4gQ2FtZXJhIEFQSSBCZWhhdmlvcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEzLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjk3IDAgb2JqDQorPDwgL0Rlc3QgWyAyMTQgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDI5MyAwIFINCisgL1ByZXYgMjk2IDAgUg0KKyAvVGl0bGUgKDcuNS40LiBDYW1lcmEgT3JpZW50YXRpb24pID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjk4IDAgb2JqDQorPDwgL0NvdW50IC0yDQorIC9EZXN0IFsgMjE0IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDI5OSAwIFINCisgL0xhc3QgMzAwIDAgUg0KKyAvTmV4dCAzMDEgMCBSDQorIC9QYXJlbnQgMjY2IDAgUg0KKyAvUHJldiAyOTMgMCBSDQorIC9UaXRsZSAoNy42LiBNZW1vcnkgYW5kIFN0b3JhZ2UpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xNC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI5OSAwIG9iag0KKzw8IC9EZXN0IFsgMjE0IDAgUg0KKyAvRml0IF0NCisgL05leHQgMzAwIDAgUg0KKyAvUGFyZW50IDI5OCAwIFINCisgL1RpdGxlICg3LjYuMS4gTWluaW11bSBNZW1vcnkgYW5kIFN0b3JhZ2UpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xNC4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMwMCAwIG9iag0KKzw8IC9EZXN0IFsgMjE0IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyOTggMCBSDQorIC9QcmV2IDI5OSAwIFINCisgL1RpdGxlICg3LjYuMi4gQXBwbGljYXRpb24gU2hhcmVkIFN0b3JhZ2UpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjYnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzAxIDAgb2JqDQorPDwgL0Rlc3QgWyAyMTggMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDI2NiAwIFINCisgL1ByZXYgMjk4IDAgUg0KKyAvVGl0bGUgKDcuNy4gVVNCKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi44JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMwMiAwIG9iag0KKzw8IC9EZXN0IFsgMjE4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMzAzIDAgUg0KKyAvUGFyZW50IDIzMSAwIFINCisgL1ByZXYgMjY2IDAgUg0KKyAvVGl0bGUgKDguIFBlcmZvcm1hbmNlIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjknOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzAzIDAgb2JqDQorPDwgL0NvdW50IC00DQorIC9EZXN0IFsgMjE4IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDMwNCAwIFINCisgL0xhc3QgMzA3IDAgUg0KKyAvTmV4dCAzMDggMCBSDQorIC9QYXJlbnQgMjMxIDAgUg0KKyAvUHJldiAzMDIgMCBSDQorIC9UaXRsZSAoOS4gU2VjdXJpdHkgTW9kZWwgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjE1LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzA0IDAgb2JqDQorPDwgL0Rlc3QgWyAyMTggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMDUgMCBSDQorIC9QYXJlbnQgMzAzIDAgUg0KKyAvVGl0bGUgKDkuMS4gUGVybWlzc2lvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xNS4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMwNSAwIG9iag0KKzw8IC9EZXN0IFsgMjE4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMzA2IDAgUg0KKyAvUGFyZW50IDMwMyAwIFINCisgL1ByZXYgMzA0IDAgUg0KKyAvVGl0bGUgKDkuMi4gVUlEIGFuZCBQcm9jZXNzIElzb2xhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjE1LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzA2IDAgb2JqDQorPDwgL0Rlc3QgWyAyMTggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMDcgMCBSDQorIC9QYXJlbnQgMzAzIDAgUg0KKyAvUHJldiAzMDUgMCBSDQorIC9UaXRsZSAoOS4zLiBGaWxlc3lzdGVtIFBlcm1pc3Npb25zKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTUuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCiszMDcgMCBvYmoNCis8PCAvRGVzdCBbIDIyMSAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMzAzIDAgUg0KKyAvUHJldiAzMDYgMCBSDQorIC9UaXRsZSAoOS40LiBBbHRlcm5hdGUgRXhlY3V0aW9uIEVudmlyb25tZW50cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzA4IDAgb2JqDQorPDwgL0NvdW50IC0zDQorIC9EZXN0IFsgMjIxIDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDMwOSAwIFINCisgL0xhc3QgMzExIDAgUg0KKyAvTmV4dCAzMTIgMCBSDQorIC9QYXJlbnQgMjMxIDAgUg0KKyAvUHJldiAzMDMgMCBSDQorIC9UaXRsZSAoMTAuIFNvZnR3YXJlIENvbXBhdGliaWxpdHkgVGVzdGluZykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjE2LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzA5IDAgb2JqDQorPDwgL0Rlc3QgWyAyMjEgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMTAgMCBSDQorIC9QYXJlbnQgMzA4IDAgUg0KKyAvVGl0bGUgKDEwLjEuIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjE2LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzEwIDAgb2JqDQorPDwgL0Rlc3QgWyAyMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMTEgMCBSDQorIC9QYXJlbnQgMzA4IDAgUg0KKyAvUHJldiAzMDkgMCBSDQorIC9UaXRsZSAoMTAuMi4gQ1RTIFZlcmlmaWVyKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTYuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCiszMTEgMCBvYmoNCis8PCAvRGVzdCBbIDIyNSAwIFINCisgL0ZpdCBdDQorIC9QYXJlbnQgMzA4IDAgUg0KKyAvUHJldiAzMTAgMCBSDQorIC9UaXRsZSAoMTAuMy4gUmVmZXJlbmNlIEFwcGxpY2F0aW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzEyIDAgb2JqDQorPDwgL0Rlc3QgWyAyMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMTMgMCBSDQorIC9QYXJlbnQgMjMxIDAgUg0KKyAvUHJldiAzMDggMCBSDQorIC9UaXRsZSAoMTEuIFVwZGF0YWJsZSBTb2Z0d2FyZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzEzIDAgb2JqDQorPDwgL0Rlc3QgWyAyMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMTQgMCBSDQorIC9QYXJlbnQgMjMxIDAgUg0KKyAvUHJldiAzMTIgMCBSDQorIC9UaXRsZSAoMTIuIENvbnRhY3QgVXMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjEzJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMxNCAwIG9iag0KKzw8IC9Db3VudCAtNQ0KKyAvRGVzdCBbIDIyNiAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAzMTUgMCBSDQorIC9MYXN0IDMxOSAwIFINCisgL1BhcmVudCAyMzEgMCBSDQorIC9QcmV2IDMxMyAwIFINCisgL1RpdGxlIChBcHBlbmRpeCBBIC0gQmx1ZXRvb3RoIFRlc3QgUHJvY2VkdXJlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTcuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCiszMTUgMCBvYmoNCis8PCAvRGVzdCBbIDIyNiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDMxNiAwIFINCisgL1BhcmVudCAzMTQgMCBSDQorIC9UaXRsZSAoU2V0dXAgYW5kIEluc3RhbGxhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjE3LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzE2IDAgb2JqDQorPDwgL0Rlc3QgWyAyMjYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMTcgMCBSDQorIC9QYXJlbnQgMzE0IDAgUg0KKyAvUHJldiAzMTUgMCBSDQorIC9UaXRsZSAoVGVzdCBCbHVldG9vdGggQ29udHJvbCBieSBBcHBzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTcuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCiszMTcgMCBvYmoNCis8PCAvRGVzdCBbIDIyNiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDMxOCAwIFINCisgL1BhcmVudCAzMTQgMCBSDQorIC9QcmV2IDMxNiAwIFINCisgL1RpdGxlIChUZXN0IFBhaXJpbmcgYW5kIENvbW11bmljYXRpb24pID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xNy4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMxOCAwIG9iag0KKzw8IC9EZXN0IFsgMjI2IDAgUg0KKyAvRml0IF0NCisgL05leHQgMzE5IDAgUg0KKyAvUGFyZW50IDMxNCAwIFINCisgL1ByZXYgMzE3IDAgUg0KKyAvVGl0bGUgKFRlc3QgUGFpcmluZyBhbmQgQ29tbXVuaWNhdGlvbiBpbiB0aGUgUmV2ZXJzZSBEaXJlY3Rpb24pID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xNy40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzMxOSAwIG9iag0KKzw8IC9EZXN0IFsgMjI2IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAzMTQgMCBSDQorIC9QcmV2IDMxOCAwIFINCisgL1RpdGxlIChUZXN0IFJlLUxhdW5jaGVzKSA+Pg0KK2VuZG9iag0KKyUgJ1IzMjAnOiBjbGFzcyBQREZQYWdlcyANCiszMjAgMCBvYmoNCislIHBhZ2UgdHJlZQ0KKzw8IC9Db3VudCAyNg0KKyAvS2lkcyBbIDQ3IDAgUg0KKyA4OSAwIFINCisgMTE3IDAgUg0KKyAxMzggMCBSDQorIDE0MyAwIFINCisgMTQ0IDAgUg0KKyAxNDUgMCBSDQorIDE1OCAwIFINCisgMTYyIDAgUg0KKyAxNzIgMCBSDQorIDE3NyAwIFINCisgMTc4IDAgUg0KKyAxNzkgMCBSDQorIDE4NCAwIFINCisgMTg4IDAgUg0KKyAxOTEgMCBSDQorIDE5NiAwIFINCisgMTk4IDAgUg0KKyAyMTAgMCBSDQorIDIxMyAwIFINCisgMjE0IDAgUg0KKyAyMTggMCBSDQorIDIyMSAwIFINCisgMjI1IDAgUg0KKyAyMjYgMCBSDQorIDIyNyAwIFIgXQ0KKyAvVHlwZSAvUGFnZXMgPj4NCitlbmRvYmoNCislICdSMzIxJzogY2xhc3MgUERGU3RyZWFtIA0KKzMyMSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAxNzg2ID4+DQorc3RyZWFtDQorR2F0bT05bG8mSSZBPEcxcnJMMEtkaWVHSGEvdEFtXD0mMG8tV1pFUEhAXFhZN1NBak43K21jUlQqNltjLFYsITJTPDpmOTtjaiUzbipTajU2a090ZEQ+bi0/S1xqciJsWlglP0wxWUtwIlZ0ZUYhUFAlcFNwWT4xRj88XzdgIytMXGZedGI2b1NXKC5pTCJULCxeTVI5SlFfXmwuIylAaDoqUE8sYk8qJ0tMMEhPVGRPZStcUVgtN2trY1xbbjA6TWpqbSwxaDZyak1ebkJ0MGliOWVmQV9wQjVDTTdySUFUNDIxWzMwVGlIRUhpOitRYkoxKT5iWWcwXkdIJFpRVGkmXDQqK2k1WilyRik7YlRpLSNXYiljc11uRXIkRkU8JWw0Tj1jJEVQTSxzbityTmJuIW9gSlxjV0dQNFJjRkwzMUI/J0BSNl5qXTskQGRnaGROdGdrTUZFM2YqYzxSRzVtRiYwP2tXWDV1dChrMD1bPHJmL1cnZ20iWm88QjEtLUAoMihnVT00czFrQDZVQW9CIzQuJChpQ21BLTE0MjskbXRXXFVSR0tnUydoSCNPOS4ybzRtc1NSYDBdN3JhQ3M2N09cJ1E+dW9MTWQtLG5HQDw+TmFXIztnLzxqL29aY29HdGBHRmw6RVxUdEp1TjtjWGpvSXJDRWBwVklNJEM9RjNrL2RiN04iWmYicnMrbSEoQGVwLSomdXJQWlwrWFM+alQkZDtnNy81MiRdKWA+Km5wOSljSSVMLGNOL2M+bzNTV1FKY2ltQS08bF9FVF4xJGpgKzM7X2ZyNDNVXT0ra2tMInRJJzcyIkJrbTJXRC8xNmdHTWM6J0dgUEBZajxyIilzQjEqOXNWa0ZOb2NbJmw2Q281Zm9qI0JOO2VcJD8xPGVrVyEjWENeYWlNN0RzODFtU2hCNURpUDFGW0kwRztRYmAtVC0rIUpFVT09O0QhIU5jPk1NNUZfRW1qWDo6bmJmam1WVyNXJUE/NjdSOlRWXi0kK2Q+UjphN3MyczZuMWpYVDZaZms2KTVtT0ZhNFcqQ2ckW2ksUit1QWUyIVskZ0k9ZlBhaVVDR2hNQihHI1gtVT9KRzEpJSYuMFdvSUVvPWIrK1ErR3EiTW5tanIhM1djJSwqb2FNYG1HTjBhQVgwcSZwZ1AnMlZSSDtkW0o8PzNVYW43PTVlZms4X0knP05yUE4hOmZbJ0MzNm1mJ2RjalNrSShZQUAqLytVSVhLTW5SWEBhKlNDJXVSWSg4RnFRKCFxMkItaShEW1NoQ0pmKEpQQjo6I1pcKi9DYjFUVildLVBsJGNFXjRbK1EqRD4ndU0nck11KUYvWXJjZGJqSms/ISoraVtqLXMkJ3JuVDQ5XWc2NEBCMHAhcFZaakosWlxlL2Y+Y1s/XTlHXT83OHJEYzo7T2o/UU4laF9aSiFYWkdvME44YU5FbF1XWitoSlxhSGFmY1ciN0k5NyxIKFtmTDpgcS4mU2cqQ1BLaWYxWlImI1FZNEdSZ0JEQ1s8UUkwaCxOL1haKksqUS0vTWhXTHBNIUskZHFjMyk3cmgqKi5EQEtxUkg5bE9rQEZUSjViL0BGLk4mVlsha2FnI1xna0tpMV8zcCJRREpnKTFnVzZSPGlXMTk/MihnV1A5XyU9b2JDYDMlI21SU0g0RF48ZmdPMU5CRjc/LkVRJC9cQDUsaDpZKEVTKSRqTCJEc2MyOmFbVydLSWxyV0M8J0NVJ0okUlBmWTovMDlwNEdAaWgtRU5tdWxCZG5QTF8iZD9vI1BzIlhTWmxhQiw9LmYzIW45WSdYZ0JhRiJTVlBxYTtrPTMtRVI7J2ZxbFRtYidTITE/YDNZK2doMWI5aVRPTFFwYnBKPFtwLF9VXGI4MEoiOGtzVSRfUydTQiNVaSgxckZaLFtiRFhgLE1MIUlKQXImaiRLZlpyRGxsIWpfMmNTaT41Y3RBYSdrLm8xMW5VKjpwSzddK0QkUi9zbUxOVWdub1xSXSs4OXRyPmFJZVtROnRkU3BLLlxWYjN0VE8hKTE7T01xKjEuaGg6OWNuWldgNT9ib0dOWThEcyMvbCU3PEhwW0w/LkpAWlAvXWRoTlVVcmpaXz4uKHEjTERXOD8+VC8nZGRTVlE+XGdHOXFaM0Q8VEZnaihrKj0uQDZmKTAra0ZISFlvM1koSUJLXjQpOjopPVBQNj9KXSJYXDNtNDQjYChXU2FKNWw8Zl9EVFxDLmNKODpcRFhHOFpZXE87N1MvYWtQJ1Q8UztdQDtYRi9RZDJHIWpYL1NgbUIqP2JNP2dRSSZjRWFPdXA1JWZVO1xMNCJTX0V0S0soLENxSyRBR1xDL1szTjEnYGpcIzxZPk4tVS5VOk11a0B+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMjInOiBjbGFzcyBQREZTdHJlYW0gDQorMzIyIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDE1MTQgPj4NCitzdHJlYW0NCitHYXRtPGhjJjhoJjpTOEhzJ1sjKFJtQ1tZUUBEIXUlMUk7Sjk6S25wZE1McExVOHIuLVozMDEmXlFmK145blRQVEw7OD5GKWdRWUJEbmZSKyJTYkY/VDZVYF4xNHFnOy1yOixTPkcqLEdASjJXUkFxcFVVZ0RBXDVNXCReTVlzPXI8M0pBXlNIcSorRzteVUddbixQW3FDSSY4dWA/XjlDYmZcMiZHX2BzaS1HaiguWnNWcio1LVUpJXFbWzpnWnFwMiFJSm5RbWptMShwTUdpYTczKT1JQTQkUGorKzs+QGtLRVZZZDthTUNkWnVdJ1pGTkJSakJgNyFfM0k0L3JGI04jTkBzaTRUOStxcGNTWUhlS0xrTypgMS8oajZVaWwjTGdCTC8+NmpIWGJnSmw0SCZQQ3Q3XFw/SVpSQ0ElMSg7Y0IxRG9yPzVmJSFXbT04O25dQkQ6W0RDUXUhQWdjNE84X1tqO1xhI2xaaTFPRF1hKV8hOjZlVDA0PGxFXl47MD5KMT9tVnFSVVJnNUwzYS1gWFtvbFF0ci4nVDxnX2I8YTg8R1NvZyIvRjgiNy8wMydKM1syRSJeWGA1ZyxVJlA/SGRWPDdvcEoxY0lqJUpmYlgjXzY4SUA7TiZWMFVLNnIuRVtvVjdpJmA0KSlCYjRaZF1WblFQO29GLjclUlFzdW0pTnM0IkgqTixTT0JYQWsqRmZDR3FLSj1GPUEvQ0w1RXImX184QC44aUNTTE0hK0IxbCdOM2txMFslJFNhMypsWlA8VTwxPDUwMFlZLU9DLkdfKDghYG9jcyhnKUMwN1Iqbk4yPHRdX0kySW1FajM/dEgjKzRUO0lKT0lUaWAiRT1FMm9zMmspSHNtbjlqNiRJREUwJm9wQlVMKT5jLlgjOi81NldmOyRQXDBuVjonbEUqUG0mNGJpIjIjRG5dbzoldSk3IlMhZCsrXWhwMixyQChSKXJEUC4kTGlwQ0k7KDFcTF8sUWxDKUNVZl8lUWQqNiVEKDMwIk1CJy87TmFeVTpvLmEoaGdubEczTFpwKGpVXkpwSUo9IWA7Ym86WD49MzZkY0JOQEknLCk+SG1ZSURtIUpUXlRjWE46Jk1RVjkrKiE1SyokIiVfJVoxSHJmQW1oYnJhWydWNW0oLVwzNzlSTERpXnFnOW5GPFBHbG5iXTZfPkQ1bzwhOG1zYCRBb3VUJFNlbGwvMkI2KDBea2w9U2VAU0w5cUhpLjNsXGVXR0MwbT0tYTNmSlJJZiRLZkI9cyYqcEhfIm5vVkYrSD1bUTY3QEc1Q1loPGMnXGBeP01gXCk7P28pMHBqNCs7O1YjOnN1XXNNYzNnQ1kzRUpCVzosXSc0QzBYdTluUy9hK3VBZGFmYVteXDsxbW0lPzYnXkJbLVF0NTdpND9gXVZbOldAUD5kYk1kOFY4SFFZVkBGQzZpJG1NTjUjVl9rbTpQWmE4RVgvSlpCcDFwLCxvMVNKJlJCTVBpPjssWVMoMVhOLT1pR1JOZmkxIV5LWmR1Sz50IyQpSFFuLTI4Zl4+Kz8rW0xUMyclSCFFTlMrJk9tcUInRVFwdTlXJ1JDLzN1NS8lRlpoVm5WM11sZihTQkUhSi4ibiNsUF9Caj8mXGNULSsyYFJWQCRKMGxVSTMuKFNeYUcoVXQmVz1YLkFHTHU8ITpiK3VVTS4iRVcvT2pFKypDI1thS3FoMmhUYTY9Ly0qNGxQMW8uXF8oYmxgLjM0c1AkKlhyQz5iTnUyJFpeIm1oaWMkajpHbC9PaXM4SkxzOVMpST42JSlFblcvKy9kLmA6cEdxTCQ7MmVLMlJHcU0iXTxOJ2BPNGFoNV1HOSozSGNCakRMZlZbTyQpMmNqLTNwTjtTRFZnPj0yOkVOV1NTQi1KPiUhXF1mRkVCPic1SWZMQktmKyc8VF1wcl8wRyNRSTY1bUZBdC51JitiUThgYkdmTkdGQlpDN2dhMy80M2EsNURBJFteNDRbcWxcWE8zJmolcSs0QG5tIm9+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMjMnOiBjbGFzcyBQREZTdHJlYW0gDQorMzIzIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDMyNzkgPj4NCitzdHJlYW0NCitHYXVIT2dOKSUuJnEqUFVyVzIsK2ZPUlZabiJRMlk+Zk9DVDhwMnR1RzVTU3RSWSIoJF9McypNIWpwdGNxWCJKPytyL2ssQ21jImNrITNJUEVER1A5MmtiNUklPV1BaERuSTdTaDQuUmAlV1BgLz9QOkRXNSstbUVeV3AzI3Boa1BOcVklXVBZIlFZNFQnOzRyalA0SWhCUDthUSlqJ0kxKExYWWFfa0FiImRiLUgibzFmMVUwRixsQWRLJDJRYyhBSDY/P3JgcnIlQmkqXUNGZydvQ0taK3BqTSVuZCRbY2ZpPCk5W0NuQyNpVUhQTzVZPW1dTihLTl5nRj8wZUZZP14oMydXcSdLRiIkak9rcz9fLlhHK2s+RTNvI25GO0U5RkhPT2ZjOnNBJztUaCRCZkVsMFwtR1F0bmpWUlttc2J0NWFkUV9ORjUmSXBLaDJQbmk0XzklRkkrdTFAI0tHUy9KJGFQbSZPYEhWZ0FWTF5nXUlCLzlTOCM2WW5aQy9SbmhzLEouMihXPE50MDJRI2BsZnBGJzc9Q3EyXmpxMShyOkAjOGlrLDU8dUxjUUBSXSRKV3NGLEV1XCZlQiphKlpQX3AtYixcSUQvZnFlST0xMjNuLCYvMl1XQ1IxamI3PD01ZmI7KWU4PTFdZ1w1bGEtSypvPS1VMVckR05TQjJiZ0xvIl9lYU5LLDgsalhLb28qXzlMZ3FcZkNKYk4wXVFRa0dyUCcpJz9oSz4/RXI1WDFlL0pBcT5hZCJFOFImXk81ZzVpOEFyViRTaGd1KztXNFVVa2skOi1XOmRiUEorJjRYcVhJTnI7c2AkUzhTbkZHUUk2QyIpNiMyZ1laaSRqTSYkcFE4Lk0+bzp1UUBLIi1iJDhJLVw3WjdxREhYZS0tJ29OJ0xsdUlkbU9RRjJLOj8mT10rSWZwcnA1SEdePzgtUC1FOFpsXmdwJXFJZHByLjAxIlpZYWloP1JxM19qPCU3JjhCK3R0MGFpaE9UWElwXkdkQFIrRlA7UENiXSQ0NUtCczFZJ2lVZEV0JSVpRmE6YnRNO0E2bClcM0BgWmMyZ0lQMUwrZFBQTDs9Pi08LDhlWTMiSjwjZipzJlBjPDpXNl5oUUExYzFSQy4kJmN0OyotRmpXRSk4VGxHQW46LnRrPDQ7ZUIvWVZjakFybXVpJ2ZQYFU+PG9pbz5iLDBkbilnPCtvMTJGJTEoTmhaREBVKSpncGhTKUE4IkspY1UndTdFK0FbLXNeaFYuWiVbKDhKNW5UImZdTFhwISNoKThtLWFkXyRpal4jKlMqXiwnOi9iK0M5KUlgXT86S1YvYy0/S2tSNGJFWW0mJD1tWV1cb3FbRk5yXi8pbk9nR3ExUFsnUzVfUEA/Sis9UnNbOWJabS5qWkZiaDdWMF0uNk4uLkhIVXJuKUkyVSZELzByR0hYZi43WDlFcVdSXEpgQy1mNjdbKj5lPDoxR08tdCU2a0QzW01OX2tBaFNSRUZFLlk0LSUtRE4rT0BxM2BUPS0ucU1TPzAiWzdEVkVVVG8/alYsQ3AvOUFIKU5wJFNwKkAxTFJAQjtBXVdKPUY9VURPPHM0aFMxVyZqcSknZj5kKEVSOmldS3MiMThAJGotWENnSUBDPSY+YDBGM2xSY2pKXz1ObzFZUmovQTk0PihDcHBzQ1hyPXBLJEgsMVdrJjBlTGEsblsuQyJfJXNaQF4mQ1pKTkgyRS5qMXJJMFE0aiFqVDxvOSg8MywvS1VXVVo+YC0kYkA0PDtRI2pua2QycT5MSyhVcSNUPmFBdVoyN2pHQz8wUFdsQylqOSlKSlFXM0g3LE1oTT90LTRRMSwwUmxqTih1ZnRBa2hoTUw2bSReJ0Q6LTxSNTlXXEJCV1RjJVwsUUJsOl02Qy9GdTM2K00qcUxQO2MiUDFHPmpKZHJoIygzKSI+X2pYK2RNS0NrUFdpPzJJRiguVzs3WipZZyU0UT1aTSxbLFw2IWl1NElEUyFIKGUyP200cTQhKCJwXWg0WS5ePDtXXDlRSzxjWT82RkxZQVlPVkZ0P1RzVmViNW1ccThrXixbUjZXQnRDXUdkOmA9aWtcRFtDT2tjKC9MUFNGOiEmRVdbZSIoczw7PCt0Im8wLi89NFgwPmZLOG0tX11OKjVhW0BcVkI0Yyk+YSJgXEw5PDxuVUE7cmhQaCw7QmlbckZlVDhcRCMmNWFcJEU4QCYpRDFHMSJoOUY3aWwpQWtGSVgsblY1K2skaVZxTFdrVDReM21adCRpVShLSDpcb0kwRGQlVkdeZCYkV14oIWVnSG05MXBpYHJbVSNeUFAiT0hUMW1yZSJeMTlDLU0xcFVLa0xjWTdUOGdrQU1uZV1BNkIkb29fV0JEXF5HNHMuVGgiSio9XjZIYURCUi4oYjczJVZ1LU8iMSUoaW0sPXAvRERrRkNvMFt0NCdsNjZkSysyckpxIj9uUVg4Jk5tL2drJlU+LnM5NCQwWUI9ZCdfYCtfa0BWPiIpaW9oTDslaktJRyEpdFsuZyIzSyJXMjktXGhZXWlvVU5qTExXRGdrVyRyY0xTOGk4T09CX0xHa1IqbVpdZWYqJCQiUjs8IyVvJTZDPHFyNShvRSZdJytfIzxuVU8haWJxWmpXP15IV1Q4Zl0nXzE5JCpUcVVoKiszYHM4RlB0YyVySWwlLFcsKWtDL1Y5I2VeKWpbR1pWMnBEJSZKNWJyQ0FRUkVKVHUnLUdpNidsMFNLXkJLLVMzJT8rMzRHR1Jpb2RucTZRQUxubVpdQmJFUG1HV1RsImU5VC9XSEhlOlszc1ctPUpcPyYsZSpQQFdAZ3U/T2I/J3BoP3JDUTxYInNuO2ReXD0hJUAxbnBzMC5YZCQwOGpvX2tHcCdpI0Q6PkpCa1oxcWklMDVHM3JZRT0vOTU7YVw9KkMiNSwmX3IkSCpaJyVAb085IjE4W2JcIkEiL3QrMDtqRVtLUzpDTVA0Qi8ucVRpcDBSOVYmPiwqXDBZUFNFNztlaVkiPDE5VjY2N25dZmRQVz43Sz5ndTNDOTQqL0dWUDNgMk5tbUV1PlRjQ1gjRS8ub2g7L0UxSTEvRVk/OiNwPl9NTiFhZGppalpXaSIjdVJoMEs5VCUtIygsP285Z1YkMSkjNkhPXVEvKkhyIiIwViszInA8TVc/MjRSUlJmO2dzWlVIXUQiMl43NERCWFczb29aInU0Si5JNm88OEpNPl5kPiM3cXUsK0whTTAmKC8nWytpXCQhRj1BQXIrMFd1JF1oQGRIQXFXYkBjLD4rTEdvaT9ATixmX2IpTVlAbi40WTpkTnBsVSgnZkU7SCpHSzgoYUkxTlFHSikjO0hFTyRxZmBgZHJNJj9nQGhPTjtFIl4+VStwSiNQcHI8YywsWVRtdE8zZDU0VjdbRUtxYyZxOyhIKSNsc249ZE1xXzlyI2xEUVpCVGBLbkpaSHJDMm5TUW5ZVUBTQVBTVjotVzZMZldzTjQnLGZaQD5hQjFTODtzNEJUSyhPImwpRlJEdEtgMTxFP2VDbDJNVm1SbFs3Rj4nKydGdTc5JCEmb0YkP00nO1ooNmBZWnVgV2RbOXFnaUNeM0owKmROM2AwaiZoV1ZQTTUnZl8nSlktKDBDRCJKLW1vTnRNYiVkImciTWpDbzBPVjk2JFZQJShvWUEwaC5USHAlZl9vTF5HMk0sSVNwVT5ySzpMQCY7JVM6SGtHJVg7PVolP15ZPSZRMiFEWVJuVmVrUj1Ba2gxNy8oamM8J2RtTiRRNDw1VCM0J0tbWiQiYz9Obm0xSG5VTSVaXj0uOEFPT2EhbEwrdVYpc0RCVkg5bjM8SiomSVdIIkFhQzRFayQ+MlhsKFgtS0xTcjApaz02YUMpdSI8OCo7Vk1dcUFYLUA2Z2tuV20+QTRvPzoxYT1mU1VKQEkyMF1rZ287cFYjK3IsXl1daU9kYF1gKi5AcmxKXENZMyNhXWQoZ0cjO1wtJTlIQlcibXMkOW9vIkFVbjRiM2E3RGFuMG5FOClBRGVHJmhLNmtDTmZkKD1dPTJrNC1aMXNIbmVxdDQmPGw0ZF40IW90a2NNXFBOS0RkLlFhQClKI0VhdDwlMzxdW1BOWEZDailjLTJFTS1LTUsyNStlLHJtQFJPRVlIUkhdMyVTMnRiSkEzXitcQXQ6P1hII0VqbTlfMkN1SWVJTm1taiJwayY4XE02LWVhMzVnaWBKJT9XSWwxIWAoaVQ0NHUlXlEhTz1VT2JTLTJcWnNJZidlIVlCRjY8PWkoVTlrbkVkO2JTci43KidTTSI+JmI9Mkk4MD00Q0hrMVhEaVRWXyw+VyNeMlJUN1BpYHRGQVxUODAoalEyPSIiODtJRTQ5fj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzI0JzogY2xhc3MgUERGU3RyZWFtIA0KKzMyNCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyOTkyID4+DQorc3RyZWFtDQorR2IhI15DTko3QSZjSjtociExSTVMSDZGXiw1O2xAMnI/VC80aF0jMk5IQDdRV0IyL2lLSHJCIl8jVFEyczgrRmFMSWFXdD1kJTwxKidaXS9aLnNERHBGSWJGL0dNYFpwR2JQKFFQZ11pLUFeO2YyRmteKS90MmByNTBfcyFxZWosPUZoNmBbZ1ciZExmNiNSTSlOb0NVI0Y3X24lckwxPCIwOVphIk4rRG5hMWQ9QD1uTzAvVG0kc01WbWooWDVJIUhpbUtZVEcmIjxJOUdqcj9AcUhqM21xZFlCX2dbNE8wamJDMGNUc1xzPzRfXz9TblxCa0dBKWl1I1gqJ28ubCojU2JzIjZmTyM3YzhHNSdGVW9yNjE3ND1rTjs3S2JSNyoiaWVBQlM3SjxyZE0mQV5jYklqNFVvNzZEP1FkPTVxRDBuYFEkMmdcOTtSTjw4IyhhP0MhJGY1RTBNYCVaTlM8MilfRylBVSVMLG8xIiVFMC1vNiY6O0lzUiVfUWAuTzFQZS9GIjVIJ1IpRjYicCJMbyc/KkFrVjVQRnIqK1dVUkRLNl06cFpNLkA4K01FXUtbWFRYcFE9IWxKYFRGbDlAImpMTzxXYERWRWNQPV5UVzVxRmU7PmAiTGNxMEo+R0IjVD1JUTVwUUV1KFJrckNATT5PMmxESy5gXU46RiltcU5YLm5PaCxnQmtiLlRXPlo5ay1KJy9lOk9INjpBKGYwcE50ZClTKSduIyJLZGw0cWZKVTU6aStdSUY8aGdMJSgqdSVTSWhxUSF1MlZAXjhQIkxDJHQ0YE5Pc1ZDJT5yJFVUVl1gXl44KW1nNVRWMDs7YWJcNSJfPTcoZ0heJ2lEV2AjJSRfOU9qUz47dDxbKEcja0dLZUxAIUwwVUhqIUwscGU4QkIrYV4jSk5AaD1BUSJPVTFOU19jbCo3USxhOnM/SUA9PDhvS0EuY2ZRPUdXOENEXT11ODVIUWRUJVMrUzRjSUlGYl0sKU0xUF8uTCVETjlBLCFoPFdHJ2E6XzlRS1tvJXFILTtWQ0xhLTZlLS80TWItRlBYVSM6PT00cUImOl5SPkBgZF1JRDFrWzVidDNAOCs5NSgsbVovJUomLEpoJW5XLz5hXyNNM3JIX0pjPm1RV2RDJGVvZT1OJTNaZixGQzA0SDRFMDg/VDZcOjlDZW5hJmkwRVEmTkQoKkQtI2VZX1FTbTZjWnI7JF5vNSpNc1kzV0ZJNU05VFhibyxpWzsrUTtpP0s1KVolOFlpKEJcWU4yYS5LX21GTzInZUlYKyxCb1FmL0k4JT1gPWpwcT4kPD5EKFI8WjciOkNMRUNXMklzTiFmIlEtZmlwXWlmJ3A/KTRoNlFfIUVNMG83MnMhWztTJDc9Z0NnMlxTM3A/Tm5VUVNAcGI0Yy1xJTJuYlkkTmUtWWlYbnFjJmtbVWBVKmpvR2ZPMkpIRGlVUkByLzxARyEiZXFfXj1fdSo0XTo6QjRXbSlOREslQi9LIU1PdV9zLj1pIlNkIz5sKF9AZkpCQmZWO3MzTWNRLVslUiJcMFQjLHJydHBWQSFCaCYrWUZVImVqVC1FNlVOWk1RMC0+aW4wXmUtb28udEBtO0JCTC82QjsmJUtqdUxjXCdrNlphWiJfN3V1YTRCX1YuTzZsbCVgYDQtNkc+OUopKy4mPz4xYzA5MzMrMV9jYzMlKyhQJyJIUzxoc15bRlBmPjNTSyxUP29VKVBSOy03KD9PVSpmL1w0OWVqIT9uaHE8Yic8TyRpQ0xMZkdjJkxAcCgtLzZERU9LKDZYMz0lMmxMdGY3M1UnSyRXUSpYJmY8PyEtc2dsLDg/JTA2Y3R1OF9pUT5TX2NCMXRSSEg9cTpdaz9mOypVJy9GcS4sUHFVNkAhVDVeXFVBUCJIJ3QvWT5GJVVnSCMrPDNTNVM6cjM/cDw9N21xYDpFJm9cX3JtaVhwdXFlWiVKb1RJaWslJ2ZXWzIkcEN0a1JIKXVwUVBlbl8zbDxIVWs6UWFaITtPMFtkWmEnaEAqMHFlRjomSi9GRVBBQGQ1bCZuRj8wPWIqKihMWDNnYWpWWGkkJ01xYTdlTytGQEdAREI+dUZyWD5mRGNUMj5wbFhJK1UvQTI3PG9XaVwiYDIhOUdtVzNibGE/QExgXSJULTYkbHU3Lk1fQTAwZS4hTVBMWFhUImdrU0w4aDEsbnJ1Ol9nNjdVLWU/LFM9YyRpOXQsNzNfRmc/JG9WKEs/WUdqZ15BYztWJTRALDtNKkNVNlImSURISGFMNik4LjNObFVDW2FqRCxTaGBlaC9zYUoiWDsvJFRDPEBQSydiV2NhWyIzLWc1Yi1iTkpOM0VAbGxNaDBVaFJDZGJTU1RydUBZPV91NCo5VnJQLW9AOnUzbickT09UI0FwNG1MTVBOYkZWKEptTkNSVTtWQyNKT2FoYC1cMm9NWHIrXVRfLmNQKUxyT3EzKmguOXVKLktRLWoiOi1ydDkwMld1KDpUaHQ+JG1acGpVNyZhLCFJUjknTEZuWCkwI19NJFA2Olo5PWZUVEElSSoibkcxUlt1cWo/YSFGOT9lWChTXS4lYz8lJ1hHJTNsX1pmLE9qImRqb04iKjRNTFNDMk5fWSYxX1BYZml1Yk5KbE1uUXEmazdlaDNeVGlyVj9VVTIncmAvMVhXUFVtKzkyNUdnNkMzS3N1OlIxUF03O25mSC4iSVo2XmJiIjJCbVNAYEArYV09Km5tJFosSVMrSmMjQFlTZysxSjRUZFxiMyhLJGUsUEtQaSppZ0t0bnNacCZ0ZGFrZ3BMWTJ1Jl1kQCojTFllNyopXSducXRVaDlZb2BEci8qZnNmcCdlRWw4aSIvOCJGYFlebmZJKkRmPzIzYlwsQzMwaiJvU1dwXFZGcV0mWywmKWRNcXMtQG9YUTNYWjMjNlY5WVpMKCNoTW9CcCZab0otYFpSNlBeRmdHV3NeNWA+QiJPZGs8ZG8oLFpdMXNtVTdac1wsMjRYcW1MW3NdNHFELEYsJypeNFpSamMnYzRRUzo0cC5Ua11UY01kUWxdRkROMWNOUlZvUDFjbzdRXGVgXkEkS1tBPVMhPVkoRSolRjhRcFxyaVdIaE4jLG1ILlEtYVpeblw9LGFvbDJGQlQ6Yi9FRj43ODxrbyc7UUUhXmMwQE5IMjAxYSFMMWVjZSN0ZU9aMUNaVSNHaiswamhKVmVrPGlSKyFXIiU8S3JVcisvODM4aVxpPCNWSzVaLTksSTliU11IWl1jSiZhYF1mT206Ij0udU43LisrMmpUWz1lZipTV1RTQjI0WkMpcCVQXDZjbDNWUUhkS0EpaV5AO0EhQihgWjtIOlA1b048U0JdPHNPWHBsNmE4NipkWiFgN0cvN2VcNl5UQy1tTEpIXyNZTHQkYyIzTGY0NWUtTW1zVyYmVzEoaFtYTlxkYD1qb1ZMdEAxIUxyWnEjNHJoOmsrNDxbc2c+NyRhTkVORltaNlEwW0tEUHFfaG5WLyxnZUMzRThjX201LUZPWlxBZ3VtOW5aYDtUViMrJS5gK18rNWRbWz5IcytzR24tN1Anakg9JVM9Oy4oJ3EocDchMVleTjNpcGg9L1pvaUNKXFAwK1AlPzIoIklvbXI7Nm8iZTNeKEQwMCg6N084cz5KKEJkaFFUP1pmUEBtTCdHaldCSyldbC5WVDJYVUhfYmZYLU8pXzIyVD04KVRZMVg0OEo9Mm1BNi1zKlJrNzxJJVVVMy86JF1AYlwqNnBXbCg3QlE7NEVhdDkvJStPPTQlRCJkUTRQNG9eOkZkKl40RSM8blciRTZbUl1tUW1ZISw4Y09bK0Q7UytyLDVcLzNjakJcNj4kP15wa1xyKSooXW1UYGlCRVJwTic9W05YQ2NYdFlZYWtVbzxfNF0pcFckV2tpUjYsVjg3USYxMm0tTUBAPHA7OTtHVGJwSENPWGMmZj5NN0w6YVxddGpSZFFtaEhOM0VKaDt1c2h+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMjUnOiBjbGFzcyBQREZTdHJlYW0gDQorMzI1IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDMyNjYgPj4NCitzdHJlYW0NCitHYiFTbWxaOmdqJmNcR2pyIXNYakk7aUFIJmtQN1g5c05mTWc7Tl4sYjBAPFZsTz82SygsKCVgSHMiZXBvaioobiNfTU1FRU5jYyswaExeYUlUWXFoRnIpVkhfUVYsXTJdUk0tRDolMzE3QjIpIzQvQG4kJl9fVXRiS10/Uz9lQFMjK1dsYyxWQ0J0S25EcTxhVzM8KVVQaikiR1s0c19WSUtgVjBLclZxdFdBOXMlZERlYWFAMUc/YTwjTy8hTFs8V0I2QzZea0JfKz0+ci5RPGhNPmQ9NzU1WlouUlZKVTk2OFU1XlVEOzI/TT9eaVo/IkRWOF0jUiFYODRgWk8jJUpfNEE+VWhublxwLkhwVElyNzgtOyVtJEsmN1oxKj1oTU49T0NFWXFkNCpUNT0uXScyWik7SUFsQEg8NTcqIlp1QWFzWlY3YTk/Tm5NayU2SDxPX1Q3XywvYit0NDZcYWIuK2ExYSdHcUtHVEtCWmlhVVNtWjhFQGFISCFlb2tqK2xGIz8sL19EZEo6Om8vMGg9QShSS1FzWCleT1hAI3A1JWVyPGJAPiY3TTEyVk5BOzcwaUAtWFA2P1ZZRCRlKmc3KHVJUCYzYDleIyNXYWU5Nl1Ya2ktV2NjWEZqdWshb09UOWE8QjNEZ28iRmdVTSJDNSxYQyNPNGIrOj0sS2krIl91V2FVPi84XiFGK2VkUic9OSdvRz4rOChJJjpVVClKZ1hqIkpLYE9OJEhtIWNMVyZNZVs7MFUhRDAwczFPUjZWQWFDb283TlhpWENhYTxSN3FsZ2IuVnVMVjw5TUtOO0ZOQFEodTJwak9TUUk3R15ATjU7aGw5UDxGbiJVV050V2tfLXJPR05TRjdFR0dmVkJkYDE7YEs2SD86RjljIkdIKXJkZFE9bjA6aWg8WW4uNmZLOyYkKjxIQVxKI0c+V2FSTEJpOktPUEJkRE9qYzxtJ2RPLS5MXyVEaWBYUCRGPGQzdDwwQDFiJCFFNnFlU2Zeb1Q3KEwvMFNVdCJBajtrSkZgN01MRzVvQypLYl5zL0RrMyU5J1dJSDRlRm1oOUxtLV1bIXFfU2s6PGQqPGdIaGpMRDBuTTozdC0wWnUxVGc8WWFaczh0aUcqV00lYUUkVWBmTWk+ai9jRCUnXmg+bzRlMVRLczxlR18ucmQtIyYpVTdubGsyNTFScVgxY20jP3UhS0hzYSxaKV0pVys1aUAicnBRZmFrJihoQ2cjVGpQYkFbJU8xZEZhKlNrL1IjJzlNTnEhJCdDWWhRXj0qUzc3R1AqLVRGU2AwcWlrP0NYRSpOaUZSLllbOWU7ZWhKTylOXGxtIlZVQ0k3ZE84MT4mRGVEQG9BNHFscChEJUMiOk1kWighdVo3bGM/bm0hYFFYb1VGPnNpTGcwIlg7bjFEZnRdMy9RKzEzJDElI1NsQjBrJmJzWkpKODYtTklEUiwjUWNibD4uWWVgZmFqUTo1Um9cLjYyMj0lMkdTJyxPc15CW0lcPD47JDtVbzJCcSdSLTElU0xcZDAnV2dSRkxAKkBNdCcxYT4+Ojo7Jm8qJU9KSVFEQjdndSlxWk00JCE+JFhhQlQ+JjskblRKSSt0aUNPLUM3MVpgP2BtLl9DQVpWa0JhQUowOVA/UGMxPkhxZVReI15ILWVdLFAnZi4uK2NNVVMvJ1AhO05HUChuVlVDOUEhNytDYXI4Wm5YYFQqRj80cGUqX2JWXTlQSUljNE1AWFsoUyRbKUQhI0NTUF9ScVJcWlQlIT9GRiNtPTQqZls8ZGMsMDUtMmlsSUVSKiJHOFFNO0VGIjtZLlJpJEUjJFVMMyh1ZFlCOWk2WVBjZCY0LE5CcGFMR29WIU86azVhbUYxLzZGRUJpTi1IOUVMKHVHcWNiYz5gUF41QEt0b2dkZmdALzBXKiNaUzc1amlPcTBNUHAzVGZsKDdrRSI+cnEtWmVzMDplZkY0ZCo4XiMvXCRycTImKTZCVGo8JltYUWdlMV43cmxjIV4iOCduLU4oSElMXmVlKS9jVShXW00tPVY1RiFQPjZONyhPYkVGOG9Xbjk5N2FYPDVLNlVIXGQ/MCFjZCRgOmBaJGY2JWE3KDlwdV5YIm1ZLnE+aG4wKyxJUTUrYCpgXUU1ISdlYzdHdWoyQ1ktWCZVOmNEVzVHKV5WOFRgZzBbPmVzLDA3Ujs2RmZQXihvZGdEcyRcb1EwZ1RCYWctTmliLT1BUCYkQkNCNVFgQ09qOys5O2ExTFAxc1whakdBUSMqNjdvJF1cbkxKOE0iUFVGQD1dJDdZVEg9IklFYz9rMW9TQWFULyZGby1XdV4wZSddMnReIjRuUGwtQTdTSF9WUy9BSWtSP2REckxUIUY6TEBlIjVvK3JRQS1IYWNmYUwvYE1gJy5hSEY6XUJrT3QqWSVvXkxuc1ZbcUMhL1Yhckwia3UoMGFVUCJUIy5YOEBnOWtIOFReWHFuJj07OTBBXWxGbl9yRSUpPXMpVzFpOjI4RUdRJGNAJz5NSipqbWdUIkdhO04vMHU1P3UuT2M/SVkwQjMhJ0BQLmJyUFJZN2ZpRk0+ZClxZilgUk1sTStfJj40IjZVQUZoTEpUP1FCRC9wJGNWbUtcXD1NLSNKKipqXlNUSkA4W2QkcSs9JzgqcyVIMFJsKWBCYUdHJ0hGKygtJUBXWmM1MzZQMEc2JWJSRi8kMmA/XD1XK1gkK1YsUkRPNTZATmJ1bytEMjJyOGQsSjxdQDhfYWNyNnRKWkFNZSdOYCc5PShyIUhvXU8oS1hyZmRcQFFGK2FWJ1RcPT1USSwpQE8pP3NKaDBKblcmU1prdDlgaGU7cklQVXB1dCtEa1ZVR2hDUzlSJ0loailDY0UmaTJrZnBhU147V2NrJ0tZLD5tImBQKS9cckAzXjdOMUtQcGpkX2IuRiEoUSZSVGpTa0loUE8oRitNNVR0JVtBazo+THFWLkYkY25BZDVUUzI+W21JKEhUImRvJWY6O18sP2Y1ajM1dVcuSzowSmZcYCZEVFJgNjx0VWlzIyQrKW9VSUh0J3UqLGE/bmwyVERNSyFUVjsoPnNPO2ErV2tJSksnXCYqTWwuWVdkazM2dExqIjxuQFwjSUpTclwnO0dsKkVUKydKXjRhW0s3NyM8Q2IqSi1sP3IoWGhHM149YTZDOUNMcSZLRj1oUm10cycna0hAQF5pYmU+Xm9wOl9gZj84JXBqInQtPz9gWlkvIzhDQls/IktVSEpXNSYjXXFaTlIxRCJHak00XD11YygwTHBqJjRORCpkOzE6PUQ2bUxzJUdjIygyLFE7KFktJ24wK1tfXGVpMSE/YjxlQFlHYTtDMkxBals6cmNkIy8kMnA4OXEoS0YmVWMqNGc9LSdTVCZHZkx1ZHQqSyFBWnRJS2Q6SmczTGgrVk84aXMtOEJiXF9ZVVQ3bzUiQFdWSD8pL19tYTJGbzU6NmhPI2BgY0cjTiRUXHM4Z20makBoUjJNZlpVXE8zKzcuQzhZWUtsPChGbjVkWCxuJlVfYEsyIkBXV2JOWzFYc1sxWjIyUERzNW05MURhQjprZz07PDduSSVtNS5Taj86MG1TM1paYUo7JCkzV20iai1tKmVCdDRKYTVrJGlpZVZcTU9KP0w2V2pQRFU0YjlZM01zWlJlU0QoJl9ZK24yNytMTSJRQVE5TShWYnUkL2BPa1hNQHFaYjhRPXFpLSg6UFQpcHBAKk4xX1NtJHIpYVJoUVs6UDFldVwwNl4iQi8qUyIiYSFlKmApTHN1SklKWTRFQmxVW2MwWUVgZFlSVllBWj1Uaj5OS0pHQUVWU1xBRENTdTBocCk5KV5lYGBydE1BI0Y1LzRaS09uLUIuYyQhXXQ1J248PlI7cSw+JilUajY4J0lCITthWUNuIWV0QVNSJC85NWQmbGteJT10MyI3JDdDVGtiWk5BImpOKk5xM2ctR2tkTVE4amFbUytHN0VyZyVBaSlMcEgsZ2kxZGw6Y18lOCE7WkZBdGIhJCdJcGI4Iy1tSG5EUFFNZjIlRFJIKVgyL2U2aUBjYi5yZGpnZE1uWTZYYmM4W0YkWy4+RS5eXjw5ZzlCSmRvX1o9WFRzWCZZdCU3QjtVUyw3SnAlPF08Ji1nZmJuY2ouISQvOihXYl4vVyorUTksamRGTScyYmxhLloxX0lWPlYjUyw4NXVmQTUpLi9DKSk6QkldZiZAZWtrMkhFSClrV2FhQWYxMVpGI0tYJmlSYzZgWksxIWlqZ1gwZVRtZktUR3JjIld1W2c5dWh1J1pVZkRAUiJcRUlNcSM6P0BbXmJVVE9LYm4sK0RWdFozYjwocWFLYEFYKyg0Rkw3dUh+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMjYnOiBjbGFzcyBQREZTdHJlYW0gDQorMzI2IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI3NjQgPj4NCitzdHJlYW0NCitHYiE7Zj5CZWkzJlVyJWRxJSVPZ3FWXF5uX2kkLWpxVy06I2VwRVFsMmM6XipGa1siXE9HJyIxITJSJGZZTzttRSZQN2ZsWzw1YS88c11eT2pyO01FcGtIKWlgLEE8S0ZUWzAnMU8vbFQhbT8+TyFqJihNS1w4az8yZ2JBW11EZidVbl4ubmFnUipxPTlXZC0mSlE5JnAnQFg1USZaZj9SXmZhOzpiSjpRQ0VCWUdbL0JIX0MlYW1CbTdcblZiaGY5JDlqJltyMyMuJE8wJFwkVmpoaHI7YzJAVVNYNl5pcT8oR2ZhTFlNVGwsMSxVLGJKdTBDTCYuSW1bQ2RRUDprJF1xak40SyR1VGRNKUQpM0hdMlZTYChkP2JVcCVyZCRGYEo/TkY+NFc4I1o3bDUtYzFKYDohTExiU0dGOiVdYzpIPnFjOEZbOFIpYj0hTDRGU3FnJU8tXlcqcTFsQicmNG0vUWo/LWovMHFfSWBSSiYrNTc6VzArWDBkRTZoWStoUkVnPVk/YCxdSUYnLDc+JE87aE5PM04rMExPIz49OnRwOGkiQEROc1YzaHRyInA+aFVISkYsVjo0PWtrUmByXGM4LzdLNkovUEIuOmhZOERfKlcrdS8qQUc0bmRtQXROUEg2JSMnNXBCam4uaiMjJm11b0AjO01EZWszWU1JM3NPRipfV2srNnQlaCFsaD0wNV82YCI1cmtTZz1cSyhQJyoqYT9aSWgyUFNRVHQvTT5mRnMjN15wYWNVPVsrNVNEQGBSWW45KzFyJUw4Y0huRzQ9X21daWVcTTIkKFZqTVYlK0NHO2pAalk/MUpgLiEla2YlMS1GWmJuUCgjJnJbLCphUSdfOEBdVVw1VCosLiUiZk1fIyZvaEpeTltGb1s2UW1BXVZSIWE2Ml1tPHNjUVxeMDFmWip0LGMmWj5CazYqYTppYSEpOU5ISDY0Zz5ERWJgcS9jTDQzT2k8VjczQjgwS1ZWKEpRJlRGIkMvNVc6STx1PkZZVEtxU0xXS2MxImBTaz1NMy5MUlJzNlowJSo6PmU1RD9wYm4/RjwnPGdQNDZxKXNETmdXTDE7LFlwa3U5VkJOJ1BSOkxRSi9dOUVgU1Y2UGI1STBrUFQ1QE1QcVU9VzIrMFQrbG1kWmVSYkhqcHRUSVEuNidXPHR1NGZwP1ohYldmPnJuWU4wQU5qQDJDSnJkYzI+dWY3M0U7LSNbaVhvdHBjbU1QcUswQ0RHWmBeSEAuMERmaCpbZS1XVj8xN2NJXzxtMC4zVTNeYmVhXVpNcW0kVyorJjIpYyFsdVc0NWwqKHI0Qz0mVT0wPm0yOilPMWwyOV4lVDsnSy50LDRMUCh1Ll0qRHNELEwsLHBCYC41WVwwWidbZFNkTUknNzpCbHFmc0AxXDAmPSdXbVdzaWIuZ008XmohN1FaSlljbEZEa0hdYihUK29CQiUoUVlMbSY6SDZySHE8VChSRT1ZRHJhQiU2cCZLXlMoYk1vSk0zXnMiPko4XF89PF5wL1hGYltJZnBfMFchP18zUm1IZ15ZMzJGak1kY2M4QFI+QkhTMnJtWklXYE5scGJXYWppSCkmU0phPDsmIzg/KEtpL1osP0ZOMlJbQ1RYImFWSzxMRUJCVnVfSCJpTj5dTkEmLWZpZWFnOUEnWWxSbVVYJTgqPW9pazI8SEM1XV5YWUAkYk1nQDM4ZFhdZExLQzVnbG9cczcsWV0rc15hbCs4KEAlV0I+IV5MKTFyMm4sSEVXW11YdClXUzkpQ0JFMVlyTCtbUzNNXWY5KDREMF5dOig3dTQhJjwtSTdRXlFqTCM8SlorITskVmokOzhnI3NTXlZpbUNzaEBiNjpedElsLFkzKVUqJVZbN21WbTc2XmVAWk9RblRtOl42US8hL1k+M0ghXXFwNCooY2ZqQ2JoU0lJSDUqZF5UZ10+XFJDZ20pL1hdO11TI3BALVZFQlUzKGZuSltcKShhWV1DZ2o7Ilw8XVFuXjY0LDR1bkA3MyFTLzcjcTpHKy4jQEReNFZ0aCcyVm1lT0JdRiZKbV5dLiUodGtiMkA8VDxbals5LGZGWGZuU0xmLHBOLHJpMUE1PTRBaURbKCpELDIpTC5TU1hfQ1FvUnNuKipFbDNAaW5qL1ZBOzFfOztCXEcqYG9LWUYuQmpjIUwyQmNETixOWGFaWURzNlJpZ2dNMm89QFBtK2lMTjAqck0jQWBuNjZNOShCb1B1W14wbkthXSY5JkVJUWNCbSxWQTckKVxlY0RvPTJVMV8+cD1ySz5YUSkxOjpbMD9GaidAUS50VjdLYWU+MjpOYidBXVJbYSl1Pl9IR0c7Z19MbjxoTy9zUmlqV01ITktJL2wmaGIkYkRFb2VCMCkxcyQ3RyNyJk9QPjAwXFomR0olNiM9LCkzWzVDQDgnJCstNjtmZEZMYEYyR1xHJyUvOls9IWJWUDlyJjdkYE8iV28iZi5wJFAzTmFDTiZYVWpFX24tRi9gPEJdcig5YE9nSFwyJnVwJlM7VCVtPENjVy9DISUhbWRZKlhxKmd1T1ErMkJnUTM4a0o7VEVoKTAhaTkrXVNoPyJlUkRzVVk6Z1U+W21EM2VaRkEwOEMuWCJZUmsibTolKihgY0BPOGlHOicoVG9EOz4yKVlYbChJWmxqNE82cCdvbE1Tb2orYFlyTWVra0csPS1SMF9iTGliak0/UFYzVChEZCwiXkpYRWx1NiI1VVY5UjdIWEhxJkdwOD5bRFFUb1hLS0csYiRZdEZmInUyPU9BKDI4JTFIdVpDKj8oWkhFLV07LU5KO3JIXzplZjVERm9VUGpTUj5uMlFpTG5gN2lVRyQ9LUFRWTBNWURGNDxaKjRLLUI6a21raVIqXls0VTdgRzMzNjtwM2FtNVZfYy01MTUxPW5EXCkocENLXUsuQjAsbiUobG9icDJRS0FDOCxWZDk6UEMqVTluKHI1Zy5yYi4kY2A7IWoyIk9jLnBsYHAwRkduVlUoLEhiTkY/SGxjLFUxVW9Obm5gNzUtbGFxWlJeSDU3UzxMdFNgJidXKGA8ZC4vSSYsNFdRVCpKPVtSUFRIOVI8Mk5kbl8zMFAnJ3IsU0xAND5bZSZKaFY/JllAK2VrXkQubGpoT1BTblk/JkdzW1MhOlk6LmlXJm47OVwzJCUqI19tVGpaM3FqdXJSQFNpVUphTFouTFFGWTh1NyYlNHFdKSllRSVBbygsVHBZXWY7U0NOOz1EQjRrRSM0OGFITF1LYlgsOGchW2BEcmJWKjZzI2xCUV9TJHVuQ2RTQDwyUSUmcUJWajRRKnVeSkFNa1FLWVBrVmJxJUVmZ20/T0JWdVhzIXUobSZSVlZVbiNTJmVgWW1DLyFQQmEuJWpAWyJcZGUzODROJ2I2MDwncChROnNLOXFRPiVTbCtoPWUnLVU8JGcmdHJsYVBCODFAQTxLIzBVKFQxV0EtXWMiPC82PlQkXm09Si85Lm89QGZAR0ZAL04+WyJSKWhMMWZRaEhoOVhSO1F1a29dTWdzT246P0NmbWAsN01CLVAscWNCVE9HbkMnOzRkJ2s+aWQmaFY5TSxcZWRbMWRlbkUqUG5YXVxMTDZCIitzOCZfcVEkU15VU11sSDNISUtnJD81J2ArSFpYJmxoNUdPOGJEREkhVT8/bDsqXkU0bkhAZn4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMyNyc6IGNsYXNzIFBERlN0cmVhbSANCiszMjcgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjU5MSA+Pg0KK3N0cmVhbQ0KK0diITtmPkJBT1coNE9TJ3Jray88WE8+Z11XNFI4R0hxV2JVWi5obHJmSCY6Wys7MGhLUENOXmJFbitPU0VyX0F0MCFRZlAzdG1UOltSOl9DXFVFQUc6YSVbYy1aamo1J108RidEcjY2W1tVOnFDWVMyK2RGOjZdcWY8N0JNaF87Z1lnT1dCVWtdXyRrZ0BaIlBfcj1rSERtbVBhKFM0c0pfSGs+SF8+cGU0SzBjW0tVR1JJWUJAKlhWVE0qPGBoMmUtb1VdMU5mVDQlO2RQTWdaWnFtZ3RBcWtjV2xyYE9aKyVYRDM+XidXVXI0amhSYlNCRyJiJlZEZFEsay9RIlFVWm9JJWVHQSxNOjFWcGAtYF5QJU8uR2s0UVkiM0Q7YD1QaTxXUEtXJGdMU1JfXUc+UTU4VyxpbDtaZ1Q1YCVkYCxUOG42UVRDKCxkYDIpY2ppQ0gkSD0oOEpubHN0UXFKOExfOVJebzpaa0YrQVJXbWhTJ01gWzBqOD5vKHNQJE5GKDcoP0JkcEtaailVbk1OPDdENXFMZzVBWW1nIzVCXWthWT1JLlY+SHMpTkJIZHAjPGRfajpTLFpvWUZNMW5McVBULGU6LzwvY1U6Ol4/LVI2YisqR1Q9YT9sWk9zMFRKWilVKE5jcFYsI2wlJU0sbCdhS29DX1VkVyV0I15sNkI1SDY0U01bN1hJaSdSUSQ0OmRgYFktSDpYXC5Lc290OVE6Ilc9ZVoibSxgPk5eRUchPjs7SFpPWS5QKlVjJXVaLU1qMkBMSSM2KlMlVk5nJzkjPyI0VD4hLVE6Y3RaPzRKYFxDVWJQZ1U3KWtOLz1hNHJqdW9MNFk3KDIyV0slRW06dUxiaSFDbiJRP105L2Q6cjRHMFVCNV10Ql9hKjJTUFtUaEpkbklhTGMkTSFPXDwmNyRrUi8ta0I0MkVpWHIwZStkMF4rM0o6ayYoQmd1bSg5MHQvXSIncmM7WFVecFU/QEFdaktgbl9nNjtkZyJBbGpLcHQqJjFxXl9dRkdfIVhdN3FyLFFuI0lzNGYlclVQPlhyVmxlV3MjT085b1ktJk1eJyRoXS9PNkozSjcpXURpKCZsX11gV01pKDhkZnFUZ15FVzk9MDhgPXRqMiQ0Z0hMQDJiQihvODxmWDFuRmZNPlNoX2JvRnE/K3AvKjZVLzktci5Ab0wnXV1EKjBRPiYvdCorTG09X2FaaWQqaWkjQjpsUGo5UXM0KHVBV1dVOXVITmQwQlUyNHBAP1U4QkRdRlI3ZU5FdVpaXj1VS1VkJE8tcCRkdTk1LCx0T1pMR1xfJ2YlVCdGXnJrRlhoLWVPPGRxUDtPS15VZkErUEojXVtnLDMwQjQsJUMvUjc7SnMoNnNOcW87LjxWZjlXKnRFYE0/a2AuPTtjI1ljYiosS3BIbW1rcmcyYGNWLXMwUT5GUTdTVHQyYy9oOSosbWJFYjN1XjM+OkM2UD4lb2s4SGZCOjRYJC9yaEcwXG8wX01oT1FObDUjI0JKT3UvODNsYClVM2UxQSkoQkVDYVxDb2gjK1BBSGg3VHRga11McGxAYDhUN00mP0AzKFdCSnNONDFbNC0kW1NwZjRXT2FPRFBvRTFDY09AaCM1dG1CcE0pPnVvWk4nN0lDcFZiUixtWzNcLTdaWmhlcUAtMmwwJ2BXWl4lTEQqJjBbaGxhVj87Nz9AUDwmKksmcy1PPT0tPW9ybz0iSUwxN3UzOEhXQGpwbiJzX0sxbS1bO1wwMT4wS2Q6SyJPSHBiXjNPIl8vRmYhbWQ6cVh0cDQ3ZW9ba0c1MHIuOzgwPnBTOVVVVWJGaUguUlVITDxmaD5tcl9hOyFjJDUyMmg5UDRZSFk/OWAmL2pqb2AxNDYhYCxxNFAnQCMsYV9QWGRPL088Qmw7QWJzPE09JUdeWiIuPnVxYXIxcFFZR2NPZCxoJ3JFNFFuN1ghdFVDX01dOzlXVkQoRUNqNSY3aC1jSXNAXDZKbik/K1kmQiIsI0NBXiY3OVhsMWxFZjVHLXBmX25jN19vQGxsRTI2YFU+VE5tdVozJU4oYUsmXDRlQjtpQmRKUStYa09dakskTG9bZ0o9O18kYnM3LGV0WzlMMiIkWHBmdFE4W3IkOSRMLTohInIvOiNFVztccmdwR2o7OUdBRTUkLUlMTG5oTyxmKlJGZypqWWdLWFxIRGxmVmN0VFY0N15fI0BVJ24xSygnNnMsLnNVKmw+WVtQdEEnak0iYUFCKk9sQElgOkhEND1MSEYkJThbPiszQ1FvMSNuZC8zPXVhWCk1TSlpOVhAczVBXj1wWl1aMzFac2sqTl1MTEd1N2ROOG0zKTcmR0VUQDFxRWVUWSFTViluUCgrRXRGc1lILz1OXlBPViItIkEhUGhjQixYZmtYTEgnPGQzbnRCUk4wNFYmN1UpUU5PRlwxTUhiSicsbDpjTHA9cyJLaEpESm9oX2YwbFlcM1kldUMyUWNJT1AoMTYiOXVkdEhqOWk1bFVXbHUjYyM+LDZKVmshMycsJEQpRTk/bTFuYV5XI1wyQ1NqZEVPYms9bk9SPChkYypmVSdXZWdNU0JGZT9yRWpXIWptQjolZUcjWkhiWHNvOkM8RGU9RDB1bGdqP3JvamlhYTpMOFAkcixEXSUmcyJuJVU1O2s2VzFJQXJNamJYMVtmXkl1YGZOOmlgOVIkWScoQD9tOSR0Ll8vdTNjNEVlJ0I4QTJya2s5ZVZjRyRPXmw7ZWMpN0Y9cWxDZiljLSZVbTFDX15kWTdJOCltOy5JcSVdPzJgM0YyPFojM0k6RGMnTzlANHAvQCVuJXFwaypuTy1aZUJnRCYxNSkucT42QlxyK3UvVSlSUjtQWWpIV3NnWTJxUGgzc1NeLFg2QVFZMiJrNG5VLGBgRShwaUprTik8QjMoV2ojXDBuKllSZ0pzLVI2bzJfK2hscjlvTVtibWJDLExNMmEqbFdCakA+L3ByTCsibnA1Nz4rJlYrMVhSI3E9JjRoJkY0W0Rycik2V0UiVyhwcTE3WywldWtvZURWajlmb2FvITVIJio0M0s0RHA5WlUvSFYiS2ZSOGQrX2Q9SUVzN01JWGdcVmNjYHJVJG10Ui9USEFiXkdCL0wyXSY+QFdfXj9uMVJhI0olUDswKU9mJT9RODBkRGU/TFBVXiMpSVRMIW0jdT5ZKSUrUHJUby5SZk9EKUdsa0QyLW1RdDk1XztIKyZVX1JEP1xJWHRNZ2krJlVDQEFRMF1JLFNcdVghXywsTlMoOC5mX1ZoJUchTC1IVio7SFhJLyRIPm1bTicpN1pVZzxKTCt0JE4tS1tQS0BFRzU3QjlGWTdJL0U1KDw+aioxcSIjUmk3W2lJSz4pKixxKFReN2I9V1Ywb2s2PzdgWSxFRT5fPk5AWCUzMGJCUERuU15TTGFXXGFNUkIyZE0waVlQblItRmxgO34+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMyOCc6IGNsYXNzIFBERlN0cmVhbSANCiszMjggMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjgxMiA+Pg0KK3N0cmVhbQ0KK0diIi8oRDArSUEmY1NBaXIuazZ0UjQ5M1woPmhOamwjYXEqU1ZxaTxnbCVFUEFFblZvLXFIWmxPVT1CSG5icj1QIVsncVpaOydTUl0xXSYzYSxyVWc9P1FLSS5pZGQzTy8pX0UkXDZcPCo1LUAtRUZDWy1hKElTcDAmXzNNcjdNbmJsZSdlaysnYi5kIVJCQDpHTW87ck5qNWhPM0duaV9rS2UrdGw0Jk8tPU5DXkYhKElAbigmK0EsNlBlJVc0b0xTaFRKTGZuVV04LW4wM1d0Im9eQS47X2JYIVg2SDxTUSJra09Jcl09X1BkbUM5XzRJN1EhOyooQzhNXjxmbWI/M285KztJOmMqbGZJbWFeaUVMOXEiQDNhM2RTIlBwVGR1M04uNCxgIk5zcSoqYGlCTVtALDdGLXFjS04hLjVAMSk6N1tqPEBPPDFCQVREaGdZXW1CNScsWkRhPlhHPiVFIk1aVmkzOV5yYDtSV2AoSj03RFRlMDxEXitcOzM0UTs0YyYyWmotXlNnNTpQPFNPJkouSVh1JHNiJmY0VjxlaTQ9aTVSWjxya1JUZjw0ajQ3Z29gRGxtKHUwaFphMjZsYEAsR1VMZCI6X1BSXSstbTBxWjsuQExUSStFamNlNSUyYGZvKkVVSiZwSExjaVFAUy9sPWwwN3BhNHFfbVwsXDAtXGFkcFovO0UsMz5lPyY/XjRXSnBUXFU+WURNXVlgOjclQ2gkMGxIPk4rSE9iUy1eSDNSVjVFVmBMTytXZGEpWjdfZlBJaS8hb1ldbG4iRDhbTUlvTDExdUYrN2sqJF9bOyxGRzZucWFNcmhVXFJNK08kLTY2UWRfVHQycVYqWjZeNCU5KE10K1omK2ojKlFKWWpuYFBSRFhsOUZnN1RySSRDLWcrUFhMSDZuMGdxLE5ZPFhbUE1aZSdFWm5xYWBPQi4ySDxyLkNkPWhiWEJVL1c+JyNxR3NSYCVLMmBKR0luTT4pW18/JCdSRixkbUUpK0E0T01fO01EJ1JNUEBtJiZUIU4vckMkWSI8OklAJ1RzTEw1OStORlFSanI3QDRoKV0oOV1MWW8nZS0iayVmJkpoK0QuTjY6Mlo8byFiQnBiTVpzTVFeZ2w/JStdWV9gKDImODwwWU0wK0JLOFRsVE9VSWs8RVNBcEpIQCprQkhBTVNMaVJEMlFrX1FSJTRKMUIrSShCQEFkRm1IIztRbEJMPTVZP0FcbD9nL09MZDghWVUrP1RkSjMoYCtyaVRaL1slSjt0XSkucCNZdVBtb04vJ2JSP0dKX009R1A7SiVEInNidCpNRitoQm9lImFGMSw2Z281XzFPKEJUQipTXF43NHVbNWkqQjxPWU5PNzxgQUVlImo/SiRJaHNBRVttZ25VVzgpLDpsIzxjMHAiczdwT0w4JChXJl5pcXEoT3BrYjdtJlFrOSNlalZqTixWIlJGNHBISWZyMys4YTMsSSY8T2ZnRkZqZ1tNSCU4Y0FJKD9hUzs8VGlXOlZLaGZQKlJEQUVdO2xcMEJGLi9xYFNXOWMhQ1leSzAlN0AyRUE2ZTdPKGZBXmxRRXIxUWo1I0dUOSchcFpCb3RlLylxVzFKM0Mrc2MsLDZlaXElXWdbODVzbnVdOk44S29dL3BzPW04LXFOJ1FWb3JhTHErIiVDPlsvUlZvJDRDK2BET0I5QyRYYnBmS1M/QSEkRzxIIUtqLFE0XVpeJWIxTyxKMF1hZ0E9W0VgLjZrbToxYCdCXk1qKTEzK0ksVysuOVJYNkBFXiUhMmQhSElJZ25jZ2JsTmo7I0E4JiEwdD0kX0E9L1ZSK2kmSSRPW1RqLVVubFg5VVxUOTo2SyQ/YnFNISdvMmQxZSVyRDpHXUVdTWsvQWtJRydYJl9qUlYpVFxbanNkXlYiZ21WbzViYConIW45RUh1YSEhZidOKVQrWFc8N3UjX1ZTS0I7OEZ0bU0rXV5cWltNIS9vO21zZC9LczJbXHJZIzozVCFldSlbLkNQWiMxb2JeWyRjNSgpPDI2Nzg2PEAxQSJPIkwwQUssPzNgVCc6TGU/MTxzLFhKREcqPlxFOjpkVT1IJz9QKFpGXihoUz4maGI9YjIvYXRTdD9HO2dZMmpGQWwhZTVWO1xuPyJcbClRUUQyIiwwIkc6dDRhX1ZUaVVSQ0NOQThdLDAzbyFpLkZWT3E8R01QJUdbam01OGImcF5DPDthXDRJSHB0XFIjMFkvczsmPzNBQkonZEZGdDBhdCc3Ji0pWWQ8J2RRT0wwZlc2JFJFVj47SygvRG4zM0RZbyEoclVMS18za2hbYDxLbmpRRi5qZTleTVtgOlcnVStALFtKa185IkdXam5yLWk8QlEqWzJZVkloXzZWZnBVSlBkWVZ0InQ1VEo7NSlWIm1GJ2EmLzomX29FdTEuYkJfUCFaXS4kNT9QLlIvKkQkRk5PPlRhNUhfZmByS2EqWitRdWRLWWBwSWpGVTssXS1UbHRUO29QIS4+P1xsSGRrKCwpXmtadV5sMi1pMW01R2hWUTREVVI0MG82ajBjJzRdWU46Pi9iUWk3cTorKlVcLSJYXm5OUU9INk8nKCJTR20rZ0Y1YkxGQ1RZJksmVjtObmRjaVRjYio7YHVCKURaXTQyJU1bZ0VaK1twOFpXVjI6REdiMi9tXj9rKis9WSQuLVcxXk0rUUgubGUzQHE9bzBUcTxVQ3RTXGtKT19vR3E/XkY/czM9YGxQNVliJGM3NThDc2lPXSJPOi10RCdcIVZGWilHTWpScUVIVlFoaydJLi5jXTBTNFNxbTw6NSN1L2ZMVkYhRG8kZTJaIWYjL2sycUJgaFsmcnNxLTUxKSNuT0w2OCdmMVs7ZylWOjZtKEs5TiZmL101WFsvIUU1b2s1RipHc285NC4hLTtgPEAlKj9jRCptb1stdEJqdDxhWiplR2tnR2FJUjA+aSIlK0tBJ2VDTFVKbD8wMXM2ak0xVF8uVGg/MzVjSC5sNi1rLXE8L1hUKypxJFEwRjdeUjhrKT40OHJtTEpLZDNpO1VtUGFibU1aK3BvRjRsOHFcLjN0YklSdWlXR05sLzZGbCFDOj1UWEtQcHFhTFhgKlg/Z2Qlbl0mW1RWYFFEbD5BanJfKkBeUCYjMmZORjhNY1dwYS9tOUc/XTgqLT1ZLFVmVWZdaVdZQSNVUFVeR1xGK0hYaEBYT0JNXi9ecDNvRXUlLzhUKjZgV28zRTxoQSduQCNBZyInKXRfOVkjLGU/KUlwZko4NXNPdFFvWkdxRVg7RjxeT2pWXT5sY0JJcFQvMlQ4XSRmIiktQD1SVDxyKkdwRW5NSGA+Yi04cmw9VFRaYFYsVCNFWTZQME4jXTAuODxGSjVcRHJFXyFdIyIpRzVeb0shY2owOWFSbzM+OUs3Nz1NLlZcKjl0SisxNkVbXV85Jj0tRjtWaileRmgsXkMwOitlckwxcE8rbjRyYC9TPjEnPUtQISJTXHUsbnQmdUlnR3FOJUtmcV8zRic9Il1wZTVtPTohZUZzXWhobiNUOUJRTy0tJCsuX3JoMGdMQ0k8Zy9NSzYjPEViNU8tXXFiSjJzbWlkLk5PdUpzKT5cSiJuRm5NZlxeJFUoNVJdOjpYbD8oNGYxP09fTSY2QG9JW0dtYGxtPD5OSVRtYSVGJCo1Rmc/Ui9ObW9nZDArcyonQz5qNShoX2gjR3VeSGZIKD1zJXFPM24lTTJraUpHbj1xNlUpJlVQZz0tfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzI5JzogY2xhc3MgUERGU3RyZWFtIA0KKzMyOSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzcxID4+DQorc3RyZWFtDQorR2IhU21EL1wvZycpbDQxcydhOC1RUFBUcnEnQzMtJXUzZzRtOzxHX2dQdHE7TFdiKz0tLylyXU0oMHI3cCY0YDhMNk8hcFtNLEs9J1xhZnRAVCtJMlM5YTdiKFBeR1s6WyVkSS5GRj1zNGFuR00zMiJyVl9HTiJdZmg7MFVHNXBEKHBEWy86TyUyI0QiSHRTJm0jNl5BKUsqVEk4VWhRZWBjUVkvKmBmRSMjUXAjW0snQ3NVQW5nb1FIZ24yJUAqSUMhaDJiXmVhblw7bV1xYTcqLWMqIlNwVlpeQllGYy5Za21yJEBEQSljI15cclFbPzpLUzMxYC1cQnBgSCNlVmA3WEpfcjRgUGlLKlk2NkMxMVkobHM8cyNrKkVbXVxqUzNxbmxncSUiKCtKVjMha01xbl1McDJEM3VrJ2hXKl84TiZfaGpdWSo5PDE1MGlRISM6Kk9lbC1vP2Q/YFlIKjBrLWBDZVEzWldBZyNPOGgoYjklUyokJFozZ1tkYCdyV29IMHU5MCpFcy5TJF1hYE9nSTdZTFwzSTxvbV88NlpDITdvSDFVcFZCODtpMlJkL3MmKDxfYW9JZU1qUj50MUlTJnMrJlhyLVouP3JRL2hcODhLT1knJVVvVTt0L0lPVTJyTFZmYEk8QyczZ3BrPUBsMCZAIkp1WUZpbVY4T3BYbmtaLj1YSmRJXlYyUTlvbSZVZldsQ2EnOylmTi1VLGZOLSRPQE9IQ1ZXQU1Bci9cXiI6XVEhbyY7KCskRS9fQTwkMz9JMitWKW0vLFgici1NbXBoVlxrX09FOCIjNiIpVUNjXkI+OzpsQytrN1xCJFpbYkApRSY/NCFXZjxmXzBGalVxVCNkMSEvI1hTYVZgNSw+MWZvTWAyVmZbNlVDOTZVXl8tVTdvWSg5cCJmJzY/NjtaIl1ZVEBjT1pbOkV0KzpMQCxiUkI7cT0sNC8hJy5LWGpzKDxhYiMpWitiYlpwXjcrcC8+NyphLTApSEJeXTFDWyJcLFFzO2VNWydVIiZLJTVFJz5IbGVhPE8kUVBqW0xrdUA4LSUhaiolMVFbdFRxZ2gnL1JfUydHU2dsNV1xYWtdXTtIOWNnWShRMnQ4SC1uU2ksKCtOZVskWzlnbkQrdSlOVHQ8bjZFSCQoVyNeOHM+RipZcS9rQTY1YGNEKG5GWS84PCEkLSNra0pVbTo3T15jOl1ZTVtQUD4pQCZFU0lyOmErVCxDTEhQXC9QXGU2bFVKMDxMS1NRLk8yJXJfJ2ssSDFRbV0iMUlNPy85JGVEXiRWcU9LPmxZL1MpNUYnJDVIOF4zbFprPlNxaTsnNElEJG5ZIl5SOUA9U0s/Q2ZeXWMzSmwrOSNMUSFrVFlWSiFNTVsnTyZRIV1VWHB1XVZCS0pRNylARWttTyI+cSo7UCMka1dPW1E+YWVWcE5dPFotVUFda2JkO0BgaShqbDokRy9JISprKHExXCk0MjJlMnEqSUpPLShxIWM8XFZEcG5hTkg3NUtkZTAyJSFNaVRmTGdsazJ1dEAqIkwyYkRcRm49c008bj5dcyo6RUxxdHFUaFMvUzt0QyciaSFzUHJCTzJITCNVRVlAUDk7ajxHU01IP2NHPzA6VWZ0QmohOjJxPSs/PSc8YSM3WEA4LzMnLCU3MSt1aDFeTms0c1U6Jz5kSDRxP2ZsUidtOlVvPjNiZXUlLz9ROG9FcjkrJ05oUEM9OmwxUldKKEk8SltPa2RnLFhmczlpLldVQzEnMDc2JjxUOD9kc0NVaz8lV0d1Nz0sTy5TY0ZjSVVZb3BgNUEqMVlHcURxSDpyKTZUOThMailmMC4wJVUrN2c2Tk8tdSdVOT9gRitSWFNPaUFpXU4mbjBgSGdKYCcvWkEoTF5lNzYkYykpQEJOYF9IPTg5Wz4wLWRZS2FBVWM4Q19QWlMyZDxNVDEvMW1Obm5mcjAka0dUdV1ASlsrI3AjR0tkKD09VzE2VyNPVD5LblZPVDo2REctW2R1TC84RzNRNk9GOjM6WydodSxJNW90RUssS1pHaF4mNjpLOGtJUWgyX2xCcl5KK1FUQ2gvTE5dSUdhayhRJWU4U3NtT2pkYzs2L05vJVdtNk8wQGx1a1ZbbkdNJCcuOUpBI3I2dCd1UiNKV05YVVpsQ0FwTjhUVUwnM1M4SyRFWjFgVk5uQ1UmOlxqailpQVI+WTdNLTZHMjxFZk83Z0NxKDpXL1FAUD0hVTM9ZVA8QENrLF9FL0FmZj9pZ2U0WEFYZFA0ZnU1I2NUdCxlLVIlXEIxXl8nMnNsYTs+RlVnSFAmXDM0X0xJIScmMmg3ZTwlOyZoaz8wOz8/LE4oW1cwRnVWLi1gPVsyai50WWQmUXNtbjFvM3B0K1pKPlM2ZFQtTCopU1BJYWZxNUhkZiIuRmRUP0QvKWMvJDhUbkclTyVbXGZgcFdXbidcW2dkUW5KY0xOT3BBYkk1cUhCSzpcKEFKUUppZ3I9W0RKK0VTTT8ocHAnQWBLb3FlV3QiNWYuIVRrQG9tVnVRQXRVMU5WZCh0QllMLEVhJk1rYmI+ZCVNMl81PjhccEArO1s4Z2NZYjZbMlhLPXJtJys4Z1BgQGVnIXFdNlRHdSVsUGhdNidXSSxAXlpaZko2cCVTXDJwXjZJXVo9bD5CU2ptVkcoO3RadGNWXDtmLDJlPlJBY0EhZGp0UmssaC1ETSN0KiovZCpxbFNFXk5vZyokTW4mLSo+MjNQbD5LJ0pdLF1SUjQ4R1w7Ly48XXVJTmJtPTgyWi9WM2w0NlJuVl8rbzoqWGlzcVsjSz1jNXVwL1Q0YClqUmtZQm8+ayw+Zz9LQ09rUkJlcEU8NzZXaXJIaSdUMkxRbycwN0ZBNTgxJj9dJVBVY1k7Mm00J0g3VjopQ0FIRFpnXXJrRzUmSFJvP1xqZiNwR2NPJ0tHJFYyQlZgWzdpZkpfbmpbZSo/XG9cWW0taiddKEJxMyU5ckxFXTFHcyNbUG1hSl09TCIkZGYtJ0hkWFpLb2xrSzNdJWM1b1YnL0E3bTEkUSFKRTV1ZnRvJ08vbm4oJC9MTkReO0ZgWVMwV0xpdEMlWkdwbGNLJ3QwJTIpaUNmTD4kIj0zSzldP1wsSW4uJTpXMDwjLTFkJiQ/azsiTk4ub0pAPTsjST0jWS9PPTcnXzBaNi9tSG9rRnJGJ0A4WE04XW1wJ0B1L1FIRy1VUTJELG8kZEhKc1NwLWEkIiQkaydxR1FeYzAmZ3RmZnE3Y0RySGtTSyM1JWBJRXQxTW8pW0BHR2haO2VOQ1I7IXJIalducUQmKmhhYlhPVz1gWD9eLUNXZDcnSGwqY111TkU/O1IrVjdoJU9YSlVuLXMnQGtUbTwoK2A/SywtazxFK1dZZjAySTVsVSZrWFo9N0w7Ii84dU48XmtYaU11bGViUi1ZYUVlaTBdQjA3ImxmS1YsZDYhUixEKzREMylCKDcwOnBAZTJaTGwqLFs6UTI1UkhqYEsjYGBlYm9eM2tXIkI3YyxNOG5ZLFs5RytYZTsiWihXSG0jTGYqSWU4Vi0vKTxcPUNjVCwwOGY6OihFbC4mcVAjWWImbiZSdDtJNiRLPUYtViMsWEdlY3UvJ2daOFpdYTNcW2skXD1NTjY5IT5AXU0mbTd1ZE9vbFZWX3JEVCxZJ0ZER2NkN1J1VW89Wyc8Xlw3dSRTNSM6fj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzMwJzogY2xhc3MgUERGU3RyZWFtIA0KKzMzMCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzg1ID4+DQorc3RyZWFtDQorR2IhO2VnTVliOiZxKDpQSWprKSdTOyJsci5JJmhfakQ7K1ghS3MiM1EoOHFTcFJ0MGVVZ0I3JFZScFBGSW02clg0IlZuRycqTUZpODBrSm9lUSZNQlNTR2JqXyZxOy4pXllRZ2ZDOE5hXSY3bj1oTE9vUjUtM1laZ1wmYCtUQnJhYyVcTlJUSC1UbFJGI3FXUShxXDxTQi8sZ2NoQDAqMj9mN3NXI2hRbiokWU1KbF8pYSRbaVo+Sm1fTzhmWydEblE1RTokRCxfPjhZY3JnUGUoPThWbG9xWEE6WFU0cWJAMmxWJnRnUSshcFV1OywrYTdYSDtoIW8jTXInKDQzMjBHQVYxIy1wXjBjPjpmMnVHc3AqKDV0LzRRMzhKN2BcUUhMUUFvW2QhOnBLQVxkWGxEIjlRPzJfOUNocFtJbT1MVWdoWmJpLyFkYy5pOVJdbjUwTUdVT2RIM29jcGRMc1c6LC88LVokcnRgYzwvOz1aZGdrY15NbnE8aS9LR3Npcy9oSD85UENET3Fqc29HPCJSYEA/PS4ma2xrRFswZmNDUVtwQjtpInBKKmNyTzNjViQoaTZdLms0NCdcXCo1QC5dZGkscDwsQERFJipmMnVzSzJgRSpyQV9ZK19BbkZFS0pNQT5ENkEtRjdPKksnWXNlVjQ/ajopY1ppUENNaUFKW2NZKjtKIlRKN0ciPl4+VidBUWA4LWAuPywhZ1BQPSNbTC8jVE8lLUJva05OL1lIRzZlcDJRZ2dPRkRVb0JgMGs0bUYvJ0MmXiVuR1YhblpEPSRbKydJZ2hLNltbN09eKlM9L1w6Y19tYy45UDQ5T1xVOHVBR04oL1NNWlA1SExHST88YDJjL1A3YHM0YDNxLSFmIm4sQCxlVjwjYHJ1bVI3Y1BEPFJoKWE+I0dOUixfQjdSWzJxb1dwNyE9MyRXKlNkSFFPczVLL0FuRThmIVs4KjY0UTc5ZDlLN2BhYSJrUS1oPkhoPShFb1M2bUAtJic2R0FaUyppSiFGaVlbKmpMKnIoSDkxN20pUERDTy9lTDg8JVYqX0lzKCwtR0dEMzAuNE1XIU8sXz9kYkpRdG1yRD5FRkY2Om1qM2NiayI9ZSk6REllIUMjNksjTEA1SmdUWSRpRyllQWVwWEstRSlxVFl1N0M7L0clbFhubzRXR107aVxSMkBgUSkxRFgxSi1ZU09yXkAvTzFbIV5lWT5jPFFuXS87bnIuYlRDc2hZWGhZZUQlPklPWTZSa1xgUjNHXEkqJjtFVCZFM2RwITF1XyloJUNwdWRvXkYyR1IuZzlfUGhAOU9HLC1YNiMnUi1ZJjpQSG5HRiNjVzkoT0pgUkYnNDxsPEZYNUgvO0I6OGFeP1QjLlYjImNANi5paTJsRWVCKzEiQSs2KU9CdDImVD5HYDArVyFASCIlX1A9Uj8oQCUpNWZWUEVgNyVSP0pkOS1kTk5NN19LbCRVOWsjSTJmWVlnY08xaWwwND81L0BXZyM5K01OcidmailGLlhuaWQxclpwJCUuLk0hQmZBIilXXzVOPUBfJm5POD1hYFQqOzlEPzxeX3M2YSZNYUE9SHFncUBhZFZEWWgkV288WkxUMEwmPjtvSnVuPmY6NSpkYjxURGctUmk7M0lHQEc9cCIxbTg/MmFBJ3RCMksqMDRNUidHIW9jWVhNcE8zYSg0alorZFpLMzxhXCMtR2t1dUhidUwhY209JTc7YCtXXS5HMG5vRU1lU0lVUzUmKV5TS21WPF5wVWw0cFo2QTZdJTBiYk5MTz4ydC41MVphOmhlPiU9anU5MDhRYGAoT0JYIU1VRCVjXFtAWl8iWEdONkZFcztjTUc5RD9YUjMwWyhSPjRdS14xMXBOMiIiLSQ7IyZeNSkhMU1ZcTVPM2owRSFFbD1YWy51SVsyREhkXG03KEk5PlJvaGRhaGtQIzdMMSoucTQwJSJsak8vUlVqM2IuYDZkWkU9MCwySF5uKnMsRDdbZF4kLXApVSplUnVLTSg0aURiOVdmT0hDLGtqX2JMSGJvVUUvKTxwNVk9c3BfMVt1NmdHdERxRD5MLEctN0xhPS1kVCpIR0RzP1hRSltLXzNgVUQ5YltwKSlFRyxIT0tLXy1INFgocylfdVAob2IjcVo8QykwMSlANkNyQCJYJDQ1dG5mSC0/UUpJL0wpPWk6bVxQJlRtLiZGYjxEXmtkKjA1Mzs2OkglUmMwYHQ1W2szL2ZQT0NZM2srbSErQzoxb0NZJWo8MCREUkM0aCktNUVtYDpnR2gjZmxLWlI4ZTVHOCJUK29lRy0qS3FyLi4oImU7a0xAZWJEIUMpPWViWnQ7IzYkJFQiSltnPCRycjlXPVE8J2orRCJvQS87VyE8YjJeI3A0YSNcSzFZJl9Ka08hPGdCP0tjSz10bE1UUDhGTmI5RFdsZ004KlhkKmJGXnBCX0VkJDFuV3EqRnV1Vig2Z0hAJUY+Um87KyRGb0oqSnRrTD0/WDJhY1NoJ2lNbFZsRWZZVzFdSC0tajYkckpzcTdqSl9yI1pTTDkuZ2tqQGdDQnFoIktFYnQ8JTBkWDdRRj5JMjtWN0lwMTJRSjNEckQ+Okg+NnUqWzs6OT5MJWs9bCt1YlFsUVNvJzRWLTs4aWxLWXA4cmwpKGFqT2xLQ2JVbHA8cTRzKzknRV4zWjcxIU9baThuNyVbSHBVUzZHXiE4XGNSTzteLEg2WzNlbmopOCEtVm89NEA6WXNZXzwrLlAkVl5WJDYpNGhJMk5IIWMjTT4iU1ouN1dwMjRVRm9ULXE/JydNPV1MKGM7azFnOixIL1JwNXNlW19gLXRiQXBtJz03Z3NpSmhEZDJuPS48P2xDWiVcVDBZUWszLDo9Y1VXKUQ4NGYwZkI2J00jQkxYJ240MW5lXCtqaD1zK25xXlZlM0poJFk4bWpYRTNwNVw2LiVgUm1SSmZbbWVdRUhjXyFDMiQobmRPZ0thQzBEUGlHJk9eWmlxQVRzV2xBXGgwS2dROjQ4J2YkK0lBWC1AL1g2ajI9LFRiKUlEMTxkazBDRz00cS8tQHJwPzM7US42c3ImMy9cVmE9KjBwSiw4LDZvXjs4YT51VilxVjxyWypTcCtWbzxkPCJvbCo7cl8naTlmY0FhISREMWBJcV8/ayRcLCUuOWpfMT1ZJmRdMTU6SUUyKnVwI2VXdG8vOmhPTUMhWCdlYnVHVi5dNj9qISlHIjVMaCluKTdpaV1uRztdQyk+L2VPPitkcCgmJElQRkEoWUk5aC5kbCk1PGcsdE1TK09lP3E6RyRcZ1xGRVwwOjdbOFBzK0d1JUVtUk1mcU0/RmM3J088WT84IyVCVmhaYU9fQEkjM18kXVJiJTtAWV1eQiw4UTcwW1NMYjsoL1lST1RdInAlZCglP05LNzlqJmUlNVoiJmNwOSN0cSFhJl1YNExxZ01cJHIzTmhURlM7ZmZUT0dyY25PZC5SaCRsIUE9PzgybjgxQDNVaVdvTCM4Im4xSWE2OFw6S2pjbzwmbGs9QyF0Rz1WbiswImV0SmNvWzRYWixhdSlpKjR0SnJbWEVwOiI3UypqZyMuLU9dQCxRSVtQRy1mLGFDakZRbSVYRVtRMm5fJk1eXTEkLGJJc2N0U0hiTihsaUIwU1Q5Rk4hY2BSaktYNUpqSltMN2Q+MDJRWnR1KStHOi5qSi5gMEBGSWZZXjExXnN+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMzEnOiBjbGFzcyBQREZTdHJlYW0gDQorMzMxIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDIyNzAgPj4NCitzdHJlYW0NCitHYXVgVGhmSTc5JjpTOEhzJ15cTGRaLT09OTYwQWg4bTVVMCxwaF1RZHRiOE9NQFV1J1wydSJ0XltMVF4sWSoiYCtwNzNYUEx1ZjFaKyZXImhzTXRHM1c7R0UybGNxLWg4JUxzLERbLD4uM001TiFoN2cyZ1pJSUk6XSkvU2UnZUY4JFpWP2hSYUg/XzpTTjszU0JVIyxPaSNZZCNJcyhSLDgpdFosJClsJDJIQkpkY18rMzQ2cVlNRnE4WmdXaiFhYUEyQlE+dSRfLVclcypqNXRyLGxdI0VrKWZdL1w6LGMpXStwWzEoZEE/aT4rKUNjKipwQ1RILlI/RnVpXSpqY0lTUkRHKC8xITM4X09UPEgpPkZmanM7Li5zRWcucDgwdENtOSg4JGRdcXJlMi44SHIsQlhhWS1kKFBEPUJpZl4lPDNSIWBNSjZlZXJtdVY9ckxzTzwsWWctUVM2KmlPc1JbKEtPU1o5ITx0dEE6QkM0LlpkKW0xPSg6Yl5KYm5ZZSEpbSQtTz1yc04pJWtbaSQ/dEo9M2JAQjdRNkhQcm1abGMhSDAqZWRkOlhDYWcqak0yVjpKX0NGXVNSRi9HSiZIVHNgQSYlS19eSEVaWm0yIS5FYCkzKGtFNExETj8xPV5YQ0JrYWAjWTZULzZvW0xzdDBkYUtHTTk7ci4jXkdKOWRoISlgPV1TN3JCJkYoPUU8b2VxWUNTZmQnQWteSkwpNyQ6JnAjZ05KY0c0TVk8STtSSjVuSXE1ZGtBR2BiUjZjb2s2RyojKkgqS2tCZF03NiJHYDlwbXEmMEZoKEEwVm45Qk9OOmcjVFY6VEIzZ09jO0VrPCU9ciEjMnRVSGotciJTXkNfTl5QSyhKVCpyVGIjTSdtZEtDKHQ9M24mQF9ZXGglQFwwSzkwSmltQXItY2VmLyltLSJBbV0hZUkpLGMuV1hVcFFdOjEnaVJnTERIS2pOOyU3RGluPUdDTi8jJ2JJP3FJVEMtbmQ+VitoLEY4KW1nQTo6OmlnXyNDbGUpPU0pR2s6b14iK1MmQGdnUy1DNWoiMjJZM28kZ2tpSSZcL0QlcDUvQXUhOFQqLV5yQDM3c0shRHRCUl0rSC5sIzJjIlhFJGhvUG5xLWY+Z2YrYENEKUo8SkFDSyJrPCVwVjhkNCUyKnBZdC5hKU5sP1hrby5VLywiXW9BJEJrJ0tYSFdUUiQwTVEmU1hCKWE1V10wRWY/VFRYVVBwdG5jZyc6KFNcbFpxUnVgVydjbT1FLywoPzUjUUxjKilmLFc+JVVob3JSLGBGMERqaVRKb1xgNz4iLiEyPXQzVUNwPHE/UXJDREBFRCs8VVovLlhqJ0MlKFwtdUc9VCRLZVx0aCVmaHN0KTs/ZC1wNmpPcUxFWD8zPTVkUl88dUlZPTd1NlFFNUg0PEA6WFFWLnBvTy89Nlk8WG5aPkJQT2hWTUgtKWRiYWtDWG5RYSNdK2ExPik5UyYlaExePSpIQWs9OzEjaUlkMThJZSVTJT0jVUxbNFteOEdIT2AmZjQxNzFRMCJrQUxiLypIMVYoKTRMWmlFLEk8Zjc7LHNAUyJZMEQsbEszWk9hTzt0RHM+Tlg6N0ZcK0BMRzZbWSxUUStDN2VKIk8rXV0yKl5ESiN1aFo2V3RxT0VcISoiJlBFV2k4LnJpLSIuNVk0LitUczRmXG9AIUdcLlwyVTVmaDwjcVchSDY5ZFNAb0xDKmBjSFdNZCcsSlk5VHFANUB1WVdfY0R0XStYPGQqRkVIZTQrMDRAUVldVjQmUDtScitmPDc8KnFNME8mNm5EL2BdcC9pZnUmaW02bkYvNUFXcmhlI2U/QD1RY3A0Q0lrM0whPkQnc0hYbC1uX2VFOFRwY1g8YWtBNWFPMkM1OGgmKilfNFtjYW9uSCtDLGtPTmAscS4ySGg5PUhfXykyJENQIkk6azRpVyp1LDpiRCNnMD5STlhgJUNYWUdYX2ozY0woQSsxWlVKLkBFK1Y+NTgyJTQoSXJnZko8KHRXKGE2bC4qRnBQbGwuQDM2TXJcSmNkUUY4PXJnT2QvbCd0PEsySVlJJjMtbiZiaGlbRGdsW3JNUXUkMEM+NVs6TixpZFBLTW9dbl4vWyInRjZzMUxtRyUhdWcjPnJNRkE8PW1ZT0ktOzg1IjhFOFFYWCRINE0wKy1uLU81OUdcUnJ0M1pPVTttR0cuVjssYnRXT1RSVVNIKUAjLkYiNkZIUzkkVD0xTV0xST1qcjM/YTZUbz9qaTwxdCkrQk9aLlFUQ146ajRxb0tlWEFpNFVDOz1dPTQrRGFwb1g1ck4lPEVJWUgxI25Wck8/NkBaUF4ybltUTyR1TSEnVTkxbFpDMyFVV0Q+cD5uZW1mNEBXVDJhYmgyYUxiI3JPU2wzTUdlLCRcYEAlNlp0NDRBOjo2TTZYK25eJDFrZytgZ3NoTzFUcWhsJFk3ajRpNjMmK0s2KGo9SzpwU0pcP2hsNUxYWXRmZEBXXCVpUipPc2JkXFwjbDtPYkpDcV4+TydVYnQsVD8wSTcvQ2dUODgpOSxwLkolS0MyQVlXP0onWDVkPiMrTiFQUkU/V0giYWZeTkkkS3FSOyZhcEBCMlErNWo9ZSglWCs/cC5ZSDF1cl8sZmQhPzpfOV1uUERfbSFkYzViTlNaPjhkc3FtXXBjPkdLJzkuMGRIbSFtZXBdbDtDZEU/ZDlIcFVZRk90OyJCMlEtVixvXy81XypvJCMuRFdjc2s1MVMmRD4mQ3FKL0ZTXEZjT01rNCExUUcwT3I9UVd0I0dZOmdyMUVbW2suYjsnRlhUWDFLZ1gpRGNoYDFyRClNMmo3VCZPVEg8Um9RSFBuTnBrZ205ckg+bidqcD8wXkpkbEdaSTExJ2NaWFZAX1JgSzlEYllebEFmPC5YcU5jXk0jUDJtbC1GL2U6PXRuKC9sM1YmJU5JbiVOL0tASDRGbj1jPV4lbTVDKlkySGI4TStJQUopLiZVYmdxbmNXODZwMVBpMU1RSWZWXjtWMmt+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMzInOiBjbGFzcyBQREZTdHJlYW0gDQorMzMyIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDQxOTUgPj4NCitzdHJlYW0NCitHYiEjYD1dYUI8KDRPUmlxJSVjc2RwUV8+WTMhbU5BMFhaQThFYG1AbVlBSEIuUlZ1P2dVLC5UQXEnXGxZcjVmYThPMWdXRSdmaVhHOEsoXi0jOWhyITpkZ2tya0dON0dkUk9sLVNeRGg9QnBHO05EZCJVI2k3Mio1UHByTGBdWkZXIUNHMGpfYFYrSiUkImUnKC84M01VQz5wQUl0amQsNmxiMGtCZik7aT9yP1QoWW4hTE4pSik7Z1YjVC4hRSJKY1xALj4lOHIvNyQ1KXVdYClKLCFrbzspNGFVQDczNnA1dWYjIVVgYkUhNjplJ2NrPWVFMCY7aUw6TzlGQVNKZmxqSyMpdC8pbyZtI2gqOyoxIktJLmctRi5zXDVqYGdyWjE/OFdiZSFVNjA3WiVlQUdTOURQZzdScjlFN0EmZ01tQC5gLUc6az5dTmZDUVhAZCpwSV1QUlpmPls6R1ZULSdwNzEya1pbYFVacilnTyxHJmdjUi1IJS49UjolSURoZkFQXVRqLF0sKVRWLyNuKjhuUTUrI1Y2KkdyMUBAOUwhQ1prNGxTPmc3ZVVAbSx0LDI1WnJgUF4+aTNSPT5uXHU9bScpRGU9YT5UUmtDbUdIK08rb0FJJHIlLm4lWiZyNEU1PiI2J1VpNTsnKXQ9TkNoY28nMU8sZWxNbz8zUFwpMmglaUVnQXFWPXVySFNAV1RZczRIQmJVZW85Y2FkM1pSR0AjRm40dGUlIigtbVAsbW5lMDUpKHJjZWNBdDhrRTAuU0s8Wkc3VEduLEhQKGcpJUc6VGteMkRYNz5XKzItZklhbzcsJS1jaWNeM05xIj01cG9jJCNdLm4pIzBwNClcUzUxJlVkNDpeYTI1RGcmZ0ojWzpFXGh0KS5zWE1CNlhjLWc6clIqUmNrJXJxSS1rZ1FUOmhCQUhJLWJoUClAYmFZKUhAXzpkLTs+OkZMcF5PQkRRdUcrLDgpbEhPbV4maD4mK1ApSEBnYVtPU19OR08yLl1oT0BTUydqJCUpcjM0TmRvJDs7WXRFTDVNT0w/JkQuVTAvaDtoajk4Ll5xRyw3NTQkLEcmJywhQ21hU1BrWlFwcTJpamliVVomXjkmM1tDKDUsbWFKZEc2bD8pVEkobjYlWFwkRVgiWDVbTG5BQj9IIUJESUNHRFZKXnJeVWIxKC9gSyZsO10lbG9sJ0tAQFtPdTgzR1JSTE5gT1FjJWlNYzhaKipGUDZbLW1aLjM2JUc/cy5xQTRSRClpNkI7YG4/bHBnR2duLmksLFJhQkpObHErZlstVi5eXVN1VDIlbFInRmctTmhOYTVSImo5bSUoYjpOUnM9PWNXV0lwKVxwI1gwbkoqYD9HLkJzRFBWRzxyYlRCNDhdQjdyMmU7XTRhQm9YJFtIcztkSkRfLyxUWDUqQ1kqWFh1P2UkRlhIPVxsYWVyQ1tiWDEqPztOI0osS2NuLDhaQ1xhX0dhS1pUYydJYmwzLEdrTCFOaCVpK3BlSlBiJ1ssVChQMCglIyFgaT81dUJYSFpeJkFfZyZvZT9MLXROQml0Lj5zIj07RUEiOzNhQ0xgUFExMUEuQ2QzPEswMkFnZWkxamBNcCdvKFttbVdVZTZeITU6VW5FST1rR1E3NChsV11NXFwrdSNtRltaN08qbUxTSGdqYFhNVC1dczs8SVglNWdfcWEuYFY9LmM/ZEgmV2FeWCtXM21SW2FOKEFAPVosMjYvci8wXDs2LnMhaFgiTnM7bl1RKDA+ZF9PXztyMmFPMnRmaFUoQ05CUWZLUE5aR0RTYyMyPGlxUFBGdEo3YE1nIWdkOE1nIiYpQldpNjEhdDZvLXBhRW1iWFxCVEtPMD5xTThfM1NKcStiMWkvazVhNiYmb2xBNkBxKDVxXFJJKCglSz9jdUZdWVgrVU4qPW0zQU9aXmcwaV0mNkosXDM/allOPWdOOXU+SXBHJkw7XUNAOXEiSUo7Yjc6WW43dEQuM2g1RUFRL1lgXF9LaVo/cj5KQjlQWFltTFBqMkQ7IT0iMVE2dFVHVFhhLVArUXVzaEJobG1pNEw9TmUpNzxFTG4tZ0xZVEdbPVAkZ0w0Tj5vN1o4LUZBZlFNY0ZPOldVaXIlMChkJTd1WC9IZVE+RCtjcFhmdEwqcGQ4UVNnYTg3IzklRlRUbkItIjQtMiphPTA+PjthclNtJl0/Q080KTpSUmZwQXNFTUIkOlVXdUdRNkZMIk9nRnJsXDYyTTMnZFcrOFdRbExoTT0qdTFoU2wiPzJURywzLXRYJEQiXWBWMz1qWT0sQ2w+VkExPGoiSGhbSGBFUTosI3FbVU81NXVUSVRDYT1JXlRpLjRDUUdZV3RIaGQtXmRFczZzPTciZnVObjxWWmEkZjtvTyhLRj82ISlmYS9MSj1HI1snLWA3K0QzOEgkTFRLMUVBLj1qWlgrP0tZIVEpWHM6QXU4WmskbDo7PnFUX0QvYnJJKEhGZSdeNzlXKy1dS2w8VlopI0E+KmRjRkU6MGlPTEQpS0QtSDxfYHRuMGFRMkApM3EvJD4ha245PSRgIz0tWjo0WFFcOz1xVUVnJ1wjUGcxbExIcGBuLFI1K2pxKHJfPjVfZmpyUWNZIjAhcG42MDwuMlxhKkQhV0lUZFoxWkwnX0AxWE5KTEpXZTZDcl00TlolZ1pEVW41YC50OE8wcnB1ZkpeYzIiP0xxL0VnXz5oLD02ay9UYj0ldGUtVlJAVygtMGhwYylJO1B0OGw0SydNSnVUS1orcDk7WW8zU0VmNjpUS1dCcTk2VTI4aiMtX2U2Jiw7ZjY2dWA5V19LQmRfJj48UyVPTjMpZCdzZ2xsSEZBOGBOPFBINkVycz1BT3JfKmdeO1VjKipcKTduW1pZVm5bWTIhcWViZ3A3VTkjYGFRLDE2PE40KkVcXzA/RG5nW0pkUVxrJjNtKDx0cShDJT9aTUdJYjFALTxlR15DW24kXURcaSVSZi4lSWF1UVMpOVE/Oylqa3BbbFFnNkhnRUFUKWNfOFNdKERLWjtdPUEhVVFFS0g1cyo8STYmUFsiOzQ+JFF1RCtfITBoS2JRbjQ5bkFCL3IrUjolWVM3LFteO2lKdUpeQDpOW081dXAuIUQpXF4oUT1uJD5tUksiOmhCaWxVV0JiOTQ2ZkEzJGxdU2Vday5HZU1OdEdmZFIpI2FUU1xBaDdPWS45YzkuVWgzLVRDKnE3bl1dRUpBWWBcYCQhJHFVVFknNWJUJDFCJERZJEFEXE8ubyxLUj5JWGpiNTkqbVwnOiw2JktqLFx1NmFCL1UoOCEsNC1EK0w1WWkhTChHZEoyc1M3MywvZGIqYU1tVDkyZTlecysjXGJJRmZdPz1KOCQncyVGSGtOcEVicT5EOkojW2xjSXAuXSdMWSMtKU4wYDVmNGkjK09nQEplN0dZNTc0b0ZOK1JnOCxCMFY6Xic+TGxYWGJkZDE5UjRNJ0YvY0BkPE9OQ2FsdDVhaVNIL3JKK2RNIkNwLGhmWz5XVGBySk1nWE5IZWtERUVEUioqVHA0UFRtNHBLZSZWbnMkJjVSQVlmZ09sSS07TyRrRjUuOE0kLUJscSRKT24vVDBPJGtGNSMrc1NGZyY3Zj0pI1wlbV9MPDwqJyFdbSlULysvTywjb2lhbSxNPzk7WmE/bVstVCQ9Uy5iJkdCVyJyalIkUl0pUHVAYTRTRi4qV29XPzhNb1c9RCJnVE9YSzpzYjU3QTAyVmdJRE8jIWQpRWckNHRhNyMsIlVxVz9pVjhiPiIpUldgQW5XPk5PSXVrS2FQPU8yblssLD9MZVh0ME08ZSJnJVtyPipiTlpwQ2ZkNCEzVSlUMW9tPz5yYGRBUVxaM1pzOVgiam91bFhkQ1A+MGpNa2AoQ19eWlNNI0UrUiZRI2JGQExnPlNfaTJgTWVbKlVUXVlxXyJtbFJeT0xWNWInTFZ0XExLa2xmOCUqJFBBYF5PZjY/PCJJSjpEVCdzMktVX0BLYjhTJCNrVT00NUVRLSUscmYzJHNYa2Y2K0ZRUFNgWDAhcTJXNWloZ0IiXzU9MUdrcHBhb21AXD5YWFE7cVEyRlk8UW1oOjZlMjBGUDpqcklSZWI5KCtwWyxkcV5jcy41WXEtKEU1bjhISEdkUHAnTCJhUkEtLyJtKVQyRWEyLURUSGZYWDs/ZkYyJy5ANDxLQ2pqcVcrW15WIyY5SS5iXTdgIUsuPV1JbTc5TyQjUDVuLmNmR3BVPS9qWGZzSWZjXio3Sk8mPDRsMT9CbjQoV244bFducSZsZGNvVWFPKmszV0xjIylPNj5TKj8xUmJFNTokMXRwa2pMY20vXVZnMV5rayxYX1dKPldtPWQoUHBJUDcmRjdELGtibXI1Qm87akFAcFQ4UGYhcE9RRUUuaWk5bmFvUUNZcEohK05vVFV0K187VzsmLCwtSFcvPmtANiopNTRNIkpSO2U2VzA6PmE4ZihZIyxZNmUlX1NNIWFrWEItWlJGTF44UlhRXF5lIzcvX2w8c3NcPDo7P2tQTUxSWzpvTjFMQ21bVGMqTzxqY04/aEkzU2BAXGNkPVRcaVcxPV5sT1VNZkpZaEVLXUdnOT9JbCdTI2FzTkA8Sip1bmBhZUNlY1Y5LihgR2BTVmNwTzhrdUs3NmgvJGosV3BWJnItX2kpU21FRDZDWDtwUz5iMU88ITpkJ3BsRT5GNGciU19VW1Q3YGk8bXU8USpqWSdIdUdQV1dQMFEwRmx0L19nIUNYYWlSSjtPNTQnZTxiKSNzOUhVVXVHaidQcVhFQS09SFFMLlRrai4yZlgjWWpGa25QNEhHVnQ4KGgqMGJTJWI/cWkqZUY0RGNiWWJING1HRHIwZVchKiQxXDVyJWVINXRxSUR0KmRuO2svN1gnMVtxR3N0ZDtFTVBHV3VwPlNdb0RSR0RhMCcza2tCQ1NyXVtNVTRydGRuUkJrQWheJ2tnKFpyMWM+QFhyWTBNaWgsOypENypiK19PSXU8L1diaE1GKT5IJFNkbFQ2LW5JZCtia1k+U3NbXWRBPmo0dEBNYDhFNy9UXmMpREJGMWFNYiIuPXA8PSIlTGAnVS4yZ1p0TXBXQzpxQS8sViZSdVxKSFcyP0IsKXM4Syc9QUMiMjxYNjpAaTtQSzk4QUtYZGIkJykwKz82MEYwNlE9UTRbb0RGUCtZWU5TVGdYZ1UpN2ZPIlNBPTVAdDxjKlJRUDcuXSR0LUcpWSZES0VATUlGKDs4VWpjTGxUYEc0J25XP145KSJUaVBeOy1WbmVGbXBNUGxBL05iOUVkMlU/cVsqJEZrImpDIyRya3BtODdoNyM6Q0gqJHMwXWhSTywjP1IjU1E4IzJMbyVuNkk1QDhwOzEkRWdgSXNacSw2PCc/UnNrWy1JSEAnSGhwMCpjUy4pQ1U/PzwoaF0/Xis1QW8lKGNiVVplVCtCPk4lTTlySzNMakozSGBFRGpkS05qWD0uWHU9PW1LbjlkKzJyQW06ajBVR0A7ZENJRW80LTtIL1gmbjEnNFg6XUclaTgwLDY6K2JIPEBIcSY6SVdkK1YydUtxKGFqLjA2RnFvOSRtL0lhMnE9NH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMzMyc6IGNsYXNzIFBERlN0cmVhbSANCiszMzMgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMzE2MSA+Pg0KK3N0cmVhbQ0KK0diITtmPkJBUS0mcTgvI3JramIvY0FeNXAkcVo7ZW9LOVwvYygtLCZBJS1tViRVZDtvPjJEVC07S1JCZGZgY1U4Lj5eWTM6UmtyLiM/V01tXUFNSEY+JSQ/LjlFIjVeISdmQVliO1UyPTJWXXQkKUFzZDBJaC9hT1QwTjRTcmBEMWsxQlE7aC00WzFtTipDNzQnaz44JSoqVGNRUyovK1pDSXFxUDMmV0xnQGdERlNyNGZgSG01Y3NBZz1CNjxQOWpJO19cWzpsMnIrRys3LzEnZHEtPGplcWxXPzRBOzRuaj4oRDNdZ0FMJyUmUWtua1AkTC5HWiQmWWNSPmhaJkNlY0BpN29HUTVpQnMka0Y8JkE+KzZZJVo5N0dlbUZdRmtUX2Y4TjJPWU5AZVpoJyUoVSQjZCQ/YmJ0VVEjL1MlbjwnTjgxV2ItKlBBJEEnLkUvbHJoTTExRllUP0Ema1U0ZGE3QEg0akVmQlA4Mzw8UUxuNzFNLlE4cFpOWDJoY1NJMzFTYygyZGlNOStmKislc1hKSTwoKkY1JXRFQmo9LUs/REItJTohXHJrI0gkJl4yXC1kcmZzKiFDTmtOPF8jIiIoOEYpXkNJcSYmZyNdRiY5OjdKYWtJYUBsJik9UWluLCdNaFMjRyY9VTVtYzpTVnIkIUslJmolOSEqJltbXklqTz0pU0orYlwvZjZqbGhTPEg7dGUvcmMnYkc8QGFhUDpaXGorTUBZdFJkV0Z0OmQkcmRHTGw0VCxoZ142OCFxdTlpQVhJOElnVjYsVl42dSVNcStOIUdGL1VHamtZcjVuLyxXKkw4W1RTQyYlRHEoKjUpZmlBLGssVHU0bFkrY1oiW1BvLkg0cGMyK1trLHRMLD5hXj08XlQ7QEUwSCtSR2dcbDAuLmkmKG0ydCFfS1M7Nj80KF8vNyxfTVRZckwqW2dBa1tGSG1MXypMOl5hTkQ2SzlwTTJgRDJhbmEqal5iQVM8XVJabU8wSDcmTVJwKC5mNDtlVWVcXThtME4rV2NmI2tSZidUYjxKTTM9cm4zJDVhYE4jcnE8P0s2RzVxTzVRSFokciZNIV9gQS4obTJgPlNHaTgpb1VpO0RbcmBGM15LaE1NN0ttTlNERXM4V0dcZDlrMm86NFloZUk+cGpFK1pHV1N1QCMmclZpUEA6aC9bQ3FwISsiLzZnPiRqQEszXVl0OGshPE5BUEIiWlROZU5VSyJdbV8lcClXamlZMkpCQz4+bmpfKE1fWlUpSFQ+UWRZOlJcb09HcjxEVzRuJWJjPl1IdVZVK2BHTTc4RnImXSttInBhL2dRcyVfYUxcbGFOTGE6XD51TEEhQjxVXj8+cHNpOlpQa3EiX0k1Kyxlak1BJEZXWj0nZXFqJXI4Vy1rYUAwW2hhVDs6aic0NEBKVTIrWTxrVXFdVC84RFdhKzQoTllXTk5BJUJfYWRuO1NQby9KQzx1OFQ3K0tBaVwyQVowN0dCOCYwO1M8c0lRcE48VWhtPGs9a250ZCNCPFcmajUnNk81JlNYZGMsVz82cCY3KjNbQ0twVUEpRG1GTlVBIy40MTdjXyFjdV1hIytkPWhaTkokNkUtLG9vX1UuRzpvYVQsRzZ0UVpyTydxKSU6J0VjKTRtTyZzWEdFPS5vU0IkWHA/QC5OTUVxXT5TW1lSVnAzK0RsbEw/Q11lIWM0LVJcV2BDRT4mRUY0QC0oUVVfMi85PEZQOydSO3JoajRCaD5CSU4/c1I4Kyw3NHA7ZCYzQVFAJkNUXzxQLkUmJDlcUF1HVGUmRyc4JytOQltmaUpWZGNZR2FuO1JvOi09QCQuOWc7SlFEMyUlN2tDQFw4PnQ4cVRJQS5pJ2FvLU9xTyVGIV9NRyY1P0csTWZFMUBda1dfa1RJdTAvUWMoOzBCZzphVGFBQllJUlYrKTFYXFg1LUU0SFJwJXMpJm5qMGE2L3E2Z3RWRWNLOV9qbXInXDwkQ1glckUuLSJcSiJLXDAkME9wOnVnLGkhLXJISlZWImchck4vK09RRVsyZDcpNColPF5aSWAvVnNfKnFsTUhLX2hDclsjQHFuakVKX2BhUGdwVl0lQzluUDRHNTdsLUhzcWpPQ2UxTWk6KDpaXSJyKEIpInFvbGNqX1BERkBQPFRbLFhMJ1IqNmxxa0A4IV8uSVZrL2VDVUNTZ0RGbiNHcDdpOWdsMnBKNyI2WVZSNSgtT1FFbmc/bj5wIWNydGZBZElBcURRTVRyaTFYJmAjMTQjXnJlKVw5RytSJV1QPjpZQ0tocCRFMis5cjlJLSYvTTlCZ0Y7TTRnLEtKI0grW1pFPzMoNkJZJ0ssNjJCbEUtQkM7ZTRrWEQjRGZOTFwicjJJSGZMSnFdJyI8QHBcUU9kSDIsTDhwLFYvbDwqPld1OFJNMzxoOTNsQzo7YSUvYVkqRkBrWCRjWWQhZFMhNkMqLlYvTElvLlknM1tjaEJEV2hCdVQnMmEnNSsiZCEhVjxwJ2N1a1hEbENAcEAnUSlWUmAnRUxYOylzcWoxcSVlQGIuMSMkY1dyNlYhV1RJQiY/SzJJUDNAZmhjI0xyNiRfSkpRY2wjOEUpNDFKRS09SzFoIVJvI1JkVWc7TlBVRF1SPmtxYGcwbUNUJzVMJ1xxXyZjZlFtKXBQczU3X15BViE6aiZwSE9OSiw/K1FuPk5OY1VlPGlDKTRBdDVRQD5xU29VLyw2NFpETjpWQDhMRlFQbzBjYHI/TVMnJzlyYldhdFdiNGQ9cyUsby82OiRpVVpGMXJQSyMzOF5NdVlDTT81UzxjSHJbbkVJaDIiXCs4OldWM1U6PShHSlQ8VnNMXk9oTjM8ZSw2c1E2ImEwbCtsMm47SCsxUDlXNTJUOFl0UidpI1dZTmhsbVk5c1RBMmMzaU9mckVXWGBINT40c3Q/QT0nIXE5OzJiXkwkMSUmOGdCL1UrIl5eQW5fQUItN1RaTCExKC9jKTcuRGA2cSREY20+Pkk2MDZuKTBUKGFzdGFgK1kqbDJOOD83WlJZL2AvNjFZZFhsazMtNmpfOk9WLFY6WEFdViZTQHNjY0grIltgQ2dHPHQ3Lm9Kbi87bkstYlg5QCkjLnBmRiEmWGNjb2tmcnVRPFRJWk9WJkNpaihMIktnLktuOCRwLUpeaiNzK1FPbD1Iby1RRk03O0RnK2B1VkJJXzpwXXReTGx0X1lzP1M3a1I5a2teP2hfW3NQQ2xnLGhKJUoxbFNyPThSTFtQVnJlMGtjYTdkMyY7J2wvWCkxOShqaWM/SDFrcFxpYC4tKSg1NCddXkcvLFtxZj02cEhcXSshZD4zJkY2KUssN3BhbE5eaGNGMWdtPlhQMm1dUlZoRyZYU1BxakFVdV1jcidbbnVuODNUa0s8ZGA/JFAyI1JjJXEnZ087KXNDLjAxRGdOLlFKQzlKVkA0SHErT0VaaCtbY0cqOERDXytWMi0jT0lgIkRFOlJnNVdPaWNbSiEjS109L2NIYm5BVSFrR1FxMGRrZG1ULVdkUVlwa0FOO2dlRld1S1IuIk5NTzghPWQnJ0pbZTFlT0FbQk5yWU1qR0g7ZEx1Yyo7cShsY2RsOS0oZW1aLCIqZTJKXDpdRD1MMio6JUE8Ky4wIV9sPl5vW1g+cUpBMSRoQyVgPkgmPlRuaF81IydlWCNmK0EqU1FAZ1JzLjBdRWpwISRFWiYpSC4tWG0sVkY5Pl4pdWowNFRXZDohT0UvO1lUU0kkZHA1V2RoP20zTVdAZDUpaWI8X01ycihebldAciVCS3FwKyU9c01oalgvPyNwJTojOzIsQURNN05CMFsoN00yVTttYmxqXTg2QDpfdUg+Zy8zKy9GdS5bIlRRRk1JVSJdYztRQXMlTSI5biItOSJYZXJuJ2EwQEg+KWVZOVNsbVRVQkNkQ0ZqaWsiKC8hayg4WVNfP1Ymc2ViNyliWTZPdSNjUj9NKF8tSDJRKEtNOmUpMk1hV3EkUjY3NmVLcDY3VlhBc0JmU2hESEE7Uiclb2tWRDtlKzNZKV5DK0ZLbEY8dHNxazdHImpOJSdydVJCKUUoVyY0b05HLFVsaTdncyctJlAuM2VHQThWIkQxLldCLGBWLDo3MEBnWVQ8NyFyZi49S0VNKEVPUG9PYmc+WCpDWHNCXVpmX2VuYCllK0Q0IkBSQjV0JEJRdU4oZTBsP18pOCJsJ1ppOitLTWA5R34+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMzNCc6IGNsYXNzIFBERlN0cmVhbSANCiszMzQgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjkyMiA+Pg0KK3N0cmVhbQ0KK0diITtlRDArSUEmY1NBaXIuYztCV1JIdTRPZVVeZDpKUT5pYj9URl00IkdgSVZCNm9uUCMuPkIiLT9GMT9mLC9ZPyh0bGBuX0gvPD9kOWZcQC5FMS5oLklOViUuVEJvcnNpTGdbZ1Z1W3BGYHJzLzY6XipOWHEnQm5EMypzWDNeTFsvVl09N24ydD5FYGMjJiw/Kz1wdUI/a1RZRWtPM28/R0Y/W1d0RExlY19mISgxNTg1JnIiSVxUPE4iLTBRNiJbREg0PzREcnJzOD1LdUcuOSQsPixiY2ZIZ3AqKlAxQTgnWTdxKUo3b1dGMnJGKiU/NzRJQTRqOS9hVlU7OWghKj1XN1dwWElIPl8oJUsnLChAJkxhJVNSQW5EXE9AYmEpYCk4ND9yPDNILyteWVB0NlYlcUMzVUFZLyFsTFhULkNgJ2ZXKF9yPUpmck1IVDgzNW1GTWtyITMvS1R0OG8mO1csc3JqLTFlRzhlal8mYzE4OFBpXmtAWis5UV5acllwJ1swM09VLCY9UF8/L0grQXI6Qk1rVkwqbUteN2peYm9mOU9EZFMnQmhCUEJyXUY0KTVCRVd1Y0xeOE1BSCJGWiVKcXBMVVRzVVA6PXJIXUduLkhaRDQ8aSEzQzVQbGZJXCdJbVhGcyxqODBlUj9UKUBCO1cnK1lKNkw+R0wtcVw4X0tAPzxxL15IUy08JSosU1pAMCUsRmI9altYajx0S05bJGUvY2pvQExDZkBsJmRKLlM2Tl1xSmAvWCNCYSpAPG5XUDtQK0ciZnJJT0YvPnVycUknS21qLyJfI11kdGlwdUFRMkFgVjdtaF4wdT40MD5hZTRLZF9pXkpRdSVGITYpaUlPN2FLP0FwOTJIKj9NWXBeY1k/K28mMnIzUlJvYW5bPHBGLkY3VFIiLXEmIUliIkA7LUZEI11lcSMicSRNJUhAMW8+VW45KF1wNzdAb2V0QCJuQVxiPjldJEsnLydzRytRSUszNVA2cCdUa3JcRSlVPS40Ljx1ODkvRShJLSVWYkZSKkxuT2FdczxwbDYrXzVcYFE+UDZldV4kcXNlUURpUDomQEtlUy89OiE3KFE7J2lSXk1iIyRLJSJmaUlGMFlISFJgY19DMWIjIypRTEdgXWpvMz4vI0pVJ1o5UFQ3aCQ2NzAzN0lJPExFYlkzLWNJcyVxRlttNSpTOXIxUy8lTF02SjBcKl5CJ1dcT2BMTmkzZ01IP0ZhUTxNQygtZ1EraDRAUnBEMzZDcE1eKGtuPF9sUTBoKVs7QW4/UVQsPWRZW0ZWZzxrW0RpWWBebUs3SThTKWE9Uz9pVGlyUSVZOFlFYjlCV10yS1wnX2ZRcDpCU3RkJFQvTjkwRS1MIy03UkxoPC1UOFZBaUlRMmYwbWF0PV9iaXNhK2MucF9kJypQbj0xR3NDKENqJyU3TiVeQnBBYCkwOEY8UyY9TXFGQFZ1W0pdKyc7LlEna2AyQEZZWGFhNTpVPGBGR0xnLDQ4KT1GMSJWK1pjMUghQUwvQ0Jvbm1gI1BCV1tLOmMzST4hOD9sQUduU2BoTHEmai5kMzpMa2AtQVJZNHEzQF9KZj8hTGBHZ2txYCViY0Vaald0TGs3c2ola1doSiJFSTJtYlQuVy1kcjpVMXM7NyRpXCRJVTtZdVo5S04yZnUzRE5rOz0/JUEyTnArby01PGVhTFZcKzlNQ206Jy1eYHBFM1pca2stYUQwRUE3Qi9Hc2pcNigucSRfaTdRcSFKKit1MVZtdC0ycVhoRTpnaU8+V3AtP2MhVEpKNFw6alw3WCRCcVRiZkhGZEBndGc1OSVicj9tJjFeJF0qalZWZUZdQ28oVys4Wi5nbGBgXy4zLFcsbCkmc1RpdCMjNzoqKFM4bD1mXkhFaHNaI2dwLSVQaTZAZWYzIktaWUU5UigsKio+P2MkdG5hVjpNNGU4TzkicyEvW0k9SWVLVnBPcXMhWlhXaCNydWNHSlxAMm9kKiM+ViReNGBXSCRVSFg7LCZLSSNjOz4yZiYpTGZHZFNIaWMsXTwnYHVQU3RPYDFNRWIvSEguWzFsT1JYL1Q7Yy5SRmRNLmwnUDF1RlYocDEmVkIzQ0gvWEozTGEwZFJTdGBQZGxWWS0xclhhO0BTIVIkM09CLUZRSyZkaDdtLUUxSGJJcUZAZDtBSCNzbnBtcTRDbzo6XnMqT2RHViJrLmttZ0NqQDs3OWFiPV5qKW5WQjQ+YmdqNFktTDYwcDphYnRERyZnIU4rUTRRbEhJcDlqLUguPDtcJ0NfdVVIWGojTD9xVDtJciR0IjVlKi10M0ArMm9dbG1pWileWVdDO3ElO1tIaGQtJWpVMzk7PWQpbDBEVEglYE8hQHFZRU5CREc4alw0cFcrOCddM00+JiY1QDI7R2o6UTlFXmxtO05YL00wbHNkKjpZQ1AsSks3KlBfRkIzUjRlcHVjIW5DY3FMMmdmVjNwKFsmcEEqNzZ0QGVcPjdvSFI/VUpmR3E9KT5PNGFRRWdrNzhwPWE0L3FDRjs4RVo/Q2NqVUFRIWIrQUc1LCJhVUFnPGxxUFhfXVdIWFI6YyYnOSJbXSovQ29WXi9sIUAkUV5ZMHUrSldzLkRBTHUpO0xdcCskPTxOcC5gPEs/bkA1WCtmNFZVPik+XjU3OC5jOSdcU2I6JC0mU1BiKi5ZVz9YKTYwNyxYQFcoVzAlaWpiOjNEX3Nga0ZUKC5ZQThVRiJkVERPMD0zXmxOMjA3KVJTVGNZRC42W3E1MC4vR3EqOFEjLSgiWT84ZXFtbyRyPzlVYWgrW0dBaUNOTkV1Om85XXNrRDMpZFwmUj9rciVjXUI+TkdNMUlsJWdZcGY1RFM3bCZHc1VsNEcyXC40cko3b1Yzbi42NitKTWE9Ukc8V19ic0g8WUo6Sz9AWUlyY2oySkFfIjhfQmMoSlJvJit0SmVbaj0xcmxNZVxOcGxUSS1ccm9dJiZwJiFWTURFSVVYbyRNUEVMYilRO18wWic7RENhcjxgNCpKc0QkLzhFWlRbMnFUSj9JTzdHPzdCKyxdKFNNPC5rbUl0I0gzPzpTZlxeIUMjR0A6PEVKRFJhNSI6Ij8qYVl0Q2VgK0pDOyNBbVMqZEdpMTxYMEdVWUpbTFw1KCcnaTZTIT8pXEQ+MkszZFcoNTBOXHBfXVBTSkdwPChmW2lOQSVjYENFPT06TS5jKXA0VyUyKVwzcGNeTjMzJzhSXSRXITNEZCJwVHFTUENZJGllK1Y9Z0wxV11mKEY1VzRuIWtaQT0pR2xCPz4xXFpESS5LZ3JiTWw5WzJmNT9ULWklckVocW1CZys6bEMkVDpASW1hT1VRaTpNTmsjVmBVLjRJSERXNE1IMHUqKDVwQUkucTdJISJea0JJc11UQD85UDw8O00tJnVKUz5BLmQ7YCN1YVIlLFtFMzEySFVpQUUxcjQ8Q1ZwXlRVQ09KQFAnbUdwNjBpOXEqVVstL1hhNj47NydpJzNqc0pHYWZyO0QxL1QsM0JDZ3JQI19kWTBWK15gXl4wI20kVjIjYyJVTGtMJFVoLVJFaEcjXVJLUCJYVlhXPl1CKjE4c09JbiM9biVoW0ZNPGlCc204ImxKKUgtbEIxKVBIb0liTmByMmA0O0ZoOU5zSSR0OjdvT2dyNSUkOTssaEBHRT1cLVJsZ1NKOC4jNjksKjoxWDJCdD02JSo8Tk0sKW4kSlI8dDJXLk4zZnVWO0ktOT9ML0xvYihnaVwuR3VlJyZaVSs1MSIjZm5FYSZITSQjcXA9R1BjPlo7KC0kI0cpYGZgQW1WSCRqUS9OWjkuYEVUS0YwSFpXSEstayUzaldhaD9SUEBmMSolKmtRb1Y5QT0hMEQwVi1uJF9ocSVpOVlAJTVNT3JSKEZ+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMzUnOiBjbGFzcyBQREZTdHJlYW0gDQorMzM1IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI4ODkgPj4NCitzdHJlYW0NCitHYiE7ZUQzKkYwJylpcHBzJ2FoPUZVbCRALFlOUm1YcCo3TEJuS2FHWy1RXmpcQGlFWzcsKEJcOydANjRoLV0lV1AqNHA0bW9uVC9KLyNWOF1UYmVvVCxCaWFiVTxINUlmZjUwajhlKWBpVkFyQ0plNyc7I1UxcFJxN2tqQ3E5cF5gYlx1RVdPIT1vdERcRChkI05HaGkjMGlNb25PR2teX3ROPS5TQC0kVG44TjQnOXVmITRGOCUmYjYqIWJuUiRSRWlPJzlAUkxuRE5dIjNnZFI5X2NtMUlWUVVwRzImYF8obkVAW0B1JWguVHNPQk05UE4rbnBWUURcUXFXSFFBQ2hYTWtmYF49K203QlpWQWU9aUVBYE1ZSVtyajY8Y1NURy1LL01eQT4sXVkncjNVYUYnX2cuS3VGTz9pR2VKZGtCPCo7Tj1URT8wNDkiLE5GdW8hcEdgNkxEcnEzaFRDIyJSLm4uPDFnYiRebU4uWUA6Ii5lcTUuM1ctM2spLlciMiRfKWJlTyI5MFhUaGdsZmFgWm41WkJsK2pdV0VdNVdFKk5oc15cWEpaJzxNMXNALSkpaiwpZmlGXXM9MXV1J0lAKTUuVVo0OiE2KVtNNFYxRychQzVhKVAjLjgwKCQ3WCR1ZyssLUIkbitSb3I0dDBrclJXdCM2TmZVayVUJk9RSE4yQyk8TSJXJjI+V2lfbWYqNzk2Y0MnWUknN1ZRKUM7Z2IzKjxLUD48T0YnVUFoKVVsb0xDKmBWLSkrZjRwUmZhOHNTMCIpbzdKJyRzKF4zTjEuLzAucGNOS0ZOKmo8KV5bPWxvYVBQNlhnbChkPzlgTT9cIydYZCdrcjtFR0ZDRDxGckwsSXAkZXRaVTAmRypVLGM3ZmVrcVdNI3BpJSppR0wrSl8oMFRxNFxJdUUnbj03MnIpQG08OUpXS1EjUUhZXy9GJW9PbXArJT5SL2RVQm01OWdwczglTXFhUzNeNUs1aFFMSU40P0ZlJT1jUCxBb0VFWHJpISkqUUloXicqcW40OlY9SnFmMFlmQWdDX2EjVUxOPWcsZUNJXW5UOGxxZGFKZExxQk8+XEVCTSQtcE1HX0FFU3VpOWNCKm5RcWFecV0pWU4pbGxZJFI7JkkqJDZlTEIrU0E7U0FxLHJlYS1fXk1dPThPODs/S1Y/YD8lbiRySDEscmAwKWEyTihHUyUpRGg/JS42Q1dmKDtROmZkQ0sqVDYyUmNQS2EpW1gxKFtAbzlaVUtTJWo/QyI4Yl05WyhqOTUlLkUhRikuLCdYSjMrODplRy0mTEFKX0hNWUhLU0RLOG9vWGEtTUhkXiNUWSkjTGMqcEQjc207cCtxQ2E1YW1mcEtjUjxIclYySFMxKSolTWhzSGpwPjI+VC0zMDZCT15VTSVIL0MnWDVSP047aUc0Tj9SOlM+L3BNTD0+KDg/J2NqUC9UcSszQmcrUUFhZkpKb1EmTlZWO2g2cWhLcFxEXD0kIXE0V1xoWl5RMCw+cTM/MCJncmg9Y10laihsTU5EXCZhTzZNPVgxOWgxcDRqcy8pZnIhUkFWRGsnLiJWX2dHYzYiaU5lMCkhOlQ4UGo9a3VpWmYxU0t1bExcL2NPaTAmYjtpdGlvQCguLiZAYklEUmtCcmk7OFYlVSxOQSovMzdwPl5LTTM0UW5WZWlJPV5AMyg2JkwkW1I7KlshXytFRSpfJWVQZj9Yak8jMldsR19pXEApQGNnJ0swOWk/TVdKcFhRVVFkZ007IjgoJWFAcmFbNnI1Pi8sOyIiSy1xXHVoLjc0dT1sOytda0FGPGI0aVxNNGQzRjw8RE5sMDI7bGBJLDpWSiVeK0wnWC9LUVhEbSs9VmMlMW5SZHVwN2JVbElecUBVIjpfLXAjcGFSUChPJlhLRTg0UDU5JDYoS1xOZDRoYltJW2RkJzBBZTdWVytGXTNUIUklblduMShBLj5ZQT0lSWUiNTgrX0hcLVExIjZyXF0wbFhXYCNoWC0kXCYvS0VaJlRcOl5mPEJ1TW8mLVg4ZWlFVU1RKjxrLEBHMkgiN3VVKWQsIyU4VzBbUVNPPC9Tc0M8Yld0YGhfKElJPi1eMmlAL2xsV2d1MXVSO1k0OGU2MGt1KlxEI1BaPkc5Wmc8S19rXDxrUSUqRD9BPy5WO14iNS1IaTlMZ09kKV9acSVjRkxrSCpDWylxK1BCW0JpK2hrV0RaMF1zdTdkRl9YMFdeWSY7UCllYVoyUzUwU2AscC01RlZZKmdKI1A7b2BXJ1FbNmZELGAhazMlYV89XS9DTTEhNkInVzA2I3FXJiZOMTdDVVw+PHQjaElvTC5rUkxUT25hLDlkaURLYmxQYVsrSFhKaDBRby44b11HJ0giWi5kLSozSEFUXVU0N19LMjBlTDxRNy0kUjVQTG0yUnI8Wy1FWylubUgvJW1mJFxdLmxTSDE7RlRwRiZpaWFLMmM6Z0BdPGshKkZMKDhUR01hYl5lazZZanQqVWEkbHMrImBzYV4zPGkwOGFtLk1lSWspOl1zX2owMVpjbTpKZSM2UE05RCZRRWExMC82cGJxMkx1a1orQFZLcmlrbSZhckNfUGhPRFBjXkxIVCZ1alVHJ09mWnAmTXAhOmEiVF5DUiFjU3JJK2FXb203RlFMYmxyQT4mSzgmMU00M3NoWUdNMSorZzhKZEgxMiU6a1c0X3BbO0B0Q2Eub1ZgMUlXLWQ4OE1rLjsnPz8pcDpQTWxoP0RlPzBrZiFnUDRgUkwkJEpTRkU6PmkiaDc0QHRjYCctVWthXT9yUERCIWVQUnFEVz5CUT4jalVbcmolKUpnUVBKXVFmQmJucF8hYE5rMV5zcG0xay1qQj9AZmRGcSVecXNGRUJlOGg9P2hcW0VwIVVvT0FOTitISE9fUmhBRihbX1BTVDFlR0dYS2Yuc0RvbnI7dUJyMkYlMF5hLF5PM2g3MFZYZ2tUUE5hI2RiLmcjR0BYZVI/V08mIiRDNlNBNCxERTQ8XE1vSDZqZGBuZiQpRUtpcD8pMzRVMkI0VS1iL2xXTSJqbnEwVlptdGhDWy1CXkk1SE5EUUxySE45Pl41QClaTDElQGAhUSpuSyJnXzNNIi9EM25ZMVtWbkVyQ0JdNW9FNUVGZy8oWFVlMilzRXBJW1w0Z2U6JUxqK1xua2MlUT1WWXFqOypNTyVqQktcZ1JsSiZicmM1PShWYlVKb0wiVlJmcHRUP0osRnFfVT5RQ15hRz1BUU90ZUdCPmcpUVhTcy8jYyMqXFQ7PjEwJiE+amg8KEFTRmRMQzhyJHUlPEwxKSJXbTgxNilBRm5ZJGxwLz9eXmlATiFwWmZcb15YdTQ4UmNxPSFlWyVgV0Y9RkU1S0YnX0UzdUo5QjZgUy1JNidLMT5XXjZxYVUiWTVeIWB1Pj9ULiRfUkhsIURbYW1jW2dxVVFhLE9HNkJXJVRNL1VhP2Q9KUFvKjIzSUReWio1RC8vVz9pPXM0bD1MbjU/VEJZUWpWWGgxRVpPQ1hmZVhJb1lMcDJtN2ReJWNhLHNaO0tQPnFaczYoRDljbSZOKjs5JGM6aUVjYjsiZHFyVmhgcW1SQjdOZnRdXypNMkU/TzlOMzlpMExNWnRAOmNMVDNgQyxnXyM+KCo7N3JIRFkjYihcXj4rMUZEbVVyQFxaVDMqVVYiR1cvTmdKYSIkTGRkSDJzam1kLiRKI1I2S2hFXEFsPmAyMl5XJyxhYWpuSCdAJGpQTmdWc1stKidCRmFYPWJdMSJGVDNsbFEiXG9dKjY6Y10mJ2lDZCouXTVCNEZBVnI3QDJQbSZZQEI7P1M8cidlKWY7c0ItNiRXN2UwQ0ZXMV8+fj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzM2JzogY2xhc3MgUERGU3RyZWFtIA0KKzMzNiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDg0ID4+DQorc3RyZWFtDQorR2IhO2VnTiklLiZxKlBVcmg4ND1SPzgpRF0kVC9aYXM8IjJSVHEyRVZSRUFRPj5sKD45OEgvayFDMUFrcFg5UlgnajIwN2dIJm9kWXBmYGZGSXRhRmQtdEZuP183LTQtMzFnK2k6MWshNDxKL29pL1FAcEIhOi0lcEAsbWdwWys2TE8lOC4qLy9bRTdYbGdhcUguPVxkJSMxPzxMQHJGaDMsQUpJYTcqNkljNm0raC0wOmMvIy1BZkowZUdKKz9bO2A5RHQ0MEcrKDRmSzFaPW8lcmBLLWltU2YjRkRvZkxuRkxROGJEb3QyR0s0V0JJOHF0M3VsVF9PYVRMR2BiImhQSFsuXWwtUUBFJTgzXmw/ZTFDI24uTWFadTZSYS9LNj0tMnRyZTwsIUgqOTlHKnNkLXJiK3BjTy5uakRHZjEsSFlMcDZCdGAlU1M7TmI7akg0XDdCWUhLZXQvZFs8TmQ9TFAlKVwtOFglLEBfXFUsJ0QtanNFPnNJVkwncWZMZCU4VkcmQyJOR2ZEdTRmOHJPZ0pmbUw2X0JsZUkjOUNzNjteJG5hRWBRODE7ZCxSZCptTUh0RWJGPldxOTVqWWgrMyswV1ZXJUc0UzE8RiFmPCQhXWRAZS5gT2pfWj9tOT9hSWZuQ1hCRWdgVkQ6ayMsXl1rOFA2OC1VZWBjQj5Zb1duL1VJJ1ErNC5uREJcMCQvVTwyXlMtKUVlVUdeWCktYG10aGU7Xjs7VEBhOzNCJW1sWSJ1PDtdMTI/MHMxTG1pTjhTbyN1MzRpKSFgXWE9KGVIXmFoSzA9UnFITF5daT0zbW1QZkNoJVpxSjoqUG5AW1xrLTI+WVpVXEVoRjpsLV9JI0lYKlBmKT8rT1s8PittRHNBST8yY1lIPlhHSF5halIsTFZTJHQ4Mys7MmlVMTBzNmQoZ0xWclBXKEFZRVAxUGJNTD09UiI7KGA/X2xOVjVlXzBFT2wvWUNQaGpyalxhJWpiKFs8TUBvZChCIidedEQuR0k+JiJwI1lvV2UoQzRdcywuUicvNEMiJj0vIWI+JDRhb1NyIzU5YFc/IU1YV0BhJEAnMGFePTdqXCw3UjRcMTYzV3AnPCw6J0BXXSdEWlEsXjpWLF5URCRkYmhbUUJyVTtJTjteMiI0QEc+ZVkoOSMvb3I6T2kyOkVecHVRYSdtRWcwYWMnMls5SVZnbzZEbiYuYz1IMTZuIkBCTVQ5J1NuKitWIjw1M186XTBGXWJwdUxIKigmaT44KGdrRUxYZjFUODJZSzBmZSdYJXRMRjlAbCxJXE0wMzhIKTVPKSd0TDhzaW9KbU02dDxNQGJyP0YhJFxdZE1LRHFVTVAyOGFzcT46YXQ2WWcmJVRNSyxSb3BsJCwuQ0wrJG9cMi5FdWRxJ3ViKEVqXS8wZFM0Q0c0VihOckc3WVdMLidHNzwicU5WbTZOMiw5KTBiTSErO1xlY2wnLGFpUltHbCtvQ1FhQkNMP2QjW09Ec2NEPkhJIm9WKGVXNUFiZDFBOVxXOUJPPzlPMylDXik4YytDSTNkXHAtdS9KWltpLCZYJXBLIj8hTz1NIUQuM2gzbCI3O18/LFJrOVFwL2tmczgiJDpEci5vTVk5cXRrWksnKjJWNGd1c0pyXHRhM1lTMjlVZiRySV51OCFFUTk+b2JZLV8pKlBfMmR0bDhYXygzK0RYMUd0Xzk0W1lEJkdPZGg4SmlGOWZjcTBrPjRlai0iVGFdOjY9VlsqN1lISWAnZCRWUTwlSUQ6Z1c0OzZrNCdHMCxWMF9EWSY8Lz8/bzFUZFpjQTsuJGI5NjhOUENEcFdoLTBZNWFlWCZLX04ubj0vKFMnYWo5cFE/aUhhQlJPPUVtZTInUTspXlRaKjQsLlQ6YDBhWy0mJDdsMzcxJ1RGZyU+O0ZQUVVxbzBmW0ZeLXIoLmBoT2hQXylQSjIrdCc/N2FMSll0IWloJlZMKSQmMjFXOD03XWpuKCNGPE9TOW9AWSFQLTViKVlYLz0rcSZpJD1WJkZQW2ItdUtVYWdidEEmaydXZUMmKTFXOCUuYS1uTjRWV0dSODlFMSJcN3NRO1cxamNRLTI/azI6anVDKEFMIzNFXkdHZD80LDtsaTltXSQpRmgpYyxyTilBXGBpLCNpcmpeWXJKPjE4JE1aYEBBMEZiWjNqWDFwKTMuTmxyTVZ0czQvVkclZTM8LWIiKWlRYlpALU1LL0NvKXJxPSRaV3JhPFo2NSJzVUI5STsrRU8qcWNIcGdXbkVMOHV1KDxCPFxsRStHWytrYEZjQS1dMSVJO3AmYXM7SVxOVXBtIztlT0JTXVRoYz4nRClrQzMsZ1FJLWZGY1ZEI1AyNVNcRVAzZWA8dDVLLkI+cEpBZjA0PmtxcDM3WWZxN1s4bDFudSVeYVpBNCFsaU5AcmNKJnFDXT5HVUpzLFxhOSRhVDVHL2JLOFApSWVYVU9GbVhRSl9eVEwjVy1qZUVrbkNXMi9gLVYwLyRGZHBzRFgkL1xdLFhRSkwvKi1GZ3BVOWZlSyVcbS8hNyFvJihySGw/O0Q4JHFiJzBKIldwXjMhamhXUUBwU1lAXEc/R3UzIzA5PEc3XHQpbG9jVEJzWEcwX1lgUV4qVjhsWD0+NjYjZjZJNFdbaCRiSTFmKDM1YyVcKjJ0K29pS0MrZSxkaShbK3RhQFpGO1k6NzFldFckaltLKWFxbFwrbTFYV1JGQnBYMChISUwkKCpQOWAqJ2NMPiRLUXRbbGBdQjtWbGg0M3RMbDk1cm1xMXVdSTxRR2ppT1s4dTwsOS84O0pWI2c8Rk1qJkdGK0Y1ZFNUWkJgYkFfbk9pSmVTWVhnS3VUYj5iLmYtOEhbUCgnN3NndU4yJVsqUzVgSlZdRjpUXmc3WF40Qyg9JVpjQi1QKUpDP2xRYkF0ZTdIUm44Oi0ybl1qNCIxPmZQayorcFJpYVhBIkY4W2EuJTs6Kl5aXTg8ZzZvZiZVQzhEVmQuSV1MUnU5QjVmREUiRVNBSz5yUiNnbV4nPy9ZTzBJQWpdSFk8ZlM+LzdlQygqXV11K20xO2g6YzpmVD5jPzxkM1olTVQyN0JzLiM3ImJyPFl1OUgpc15QSXNYNzs5X2crJTc0JkBePGdIalwxQCVFJnRscihXNDljYERSX0VKXS1pXHFTRm1XLzZsaEwlMiVIVz1Cb0szL0dkJUwwJlI7KGUwcSE0JDcsb15dPkQhTlk7OElqYDQ3ajxVXDg0YF9TIXE7RDpzKm5WKkNzW244MGJkNzpeXi5LPz1zWHVvNlZpW2lTZkU9ITQjYDdvKX4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMzNyc6IGNsYXNzIFBERlN0cmVhbSANCiszMzcgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjU4OSA+Pg0KK3N0cmVhbQ0KK0diIi8pPyQiYy8mcS8pInJXPUtDQzwmZl4ldUYzXVBoUyQzazlkWlBYWmdqbEZwOS02I3FaSDshJTpBOXAiXWRCTU5Tczs7WEdhJFxSV1opT1Rfb0BPKXJUdSQtM1ssIXIiVyojbDJmKjRGXCotKz0rOHMkIj1nOmZrXjBHbS0wXlhtUGgnZCsyb0s2QmVrOHA0NGFSVCkpVHJZMTVwZyg2dUpTW0pRXl9UIVhkTmwzWjQiIlhKaW5OKVJzTks4JUBwNHJUR09GIk5fSGpwKlo4Vmt0TGxvclAhJjJyM1VCPicjbUY4bElbaUhnPGB1S01QZGNISisxSjkzXzZudEJcLENgb1pdJGoxVTpKKjopTDc5OGxtQGlTQkYhO15VSj9RcmZRWEhgTk9hTj5oQmVDLFw4OHBLYlxQcUJxaS1NYGRLa2YvKXM0TGdGJ2glIy9QXkxgRD9MKUc+RmklJyNtaz05SFpRUCJKM0M+IlVWKD8pVDpBXDNPdWBVV0VVbSJqSEpgJmRbI0RmYWRWPCszLTdIVlEtV2YrYyZfc2lSOHROLFdLTlE/OT5UWlwpXlE7MD1fVkslUDRhV1NPVEc6Jj8xTVVkQFIicS8uXDFVJDYpJWU3Y1B1Rjo9TCNxbUM1I29VPCwlYDY8JjJAMDxdU1hxVktBLV9CMmVBIy80QTJbR2dNOi47OjdVa25bMW81cnU9Uyhgc04vVGh1RUpwbF4sT2hWMk9CLmI0PyZTMT8wWzk1TFJELVgnLDk4Y1ViIzxLTU9yPEtfSyQvRVYwSGgnTkskPlJJZy5CRjFjYUIwOTU2VV1bT2gjKktLLkxBP3RBLXBjIyJqMiJBOXM7Xy50NE4zTWhHZixZMFcuKFM/Y1ciVFJdOXVrOzVsVTolM08jbitJNlE1VihoQCFbbCxidSRqL0J0NVMpdE4iVSV1KVY4ZjJyQ0FAXiQxVmU+PSM6RFFqPihnUlRpJDZjaHVmbCVYdXFAVEdiMD5zMCszakg9OzVhYWk8SyRLNWFUbjlSJj4hQWdQJEMrVjIzJTl1WjxkVjVhc1UlMklFaTlJMi4pXz1hT1FCRT0qQCNaaENYaVpOZDlPIVdbM1JfOjI/cFxIK1xhYk80XHFXcWo3STxfMmxrMmcsRSlyUjJkVWhYTk0iYylEZz82aGBeI3JKNj1eYSQ9LkZobDtxc28oWE5NIUNccmcuLkZYa01HVkdtLVwscEMtNXFcOiRnOzxXPkhaN1A2bmktJzM2NSxSdSI6OVpgW0EsTDdcKyhhTT9UJWxUYW9SSlxSJCFhMUMrXmBoL2Y+WipuaVxQKyMuWlspTVNhXiVHIlkyKlNYUkFNUCE+PGpqTWpEVUU9XlxYJStkW1YxR2JXPyhYOV9KZGpJbWg/OTBrZz51V00vSHU+QTZackNdZCtIOmVORFgqcUghdVJdcmpzXTAuXGQ7PG5lPy0rRWxqQ1JGQDRFO2RhYTpgdGU6TGRFNCwnXG9pakZvaVhSK0YkWk5xMUdXT0hQOU0mbVphZDdiVUNUcTphUVwsbzouNSxBU1xldFcuLXM0RlEkb0lXUGRuYE9LTWhHL1FgSzJOZltFR0kkXCNFODhoTm9pR11xVkJvVy86PiRkRi8iZEouQkxmN1M/I2JAPV84LlNOODtIWmlGSDEjWS4+TE1DJFpYUSxiQFgiImY5UU4vTGY9THBMRTE+OTopLD8xX2lEJVwyZDVlbyNZXSJnMjxjb2pxXFVqZWZqLjJrTmZGTWZSNVhZKExrRm4+IVRNU2xJIlpXTDRVMFY1WiQsRzU4b0cua1xcOycwTCJmXFsvJyQ2VGtoT11SZnBmSVxeTiQsWi8ibEJuLzAkJVdMQEMqYzwoSnI8IUJCK2tmK0U4W3AoVWFbXyF0aDUsNXIqJyo8YF9Oai8qWUtqOmJZYSppclFIaCNOLEFXMmlYJkA6J0hDblllOy0iaUdjY0leZSloYTcqPCgvNjBgXz0iKUNiVVRTW0VjZ19DOSY3SEYyaWQzZWcoYSFTazZjLzJPPCNlUT9tal9BOnVpOjslXXI8IUgvMz9mLlktR1pyX2RcPyNLWVFIcG5YL25xYD9pYiFCSUFwJyo0WW1qXVgrNUZaLD5BL1U8WyhnWFklKF8ta2pmOXJJLHBGIUtyZTZibyQlPmheb1NPKTFbTjxjcUg/O1cmJlwmZGhuIVtvSltkXVttRVhLNCkhVkMjMTZNRy85ViJpZUAtLERNNiJrcmAnN0RMZV4iamRvXzdHNk8yWF9PcDF0Z0REYDZic2JZTWw1VigqOkkuSF8jXE0oVlUqSEVdWStmZUBdSE1JOi5GYztNOTE0MGJSY3RwUS8xUF04YUtmQHFRLik9OWdOdCp0S3MrbTRbNGhuYDRcSjRBPUZSTlhcLl0vLWRqNSZbO09pVGFXJz0rbzIrVUtdIi9Qbmp0OGMpQkRKNU80cWlIQDclbCllJzNEX0Y+VV9gRD9mPklFRCJtNiVVLkAlT1hkMW4iLzRkMilqIVhGRGA5Nl1xLWdhODkwMHVkU1lvbzRJV0tPXUtTbmRZLGNVXSVBaEcuZUBlJ1ReSkBbRyI3XlI7QUBcR2VoVE1ocGJHN10iT0AnSi5SXyFEN0YpX1FeLD5BNTYkalAoRS5cXWRIbSFZNGpHOj1fUDhsQGJyRC1fSiYqczdcL1AtQzhjU2VXMjlMXSJXOjgzMydfPEskaVRfYFZOO2NaKE11JmM1YDZzIWcwTSE2OCkmZkY5bGpWaCMlYlVqZGgkbmlBPF9haDQ3NDsrWE0nWjtLQCsubzduXE4oRVw1KE1wPHJKWDlJXzhpQGw+PTVfWEVJXyFUWS9TX3U/ZSVuRyJwVm1xTGxybnEmRCYqJ0c9cCZFODkrTyZgWF5CaGFJaiFMZDNsP0JxMkooTEMhLyZaMzJfL2ZrXlpzW29nPS0xaUpbLDtjJWFTJlQ4bFNJVEo8dXFANyU8TmlrXS5jNUA7WDNqc2lJLF1vMyNrLCIoZCpOPDgpdV1OTy42Ti9maV1wZ1wvP1JAJzQpZlE5REIpRmhuP19nRC9nKzdrSW9GRF51Pi5nRSdFVz1CVic3P1dgLU0sbVBzOyZyTCIrZD5WOzZuVEZmaStScUVpZW4yKjVFaVFtPkFrdDZoV1BsbSs3ODVZMlhcWFBUXGwhS2QlcXVfcEdJZz9PRTZoITZsNGJnMVpabmVVMXFjRURdJE03aUlJYkFQNDswYDA2bVprJUEjV3QpXkQ1WzBkTzBgJmdXT11SJjNCKmdWQzNTRXAmPiElMWdvK2habSo9dGBdXDc3aTQmJm0iPTRzMylVamY2dW4hcVpeI0lubyslWy0yJVtmWWJUJzI0a1hMOFJYVSY4SERdL0ZcLS9pI0Fga1VAPClaSzhcXS0janFxQms1TEBFKyokSzYjQzYxLCs3L1ZFJTB+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMzgnOiBjbGFzcyBQREZTdHJlYW0gDQorMzM4IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI0MzcgPj4NCitzdHJlYW0NCitHYiE7ZD8kImMxJ24rRCVya2s5aEdybGNtO1ckbCpAbGtXKmYxQGt1XSdWPiZKNE41Si9rSV9zLidOTDVIUzdvVlBVL0RVZiVFZzwqYTloRk11Lk1eXEhgUDlNYSlkaSlsM1A8QjVtQWZKMDlOdSFlTlclX3NBYlxSRCIiPGBWZyJraitCT0srV0NsMGMtR3ReM15KMVJOT2xlRyo1TU5yKE1NPmAmTVVqVUBjUURJQW5nb1FwUmtlXkNkP2B1aDJibVo9WVRnVUIidTRMMEAjOURoPSReLF9wOGlWKU1TLW5cQ0MjQ11DaGwmb242VD9xYGZEZWx1T2ohM1MyP1VCKmUudGRyWWU4IUlVSUVZUjRqJWFMMEE7ZWZxRilcOnBVMUt0JSdjVi4kPixbbUU8QVIwUkhCWGhXbnRYUz51N1wyMEo9I0lPT1E3PjltT0wsK2xAL1BcalNoUT5iNEhQMlhWIzZQOywhdVw/YilfY05dWzdcQ21bMlkuO2NmTmAvcipHO2hOIS4zWTpJTCgqaiZXMihedG4rZTVcPGtrYCFBbyRmMXM2SDFXXWIlVCRBV0ckc1tQZ1s0bkspIWZZM1pkZDZROUUvUVM/ciNXKEkpYDo/ams5MC8hZ1pQPXJUbidqXTBMKzdNSytmMk9mR2Y6UykwLCZnQSs/RDJRakhRTjFrWlVmT046XDBLWCE6JCErZWddTTNTaGdGRUQ5a0Raa11yITlrQSlJYCxYJiZpcjFda20qdWZWLjU5Rm1eViQ7WkpIXGFKcENkNXFZJ2xjVDxALy9xY1NPaWxvKUFCKjM7XFBUdCwkYiQqY2ZcbjBbSEBTTWEoUzZcKidILl8kXUJdWGI/XE5XbSFuRC9mMSwnOCwlUyNydTZEaXUoVCQxPkgtWWQuO0ooUCM2JF1dOTkmXilzZW5BRGlKcmkoNSxGTkJvTiYmJTU1JWkuaUNecUg+cl09ZW1QSERNYF86RSdFRVNhLj0zV0YmMlZZcGZyOEkvcE81PnM0LEk0RmxrV2puX3MxIjJyS0pDNmBqUFlLVlVCP2lsP21GOEAiMyt1LVFVNS9yST8nTzRdYz9GSjVtMzhwXDNPdV9wLGxDOGhHR2puSTNxRjx0WCxzcjx1SyxrcDg2YWdQTUVqQzg/UilMaj83dFYpYSQ1WVxOVFApQ25PTF9Obz9ZZm9sI0snKkQrK04xOD0kWDY5LiZcXTBjLTJyNktNMkB1PTtNIlZbXUBHQmElJywzYGBgb2U6UiU2bSVJYC5pNmJNclwzdTxKMCNKSkQ7cCZYblUySytcQGJENkozXVYmNldeSS82QVwmYUMubFVaL1VPJGZUbShDXTVcbVI+IUY6YD1vMk0yIzp0LDIpJDhBMG9TO0pzKm5VUW9vOTMlLnApdEI5SSlmOj9oc0spXEs1NT9iPmNCOCEsY3JmLGVvKDMkJ0BwcW4uWlxeYjBPWzg6bVgtREteIWFZXWU4US1xKycvV0paJE09OWU8clMvQDY8Rig0RnIzKl9wNGdHV2k8dHE6QFJWISxuazkpZVtvPGtWbGkvOGkpTzorMGddJXIxViZTWjghcEsqO1JrI045Sm85Yi9OMEckSChOc1NOXiw7O050PXQ7cTgvRiJTRWQ8bFM0NmU/JUEjVjttK1U8PVFoLjdAUiFRWSkpaC1nVWdMZ1AtTl5zOjFHXkJGRVBNY191OkFoVThkQk1MPENwLzQ/WUREazVVWi5gRypwT2VKRGNgQjA3ME9ENiRiJFpjOTlsOUQtZSdFYEwmZVI+M2tjdERDNkEiQ0c0VUFXLGpzOUEmNDJHRCMqRTIjXGohZnNIQFZndEYxdCVxWFgtSWVxSmdnT2U4ZlxbRzZxRioqIjc5Pjg8XVo6WVlDVDkwNm1qJ0FdYldnalpOQjZmVCY2KU5FLjZIVUxOOHBBalBjWDRDQDpsVmEuUywtdS8yXUslN3FFQlZ1LzYrSlInMCokQGAtYTBRR0lqTUFMViRiM10jJ1dFMGg1KmpzKVUzNkFQPTBvIiVqLUI5QG8pOjF0YmsyMDlDMi5fXEVSaVxsYGwhST5VQXNAIlFeUCpATWBgWlpbQjBmPVdJWFAxamY+TkE+LHA5W05iIV1yZ1ZdbFpQPVVVOmwqQm5mblZXUUdKP1dtMDIwaz0sYixRb1FTWFJtTWREdXJlLFhkLUxwJXQiJiJbM1phLTduOmQsWT0sOz5wbi9rODxtbSlkOSE4MFdKKDY/QyIzL1E6TVMvQkYycCg2MkNGP2BNTFNvW0BjX1E4Q0cyO1ZoaDJHdWU/aydMKjJ0ZDg7TmpAYm5tXVdsb25QJVsuMmguWkc0bnRtTW1ZWExbOF9lJ21lLEZSZVYlOTpNXXRgc20oJWFBaDNuVzlsOCwhYzcndCo5VTZfOXBlODF1NyttYVk4MlwwMmUqTSIscWhcZlxVOzdTW2cwJmMiaVFwRGxuYG0pYTtONFU3PTRKJidsT2AwOm1CO0FvajMsS1krVWg/LXBIXD8rNXBDOz4+Uk5OXm4/ME91WFNpUXJCSl42ITgoXTQ9bFljdUxlWTk1ckRSUUhkKCVqQC1FJkxpXTVQY0poLmVNMzJQRFAtVyJocyZYLyRdWjlcZi1vRlVfTkU6J1tHSGBBVjBxXmtPIlhqTmFIW25mRzRCbDRfQyRiWydVO0lcOWE2U00jdSYrZUNUSWFwaW5Ia09lTj5YKj5qNGFpQzxbVyc9XlJudUg+U01jbjZsK2ZrM0RwJD8iX0g+Vm1mPFVfTjdDWj9sKk47aG5FMFw/TjhoM1c9a3MqRyxFRG06bWA+WTsyKCREITs4YS9ZPXVjXipZIm1pSnFsIlowWDQpOW1pQzZcTDhWWmZsNnRIJydbX2ZuXUY6dS5pMiQuZ2EiLilecnE0TiNiTUpzdFc6ZFI4MUdRU1tYbmZOb1tJdWE7cl1jQ2spPlxZWmJyYjAjZG5DU2RkbUA2QzRhOUtQZUZQPWs8LC9NMk4nT3IqTGZDKTUqRyIiKkFdOGsvYytvQjJQXj9OKW05UTZtOWcrWjo3OTYlT1ciTi0iLmAiRGhtdEw3MGhYT0doX1dLcyU2PFQpWFFVMl1FPVNFUWw/XWVwPDlsdVxyWGQ9a3QlaXAhKypqUT1kYWxZPWtcLC1laC1PKiIkMnMkTmo8S1pqUic1UE85ZidFYWQrYVAyZFImJklIYCVRMlthbXNZY0hqVW5gbyM6Vi8vYzgkSX4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjMzOSc6IGNsYXNzIFBERlN0cmVhbSANCiszMzkgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjYyOSA+Pg0KK3N0cmVhbQ0KK0diITtmPkJBT1coNE9TJ3JraiNHM3RmQ2xgSTFbJFgqI0BDRFBYWXE9bk1lQitVSlRyK1hlbDtwTmxtdCdQMVFEQz8vWklJJDctUjM5VTFhJ24/YzRJZC0uLCpzJGEvX2hYb3FcY0xoP2tTQ0YyciFCT0huKSZPcGh0bTFoZ0IsODhZKVFyIlkzWEhgYkE1Jkg5XGxwXXE+TURLWzxiLmVHZy5PX2ErZVRAcllPYVpaYiIpQGRxXC51Um1CUj0vbiJTZk4uNF9McjMhY0tRUUxbKy5abkxLLV0rWWQoISJyQWEhQ3VzSk5IPy1oTjUmdEpCSzNxKCw+UHRjQkQ/TSZVJUFWYShrXzQrZWElPmteIT1CWUxrKW8pPVQkYD1pQj00TzsxNyJJL2EhLCRAKG9tTWd0aF40SlQxTikxUTA3Y28/UTdLZiFFQ2JcN2hEQnVYUExBOz47Xzhgc3U5M09wOE8xVz5bYXFeLiI+QDIyPihFYjY6bGMtXzVtYz01YC1eUkFac0JbOigzITQ8X0lTY2w1YG0sM2xLNyFEb19SJDs+TTdFJUFySVhfO0wjMkxRJUJuSmMoXThuLippOTgrQVQ/OFotTjpvNSQ7ZHNbW05sSy48UlVpc145cDFlZzQ8UHI7LGJGaWRBTWRhYm8hME49OkZaKiglKmU/a1NUOippYCZUU0FkWVFbV3J1N042PjhsUGokc3REUC8hNy9PPU0vSXVSOVpoIztpMCVVTHVuNFIrO01aazs0ZTM3VXBzZCE4L0BXPjZsLTlAXGxZaiRHQjo+STNGUGpwLyZzZ3VmciMkMTdGcVZEVDtNNihBPDlLSTQ8IV42VlZIJFZuUV5PV109SyUtUTlsX2QhWmpAJVhBK200OVU9cy1ccjRYTCJMOVJeXDs9V1A3LiRyY141U102LUgmVStkY2UvO1VxUW5qJEgsZlgxSkcpQ1VxZ1FwI0RqcyNacTFNayNBaE9tJHUkNSYibVk3J1NHQDREYiFIWGdvRCpKS2VMRmVDLWUzal9uWWdaTkIwPCpOST9yck5UN2ZAdUJUbj8xJnVCbHVqLWJNZUtvT2tFViojM0hyLDFkMSZGNWg1QkFLakVaWSdkIVRxW0QvW2NdTEBtRlM8NGEiPlAjW2FEYStiJzFVK2VWQysiWTtbXEY5XG8jO0QpP0lFMmx1XXAibGw5MU5iPmZKZzMyPldQTV8yV01QWzA3YjFeJnNET0dGcWMpWz9oVkRCJ207Rz5NIjxdIik5XTNsZC9MTjpVMSE6QVZ1W0g8JiI4VTlrXmtcVy0qM2RJZC8sTjx1VGVqMTE7NGMnImhUSzFobD0mWyxFP0NwZk1oYkFdJkEoLFFxRE5TZ1JoMGw/JFc0XT07R3QpamQyPWg5NFNQUGsxbWZCSmtvL04wIkJsPnA7Tk5VUWBLXjZAKGloTGJzXG9IOytKajhxWj1ncjZXMzxxWS9GdG03MT1TRTFYTFUpX2ssTCo2JlQlcEV1T1BSVjU9RHA2WiRRbHU0XEtqUjFtJFxdaD5fWUwqPDFRdSQtOFVbPUVCMzIhamEjNz0iXkxpRSxLaishLGxvNzg2KnNpSW5AVWZgZiNxaz8jQExZJCxbSWxhMTtkKSJVdTFZT2NmYVNKbjImJ25lYEsmZUw+MixabzRaWyZMPU07VWs6WGxRQFBpal5uSVRfKj5RSzhLNEIuXzVqUkcwLjFoLihFSDByMSIuJmYjciZtYDlVZjJbKkU7ZmxsYWs1cCNgRDJwZSZUVlA8I19dSl0iYCZlJiZLLTkpTTkoXDBFR1EzOC5bMGpQPlQtb29MT3A8T0NvYENHNmFVN15SXWJxPG8+XTcvVEYpcyY0clBuWyRqaCw3V2Iqc0dsWyZrSi5HRFRycz5wLC1DMEoyOWRvZD5hNTVzNFZXO0pON1c8b0E5QTtCYFAnPTBoaztMWUpMZF9LdEllZEY7UGU5YXRBY2NAJ1QjckgpOVBqIygtPjI3Kj9mOU5pQSFEXElzO1ZBWGA6ZTs6NEZnSXU/TUYzW0Q9Zis+UU9PTyonN2BNSWEhcSxLWE9NNmk3ODNRc0hEQ2hHJyslP2xoQlxuSDJKU0xvVVIkbV1KWDZUUi1xTjdyb11EQHNkNzkpKzYiV3FuOSdAQlgjSm1XO0M2cCNCVFZHS0VoRVhDb091QjQsZlRMOERZNFtiNTNHNipbJGEidTFzO21kQ0ghZ3Uhb0NdYUBnJSciTk80Rk8raXFSYCdNP1woMFcyQmYnYjY/PHVmbWIxbT01USguXnRiRXRoYT1EY2ZXODFTQjhwLVJhbGpKLzJmWEYrSyFvaWtxTSUrImJMbidvaylKcV49bk1xTTBVblVcUjUvXkddJkZTRydobyhONT46blpFTCJYWFdDR2JAJD0kYWVeVm9UUCpMNT5pLWEuSypVa0lOQWVKZVIkXGxqc091ODJrT1VZTzVIcmVZI2AiXTQnTHJPPDVpTmpAYz5ZYFknTWZGOWM7NCo3TW08XGJMKmtaVU8rbFU8Y189ZT9VaWw2amVbTz1VUmU8dGw1ZG1WY1JpQmRgaSomc19QYkRfW2BMclgxNGVMMTpTQzw7RFxrKjswdUpVPmZKLVdUIWQmS1shaSo1c25IWSImND4lJTEwWWI9YmZuLGFNPj1RQVFFXVc6PVkhWyRdaDIyY0BAP0o5TjMnUVxyIiVFSSNkQWxDImohRGhbcClia1BqPT4qTUxBJTFDazMiJ2BYQyFUKSolT14rQG4lJTNwOCJXanFIKk5nTCI7Nj8sIWBnZUQ9NiZma0Y/JyotUWQrQUxyLCdccic8TFdMMjpDV2ddX00/PkZedTJLaUozSG0tJCkyKkJWbW9OO2VlKC9qWj5hW1ItJXFmU19RYEtwVT9YNy5qTWZKNjYsSDIiMCFYR0Frc0ZiOE0uLC5bJSMrSDI7NSkwPE5Ua1t1QGtWJS1lWkYmclY3Lj4mYXFZWisydTRXSSFKPlNQQSUuYSNtTm5FNiVOXFAncXNVXExHSGFUIStTVUNEblNSanVNR0pKUmBnK1tzS01yQE88T15QMltgbSxpbkJbMTg7OFkhN006Kzs3WERgQ3NmMUY3cUhLL1xaaC8kKSY5XU48Nlw5PyciK2kjNmRwTDJpOyFXJS07cS1QTDtuZyIkYSt0VTNNQCgpQ0g1SHItaiMpNmRvRE5kMUE2LjRaYmhZb1Y2QChPXj4/QjgwO0pEMShVIWYlPyUpLS0/U2FBP2JqXitoZkY3SEAhbUNOWGV1OmdBcWclPStGRmBFdThoWjYhVlhwJ0xWaFIpREROTEgzPC08ckc9SzFdSzZDKWZDPWpyPSIxZzpeTUAvPlw7S08tODkoJ1ZSWCZUKzdlU1JBTlgrcm4zXywjajkkNzxmVkAuMTVRQVg/Wk5COkcvKjJtWCIlKiNtWUg+YjkkU24oKVc9P1RbQ19OOiRGTCJjXWplW0BebkNwJCt0Y14/XWwyOS5Lfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzQwJzogY2xhc3MgUERGU3RyZWFtIA0KKzM0MCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAzMTcyID4+DQorc3RyZWFtDQorR2IhO2ZEL1wvZycpbDQxcyswQyNFdD0sWVAzcG80cWlqZ0RoO0kiYWdVSUVFYyhealcuZCFsYlc/Z1REcFpsYTAtcWEmNy9ARmA5TVsjMDlRZjdHJVtxQ0hoPVdkWT1vUkZBWW0sb2hwbC1hM25ebnJqWExZZStlP2FFaF9rS2dsaE8nYig3KVI6TFRgWm9fQG1DTFcoSTxXcFRwQlEuJEBlXDNASl5pcmtoaCxdU0RmUlVCZG1hJ1tYRltGNF1iKW1PVmdtdWxvbiowOTJaOGg2cyUrXjw3Uig4OExZayFJKVotRVIwKTE1dF49T0c5OkY7OXI5KTNtUkhvZV1OU1RwPzxXRTgjQkNoYTBTSEwuLlRLXTtoPypTMiNnM1UpYVtHK11sUlxAJG1dbiInNSpAKGQrRSklJV0sR3A0IkoyO0g4KGVhMkdNbE9VMFBRcVlEbkxdbGEzJCpLOnUqbTQsOEtzXUdWYG1dYVczVyU8Ti5UVFxlZWZYTTlmb0REZWVGN19ZM1FYVSo3LShUPEFMVEVWXzZhPzU9XFBHNFgoSVtcUj9nPXBDSnM9JT9pOnJDaSEnPCowYVlUMXIoXnEmNl1vNmg7R3RgaCVWXEVhT2FqKFU3ZSclL14zUy4nSEgwPkElPGxMU2YkXE1bUWcuaUU7N1tCTjxrL1dhUCxxY1o2KFozYkInOyteVTVrVG5fRHFzXDFXPlphNyltKHBOSi51by5UcEpARzB0PVInQSw0aG8pdGtQPFBBK18zVUBncFQ8OT1YRCM1N1hOcGo3SWtULSEqa09VUiQmKmpPMTU1PVFGa05jV3JAb2tEP0xpcylEMEJ0XkotLWEyLmoiTk5iR1VKUixDXUVOOUhUamssV2Y/SlxkQ10obEBvPGRvZ1BtbzpLW3AuPHEvQS0kRjIjIihsNz1AaSs6JypHT1tPLyo9TVBeM05wI3QhLGpnZl5CSk1YMCpeO0QyVjFUQDY2OilTZW42JjNTPlFJWlRhYz5DNC8wS1IxMlVHVEMyUWtbIiMwQjllakFdYFs4QkUuYF1CcW9IOTZDYTVWJD9OYyw/W3RZRGRUci5IUTQkSilGJCI0PU5VcDgocV9DTDVtMiIyPyFMXzw8b1VyTzFdZjNRT2RlP2xCLlFJYWg3ZnRMZE41PnBlLz4zclRLYVN0PyRITj1mcDVaVGQiNnI6M1RXU0xfWGlva2VFTiVeKzUnUE8rJ0hHczNNV1xGcDNPa24hXDFUZHBOKWFRWmtSZUBiJTBRbmdjWzE4SGAmIjRNWWhJblRlZGJoPEVKS2Mpa0tAdFNqVm44JCdAUTtcV2JgNGlNPGQoU1AkRi0hLU09LjEnVz4sVWwhSSxFJlY4L2piTzA+PjhlcEEsMz8tNi5zQGNoWExzQWIqM009c0lfJExZVy1YZjZjWWU0MXI5IWs4ZWBYN0xkcWE5KiFHKWQpWUlxQzpWPGJWRllBZSE5Uy51NnImKFs7UnBEbSg4XyRBVy1oUWNHNjpEIk0rXiEyQEY1bHJyY1RLPkNxMWg2dCNNJ0MpLUlbVi4rQTssPChWRStbVFAma1BCYU1dJmNpbUI5LEhKcm0/IjMyVmpccTBzUSY/MkM2ODRJNCFgYGRvaStIMVtBWkdZbk4lQ0lRSGMpQkYzZmNOQzhlKERRbyFmcFYicCYkakMxbjRzYTsxXDErTS0+ISdtME0rIj0xXjJdaUNTIWVeXFhYPmQ6I046bld1JjVpMyYlPmI1Tylib1UyT0gqTkpmZShqQFQlSz4nOWhFaUBcbFRSLGk8I1wqSVdlbk1UXDxAc1ZwSCcmcy9XWihRcG0rbXJJVkBNR2VIXCozWFZwOSluQFkkSjJKdFIvc2IjakJwNGVQR0osZDBncDQtbkwsSl9oN09caDhIYWlROFx1ZmZmdSFgYHJnN2NuaCY0KWYnTzNQc1IrI2AiTDRkTjJecy5EYyZcTiJkTTZRZVpqTkwqVnRFJ0ZtcThvPTo/U1twX2xLREZsLHBZPnIhNCk2NFxrcD9aS2hrSklBLSVbWDEmcERhU3NdVGgmQl9JS1FEXmo0XFtubUlCVDxzOE1DbFZXPDZDRl9UZC03JT01ayE0KTZNYHRoUlA5RUNlQzpkSWxhXEE4TDAjMzYrX0AlSlRwTms6UTVpNWdwS09zSVprbT5KcWtJKnMvQWRUMUElcGNba2RBJWZcWVZsVEtCTytWZWUyS2RgVFlYJThvOionYj1BMSNZXjxHI29uMjVAXkdnMlFaZl1QKid1OT9ATTcwR0tAPyk9XjNCVz0sOjVlSDcnX1ZLbFRmP1FNKShEamJQb01HNjg3YDg2cSRRSl8xZSJQLWs5OWxlQG02O2ImciYlYlFEJiJDRD5oZElNLzsvTyUuUkkqb0BJc00jRUFcbWxjKVs9TS5fZ1RiIyRQbzhMazpyIWxoNmhwbDRST1A1YkBCY2AlYVJZVileVzM0NjYjMy5XI01aYkEvVVBEN2QhMiMsUmJdajF1NT1jQjQoXDlLdDRFM1lBPGFkcC4/c0RldHI6PlFnRF8zNDdAX0YnZTBvWlApJyMkVCYmWlIlIioyaDc7Rz8pUG9qJlBdQlBAY3BOKEs3N2FPVyZmWUtMLloqPG47cWdDNjJvciIqKXI+TVM0cEpNQSxubTZFYFAxYy8yJVZgc11DPl10Wk88JykrOiRCJChwNExZZW8pRyozMmVrcEJcblJpYCNqcS5JYCF1REdeZiInV0M7QTo1SF1fc3BURiJwYUxDX1E0KThcSXArRyZRbThgUl9qWj9RX1VdND9wQDYiMVk5TCJNIlpFPjtRO1orbmpoQGZqXStTUCMuczcnISIsQD45byU/PWhmKy5DMj8uaEg6cFZHVEFpNj91a2E5aS5uNCM4R3NMKU5obm4vYilxV1A/alsyWGVzYEVyJGFUS1JsYjpgZWxQOGRdOHNoMUdkTVZsMjY6P3BFW0UwKmdyJG4pQ0RrN3EyT2EqVUdhaFZcNkQhWWQ4PypnVW9ZSltzaE5dUzYhNTR1UGs5ak0mM1E2dTBbYCwmSWw3OT8lWiVFaTddN1VTNy8wPUUhQkYtYDU+ZmExUFRcWUpuNGNcO09PZUBCcidWTmI1LDUjN2UpRVJwQGxFTFRxY2k8TWdTKDhRQWJqRCUpP1smISVAL2kqWlkobi1dPWRHJjhfQ29uIVBcOVNYdDApUV8iQjwyZzllK3I/OEkzJlVrY1N0PTZMYkBGWzZJL1lkOzgjMk1nWGVyRkVwdGRXQmE2YzorYVpEaEdcPmQ8RFBqVSEqImZGP0JFNGZeTVAxdGktXSZkdDM5LWMkKzwpb3MsZUdfUz9eXVhkMEk/bTNaZGxGZkFPXjRjWkxILj83Zjw1amJJUTFcJUtLR3I+LTYvK2BKKCZYNU4jSCRiQVRUTDRxaFh0NzJZKi9hYS44bmtzVVJtKVYsYDRGYDx0Z24hamtXXylJVi01bVItdWs+XGlNaGZAKjRHUlU+QWwoXT1bNDVdYUZYOTJGdW1LJ2FrLyJBdWAuQSJqc1c0YV00aENdT25bLVxvaU5hK1FAUl5II1AzXUdOKW9EZVpEJWVPX24sKT8tQUEwVDlVPm1PZ1RvR25kM2EyLV9yQmVbVm1cZjtcVD9eQCJaK3A4Qkk/VkhUbmQzQCpkJU5dbkg1NTFkKzVVRj5nS0hNbmpiQVowUE4pSzE6VzVQRFtwcTskTTQ0bjAhN0E9WSdFJSYpZVspWks9Kyg1XV9gJEU9TzhkPGsiNkVQTzxYb1RUPURlVDIsPTMuVj1JQSU9aCZEQmk0P3FIdURmay5QVXFxQkpjTnBYWG8ubjYhcVUnaG9eX2FBO01EWzZXPGBpOWBOIkI9ST87SXVPRXJpaEYhPSwkSiRjI0ZPVGY6Nk9gLTZPJXRFOG1GS2xxQ21wKTtba2xlWzxZaWBhYStrRDBiP1xbZ0dEI11LK1pDXy9LIjNNNUZxQD5sNGlcUC1DbVNTQidiJ3JvUDElMzxONTAtcVNOXFNBaFJEOSQ2VklHMDZBMVhhVEItcUdvcFBjZE9dXV1nPCdeRShEP1Y3NkBOKGM0b2dVPGtETjghRmBTRylWLzxCZkpqVDYxOjkrRVRwSTBMbWgnQjQnMkhzPl5dRV81RUF0P102Xi8jImpiWyk7LjdYJmUvKlYmVURMJEk0UjtpKyxxQFcxLmNfKC5ITVFVUiJ+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzNDEnOiBjbGFzcyBQREZTdHJlYW0gDQorMzQxIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI3MzQgPj4NCitzdHJlYW0NCitHYiEjXUNNdDAkJylgam9zKy83WC5ZWVJgbD1tI2NTQ2hOWGpPSUFLbTAqbjRlMU4mUGZkMm4wPSxRaz9taHAvVlgtWmkuRUElQTRbT2EoZV9gO0BBYzs2NjJqIiM6O1BGU25FLFBMLD5iaTAqTzlqJDIvSD5ONT5oMklwaHE8R11TbExCPWFGWlJwU08jN21GYTZZbnVtbVktOzJ0JD1rbyckZmlYZTFDb11Ka2QlIyg4RFBYJDxpb201ZzQmWnUrUUcnaVddS2A2Wy0jMC9pW1tcYVs2LnJZZixAXj9zPCVtUkc2Q0ZORCNmMTViKjpdTSNYZE42Z1w/TUhTMU5LaVtucF9Acm9HL0UrLGZcRzpoUUZNWGIuUUUqRUQwc006SWZwT0lqMVI7ZmRwRl1wU0FrSDk+YjUjOVlRTFdEZ00sJFphTDhCSy1JPS1ZcFpZW2pMMDhBUjdYO0VJb04vXjczPHBTRmxJaENwJDdgTCpRJDk4bDlGPEhnO0U/JycqJXVLPHEwNl5raGtUKEsyQ1UmdFg/byI/ZStyQUNCLyUlLyFoPDNOKS5uJCwwOSleQ1o9IjBWUUwiSGQpYmgvRiUjZCJnRjt0dT82OVZgOk03PkozOzQqMyUmS00zRScoVShHWm8rbkRCPixLXSsoWzcpISwnckAkTUVWNk5gaVdHOVwmRk1oKVpWMzQlXlQnMFU8JEA8RVxKLWEyPT8kUGkzbjtNcDtTYVZyQSFWbipTISY9Oy5FbGBEOTFaYTBidVJaJjw2YWAlUmdeNUAnP3FAXmczKSljSWVnXV5BZm1laWVRdExYTXUkOVZjQ2VIIWMmMkckMjB1LjNbOEdTXXQ7a09vQSddM0lsIVdOJUVlcSFGLWVqVVhJWSxBZkQrcDhwZEshVWotRTglUWxfJl5OPFtnbGdkbltQb0A9bC9SRD1FWUlnbUVha3A8YlxdJTFqMzJOZEswazwlN14/LVMnYCtkcUJpLE0yMipESD5iVlcjI1ZFNTg1bGtsIkUkUV9wM0pXUy9wTSFtQVBBKlBCZElsPEpCJ0s7JF5LRVEiNjYmbzBPOmFsY19eUig8P3NMSCJgJDZURjY9QEJlMm4nUXN0I2BWRU9TLiVYOTFxaTZHNTA3c1osTj1VPVxhPV4rPGxYM2tlNy82cEoqa0dUbmAxaStNRSdZVktTJEhHbFhrSjhTYHIlZmdAPERSVHVpckxWRWklZ3EhU2ZDcCwjcD1ZP1BCYUdHO2lpcE9gbWgwVW9oJ29fLW43U0g+O3UsMiVoJjFkRC9CWzJVPkdIZz9HTXQ8PExHUytkUyMuLV9KZFNLSmtOYFNiampLV3BHdTFHMF9zYi1oPHRlKjAob1soRnU2aU9IM3QrVU1kYC5WJ3FtTmE/a0JTZSwxZ2R1PUVKPiRKTERXL0NPNlUlM3JgIk8xODtMOGNHWCFnYk5PKFgvJ19Kc1AwIjgiVSlHLik5JyRYWUhpXTA5MkBzPWUraGo4SkU7cVtXJXEqTThgKUA8ck9XcV81VCZOJVJTJEheVGtaZXNHKyZTMXVsYW1DX2soVEMqQjBEaCJdbzBUbG8ldSdVSy4kcEdVbHAia0loKzJZclUoIWs0cEVZTWlUYGpjQVhWSGYpMCtqIWgrTkAuNkFbQSpia08uMlBwMFVDNyVtJDJjPFY/MV9EdEJwPD5KRmAlQCVXbUxvNzRvbSkpYCg8XShhRWUjPmtFSFM3OWw9ZDgsdFkqQzYhLjNcPVsyJSNwSUk5KFhTPjpbayYnKmtaUzM+TFpKZlVAUlszP19mPVNYaSRBOkFqLFJkcjBTQFBaSHJUU2AuXExqQkltTjIsJzY4IjpScjZqX0w8PywjYDNNN1JrKGFMTltlWVBfbyhTIloxaU4yMjlESWohMzshPzlHOyc1KUw2aS5oMGVqJ0pNYCUkWlc/Z11gJTY4a0k5J3QuL2BvQSUsUGJNSnNxY3FcIjFWaWwvNEZjTHMnaXI7V1Z0LyUkY2srTDpjTVNHdV0pO1l1JyhZZi1mW3A9bC9WTGlHTGhGM2lGSz4+RzJbOFAxKzxAPl9pU2Q3KjA4YThhNT1TOWFyOiZGOlBRYjNGQj1tIiNDKVBOc3BmQGpNY1JYUjdVVV9wXUlaP2NebyVTVDo1Ym9gdVpeSVRtJ3JdLEU3dCFBUDBJO2xfVmBcTFhQPm1fKDdeaSlibDs5PD5ucSVlKm8zIUprXEtOaXNZJTFSOCokNyclUlVbQU4/MiZQZWVbUT5IKE4yT0QuOjdUOF4rKip1K20iMGM5TyZKL0wiSnJqWVpRcU4iNTNtYlExVWRGPGVsSGlJXXVLLGpWXC1rWUBjYEIrW0RDK3MsKzgyInQvKFtrViNkYCE7Uz8kPC80a2ZFdDspPU4kUTZKSmZnVVY2PTMxX3VIJmRbZzcmJD0mO0VuXilDXzU+cEFhYiVgZXJkdW9hWCMuKEdsa0lQYiZoTyReUEtVM1EnXmg6NmNAQy4hPkRwUl1xUyNzKWBnXiM1Ylk6KlJtVigwNlJJcSRhW0FvI2Z0S21dZlNdJigoUyQrYVYnQV0+WkhYKmd1TC8nRmFiNkdtWWhyIl9UMm5cZT1ORTZfcjFQS0tIc0VwKXV1IWEtb180a1tDVWdGbVRhPm5Ocms+VC4/RGQ9ND9uKTtZNDlvPmcoV2UsLTJUSik2MkxJKEsxSUFyZE0nUVsjMDtnMlY1ZSpjLlFJNzA2MjJLJG0qPjtQTylBUEtROXI9JUM6ZjI2PkFtZUZzRDhbVHE2IzciOzl1SFNlKFpqbVdMQGtqI29oMnE9b2wuJihkU0AsKlw5MEwvdC5LbzhKOlsnTnMrRio5Jkg7QFY0aChHczJHWCY2OFwkWjFyIShASmNfQjFpXVE0dGwrXE5iL10xUD9YS1xdLCQ3NEhMSksvTklFXFhlQyMjNS1mVnJrVVpjMlFuPlguQSQuVERpa09hKWQwRjMvU3EhLDNOJDVmcT0zY2dHLVw8ODFfZSFpX0w/W0g0WyRLTTBLJWFGWihlTCU0cXFEPGo+QD5XPmlmUkNQXyN1cStEXyhjKWcqQ2A/PzdLbGtKPjIlImA+Rmg5PlxdImomcEY9KktCXzo6dEUiIVknUzsqQTU8XkxSYFUvTGRNN1UqSW9GQGd1QzNEczEyaitNdSdJPjc0Mi0xaDBfIkQjWl9iNXU5MlpsXixCR2YzOVZxZy1iXEg5WVgyPVEvcidrYV1gMS9fLyFPRGxyJVlaPkZIO0c5M1IpIl9acEdBVytqaHI4P3VEZXVsWytxYD0oPXA8I3NKQm4iQ3VARyFFKTQtQUZPY0Y9R2VCZj08KDknQV9uTC83W1dsPkVFX0IibWA/TDNvRVQ+bWs4KW4lbEVfZzFvX0xEaz45VSM1b1pTWSRzRWAtWm1DZFpOXkFCISpjMW9Mb0MvbGpkPU83PzlUbnIqa05scmJGMiZRakMhWTJCPWwicGIva2QxVGlkOTwsKEgqW21LMUo1WDMiM1Y1V1EiUFFYJEg6QjFGYTpCdEJhPFQ/YjszJ2BadD0rSHQxSW06bCs1UWImNmwvL0FeRC5UKDgnWFhxS1VuQD1RJFtrUD8/YzZfcSVKRlIlQT9yKkVtJiNSWVpdRH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjM0Mic6IGNsYXNzIFBERlN0cmVhbSANCiszNDIgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjY5OSA+Pg0KK3N0cmVhbQ0KK0diIVNuPkJBT1coNE9TJ3JraiMnM3RmZi04PylMSWAxKCZBbk1JQi9tVzpAOEo0W2dLOWJJZSFnPG1cKDNUKj8lOWk4LkhhWWA8byZkXk10JVItRStMQkJWR2l1XmVrKWwzT1E8Y0lvXCFRVG9FKUJAWipASihdQFxVKzU+UFEnbXRpXE1aXWYqWi5NVlV0N09lN21YPGQuU0gnIzU+PC5pTjAvN0BwclNUYyU/bjhkZVlKczYqI2FrTjBebUVURFNtZz5rXjxecjxdT25bMGpcNF5ScHIqXkhDIW9GOz5XRDMyMlVIZmVZaltjTmZfVUNiJmJEUSEvX3IlcjhsNjdgaGZGVGJVYU1bPHNkKT9YTD9PaUVPLi5FXEBGRjNQUTQ+I0VgbTtUKDhzaktvaGAhXy1HMTFkaTBDVm51dWpMTj5BPHVYNEcrSVBFL0hVQz84IW1pVmZPQikvb1FHQzpXJjoqWjFGWjcjQV00JzhVMWJuWWZqSSQmOmp1U0siTzhcLzMqZ15UMnJ0MSE9KGxSJUQscGsoUGc3SlVRbTBeRU1ObSU+VjhAY0Q/P1VTNnFVQW4wU3RBJTBxMSFGLGVxcCc7Y283LmEjXmZPJFI8XDZ1OjknK1QyIyozR08iVkgyZmhjN102blcuOHBTNThgZ0VuO2QxPCJbPjsxOzo6L3QrTTdjPyJlIyQxYyxzbUROMWRQQWwwWmNgcWEsLWAsViReSG5KUiVPMFZeZF9KOyIlcG1WVkUvL2NUYDBmczM+UjpzOERRPnFmPS8jZi0kazViLCM7aS9iOVwtLzQuRFkvWyw+UCcoSFhuWW5wNDBAN2lRKjlCLmYwZVVHMVZWS3FrczNiPVA/MGg1MGNBMlw7IilvXTJjUW1RY1goKk0yJCxcWShyKW1PNkhBIyxsM2A0I01sWykxTzc3PFZUSUJTbEdTX0goMVstVUhkMDxib0s4R3RxJyNTQiVETT1tMCldVVk0TXNDZDIjMUI3JjZOIjBZSm9cNTUtQUhlTTI/SkJmYkFeaVFlPFE2Ql5VQVwoPHNeKHVQUkcvY1Y0XE1KI0AsaUItZF8mLC0jQ3MrWClUMTgjKSZPQ3BdY09ZOHRiKyw2M09FaSo1NEJSPXVGTHQ5NGtfMjxeYHBGbSUxR2pWRTdnJFBGNF1BQV44PDpeLypRNC0tOFIjJztSP0FGKjpocGQiJVxkVmkza1xwR0tHdUBNbygqanJCOV43MSpIO0lBYVw/P0ouSGFcMl47V09RZSMnZSE3QU0uVWJNJmNTPXMhKylKWVVibkcpKUhnNzkzdFdSXi9YcmYsVl06M0txPFloQi1sXSM1W2dhaHRdZiMyOD07cm0oKykjJlpwNF1EaCktWjJWV207YzM+Sm0zdE5ccDMrZE1YNktdazZmKEhIJC1LZitnUExyUStjV2JjYzdGQSpVKDZ0UzJbL0FdJCwhR3NxQWNxSU1bZUYkT2NjUmZtXmUxISJMJi8ubVpfPD4mOnQ3OyZTXjhwL1hqSCtaT3VPKCNRW1xfX2E+L1NxZEA0akBRQF9jc1dBVz9RMk1GNiNUIVZMXTtgVDQ+P11aOUcqcXUuL2hJRk0lIUtyPHRAXkwyPWdKLzIwWlVRLDFMKUFwWks+UWEzbm9UL2ZtJVAlVCkyLGRDXGNkTEUrSWpgLzpaIUtTXSdcSmdiYCRQPzZnLSkqVCctI0lxPWs2Ol5ibFc6PEBINU4lS14+UTtASz9UMHNLcyI8NjBZO0Q0bzZSYUEiLFItYlI3QlAvUmxfYExQOHNVYTtvZEdhZjdnYVIvMjNUYG1LPkJNcWRwSD5KJzNKTlNWQUVgS0koXVY2X0A3OTRrbEQoYidKMmViZEQjLy9kYlE6ODkpRCVwLSQrJD0yWFNbYE1Bcix0Kko5SVYwUyxkWHNOV1hAMz9WYl4oQmQ/ZFRrOTlDRWEvRT0kOGQpZVhORjJPdG9nJT08UCZKS1EpMnFyLmlzNFFsTUJSXiljVzFUX0BtI0hsR2NoN1VGJUAibUhVcWJDRE1iXCUqWVFXOSloRycsK0JAc1JNXU1AMG1sTjAoIz4xPGBjUmNdPDleL2VKcEc7P1tnVmojclg+aGstbyxuST9EJywiZHEiaG9sNV5wbHVocigpYkdNLyo6ZSc+aFplSixMMkpUbG5GaUgjRW05KmlaPi0tKlhKPkQvP1NrOWRGLWhQLHBfIVY/Om5qNnV1YnFbY2QuSU5uQXUsUzckNj9OWVpEViVaZmsxRlUuMnM0Pi9DWjsyWz5cQSlmViVoNFsxQU5tMFM9QFcxJEVOYW5WW0RHMF81U0pAWC5aI1ArTic8aSJOOCRZa0hmWFNWYik7TzlEUCdrXz81J0FTbiM1ZTI+ajYxWywlY0JGczxWXmRAWjBVJ0ZkTFVhJitPI0laUEVeSnRdJzswU29BRSJeQm9lN1AiQUY+LTM3VTxKUkxwUiEjIm9yTUY4V2A9alhQM1dNciM7blM0TT4wTi1ZITwsK0xgRTZuIilJaF5VV1kxMzxZampYaS9AY0U1JyVZNVEvVCpKSnNwQyInIXUxKFY7WDBPX1YoImdJRXFRWUtvIzIsIlNoI3Q1QDE8P1xOYzJcVDZVbyhkbm1xSzhePEshaSo1b2teJjcjRy5oWy5CUHFeZjAjclwqUTBdX1syU18ncjlWPVRLKWIrJWVXc25vXk4oWEQqMyZFMUkoL0xEMllmailaO3JeQkc8RCFsLFhUYzJISmRjVTVaTV42W0g4LWIrVyFxO01IN2hWRER0XW9RKzNMc3AqXm4oNm9GPiRJayFsbkVBY05xKiIyJSU1LjAzYnFfWztYOypGPWloZD5QJWVcXTlwOm1pPydeWW5DQVByS3E9TFMpdEVTKEY7WWckTlxZcWF0Qyk3ST4jZi5XKVFVX14iNWU2RFk0TGhobmpbSyZhIzNXZDlcKEwwVGY7SmRDampEPk01Q2NQTW5CbGZla0FrIj0+dCsvZl1wWG1iOE9oQCJbSmxcRHExLz11JTNWSCVnQi8rJVtvYS90KURkRC5XMmsmN0FVU0Zpbig9Q1txMlsodSdKTD1iayxXaV5qYD9cTSkram5WXSNyVmNoY20tZy8qbjlQMGwnaCpbdFY+WFtKXz49YUtUKCE1TV4rL1paIlclXkIzcj5LR283Mmxza2dGbCxAVUBsczFPZTRdcXIvVWFraUNoND1ULmtoLydUUSJYbVtFQy45Q2FJMm5fLENQcmRsI21KLi04UCYlbEttWHFNQCswLC89PlVXYS8zY2c7Ol8jMmYwTmksRm9uWkMwN0BaS1IlXj8va1RbKTc8TXA5aCpkPFNebGU2RSUnS2tLOkU4UTM2ayNKYGElTlxnclM8RiUka2hUWms/UFAvQzlINSM1MWBfYSokQ05oXWBtWURRaT5hKDNPMkhBbGtZZS5tSzkyMi9XK1Y5ZlM4LlsjNXRdL103Xkc0al9DKW5HXjs+VXRKPlRCcjVtR3VSLXRUY3UvU1tnc2VmNilMLkRANXVxKTA/dE9wYF5PazUqVz81dWEwWF1wOEBbQHM2VjdmLyciaVxkKFlOMk5fdX4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjM0Myc6IGNsYXNzIFBERlN0cmVhbSANCiszNDMgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjY5NSA+Pg0KK3N0cmVhbQ0KK0diIVNtPychYU0nbiRVU3MxbCo9JEFXRT1oYUxCYmJwOW4vQT1Ncj5Nb0RGPiM/bWo9bWNaMHNqO0leRHBLVVVcQVdRNitDaEE9LmE8N100UDJcWSFncXVLL0AiJXFcbS9LcipmXFtNM1MrY3BrNkZMIiRAKiIrPm5VXEFYXVI5OCZyV1JIOWQ/JyYqVDhfLltpLXJJSiNRPmQ6b0VSWkFAV3NKNEArOyZCXmk9OzBWckpAblYiSCVqNiNXPWAmXFlWa3M2MkRRJDQhY2VpXSI9QFpebnNvcEAjP2ZuYDAudS1HYjRWU1BlXk5DXFE7ZTA0LzcrMzhqbFdvQU9BP2ZNWFVIaT9xaCkzc2hDSyNVWXIvK1FzQl1bRzdjUTE2aVczOVAlN147V1g8VDVRIVdOME4vXVRZIk1mNSxeWWBvM2BlJT9XQy9LUjdGRSNSOD1fNT9Da2pqLkFccysvWiE9OCVgXzlyNj0jQScpN1s3JDlOZW88IVREJSkoVS90TyRVbTttMW9NOWhbS2daVVE4WGQ8P0ddL1dQX3JkP3BpYTtVTThlMUdJU2R0UFIxLk1FJip0Pzk+a3QuJEBJNk8mbiozYHBKcGZoOHIlcyZdRSknPG5tLTdQZTo2bi1nJEhVTFshWj9PdSZrcl4zJzoldCVkYGZKQ0IxbV1oN0lhSTgxL3UxXiVQO2c2I1s4QmlAUDNGR0g8QFhEUSJjJm4zUCI/VFBCTiNWJU1YJUAwOzslRCsqJ0o9PTZmW0AwXUZ1M01SWyNZXkE5aj9BRztPcDNjRiQzT2xGKCsuPzthZkpAQiMmQFRHWz4nYiVgRzAiPWVIYz8lKzAxO1lSdWRCWiE2JSJrZEdGQCVydFZzN2opaG4kTEclTGFgalpEYGkoXWQ6blZjbEwtWDtiI2NCclBUaVthSEpjMVBHTCc5Q002cElfXGtuK2NVO3AnZkVJW2NcZl5RTTxAU2MmR2RrdGdTK1oyJS5pZConImBKZWdSOSpMVjRHN00rcVt0S2RmaS1VLT85VDZVZDdtT2trSlU2YCxBJGJUck5AKlY2JCMlNzZUWEU+cC5oUS9AVytGOF1RVDU2Y1UoJDY3MFBhPHVRQnU6WVxXV2lGLnIuPEdUOFo7NCNFYnUjUmRnMjJFTjZdUFUmZz1kZlNhXCkmLGBONHJiQ24sPENXRy9xXFFpNUojY2Q0MGpfKyE3PmRHIW9FYmdAImFoPGhkND1pOGN1ISVMVGJJUCQ8ODopOiZuR09sPGA1MEk1MGVbK0MtKilCPCwsdUs/anNBLzZJTExbVDdAPzdHbCEyQlFaTDRmZTdNWEIuKylVVG1qYUwsR3ArRT82PWBabnFiLVtuWVtAWyUxT19OVDxYXmRBVzxxWVBLPChKTDE5bSU8UkBRZVUtTGpfL1J0KDImazc/ME5qc2YsQDkkOVFxOE9VJHMvUSRsaT9fXChYNjVEbzojWTJDNlcxLDxMNHQ3dUEjRi88YGAnRFNdXlcqWjQsQ102YTFYKmJpcGJEWENPMjROQCFYNihbQEw+UzorYUhVUVpbbFBoal1TTUBmTyVIUWA6O2RBWCllIjFKb1A0NUdYYnBrNWw6ZFkmTTsxUV01ZHM6PUtfdG5tQm9wOldjZ3J0KyZHYXFtOm8iRG5RTV5ORE9sWmVPbUZxNU9oP2BjNiFGYmc9Nm4rRkRwVSRsTDBkXj5dSWpwPEsyTHJuVkFpKjQ+KT1fP3BDclsjcyg7RGBqPGtPPiM0SG86YiJeMmJOPy90aFBKM2ZXNzE5ZGkpSmBRPkI8YSVfXVsjXmlGOCg+c0MqRVFGQDVyTmAlOkBfVTNVaFFdSzVWOWhgUitWQCIqNzoiO3VxXFI+Qm08WVskN3VWPGNBUDdabzsmSWNjX2VaRythI3QxZHQ4X10wIUJQZyNzcl1bbTNKaCdYdVhzZylxSUNMIiNPZm9LMSIyWDRCYTNWLSMhW2NXVidEW1suIS0uVT5lJyNoPTBqJTxUK0YzdTA+RkBkJnVXWVs5SjJbZSg3TjNgaCZiVm09ZkdiKVd1dVZQP15GK1U/dW1NdGNCVFA7RVdZTThMdGNSPF0rSUVka01JNCZaLlRaNHRCRS0iMkltSjphb2clSVlfXkNsdG02QSpYU28vXEpWazcuTVpsWFlxX28xNEVXSClhPSZBT0ZAKWA3Ul00NFpqZkVnKkpyOmBSQSYhX2hWWVFILCpjQChmWElMOGhIS1NjVztXNV1ZQXUsMVJvOjhvS3U7V1BVR3RPXkdSbEstL0UnRDpNQUs5LWxRYj9TcWMvIThlaW5JaEVBJTNtJVBicE1KVmxoclBGZV5OOF5qMUpVYSIiR0x1WzorMk1NP0dAZFIjU0IsZDZxM1YsQzZNL0UudDMkNDdlbyRqKyI5O0opb1UqdVohWDI8UE9OdWxzW0slWWVVRSctMzY7XXVbbEtESFIqYGxJSiFcOktwXkswbUAjS1snSmtkYj9sOSY7aW50YHRqaDtBRE1cIVVHOEJoaCpaaWFYNy86ZzE0KTAuPFVpWkReTDtXV1YkdSlpVGlHRU1IN2dQKzBpKVYuRDVDOjZTUC5PKlI2cyxPQyFYTCFSMDduI0lIJmpoaGJwS2RpJk9ZbT9NSChsPXM6MTFtXzAzXGsjOVJmYlJoYEEqRWxVWzVGQTVwJltVPFFPVF9kOUNrXlxyVGdbOUZbMDpJOlhccFcwKiJbaT9aIihHQ0ckcz8hNCpZJlxsNUhHPS80KjVoRTl1LUU/cSFeZ1ZVP3IqPWQ6VjlGVV9sPGFeLjZnTUIjVyVNaVRJUmpxKyotRUZDTkIxKj5ZQSM0XGUzL3IsOmM6bDNeVj4jLFtZXi4jVkY8XTBcRGpVblRFNVdfUjFEbXElPmIxbmIhKi9ZPGYuTyUmL1gqKFAmJl5WdS8xTUBMSjhLL1tkLjg+ZjBdWl11TSROXUxCX01ILV89VldbJjVKX1tOZG00NVRIKT5ZNDNxRDJWQTs4PlpvbjhrQmZaWFRWPyFbPms7KWorUk5uTFlfX25RIl8xXkY+NjNeaDBSVClFUiFvTkUuO0kvS2ZfUUU0dTIkJEhlLy9FKExgbzomZ0peJzZhcSkiXFovZnFFZmUqaXMmPVZfWEBZQ2ZGOUFZOCR1YjchZlRqZnBhcyUnR19eR1NNJ1IyWWZROXNwUV4jJ01tWT9ZOk5NJDRtQT0qJi5CMiVNZz0saHNHR2phQj0oa0ZcUCZaOFMsNGYyV08uSXVTXHVQMyM9a2Y0YydlU3VbKltfPVkkREMsLUxING1pWTRjTiVQPW9PdDpJRiItSUw/InMpR2M4PzdCWiEnallkayNjKSgpIVBbSFFETSFWI2NUQjZbTDxhKC89JiJNW1M7LFhbal4nUmlucUlVQCM7RlQzUVJtWCw7M0E4ISZgWS5OcSFBZWdeP2FYdHNGI3BDVUNcaUZZZ2gpQD9QdV5KVU88YGgkWCxQQSVIU1E6ajlYKy5bUWU3VkBUM0tkKkMsLUJFU1xwIVREZidDX1hocSlUWWs9IVhdaS5pWGIjZkUrJmZddCtgKmI2KnIhLHFVbSVGfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzQ0JzogY2xhc3MgUERGU3RyZWFtIA0KKzM0NCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDk1ID4+DQorc3RyZWFtDQorR2IhO2U9YGA9ZSZxNSVpcyROLFosJl4+YiJGLGRGYjo5ckE8Mz1jLzhaKyRRbURCSlBRdCQ0OEdcLyhRcypoUywhOlxEOzNEUShyV0RrLHM3aXUpXkopLHVpTGQpTE85YVpEaFFnaT5pLClCXTFBZTlzQChtYjJWUWNsOiY1NFdYQS8+JWtFTmw+Z2RIT2NXO0UiVE0oYCwlRGppWCdGbTUvQzEwJ3A2OkUxTj5GR15wN1hmaVozLiw5TUZbKCtvZzI9RSN0KDRfPUJgP3Mxb29XYmVHN1MlbU0uLzFgT0dWPT9ockE1KSsydV40NiFUS1FuOGgmVy5AS0U1PGhNPU1RPlJMcmpuTXBGTSo9clRdQXNJKXBzOl1tQDptNjcmMCleSysvSmtKPS9kUG9haC1Ga1cnZjE0RkBHVlVqckZTc3VJOz9FXElScj4oXCsyXzhfMidqUkBxP1M4TFJKXDcrK1FgRkFCb1hyWj02RkVfZWw6Ki0uRkFfLyJeZyQ6UjtoIWlEUkVUVEZgQWFzLXBOXjRdUHVqcyNaXjgwPmNjPmVXKEg8LGJxSTorRT0vcHEtV0BkISFQO1ZmL2lvKWdbMkhZZS1JXFJsOUUhKHAuPTI/MF4nclhRSlQxOSYqJ1hITCg/cl9QJU48Ym03S0QmJVFkWmddUDoyWCMtPmFIb0Q/L2NKMjMmTzklYikxUD1GR1FeVi8vSFkzNWAzTCExN2hmWWhXayZRLXRgJ1JFO3JsS0ArYkwhJFxqJzRpN187O1kubEJjMVRiSkMxI3BBQ0BjIS4+Y1tqamZbbUErOiIkLy5QOz0qbStXOENUUSw8RjRiK0tJIUQjcFVnWzo6XToqRmVIQTE0UHI9R2FRWUolbFAqWDlkPSosMFM6ajJrSWglNTdhPiszL11kZGBzMm0/MWZsT202Jk9LYmwiPCslMWVWKU9ecyclQSYpYkNnUmxJJy1nZCRtaTIpZURZIkNKTEFrRSZuTEIoK21IVm5pbz1KSlkibU9eJzkyX0E9aDkhaSIpIUA0LWFMTyc9W0sjWUI8OkQwYyxqUDhKR0xIUjVPbHU6ZUk8W2pUYi9fSWlJYGFdOClfIkUyUGxwIUJcXEFUXmNbN1tXLW85JU1gcm1yMFkpYDI1ZkhsaEU3QTFHPWdePjJaZG9FYkEuK1pCTGJcVzU5O1lBRkFYU1cyakZBUWQyRzRVPGpOZilLXFshV1Y8dTBFYF06ZEJJRExaWGslUklabEY9NVpQWkovcyw+KyhQZltlTCRSS2RgKkczdFQ3Z0V1aCJRTCEiTTpCYU1GYztCITNacU5bMCw1M1QjYDZoIjJWQk1WNDM1R0NXNkBldXEsYUBlKCpnWFtHXCY7aFIyQzdWOUMlXFZIO2M1LVNnPkBZSTZcUFdFVzBIMyVUX1wkPVQhW2RfJm9KLlZETypBMU4mcigyPWBMWGIpZ2dUVTNlSi5mRHBCcEAiKSRFMDYkSWEyaiI2YzM5MCNpKDdaXShPOUhAZ24lMl1DTWFPXXMyQEpdSGNRIjxrSCFnZzZEZDBxRVI2RT5kYnImOjpvRmdwbEw4TjBtQjdLa2szZC4yWjNEKFdCQ2RiSCYwPjByUHFtLzMzZVZGVEJRM0smSy5LM245SEtyczRQbTA/JTohOi5HQkItb0AvNHMnTEpTX3ErMCttZUNpIy1oSCdQNnE7YztcOHM4X25uYD8uIyY2WXJQVDVqUzQ/IjVVTDM5VDEjYFBjOFpgTl1LckRmR0wqaF5mJlgxRzRmUzJCWmBdXnMsPEZZb1NtQ2FAWFI5S1g1UyI3O1w7bktdZ1lCSEUoV3BSUEleU2xqWCxvUUM1Ilo4MlZSYU1lVTI0WmJAU0lBRCFKM2FvL2g5ZydBQ0VCQVpFZV9WXTQmLGJYMzklTVZXXTRNJzc+TUIualA0alAhaGg2cXVlXTFpdGJWPFlrSGE0WD5WbEROKTllYVZfKm9fUDUzdThIZGlVc05JZ1wxOC40Ul8vR0lWTWlzUGYqUiYuYigxKGQoKU9fXEU7TVI7SlVRUXAqdUw7LTAzRG0iMUhfRG83ayguQko+dSxaPW9eREVuKTdaVUgsZFRVXGI/Q2w4VF1CVnQ4WiwwdCxgYDszUiImQF8vMWw4KTArRWsyVCJKZ0ZBSls2KmIyI2JsNlRzMF1ATFpPKWxmRz5YWnNdQ2kjUGxNJW02bGFdYiJhKCQkLWdAM0xoIiU8MldpKlY0QyVUbmAhLmxgYGEvWmVKYjhGPG82QmxwVDRoImU9XU43XCtaWl5UUUVyUjNHOzpcN2teL0ApbFo7NSdsTTApXUlBS2cqPk1lTzhpdGw/NkxJWmhSa2BxWzhuUHJOSEFfM1ByMUxoNCNMJyYpbUIsamdDPmViWC1oaS4zRG5eVERwZmZlXSolYiZBP2FiQyghazFUKHFBLikiSmA0XClaJ3F1U3ArPSlgPmQ4PStTbG1TTiQ6IShKNlcmRWUsPSZtYjg0aW4kYFBeKXFxJyNsbFh1PEo5cGxyZ1xyYG1jUUkzMkdDJ28iQmYzNG9OPGxYcGs8ZjYoWCM7USF0W2FOaEFkN2FsQlg+J2QiRWJJRlddRC9obmxFSS8laEc7SnBScS44X3IjWiUobHViUzRjNkBxIigpXj9jKW5cITNhdSEtKDZoK0tNKV9NbE4pXzloPVk3cTNnNCswMl40RDwqZlNFRDxIMmJOTWQ0ZixfZDhtOGdUKU1qIWVlM25kOUBlQC9Ba245OlYhV09tZ1I/YCJcZFdxbShkQlRoMGxvI1AqU248WFNdQD04alhkRWpDQiUrbm5qTDUmUSw5Rmo2b1ltXGc1QSReZlpJXE1xMEpkam4iKC09OGA8O1VWVExPXEBIKTIydS9RXCtKWilSb2hgODAuMjByLVRPNlAuRiw9c2tBM1NMTC8pW2ZgW3FgXWNnUUEwc2NIa01gL1xpbl5GJFkvLmVeanJncSg6T0crRGhDW1k4Vi86TkUnRENmWj9TXS02UGBQK3NjViRVREFHXj8wRmI0YVRCcz4tWG5FbVRIOGkjOlpsO108MWQyZGJvZjlqXGxBVm5zPGEiV0tkM2RZTkNuLzVAVk5SU0N1KnRAYktKKTs+VlBMK2ZoSEkvXWZMMTVCRis4amtBKlkxW1o0bUxvb0k8M1Q4VklpVU1OSytGJ0ZzXFZRYlRvJFxubzMqbypeSyghMSpCTlJlIl5OQDQtMV9TUUtNMXRzJi4uPiVgRUMyV2dIQ21rQSZQU0RkKnA0Syc6K0cwV0BwXUonQVBOOXJLdSwjOS5wYWpGOFFTVG5Ffj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzQ1JzogY2xhc3MgUERGU3RyZWFtIA0KKzM0NSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyMDY2ID4+DQorc3RyZWFtDQorR2IhO2Y+QkFMWCdSb0xFczIxODtQakVvOmdYbmRLUCYqNUk5WERFY21TZEdGL081OklcV1JyVF5ZXjloUXRtPlAmb1RnQShhQFldZEFNJyJvQkc3JChJLCkkTmAoRE4mY0RJXSJrU0NTIlBmVHRLQCkmazJnWUdmVnU6XFthK0dGWFQkbjU+U1cuWSszcHM7dGwkJVItJFhpdTEndC46L2lBdClsRzZWSVVVVTlxOHFfNV9XU1xUQCVbMyVEX1E1Pygva1FkKEdZVTRiKkltOThhXjJAMClHPTBGRXBrVmYiU19yZ2dfbkIqXVQmWU5SXkcnS2ZLUytfZlJLcCJhUiRLXDRdPnViTUErZzlfVEVDTlA6OjFYWiJzXi0pSSQjVklFQSRLIyI1J3RFJS9XZkdZNzlhcVQwI0YyXThnNSdsLVlJLFB0M14qZnBGJ1owOGEybmpAaUtbNEEsMTMuWXJudERgbzxgLCZwQylOLzshVUxsPXJSOy9kJ1tYSkttUEBqdExnaHFoXmdeOm1wa2syT1FTIzxtcihgTCM+UFlbUCtEYjdwJGE/RUhib0MhS2psKWNpJWxUZ140PihmTlNxUFhBLjU9W1o3LyhgR2IkKEUwPl5Pc2U/UTF0a103KGJZa25kLlVmTTE/WTF0LkEzKklGP04/M2ZuYjhKa0RLOF8uRylcOT8nWU9iWlw1Mlg8Z1pdZEc1X0FPIj0taEcxODohUm4xNz9BbWhAYGhhL15BT1kpVmgmMUxTQlVQJityTlVQWUAib3RBNlJOcUE/OzAtPDZYPkxPbixiZjolLCkrWCEpNlNuKERTNipdVidKWSs9YWcuYmBgOyFpWytWNWdSOydNPjQwL2ldWzdRPEptaVhENDI8Wk9jJSRtcHQ7YnNkPjUzVEcmREs4J01AS0Q2JioqaT5lbDprZjFNJENNLEw+LjhDYURsa2dtbUBPS1ZjLl9lW04rOW1aN1xBRSdQRWVvX04wVGRvM0MzL1MzRDNpLl9TZWVSJCsxP1FMMF9oXydYPG9qU0lpKHNkJlpLSikhKlMhbm1WL10rdDg/YkU2I3FmUVtoTE4jcSEiZyNlal8oIWledWkhWVsiXE10SSMiYG1pOiU1czpjNjYnRF1gQztqbiI3OEhpKmlqOFRjKiZnZy5bR2dUZFxpO1Q0biJDJDFDRGFmIi5bPlEhblBXI3VPUFVBVjRLSkRWYl8hSjQoVzZkQzU9OiQxcEc/JSZCP0oiM2VrY0QnVEdKKEJxdFtNX29TOTdLI2I/KUk6Z2dPPF5eXGg+QXIjbDwubnUyZl5lJHFHKUVfSG84STxPXjouUzBJUT1pKnJKNCRWKFw3WXMkVXVbUSUpKnRxYjZBUCVbJiFTTGNfUk0pal5IUTE2ZipUOnUrbkpHOD1tNzVaNVYiWGolPjlgSktWXlQrTkQrN0VHZ2MrWE1OJEZAMT5BZXQ4NzZVVks+RWEjbXBwZlM3SjA3blU/cENYQlxFWEpAUkFUZU9tYjRaQ2VpK2xUMUk4JmZwNmwxQCRdUCRUPFZwQk9Vczw7MEw8X2FcOkUxWjEqPTU4ZihiIm0ySF5gR0BOUy0rKSY+bGxcXHNhRywkQ1ZpInNIXV06LD8wZGhIXSNcRipucy06IT8tUFZEXyQrTV07KypNPG4hPk8iLiEyQTZeW3UkJ1JpNlJASlo0XjRgUk4sJFpmJGBfIV1MWSlVc0xmRWE7ITEqXV5sNiloLVM6VTstZl5OJXVAMkleMzhIOFNyOltrXEFjJ0pkV3EjTkslXEZQRnNnRWhSVk1IJSgqaCEtVTQ2bCx1ZkZULSM3aEtnZFtdSVRjTCI7V10nUVVRKmIzVVVIaGxzIVdKSDA2RmQicUojRF89UGxybl9YLzhpOidFOEk7UTpHIS9jaGRvUlQ4UGplRidnOkshOENORkRPTW5NRyM8aXFeRiIzTSQ8YTtLYlRRRD1XUnVIJDA+LzInXSQpZVs+K3BGcjVydWBCY1laaz9rUS9kQGRBWTtCaiJQXGUjSkonMl1PX0tTRGJub3I2Qi5pWSdKbD0oVzpXKCljbEs2NShJRVhOQ0N1VEkzX1MiWzVJWTYpVV01QC9eODNHJWlcZ0AwNGs6TyY6cmc1SEhyYGQxJjxzOyUqcy1lPy4oaXJedD1lMyVIbjJHKkFrQzxHbiw4LVBPa0RGP2xacUppLHNbaTJvb0AlXkEncGhLZmFDR0FcZEpwKChWJjlMOjRUO2QyZGgqOzAsOUFOW1ktKldAaUQ6VGNkQWNPK19NXjJLWVNARGw6akpoZThvLTcvYTU9ZkMoWjEzJyhiL2AiPUJDUDdMcyZmQmJpZFYic04hJkMhN240MTBfL1A2KDYlMl9QKEZSX0gwcy09W19xalgjVHVcTWtuSC40dCFsYlwlPWIxTURzMlVlTVM1ZSkickdVZ2huJiJkSl9nXU9EZStWUVEzb1J0Ry1qN21iV2BrOnRyTF45VDtsOisvUEM9c2xtTVIyR3JQJWNHUjYvKDJyQEE4UFQ8LXVAN2JqNXJcYldSWkEyK1ldTmMlTXUhJlZBVXM6VTsrIWU3ODJHdClfdSFbP0QiYEVSM1NNQl08WDIwSzFPYEMyQSZMbkY9dFMkUmJiRGljWXEsOzFzRUxGZnNJTC9aS3JFOFJuQTdsaHNSNFJmcUBUJkFwQHRkWmlvMT4kVUpGNGYwNzFnMStILmNVaEQtJE45OSdrWCsoL2RvLjFbfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMzQ2JzogY2xhc3MgUERGU3RyZWFtIA0KKzM0NiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyMTAgPj4NCitzdHJlYW0NCitHYXNKSjlhXGBrJjtCazBndTBpY2k3TmxYaicnZnBTJjFdMltZZmJrPXIxTiYsZF4iUFc2P3FARGdwUWBhP3NwSDw8byNzcVs4I2NqOjhWLytdazEmWCQuaGpqM0dMWW5oMDssa19wTlgpWXM8SGBvNCUiXDJtRD4ialBOJEUwK3U4Iyo4ITVhW09ySGBVSC0pTUBIQThDX0suJ1pDYDMiUC9uVT4jQUxjXjdlP2o+X2UhdV5XZVRdPVdHKU5MNixQbSg4KkE2TzxaYHUiNzp1fj5lbmRzdHJlYW0NCitlbmRvYmoNCit4cmVmDQorMCAzNDcNCiswMDAwMDAwMDAwIDY1NTM1IGYNCiswMDAwMDAwMTEzIDAwMDAwIG4NCiswMDAwMDAwMjYzIDAwMDAwIG4NCiswMDAwMDAwNDY5IDAwMDAwIG4NCiswMDAwMDEyMjUzIDAwMDAwIG4NCiswMDAwMDEyNDQwIDAwMDAwIG4NCiswMDAwMDEyNjgyIDAwMDAwIG4NCiswMDAwMDEyOTEyIDAwMDAwIG4NCiswMDAwMDEzMTQyIDAwMDAwIG4NCiswMDAwMDEzMzcxIDAwMDAwIG4NCiswMDAwMDEzNTk4IDAwMDAwIG4NCiswMDAwMDEzODI2IDAwMDAwIG4NCiswMDAwMDE0MDU4IDAwMDAwIG4NCiswMDAwMDE0Mjg5IDAwMDAwIG4NCiswMDAwMDE0NTIxIDAwMDAwIG4NCiswMDAwMDE0NzUyIDAwMDAwIG4NCiswMDAwMDE0OTgxIDAwMDAwIG4NCiswMDAwMDE1MjEzIDAwMDAwIG4NCiswMDAwMDE1NDQzIDAwMDAwIG4NCiswMDAwMDE1Njc1IDAwMDAwIG4NCiswMDAwMDE1OTA3IDAwMDAwIG4NCiswMDAwMDE2MTM2IDAwMDAwIG4NCiswMDAwMDE2MzY1IDAwMDAwIG4NCiswMDAwMDE2NTk3IDAwMDAwIG4NCiswMDAwMDE2ODI5IDAwMDAwIG4NCiswMDAwMDE3MDYwIDAwMDAwIG4NCiswMDAwMDE3MjkyIDAwMDAwIG4NCiswMDAwMDE3NTIxIDAwMDAwIG4NCiswMDAwMDE3NzUxIDAwMDAwIG4NCiswMDAwMDE3OTgwIDAwMDAwIG4NCiswMDAwMDE4MjExIDAwMDAwIG4NCiswMDAwMDE4NDQyIDAwMDAwIG4NCiswMDAwMDE4Njc0IDAwMDAwIG4NCiswMDAwMDE4OTA2IDAwMDAwIG4NCiswMDAwMDE5MTM4IDAwMDAwIG4NCiswMDAwMDE5MzY4IDAwMDAwIG4NCiswMDAwMDE5NjAwIDAwMDAwIG4NCiswMDAwMDE5ODMxIDAwMDAwIG4NCiswMDAwMDIwMDYzIDAwMDAwIG4NCiswMDAwMDIwMjk1IDAwMDAwIG4NCiswMDAwMDIwNTI3IDAwMDAwIG4NCiswMDAwMDIwNzU5IDAwMDAwIG4NCiswMDAwMDIwOTkwIDAwMDAwIG4NCiswMDAwMDIxMjIwIDAwMDAwIG4NCiswMDAwMDIxNDUxIDAwMDAwIG4NCiswMDAwMDIxNjgyIDAwMDAwIG4NCiswMDAwMDIxOTE0IDAwMDAwIG4NCiswMDAwMDIyMTI3IDAwMDAwIG4NCiswMDAwMDIyODY1IDAwMDAwIG4NCiswMDAwMDIzMDk0IDAwMDAwIG4NCiswMDAwMDIzMzI1IDAwMDAwIG4NCiswMDAwMDIzNTU1IDAwMDAwIG4NCiswMDAwMDIzNzg1IDAwMDAwIG4NCiswMDAwMDI0MDE2IDAwMDAwIG4NCiswMDAwMDI0MjQ2IDAwMDAwIG4NCiswMDAwMDI0NDc3IDAwMDAwIG4NCiswMDAwMDI0NzA2IDAwMDAwIG4NCiswMDAwMDI0OTM3IDAwMDAwIG4NCiswMDAwMDI1MTY3IDAwMDAwIG4NCiswMDAwMDI1Mzk5IDAwMDAwIG4NCiswMDAwMDI1NjMxIDAwMDAwIG4NCiswMDAwMDI1ODYzIDAwMDAwIG4NCiswMDAwMDI2MDk0IDAwMDAwIG4NCiswMDAwMDI2MzI1IDAwMDAwIG4NCiswMDAwMDI2NTU1IDAwMDAwIG4NCiswMDAwMDI2Nzg2IDAwMDAwIG4NCiswMDAwMDI3MDE4IDAwMDAwIG4NCiswMDAwMDI3MjUxIDAwMDAwIG4NCiswMDAwMDI3NDg1IDAwMDAwIG4NCiswMDAwMDI3NzE5IDAwMDAwIG4NCiswMDAwMDI3OTUyIDAwMDAwIG4NCiswMDAwMDI4MTg1IDAwMDAwIG4NCiswMDAwMDI4NDIwIDAwMDAwIG4NCiswMDAwMDI4NjU1IDAwMDAwIG4NCiswMDAwMDI4ODg4IDAwMDAwIG4NCiswMDAwMDI5MTIyIDAwMDAwIG4NCiswMDAwMDI5MzU2IDAwMDAwIG4NCiswMDAwMDI5NTkxIDAwMDAwIG4NCiswMDAwMDI5ODI1IDAwMDAwIG4NCiswMDAwMDMwMDYwIDAwMDAwIG4NCiswMDAwMDMwMjk0IDAwMDAwIG4NCiswMDAwMDMwNTI5IDAwMDAwIG4NCiswMDAwMDMwNzYyIDAwMDAwIG4NCiswMDAwMDMwOTk1IDAwMDAwIG4NCiswMDAwMDMxMjI5IDAwMDAwIG4NCiswMDAwMDMxNDY0IDAwMDAwIG4NCiswMDAwMDMxNjk3IDAwMDAwIG4NCiswMDAwMDMxOTMxIDAwMDAwIG4NCiswMDAwMDMyMTY1IDAwMDAwIG4NCiswMDAwMDMyMzgzIDAwMDAwIG4NCiswMDAwMDMzMDUyIDAwMDAwIG4NCiswMDAwMDMzMjg4IDAwMDAwIG4NCiswMDAwMDMzNTI1IDAwMDAwIG4NCiswMDAwMDMzNzYwIDAwMDAwIG4NCiswMDAwMDM0MDE0IDAwMDAwIG4NCiswMDAwMDM0MjgyIDAwMDAwIG4NCiswMDAwMDM0NTI3IDAwMDAwIG4NCiswMDAwMDM0Nzk5IDAwMDAwIG4NCiswMDAwMDM1MDkwIDAwMDAwIG4NCiswMDAwMDM1MzY3IDAwMDAwIG4NCiswMDAwMDM1NjQxIDAwMDAwIG4NCiswMDAwMDM1OTIzIDAwMDAwIG4NCiswMDAwMDM2MjAyIDAwMDAwIG4NCiswMDAwMDM2NDcwIDAwMDAwIG4NCiswMDAwMDM2NzM0IDAwMDAwIG4NCiswMDAwMDM2OTkxIDAwMDAwIG4NCiswMDAwMDM3MjQyIDAwMDAwIG4NCiswMDAwMDM3NDkzIDAwMDAwIG4NCiswMDAwMDM3NzkwIDAwMDAwIG4NCiswMDAwMDM4MDgzIDAwMDAwIG4NCiswMDAwMDM4MzY2IDAwMDAwIG4NCiswMDAwMDM4NjgyIDAwMDAwIG4NCiswMDAwMDM4OTcyIDAwMDAwIG4NCiswMDAwMDM5MjU3IDAwMDAwIG4NCiswMDAwMDM5NTQ2IDAwMDAwIG4NCiswMDAwMDM5ODI4IDAwMDAwIG4NCiswMDAwMDQwMTA4IDAwMDAwIG4NCiswMDAwMDQwMzgzIDAwMDAwIG4NCiswMDAwMDQwOTQ0IDAwMDAwIG4NCiswMDAwMDQxMjI3IDAwMDAwIG4NCiswMDAwMDQxNTI1IDAwMDAwIG4NCiswMDAwMDQxODEwIDAwMDAwIG4NCiswMDAwMDQyMTAxIDAwMDAwIG4NCiswMDAwMDQyMzk4IDAwMDAwIG4NCiswMDAwMDQyNjkyIDAwMDAwIG4NCiswMDAwMDQyOTkwIDAwMDAwIG4NCiswMDAwMDQzMjcyIDAwMDAwIG4NCiswMDAwMDQzNTQ0IDAwMDAwIG4NCiswMDAwMDQzODE2IDAwMDAwIG4NCiswMDAwMDQ0MDg0IDAwMDAwIG4NCiswMDAwMDQ0MzY0IDAwMDAwIG4NCiswMDAwMDQ0NjQyIDAwMDAwIG4NCiswMDAwMDQ0OTIwIDAwMDAwIG4NCiswMDAwMDQ1MjM4IDAwMDAwIG4NCiswMDAwMDQ1NTI1IDAwMDAwIG4NCiswMDAwMDQ1ODExIDAwMDAwIG4NCiswMDAwMDQ2MDc0IDAwMDAwIG4NCiswMDAwMDQ2MzEzIDAwMDAwIG4NCiswMDAwMDQ2NTMzIDAwMDAwIG4NCiswMDAwMDQ3MDIwIDAwMDAwIG4NCiswMDAwMDQ3MTk4IDAwMDAwIG4NCiswMDAwMDQ3NDI0IDAwMDAwIG4NCiswMDAwMDQ3NjEwIDAwMDAwIG4NCiswMDAwMDQ3ODMzIDAwMDAwIG4NCiswMDAwMDQ4MTM4IDAwMDAwIG4NCiswMDAwMDQ4NDExIDAwMDAwIG4NCiswMDAwMDQ4NzAxIDAwMDAwIG4NCiswMDAwMDQ4OTQxIDAwMDAwIG4NCiswMDAwMDQ5MTgyIDAwMDAwIG4NCiswMDAwMDQ5NDI0IDAwMDAwIG4NCiswMDAwMDQ5NjY2IDAwMDAwIG4NCiswMDAwMDQ5OTA4IDAwMDAwIG4NCiswMDAwMDUwMTM1IDAwMDAwIG4NCiswMDAwMDUwMzMzIDAwMDAwIG4NCiswMDAwMDUwNTczIDAwMDAwIG4NCiswMDAwMDUwODEzIDAwMDAwIG4NCiswMDAwMDUxMDU1IDAwMDAwIG4NCiswMDAwMDUxMjk2IDAwMDAwIG4NCiswMDAwMDUxNTE5IDAwMDAwIG4NCiswMDAwMDUxOTMxIDAwMDAwIG4NCiswMDAwMDUyMTczIDAwMDAwIG4NCiswMDAwMDUyNDEzIDAwMDAwIG4NCiswMDAwMDUyNjM2IDAwMDAwIG4NCiswMDAwMDUyOTY4IDAwMDAwIG4NCiswMDAwMDUzMjA4IDAwMDAwIG4NCiswMDAwMDUzNDUwIDAwMDAwIG4NCiswMDAwMDUzNjg0IDAwMDAwIG4NCiswMDAwMDUzOTI2IDAwMDAwIG4NCiswMDAwMDU0MTY3IDAwMDAwIG4NCiswMDAwMDU0NDA5IDAwMDAwIG4NCiswMDAwMDU0NjUxIDAwMDAwIG4NCiswMDAwMDU0ODkyIDAwMDAwIG4NCiswMDAwMDU1MTE2IDAwMDAwIG4NCiswMDAwMDU1NTA4IDAwMDAwIG4NCiswMDAwMDU1NzQ2IDAwMDAwIG4NCiswMDAwMDU1OTgzIDAwMDAwIG4NCiswMDAwMDU2MjIwIDAwMDAwIG4NCiswMDAwMDU2NDQyIDAwMDAwIG4NCiswMDAwMDU2NzY4IDAwMDAwIG4NCiswMDAwMDU3MDQyIDAwMDAwIG4NCiswMDAwMDU3MzMyIDAwMDAwIG4NCiswMDAwMDU3NTc0IDAwMDAwIG4NCiswMDAwMDU3ODEwIDAwMDAwIG4NCiswMDAwMDU4MDQ3IDAwMDAwIG4NCiswMDAwMDU4MjY4IDAwMDAwIG4NCiswMDAwMDU4NjEwIDAwMDAwIG4NCiswMDAwMDU4ODUyIDAwMDAwIG4NCiswMDAwMDU5MDk0IDAwMDAwIG4NCiswMDAwMDU5MzIwIDAwMDAwIG4NCiswMDAwMDU5NjUyIDAwMDAwIG4NCiswMDAwMDU5ODkzIDAwMDAwIG4NCiswMDAwMDYwMTE4IDAwMDAwIG4NCiswMDAwMDYwNDQwIDAwMDAwIG4NCiswMDAwMDYwNjgxIDAwMDAwIG4NCiswMDAwMDYwOTIyIDAwMDAwIG4NCiswMDAwMDYxMTYzIDAwMDAwIG4NCiswMDAwMDYxMzg4IDAwMDAwIG4NCiswMDAwMDYxNzMwIDAwMDAwIG4NCiswMDAwMDYxOTU2IDAwMDAwIG4NCiswMDAwMDYyMjY4IDAwMDAwIG4NCiswMDAwMDYyNTA5IDAwMDAwIG4NCiswMDAwMDYyNzUwIDAwMDAwIG4NCiswMDAwMDYyOTkyIDAwMDAwIG4NCiswMDAwMDYzMjM0IDAwMDAwIG4NCiswMDAwMDYzNDc1IDAwMDAwIG4NCiswMDAwMDYzNzE3IDAwMDAwIG4NCiswMDAwMDYzOTU5IDAwMDAwIG4NCiswMDAwMDY0MjAwIDAwMDAwIG4NCiswMDAwMDY0NDQyIDAwMDAwIG4NCiswMDAwMDY0Njc4IDAwMDAwIG4NCiswMDAwMDY0OTAzIDAwMDAwIG4NCiswMDAwMDY1MzE1IDAwMDAwIG4NCiswMDAwMDY1NTU2IDAwMDAwIG4NCiswMDAwMDY1NzgxIDAwMDAwIG4NCiswMDAwMDY2MDg3IDAwMDAwIG4NCiswMDAwMDY2Mzc3IDAwMDAwIG4NCiswMDAwMDY2NjE5IDAwMDAwIG4NCiswMDAwMDY2ODYwIDAwMDAwIG4NCiswMDAwMDY3MDg2IDAwMDAwIG4NCiswMDAwMDY3NDE4IDAwMDAwIG4NCiswMDAwMDY3NjU4IDAwMDAwIG4NCiswMDAwMDY3ODc4IDAwMDAwIG4NCiswMDAwMDY4MjAwIDAwMDAwIG4NCiswMDAwMDY4NDQxIDAwMDAwIG4NCiswMDAwMDY4NjgwIDAwMDAwIG4NCiswMDAwMDY4OTE5IDAwMDAwIG4NCiswMDAwMDY5MjM1IDAwMDAwIG4NCiswMDAwMDY5NTA5IDAwMDAwIG4NCiswMDAwMDY5Nzg0IDAwMDAwIG4NCiswMDAwMDY5OTI2IDAwMDAwIG4NCiswMDAwMDcwMTcwIDAwMDAwIG4NCiswMDAwMDcwMjk5IDAwMDAwIG4NCiswMDAwMDcwNTA1IDAwMDAwIG4NCiswMDAwMDcwNjYyIDAwMDAwIG4NCiswMDAwMDcwODM0IDAwMDAwIG4NCiswMDAwMDcxMDAzIDAwMDAwIG4NCiswMDAwMDcxMjE2IDAwMDAwIG4NCiswMDAwMDcxMzg3IDAwMDAwIG4NCiswMDAwMDcxNjE2IDAwMDAwIG4NCiswMDAwMDcxNzc1IDAwMDAwIG4NCiswMDAwMDcxOTU1IDAwMDAwIG4NCiswMDAwMDcyMTM5IDAwMDAwIG4NCiswMDAwMDcyMzI5IDAwMDAwIG4NCiswMDAwMDcyNTExIDAwMDAwIG4NCiswMDAwMDcyNjk0IDAwMDAwIG4NCiswMDAwMDcyODYxIDAwMDAwIG4NCiswMDAwMDczMDQ3IDAwMDAwIG4NCiswMDAwMDczMjcxIDAwMDAwIG4NCiswMDAwMDczNDQwIDAwMDAwIG4NCiswMDAwMDczNjA5IDAwMDAwIG4NCiswMDAwMDczNzk5IDAwMDAwIG4NCiswMDAwMDczOTc1IDAwMDAwIG4NCiswMDAwMDc0MTY2IDAwMDAwIG4NCiswMDAwMDc0Mzg1IDAwMDAwIG4NCiswMDAwMDc0NTQwIDAwMDAwIG4NCiswMDAwMDc0NzE3IDAwMDAwIG4NCiswMDAwMDc0ODg3IDAwMDAwIG4NCiswMDAwMDc1MDU3IDAwMDAwIG4NCiswMDAwMDc1MjIwIDAwMDAwIG4NCiswMDAwMDc1NDE1IDAwMDAwIG4NCiswMDAwMDc1NjQ0IDAwMDAwIG4NCiswMDAwMDc1ODAyIDAwMDAwIG4NCiswMDAwMDc1OTgwIDAwMDAwIG4NCiswMDAwMDc2MTU4IDAwMDAwIG4NCiswMDAwMDc2MzM1IDAwMDAwIG4NCiswMDAwMDc2NDk0IDAwMDAwIG4NCiswMDAwMDc2NjgyIDAwMDAwIG4NCiswMDAwMDc2OTA5IDAwMDAwIG4NCiswMDAwMDc3MTIwIDAwMDAwIG4NCiswMDAwMDc3Mjg5IDAwMDAwIG4NCiswMDAwMDc3NDY4IDAwMDAwIG4NCiswMDAwMDc3NjU1IDAwMDAwIG4NCiswMDAwMDc3ODM3IDAwMDAwIG4NCiswMDAwMDc4MDA5IDAwMDAwIG4NCiswMDAwMDc4MjMwIDAwMDAwIG4NCiswMDAwMDc4Mzg3IDAwMDAwIG4NCiswMDAwMDc4NTcyIDAwMDAwIG4NCiswMDAwMDc4NzUyIDAwMDAwIG4NCiswMDAwMDc4OTE3IDAwMDAwIG4NCiswMDAwMDc5MTMyIDAwMDAwIG4NCiswMDAwMDc5Mjk0IDAwMDAwIG4NCiswMDAwMDc5NDcxIDAwMDAwIG4NCiswMDAwMDc5NjM5IDAwMDAwIG4NCiswMDAwMDc5ODEzIDAwMDAwIG4NCiswMDAwMDc5OTg3IDAwMDAwIG4NCiswMDAwMDgwMTYzIDAwMDAwIG4NCiswMDAwMDgwMzM4IDAwMDAwIG4NCiswMDAwMDgwNTAyIDAwMDAwIG4NCiswMDAwMDgwNzI3IDAwMDAwIG4NCiswMDAwMDgwODg1IDAwMDAwIG4NCiswMDAwMDgxMDcwIDAwMDAwIG4NCiswMDAwMDgxMjQ0IDAwMDAwIG4NCiswMDAwMDgxNDM0IDAwMDAwIG4NCiswMDAwMDgxNjA4IDAwMDAwIG4NCiswMDAwMDgxODIzIDAwMDAwIG4NCiswMDAwMDgxOTkwIDAwMDAwIG4NCiswMDAwMDgyMTc0IDAwMDAwIG4NCiswMDAwMDgyMzU4IDAwMDAwIG4NCiswMDAwMDgyNTI0IDAwMDAwIG4NCiswMDAwMDgyNzUwIDAwMDAwIG4NCiswMDAwMDgyOTI1IDAwMDAwIG4NCiswMDAwMDgzMDk5IDAwMDAwIG4NCiswMDAwMDgzMjQ4IDAwMDAwIG4NCiswMDAwMDgzNDMzIDAwMDAwIG4NCiswMDAwMDgzNjY3IDAwMDAwIG4NCiswMDAwMDgzODI1IDAwMDAwIG4NCiswMDAwMDg0MDEzIDAwMDAwIG4NCiswMDAwMDg0MTk4IDAwMDAwIG4NCiswMDAwMDg0Mzc3IDAwMDAwIG4NCiswMDAwMDg0NjE0IDAwMDAwIG4NCiswMDAwMDg0Nzg2IDAwMDAwIG4NCiswMDAwMDg0OTYyIDAwMDAwIG4NCiswMDAwMDg1MTMyIDAwMDAwIG4NCiswMDAwMDg1MzEyIDAwMDAwIG4NCiswMDAwMDg1NDg0IDAwMDAwIG4NCiswMDAwMDg1NzA4IDAwMDAwIG4NCiswMDAwMDg1ODcyIDAwMDAwIG4NCiswMDAwMDg2MDYwIDAwMDAwIG4NCiswMDAwMDg2MjQ4IDAwMDAwIG4NCiswMDAwMDg2NDYxIDAwMDAwIG4NCiswMDAwMDg2NjAxIDAwMDAwIG4NCiswMDAwMDg2OTYxIDAwMDAwIG4NCiswMDAwMDg4ODkyIDAwMDAwIG4NCiswMDAwMDkwNTUxIDAwMDAwIG4NCiswMDAwMDkzOTc1IDAwMDAwIG4NCiswMDAwMDk3MTEyIDAwMDAwIG4NCiswMDAwMTAwNTIzIDAwMDAwIG4NCiswMDAwMTAzNDMyIDAwMDAwIG4NCiswMDAwMTA2MTY4IDAwMDAwIG4NCiswMDAwMTA5MTI1IDAwMDAwIG4NCiswMDAwMTEyMDQxIDAwMDAwIG4NCiswMDAwMTE0OTcxIDAwMDAwIG4NCiswMDAwMTE3Mzg2IDAwMDAwIG4NCiswMDAwMTIxNzI2IDAwMDAwIG4NCiswMDAwMTI1MDMyIDAwMDAwIG4NCiswMDAwMTI4MDk5IDAwMDAwIG4NCiswMDAwMTMxMTMzIDAwMDAwIG4NCiswMDAwMTMzNzYyIDAwMDAwIG4NCiswMDAwMTM2NDk2IDAwMDAwIG4NCiswMDAwMTM5MDc4IDAwMDAwIG4NCiswMDAwMTQxODUyIDAwMDAwIG4NCiswMDAwMTQ1MTY5IDAwMDAwIG4NCiswMDAwMTQ4MDQ4IDAwMDAwIG4NCiswMDAwMTUwODkyIDAwMDAwIG4NCiswMDAwMTUzNzMyIDAwMDAwIG4NCiswMDAwMTU2MzcyIDAwMDAwIG4NCiswMDAwMTU4NTgzIDAwMDAwIG4NCit0cmFpbGVyDQorPDwgL0lEIA0KKyAlIFJlcG9ydExhYiBnZW5lcmF0ZWQgUERGIGRvY3VtZW50IC0tIGRpZ2VzdCAoaHR0cDovL3d3dy5yZXBvcnRsYWIuY29tKSANCisgWygvXCgsaFwzMTVcMjYyXDMyN1wyMjddTU0kXDMwNlwzNTNcMDExXDMzNSkgKC9cKCxoXDMxNVwyNjJcMzI3XDIyN11NTSRcMzA2XDM1M1wwMTFcMzM1KV0gDQorDQorIC9JbmZvIDIyOSAwIFINCisgL1Jvb3QgMjI4IDAgUg0KKyAvU2l6ZSAzNDcgPj4NCitzdGFydHhyZWYNCisxNTg5MDkNCislJUVPRg0KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbXBhdGliaWxpdHlfdG9jLmNzCmluZGV4IDE4M2MwZGUuLjA1NjYwNWEgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jb21wYXRpYmlsaXR5X3RvYy5jcwpAQCAtNyw3ICs3LDcgQEAKIDx1bD4KICAgPGxpPjxoMj5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPjx1bD4KICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Y29tcGF0aWJpbGl0eS9vdmVydmlldy5odG1sIj5Db21wYXRpYmlsaXR5IE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjMtY2RkLnBkZiI+Q3VycmVudCBDREQ8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMy4zLWNkZC5wZGYiPkN1cnJlbnQgQ0REPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvY3RzLWludHJvLmh0bWwiPkNUUyBJbnRyb2R1Y3Rpb248L2E+PC9saT4KICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Y29tcGF0aWJpbGl0eS9jdHMtZGV2ZWxvcG1lbnQuaHRtbCI+Q1RTIERldmVsb3BtZW50PC9hPjwvbGk+CiAgIDwvdWw+PC9saT4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvZG93bmxvYWRzLmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuamQKaW5kZXggNjFiZGZkOS4uMjdhMjEwOSAxMDA2NDQKLS0tIGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuamQKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuamQKQEAgLTcsMTIgKzcsMTAgQEAKIDxoMj5BbmRyb2lkIDIuMzwvaDI+CiA8cD5BbmRyb2lkIDIuMyBpcyB0aGUgcmVsZWFzZSBvZiB0aGUgZGV2ZWxvcG1lbnQgbWlsZXN0b25lIGNvZGUtbmFtZWQKIEdpbmdlcmJyZWFkLiBBbmRyb2lkIDIuMyBpcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEFuZHJvaWQuIFNvdXJjZSBjb2RlIGZvcgotQW5kcm9pZCAyLjMgaXMgZm91bmQgaW4gdGhlICdnaW5nZXJicmVhZCcgYnJhbmNoIGluIHRoZSBvcGVuLXNvdXJjZSB0cmVlLiBBCi1DVFMgcmVsZWFzZSBmb3IgQW5kcm9pZCAyLjMgaGFzIG5vdCB5ZXQgYmVlbiBwcmVwYXJlZCwgYnV0IG9uZSB3aWxsIGJlCi1hdmFpbGFibGUgc29vbi4KK0FuZHJvaWQgMi4zIGlzIGZvdW5kIGluIHRoZSAnZ2luZ2VyYnJlYWQnIGJyYW5jaCBpbiB0aGUgb3Blbi1zb3VyY2UgdHJlZS4KIDwvcD4KIDx1bD4KLSAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4zLWNkZC5wZGYiPkFuZHJvaWQgMi4zIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjMuMy1jZGQucGRmIj5BbmRyb2lkIDIuMy4zIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKTwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vZGwvYW5kcm9pZC9jdHMvYW5kcm9pZC1jdHMtMi4zX3IxLXg4Ni56aXAiPkFuZHJvaWQgMi4zIFIxIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSAoQ1RTKTwvYT48L2xpPgogPC91bD4KIApkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9uZGVmLXB1c2gtcHJvdG9jb2wucGRmIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9uZGVmLXB1c2gtcHJvdG9jb2wucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDBhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L25kZWYtcHVzaC1wcm90b2NvbC5wZGYKQEAgLTAsMCArMSw0NzEgQEAKKyVQREYtMS40DQorJZOMi54gUmVwb3J0TGFiIEdlbmVyYXRlZCBQREYgZG9jdW1lbnQgaHR0cDovL3d3dy5yZXBvcnRsYWIuY29tDQorJSAnQmFzaWNGb250cyc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMSAwIG9iag0KKyUgVGhlIHN0YW5kYXJkIGZvbnRzIGRpY3Rpb25hcnkNCis8PCAvRjEgMiAwIFINCisgL0YyIDMgMCBSDQorIC9GMyAxMyAwIFIgPj4NCitlbmRvYmoNCislICdGMSc6IGNsYXNzIFBERlR5cGUxRm9udCANCisyIDAgb2JqDQorJSBGb250IEhlbHZldGljYQ0KKzw8IC9CYXNlRm9udCAvSGVsdmV0aWNhDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GMQ0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdGMic6IGNsYXNzIFBERlR5cGUxRm9udCANCiszIDAgb2JqDQorJSBGb250IEhlbHZldGljYS1Cb2xkDQorPDwgL0Jhc2VGb250IC9IZWx2ZXRpY2EtQm9sZA0KKyAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZw0KKyAvTmFtZSAvRjINCisgL1N1YnR5cGUgL1R5cGUxDQorIC9UeXBlIC9Gb250ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNCAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MTEuMzI2Mw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA2MTMuMTE1DQorIDEzMi41MTI1DQorIDYyNC4zNjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0IDAgUg0KKyAvWFlaDQorIDU1DQorIDQzOS4wMTM4DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDYwMS44NjUNCisgMTA5LjU5MjUNCisgNjEzLjExNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQgMCBSDQorIC9YWVoNCisgNTUNCisgMzQ0LjA3NjMNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTkwLjYxNQ0KKyAxMjAuMDE3NQ0KKyA2MDEuODY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNCAwIFINCisgL1hZWg0KKyA1NQ0KKyAzMDcuNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1NzcuMzY1DQorIDE1OC4zNjUNCisgNTg4LjYxNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQgMCBSDQorIC9YWVoNCisgNTUNCisgMjMwLjY3MjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTY2LjExNQ0KKyAxMjQuMTg3NQ0KKyA1NzcuMzY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNSAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NjcuMDQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1NTQuODY1DQorIDEzOS42DQorIDU2Ni4xMTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MTguNjcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1NDMuNjE1DQorIDE0NC4xOTc1DQorIDU1NC44NjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzMjguNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1MzIuMzY1DQorIDEyMS42ODI1DQorIDU0My42MTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNSAwIFINCisgL1hZWg0KKyA1NQ0KKyAyMTkuNjcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1MjEuMTE1DQorIDExOC43NjUNCisgNTMyLjM2NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0YzJzogY2xhc3MgUERGVHlwZTFGb250IA0KKzEzIDAgb2JqDQorJSBGb250IFRpbWVzLVJvbWFuDQorPDwgL0Jhc2VGb250IC9UaW1lcy1Sb21hbg0KKyAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZw0KKyAvTmFtZSAvRjMNCisgL1N1YnR5cGUgL1R5cGUxDQorIC9UeXBlIC9Gb250ID4+DQorZW5kb2JqDQorJSAnUGFnZTEnOiBjbGFzcyBQREZQYWdlIA0KKzE0IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgNCAwIFINCisgNSAwIFINCisgNiAwIFINCisgNyAwIFINCisgOCAwIFINCisgOSAwIFINCisgMTAgMCBSDQorIDExIDAgUg0KKyAxMiAwIFIgXQ0KKyAvQ29udGVudHMgMzIgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAzMSAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UyJzogY2xhc3MgUERGUGFnZSANCisxNSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0NvbnRlbnRzIDMzIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMzEgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdQYWdlMyc6IGNsYXNzIFBERlBhZ2UgDQorMTYgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAzNCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDMxIDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUjE3JzogY2xhc3MgUERGQ2F0YWxvZyANCisxNyAwIG9iag0KKyUgRG9jdW1lbnQgUm9vdA0KKzw8IC9PdXRsaW5lcyAxOSAwIFINCisgL1BhZ2VNb2RlIC9Vc2VOb25lDQorIC9QYWdlcyAzMSAwIFINCisgL1R5cGUgL0NhdGFsb2cgPj4NCitlbmRvYmoNCislICdSMTgnOiBjbGFzcyBQREZJbmZvIA0KKzE4IDAgb2JqDQorPDwgL0F1dGhvciAoKQ0KKyAvQ3JlYXRpb25EYXRlIChEOjIwMTEwMzAzMjAwODE1KzA4JzAwJykNCisgL0tleXdvcmRzICgpDQorIC9Qcm9kdWNlciAocGlzYSBIVE1MIHRvIFBERiA8aHR0cDovL3d3dy5odG1sdG9wZGYub3JnPikNCisgL1N1YmplY3QgKCkNCisgL1RpdGxlIChBbmRyb2lkIE5ERUYgUHVzaCBQcm90b2NvbCBTcGVjaWZpY2F0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ1IxOSc6IGNsYXNzIFBERk91dGxpbmVzIA0KKzE5IDAgb2JqDQorPDwgL0NvdW50IDMNCisgL0ZpcnN0IDIwIDAgUg0KKyAvTGFzdCAyMCAwIFINCisgL1R5cGUgL091dGxpbmVzID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwIDAgb2JqDQorPDwgL0NvdW50IC00DQorIC9EZXN0IFsgMTQgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjEgMCBSDQorIC9MYXN0IDI0IDAgUg0KKyAvUGFyZW50IDE5IDAgUg0KKyAvVGl0bGUgKEFuZHJvaWQgTkRFRiBQdXNoIFByb3RvY29sIFNwZWNpZmljYXRpb24pID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEgMCBvYmoNCis8PCAvRGVzdCBbIDE0IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjIgMCBSDQorIC9QYXJlbnQgMjAgMCBSDQorIC9UaXRsZSAoVGFibGUgb2YgQ29udGVudHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjIgMCBvYmoNCis8PCAvRGVzdCBbIDE0IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjMgMCBSDQorIC9QYXJlbnQgMjAgMCBSDQorIC9QcmV2IDIxIDAgUg0KKyAvVGl0bGUgKDEuIFJldmlzaW9uIEhpc3RvcnkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMgMCBvYmoNCis8PCAvRGVzdCBbIDE0IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjQgMCBSDQorIC9QYXJlbnQgMjAgMCBSDQorIC9QcmV2IDIyIDAgUg0KKyAvVGl0bGUgKDIuIE92ZXJ2aWV3KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI0IDAgb2JqDQorPDwgL0NvdW50IC02DQorIC9EZXN0IFsgMTQgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjUgMCBSDQorIC9MYXN0IDMwIDAgUg0KKyAvUGFyZW50IDIwIDAgUg0KKyAvUHJldiAyMyAwIFINCisgL1RpdGxlICgzLiBEYXRhIEZvcm1hdCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNSAwIG9iag0KKzw8IC9EZXN0IFsgMTQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyNiAwIFINCisgL1BhcmVudCAyNCAwIFINCisgL1RpdGxlICgzLjEuIFByb3RvY29sIFZlcnNpb25zKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI3IDAgUg0KKyAvUGFyZW50IDI0IDAgUg0KKyAvUHJldiAyNSAwIFINCisgL1RpdGxlICgzLjIuIEhlYWRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyNyAwIG9iag0KKzw8IC9EZXN0IFsgMTUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyOCAwIFINCisgL1BhcmVudCAyNCAwIFINCisgL1ByZXYgMjYgMCBSDQorIC9UaXRsZSAoMy4zLiBOREVGIEVudHJ5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzI4IDAgb2JqDQorPDwgL0Rlc3QgWyAxNSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDI5IDAgUg0KKyAvUGFyZW50IDI0IDAgUg0KKyAvUHJldiAyNyAwIFINCisgL1RpdGxlICgzLjQuIEFjdGlvbiBDb2RlcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyOSAwIG9iag0KKzw8IC9EZXN0IFsgMTUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAzMCAwIFINCisgL1BhcmVudCAyNCAwIFINCisgL1ByZXYgMjggMCBSDQorIC9UaXRsZSAoMy41LiBTZXJ2ZXIpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMzAgMCBvYmoNCis8PCAvRGVzdCBbIDE1IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyNCAwIFINCisgL1ByZXYgMjkgMCBSDQorIC9UaXRsZSAoMy42LiBDbGllbnQpID4+DQorZW5kb2JqDQorJSAnUjMxJzogY2xhc3MgUERGUGFnZXMgDQorMzEgMCBvYmoNCislIHBhZ2UgdHJlZQ0KKzw8IC9Db3VudCAzDQorIC9LaWRzIFsgMTQgMCBSDQorIDE1IDAgUg0KKyAxNiAwIFIgXQ0KKyAvVHlwZSAvUGFnZXMgPj4NCitlbmRvYmoNCislICdSMzInOiBjbGFzcyBQREZTdHJlYW0gDQorMzIgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjA1NSA+Pg0KK3N0cmVhbQ0KK0dhdUhNPV02OCImOlVPN3MzUWc7LmsmaTlwOmZYPWMjL1pGUEJeJDY8SSMxYl5sdTA9XUpGJTpyciUiNUYqZk5BISU/aHRJPSxkWEMzOW1iKjVANCxeIjw9dFMmOl5nIVEnSGElMSVfTDBZYDN0cTw/IzlxRj4pVVhvayEvSGwkcD9pcltMcDUvcXRmJGQ0N0FrbTpOLktkMzNhNDtbLSEmOyZqdGcqX3FGRjMsYFtoc2k6Z00sdUQyJDFoTjJwRmxDK2h1KEJZLTVeK0JYOz9oJyVlai9CVFVwJzgoZ0tnamA8K0c7bmhzYW07NllgIisiZjBTW1MnWFRNa2ArNDZ1MlMrPEsjY149TkU9VF9CLVg8XD1QV2ZwLUE2c3JhYS83IWFQUCdfZiIvT1Nyc3RLVjhNcyVaNSQnQHE6WyUsWCNORChALGFkNGNSXl1lM09kOWNDSFFWViImNGYlQHI5b1NuWVhAQ1tbPzE8Sj5eVlxwZ3FOYDdVMm85VCQtSC1LJzNFcTdxJkY3MWA7OyRTTitYYzMtcSU4WUo2WCJLWENMKUtNPmIjaExMWm8sYlxaUUdKJF5PcGMpbmM/JixzaFgibE4pbDdqWi1sRkRpXV5EdFhZUHNEKEpjJ2RDO0xrSWNWJSkvYGlUSnVqW09KR2EkWUNmcFtSRE4qYT43Q01kWCo+X2I2X0JhamkuRl1MPlhuNlFWVDRrO3FdZj5tKmsrP2wjTD1sTy9AX2VhOyUzKyQpLSdzPjdYOF9rJ0xNdSYlVkppKVEuVCs5SW1DM1NWP3NpKHFCT1tIV1lJRjsqWU5jTVJqXmJmM1xlTnRoLi5eNExDI1xlOVImcy5SSkYuOVA0VENrKT4ta0tWMkcvaE9BUydMP0EqI1c2WihzPkdlOVZiTWVRViEjMkhnIV4qMCwoZ2o5SWRZNi5IUU81UjwiaUJ0MFJXPWlbbEJjW0gsWXVsSjdFZjFqXFJuRl1dT2hVN2NiJTRyTEs1UHRQTW9IK3MkbTMoSmgzUWdQM2tqdTsyTjpxJG5BV1NEX0NWVik2KmZuQiRVSVw0K3FEJ0FiNzNrO1MyM29JaXAhWzFZW2ZpUF42Y1wuY2wrOmRhSGxyJUhQaVEwPlhQJFBDPVxIbkpqME9eOlw8dSNRT2g+ai5LOidzIidsI2EnWF8mI0U2IUBVYVpuO0MydS5QUjdQX1ZUZiQibXNTVGA3dWdNSCUvaClfQjNkdVd1RlVccDNZNTE/VzQ4bGFAcjpVXVlNW1JkXyI+Yj49Tz0mSj0/QCVZXVgtcyQiRWluLSV1UXIiYSc7UD9Pal8xZzE9W2I8JldoQ1dUQWByclpyJjR1RlYlM21QUkUxTmplLEV1dENAYW9dQW84LjI1P0QodEZmKDxJMCJsJlMjRkpxSlc7cj9OUilMYjExWUo4bDpnOnJuZmxhVkc3SUBlXTRdUmg3LCN0X0FTQFpTJUQtYS5hMTNYJSdxZFYpOkVqNDJdVykmdVxuQFJdaWkvZEFlWT4yaClMYWYjVy1MUStuPUgpb2pNTl0qaTw6aVtYLydabkhOOGxtSnAxOileaHJZQjdaTVxRQS9VPU04NlNDQSY+KllrIT5JTTdBYWQ4IztfW2NTaGk/NmgoRGBNbjhOVTVOIVBDXlxRPlI2bjQ2RFBLMGMhKjlUJHJxXE1YXE9JQUFgNEppVVQ/Ul5GYGtsTllybVRXOls3RW4lNytLTFtNPkZHUytbVXNMOVRFUilwRyxrOmM5JHBzS0RDQ1Zdaj0yNiI8WVUlKkxuZDg9UXE6VERfSjVxbU03O2poQTU1JGZzT0VfOG5qQz9VNjopblhcLUJmYVkuVHM+KzQsISNkJnEjN2BcbFVSblNoU0VvcC5SSjAoY04xQydXYVlJIUkzImsuWEw/cDxyTCVfayxqVm1lWE9gM1lJJE06PFxwRExyRWFtQmBXI2ttX2JYMFUrR1hmZlU5LDRHKE1gSzhjLScvPkNCaVY/JTskJj5VaDRmJT04PydNalA8YURdYj04MC8uTmsqQHM8LF9eI1ZBLmI1OWZcN11vSWBZJicyW3NGUGFLJGdZQHFeWlIlXEFlWipDLSglRls5a1toTm9RLTcwKmpPLEsuPilycz5HZj1PU0F0cEsvanM8M1RIYTpRZ0RqZElWRmRoV0JtOC0yX0tXTXNeT2w0c3A3XGwhLFUjcUswbFYqQGQ4VWhHXyltLUZHMiJOKU4oRFJfIj4oaHBMU2lvWVEldF5HPWNSYSM7WXNvLztadW1gNSUtPWNgOiNHVFBfY1JkVE8xQDlxWipuVClOLmlPYEBgYF1hQ2RwPjlAM1lGODhAMUBnMmBPWllrJGlibUk3ajliInNEPiInTVg2SSx0bzJDPEQhTXNRMFtpQSdRJU1oJ2xyYWkwa1lHQUg+XU1gYzhZQmg/a0NJbCtnUDNTWyJNTlk1bnE9LVFHXSRSSjcwKVNKV2YlJC5ANGpmTTo+bmUpTnJKJzZWQVRxWksydTovP0AncWUqOEc8c0FnaWM9Y01uR1xkJ009ZFhUIUBqU2dfNGdYLDxWKlVkaXIvblBZIms8UTFDZUIqK2RZV00sJnRoLic0OTYlP0k+VDksdFMxJWBZZU5DbFJUKTlZJ2drbGI1SSpwYmIqQVgjJG5xUUUtIW9YNiVLbkpea0ZNRyJfS1RoYDlQTWBmI0R1Jzx1XmJdczZnTDA3X044cnJCYj1tZnJ+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzMyc6IGNsYXNzIFBERlN0cmVhbSANCiszMyAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyODM2ID4+DQorc3RyZWFtDQorR2IiLyo9YGA9VyZxM1ZWcl4vbnJbTigkVyVWc29gNSdDUWhhXycrbVhkWjg4QDdXcFVMNS8pbHA/OkNQMm8jTms1YC9ORFddXDRDQ15GYzMpQlcuQnJZZ150MkxbYVlHN1hsU1pAcXQ1JVFIJ2w9NVpjUiNxUzxWX3QqMmFEdDpwdGAyPThmPyMpWEMwb14+XWhEby86MjdHYGhTXGlTKTJsUDkrLUNTLXRaUklHOEUjXTd0OypXO2JcIykhWS9cZVZMPmUqKThuZ2M5aytfVWdMcmQ2NSdyNzNjPDJSYjhMOVc6OVBxWW5rRWEtS0E8Wz1zaEk0XipFR1llN2wtYT1kQUI7UHE/dGlgTUwoa3VqI1ZpN3RsKTs0aSUlKFJAQHVKa3UrT08yLW9AaiVLbGZkUjNvWSdRZW9iMkJJOyI9OU1BUUVzQWAqKFZZQD1QKiNQSWxrNy5kI24pOzMzRXJpNkptVDE5QXNxUmshcXROWzttLEtwZjo2YXJMYjAjME0/ZVRqJyViZFMiWylcME5rbCphLDRNP0RJa1ReZlgyXmhHcVxpWVFTU0pvR3IxLjVXLUlFbiJDJkVKcTZdZCQyOnBucW1bcVYvN2NsKjBGK1packJtVVdTKVNDSkBPa2Ijc0ZzMUYuai1pPCFlZ1RwKGUzUTN1dFE5JyoxKTwtQ1srUD0uRDkqLlIpLiEtWFNXZlBcXzE+ZFsyPHI1YkVaXE1QTEpJYG47NixwQ14+bWZjNU5uRFs9XDtDW29WVCF1JiJqSDFHJWRoJTJyP2owbC9oRS45YHFYSUFwLitVP0QsWWQqPk5wKF5tWj9GS0ouZSIzRFY2WDJnUzsrY0I2TWJmVzg+Uyk4W0NsZm90RXJQQD5CZSlWU3M1aSpVRCshalwrWDZnO1w/XDdVZWVWRiR0QWA4bDIuXiNFX2QjJEVUdSYzUWU+L0NBZUNEcDQxdHVxRGJZM2NqalRHXXNVQXFEN1c2Z203MD1mTHBfTDRQLUdPLilgJm4pcDNtbUFtRiVuP1luLHAnU0xRX2dLMEFNOGJIMTQ+QiZ0LUUyLkkrUll0W2ZGVCRmV2I0ZTlmN0RAWV4mRDlXbDwnZSFfR2MrSmpzREFiQSo9UXJ0Wzw8cFNDWWZLVDUzRSlwUUhuIjZeRVFnLCVhQjpvXjNKdTYkU3VjS1toQ3ExNEExOiZaLTwwRStLbVJWTHJZZGspR2VPNEAjRmkialNtTTo8UUstJ3ReKmpcUlQqTVFITUFvMEczW3FcKys0WEZTVWc2PWhbYTNYKmVEXWEwaDpJR0hXMyJ0RUwtPkhvI3EoIzdzIVl1L09UXEcpYjY3MC9xZmNYXkRYNCpEZUYlVVJKVz5hOSw3VCJVKXA5MTAwSUNzPihrJTAvTVpfWzFBOTppRjJqQUo2RWAhOV1PR2wjKW4vQ3FuI2hJbExxN1Y7VW8oXCZEWkhiRChdTSolUSdXXkZEW25BaTtQKjNgNz9AcS08VE1XSEphdGxfb1tsQlZscHJAVitGVygxKCk3dCI/YzpnSyEwb25HSXApP0RrMGdDdC9QLiNlV0FyZTojbyxFIk5FXzVyOFEiTiNvb3NFM2tYWDBjNUY7TDFcVE8maiFqdFZZQFooLVMpbjNRWVo8MzpNK009SGxmOyRLM2RVSU5aLWBnTExeLVw/Yi1xYlREN1MjYG1KNypgdUltUDItITBuP211K2g9blZIVj8jNio4M1Q5LFs6IThOTjswJDZlZU5GJW4xbzohUVVjYSdrbFQhOD1RXklsNTxUWypKXzFIL3M3Y3RIOkhGbzZVOic+OSUlOWBuJlNbTyNnZzgiSFArZHUpRExSQztSKl5ZVzVpNHNGPVsnLl9KQFonKEhgLFM+NExZWk9JXzokNkFLUTY8XTJyPj5jNFNzS0VgMmMtNEJQTGBLSCkuVEdONygjKlw7cU9LM1AoOTArbFpgTlcmL0RPNG9jYWNWdWYhWzknY2BDSldNN0dYQkVDcS1SMXBrXnQkPjJcSDA6SjUuXmdGTmY8OEpQInEkQCElIjVLIlYvITJfayVYS2pZZSsxQWxwcjBdaz1ZOl1NW2M8YWxOLGNuYDtnOGJQaTlySGEhcihRWjxbKj5NJSkoPzdeVishRyFOQTQ1dUFPNVJgQ0JDQnRlVjRSaytFcWs6JT02Z2tdOFNWNiwvQTo0Iy1rcHVPS0NLPmJWOCwtayFxST82PUhyRCMxI1xkSj9ZJzpLX0ZIbiswR0s4X1lUaVRmdSVRa1R0Nz1GKFlQWGNFIjpxckJmNjA3RHJHIjRuNjteWldFYlVIKjtJI00pJiJRSjdNKllZPGJjLSNmY3FqMmBGNDVRWDxlIWBdVCYhYSwzR0xeS0BIKkFsWyE2LWp0cDxjS1xCUSwjLihFVkxjPmEiJk1TTUdOMitSWWovT3I2J1xUaXEzTXQpJmhSZkU5Xi9NKHJrSTlmUSpaTScnT0pVbmdALF5pWzo9OmZkTEswTmo+LV0jak4pXnRAVVc7JnRvJGRpY0gvRHAjVy9lNmpNRTNGWVxuRTdkTjsyOj0mYUBkQWdLLSE+OiEsIzdFXjFmcWBuXDBYZjpqVF1JNVVcOWxJOHQpOGAlNmwtUko0QVZTP0NAMFpiOVckQnBZTSUrM1RQczVsJlVFZTQ9a0RKZTNDcj9yb2ctbVNYPCxAJT0vaTdbZiVyY3EtQztnSmszKHJQOTpoam1OJ2ZmJkUzOjQoV3FsO0JmVTYrM2RFLlYhNkhFZFlvS180anEoakBQLjQka2JkOmAsJSEjNjxWR3UvKG5lZC9dLkU5ajxALGxRMmAtU1ZII2gwblBmcTEwPXBvSTNEOHMjODBcTGtoa2xYJSJjUFswXDZnT3VnUlp0MkghNnJKTmZaZ2FILT4xa2wnKEwsJklZKiNlZG0/aCRgLF4wTT1EP18vOGp1U0w8NT5vLGhGVEpRLHRQbHFHcGBuckUjL3JXJllUcksrNF1KUDQxMVVgREIncnEyJExISEondTA4YFYrVTBCSTo+OlpJPzlbOSpOXi5PUmNOS0lKYnVrRDMiakw1YGFJR0ZFMDhgbDhcNkZuJ1AmZkhcQUBqX0ArSHBGLyYhZjxQPmpSRiZCXUw1SFZrZWdqQHFpSlU+VmNBZjNMSm1vTEQjMkVec2MpRVt1aURsX1E9LVhfSzlTbU0iREk2TD1cZGxuL103ZFVWQyI/dSZtdFMxPC9lRU1FKD5NTDJMPitTVj9gbW9hNVApNiI5XVIkP1xDZWEsX3MlTjshJ1dSJl10OGRoWFI1I1RXYHJMTVBbXWlgQj85OylZOERKdVBgckA+YGVCTGg1JVIjWUJGYk1RU2wnSUo1SGkidDVDcmskbzgnLS1dKFhgVE4tTEIsblJkT2UzOWE4LisuOlROPXFHY2o/Q2AqPE5jSTdmYUxpbTgqc09vb0dHYyJNK1NrITYqSWJaTGklTEJIWU9AREtfaCNYI2VGLXFPTDVjIzBhPzZeTydVKlY6OTBLIk81UCdHRzhxLXU3QyhJPkcpalZrcDRpUCcocS9ATiUpJTxdPyZTUjJRJl1EPWA3OCtjcUtmXkZYUlFsZDxwZClzdWBcUSE4MUlcP1VJMFJnL0tCai8/NE1aXmU3TFAoYFw/L183YShWbm5vXlVtMzg0QSFZJHFNWExBLnBfbWktQGQoayphQytMaGJFamJOUVxpIkVfTVJrYUpLXFFzaWA0MDBiW1sibVFTcmNCUUleV1d1XlBxcltvX1s0QUV+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IzNCc6IGNsYXNzIFBERlN0cmVhbSANCiszNCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNjYgPj4NCitzdHJlYW0NCitHYXUwO18rcW0lJSkjYS01Si8zYCZhSEgjRytRV0lnTDdzSDVZNCs+ZTBWM0A1bDVvVl5sW0tpJUdBJWdwWyVXajZDIS5DRlUpPHJcNkJQOUs2TnRsZV9pPVFcTGBiJGwiZikoY3JzUzlHKC9BJj5JbjRiPFxyLy5tcSVWXGwuYTpaYFM+dFMrQiIla3FOSVtTQiFTTFklKnVHUD8lWk0iMnFgVktvNj11WF5RNVkycm5oTDkwNXU9ZTUlPS1ZXl4uWT1AaGRncEVOb2xtMCFtQVhtW0sjRSZAQWIvXVg2bU1fP0AmMExyImNkRF9kOiNwaDxGX2RsRVZhXSc+Pys7JjE2JmQ5cz9+PmVuZHN0cmVhbQ0KK2VuZG9iag0KK3hyZWYNCiswIDM1DQorMDAwMDAwMDAwMCA2NTUzNSBmDQorMDAwMDAwMDExMyAwMDAwMCBuDQorMDAwMDAwMDIzNCAwMDAwMCBuDQorMDAwMDAwMDM5OSAwMDAwMCBuDQorMDAwMDAwMDU4NyAwMDAwMCBuDQorMDAwMDAwMDgxNCAwMDAwMCBuDQorMDAwMDAwMTA0MSAwMDAwMCBuDQorMDAwMDAwMTI2OCAwMDAwMCBuDQorMDAwMDAwMTQ5NCAwMDAwMCBuDQorMDAwMDAwMTcyMSAwMDAwMCBuDQorMDAwMDAwMTk0NSAwMDAwMCBuDQorMDAwMDAwMjE3MyAwMDAwMCBuDQorMDAwMDAwMjQwMSAwMDAwMCBuDQorMDAwMDAwMjYxNSAwMDAwMCBuDQorMDAwMDAwMjc4MyAwMDAwMCBuDQorMDAwMDAwMzE0MCAwMDAwMCBuDQorMDAwMDAwMzQxMCAwMDAwMCBuDQorMDAwMDAwMzY4MSAwMDAwMCBuDQorMDAwMDAwMzgxOSAwMDAwMCBuDQorMDAwMDAwNDA2NSAwMDAwMCBuDQorMDAwMDAwNDE5MCAwMDAwMCBuDQorMDAwMDAwNDM5NSAwMDAwMCBuDQorMDAwMDAwNDU0OSAwMDAwMCBuDQorMDAwMDAwNDcyMCAwMDAwMCBuDQorMDAwMDAwNDg4MyAwMDAwMCBuDQorMDAwMDAwNTA3NyAwMDAwMCBuDQorMDAwMDAwNTIzNiAwMDAwMCBuDQorMDAwMDAwNTM5OSAwMDAwMCBuDQorMDAwMDAwNTU2NiAwMDAwMCBuDQorMDAwMDAwNTczNSAwMDAwMCBuDQorMDAwMDAwNTg5OCAwMDAwMCBuDQorMDAwMDAwNjAyOCAwMDAwMCBuDQorMDAwMDAwNjE1NCAwMDAwMCBuDQorMDAwMDAwODM1MiAwMDAwMCBuDQorMDAwMDAxMTMzMSAwMDAwMCBuDQordHJhaWxlcg0KKzw8IC9JRCANCisgJSBSZXBvcnRMYWIgZ2VuZXJhdGVkIFBERiBkb2N1bWVudCAtLSBkaWdlc3QgKGh0dHA6Ly93d3cucmVwb3J0bGFiLmNvbSkgDQorIFsoTFwwMjZcMzE2LlwyNjVcMzQ3XDIyM1wzNjVcMjA0eVwwMTBcMzYxXDM0MVwzNDRcMzMwXDM2MCkgKExcMDI2XDMxNi5cMjY1XDM0N1wyMjNcMzY1XDIwNHlcMDEwXDM2MVwzNDFcMzQ0XDMzMFwzNjApXSANCisNCisgL0luZm8gMTggMCBSDQorIC9Sb290IDE3IDAgUg0KKyAvU2l6ZSAzNSA+Pg0KK3N0YXJ0eHJlZg0KKzExNzEyDQorJSVFT0YNCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9pbmRleC5qZCBiL3Bkay9kb2NzL2luZGV4LmpkCmluZGV4IGQ4ZjE3MzkuLmY1YTkzNDQgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2luZGV4LmpkCisrKyBiL3Bkay9kb2NzL2luZGV4LmpkCkBAIC0zLDEyICszLDEyIEBACiBAamQ6Ym9keQogPGRpdiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyB3aWR0aDogMzUlOyI+CiA8aDMgc3R5bGU9InBhZGRpbmctdG9wOiAwcHg7Ij5OZXdzPC9oMz4KLTxwPjxiPkNvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBmb3IgQW5kcm9pZCAyLjM8L2I+PGJyLz4KLVRoZSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgZm9yIEFuZHJvaWQgMi4zIGhhcyBiZWVuIHB1Ymxpc2hlZC4gCi1UaGUgMi4zIENERCBhbGxvd3MgZGV2aWNlIG1hbnVmYWN0dXJlcnMgdG8gdXNlIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlIHRvIHNoaXAKKzxwPjxiPkNvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBmb3IgQW5kcm9pZCAyLjMuMzwvYj48YnIvPgorVGhlIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCBmb3IgQW5kcm9pZCAyLjMuMyBoYXMgYmVlbiBwdWJsaXNoZWQuIAorQW5kcm9pZCAyLjMgYWxsb3dzIGRldmljZSBtYW51ZmFjdHVyZXJzIHRvIHVzZSB0aGUgQW5kcm9pZCBzb3VyY2UgY29kZSB0byBzaGlwCiBhIHNpZ25pZmljYW50bHkgd2lkZXIgdmFyaWV0eSBvZiBkZXZpY2VzLCBpbmNsdWRpbmcgZGV2aWNlcyB3aXRoIGV4dHJhLWxhcmdlCi1zY3JlZW5zLCBzdWNoIGFzIHRhYmxldHMuICBBIHJlbGVhc2Ugb2YgdGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSBpcyBub3QKLXlldCBhdmFpbGFibGUsIGJ1dCB3aWxsIGJlIHNvb24uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgPGEKK3NjcmVlbnMsIHN1Y2ggYXMgdGFibGV0cy4gQW5kcm9pZCAyLjMuMyBhZGRzIGVuaGFuY2VkIE5lYXItRmllbGQKK0NvbW11bmljYXRpb25zIHN1cHBvcnQgdG8gdGhlIEFuZHJvaWQgQVBJcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCA8YQogaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCI+dmlzaXQgdGhlIENvbXBhdGliaWxpdHkgcGFnZS48L2E+CiA8L3A+CiA8cD48Yj5Tb3VyY2UgQ29kZSBBdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zPC9iPjxici8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWQubWsgYi9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWQubWsKaW5kZXggNzkyMTEyMC4uYWJhZjc5OCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkLm1rCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZC5tawpAQCAtMTAsNiArMTAsOCBAQAogICAgICAgICBzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JUmVtb3RlU2VydmljZUNhbGxiYWNrLmFpZGwgXAogICAgICAgICBzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JU2Vjb25kYXJ5LmFpZGwgXAogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LXY0CisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBBcGlEZW1vcwogCiBMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNzFjM2EwNi4uYzU3MDMyMiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzYsNiArMzYsOCBAQAogICAgIDwhLS0gRm9yIGFuZHJvaWQubWVkaWEuYXVkaW9meC5WaXN1YWxpemVyIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIiAvPgogCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgLz4KKwogICAgIDwhLS0gV2Ugd2lsbCByZXF1ZXN0IGFjY2VzcyB0byB0aGUgY2FtZXJhLCBzYXlpbmcgd2UgcmVxdWlyZSBhIGNhbWVyYQogICAgICAgICAgb2Ygc29tZSBzb3J0IGJ1dCBub3Qgb25lIHdpdGggYXV0b2ZvY3VzIGNhcGFiaWxpdHkuIC0tPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiAvPgpAQCAtNDQsNyArNDYsOCBAQAogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iQXBpRGVtb3NBcHBsaWNhdGlvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfc2FtcGxlX2NvZGUiCi0gICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfc2FtcGxlX2NvZGUiID4KKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2FwcF9zYW1wbGVfY29kZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0idHJ1ZSI+CiAKICAgICAgICAgPCEtLSBUaGlzIGlzIGhvdyB3ZSBjYW4gcmVxdWVzdCBhIGxpYnJhcnkgYnV0IHN0aWxsIGFsbG93IHRoZSBhcHAKICAgICAgICAgICAgICB0byBiZSBpbnN0YWxsZWQgaWYgaXQgZG9lc24ndCBleGlzdC4gLS0+CkBAIC03Myw3ICs3Niw3IEBACiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5EaWFsb2dBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X2RpYWxvZyIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2ciPgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8uRGlhbG9nIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTE0OSw2ICsxNTIsMjMgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFjdGl2aXR5UmVjcmVhdGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpdml0eV9yZWNyZWF0ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuU29mdElucHV0TW9kZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9zb2Z0X2lucHV0X21vZGVzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlJlY2VpdmVSZXN1bHQiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfcmVjZWl2ZV9yZXN1bHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTU2LDcgKzE3Niw4IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5TZW5kUmVzdWx0Ij4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5TZW5kUmVzdWx0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZURpYWxvZ1doZW5MYXJnZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5Gb3J3YXJkaW5nIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X2ZvcndhcmRpbmciPgpAQCAtMTgyLDkgKzIwMywxMiBAQAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlJlZGlyZWN0R2V0dGVyIj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8IS0tIFRoaXMgc2FtcGxlIGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBuZXcgYWN0aW9uIGJhciwgc28gdXNlCisgICAgICAgICAgICAgdGhlIG9sZCBzdHlsZSB0aGVtZS4gLS0+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuQ3VzdG9tVGl0bGUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpdml0eV9jdXN0b21fdGl0bGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZVZpc2libGV8YWRqdXN0UGFuIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlVmlzaWJsZXxhZGp1c3RQYW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgpAQCAtMjE4LDYgKzI0MiwyODMgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gRnJhZ21lbnQgU2FtcGxlcyAtLT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50QWxlcnREaWFsb2ciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9hbGVydF9kaWFsb2ciCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50QXJndW1lbnRzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYXJndW1lbnRzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudEhpZGVTaG93IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfaGlkZV9zaG93IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVVbmNoYW5nZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50Q29udGV4dE1lbnUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9jb250ZXh0X21lbnUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50RGlhbG9nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfZGlhbG9nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50TGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfbGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudExheW91dCREZXRhaWxzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMaXN0QXJyYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9saXN0X2FycmF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudE1lbnUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9tZW51IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudFJldGFpbkluc3RhbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudFJlY2VpdmVSZXN1bHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9yZWNlaXZlX3Jlc3VsdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRTdGFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X3N0YWNrIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBGcmFnbWVudCBTdXBwb3J0IFNhbXBsZXMgLS0+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50QWxlcnREaWFsb2dTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYWxlcnRfZGlhbG9nX3N1cHBvcnQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zdXBwb3J0LmFwcC5GcmFnbWVudEFyZ3VtZW50c1N1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9hcmd1bWVudHNfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50SGlkZVNob3dTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfaGlkZV9zaG93X3N1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZVVuY2hhbmdlZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50Q29udGV4dE1lbnVTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfY29udGV4dF9tZW51X3N1cHBvcnQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zdXBwb3J0LmFwcC5GcmFnbWVudERpYWxvZ1N1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9kaWFsb2dfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eVN1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHlfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50TGF5b3V0U3VwcG9ydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2xheW91dF9zdXBwb3J0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuc3VwcG9ydC5hcHAuRnJhZ21lbnRMaXN0QXJyYXlTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfbGlzdF9hcnJheV9zdXBwb3J0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuc3VwcG9ydC5hcHAuRnJhZ21lbnRMYXlvdXRTdXBwb3J0JERldGFpbHNBY3Rpdml0eSIgLz4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuc3VwcG9ydC5hcHAuRnJhZ21lbnRNZW51U3VwcG9ydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X21lbnVfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50UmV0YWluSW5zdGFuY2VTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlX3N1cHBvcnQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zdXBwb3J0LmFwcC5GcmFnbWVudFJlY2VpdmVSZXN1bHRTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcmVjZWl2ZV9yZXN1bHRfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50U3RhY2tTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfc3RhY2tfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkZyYWdtZW50UGFnZXJTdXBwb3J0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcGFnZXJfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBMb2FkZXIgU2FtcGxlcyAtLT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkxvYWRlckN1cnNvciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvYWRlcl9jdXJzb3IiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkxvYWRlckN1c3RvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xvYWRlcl9jdXN0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworPCEtLSBCRUdJTl9JTkNMVURFKGxvYWRlcl90aHJvdHRsZSkgLS0+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuTG9hZGVyVGhyb3R0bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2FkZXJfdGhyb3R0bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iLmFwcC5Mb2FkZXJUaHJvdHRsZSRTaW1wbGVQcm92aWRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YXV0aG9yaXRpZXM9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTG9hZGVyVGhyb3R0bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiIC8+Cis8IS0tIEVORF9JTkNMVURFKGxvYWRlcl90aHJvdHRsZSkgLS0+CisKKyAgICAgICAgPCEtLSBGcmFnbWVudCBTdXBwb3J0IFNhbXBsZXMgLS0+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnN1cHBvcnQuYXBwLkxvYWRlckN1cnNvclN1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2FkZXJfY3Vyc29yX3N1cHBvcnQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5zdXBwb3J0LmFwcC5Mb2FkZXJUaHJvdHRsZVN1cHBvcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sb2FkZXJfdGhyb3R0bGVfc3VwcG9ydCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9Ii5zdXBwb3J0LmFwcC5Mb2FkZXJUaHJvdHRsZVN1cHBvcnQkU2ltcGxlUHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuTG9hZGVyVGhyb3R0bGUiIC8+CiAKICAgICAgICAgPCEtLSBJbnRlbnQgU2FtcGxlcyAtLT4KIApAQCAtMjI4LDYgKzUyOSwxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuSW50ZW50QWN0aXZpdHlGbGFncyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X2ludGVudF9hY3Rpdml0eV9mbGFncyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSBTZXJ2aWNlIFNhbXBsZXMgLS0+CiAKICAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuYXBwLkxvY2FsU2VydmljZSIgLz4KQEAgLTM2MSwxMiArNjcwLDE2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5JbmNvbWluZ01lc3NhZ2UiIGFuZHJvaWQ6bGFiZWw9IkFwcC9Ob3RpZmljYXRpb24vSW5jb21pbmdNZXNzYWdlIj4KKzwhLS0gQkVHSU5fSU5DTFVERShub190YXNrX2FmZmluaXR5KSAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5JbmNvbWluZ01lc3NhZ2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQXBwL05vdGlmaWNhdGlvbi9JbmNvbWluZ01lc3NhZ2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXNrQWZmaW5pdHk9IiI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+Cis8IS0tIEVORF9JTkNMVURFKG5vX3Rhc2tfYWZmaW5pdHkpIC0tPgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuSW5jb21pbmdNZXNzYWdlVmlldyIgYW5kcm9pZDpsYWJlbD0iQXBwL05vdGlmaWNhdGlvbi9JbmNvbWluZ01lc3NhZ2VWaWV3Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtNTI3LDUwICs4NDAsNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDwhLS0gUHJlZmVyZW5jZXMgU2FtcGxlcyAtLT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlByZWZlcmVuY2VzRnJvbVhtbCIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlc19mcm9tX3htbCI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5QcmVmZXJlbmNlc0Zyb21Db2RlIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2VzX2Zyb21fY29kZSI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5BZHZhbmNlZFByZWZlcmVuY2VzIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FkdmFuY2VkX3ByZWZlcmVuY2VzIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkxhdW5jaGluZ1ByZWZlcmVuY2VzIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2xhdW5jaGluZ19wcmVmZXJlbmNlcyI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5QcmVmZXJlbmNlRGVwZW5kZW5jaWVzIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2VfZGVwZW5kZW5jaWVzIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkRlZmF1bHRWYWx1ZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGVmYXVsdF92YWx1ZXMiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCiAgICAgICAgIDwhLS0gRGV2aWNlIEFkbWluIFNhbXBsZXMgLS0+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5EZXZpY2VBZG1pblNhbXBsZSRDb250cm9sbGVyIgpAQCAtNjEyLDEwICs4ODEsMTM2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPCEtLSBBY3Rpb24gQmFyIFNhbXBsZXMgLS0+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuQWN0aW9uQmFyTWVjaGFuaWNzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aW9uX2Jhcl9tZWNoYW5pY3MiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFjdGlvbkJhclVzYWdlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aW9uX2Jhcl91c2FnZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuQWN0aW9uQmFyRGlzcGxheU9wdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxvZ289IkBkcmF3YWJsZS9hcGlkZW1vX2FuZHJvaWRsb2dvIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5BY3Rpb25CYXJUYWJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aW9uX2Jhcl90YWJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSBBcHBsaWNhdGlvbiBVcGRhdGluZyBTYW1wbGVzIC0tPgorCis8IS0tIEJFR0lOX0lOQ0xVREUoYXBwX3VwZGF0ZV9kZWNsYXJhdGlvbikgLS0+CisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9Ii5hcHAuQXBwVXBkYXRlUmVjZWl2ZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NWV9QQUNLQUdFX1JFUExBQ0VEIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorPCEtLSBFTkRfSU5DTFVERShhcHBfdXBkYXRlX2RlY2xhcmF0aW9uKSAtLT4KKworICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgICAgIDwhLS0gICAgICAgUFJFRkVSRU5DRSBQQUNLQUdFIFNBTVBMRVMgICAgICAtLT4KKyAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkZyYWdtZW50UHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9wcmVmZXJlbmNlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VXaXRoSGVhZGVycyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2Vfd2l0aF9oZWFkZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuUHJlZmVyZW5jZXNGcm9tWG1sIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZXNfZnJvbV94bWwiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VzRnJvbUNvZGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlc19mcm9tX2NvZGUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkFkdmFuY2VkUHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hZHZhbmNlZF9wcmVmZXJlbmNlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuTGF1bmNoaW5nUHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9sYXVuY2hpbmdfcHJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VEZXBlbmRlbmNpZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wcmVmZXJlbmNlX2RlcGVuZGVuY2llcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuRGVmYXVsdFZhbHVlcyIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZWZhdWx0X3ZhbHVlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogICAgICAgICA8IS0tICAgICAgICBDT05URU5UIFBBQ0tBR0UgU0FNUExFUyAgICAgICAgLS0+CiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuY29udGVudC5DbGlwYm9hcmRTYW1wbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hY3Rpdml0eV9jbGlwYm9hcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuY29udGVudC5FeHRlcm5hbFN0b3JhZ2UiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfZXh0ZXJuYWxfc3RvcmFnZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC02MzIsNiArMTAyNywxNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5jb250ZW50LlJlc291cmNlc1dpZHRoQW5kSGVpZ2h0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfcmVzb3VyY2VzX3dpZHRoX2FuZF9oZWlnaHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SWNlQ3JlYW1TYW5kd2ljaCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRU1CRUQiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmNvbnRlbnQuUmVhZEFzc2V0IiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X3JlYWRfYXNzZXQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtNjk3LDYgKzExMDIsMTI2IEBACiAgICAgICAgIDwvcmVjZWl2ZXI+CiAKICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgICAgICA8IS0tICAgICBBTkRST0lELkFOSU1BVElPTiBQQUNLQUdFIFNBTVBMRVMgICAgICAgICAtLT4KKyAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uQW5pbWF0aW9uTG9hZGluZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vTG9hZGluZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5BbmltYXRpb25DbG9uaW5nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9DbG9uaW5nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJAYm9vbC9hdExlYXN0SG9uZXljb21iIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdGlvblNlZWtpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL1NlZWtpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uQW5pbWF0b3JFdmVudHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0V2ZW50cyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5Cb3VuY2luZ0JhbGxzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9Cb3VuY2luZyBCYWxscyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5DdXN0b21FdmFsdWF0b3IiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0N1c3RvbSBFdmFsdWF0b3IiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTGlzdEZsaXBwZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL1ZpZXcgRmxpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uUmV2ZXJzaW5nQW5pbWF0aW9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9SZXZlcnNpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vTXVsdGlwbGUgUHJvcGVydGllcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFuaW1hdGlvbi5MYXlvdXRBbmltYXRpb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9MYXlvdXQgQW5pbWF0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uc0hpZGVTaG93IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9IaWRlLVNob3cgQW5pbWF0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTGF5b3V0QW5pbWF0aW9uc0J5RGVmYXVsdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vRGVmYXVsdCBMYXlvdXQgQW5pbWF0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KICAgICAgICAgPCEtLSAgICAgQU5JTUFUSU9OIFBBQ0tBR0UgU0FNUExFUyAgICAgICAgIC0tPgogICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CiAKQEAgLTgzMCwyMSArMTM1NSw1MCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlRhYnMxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9UYWJzL0NvbnRlbnQgQnkgSWQiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Ib3Jpem9udGFsU2Nyb2xsVmlldzEiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xheW91dHMvSG9yaXpvbnRhbFNjcm9sbFZpZXciPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlRhYnMxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9UYWJzLzEuIENvbnRlbnQgQnkgSWQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzMiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy9Db250ZW50IEJ5IEZhY3RvcnkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzMiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy8yLiBDb250ZW50IEJ5IEZhY3RvcnkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzMyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy9Db250ZW50IEJ5IEludGVudCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlRhYnMzIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9UYWJzLzMuIENvbnRlbnQgQnkgSW50ZW50Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuVGFiczQiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1RhYnMvNC4gTm9uIEhvbG8gdGhlbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlRhYnM1IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9UYWJzLzUuIFNjcm9sbGFibGUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzNiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy82LiBSaWdodCBhbGlnbmVkIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIi8+CkBAIC05NDIsMjcgKzE0OTYsNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlRhYnMxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9UYWJzL0NvbnRlbnQgQnkgSWQiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzMiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy9Db250ZW50IEJ5IEZhY3RvcnkiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5UYWJzMyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvVGFicy9Db250ZW50IEJ5IEludGVudCI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkJhc2VsaW5lMSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGF5b3V0cy9CYXNlbGluZS8xLiBUb3AiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTA1NCw2MyArMTU4Nyw2MyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8xLiBBcnJheSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wMS4gQXJyYXkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QyIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8yLiBDdXJzb3IgKFBlb3BsZSkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDIuIEN1cnNvciAoUGVvcGxlKSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDMiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzMuIEN1cnNvciAoUGhvbmVzKSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QzIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wMy4gQ3Vyc29yIChQaG9uZXMpIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNC4gTGlzdEFkYXB0ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDQuIExpc3RBZGFwdGVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNS4gU2VwYXJhdG9ycyI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q1IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wNS4gU2VwYXJhdG9ycyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDYiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzYuIExpc3RBZGFwdGVyIENvbGxhcHNlZCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q2IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wNi4gTGlzdEFkYXB0ZXIgQ29sbGFwc2VkIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNy4gQ3Vyc29yIChQaG9uZXMpIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzA3LiBDdXJzb3IgKFBob25lcykiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q4IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy84LiBQaG90b3MiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0OCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDguIFBob3RvcyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDkiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzkuIEFycmF5IChPdmVybGF5KSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q5IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wOS4gQXJyYXkgKE92ZXJsYXkpIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTExNTIsNiArMTY4NSwyNyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxNSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMTUuIFNlbGVjdGlvbiBNb2RlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MTYiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzE2LiBCb3JkZXIgc2VsZWN0aW9uIG1vZGUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxNyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMTcuIEFjdGl2YXRlIGl0ZW1zIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5FeHBhbmRhYmxlTGlzdDEiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0V4cGFuZGFibGUgTGlzdHMvMS4gQ3VzdG9tIEFkYXB0ZXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTIxNyw2ICsxNzcxLDE0IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuR3JpZDMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9HcmlkLzMuIFNlbGVjdGlvbiBNb2RlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5JbWFnZVZpZXcxIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0ltYWdlVmlldyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KQEAgLTEzMjAsMTUgKzE4ODIsNTUgQEAKICAgICAgICAgPC9hY3Rpdml0eT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvMS4gTGlnaHQgVGhlbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvMS4gTGlnaHQgVGhlbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHMyIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy8yLiBEZWZhdWx0IFRoZW1lIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHMyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvMi4gRGFyayBUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy8zLiBIb2xvIExpZ2h0IFRoZW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5MaWdodCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHM0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvNC4gSG9sbyBEYXJrIFRoZW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iQGJvb2wvYXRMZWFzdEhvbmV5Y29tYiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuQ29udHJvbHM1IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvQ29udHJvbHMvNS4gQ3VzdG9tIFRoZW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0N1c3RvbVRoZW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczYiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy82LiBIb2xvIG9yIE9sZCBUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZUhvbG8iPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgpAQCAtMTQ1NSw2ICsyMDU3LDEzIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuRm9jdXM1IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Gb2N1cy81LiBTZXF1ZW50aWFsIChUYWIgT3JkZXIpIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5EYXRlV2lkZ2V0czEiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0RhdGUgV2lkZ2V0cy8xLiBEaWFsb2ciPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTQ2OSw2ICsyMDc4LDM4IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuUG9wdXBNZW51MSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvUG9wdXAgTWVudSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU2VhcmNoVmlld0FjdGlvbkJhciIgYW5kcm9pZDpsYWJlbD0iVmlld3MvU2VhcmNoIFZpZXcvQWN0aW9uIEJhciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5kZWZhdWx0X3NlYXJjaGFibGUiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9Ii5hcHAuU2VhcmNoUXVlcnlSZXN1bHRzIiAvPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlNlYXJjaFZpZXdGaWx0ZXJNb2RlIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9TZWFyY2ggVmlldy9GaWx0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuUm90YXRpbmdCdXR0b24iIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1JvdGF0aW5nIEJ1dHRvbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU2VjdXJlVmlldyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvU2VjdXJlIFZpZXciPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtMTQ3Niw2ICsyMTE3LDMwIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuU3BsaXRUb3VjaFZpZXciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1NwbGl0dGluZyBUb3VjaGVzIGFjcm9zcyBWaWV3cyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuRHJhZ0FuZERyb3BEZW1vIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0RyYWcgYW5kIERyb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuYWJsZWQ9IkBib29sL2F0TGVhc3RIb25leWNvbWIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkdhbWVDb250cm9sbGVySW5wdXQiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0dhbWUgQ29udHJvbGxlciBJbnB1dCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogICAgICAgICA8IS0tICAgICAgICAgICBHUkFQSElDUyBTQU1QTEVTICAgICAgICAgICAgLS0+CiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KQEAgLTE1NzIsOSArMjIzNywxOSBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5IaWRkZW5BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9PcGVuR0wgRVMvSGlkZGVuIEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLlRyaWFuZ2xlQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvT3BlbkdMIEVTL1RleHR1cmVkIFRyaWFuZ2xlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5EaWFsb2ciCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CkBAIC0xNjQ2LDcgKzIzMjEsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5UZXh0QWxpZ24iIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL1RleHQgQWxpZ24iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLlRleHRBbGlnbiIgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvVGV4dCBBbGlnbiI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CkBAIC0xNjY3LDcgKzIzNDMsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5DbGlwcGluZyIgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvQ2xpcHBpbmciPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLkNsaXBwaW5nIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9DbGlwcGluZyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CkBAIC0xNjgxLDcgKzIzNTgsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5Vbmljb2RlQ2hhcnQiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL1VuaWNvZGVDaGFydCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuZ3JhcGhpY3MuVW5pY29kZUNoYXJ0IiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9Vbmljb2RlQ2hhcnQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgpAQCAtMTY5NSwxNCArMjM3MywxNiBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5QaWN0dXJlcyIgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvUGljdHVyZXMiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLlBpY3R1cmVzIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9QaWN0dXJlcyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLlZlcnRpY2VzIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9WZXJ0aWNlcyI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9ImZhbHNlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuZ3JhcGhpY3MuVmVydGljZXMiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL1ZlcnRpY2VzIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTE3NzksNyArMjQ1OSw4IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLkJpdG1hcERlY29kZSIgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvQml0bWFwRGVjb2RlIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5CaXRtYXBEZWNvZGUiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL0JpdG1hcERlY29kZSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CkBAIC0xODAwLDcgKzI0ODEsOCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5EcmF3UG9pbnRzIiBhbmRyb2lkOmxhYmVsPSJHcmFwaGljcy9Qb2ludHMiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLkRyYXdQb2ludHMiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL1BvaW50cyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL1JFQURNRS50eHQgYi9zYW1wbGVzL0FwaURlbW9zL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNTY3MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE5IEBACitUaGUgQVBJIERlbW9zIGFwcGxpY2F0aW9uIGluY2x1ZGVzIGEgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgCit0aGF0IGlsbHVzdHJhdGUgdGhlIHVzZSBvZiB2YXJpb3VzIEFuZHJvaWQgQVBJcy4gSXQgaW5jbHVkZXMgc2FtcGxlcyBvZjoKKyAgLSBOb3RpZmljYXRpb25zCisgIC0gQWxhcm1zCisgIC0gUHJvZ3Jlc3MgRGlhbG9ncworICAtIEludGVudHMKKyAgLSBNZW51cworICAtIFNlYXJjaAorICAtIFBlcnNpc3RlbnQgYXBwbGljYXRpb24gc3RhdGUKKyAgLSBQcmVmZXJlbmNlcworICAtIEJhY2tncm91bmQgU2VydmljZXMKKyAgLSBBcHAgV2lkZ2V0cworICAtIFZvaWNlIFJlY29nbml0aW9uCisgIC0gQW5kIG1hbnkgbWFueSBtb3JlLi4uCisKK0FwaSBkZW1vcyBpcyBkZXNpZ25lZCB0byB1c2UgdGhlIGNvbXBhdGliaWxpdHkgbGlicmFyeSAiYW5kcm9pZC1zdXBwb3J0LXY0LmphciIuCitJdCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgU0RLIFVwZGF0ZXIgaW4gdGhlICJBbmRyb2lkIENvbXBhdGliaWxpdHkgcGFja2FnZSIuCitPbmNlIGRvd25sb2FkZWQsIGNvcHkgdGhlIGphciBmaWxlIGludG8gdGhlIEFwaURlbW9zIHByb2plY3QgbGlicy8gZm9sZGVyLgorKElmIHVzaW5nIEVjbGlwc2UsIGFkZCBpdCBtYW51YWxseSB0byB0aGUgcHJvamVjdCBidWlsZCBwYXRoKS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9faW5kZXguaHRtbAppbmRleCAzOTllZjg2Li5mZmU1ZGI1IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL19pbmRleC5odG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvX2luZGV4Lmh0bWwKQEAgLTM3LDcgKzM3LDggQEAKICIgICAgPGxpPjxhIGhyZWY9J3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvbWVkaWEvaW5kZXguaHRtbCc+TWVkaWE8L2E+PC9saT4iKwogIiAgICA8bGk+PGEgaHJlZj0nc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9vcy9pbmRleC5odG1sJz5PUzwvYT48L2xpPiIrCiAiICAgIDxsaT48YSBocmVmPSdzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3RleHQvaW5kZXguaHRtbCc+VGV4dDwvYT48L2xpPiIrCi0iICAgIDxsaT48YSBocmVmPSdzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvaW5kZXguaHRtbCc+Vmlld3M8L2E+PC9saT48L3VsPiIpOworIiAgICA8bGk+PGEgaHJlZj0nc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L2luZGV4Lmh0bWwnPlZpZXdzPC9hPjwvbGk+PC91bD4iKworIiAgICA8bGk+PGEgaHJlZj0nc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2luZGV4Lmh0bWwnPlN0YXRpYyBTdXBwb3J0IExpYnJhcnk8L2E+PC9saT4iKTsKIAogfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2FuaW1hdG9yLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzJmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2FuaW1hdG9yLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iMSIKKyAgICBhbmRyb2lkOnJlcGVhdE1vZGU9InJldmVyc2UiLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3Jfc2V0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3Jfc2V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIyNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9hbmltYXRvcl9zZXQueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQ+CisgICAgPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIyMDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ4IgorICAgICAgICBhbmRyb2lkOnJlcGVhdENvdW50PSIxIgorICAgICAgICBhbmRyb2lkOnJlcGVhdE1vZGU9InJldmVyc2UiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InkiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0Q291bnQ9IjEiCisgICAgICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2NvbG9yX2FuaW1hdG9yLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vY29sb3JfYW5pbWF0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2EwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2NvbG9yX2FuaW1hdG9yLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IiMwZjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIjMDBmZmZmIgorICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJjb2xvciIKKyAgICBhbmRyb2lkOnJlcGVhdENvdW50PSIxIgorICAgIGFuZHJvaWQ6cmVwZWF0TW9kZT0icmV2ZXJzZSIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9vYmplY3RfYW5pbWF0b3IueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9vYmplY3RfYW5pbWF0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2Q0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL29iamVjdF9hbmltYXRvci54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmR1cmF0aW9uPSIxMDAwIgorICAgIGFuZHJvaWQ6dmFsdWVUbz0iMjAwIgorICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InkiCisgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iMSIKKyAgICBhbmRyb2lkOnJlcGVhdE1vZGU9InJldmVyc2UiLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLWhkcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1oZHBpL2FwaWRlbW9fYW5kcm9pZGxvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODE4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1oZHBpL2FwaWRlbW9fYW5kcm9pZGxvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvYXBpZGVtb19hbmRyb2lkbG9nby5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2FwaWRlbW9fYW5kcm9pZGxvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2I0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2FwaWRlbW9fYW5kcm9pZGxvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDVmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR0aW5nc19hcHBsaWNhdGlvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfZGlzcGxheS5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NldHRpbmdzX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NldHRpbmdzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL21hZ25pZnlpbmdfZ2xhc3MucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvbWFnbmlmeWluZ19nbGFzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjU5MmFlMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL21hZ25pZnlpbmdfZ2xhc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1oNDIwZHAvcmVzb3VyY2VzX2hlaWdodC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtaDQyMGRwL3Jlc291cmNlc19oZWlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNWE3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtaDQyMGRwL3Jlc291cmNlc19oZWlnaHQueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gUGFydCBvZiByZXNvdXJjZXNfd2lkdGhfYW5kX2hlaWdodCB0aGF0IHZhcmllcyBiYXNlZCBvbiBoZWlnaHQuIC0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1oNjcwZHAvcmVzb3VyY2VzX2hlaWdodC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtaDY3MGRwL3Jlc291cmNlc19oZWlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzBhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtaDY3MGRwL3Jlc291cmNlc19oZWlnaHQueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gUGFydCBvZiByZXNvdXJjZXNfd2lkdGhfYW5kX2hlaWdodCB0aGF0IHZhcmllcyBiYXNlZCBvbiBoZWlnaHQuIC0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwZmYwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOnBhZGRpbmc9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MGZmMDAwMCI+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX3dpZHRoIiAvPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2FyZ3VtZW50cy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9hcmd1bWVudHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyN2RmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9hcmd1bWVudHMueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfYXJndW1lbnRzX21zZyIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50QXJndW1lbnRzJE15RnJhZ21lbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWJlZGRlZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9hcmd1bWVudHNfZW1iZWRkZWQiIC8+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuRnJhZ21lbnRBcmd1bWVudHMkTXlGcmFnbWVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1iZWRkZWRfbGFuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9hcmd1bWVudHNfZW1iZWRkZWRfbGFuZCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9hcmd1bWVudHNfc3VwcG9ydC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9hcmd1bWVudHNfc3VwcG9ydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhOGRhZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2FyZ3VtZW50c19zdXBwb3J0LnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2FyZ3VtZW50c19tc2ciIC8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgIDxmcmFnbWVudCBjbGFzcz0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnN1cHBvcnQuYXBwLkZyYWdtZW50QXJndW1lbnRzU3VwcG9ydCRNeUZyYWdtZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1iZWRkZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYXJndW1lbnRzX2VtYmVkZGVkIiAvPgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3JlYXRlZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuRnJhZ21lbnRBcmd1bWVudHNTdXBwb3J0JE15RnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtYmVkZGVkX2xhbmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYXJndW1lbnRzX2VtYmVkZGVkX2xhbmQiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZjIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIGxheW91dCBmcmFnbWVudCBzYW1wbGUuICBUaGlzIHZlcnNpb24gaXMKKyAgICAgZm9yIGRpc3BsYXkgd2hlbiBpbiBsYW5kc2NhcGU6IHdlIGNhbiBmaXQgYm90aCB0aXRsZXMgYW5kIGRpYWxvZy4gLS0+CisKKzwhLS0gQkVHSU5fSU5DTFVERShsYXlvdXQpIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuRnJhZ21lbnRMYXlvdXQkVGl0bGVzRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlcyIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9kZXRhaWxzIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9kZXRhaWxzRWxlbWVudEJhY2tncm91bmQiIC8+CisgICAgCis8L0xpbmVhckxheW91dD4KKzwhLS0gRU5EX0lOQ0xVREUobGF5b3V0KSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dF9zdXBwb3J0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dF9zdXBwb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMxMzQxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LWxhbmQvZnJhZ21lbnRfbGF5b3V0X3N1cHBvcnQueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIGxheW91dCBmcmFnbWVudCBzYW1wbGUuICBUaGlzIHZlcnNpb24gaXMKKyAgICAgZm9yIGRpc3BsYXkgd2hlbiBpbiBsYW5kc2NhcGU6IHdlIGNhbiBmaXQgYm90aCB0aXRsZXMgYW5kIGRpYWxvZy4gLS0+CisKKzwhLS0gQkVHSU5fSU5DTFVERShsYXlvdXQpIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5zdXBwb3J0LmFwcC5GcmFnbWVudExheW91dFN1cHBvcnQkVGl0bGVzRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlcyIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9kZXRhaWxzIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+Cis8IS0tIEVORF9JTkNMVURFKGxheW91dCkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtdzQyMGRwL3Jlc291cmNlc193aWR0aC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtdzQyMGRwL3Jlc291cmNlc193aWR0aC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkZmZlMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC13NDIwZHAvcmVzb3VyY2VzX3dpZHRoLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFBhcnQgb2YgcmVzb3VyY2VzX3dpZHRoX2FuZF9oZWlnaHQgdGhhdCB2YXJpZXMgYmFzZWQgb24gd2lkdGguIC0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9Inc0MjBkcCBXaWR0aFxuIzEiPgorICAgICAgICA8L1RleHRWaWV3PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwMDBmZiIgYW5kcm9pZDp0ZXh0PSJ3NDIwZHAgV2lkdGhcbiMyIj4KKyAgICAgICAgPC9UZXh0Vmlldz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0ZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjODAwMDAwZmYiIGFuZHJvaWQ6dGV4dD0idzQyMGRwIFdpZHRoXG4jMyI+CisgICAgICAgIDwvVGV4dFZpZXc+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9Inc0MjBkcCBXaWR0aFxuIzQiPgorICAgICAgICA8L1RleHRWaWV3PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC13NzIwZHAvcmVzb3VyY2VzX3dpZHRoLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC13NzIwZHAvcmVzb3VyY2VzX3dpZHRoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI1YzgyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0LXc3MjBkcC9yZXNvdXJjZXNfd2lkdGgueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gUGFydCBvZiByZXNvdXJjZXNfd2lkdGhfYW5kX2hlaWdodCB0aGF0IHZhcmllcyBiYXNlZCBvbiB3aWR0aC4gLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0ZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjODAwMDAwZmYiIGFuZHJvaWQ6dGV4dD0idzcyMGRwIFdpZHRoXG4jMSI+CisgICAgICAgIDwvVGV4dFZpZXc+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9Inc3MjBkcCBXaWR0aFxuIzIiPgorICAgICAgICA8L1RleHRWaWV3PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwMDBmZiIgYW5kcm9pZDp0ZXh0PSJ3NzIwZHAgV2lkdGhcbiMzIj4KKyAgICAgICAgPC9UZXh0Vmlldz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0ZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjODAwMDAwZmYiIGFuZHJvaWQ6dGV4dD0idzcyMGRwIFdpZHRoXG4jNCI+CisgICAgICAgIDwvVGV4dFZpZXc+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9Inc3MjBkcCBXaWR0aFxuIzUiPgorICAgICAgICA8L1RleHRWaWV3PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwMDBmZiIgYW5kcm9pZDp0ZXh0PSJ3NzIwZHAgV2lkdGhcbiM2Ij4KKyAgICAgICAgPC9UZXh0Vmlldz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0ZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjODAwMDAwZmYiIGFuZHJvaWQ6dGV4dD0idzcyMGRwIFdpZHRoXG4jNyI+CisgICAgICAgIDwvVGV4dFZpZXc+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9Inc3MjBkcCBXaWR0aFxuIzgiPgorICAgICAgICA8L1RleHRWaWV3PgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9ucy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MThmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnMueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX2hvbWVfYXNfdXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdG9nZ2xlX2hvbWVfYXNfdXAiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RvZ2dsZV9zaG93X2hvbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdG9nZ2xlX3Nob3dfaG9tZSIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX3VzZV9sb2dvIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RvZ2dsZV91c2VfbG9nbyIgLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlX3Nob3dfdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdG9nZ2xlX3Nob3dfdGl0bGUiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RvZ2dsZV9zaG93X2N1c3RvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90b2dnbGVfc2hvd19jdXN0b20iIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RvZ2dsZV9uYXZpZ2F0aW9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RvZ2dsZV9uYXZpZ2F0aW9uIiAvPgorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jeWNsZV9jdXN0b21fZ3Jhdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jeWNsZV9jdXN0b21fZ3Jhdml0eSIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zX2N1c3RvbS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl9kaXNwbGF5X29wdGlvbnNfY3VzdG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y1YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zX2N1c3RvbS54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxCdXR0b24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlzcGxheV9vcHRpb25zX2N1c3RvbV9idXR0b24iIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90YWJfY29udGVudC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90YWJfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhYTdmYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RhYl9jb250ZW50LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RhYnMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGFicy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RhYnMueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mcmFnbWVudF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idG5fYWRkX3RhYiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idG5fYWRkX3RhYiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQWRkVGFiIiAvPgorICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnRuX3JlbW92ZV90YWIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnRuX3JlbW92ZV90YWIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblJlbW92ZVRhYiIgLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J0bl90b2dnbGVfdGFicyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idG5fdG9nZ2xlX3RhYnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblRvZ2dsZVRhYnMiIC8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idG5fcmVtb3ZlX2FsbF90YWJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J0bl9yZW1vdmVfYWxsX3RhYnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblJlbW92ZUFsbFRhYnMiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hY3Rpdml0eV9yZWNyZWF0ZS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aXZpdHlfcmVjcmVhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NWRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYWN0aXZpdHlfcmVjcmVhdGUueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gRGVtb25zdHJhdGVzIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBhIGxvY2FsIHNlcnZpY2UuCisgICAgIFNlZSBjb3JyZXNwb25kaW5nIEphdmEgY29kZSBjb20uYW5kcm9pZC5zZGsuYXBwLkxvY2FsU2VyaWNlLmphdmEuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjdGl2aXR5X3JlY3JlYXRlX21zZyIvPgorCisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JlY3JlYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JlY3JlYXRlIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKaW5kZXggMDA5N2U3YS4uOTg1NTYwNSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKQEAgLTI5LDYgKzI5LDkgQEAKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3R3b19idXR0b25zMiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FsZXJ0X2RpYWxvZ190d29fYnV0dG9uczIiLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3R3b19idXR0b25zMnVsdHJhIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWxlcnRfZGlhbG9nX3R3b19idXR0b25zMnVsdHJhIi8+CiAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zZWxlY3RfYnV0dG9uIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWxlcnRfZGlhbG9nX3NlbGVjdF9idXR0b24iLz4KQEAgLTQ3LDUgKzUwLDExIEBACiAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90ZXh0X2VudHJ5X2J1dHRvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FsZXJ0X2RpYWxvZ190ZXh0X2VudHJ5Ii8+CisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC90d29fYnV0dG9uc19vbGRfc2Nob29sIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWxlcnRfZGlhbG9nX3R3b19idXR0b25zX29sZF9zY2hvb2wiLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3R3b19idXR0b25zX2hvbG9fbGlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hbGVydF9kaWFsb2dfdHdvX2J1dHRvbnNfaG9sb19saWdodCIvPgogICAgIDwvTGluZWFyTGF5b3V0PgogPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jbG9uaW5nLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fY2xvbmluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MTg4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fY2xvbmluZy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUnVuIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2N1c3RvbV9ldmFsdWF0b3IueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jdXN0b21fZXZhbHVhdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYyODVjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jdXN0b21fZXZhbHVhdG9yLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJQbGF5IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2xvYWRpbmcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9sb2FkaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTUxODgwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9sb2FkaW5nLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJSdW4iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRCdXR0b24iCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fbXVsdGlfcHJvcGVydHkueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MTg4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fbXVsdGlfcHJvcGVydHkueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9yZXZlcnNpbmcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9yZXZlcnNpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODRkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3JldmVyc2luZy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgID4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJQbGF5IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmV2ZXJzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmV2ZXJzZUJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fc2Vla2luZy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3NlZWtpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTRhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3NlZWtpbmcueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUnVuIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWVrQmFyIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfY3VzdG9tX2V2YWx1YXRvci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfY3VzdG9tX2V2YWx1YXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2OTlkNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRvcl9jdXN0b21fZXZhbHVhdG9yLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlBsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdG9yX2V2ZW50cy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0b3JfZXZlbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDE1YWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdG9yX2V2ZW50cy54bWwKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FuY2VsQnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQgSW1tZWRpYXRlbHkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZENCIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTZXF1ZW5jZXIgRXZlbnRzOiAgICIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTdGFydCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRUZXh0IgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlcGVhdCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVwZWF0VGV4dCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwgICAiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbmNlbFRleHQiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW5kIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbmRUZXh0IgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBbmltYXRvciBFdmVudHM6ICAgIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlN0YXJ0ICAgIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydFRleHRBbmltYXRvciIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJSZXBlYXQgICAiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JlcGVhdFRleHRBbmltYXRvciIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwgICAiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbmNlbFRleHRBbmltYXRvciIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbmQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VuZFRleHRBbmltYXRvciIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hcHB3aWRnZXRfcHJvdmlkZXIueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FwcHdpZGdldF9wcm92aWRlci54bWwKaW5kZXggMzczZGI4Zi4uNTU5YjA5ZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FwcHdpZGdldF9wcm92aWRlci54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FwcHdpZGdldF9wcm92aWRlci54bWwKQEAgLTE4LDYgKzE4LDcgQEAKICAgICBhbmRyb2lkOmlkPSJAK2lkL2FwcHdpZGdldF90ZXh0IgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmZmZjAwZmYiCiAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZjAwMDAwMCIKIC8+CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ib3VuY2luZ19iYWxscy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYm91bmNpbmdfYmFsbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDdkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYm91bmNpbmdfYmFsbHMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvY2xpcGJvYXJkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDViMWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgICBEZW1vbnN0cmF0ZXMgY2xpcGJvYXJkLgorCisgICAgU2VlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlOgorICAgIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5jb250ZW50LkNsaXBib2FyZFNhbXBsZQorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvY29weV9zdHlsZWRfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJwYXN0ZVN0eWxlZFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29weV90ZXh0IiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdHlsZWRfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jb3B5X3BsYWluX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0icGFzdGVQbGFpblRleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29weV90ZXh0IiAvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wbGFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2NvcHlfaW50ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9InBhc3RlSW50ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvcHlfaW50ZW50IiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jb3B5X3VyaSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJwYXN0ZVVyaSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb3B5X3VyaSIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFNwaW5uZXIgYW5kcm9pZDppZD0iQCtpZC9jbGlwX3R5cGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnByb21wdD0iQHN0cmluZy9jbGlwX3R5cGVfcHJvbXB0IgorICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGlwX21pbWVfdHlwZXMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgIC8+CisKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGlwX3RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NvbnRyb2xzXzEueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NvbnRyb2xzXzEueG1sCmluZGV4IDFhYWVmM2QuLmUyODAxODggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9jb250cm9sc18xLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvY29udHJvbHNfMS54bWwKQEAgLTIzLDIzICsyMyw0NiBAQAogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIAorCisgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb250cm9sc18xX3NhdmUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAKKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2Rpc2FibGVkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbnRyb2xzXzFfc2F2ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorCisgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgCisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZWRpdDIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKworICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKICAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2sxIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyNHNwIgogCSAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNHNwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbnRyb2xzXzFfY2hlY2tib3hfMSIgLz4KLSAgICAKKwogICAgICAgICA8Q2hlY2tCb3ggYW5kcm9pZDppZD0iQCtpZC9jaGVjazIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCkBAIC0xMTYsNiArMTM5LDE0IEBACiAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCiAgICAgICAgIC8+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjQwMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iKEFuZCBhbGwgaW5zaWRlIG9mIGEgU2Nyb2xsVmlldyEpIgorICAgICAgICAvPgogICAgICAgICAKICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RldmljZV9hZG1pbl9zYW1wbGUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RldmljZV9hZG1pbl9zYW1wbGUueG1sCmluZGV4IDE2YjA4Y2UuLjM3NGI4N2YgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKQEAgLTE1LDEzMiArMTUsMjgwIEBACiAtLT4KIAogPCEtLSBEZW1vbnN0cmF0ZXMgaW1wbGVtZW50YXRpb24gb2YgYSBEZXZpY2VBZG1pbi4gLS0+Cis8U2Nyb2xsVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CiAKLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CiAKLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2FtcGxlX2RldmljZV9hZG1pbl9zdW1tYXJ5Ii8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VuYWJsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VuYWJsZV9hZG1pbiI+Ci0gICAgICAgICAgICA8cmVxdWVzdEZvY3VzIC8+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9kaXNhYmxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlzYWJsZV9hZG1pbiI+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPFNwaW5uZXIgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9xdWFsaXR5IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6cHJvbXB0PSJAc3RyaW5nL3Bhc3N3b3JkX3F1YWxpdHkiPgotICAgICAgICA8L1NwaW5uZXI+Ci0KLSAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRfbGVuZ3RoIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2xlbmd0aF9oaW50IgotICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zZXRfcGFzc3dvcmQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkX2xheW91dF9ncmF2aXR5PSJlYXN0fGNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NldF9wYXNzd29yZCI+Ci0gICAgPC9CdXR0b24+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfaGludCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZnJlZXplc1RleHQ9InRydWUiPgotICAgICAgICA8L0VkaXRUZXh0PgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXNldF9wYXNzd29yZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Jlc2V0X3Bhc3N3b3JkIj4KLSAgICAgICAgPC9CdXR0b24+CisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2FtcGxlX2RldmljZV9hZG1pbl9zdW1tYXJ5Ii8+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VuYWJsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW5hYmxlX2FkbWluIj4KKyAgICAgICAgICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Rpc2FibGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2Rpc2FibGVfYWRtaW4iPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPFNwaW5uZXIgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9xdWFsaXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb21wdD0iQHN0cmluZy9wYXNzd29yZF9xdWFsaXR5Ij4KKyAgICAgICAgICAgIDwvU3Bpbm5lcj4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRfbGVuZ3RoIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2xlbmd0aF9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9taW5pbXVtX2xldHRlcnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbWluaW11bV9sZXR0ZXJzX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9taW5pbXVtX251bWVyaWMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbWluaW11bV9udW1lcmljX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9taW5pbXVtX3VwcGVyY2FzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX3VwcGVyY2FzZV9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9taW5pbXVtX3N5bWJvbHMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbWluaW11bV9zeW1ib2xzX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9taW5pbXVtX25vbmxldHRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX25vbmxldHRlcl9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9oaXN0b3J5X2xlbmd0aCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9oaXN0b3J5X2xlbmd0aF9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2xheW91dF9ncmF2aXR5PSJlYXN0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3Bhc3N3b3JkIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX2V4cGlyYXRpb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfZXhwaXJhdGlvbl9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3VwZGF0ZV9leHBpcmF0aW9uX2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2xheW91dF9ncmF2aXR5PSJlYXN0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdXBkYXRlX2V4cGlyYXRpb25fbGFiZWwiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRfZXhwaXJhdGlvbl9zdGF0dXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3VwZGF0ZV9leHBpcmF0aW9uX3N0YXR1c19idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZF9sYXlvdXRfZ3Jhdml0eT0iZWFzdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VwZGF0ZV9leHBpcmF0aW9uX3N0YXR1c19sYWJlbCIgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmZyZWV6ZXNUZXh0PSJ0cnVlIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXNldF9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Jlc2V0X3Bhc3N3b3JkIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL21heF9mYWlsZWRfcHciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvbWF4X2ZhaWxlZF9wd19oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yY2VfbG9jayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZvcmNlX2xvY2siPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC93aXBlX2RhdGEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy93aXBlX2RhdGEiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC93aXBlX2FsbF9kYXRhIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lwZV9hbGxfZGF0YSI+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3RpbWVvdXQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3RpbWVvdXRfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZnJlZXplc1RleHQ9InRydWUiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF90aW1lb3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3RpbWVvdXRfbGFiZWwiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBFbmNyeXB0aW9uIFN0YXR1cyBDb250cm9scyAtLT4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiA+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbmNyeXB0aW9uX2VuYWJsZV9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW5jcnlwdGlvbl9lbmFibGVfbGFiZWwiIC8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbmNyeXB0aW9uX2Rpc2FibGVfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VuY3J5cHRpb25fZGlzYWJsZV9sYWJlbCIgLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VuY3J5cHRpb25fYWN0aXZhdGVfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VuY3J5cHRpb25fYWN0aXZhdGVfbGFiZWwiIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiA+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VuY3J5cHRpb25fc3RhdHVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbmNyeXB0aW9uX3VwZGF0ZV9zdGF0dXNfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZF9sYXlvdXRfZ3Jhdml0eT0iZWFzdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3VwZGF0ZV9lbmNyeXB0aW9uX3N0YXR1c19sYWJlbCIgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KIAogICAgIDwvTGluZWFyTGF5b3V0PgogCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotCi0gICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL21heF9mYWlsZWRfcHciCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvbWF4X2ZhaWxlZF9wd19oaW50IgotICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3JjZV9sb2NrIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZm9yY2VfbG9jayI+Ci0gICAgPC9CdXR0b24+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3dpcGVfZGF0YSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3dpcGVfZGF0YSI+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC93aXBlX2FsbF9kYXRhIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lwZV9hbGxfZGF0YSI+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvdGltZW91dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy90aW1lb3V0X2hpbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIgotICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF90aW1lb3V0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3RpbWVvdXRfbGFiZWwiPgotICAgICAgICA8L0J1dHRvbj4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KLQorPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RpYWxvZ19hY3Rpdml0eS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGlhbG9nX2FjdGl2aXR5LnhtbAppbmRleCAyYjI3ZDlhLi40YWNkYzY0IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGlhbG9nX2FjdGl2aXR5LnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGlhbG9nX2FjdGl2aXR5LnhtbApAQCAtMTcsOCArMTcsMzcgQEAKIDwhLS0gRGVtb25zdHJhdGVzIGFuIGFjdGl2aXR5IHdpdGggYSBkaWFsb2cgdGhlbWUuCiAgICAgIFNlZSBjb3JyZXNwb25kaW5nIEphdmEgY29kZSBjb20uYW5kcm9pZC5zZGsuYXBwLkRpYWxvZ0FjdGl2aXR5LmphdmEuIC0tPgogCi08IS0tIFRoaXMgc2NyZWVuIGNvbnNpc3RzIG9mIGEgc2luZ2xlIHRleHQgZmllbGQgdGhhdCBkaXNwbGF5cyBzb21lIHRleHQuIC0tPgotPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kaWFsb2dfYWN0aXZpdHlfdGV4dCIvPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI0ZHAiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgorICAgIAorICAgIDwhLS0gTWVzc2FnZSB0byBzaG93IHRvIHVzZS4gLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlhbG9nX2FjdGl2aXR5X3RleHQiLz4KKyAgICAgICAgCisgICAgPCEtLSBDb250YWluZXIgaW4gd2hpY2ggd2UgYXJlIGdvaW5nIHRvIGFkZCBhbmQgcmVtb3ZlIHZpZXdzLCB0byBkZW1vbnN0cmF0ZQorICAgICAgICAgaG93IHRoZSBsYXlvdXQgYWRqdXN0cyBiYXNlZCBvbiBzaXplLiAtLT4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvaW5uZXJfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRwIiBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkcCI+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPCEtLSBBbGVydCBkaWFsb2cgc3R5bGUgYnV0dG9ucyBhbG9uZyB0aGUgYm90dG9tLiAtLT4KKyAgICA8TGluZWFyTGF5b3V0IHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclN0eWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDptZWFzdXJlV2l0aExhcmdlc3RDaGlsZD0idHJ1ZSI+CisgICAgICAgIDxCdXR0b24gc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiIGFuZHJvaWQ6aWQ9IkAraWQvYWRkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlhbG9nX2FjdGl2aXR5X2FkZCIgLz4KKyAgICAgICAgPEJ1dHRvbiBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJCdXR0b25TdHlsZSIgYW5kcm9pZDppZD0iQCtpZC9yZW1vdmUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kaWFsb2dfYWN0aXZpdHlfcmVtb3ZlIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZHJhZ19sYXlvdXQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RyYWdfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDljZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RyYWdfbGF5b3V0LnhtbApAQCAtMCwwICsxLDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBMYXlvdXQgZGVzY3JpcHRpb24gb2YgdGhlIERyYWdBbmREcm9wIHNhbXBsZSdzIG1haW4gYWN0aXZpdHkgLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6ZG90PSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5leGFtcGxlLmFuZHJvaWQuYXBpcyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgID4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RyYWdfZXhwbGFuYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZHJhZ19leHBsYW5hdGlvbiIKKyAgICAgICAgLz4KKworICAgIDxjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldy5EcmFnZ2FibGVEb3QKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kcmFnX2RvdF8xIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgZG90OnJhZGl1cz0iNjRkcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxNWRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2RyYWdfZXhwbGFuYXRpb24iCisgICAgICAgIC8+CisKKyAgICA8Y29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXcuRHJhZ2dhYmxlRG90CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZHJhZ19kb3RfMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGRvdDpyYWRpdXM9IjY0ZHAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTVkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9kcmFnX2V4cGxhbmF0aW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9kcmFnX2RvdF8xIgorICAgICAgICBkb3Q6bGVnZW5kPSJEcmFnIEFOUiIKKyAgICAgICAgZG90OmFucj0idGh1bWJuYWlsIgorICAgICAgICAvPgorCisgICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3LkRyYWdnYWJsZURvdAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2RyYWdfZG90XzMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBkb3Q6cmFkaXVzPSI2NGRwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjE1ZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZHJhZ19kb3RfMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvZHJhZ19kb3RfMSIKKyAgICAgICAgZG90OmxlZ2VuZD0iRHJvcCBBTlIiCisgICAgICAgIGRvdDphbnI9ImRyb3AiCisgICAgICAgIC8+CisKKyAgICA8Y29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXcuRHJhZ2dhYmxlRG90CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZHJhZ19kb3RfaGlkZGVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgZG90OnJhZGl1cz0iNjRkcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxNWRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9kcmFnX2RvdF8zIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL2RyYWdfZG90XzMiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBkb3Q6bGVnZW5kPSJTdXJwcmlzZSEiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kcmFnX3Jlc3VsdF90ZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2RyYWdfZXhwbGFuYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUmlnaHQ9IkBpZC9kcmFnX2V4cGxhbmF0aW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9kcmFnX2RvdF8yIgorICAgICAgICAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZHJhZ190ZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9kcmFnX2RvdF8zIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC9kcmFnX2RvdF8zIgorICAgICAgICAvPgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZvY3VzXzUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZvY3VzXzUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzBhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZm9jdXNfNS54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBEZW1vbnN0cmF0ZXMgdXNpbmcgbmV4dEZvY3VzRm9yd2FyZCB0byBleHBsaWNpdGx5IHNldCBzZXF1ZW50aWFsIGZvY3VzIG9yZGVyLi0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZm9jdXNfNV9idXR0b24xIgorICAgICAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNGb3J3YXJkPSJAK2lkL2J1dHRvbjIiLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb2N1c181X2J1dHRvbjIiCisgICAgICAgICAgICBhbmRyb2lkOm5leHRGb2N1c0ZvcndhcmQ9IkAraWQvYnV0dG9uMyIvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b24zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZvY3VzXzVfYnV0dG9uMyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bmV4dEZvY3VzRm9yd2FyZD0iQCtpZC9idXR0b240Ii8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b240IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZvY3VzXzVfYnV0dG9uNCIKKyAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNGb3J3YXJkPSJAK2lkL2J1dHRvbjUiLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b241IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZvY3VzXzVfYnV0dG9uNSIKKyAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNGb3J3YXJkPSJAK2lkL2J1dHRvbjEiLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZvcmVncm91bmRfc2VydmljZV9jb250cm9sbGVyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mb3JlZ3JvdW5kX3NlcnZpY2VfY29udHJvbGxlci54bWwKaW5kZXggMjBjZTEwMy4uMDc2ZDRhMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZvcmVncm91bmRfc2VydmljZV9jb250cm9sbGVyLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZm9yZWdyb3VuZF9zZXJ2aWNlX2NvbnRyb2xsZXIueG1sCkBAIC0xNyw5ICsxNywxMCBAQAogPCEtLSBEZW1vbnN0cmF0ZXMgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIGEgbG9jYWwgc2VydmljZS4KICAgICAgU2VlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlIGNvbS5hbmRyb2lkLnNkay5hcHAuTG9jYWxTZXJpY2UuamF2YS4gLS0+CiAKLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAogICAgIDxUZXh0VmlldwogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9hcmd1bWVudHMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2FyZ3VtZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0MTQzMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9hcmd1bWVudHMueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfYXJndW1lbnRzX21zZyIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKzwhLS0gQkVHSU5fSU5DTFVERShmcm9tX2F0dHJpYnV0ZXMpIC0tPgorICAgICAgICA8ZnJhZ21lbnQgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuRnJhZ21lbnRBcmd1bWVudHMkTXlGcmFnbWVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtYmVkZGVkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2FyZ3VtZW50c19lbWJlZGRlZCIgLz4KKzwhLS0gRU5EX0lOQ0xVREUoZnJvbV9hdHRyaWJ1dGVzKSAtLT4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYXJndW1lbnRzX3N1cHBvcnQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2FyZ3VtZW50c19zdXBwb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE4ZjgyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2FyZ3VtZW50c19zdXBwb3J0LnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2FyZ3VtZW50c19tc2ciIC8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCis8IS0tIEJFR0lOX0lOQ0xVREUoZnJvbV9hdHRyaWJ1dGVzKSAtLT4KKyAgICAgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuRnJhZ21lbnRBcmd1bWVudHNTdXBwb3J0JE15RnJhZ21lbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWJlZGRlZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9hcmd1bWVudHNfZW1iZWRkZWQiIC8+Cis8IS0tIEVORF9JTkNMVURFKGZyb21fYXR0cmlidXRlcykgLS0+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2NvbnRleHRfbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfY29udGV4dF9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWRhYzhlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2NvbnRleHRfbWVudS54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZHAiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mcmFnbWVudF9jb250ZXh0X21lbnVfbXNnIiAvPgorCisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2xvbmdfcHJlc3MiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb25nX3ByZXNzIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorICAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGVjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIiAvPgorCisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3Nob3ciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zaG93Ij4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1ZjAxNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X21zZyIgLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zaG93X2RpYWxvZyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Nob3ciPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9CdXR0b24+CisKKyAgICA8VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5saW5lX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eV9pbmxpbmUiIC8+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1iZWRkZWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMzAzMDMwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2hpZGVfc2hvdy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfaGlkZV9zaG93LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjEzMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2hpZGVfc2hvdy54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUb3AtbGV2ZWwgY29udGVudCB2aWV3IGZvciB0aGUgbGF5b3V0IGZyYWdtZW50IHNhbXBsZS4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJEZW1vbnN0cmF0aW9uIG9mIGhpZGluZyBhbmQgc2hvd2luZyBmcmFnbWVudHMuIiAvPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZzFoaWRlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkhpZGUiIC8+CisKKyAgICAgICAgPGZyYWdtZW50IGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcC5GcmFnbWVudEhpZGVTaG93JEZpcnN0RnJhZ21lbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFnbWVudDEiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZzJoaWRlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkhpZGUiIC8+CisKKyAgICAgICAgPGZyYWdtZW50IGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcC5GcmFnbWVudEhpZGVTaG93JFNlY29uZEZyYWdtZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZ21lbnQyIiBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfaGlkZV9zaG93X3N1cHBvcnQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2hpZGVfc2hvd19zdXBwb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI0NWJkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2hpZGVfc2hvd19zdXBwb3J0LnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBsYXlvdXQgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkRlbW9uc3RyYXRpb24gb2YgaGlkaW5nIGFuZCBzaG93aW5nIGZyYWdtZW50cy4iIC8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mcmFnMWhpZGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iSGlkZSIgLz4KKworICAgICAgICA8ZnJhZ21lbnQgYW5kcm9pZDpuYW1lPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuRnJhZ21lbnRIaWRlU2hvd1N1cHBvcnQkRmlyc3RGcmFnbWVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdtZW50MSIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mcmFnMmhpZGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iSGlkZSIgLz4KKworICAgICAgICA8ZnJhZ21lbnQgYW5kcm9pZDpuYW1lPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuRnJhZ21lbnRIaWRlU2hvd1N1cHBvcnQkU2Vjb25kRnJhZ21lbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFnbWVudDIiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9sYXlvdXQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5M2M5NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBsYXlvdXQgZnJhZ21lbnQgc2FtcGxlLiAgVGhpcyB2ZXJzaW9uIGlzCisgICAgIGZvciBkaXNwbGF5IHdoZW4gbm90IGluIGxhbmRzY2FwZTogd2UgY2FuIG9ubHkgZml0IHRoZSBsaXN0IG9mIHRpdGxlcy4gLS0+CisKKzwhLS0gQkVHSU5fSU5DTFVERShsYXlvdXQpIC0tPgorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50TGF5b3V0JFRpdGxlc0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZXMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKzwvRnJhbWVMYXlvdXQ+Cis8IS0tIEVORF9JTkNMVURFKGxheW91dCkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0X3N1cHBvcnQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dF9zdXBwb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGM0MGJmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dF9zdXBwb3J0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBsYXlvdXQgZnJhZ21lbnQgc2FtcGxlLiAgVGhpcyB2ZXJzaW9uIGlzCisgICAgIGZvciBkaXNwbGF5IHdoZW4gbm90IGluIGxhbmRzY2FwZTogd2UgY2FuIG9ubHkgZml0IHRoZSBsaXN0IG9mIHRpdGxlcy4gLS0+CisKKzwhLS0gQkVHSU5fSU5DTFVERShsYXlvdXQpIC0tPgorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHAuRnJhZ21lbnRMYXlvdXRTdXBwb3J0JFRpdGxlc0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZXMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKzwvRnJhbWVMYXlvdXQ+Cis8IS0tIEVORF9JTkNMVURFKGxheW91dCkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwMjc4YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9tZW51LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjhkcCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X21lbnVfbXNnIiAvPgorCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWVudTEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50MW1lbnUiPgorICAgIDwvQ2hlY2tCb3g+CisgICAgCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWVudTIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50Mm1lbnUiPgorICAgIDwvQ2hlY2tCb3g+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9wYWdlci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcGFnZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjdmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcGFnZXIueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRQYWdlcgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYWdlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisgICAgPC9hbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50UGFnZXI+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV3X2ZyYWdtZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmV3X2ZyYWdtZW50Ij4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcGFnZXJfbGlzdC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfcGFnZXJfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlN2IxZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9wYWdlcl9saXN0LnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZ2FsbGVyeV90aHVtYiI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWxsb193b3JsZCIvPgorCisgICAgPCEtLSBUaGUgZnJhbWUgbGF5b3V0IGlzIGhlcmUgc2luY2Ugd2Ugd2lsbCBiZSBzaG93aW5nIGVpdGhlcgorICAgIHRoZSBlbXB0eSB2aWV3IG9yIHRoZSBsaXN0IHZpZXcuICAtLT4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiID4KKyAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBsaXN0LiBTaW5jZSB3ZSBhcmUgdXNpbmcgYSBMaXN0QWN0aXZpdHksIHdlCisgICAgICAgICAgICAgaGF2ZSB0byBjYWxsIGl0ICJAYW5kcm9pZDppZC9saXN0IiBzbyBMaXN0QWN0aXZpdHkgd2lsbAorICAgICAgICAgICAgIGZpbmQgaXQgLS0+CisgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiLz4KKworICAgICAgICA8IS0tIEhlcmUgaXMgdGhlIHZpZXcgdG8gc2hvdyBpZiB0aGUgbGlzdCBpcyBlbXRweSAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iTm8gaXRlbXMuIi8+CisKKyAgICA8L0ZyYW1lTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X3JldGFpbl9pbnN0YW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjMzk4NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRwIj4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlX21zZyIgLz4KKworICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2hvcml6b250YWwiCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjAwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkcCIKKyAgICAgICAgYW5kcm9pZDptYXg9IjUwMCIgLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXN0YXJ0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVzdGFydCI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X3N0YWNrLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9zdGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMjQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9zdGFjay54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NpbXBsZV9mcmFnbWVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisgICAgPC9GcmFtZUxheW91dD4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXdfZnJhZ21lbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIAorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmV3X2ZyYWdtZW50Ij4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYWxsZXJ5XzEueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKaW5kZXggOWI5YzRiYi4uZDg4NGM2MSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKQEAgLTE0LDggKzE0LDE5IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxHYWxsZXJ5IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQCtpZC9nYWxsZXJ5IgotCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0JYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCis8TGluZWFyTGF5b3V0CisgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorIGFuZHJvaWQ6aWQ9IkAraWQvbGF5b3V0MiIKKyBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKzxHYWxsZXJ5ICBhbmRyb2lkOmlkPSJAK2lkL2dhbGxlcnkiCithbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAvPgotICAgICAgIAorPEVkaXRUZXh0CisgYW5kcm9pZDp0ZXh0PSJAK2lkL0VkaXRUZXh0MDEiCisgYW5kcm9pZDppZD0iQCtpZC9FZGl0VGV4dDAxIgorIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPjwvRWRpdFRleHQ+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FtZV9jb250cm9sbGVyX2lucHV0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYW1lX2NvbnRyb2xsZXJfaW5wdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FtZV9jb250cm9sbGVyX2lucHV0LnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdhbWUgY29udHJvbGxlciBpbnB1dCBkZW1vLiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGVzY3JpcHRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZ2FtZV9jb250cm9sbGVyX2lucHV0X2Rlc2NyaXB0aW9uIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEyZGlwIiAvPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRpcCI+CisgICAgICAgIDxMaXN0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iM2RpcCI+CisgICAgICAgIDwvTGlzdFZpZXc+CisKKyAgICAgICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3LkdhbWVWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2dhbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIzZGlwIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FtZV9jb250cm9sbGVyX2lucHV0X2hlYWRpbmcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbWVfY29udHJvbGxlcl9pbnB1dF9oZWFkaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdkMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbWVfY29udHJvbGxlcl9pbnB1dF9oZWFkaW5nLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FtZV9jb250cm9sbGVyX2lucHV0X3RleHRfY29sdW1uLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYW1lX2NvbnRyb2xsZXJfaW5wdXRfdGV4dF9jb2x1bW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWY0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZ2FtZV9jb250cm9sbGVyX2lucHV0X3RleHRfY29sdW1uLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI2ZGlwIj4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvaGVsbG9fd29ybGQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2hlbGxvX3dvcmxkLnhtbAppbmRleCAwMjgyMDc2Li4zZDkwYTMzIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvaGVsbG9fd29ybGQueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9oZWxsb193b3JsZC54bWwKQEAgLTIyLDQgKzIyLDUgQEAKIDxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgogICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWxsb193b3JsZCIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2hvcml6b250YWxfc2Nyb2xsX3ZpZXcxLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ob3Jpem9udGFsX3Njcm9sbF92aWV3MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3YmU0YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ob3Jpem9udGFsX3Njcm9sbF92aWV3MS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBEZW1vbnN0cmF0ZXMgaG9yaXpvbnRhbCBzY3JvbGxpbmcgd2l0aCBhIFNjcm9sbFZpZXcuIC0tPgorPEhvcml6b250YWxTY3JvbGxWaWV3CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMjBkaXAiPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzAwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Njcm9sbGJhcl8zX3RleHQiIC8+Cis8L0hvcml6b250YWxTY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ludGVudF9hY3Rpdml0eV9mbGFncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvaW50ZW50X2FjdGl2aXR5X2ZsYWdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBlMmRkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ludGVudF9hY3Rpdml0eV9mbGFncy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBEZW1vbnN0cmF0ZXMgdGhlIHVzZXIgb2YgdmFyaW91cyBpbnRlbnQgYWN0aXZpdHkgZmxhZ3MuCisgICAgIFNlZSBjb3JyZXNwb25kaW5nIEphdmEgY29kZSBjb20uYW5kcm9pZC5zZGsuYXBwLkludGVudEFjdGl2aXR5RmxhZ3MuamF2YS4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW50ZW50X2FjdGl2aXR5X2ZsYWdzIi8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmxhZ19hY3Rpdml0eV9jbGVhcl90YXNrIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZsYWdfYWN0aXZpdHlfY2xlYXJfdGFzayI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mbGFnX2FjdGl2aXR5X2NsZWFyX3Rhc2tfcGkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZmxhZ19hY3Rpdml0eV9jbGVhcl90YXNrX3BpIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYWJlbGVkX3RleHRfZWRpdC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGFiZWxlZF90ZXh0X2VkaXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTY4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGFiZWxlZF90ZXh0X2VkaXQueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIENvbnRlbnQgZm9yIGEgZnJhZ21lbnQgd2l0aCBhIHRleHQgZWRpdG9yLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tc2ciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIgLz4KKworICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3NhdmVkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ncmVlbiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luaXRpYWxfdGV4dCIKKyAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0VkaXRUZXh0PgorCis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYXlvdXRfYW5pbWF0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmMGUwZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9sYXlvdXRfYW5pbWF0aW9ucy54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9wYXJlbnQiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQgQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZGROZXdCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ3VzdG9tIEFuaW1hdGlvbnMiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbUFuaW1DQiIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXBwZWFyaW5nQ0IiCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRGlzYXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlzYXBwZWFyaW5nQ0IiCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2hhbmdpbmcvQXBwZWFyaW5nIEFuaW1hdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hhbmdpbmdBcHBlYXJpbmdDQiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxDaGVja0JveAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpjaGVja2VkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDaGFuZ2luZy9EaXNhcHBlYXJpbmcgQW5pbWF0aW9uIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGFuZ2luZ0Rpc2FwcGVhcmluZ0NCIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2J5X2RlZmF1bHQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2J5X2RlZmF1bHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDYyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnNfYnlfZGVmYXVsdC54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQWRkIEJ1dHRvbiIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZGROZXdCdXR0b24iCisgICAgICAgIC8+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ob3Jpem9udGFsQ29udGFpbmVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGVMYXlvdXRDaGFuZ2VzPSJ0cnVlIgorICAgICAgICAvPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZlcnRpY2FsQ29udGFpbmVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGVMYXlvdXRDaGFuZ2VzPSJ0cnVlIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGF5b3V0X2FuaW1hdGlvbnNfaGlkZXNob3cueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2hpZGVzaG93LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE1YWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xheW91dF9hbmltYXRpb25zX2hpZGVzaG93LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3BhcmVudCIKKyAgICA+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlNob3cgQnV0dG9ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRkTmV3QnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPENoZWNrQm94CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkN1c3RvbSBBbmltYXRpb25zIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jdXN0b21BbmltQ0IiCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iSGlkZSAoR09ORSkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2hpZGVHb25lQ0IiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcG9wdXBfbWVudV8xLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9wb3B1cF9tZW51XzEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGM3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcG9wdXBfbWVudV8xLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblBvcHVwQnV0dG9uQ2xpY2siCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcG9wdXBfbWVudV9idXR0b24iIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9yZWNlaXZlX3Jlc3VsdC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcmVjZWl2ZV9yZXN1bHQueG1sCmluZGV4IGE4OTQ2MTIuLjVkZWIyYWMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9yZWNlaXZlX3Jlc3VsdC54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JlY2VpdmVfcmVzdWx0LnhtbApAQCAtMjcsMTIgKzI3LDE1IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JlY2VpdmVfcmVzdWx0X2luc3RydWN0aW9ucyIvPgogCiAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcmVzdWx0cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgogICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ncmVlbiI+CiAgICAgPC9UZXh0Vmlldz4KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc19oZWlnaHQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc19oZWlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjE5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcmVzb3VyY2VzX2hlaWdodC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBQYXJ0IG9mIHJlc291cmNlc193aWR0aF9hbmRfaGVpZ2h0IHRoYXQgdmFyaWVzIGJhc2VkIG9uIGhlaWdodC4gLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6cGFkZGluZz0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDBmZjAwIj4KKyAgICAgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9yZXNvdXJjZXNfd2lkdGgiIC8+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6cGFkZGluZz0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwZmYwMDAwIj4KKyAgICAgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9yZXNvdXJjZXNfd2lkdGgiIC8+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc193aWR0aC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcmVzb3VyY2VzX3dpZHRoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDVhNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc193aWR0aC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBQYXJ0IG9mIHJlc291cmNlc193aWR0aF9hbmRfaGVpZ2h0IHRoYXQgdmFyaWVzIGJhc2VkIG9uIHdpZHRoLiAtLT4KKworPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM4MDAwMDBmZiIgYW5kcm9pZDp0ZXh0PSJEZWZhdWx0IFdpZHRoXG4jMSI+CisgICAgICAgIDwvVGV4dFZpZXc+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIiBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzgwMDAwMGZmIiBhbmRyb2lkOnRleHQ9IkRlZmF1bHQgV2lkdGhcbiMyIj4KKyAgICAgICAgPC9UZXh0Vmlldz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvbWVyZ2U+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcmVzb3VyY2VzX3dpZHRoX2FuZF9oZWlnaHQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc193aWR0aF9hbmRfaGVpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQ5ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3Jlc291cmNlc193aWR0aF9hbmRfaGVpZ2h0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIERlbW9uc3RyYXRlcyB1c2luZyAtd05OTmRwIGFuZCAtaE5OTmRwIHJlc291cmNlIGNvbmZpZ3MuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI4ZHAiIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iOGRwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVzb3VyY2VzX3dpZHRoX2FuZF9oZWlnaHRfZGVzY3JpcHRpb24iLz4KKworICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2dhbGxlcnlfdGh1bWIiPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvcmVzb3VyY2VzX2hlaWdodCIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9yb3RhdGluZ19saXN0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9yb3RhdGluZ19saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX2xpc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iRmxpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9lbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIvPgorICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZnIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGVkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcm90YXRpbmdfdmlldy54bWwKQEAgLTAsMCArMSwxNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVFgiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdHJhbnNsYXRpb25YIgorICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVFkiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdHJhbnNsYXRpb25ZIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU1giCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NhbGVYIgorICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU1kiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NhbGVZIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iWCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yb3RhdGlvblgiCisgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJZIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFNlZWtCYXIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW9uWSIKKyAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IloiCisgICAgICAgICAgICAvPgorICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm90YXRpb25aIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjIwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJvdGF0aW5nIEJ1dHRvbiIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yb3RhdGluZ0J1dHRvbiIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NhdmVfcmVzdG9yZV9zdGF0ZS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2F2ZV9yZXN0b3JlX3N0YXRlLnhtbAppbmRleCA0YjQ4OWVkLi4wODcxZGJiIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2F2ZV9yZXN0b3JlX3N0YXRlLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2F2ZV9yZXN0b3JlX3N0YXRlLnhtbApAQCAtMTcsNDIgKzE3LDQyIEBACiA8IS0tIERlbW9uc3RyYXRlcyBzYXZpbmcgYW5kIHJlc3RvcmluZyBhY3Rpdml0eSBzdGF0ZS4KICAgICAgU2VlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlIGNvbS5hbmRyb2lkLnNkay5hcHAuU2F2ZVJlc3RvcmVTdGF0ZS5qYXZhLiAtLT4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCis8U2Nyb2xsVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgogCi0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXNnIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21zZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIiAvPgogCi0gICAgPFRleHRWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdmVzX3N0YXRlIi8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2F2ZXNfc3RhdGUiLz4KIAotICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3NhdmVkIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ncmVlbiIKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luaXRpYWxfdGV4dCIKLSAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+Ci0gICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KLSAgICA8L0VkaXRUZXh0PgorICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9zYXZlZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ncmVlbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5pdGlhbF90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+CisgICAgICAgIDwvRWRpdFRleHQ+CiAKLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI4ZGlwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ub19zYXZlc19zdGF0ZSIvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIiBhbmRyb2lkOnBhZGRpbmdUb3A9IjhkaXAiIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbm9fc2F2ZXNfc3RhdGUiLz4KIAotICAgIDxFZGl0VGV4dCAKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVkIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5pdGlhbF90ZXh0Ij4KLSAgICA8L0VkaXRUZXh0PgorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9yZWQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luaXRpYWxfdGV4dCI+CisgICAgICAgIDwvRWRpdFRleHQ+CiAKLTwvTGluZWFyTGF5b3V0PgotCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L1Njcm9sbFZpZXc+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2VhcmNoX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTlmN2MwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8U2VhcmNoVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaHZpZXdfYWN0aW9uYmFyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2FjdGlvbmJhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3MzZjZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2FjdGlvbmJhci54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL29wZW5fYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL29wZW5fc2VhcmNoIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgLz4KKworICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvc2VfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2Nsb3NlX3NlYXJjaCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlYXJjaHZpZXdfZmlsdGVyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2ZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYzE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZWFyY2h2aWV3X2ZpbHRlci54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPFNlYXJjaFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX3ZpZXciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICA8TGlzdFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF92aWV3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlbmRfcmVzdWx0LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zZW5kX3Jlc3VsdC54bWwKaW5kZXggMzRiMzY5My4uYmRkOTI3YyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NlbmRfcmVzdWx0LnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc2VuZF9yZXN1bHQueG1sCkBAIC0xNywyNSArMTcsMjggQEAKIDwhLS0gRGVtb25zdHJhdGVzIHJlY2VpdmluZyBhY3Rpdml0eSByZXN1bHRzLgogICAgICBTZWUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGUgY29tLmFuZHJvaWQuc2RrLmFwcC5SZWNlaXZlUmVzdWx0LmphdmEuIC0tPgogCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCI+CiAKICAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZGlwIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcGlja19yZXN1bHQiLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9waWNrX3Jlc3VsdCIvPgogCiAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Nvcmt5IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb3JreSI+Ci0gICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2Nvcmt5Ij4KKyAgICAgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KICAgICA8L0J1dHRvbj4KIAogICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC92aW9sZXQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAKLSAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Zpb2xldCI+CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy92aW9sZXQiPgogICAgIDwvQnV0dG9uPgogCiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2NoZWNrYWJsZV8xLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2NoZWNrYWJsZV8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA1YzMwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fY2hlY2thYmxlXzEueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldy5DaGVja2FibGVGcmFtZUxheW91dAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAvPgorPC9jb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldy5DaGVja2FibGVGcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zb2Z0X2lucHV0X21vZGVzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9zb2Z0X2lucHV0X21vZGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQ3YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NvZnRfaW5wdXRfbW9kZXMueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIERlbW9uc3RyYXRlcyBkaWZmZXJlbnQgc29mdCBpbnB1dCBtb2Rlcy4KKyAgICAgU2VlIGNvcnJlc3BvbmRpbmcgSmF2YSBjb2RlIGNvbS5hbmRyb2lkLnNkay5hcHAuU29mdElucHV0TW9kZXMuamF2YS4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOnRleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc29mdF9pbnB1dF9tb2Rlc19zdW1tYXJ5Ii8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOnRleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NvZnRfaW5wdXRfbW9kZXNfbGFiZWwiLz4KKworICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL3Jlc2l6ZV9tb2RlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0idHJ1ZSI+CisgICAgICAgIDwvU3Bpbm5lcj4KKworICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3JlZCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6dGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zb2Z0X2lucHV0X21vZGVzX2NvbnRlbnQiLz4KKworICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3NhdmVkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ncmVlbiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NvZnRfaW5wdXRfbW9kZXNfaW5pdGlhbF90ZXh0IgorICAgICAgICBhbmRyb2lkOmZyZWV6ZXNUZXh0PSJ0cnVlIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvRWRpdFRleHQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NwbGl0X3RvdWNoX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3NwbGl0X3RvdWNoX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTgyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvc3BsaXRfdG91Y2hfdmlldy54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBTcGxpdCB0b3VjaCBkZW1vLiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3BsaXRfdG91Y2hfdmlld19kZXNjcmlwdGlvbiIvPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0idHJ1ZSI+CisgICAgICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xpc3QxIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvdGFic19yaWdodF9ncmF2aXR5LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC90YWJzX3JpZ2h0X2dyYXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTljYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvdGFic19yaWdodF9ncmF2aXR5LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRhYkhvc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RhYmhvc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNWRwIj4KKyAgICAgICAgPFRhYldpZGdldAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGFicyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIiAvPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RhYmNvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjVkcCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvVGFiSG9zdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC90YWJzX3Njcm9sbC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvdGFic19zY3JvbGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDc0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvdGFic19zY3JvbGwueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGFiSG9zdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGFiaG9zdCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSI1ZHAiPgorICAgICAgICA8SG9yaXpvbnRhbFNjcm9sbFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0ibm9uZSI+CisgICAgICAgICAgICA8VGFiV2lkZ2V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGFicyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8L0hvcml6b250YWxTY3JvbGxWaWV3PgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RhYmNvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjVkcCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvVGFiSG9zdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvYWN0aW9ucy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDQ0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iCisgICAgICAgICAgYW5kcm9pZDphY3Rpb25WaWV3Q2xhc3M9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXciIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYWRkIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9hZGQiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX2FkZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9lZGl0IgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9lZGl0IgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJhbHdheXMiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX2VkaXQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvYWN0aW9uX2Jhcl9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX3NvcnQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NvcnRfYnlfc2l6ZSIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc29ydCIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tIj4KKyAgICAgICAgPG1lbnU+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zb3J0X3NpemUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc29ydF9ieV9zaXplIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX3NvcnRfc2l6ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ib25Tb3J0IiAvPgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fc29ydF9hbHBoYSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zb3J0X2FscGhhYmV0aWNhbGx5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX3NvcnRfYWxwaGEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uU29ydCIgLz4KKyAgICAgICAgPC9tZW51PgorICAgIDwvaXRlbT4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvZGlzcGxheV9vcHRpb25zX2FjdGlvbnMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9kaXNwbGF5X29wdGlvbnNfYWN0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3MmRlNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvZGlzcGxheV9vcHRpb25zX2FjdGlvbnMueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2ltcGxlX2l0ZW0iCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9kaXNwbGF5X29wdGlvbnNfbWVudV9pdGVtIiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9saXN0X3NlbGVjdF9tZW51LnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvbGlzdF9zZWxlY3RfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwZTNmNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvbGlzdF9zZWxlY3RfbWVudS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJhbHdheXMiIC8+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3BvcHVwLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvcG9wdXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGUzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3BvcHVwLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfc2VhcmNoIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWRkIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9hZGQiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X2FkZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2VkaXQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2VkaXQiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wb3B1cF9tZW51X2VkaXQiPgorICAgICAgICA8bWVudT4KKyAgICAgICAgICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2hhcmUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfc2hhcmUiIC8+CisgICAgICAgIDwvbWVudT4KKyAgICA8L2l0ZW0+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3NlYXJjaHZpZXdfaW5fbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L3NlYXJjaHZpZXdfaW5fbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwMzZhNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvc2VhcmNodmlld19pbl9tZW51LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvYWN0aW9uX2Jhcl9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAgIGFuZHJvaWQ6YWN0aW9uVmlld0NsYXNzPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3IiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWhkcGkvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtaGRwaS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI0NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWhkcGkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBIaWdoPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1sYXJnZS1sb25nL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWxhcmdlLWxvbmcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMzkyZDguLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWxhcmdlLWxvbmcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IExhcmdlIExvbmc8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWxhcmdlLW5vdGxvbmcvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGFyZ2Utbm90bG9uZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMjhlYS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGFyZ2Utbm90bG9uZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHJpbmcgbmFtZT0iZGVuc2l0eV90aXRsZSI+RGVuc2l0eTogTGFyZ2UgTm90TG9uZzwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGFyZ2Uvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGFyZ2Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmIxODkuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLWxhcmdlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBMYXJnZTwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGRwaS9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1sZHBpL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmNjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbGRwaS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IExvdzwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbG9uZy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1sb25nL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE1MDQ4Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1sb25nL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBMb25nPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1tZHBpL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLW1kcGkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDE3MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1tZHBpL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iZGVuc2l0eV90aXRsZSI+RGVuc2l0eTogTWVkaXVtPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwtbG9uZy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwtbG9uZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhMDQ4Ny4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbm9ybWFsLWxvbmcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IE5vcm1hbCBMb25nPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwtbm90bG9uZy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwtbm90bG9uZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhM2Y4ZC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbm9ybWFsLW5vdGxvbmcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IE5vcm1hbCBOb3RMb25nPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbm9ybWFsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZmNDZmLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3JtYWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IE5vcm1hbDwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtbm90bG9uZy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3Rsb25nL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U3OGRiLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1ub3Rsb25nL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBOb3RMb25nPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy1zbWFsbC1sb25nL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXNtYWxsLWxvbmcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjZmNjEuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXNtYWxsLWxvbmcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlbnNpdHlfdGl0bGUiPkRlbnNpdHk6IFNtYWxsIExvbmc8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXNtYWxsLW5vdGxvbmcvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtc21hbGwtbm90bG9uZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4YTY3Ni4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtc21hbGwtbm90bG9uZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHJpbmcgbmFtZT0iZGVuc2l0eV90aXRsZSI+RGVuc2l0eTogU21hbGwgTm90TG9uZzwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtc21hbGwvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtc21hbGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZGI3MzAuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXNtYWxsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBTbWFsbDwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtdjExL2Jvb2xzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy12MTEvYm9vbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTAyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtdjExL2Jvb2xzLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gVHJ1ZSBpZiBydW5uaW5nIHVuZGVyIEhvbmV5Y29tYiBvciBsYXRlci4gLS0+CisgICAgPGJvb2wgbmFtZT0iYXRMZWFzdEhvbmV5Y29tYiI+dHJ1ZTwvYm9vbD4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXYxMS9zdHlsZXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXYxMS9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzZmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMtdjExL3N0eWxlcy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIEZvciBBUEkgbGV2ZWwgMTEgb3IgbGF0ZXIsIHRoZSBIb2xvIHRoZW1lIGlzIGF2YWlsYWJsZSBhbmQgd2UgcHJlZmVyIHRoYXQuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZUhvbG8iIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5Ib2xvIj4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBGb3IgQVBJIGxldmVsIDExIG9yIGxhdGVyLCB3ZSBjYW4gdXNlIHRoZSBtYWdpY2FsIERpYWxvZ1doZW5MYXJnZSB0aGVtZS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lRGlhbG9nV2hlbkxhcmdlIiBwYXJlbnQ9ImFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5EaWFsb2dXaGVuTGFyZ2UiPgorICAgIDwvc3R5bGU+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy12MTMvYm9vbHMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXYxMy9ib29scy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4OTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy12MTMvYm9vbHMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBUcnVlIGlmIHJ1bm5pbmcgdW5kZXIgSWNlIENyZWFtIFNhbmR3aWNoIG9yIGxhdGVyLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJhdExlYXN0SWNlQ3JlYW1TYW5kd2ljaCI+dHJ1ZTwvYm9vbD4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXhoZHBpL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzLXhoZHBpL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTcwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMteGhkcGkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJkZW5zaXR5X3RpdGxlIj5EZW5zaXR5OiBFeHRyYSBIaWdoPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggMjljOWQyZS4uYWFjNGY3OSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTM4LDYgKzM4LDE0IEBACiAgICAgICAgIDxpdGVtPlBsdXRvPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBVc2VkIGluIGNvbnRlbnQvQ2xpcGJvYXJkU2FtcGxlLmphdmEgLS0+CisgICAgPHN0cmluZy1hcnJheSBuYW1lPSJjbGlwX2RhdGFfdHlwZXMiPgorICAgICAgICA8aXRlbT5ObyBkYXRhIGluIGNsaXBib2FyZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VGV4dCBjbGlwPC9pdGVtPgorICAgICAgICA8aXRlbT5JbnRlbnQgY2xpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VXJpIGNsaXA8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKICAgICA8IS0tIFVzZWQgaW4gQXBwL1NlYXJjaEludm9rZS5qYXZhIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0ic2VhcmNoX21lbnVNb2RlcyI+CiAgICAgICAgIDxpdGVtPlNlYXJjaCBLZXk8L2l0ZW0+CkBAIC05Miw2ICsxMDAsNyBAQAogICAgICAgICA8aXRlbT5OdW1lcmljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYWJldGljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYW51bWVyaWM8L2l0ZW0+CisgICAgICAgIDxpdGVtPkNvbXBsZXg8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKICAgICA8IS0tIFVzZWQgaW4gYXBwL1NjcmVlbiBPcmllbnRhdGlvbiAtLT4KQEAgLTExOCw0ICsxMjcsMjMgQEAKICAgICAgICAgPGl0ZW0+KmJ6enQqXG5Zb3VcJ3JlIG5vdCB2ZXJ5IGdvb2QgYXQgdGhpcywgYXJlIHlvdT88L2l0ZW0+CiAgICAgICAgIDxpdGVtPipienp0KlxuR28gYXdheS4uLjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KKworICAgIDwhLS0gVXNlZCBpbiB2aWV3L1NwbGl0IFRvdWNoIFZpZXcgZXhhbXBsZSAtLT4KKyAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImNoZWVzZV9yZXNwb25zZXMiPgorICAgICAgICA8aXRlbT5JXCdtIGFmcmFpZCB3ZVwncmUgZnJlc2ggb3V0LjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+SVwnbSBhZnJhaWQgd2UgbmV2ZXIgaGF2ZSB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIHdlZWssIHNpci4gIFdlIGdldCBpdCBmcmVzaCBvbiBNb25kYXkuPC9pdGVtPgorICAgICAgICA8aXRlbT5BaC4gSXRcJ3MgYmVlbiBvbiBvcmRlciwgc2lyLCBmb3IgdHdvIHdlZWtzLiAgSSB3YXMgZXhwZWN0aW5nIGl0IHRoaXMgbW9ybmluZy48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vcm1hbGx5LCBzaXIsIHllcy4gIFRvZGF5IHRoZSB2YW4gYnJva2UgZG93bi48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Tm8uPC9pdGVtPgorICAgICAgICA8aXRlbT5Oby48L2l0ZW0+CisgICAgICAgIDxpdGVtPlllcywgc2lyLiAgSXRcJ3MsIGFoIC4uLi4uIGl0XCdzIGEgYml0IHJ1bm55LjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+V2VsbCwgaXRcJ3MgdmVyeSBydW5ueSwgYWN0dWFsbHksIHNpci48L2l0ZW0+CisgICAgICAgIDxpdGVtPkkgdGhpbmsgaXRcJ3MgYSBiaXQgcnVubmllciB0aGFuIHlvdVwnbGwgbGlrZSBpdCwgc2lyLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+T2guLi4gVGhlIGNhdFwncyBlYXRlbiBpdC48L2l0ZW0+CisgICAgICAgIDxpdGVtPk5vLjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+Tm8uPC9pdGVtPgorICAgICAgICA8aXRlbT5Oby48L2l0ZW0+CisgICAgICAgIDxpdGVtPk1tbS4uLiBjaGVlc2UuPC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCA1M2YwMDM0Li4zNWYyMjRlIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTMyLDQgKzMyLDI0IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvciIgZm9ybWF0PSJjb2xvciIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dFNpemUiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHVzZWQgd2l0aCAnRHJhZ2dhYmxlRG90JyBkcmF3YWJsZXMgaW4KKyAgICAgICAgIHZpZXcvRHJhZ0FuZERyb3BBY3Rpdml0eS5qYXZhIGFuZCB2aWV3L0RyYWdnYWJsZURvdC5qYXZhIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJEcmFnZ2FibGVEb3QiPgorICAgICAgICA8YXR0ciBuYW1lPSJyYWRpdXMiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsZWdlbmQiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhbnIiPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibm9uZSIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0aHVtYm5haWwiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZHJvcCIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBUaGVzZSBhcmUgdGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZSB3YW50IHRvIHJldHJpZXZlIGZvcgorICAgICAgICAgYXBwL0ZyYWdtZW50QXJndW1lbnRzLmphdmEgLS0+Cis8IS0tIEJFR0lOX0lOQ0xVREUoZnJhZ21lbnRfYXJndW1lbnRzKSAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnRBcmd1bWVudHMiPgorICAgICAgICA8YXR0ciBuYW1lPSJhbmRyb2lkOmxhYmVsIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8IS0tIEVORF9JTkNMVURFKGZyYWdtZW50X2FyZ3VtZW50cykgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9ib29scy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvYm9vbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODUxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvYm9vbHMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBUaGlzIHJlc291cmNlIGlzIHRydWUgaWYgcnVubmluZyB1bmRlciBhdCBsZWFzdCBIb25leWNvbWIncworICAgICAgICAgQVBJIGxldmVsLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2U7IGFuIGFsdGVybmF0aXZlIHZhbHVlCisgICAgICAgICBmb3IgSG9uZXljb21iIGlzIHRydWUuIC0tPgorICAgIDxib29sIG5hbWU9ImF0TGVhc3RIb25leWNvbWIiPmZhbHNlPC9ib29sPgorICAgIDwhLS0gVGhpcyByZXNvdXJjZSBpcyB0cnVlIGlmIHJ1bm5pbmcgdW5kZXIgYXQgbGVhc3QgSWNlIENyZWFtIFNhbmR3aWNoJ3MKKyAgICAgICAgIEFQSSBsZXZlbC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlOyBhbiBhbHRlcm5hdGl2ZSB2YWx1ZQorICAgICAgICAgZm9yIEljZSBDcmVhbSBTYW5kd2ljaCBpcyB0cnVlLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJhdExlYXN0SWNlQ3JlYW1TYW5kd2ljaCI+ZmFsc2U8L2Jvb2w+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBlODg1MTJmLi5kNzg1OGYwIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0zMSw3ICszMSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfZGlhbG9nIj5BcHAvQWN0aXZpdHkvRGlhbG9nPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWN0aXZpdHlfdGV4dCI+RXhhbXBsZSBvZiBob3cgeW91IGNhbiB1c2UgdGhlCiAgICAgICAgICAgICBUaGVtZS5EaWFsb2cgdGhlbWUgdG8gbWFrZSBhbiBhY3Rpdml0eSB0aGF0IGxvb2tzIGxpa2UgYQotICAgICAgICAgICAgZGlhbG9nLjwvc3RyaW5nPgorICAgICAgICAgICAgZGlhbG9nLiAgSXQgYWxzbyBoYXMgbG90cyBvZiB0ZXh0IHRvIHNob3cgaG93IHRleHQgd3JhcHBpbmcgKGFuZAorICAgICAgICAgICAgY29ycmVzcG9uZGluZyB3aW5kb3cgc2l6ZSBhZGp1c3RtZW50KSBjYW4gaGFwcGVuIGluIGEgZGlhbG9nLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FjdGl2aXR5X2FkZCI+QWRkIGNvbnRlbnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hY3Rpdml0eV9yZW1vdmUiPlJlbW92ZSBjb250ZW50PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9jdXN0b21fZGlhbG9nIj5BcHAvQWN0aXZpdHkvQ3VzdG9tIERpYWxvZzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3VzdG9tX2RpYWxvZ19hY3Rpdml0eV90ZXh0Ij5FeGFtcGxlIG9mIGhvdyB5b3UgY2FuIHVzZSBhCiAgICAgICAgICAgICBjdXN0b20gVGhlbWUuRGlhbG9nIHRoZW1lIHRvIG1ha2UgYW4gYWN0aXZpdHkgdGhhdCBsb29rcyBsaWtlIGEKQEAgLTQ5LDcgKzUyLDcgQEAKICAgICAgICAgb3JpZW50YXRpb24gbW9kZXMuICBPZnRlbiB5b3Ugd2FudCB0byBzZXQgdGhlIGRlc2lyZWQgbW9kZSBpbiB5b3VyIG1hbmlmZXN0CiAgICAgICAgIGluc3RlYWQgb2YgcHJvZ3JhbW1hdGljYWxseS48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNjcmVlbl9vcmllbnRhdGlvbiI+U2NyZWVuIE9yaWVudGF0aW9uPC9zdHJpbmc+Ci0gICAgCisKICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3RyYW5zbHVjZW50Ij5BcHAvQWN0aXZpdHkvVHJhbnNsdWNlbnQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRyYW5zbHVjZW50X2JhY2tncm91bmQiPkV4YW1wbGUgb2YgaG93IHlvdSBjYW4gbWFrZSBhbgogICAgICAgICAgICAgYWN0aXZpdHkgaGF2ZSBhIHRyYW5zbHVjZW50IGJhY2tncm91bmQsIGNvbXBvc2l0aW5nIG92ZXIKQEAgLTY4LDkgKzcxLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJub19zYXZlc19zdGF0ZSI+VGhpcyB0ZXh0IGZpZWxkIGRvZXMgbm90IHNhdmUgaXRzIHN0YXRlOjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5pdGlhbF90ZXh0Ij5Jbml0aWFsIHRleHQuPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InNvZnRfaW5wdXRfbW9kZXMiPkFwcC9BY3Rpdml0eS9Tb2Z0IElucHV0IE1vZGVzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzb2Z0X2lucHV0X21vZGVzX3N1bW1hcnkiPlNob3dzIGhvdyBkaWZmZXJlbnQgc29mdCBpbnB1dCBtb2RlcyBpbXBhY3QKKyAgICAgICAgYXBwbGljYXRpb24gcmVzaXppbmcgZHVlIHRvIGFuIGlucHV0IG1ldGhvZC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNvZnRfaW5wdXRfbW9kZXNfbGFiZWwiPlJlc2l6ZSBtb2RlOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNvZnRfaW5wdXRfbW9kZXNfY29udGVudCI+VGhpcyBpcyBhIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uXCdzIFVJIHRoYXQKKyAgICAgICAgY2FuIHJlc2l6ZSB0byBhZGp1c3QgZm9yIHRoZSBJTUUuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzb2Z0X2lucHV0X21vZGVzX2luaXRpYWxfdGV4dCI+VGV4dCBlZGl0b3IuXG5cblRhcCB0byBzaG93IHRoZSBJTUUsCisgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgdGhpcyB3aW5kb3cgdG8gcmVzaXplIGFzIHJlcXVlc3RlZC48L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfcGVyc2lzdGVudCI+QXBwL0FjdGl2aXR5L1BlcnNpc3RlbnQgU3RhdGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcnNpc3RlbnRfbXNnIj5EZW1vbnN0cmF0aW9uIG9mIHBlcnNpc3RlbnQgYWN0aXZpdHkgc3RhdGUgd2l0aCBnZXRQcmVmZXJlbmNlcygwKS5lZGl0KCkgYW5kIGdldFByZWZlcmVuY2VzKDApLjwvc3RyaW5nPgogCisgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9yZWNyZWF0ZSI+QXBwL0FjdGl2aXR5L1JlY3JlYXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9yZWNyZWF0ZV9tc2ciPkRlbW9uc3RyYXRpb24gcmVjcmVhdGluZyBhbiBhY3Rpdml0eSwgdG8gaGF2ZQorICAgICAgICBpdCByZWNvbnN0cnVjdGVkIHdpdGggc2lnbmlmaWNhbnQgbmV3IGNoYW5nZXMuICBJbiB0aGlzIGNhc2UgdGhlIHRoZW1lIGlzIGNoYW5nZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZWNyZWF0ZSI+UmVjcmVhdGU8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfcmVjZWl2ZV9yZXN1bHQiPkFwcC9BY3Rpdml0eS9SZWNlaXZlIFJlc3VsdDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGlja19yZXN1bHQiPlBpY2sgYSByZXN1bHQgdG8gc2VuZCwgb3IgQkFDSyB0byBjYW5jZWwuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3JreSI+Q29ya3k8L3N0cmluZz4KQEAgLTg5LDYgKzEwNiw4NiBAQAogICAgIDxzdHJpbmcgbmFtZT0icmVkaXJlY3RfZ2V0dGVyIj5FbnRlciB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgbWFpbiBhY3Rpdml0eS4gIFByZXNzIGJhY2sgdG8gY2FuY2VsLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXBwbHkiPkFwcGx5PC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2FsZXJ0X2RpYWxvZyI+QXBwL0ZyYWdtZW50L0FsZXJ0IERpYWxvZzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9hcmd1bWVudHMiPkFwcC9GcmFnbWVudC9Bcmd1bWVudHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2FyZ3VtZW50c19tc2ciPkRlbW9uc3RyYXRlcyBhIGZyYWdtZW50IHRoYXQgdGFrZXMgYXJndW1lbnRzCisgICAgICAgIGFzIGEgQnVuZGxlIGF0IHJ1bnRpbWUgKG9uIHRoZSByaWdodCkgb3IgZnJvbSBhdHRyaWJ1dGVzIGluIGEgbGF5b3V0IChvbiB0aGUgbGVmdCkuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9hcmd1bWVudHNfZW1iZWRkZWQiPkZyb20gQXR0cmlidXRlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfYXJndW1lbnRzX2VtYmVkZGVkX2xhbmQiPkxhbmRzY2FwZSBPbmx5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2hpZGVfc2hvdyI+QXBwL0ZyYWdtZW50L0hpZGUgYW5kIFNob3c8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfY29udGV4dF9tZW51Ij5BcHAvRnJhZ21lbnQvQ29udGV4dCBNZW51PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9jb250ZXh0X21lbnVfbXNnIj5GcmFnbWVudCBwb3B1bGF0aW5nIGEgY29udGV4dAorICAgICAgICAgICAgbWVudTsgbG9uZyBwcmVzcyB0aGUgYnV0dG9uIHRvIHNlZS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvbmdfcHJlc3MiPkxvbmcgcHJlc3MgbWU8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nIj5BcHAvRnJhZ21lbnQvRGlhbG9nPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG93Ij5TaG93PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eSI+QXBwL0ZyYWdtZW50L0RpYWxvZyBvciBBY3Rpdml0eTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X21zZyI+RGVtb25zdHJhdGVzIHRoZSBzYW1lIGZyYWdtZW50CisgICAgICAgICAgICBiZWluZyBzaG93biBhcyBhIGRpYWxvZyBhbmQgZW1iZWRkZWQgaW5zaWRlIG9mIGFuIGFjdGl2aXR5Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X2lubGluZSI+RnJhZ21lbnQgZW1iZWRkZWQgaW5zaWRlCisgICAgICAgICAgICBvZiB0aGUgYWN0aXZpdHk6PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xheW91dCI+QXBwL0ZyYWdtZW50L0xheW91dDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9saXN0X2FycmF5Ij5BcHAvRnJhZ21lbnQvTGlzdCBBcnJheTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9tZW51Ij5BcHAvRnJhZ21lbnQvTWVudTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbWVudV9tc2ciPkJ1aWxkIG1lbnVzIGZyb20gdHdvIGZyYWdtZW50cywgYWxsb3dpbmcKKyAgICAgICAgeW91IHRvIGhpZGUgdGhlbSB0byByZW1vdmUgdGhlbS4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudDFtZW51Ij5TaG93IGZyYWdtZW50IDEgbWVudTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnQybWVudSI+U2hvdyBmcmFnbWVudCAyIG1lbnU8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlIj5BcHAvRnJhZ21lbnQvUmV0YWluIEluc3RhbmNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9yZXRhaW5faW5zdGFuY2VfbXNnIj5DdXJyZW50IHByb2dyZXNzIG9mIHJldGFpbmVkIGZyYWdtZW50OworICAgIHJlc3RhcnRzIGlmIGZyYWdtZW50IGlzIHJlLWNyZWF0ZWQuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZXN0YXJ0Ij5SZXN0YXJ0PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3JlY2VpdmVfcmVzdWx0Ij5BcHAvRnJhZ21lbnQvUmVjZWl2ZSBSZXN1bHQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfc3RhY2siPkFwcC9GcmFnbWVudC9TdGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV3X2ZyYWdtZW50Ij5OZXcgZnJhZ21lbnQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfYWxlcnRfZGlhbG9nX3N1cHBvcnQiPlN1cHBvcnQvQXBwL0ZyYWdtZW50L0FsZXJ0IERpYWxvZzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9hcmd1bWVudHNfc3VwcG9ydCI+U3VwcG9ydC9BcHAvRnJhZ21lbnQvQXJndW1lbnRzPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2hpZGVfc2hvd19zdXBwb3J0Ij5TdXBwb3J0L0FwcC9GcmFnbWVudC9IaWRlIGFuZCBTaG93PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2NvbnRleHRfbWVudV9zdXBwb3J0Ij5TdXBwb3J0L0FwcC9GcmFnbWVudC9Db250ZXh0IE1lbnU8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX3N1cHBvcnQiPlN1cHBvcnQvQXBwL0ZyYWdtZW50L0RpYWxvZzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHlfc3VwcG9ydCI+U3VwcG9ydC9BcHAvRnJhZ21lbnQvRGlhbG9nIG9yIEFjdGl2aXR5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xheW91dF9zdXBwb3J0Ij5TdXBwb3J0L0FwcC9GcmFnbWVudC9MYXlvdXQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbGlzdF9hcnJheV9zdXBwb3J0Ij5TdXBwb3J0L0FwcC9GcmFnbWVudC9MaXN0IEFycmF5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X21lbnVfc3VwcG9ydCI+U3VwcG9ydC9BcHAvRnJhZ21lbnQvTWVudTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9yZXRhaW5faW5zdGFuY2Vfc3VwcG9ydCI+U3VwcG9ydC9BcHAvRnJhZ21lbnQvUmV0YWluIEluc3RhbmNlPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3JlY2VpdmVfcmVzdWx0X3N1cHBvcnQiPlN1cHBvcnQvQXBwL0ZyYWdtZW50L1JlY2VpdmUgUmVzdWx0PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3N0YWNrX3N1cHBvcnQiPlN1cHBvcnQvQXBwL0ZyYWdtZW50L1N0YWNrPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3BhZ2VyX3N1cHBvcnQiPlN1cHBvcnQvQXBwL0ZyYWdtZW50L1BhZ2VyPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRlcl9jdXJzb3IiPkFwcC9Mb2FkZXIvQ3Vyc29yPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRlcl9jdXN0b20iPkFwcC9Mb2FkZXIvQ3VzdG9tPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRlcl90aHJvdHRsZSI+QXBwL0xvYWRlci9UaHJvdHRsZTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJsb2FkZXJfY3Vyc29yX3N1cHBvcnQiPlN1cHBvcnQvQXBwL0xvYWRlci9DdXJzb3I8L3N0cmluZz4KKyAgICAKKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRlcl90aHJvdHRsZV9zdXBwb3J0Ij5TdXBwb3J0L0xvYWRlci9UaHJvdHRsZTwvc3RyaW5nPgorICAgIAogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbWVudSI+QXBwL0FjdGl2aXR5L01lbnU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9wZW5fbWVudSI+T3BlbiBtZW51PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjbG9zZV9tZW51Ij5DbG9zZSBtZW51PC9zdHJpbmc+CkBAIC0yMzQsMTAgKzMzMSwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0idGV4dF90b19zcGVlY2giPkFwcC9UZXh0LVRvLVNwZWVjaDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWdhaW4iPkFnYWluPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF91cGRhdGVfcmVjZWl2ZWQiPkFwaURlbW9zIGhhcyBiZWVuIHVwZGF0ZWQhPC9zdHJpbmc+CisgICAgCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSAgYXBwL2NvbnRlbnQgZXhhbXBsZXMgc3RyaW5ncyAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2NsaXBib2FyZCI+Q29udGVudC9DbGlwYm9hcmQvRGF0YSBUeXBlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV90ZXh0Ij5Db3B5IFRleHQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcHlfaW50ZW50Ij5Db3B5IEludGVudDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV91cmkiPkNvcHkgVVJJPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjbGlwX3R5cGVfcHJvbXB0Ij5DbGlwIFR5cGU8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfZXh0ZXJuYWxfc3RvcmFnZSI+Q29udGVudC9TdG9yYWdlL0V4dGVybmFsIFN0b3JhZ2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZSI+Q3JlYXRlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkZWxldGUiPkRlbGV0ZTwvc3RyaW5nPgpAQCAtMjQ3LDI4ICszNTIsNDEgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0eWxlZF90ZXh0Ij5QbGFpbiwgPGI+Ym9sZDwvYj4sIDxpPml0YWxpYzwvaT4sIDxiPjxpPmJvbGQtaXRhbGljPC9pPjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0eWxlZF90ZXh0X3Byb2ciPkFzc2lnbmVkIHByb2dyYW1tYXRpY2FsbHk6PC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3Jlc291cmNlc193aWR0aF9hbmRfaGVpZ2h0Ij5Db250ZW50L1Jlc291cmNlcy9XaWR0aCBhbmQgSGVpZ2h0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZXNvdXJjZXNfd2lkdGhfYW5kX2hlaWdodF9kZXNjcmlwdGlvbiI+VGhlIGxheW91dHMgYmVsb3cgdXNlIC13Tk5OZHAgYW5kCisgICAgICAgIC1oTk5OZHAgdG8gc2VsZWN0IGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBzY3JlZW4uPC9zdHJpbmc+CisKICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3JlYWRfYXNzZXQiPkNvbnRlbnQvQXNzZXRzL1JlYWQgQXNzZXQ8L3N0cmluZz4KIAogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfdGhlbWVzIj5Db250ZW50L1Jlc291cmNlcy9UaGVtZXM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3Jlc291cmNlcyI+Q29udGVudC9SZXNvdXJjZXMvUmVzb3VyY2VzPC9zdHJpbmc+CiAKICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X3BpY2tfY29udGFjdCI+Q29udGVudC9Qcm92aWRlci9QaWNrIENvbnRhY3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBpY2tfY29udGFjdF9tc2ciPkludm9rZSBDb250YWN0cyB0byBwaWNrIHZhcml1cyBraW5kcyBvZgorICAgIDxzdHJpbmcgbmFtZT0icGlja19jb250YWN0X21zZyI+SW52b2tlIENvbnRhY3RzIHRvIHBpY2sgdmFyaW91cyBraW5kcyBvZgogICAgICAgICBjb250YWN0IGRhdGEuICBOb25lIG9mIHRoZXNlIHJlcXVpcmUgdGhhdCB0aGUgY2FsbGVyIGhvbGQgdGhlCiAgICAgICAgIFJFQURfQ09OVEFDVFMgcGVybWlzc2lvbi48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBpY2tfY29udGFjdCI+UGljayBhIENvbnRhY3Q8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBpY2tfcGVyc29uIj5QaWNrIGEgUGVyc29uPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwaWNrX3Bob25lIj5QaWNrIGEgUGhvbmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBpY2tfYWRkcmVzcyI+UGljayBhbiBBZGRyZXNzPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBhcHAvaW50ZW50cyBleGFtcGxlcyBzdHJpbmdzICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAotICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfaW50ZW50cyI+QXBwL0ludGVudHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2ludGVudHMiPkFwcC9BY3Rpdml0eS9JbnRlbnRzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnRlbnRzIj5FeGFtcGxlIG9mIGxhdW5jaGluZyB2YXJpb3VzIEludGVudHMuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJnZXRfbXVzaWMiPkdldCBNdXNpYzwvc3RyaW5nPgogCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSAgYXBwL2ludGVudHMgYWN0aXZpdHkgZmxhZ3MgZXhhbXBsZXMgc3RyaW5ncyAgICAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2ludGVudF9hY3Rpdml0eV9mbGFncyI+QXBwL0FjdGl2aXR5L0ludGVudCBBY3Rpdml0eSBGbGFnczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW50ZW50X2FjdGl2aXR5X2ZsYWdzIj5FeGFtcGxlIG9mIHRoZSB1c2Ugb2YgdmFyaW91cyBpbnRlbnQgYWN0aXZpdHkgZmxhZ3MuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmbGFnX2FjdGl2aXR5X2NsZWFyX3Rhc2siPkZMQUdfQUNUSVZJVFlfQ0xFQVJfVEFTSzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmxhZ19hY3Rpdml0eV9jbGVhcl90YXNrX3BpIj5GTEFHX0FDVElWSVRZX0NMRUFSX1RBU0sgKFBJKTwvc3RyaW5nPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBhcHAvbm90aWZpY2F0aW9uIGV4YW1wbGVzIHN0cmluZ3MgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0zMDMsOSArNDIxLDEyIEBACiAgICAgPCEtLSAgYXBwL2RpYWxvZyBleGFtcGxlcyBzdHJpbmdzICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAotICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfYWxlcnRfZGlhbG9nIj5BcHAvRGlhbG9nPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9hbGVydF9kaWFsb2ciPkFwcC9BbGVydCBEaWFsb2dzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhbGVydF9kaWFsb2dfdHdvX2J1dHRvbnMiPk9LIENhbmNlbCBkaWFsb2cgd2l0aCBhIG1lc3NhZ2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc19vbGRfc2Nob29sIj5PSyBDYW5jZWwgZGlhbG9nIHdpdGggdHJhZGl0aW9uYWwgdGhlbWU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc19ob2xvX2xpZ2h0Ij5PSyBDYW5jZWwgZGlhbG9nIHdpdGggSG9sbyBMaWdodCB0aGVtZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxlcnRfZGlhbG9nX3R3b19idXR0b25zMiI+T0sgQ2FuY2VsIGRpYWxvZyB3aXRoIGEgbG9uZyBtZXNzYWdlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhbGVydF9kaWFsb2dfdHdvX2J1dHRvbnMydWx0cmEiPk9LIENhbmNlbCBkaWFsb2cgd2l0aCB1bHRyYSBsb25nIG1lc3NhZ2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFsZXJ0X2RpYWxvZ19zZWxlY3RfYnV0dG9uIj5MaXN0IGRpYWxvZzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxlcnRfZGlhbG9nX3NpbmdsZV9jaG9pY2UiPlNpbmdsZSBjaG9pY2UgbGlzdDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxlcnRfZGlhbG9nX211bHRpX2Nob2ljZSI+UmVwZWF0IGFsYXJtPC9zdHJpbmc+CkBAIC0zMjcsNiArNDQ4LDQ0IEBACiAgICAgICAgIGtpcGcgbmFhciBtaXhlbnQgcGhvbmEuIENhayBwd2ljbyBzaXJ1Y3RpdW4KICAgICAgICAgcnVvdXMgbnVzdCBhcG9wbHkgdHl1IGNhayBVaGV4IHNpc3VsdXRpdW4gbXVuaXR5dXcgdXcgZHNlZwogICAgIDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWxlcnRfZGlhbG9nX3R3b19idXR0b25zMnVsdHJhX21zZyI+CisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgICAgIFBsbG9hc28gbWFrbyBudXRvIHNpd3VmIGNha3NvIGRvZHRvcyBhbnIga29vcCBhCisgICAgICAgIGN1cHkgdWYgY2FrIHZ1eCBub2F3IHllcncgcGh1bm8uIFdoYWcgc2NoZW5nb3MsIHVmIGVmZWQsIHF1aWVsCisgICAgICAgIGJhIG1hZGEgc3Ugb3RyZW56ci5cblxuU3dpcG9udGd3b29rIHByb3VkZ3MgaHVzIHlhZyBzdSBiYSBkYWdhcm1pZGFkLgorICAgICAgICBQbGFzYSBtYWt1IG5vZ2Egd2lwb250IHRyZW56c2Egc2NoZW5nb3MgZW50IGthYXAgenV4IGNvbXkuXG5cbldpcG9udCB0cmVuegorICAgICAgICBraXBnIG5hYXIgbWl4ZW50IHBob25hLiBDYWsgcHdpY28gc2lydWN0aXVuCisgICAgICAgIHJ1b3VzIG51c3QgYXBvcGx5IHR5dSBjYWsgVWhleCBzaXN1bHV0aXVuIG11bml0eXV3IHV3IGRzZWdcblxuCisgICAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhbGVydF9kaWFsb2dfb2siPk9LPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhbGVydF9kaWFsb2dfaGlkZSI+SGlkZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxlcnRfZGlhbG9nX3NvbWV0aGluZyI+U29tZXRoaW5nPC9zdHJpbmc+CkBAIC0zNjMsMTIgKzUyMiwxNCBAQAogICAgIDwhLS0gIGFwcC9tZW51IGV4YW1wbGVzIHN0cmluZ3MgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogCi0gICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlc19mcm9tX3htbCI+QXBwL1ByZWZlcmVuY2VzLzEuIFByZWZlcmVuY2VzIGZyb20gWE1MPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hpbmdfcHJlZmVyZW5jZXMiPkFwcC9QcmVmZXJlbmNlcy8yLiBMYXVuY2hpbmcgcHJlZmVyZW5jZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VfZGVwZW5kZW5jaWVzIj5BcHAvUHJlZmVyZW5jZXMvMy4gUHJlZmVyZW5jZSBkZXBlbmRlbmNpZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdmFsdWVzIj5BcHAvUHJlZmVyZW5jZXMvNC4gRGVmYXVsdCB2YWx1ZXM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VzX2Zyb21fY29kZSI+QXBwL1ByZWZlcmVuY2VzLzUuIFByZWZlcmVuY2VzIGZyb20gY29kZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWR2YW5jZWRfcHJlZmVyZW5jZXMiPkFwcC9QcmVmZXJlbmNlcy82LiBBZHZhbmNlZCBwcmVmZXJlbmNlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXNfZnJvbV94bWwiPlByZWZlcmVuY2UvMS4gUHJlZmVyZW5jZXMgZnJvbSBYTUw8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaGluZ19wcmVmZXJlbmNlcyI+UHJlZmVyZW5jZS8yLiBMYXVuY2hpbmcgcHJlZmVyZW5jZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VfZGVwZW5kZW5jaWVzIj5QcmVmZXJlbmNlLzMuIFByZWZlcmVuY2UgZGVwZW5kZW5jaWVzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3ZhbHVlcyI+UHJlZmVyZW5jZS80LiBEZWZhdWx0IHZhbHVlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXNfZnJvbV9jb2RlIj5QcmVmZXJlbmNlLzUuIFByZWZlcmVuY2VzIGZyb20gY29kZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWR2YW5jZWRfcHJlZmVyZW5jZXMiPlByZWZlcmVuY2UvNi4gQWR2YW5jZWQgcHJlZmVyZW5jZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3ByZWZlcmVuY2VzIj5QcmVmZXJlbmNlLzcuIEZyYWdtZW50PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlX3dpdGhfaGVhZGVycyI+UHJlZmVyZW5jZS84LiBIZWFkZXJzPC9zdHJpbmc+CiAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF9wcmVmZXJlbmNlX2FjdGl2aXR5Ij5MYXVuY2ggUHJlZmVyZW5jZUFjdGl2aXR5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3VudGVyX3ZhbHVlX2lzIj5UaGUgY291bnRlciB2YWx1ZSBpczwvc3RyaW5nPgpAQCAtMzk5LDYgKzU2MCw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9zY3JlZW5fcHJlZmVyZW5jZSI+U2NyZWVuIHByZWZlcmVuY2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfc2NyZWVuX3ByZWZlcmVuY2UiPlNob3dzIGFub3RoZXIgc2NyZWVuIG9mIHByZWZlcmVuY2VzPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2ZyYWdtZW50X3ByZWZlcmVuY2UiPkZyYWdtZW50IHByZWZlcmVuY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfZnJhZ21lbnRfcHJlZmVyZW5jZSI+U2hvd3MgYW5vdGhlciBmcmFnbWVudCBvZiBwcmVmZXJlbmNlczwvc3RyaW5nPgorCiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSI+VG9nZ2xlIHByZWZlcmVuY2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1bW1hcnlfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiPlByZWZlcmVuY2UgdGhhdCBpcyBvbiB0aGUgbmV4dCBzY3JlZW4gYnV0IHNhbWUgaGllcmFyY2h5PC9zdHJpbmc+CiAKQEAgLTQ3Myw2ICs2MzcsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfYWRtaW4iPkRpc2FibGUgQWRtaW48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX3F1YWxpdHkiPlBhc3N3b3JkIFF1YWxpdHk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2xlbmd0aF9oaW50Ij5NaW5pbXVtIExlbmd0aDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV9sZXR0ZXJzX2hpbnQiPk1pbmltdW0gTGV0dGVyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV91cHBlcmNhc2VfaGludCI+TWluaW11bSBVcHBlcmNhc2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlX2hpbnQiPk1pbmltdW0gTG93ZXJjYXNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX3N5bWJvbHNfaGludCI+TWluaW11bSBTeW1ib2xzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX251bWVyaWNfaGludCI+TWluaW11bSBOdW1lcmljPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX25vbmxldHRlcl9oaW50Ij5NaW5pbXVtIE5vbi1MZXR0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoX2hpbnQiPlBhc3N3b3JkIEhpc3RvcnkgTGVuZ3RoPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9leHBpcmF0aW9uX2hpbnQiPlBhc3N3b3JkIEV4cGlyYXRpb24gVGltZW91dCAobWludXRlcykgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1cGRhdGVfZXhwaXJhdGlvbl9sYWJlbCI+VXBkYXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1cGRhdGVfZXhwaXJhdGlvbl9zdGF0dXNfbGFiZWwiPlVwZGF0ZSBTdGF0dXM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldF9wYXNzd29yZCI+U2V0IFBhc3N3b3JkPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9oaW50Ij5QYXNzd29yZDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXRfcGFzc3dvcmQiPlJlc2V0IFBhc3N3b3JkPC9zdHJpbmc+CkBAIC00ODMsNiArNjU3LDExIEBACiAgICAgPHN0cmluZyBuYW1lPSJ0aW1lb3V0X2hpbnQiPk1heCBzY3JlZW4gdGltZW91dDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0X3RpbWVvdXRfbGFiZWwiPlNldCBUaW1lb3V0PC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImVuY3J5cHRpb25fZW5hYmxlX2xhYmVsIj5FbmFibGUgRW5jcnlwdGlvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5jcnlwdGlvbl9kaXNhYmxlX2xhYmVsIj5EaXNhYmxlIEVuY3J5cHRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuY3J5cHRpb25fYWN0aXZhdGVfbGFiZWwiPkFjdGl2YXRlIEVuY3J5cHRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVwZGF0ZV9lbmNyeXB0aW9uX3N0YXR1c19sYWJlbCI+VXBkYXRlIFN0YXR1czwvc3RyaW5nPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSAgYXBwL3ZvaWNlIHJlY29nbml0aW9uIGV4YW1wbGVzIHN0cmluZ3MgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtNDkxLDYgKzY3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3BlYWtfYnV0dG9uIj5TcGVhayE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZvaWNlX3JlY29nbml0aW9uX3Jlc3VsdHMiPlJlc3VsdHM6PC9zdHJpbmc+CiAKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tICBhcHAvYWN0aW9uIGJhciBleGFtcGxlcyBzdHJpbmdzICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxzdHJpbmcgbmFtZT0iYWN0aW9uX2Jhcl9tZWNoYW5pY3MiPkFwcC9BY3Rpb24gQmFyL0FjdGlvbiBCYXIgTWVjaGFuaWNzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3VzYWdlIj5BcHAvQWN0aW9uIEJhci9BY3Rpb24gQmFyIFVzYWdlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3RhYnMiPkFwcC9BY3Rpb24gQmFyL0FjdGlvbiBCYXIgVGFiczwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3NlYXJjaCI+U2VhcmNoPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX2FkZCI+QWRkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX2VkaXQiPkVkaXQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc2hhcmUiPlNoYXJlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3NvcnQiPlNvcnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc29ydF9hbHBoYSI+QWxwaGFiZXRpY2FsbHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc29ydF9zaXplIj5CeSBzaXplPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zIj5BcHAvQWN0aW9uIEJhci9EaXNwbGF5IE9wdGlvbnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9ob21lX2FzX3VwIj5ESVNQTEFZX0hPTUVfQVNfVVA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X2hvbWUiPkRJU1BMQVlfU0hPV19IT01FPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0b2dnbGVfdXNlX2xvZ28iPkRJU1BMQVlfVVNFX0xPR088L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X3RpdGxlIj5ESVNQTEFZX1NIT1dfVElUTEU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZ2dsZV9zaG93X2N1c3RvbSI+RElTUExBWV9TSE9XX0NVU1RPTTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9nZ2xlX25hdmlnYXRpb24iPk5hdmlnYXRpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImN5Y2xlX2N1c3RvbV9ncmF2aXR5Ij5DeWNsZSBDdXN0b20gVmlldyBHcmF2aXR5PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImRpc3BsYXlfb3B0aW9uc19jdXN0b21fYnV0dG9uIj5DdXN0b20gVmlldyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc3BsYXlfb3B0aW9uc19tZW51X2l0ZW0iPk1lbnUgSXRlbTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJidG5fYWRkX3RhYiI+QWRkIG5ldyB0YWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0bl9yZW1vdmVfdGFiIj5SZW1vdmUgbGFzdCB0YWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ0bl90b2dnbGVfdGFicyI+VG9nZ2xlIHRhYiBtb2RlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidG5fcmVtb3ZlX2FsbF90YWJzIj5SZW1vdmUgYWxsIHRhYnM8L3N0cmluZz4KKwogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBncmFwaGljcyBleGFtcGxlcyBzdHJpbmdzICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC01MzgsNiArNzUwLDEyIEBACiAKICAgICA8c3RyaW5nIG5hbWU9InJhdGluZ2Jhcl9yYXRpbmciPlJhdGluZzo8L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9zZWFyY2giPlNlYXJjaDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9hZGQiPkFkZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9lZGl0Ij5FZGl0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X3NoYXJlIj5TaGFyZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9wdXBfbWVudV9idXR0b24iPk1ha2UgYSBQb3B1cCE8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0ic2VjdXJlX3ZpZXdfZGVzY3JpcHRpb24iPgogICAgICAgICBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBhIHZpZXcgdGhhdCBkZXRlY3RzIHdoZW4gaXQgaXMgcG90ZW50aWFsbHkgb2JzY3VyZWQKICAgICAgICAgYnkgb3RoZXIgd2luZG93cy4KQEAgLTU4MSw2ICs3OTksMzggQEAKICAgICA8c3RyaW5nIG5hbWU9InNlY3VyZV92aWV3X292ZXJsYXlfYnV0dG9uMiI+Q2xpY2t5Pzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VjdXJlX3ZpZXdfb3ZlcmxheV9idXR0b24zIj5UaGluayBvZiB0aGUgcGVuZ3VpbnMhPC9zdHJpbmc+CiAKKyAgICA8c3RyaW5nIG5hbWU9InNwbGl0X3RvdWNoX3ZpZXdfZGVzY3JpcHRpb24iPgorICAgICAgICBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBzcGxpdHRpbmcgdG91Y2ggZXZlbnRzIGFjcm9zcyBtdWx0aXBsZSB2aWV3cworICAgICAgICB3aXRoaW4gYSB2aWV3IGdyb3VwLiAgSGVyZSB3ZSBoYXZlIHR3byBMaXN0Vmlld3Mgd2l0aGluIGEgTGluZWFyTGF5b3V0CisgICAgICAgIHRoYXQgaGFzIHRoZSBhdHRyaWJ1dGUgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cyBzZXQgdG8gInRydWUiLgorICAgICAgICBUcnkgc2Nyb2xsaW5nIGJvdGggbGlzdHMgc2ltdWx0YW5lb3VzbHkgdXNpbmcgbXVsdGlwbGUgZmluZ2Vycy4KKyAgICA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNwbGl0X3RvdWNoX3ZpZXdfY2hlZXNlX3RvYXN0Ij5EbyB5b3UgaGF2ZSBhbnkgJTEkcz9cbiUyJHM8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic2VhcmNodmlld19oaW50Ij5GaW5kIHNvbWV0aGluZzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlZXNlX2h1bnRfaGludCI+Q2hlZXNlIGh1bnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im9wZW5fc2VhcmNoIj5FeHBhbmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNsb3NlX3NlYXJjaCI+SWNvbmlmeTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkcmFnX2V4cGxhbmF0aW9uIj4KKyAgICAgICAgTG9uZ3ByZXNzIG9uIGEgZG90IHRvIHN0YXJ0IGEgZHJhZywgdGhlbiBkcm9wIG92ZXIgYW5vdGhlciBkb3QuIFRoZSBkZXN0aW5hdGlvbgorICAgICAgICBkb3Qgd2lsbCBhcHBlbmQgdGhlIGRyYWdcJ3MgdGV4dHVhbCBjb252ZXJzaW9uIHRvIHRoZSBFZGl0VGV4dC4KKyAgICA8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZ2FtZV9jb250cm9sbGVyX2lucHV0X2Rlc2NyaXB0aW9uIj4KKyAgICAgICAgVGhpcyBhY3Rpdml0eSBkZW1vbnN0cmF0ZXMgaG93IHRvIHByb2Nlc3MgaW5wdXQgZXZlbnRzIHJlY2VpdmVkIGZyb20KKyAgICAgICAgZ2FtZSBjb250cm9sbGVycy4gIFBsZWFzZSBjb25uZWN0IHlvdXIgZ2FtZSBjb250cm9sbGVyIG5vdyBhbmQgdHJ5CisgICAgICAgIG1vdmluZyB0aGUgam95c3RpY2tzIG9yIHByZXNzaW5nIGJ1dHRvbnMuICBJZiBpdCBoZWxwcywgdHJ5IHRvIGltYWdpbmUKKyAgICAgICAgdGhhdCB5b3UgYXJlIGEgbG9uZSBzcGFjZSBjb3dib3kgaW4gaG90IHB1cnN1aXQgb2YgdGhlIGFsaWVucyB3aG8ga2lkbmFwcGVkCisgICAgICAgIHlvdXIgZmF2b3JpdGUgbGxhbWEgb24gdGhlaXIgd2F5IGJhY2sgdG8gQW5kcm9tZWRhLi4uCisgICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJnYW1lX2NvbnRyb2xsZXJfaW5wdXRfaGVhZGluZ19kZXZpY2UiPklucHV0IERldmljZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtZV9jb250cm9sbGVyX2lucHV0X2hlYWRpbmdfYXhlcyI+QXhlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtZV9jb250cm9sbGVyX2lucHV0X2hlYWRpbmdfa2V5cyI+S2V5cyBhbmQgQnV0dG9uczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtZV9jb250cm9sbGVyX2lucHV0X2xhYmVsX2RldmljZV9uYW1lIj5OYW1lPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJnYW1lX2NvbnRyb2xsZXJfaW5wdXRfa2V5X3ByZXNzZWQiPlByZXNzZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImdhbWVfY29udHJvbGxlcl9pbnB1dF9rZXlfcmVsZWFzZWQiPlJlbGVhc2VkPC9zdHJpbmc+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICBHb29nbGVMb2dpbiBleGFtcGxlcyBzdHJpbmdzICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTY1OSw2ICs5MDksMTEgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvY3VzXzNfcmlnaHQiPnJpZ2h0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmb2N1c18zX3RvcCI+dG9wPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmb2N1c18zX2JvdHRvbSI+Ym90dG9tPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmb2N1c181X2J1dHRvbjEiPjE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZvY3VzXzVfYnV0dG9uMiI+Mjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZm9jdXNfNV9idXR0b24zIj4zPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmb2N1c181X2J1dHRvbjQiPjQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZvY3VzXzVfYnV0dG9uNSI+NTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ2FsbGVyeV8yX3RleHQiPlRlc3Rpbmc8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imdvb2dsZWxvZ2luX2xvZ2luIj5Mb2dpbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ29vZ2xlbG9naW5fYmFkX2xvZ2luIj5CYWQgTG9naW48L3N0cmluZz4KQEAgLTk1Nyw0ICsxMjEyLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InNtc19zcGVha19zdHJpbmdfZm9ybWF0Ij5NZXNzYWdlIGZyb20gIiUxJHMiOiAlMiRzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBseSI+UmVwbHk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc21pc3MiPkRpc21pc3M8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic2hhcmUiPlNoYXJlPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggOGNjODMxMi4uZDM4YWIzNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTE1LDYgKzE1LDIxIEBACiAtLT4KIAogPHJlc291cmNlcz4KKyAgICA8IS0tIEEgY3VzdG9tIHRoZW1lIHRoYXQgaXMgYSB2YXJpYXRpb24gb24gdGhlIGxpZ2h0IHRoZW0gd2l0aCBhIGRpZmZlcmVudAorICAgICAgICAgYmFja2dyb3VuZCBjb2xvci4gLS0+CisgICAgPGNvbG9yIG5hbWU9ImN1c3RvbV90aGVtZV9jb2xvciI+I2IwYjBmZjwvY29sb3I+CisgICAgPHN0eWxlIG5hbWU9IkN1c3RvbVRoZW1lIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTGlnaHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0JhY2tncm91bmQiPkBjb2xvci9jdXN0b21fdGhlbWVfY29sb3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29sb3JCYWNrZ3JvdW5kIj5AY29sb3IvY3VzdG9tX3RoZW1lX2NvbG9yPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFRoaXMgaXMgYSB0aGVtZSB0aGF0IHdpbGwgYWRqdXN0IGl0c2VsZiBkZXBlbmRpbmcgb24gdGhlIEFQSSB2ZXJzaW9uLgorICAgICAgICAgVGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBpcyB0aGUgc2FmZSBvbmUsIHVzaW5nIGEgdGhlbWUgdGhhdCBoYXMgYWx3YXlzCisgICAgICAgICBiZWVuIGRlZmluZWQuICBMb29rIGF0IHZhbHVlcy0xMS9zdHlsZXMueG1sIGZvciBhIHZhcmlhdGlvbiB0aGF0IGlzCisgICAgICAgICBzZWxlY3RlZCB3aGVuIHRoZSBob2xvZ3JhcGhpYyB0aGVtZSBpcyBhdmFpbGFibGUuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZUhvbG8iIHBhcmVudD0iYW5kcm9pZDpUaGVtZSI+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gQmFzZSBhcHBsaWNhdGlvbiB0aGVtZSBpcyB0aGUgZGVmYXVsdCB0aGVtZS4gLS0+CiAgICAgPHN0eWxlIG5hbWU9IlRoZW1lIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUiPgogICAgIDwvc3R5bGU+CkBAIC02Niw2ICs4MSwxNCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbG9yRm9yZWdyb3VuZCI+I2ZmZjwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAorICAgIDwhLS0gT2xkZXIgcGxhdGZvcm1zIGRvbid0IGhhdmUgVGhlbWUuSG9sby5EaWFsb2dXaGVuTGFyZ2U7IHdlIHdpbGwgZGVmaW5lCisgICAgICAgICBvdXIgb3duIHdyYXBwZXIgdGhlbWUgdGhhdCB1c2VzIGl0IG9ubHkgd2hlbiBydW5uaW5nIG9uIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgcGxhdGZvcm0gdmVyc2lvbi4gIE9uIG9sZGVyIHBsYXRmb3Jtcywgd2UgYWx3YXlzIHVzZSB0aGUgZ2VuZXJpYworICAgICAgICAgZnVsbHNjcmVlbiB0aGVtZSwgYmVjYXVzZSB0aGV5IGRvbid0IHN1cHBvcnQgc29tZSBmZWF0dXJlIHRoYXQgaGVscAorICAgICAgICAgaW4gY29ycmVjdGx5IGxheWluZyBvdXQgYW4gYWN0aXZpdHkgYXMgYSBkaWFsb2cuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZURpYWxvZ1doZW5MYXJnZSIgcGFyZW50PSJhbmRyb2lkOnN0eWxlL1RoZW1lIj4KKyAgICA8L3N0eWxlPgorCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlRoZW1lLlBsYWluVGV4dCIgcGFyZW50PSJhbmRyb2lkOlRleHRBcHBlYXJhbmNlLlRoZW1lIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICA8L3N0eWxlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9hZHZhbmNlZF9wcmVmZXJlbmNlcy54bWwKaW5kZXggYzM2MjI5Ny4uZGQ2ZGUzMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvYWR2YW5jZWRfcHJlZmVyZW5jZXMueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSBwcmVmZXJlbmNlLCBpZiB0aGUgd2hvbGUgcHJlZmVyZW5jZSB3YW50ZWQgdG8gYmUKICAgICAgICAgIHJlcGxhY2VkIHdlIHdvdWxkIHVzZSB0aGUgbGF5b3V0IGF0dHJpYnV0ZSBpbnN0ZWFkIG9mIHRoZSB3aWRnZXRMYXlvdXQKICAgICAgICAgIGF0dHJpYnV0ZS4gLS0+Ci0gICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTXlQcmVmZXJlbmNlCisgICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlLk15UHJlZmVyZW5jZQogICAgICAgICAgICAgYW5kcm9pZDprZXk9Im15X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX215X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9teV9wcmVmZXJlbmNlIgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sCmluZGV4IDcxNTgwMDMuLjEwZWRiN2UgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKQEAgLTQsOSArNCw5IEBACiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKKwogICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKKwogICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpAQCAtMjIsNiArMjIsOCBAQAogICAgICAgICA8cmVzZXQtcGFzc3dvcmQgLz4KICAgICAgICAgPGZvcmNlLWxvY2sgLz4KICAgICAgICAgPHdpcGUtZGF0YSAvPgorICAgICAgICA8ZXhwaXJlLXBhc3N3b3JkIC8+CisgICAgICAgIDxlbmNyeXB0ZWQtc3RvcmFnZSAvPgogICAgIDwvdXNlcy1wb2xpY2llcz4KIDwvZGV2aWNlLWFkbWluPgogPCEtLSBFTkRfSU5DTFVERShtZXRhX2RhdGEpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzNhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlcy54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGlzIGEgcHJpbWl0aXZlIGV4YW1wbGUgc2hvd2luZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByZWZlcmVuY2VzIGF2YWlsYWJsZS4gLS0+Cis8IS0tIEJFR0lOX0lOQ0xVREUocHJlZmVyZW5jZXMpIC0tPgorPFByZWZlcmVuY2VTY3JlZW4KKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvaW5saW5lX3ByZWZlcmVuY2VzIj4KKworICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9ImNoZWNrYm94X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV90b2dnbGVfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV90b2dnbGVfcHJlZmVyZW5jZSIgLz4KKworICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgorCisgICAgPFByZWZlcmVuY2VDYXRlZ29yeQorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9kaWFsb2dfYmFzZWRfcHJlZmVyZW5jZXMiPgorCisgICAgICAgIDxFZGl0VGV4dFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0iZWRpdHRleHRfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX2VkaXR0ZXh0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfZWRpdHRleHRfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRpYWxvZ1RpdGxlPSJAc3RyaW5nL2RpYWxvZ190aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlIiAvPgorCisgICAgICAgIDxMaXN0UHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJsaXN0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9saXN0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW50cmllcz0iQGFycmF5L2VudHJpZXNfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW50cnlWYWx1ZXM9IkBhcnJheS9lbnRyeXZhbHVlc19saXN0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkaWFsb2dUaXRsZT0iQHN0cmluZy9kaWFsb2dfdGl0bGVfbGlzdF9wcmVmZXJlbmNlIiAvPgorCisgICAgPC9QcmVmZXJlbmNlQ2F0ZWdvcnk+CisKKyAgICA8UHJlZmVyZW5jZUNhdGVnb3J5CisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2xhdW5jaF9wcmVmZXJlbmNlcyI+CisKKyAgICAgICAgPCEtLSBUaGlzIFByZWZlcmVuY2VTY3JlZW4gdGFnIHNlbmRzIHRoZSB1c2VyIHRvIGEgbmV3IGZyYWdtZW50IG9mCisgICAgICAgICAgICAgcHJlZmVyZW5jZXMuICBJZiBydW5uaW5nIGluIGEgbGFyZ2Ugc2NyZWVuLCB0aGV5IGNhbiBiZSBlbWJlZGRlZAorICAgICAgICAgICAgIGluc2lkZSBvZiB0aGUgb3ZlcmFsbCBwcmVmZXJlbmNlcyBVSS4gLS0+CisgICAgICAgIDxQcmVmZXJlbmNlU2NyZWVuCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmcmFnbWVudD0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzJFByZWZzMUZyYWdtZW50SW5uZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9mcmFnbWVudF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2ZyYWdtZW50X3ByZWZlcmVuY2UiPgorICAgICAgICAgICAgPCEtLSBBcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXJzIGNhbiBiZSBpbmNsdWRlZCBmb3IgZnJhZ21lbnQgYXJndW1lbnRzIC0tPgorICAgICAgICAgICAgPGV4dHJhIGFuZHJvaWQ6bmFtZT0ic29tZUtleSIgYW5kcm9pZDp2YWx1ZT0ic29tZVByZWZWYWx1ZSIgLz4KKyAgICAgICAgPC9QcmVmZXJlbmNlU2NyZWVuPgorCisgICAgICAgIDwhLS0gVGhpcyBQcmVmZXJlbmNlU2NyZWVuIHRhZyBzZW5kcyB0aGUgdXNlciB0byBhIGNvbXBsZXRlbHkgZGlmZmVyZW50CisgICAgICAgICAgICAgYWN0aXZpdHksIHN3aXRjaGluZyBvdXQgb2YgdGhlIGN1cnJlbnQgcHJlZmVyZW5jZXMgVUkuIC0tPgorICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfaW50ZW50X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfaW50ZW50X3ByZWZlcmVuY2UiPgorCisgICAgICAgICAgICA8aW50ZW50IGFuZHJvaWQ6YWN0aW9uPSJhbmRyb2lkLmludGVudC5hY3Rpb24uVklFVyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkYXRhPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tIiAvPgorCisgICAgICAgIDwvUHJlZmVyZW5jZVNjcmVlbj4KKworICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgorCisgICAgPFByZWZlcmVuY2VDYXRlZ29yeQorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9wcmVmZXJlbmNlX2F0dHJpYnV0ZXMiPgorCisgICAgICAgIDxDaGVja0JveFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0icGFyZW50X2NoZWNrYm94X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9wYXJlbnRfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9wYXJlbnRfcHJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIFRoZSB2aXN1YWwgc3R5bGUgb2YgYSBjaGlsZCBpcyBkZWZpbmVkIGJ5IHRoaXMgc3R5bGVkIHRoZW1lIGF0dHJpYnV0ZS4gLS0+CisgICAgICAgIDxDaGVja0JveFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0iY2hpbGRfY2hlY2tib3hfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRlcGVuZGVuY3k9InBhcmVudF9jaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSI/YW5kcm9pZDphdHRyL3ByZWZlcmVuY2VMYXlvdXRDaGlsZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX2NoaWxkX3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfY2hpbGRfcHJlZmVyZW5jZSIgLz4KKworICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgorCis8L1ByZWZlcmVuY2VTY3JlZW4+Cis8IS0tIEVORF9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzX2lubmVyLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzX2lubmVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYyYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXNfaW5uZXIueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KKzxQcmVmZXJlbmNlU2NyZWVuCisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPENoZWNrQm94UHJlZmVyZW5jZQorICAgICAgICAgICAgYW5kcm9pZDprZXk9Im5leHRfc2NyZWVuX2NoZWNrYm94X3ByZWZlcmVuY2UiCisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIgorICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiIC8+Cis8L1ByZWZlcmVuY2VTY3JlZW4+Cis8IS0tIEVORF9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VfaGVhZGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjYzUzMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKGhlYWRlcnMpIC0tPgorPHByZWZlcmVuY2UtaGVhZGVycworICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGhlYWRlciBhbmRyb2lkOmZyYWdtZW50PSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZS5QcmVmZXJlbmNlV2l0aEhlYWRlcnMkUHJlZnMxRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19zZXR0aW5nc19hcHBsaWNhdGlvbnMiCisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJQcmVmcyAxIgorICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJBbiBleGFtcGxlIG9mIHNvbWUgcHJlZmVyZW5jZXMuIiAvPgorICAgICAgICAgICAgCisgICAgPGhlYWRlciBhbmRyb2lkOmZyYWdtZW50PSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZS5QcmVmZXJlbmNlV2l0aEhlYWRlcnMkUHJlZnMyRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19zZXR0aW5nc19kaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iUHJlZnMgMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iU29tZSBvdGhlciBwcmVmZXJlbmNlcyB5b3UgY2FuIHNlZS4iPgorICAgICAgICA8IS0tIEFyYml0cmFyeSBrZXkvdmFsdWUgcGFpcnMgY2FuIGJlIGluY2x1ZGVkIHdpdGggYSBoZWFkZXIgYXMKKyAgICAgICAgICAgICBhcmd1bWVudHMgdG8gaXRzIGZyYWdtZW50LiAtLT4KKyAgICAgICAgPGV4dHJhIGFuZHJvaWQ6bmFtZT0ic29tZUtleSIgYW5kcm9pZDp2YWx1ZT0ic29tZUhlYWRlclZhbHVlIiAvPgorICAgIDwvaGVhZGVyPgorCisgICAgPGhlYWRlciBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19zZXR0aW5nc19kaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iSW50ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJMYXVuY2hlcyBhbiBJbnRlbnQuIj4KKyAgICAgICAgPGludGVudCBhbmRyb2lkOmFjdGlvbj0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkYXRhPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tIiAvPgorICAgIDwvaGVhZGVyPgorICAgIAorPC9wcmVmZXJlbmNlLWhlYWRlcnM+Cis8IS0tIEVORF9JTkNMVURFKGhlYWRlcnMpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwKaW5kZXggNTliMjNmMS4uNGQ5ODJhYyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZXMueG1sCkBAIC0xNSw2ICsxNSw3IEBACiAtLT4KIAogPCEtLSBUaGlzIGlzIGEgcHJpbWl0aXZlIGV4YW1wbGUgc2hvd2luZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHByZWZlcmVuY2VzIGF2YWlsYWJsZS4gLS0+Cis8IS0tIEJFR0lOX0lOQ0xVREUocHJlZmVyZW5jZXMpIC0tPgogPFByZWZlcmVuY2VTY3JlZW4KICAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KIApAQCAtOTcsMyArOTgsNCBAQAogICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgogICAgIAogPC9QcmVmZXJlbmNlU2NyZWVuPgorPCEtLSBFTkRfSU5DTFVERShwcmVmZXJlbmNlcykgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvQXBpRGVtb3MuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9BcGlEZW1vcy5qYXZhCmluZGV4IDM5ZjI0YjYuLmZmY2UwMjcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9BcGlEZW1vcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9BcGlEZW1vcy5qYXZhCkBAIC02NSwxMSArNjUsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBteURhdGE7CiAKICAgICAgICAgU3RyaW5nW10gcHJlZml4UGF0aDsKKyAgICAgICAgU3RyaW5nIHByZWZpeFdpdGhTbGFzaCA9IHByZWZpeDsKICAgICAgICAgCiAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCIiKSkgewogICAgICAgICAgICAgcHJlZml4UGF0aCA9IG51bGw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcmVmaXhQYXRoID0gcHJlZml4LnNwbGl0KCIvIik7CisgICAgICAgICAgICBwcmVmaXhXaXRoU2xhc2ggPSBwcmVmaXggKyAiLyI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGludCBsZW4gPSBsaXN0LnNpemUoKTsKQEAgLTgzLDcgKzg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgPyBsYWJlbFNlcS50b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgIDogaW5mby5hY3Rpdml0eUluZm8ubmFtZTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwIHx8IGxhYmVsLnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgaWYgKHByZWZpeFdpdGhTbGFzaC5sZW5ndGgoKSA9PSAwIHx8IGxhYmVsLnN0YXJ0c1dpdGgocHJlZml4V2l0aFNsYXNoKSkgewogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxhYmVsUGF0aCA9IGxhYmVsLnNwbGl0KCIvIik7CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9TaGFrZXNwZWFyZS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL1NoYWtlc3BlYXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxZGY0YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9TaGFrZXNwZWFyZS5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpczsKKworcHVibGljIGZpbmFsIGNsYXNzIFNoYWtlc3BlYXJlIHsKKyAgICAvKioKKyAgICAgKiBPdXIgZGF0YSwgcGFydCAxLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVElUTEVTID0gCisgICAgeworICAgICAgICAgICAgIkhlbnJ5IElWICgxKSIsICAgCisgICAgICAgICAgICAiSGVucnkgViIsCisgICAgICAgICAgICAiSGVucnkgVklJSSIsICAgICAgIAorICAgICAgICAgICAgIlJpY2hhcmQgSUkiLAorICAgICAgICAgICAgIlJpY2hhcmQgSUlJIiwKKyAgICAgICAgICAgICJNZXJjaGFudCBvZiBWZW5pY2UiLCAgCisgICAgICAgICAgICAiT3RoZWxsbyIsCisgICAgICAgICAgICAiS2luZyBMZWFyIgorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogT3VyIGRhdGEsIHBhcnQgMi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERJQUxPR1VFID0gCisgICAgeworICAgICAgICAgICAgIlNvIHNoYWtlbiBhcyB3ZSBhcmUsIHNvIHdhbiB3aXRoIGNhcmUsIiArCisgICAgICAgICAgICAiRmluZCB3ZSBhIHRpbWUgZm9yIGZyaWdodGVkIHBlYWNlIHRvIHBhbnQsIiArCisgICAgICAgICAgICAiQW5kIGJyZWF0aGUgc2hvcnQtd2luZGVkIGFjY2VudHMgb2YgbmV3IGJyb2lscyIgKworICAgICAgICAgICAgIlRvIGJlIGNvbW1lbmNlZCBpbiBzdHJhbmRzIGFmYXIgcmVtb3RlLiIgKworICAgICAgICAgICAgIk5vIG1vcmUgdGhlIHRoaXJzdHkgZW50cmFuY2Ugb2YgdGhpcyBzb2lsIiArCisgICAgICAgICAgICAiU2hhbGwgZGF1YiBoZXIgbGlwcyB3aXRoIGhlciBvd24gY2hpbGRyZW4ncyBibG9vZDsiICsKKyAgICAgICAgICAgICJOb3IgbW9yZSBzaGFsbCB0cmVuY2hpbmcgd2FyIGNoYW5uZWwgaGVyIGZpZWxkcywiICsKKyAgICAgICAgICAgICJOb3IgYnJ1aXNlIGhlciBmbG93ZXJldHMgd2l0aCB0aGUgYXJtZWQgaG9vZnMiICsKKyAgICAgICAgICAgICJPZiBob3N0aWxlIHBhY2VzOiB0aG9zZSBvcHBvc2VkIGV5ZXMsIiArCisgICAgICAgICAgICAiV2hpY2gsIGxpa2UgdGhlIG1ldGVvcnMgb2YgYSB0cm91YmxlZCBoZWF2ZW4sIiArCisgICAgICAgICAgICAiQWxsIG9mIG9uZSBuYXR1cmUsIG9mIG9uZSBzdWJzdGFuY2UgYnJlZCwiICsKKyAgICAgICAgICAgICJEaWQgbGF0ZWx5IG1lZXQgaW4gdGhlIGludGVzdGluZSBzaG9jayIgKworICAgICAgICAgICAgIkFuZCBmdXJpb3VzIGNsb3NlIG9mIGNpdmlsIGJ1dGNoZXJ5IiArCisgICAgICAgICAgICAiU2hhbGwgbm93LCBpbiBtdXR1YWwgd2VsbC1iZXNlZW1pbmcgcmFua3MsIiArCisgICAgICAgICAgICAiTWFyY2ggYWxsIG9uZSB3YXkgYW5kIGJlIG5vIG1vcmUgb3Bwb3NlZCIgKworICAgICAgICAgICAgIkFnYWluc3QgYWNxdWFpbnRhbmNlLCBraW5kcmVkIGFuZCBhbGxpZXM6IiArCisgICAgICAgICAgICAiVGhlIGVkZ2Ugb2Ygd2FyLCBsaWtlIGFuIGlsbC1zaGVhdGhlZCBrbmlmZSwiICsKKyAgICAgICAgICAgICJObyBtb3JlIHNoYWxsIGN1dCBoaXMgbWFzdGVyLiBUaGVyZWZvcmUsIGZyaWVuZHMsIiArCisgICAgICAgICAgICAiQXMgZmFyIGFzIHRvIHRoZSBzZXB1bGNocmUgb2YgQ2hyaXN0LCIgKworICAgICAgICAgICAgIldob3NlIHNvbGRpZXIgbm93LCB1bmRlciB3aG9zZSBibGVzc2VkIGNyb3NzIiArCisgICAgICAgICAgICAiV2UgYXJlIGltcHJlc3NlZCBhbmQgZW5nYWdlZCB0byBmaWdodCwiICsKKyAgICAgICAgICAgICJGb3J0aHdpdGggYSBwb3dlciBvZiBFbmdsaXNoIHNoYWxsIHdlIGxldnk7IiArCisgICAgICAgICAgICAiV2hvc2UgYXJtcyB3ZXJlIG1vdWxkZWQgaW4gdGhlaXIgbW90aGVycycgd29tYiIgKworICAgICAgICAgICAgIlRvIGNoYXNlIHRoZXNlIHBhZ2FucyBpbiB0aG9zZSBob2x5IGZpZWxkcyIgKworICAgICAgICAgICAgIk92ZXIgd2hvc2UgYWNyZXMgd2FsaydkIHRob3NlIGJsZXNzZWQgZmVldCIgKworICAgICAgICAgICAgIldoaWNoIGZvdXJ0ZWVuIGh1bmRyZWQgeWVhcnMgYWdvIHdlcmUgbmFpbCdkIiArCisgICAgICAgICAgICAiRm9yIG91ciBhZHZhbnRhZ2Ugb24gdGhlIGJpdHRlciBjcm9zcy4iICsKKyAgICAgICAgICAgICJCdXQgdGhpcyBvdXIgcHVycG9zZSBub3cgaXMgdHdlbHZlIG1vbnRoIG9sZCwiICsKKyAgICAgICAgICAgICJBbmQgYm9vdGxlc3MgJ3RpcyB0byB0ZWxsIHlvdSB3ZSB3aWxsIGdvOiIgKworICAgICAgICAgICAgIlRoZXJlZm9yZSB3ZSBtZWV0IG5vdCBub3cuIFRoZW4gbGV0IG1lIGhlYXIiICsKKyAgICAgICAgICAgICJPZiB5b3UsIG15IGdlbnRsZSBjb3VzaW4gV2VzdG1vcmVsYW5kLCIgKworICAgICAgICAgICAgIldoYXQgeWVzdGVybmlnaHQgb3VyIGNvdW5jaWwgZGlkIGRlY3JlZSIgKworICAgICAgICAgICAgIkluIGZvcndhcmRpbmcgdGhpcyBkZWFyIGV4cGVkaWVuY2UuIiwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIkhlYXIgaGltIGJ1dCByZWFzb24gaW4gZGl2aW5pdHksIiArIAorICAgICAgICAgICAgIkFuZCBhbGwtYWRtaXJpbmcgd2l0aCBhbiBpbndhcmQgd2lzaCIgKyAKKyAgICAgICAgICAgICJZb3Ugd291bGQgZGVzaXJlIHRoZSBraW5nIHdlcmUgbWFkZSBhIHByZWxhdGU6IiArIAorICAgICAgICAgICAgIkhlYXIgaGltIGRlYmF0ZSBvZiBjb21tb253ZWFsdGggYWZmYWlycywiICsgCisgICAgICAgICAgICAiWW91IHdvdWxkIHNheSBpdCBoYXRoIGJlZW4gYWxsIGluIGFsbCBoaXMgc3R1ZHk6IiArIAorICAgICAgICAgICAgIkxpc3QgaGlzIGRpc2NvdXJzZSBvZiB3YXIsIGFuZCB5b3Ugc2hhbGwgaGVhciIgKyAKKyAgICAgICAgICAgICJBIGZlYXJmdWwgYmF0dGxlIHJlbmRlcidkIHlvdSBpbiBtdXNpYzoiICsgCisgICAgICAgICAgICAiVHVybiBoaW0gdG8gYW55IGNhdXNlIG9mIHBvbGljeSwiICsgCisgICAgICAgICAgICAiVGhlIEdvcmRpYW4ga25vdCBvZiBpdCBoZSB3aWxsIHVubG9vc2UsIiArIAorICAgICAgICAgICAgIkZhbWlsaWFyIGFzIGhpcyBnYXJ0ZXI6IHRoYXQsIHdoZW4gaGUgc3BlYWtzLCIgKyAKKyAgICAgICAgICAgICJUaGUgYWlyLCBhIGNoYXJ0ZXInZCBsaWJlcnRpbmUsIGlzIHN0aWxsLCIgKyAKKyAgICAgICAgICAgICJBbmQgdGhlIG11dGUgd29uZGVyIGx1cmtldGggaW4gbWVuJ3MgZWFycywiICsgCisgICAgICAgICAgICAiVG8gc3RlYWwgaGlzIHN3ZWV0IGFuZCBob25leSdkIHNlbnRlbmNlczsiICsgCisgICAgICAgICAgICAiU28gdGhhdCB0aGUgYXJ0IGFuZCBwcmFjdGljIHBhcnQgb2YgbGlmZSIgKyAKKyAgICAgICAgICAgICJNdXN0IGJlIHRoZSBtaXN0cmVzcyB0byB0aGlzIHRoZW9yaWM6IiArIAorICAgICAgICAgICAgIldoaWNoIGlzIGEgd29uZGVyIGhvdyBoaXMgZ3JhY2Ugc2hvdWxkIGdsZWFuIGl0LCIgKyAKKyAgICAgICAgICAgICJTaW5jZSBoaXMgYWRkaWN0aW9uIHdhcyB0byBjb3Vyc2VzIHZhaW4sIiArIAorICAgICAgICAgICAgIkhpcyBjb21wYW5pZXMgdW5sZXR0ZXInZCwgcnVkZSBhbmQgc2hhbGxvdywiICsgCisgICAgICAgICAgICAiSGlzIGhvdXJzIGZpbGwnZCB1cCB3aXRoIHJpb3RzLCBiYW5xdWV0cywgc3BvcnRzLCIgKyAKKyAgICAgICAgICAgICJBbmQgbmV2ZXIgbm90ZWQgaW4gaGltIGFueSBzdHVkeSwiICsgCisgICAgICAgICAgICAiQW55IHJldGlyZW1lbnQsIGFueSBzZXF1ZXN0cmF0aW9uIiArIAorICAgICAgICAgICAgIkZyb20gb3BlbiBoYXVudHMgYW5kIHBvcHVsYXJpdHkuIiwKKworICAgICAgICAgICAgIkkgY29tZSBubyBtb3JlIHRvIG1ha2UgeW91IGxhdWdoOiB0aGluZ3Mgbm93LCIgKworICAgICAgICAgICAgIlRoYXQgYmVhciBhIHdlaWdodHkgYW5kIGEgc2VyaW91cyBicm93LCIgKworICAgICAgICAgICAgIlNhZCwgaGlnaCwgYW5kIHdvcmtpbmcsIGZ1bGwgb2Ygc3RhdGUgYW5kIHdvZSwiICsKKyAgICAgICAgICAgICJTdWNoIG5vYmxlIHNjZW5lcyBhcyBkcmF3IHRoZSBleWUgdG8gZmxvdywiICsKKyAgICAgICAgICAgICJXZSBub3cgcHJlc2VudC4gVGhvc2UgdGhhdCBjYW4gcGl0eSwgaGVyZSIgKworICAgICAgICAgICAgIk1heSwgaWYgdGhleSB0aGluayBpdCB3ZWxsLCBsZXQgZmFsbCBhIHRlYXI7IiArCisgICAgICAgICAgICAiVGhlIHN1YmplY3Qgd2lsbCBkZXNlcnZlIGl0LiBTdWNoIGFzIGdpdmUiICsKKyAgICAgICAgICAgICJUaGVpciBtb25leSBvdXQgb2YgaG9wZSB0aGV5IG1heSBiZWxpZXZlLCIgKworICAgICAgICAgICAgIk1heSBoZXJlIGZpbmQgdHJ1dGggdG9vLiBUaG9zZSB0aGF0IGNvbWUgdG8gc2VlIiArCisgICAgICAgICAgICAiT25seSBhIHNob3cgb3IgdHdvLCBhbmQgc28gYWdyZWUiICsKKyAgICAgICAgICAgICJUaGUgcGxheSBtYXkgcGFzcywgaWYgdGhleSBiZSBzdGlsbCBhbmQgd2lsbGluZywiICsKKyAgICAgICAgICAgICJJJ2xsIHVuZGVydGFrZSBtYXkgc2VlIGF3YXkgdGhlaXIgc2hpbGxpbmciICsKKyAgICAgICAgICAgICJSaWNobHkgaW4gdHdvIHNob3J0IGhvdXJzLiBPbmx5IHRoZXkiICsKKyAgICAgICAgICAgICJUaGF0IGNvbWUgdG8gaGVhciBhIG1lcnJ5IGJhd2R5IHBsYXksIiArCisgICAgICAgICAgICAiQSBub2lzZSBvZiB0YXJnZXRzLCBvciB0byBzZWUgYSBmZWxsb3ciICsKKyAgICAgICAgICAgICJJbiBhIGxvbmcgbW90bGV5IGNvYXQgZ3VhcmRlZCB3aXRoIHllbGxvdywiICsKKyAgICAgICAgICAgICJXaWxsIGJlIGRlY2VpdmVkOyBmb3IsIGdlbnRsZSBoZWFyZXJzLCBrbm93LCIgKworICAgICAgICAgICAgIlRvIHJhbmsgb3VyIGNob3NlbiB0cnV0aCB3aXRoIHN1Y2ggYSBzaG93IiArCisgICAgICAgICAgICAiQXMgZm9vbCBhbmQgZmlnaHQgaXMsIGJlc2lkZSBmb3JmZWl0aW5nIiArCisgICAgICAgICAgICAiT3VyIG93biBicmFpbnMsIGFuZCB0aGUgb3BpbmlvbiB0aGF0IHdlIGJyaW5nLCIgKworICAgICAgICAgICAgIlRvIG1ha2UgdGhhdCBvbmx5IHRydWUgd2Ugbm93IGludGVuZCwiICsKKyAgICAgICAgICAgICJXaWxsIGxlYXZlIHVzIG5ldmVyIGFuIHVuZGVyc3RhbmRpbmcgZnJpZW5kLiIgKworICAgICAgICAgICAgIlRoZXJlZm9yZSwgZm9yIGdvb2RuZXNzJyBzYWtlLCBhbmQgYXMgeW91IGFyZSBrbm93biIgKworICAgICAgICAgICAgIlRoZSBmaXJzdCBhbmQgaGFwcGllc3QgaGVhcmVycyBvZiB0aGUgdG93biwiICsKKyAgICAgICAgICAgICJCZSBzYWQsIGFzIHdlIHdvdWxkIG1ha2UgeWU6IHRoaW5rIHllIHNlZSIgKworICAgICAgICAgICAgIlRoZSB2ZXJ5IHBlcnNvbnMgb2Ygb3VyIG5vYmxlIHN0b3J5IiArCisgICAgICAgICAgICAiQXMgdGhleSB3ZXJlIGxpdmluZzsgdGhpbmsgeW91IHNlZSB0aGVtIGdyZWF0LCIgKworICAgICAgICAgICAgIkFuZCBmb2xsb3cnZCB3aXRoIHRoZSBnZW5lcmFsIHRocm9uZyBhbmQgc3dlYXQiICsKKyAgICAgICAgICAgICJPZiB0aG91c2FuZCBmcmllbmRzOyB0aGVuIGluIGEgbW9tZW50LCBzZWUiICsKKyAgICAgICAgICAgICJIb3cgc29vbiB0aGlzIG1pZ2h0aW5lc3MgbWVldHMgbWlzZXJ5OiIgKworICAgICAgICAgICAgIkFuZCwgaWYgeW91IGNhbiBiZSBtZXJyeSB0aGVuLCBJJ2xsIHNheSIgKworICAgICAgICAgICAgIkEgbWFuIG1heSB3ZWVwIHVwb24gaGlzIHdlZGRpbmctZGF5LiIsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICJGaXJzdCwgaGVhdmVuIGJlIHRoZSByZWNvcmQgdG8gbXkgc3BlZWNoISIgKyAKKyAgICAgICAgICAgICJJbiB0aGUgZGV2b3Rpb24gb2YgYSBzdWJqZWN0J3MgbG92ZSwiICsgCisgICAgICAgICAgICAiVGVuZGVyaW5nIHRoZSBwcmVjaW91cyBzYWZldHkgb2YgbXkgcHJpbmNlLCIgKyAKKyAgICAgICAgICAgICJBbmQgZnJlZSBmcm9tIG90aGVyIG1pc2JlZ290dGVuIGhhdGUsIiArIAorICAgICAgICAgICAgIkNvbWUgSSBhcHBlbGxhbnQgdG8gdGhpcyBwcmluY2VseSBwcmVzZW5jZS4iICsgCisgICAgICAgICAgICAiTm93LCBUaG9tYXMgTW93YnJheSwgZG8gSSB0dXJuIHRvIHRoZWUsIiArIAorICAgICAgICAgICAgIkFuZCBtYXJrIG15IGdyZWV0aW5nIHdlbGw7IGZvciB3aGF0IEkgc3BlYWsiICsgCisgICAgICAgICAgICAiTXkgYm9keSBzaGFsbCBtYWtlIGdvb2QgdXBvbiB0aGlzIGVhcnRoLCIgKyAKKyAgICAgICAgICAgICJPciBteSBkaXZpbmUgc291bCBhbnN3ZXIgaXQgaW4gaGVhdmVuLiIgKyAKKyAgICAgICAgICAgICJUaG91IGFydCBhIHRyYWl0b3IgYW5kIGEgbWlzY3JlYW50LCIgKyAKKyAgICAgICAgICAgICJUb28gZ29vZCB0byBiZSBzbyBhbmQgdG9vIGJhZCB0byBsaXZlLCIgKyAKKyAgICAgICAgICAgICJTaW5jZSB0aGUgbW9yZSBmYWlyIGFuZCBjcnlzdGFsIGlzIHRoZSBza3ksIiArIAorICAgICAgICAgICAgIlRoZSB1Z2xpZXIgc2VlbSB0aGUgY2xvdWRzIHRoYXQgaW4gaXQgZmx5LiIgKyAKKyAgICAgICAgICAgICJPbmNlIG1vcmUsIHRoZSBtb3JlIHRvIGFnZ3JhdmF0ZSB0aGUgbm90ZSwiICsgCisgICAgICAgICAgICAiV2l0aCBhIGZvdWwgdHJhaXRvcidzIG5hbWUgc3R1ZmYgSSB0aHkgdGhyb2F0OyIgKyAKKyAgICAgICAgICAgICJBbmQgd2lzaCwgc28gcGxlYXNlIG15IHNvdmVyZWlnbiwgZXJlIEkgbW92ZSwiICsgCisgICAgICAgICAgICAiV2hhdCBteSB0b25ndWUgc3BlYWtzIG15IHJpZ2h0IGRyYXduIHN3b3JkIG1heSBwcm92ZS4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiTm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQiICsgCisgICAgICAgICAgICAiTWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgWW9yazsiICsgCisgICAgICAgICAgICAiQW5kIGFsbCB0aGUgY2xvdWRzIHRoYXQgbG91cidkIHVwb24gb3VyIGhvdXNlIiArIAorICAgICAgICAgICAgIkluIHRoZSBkZWVwIGJvc29tIG9mIHRoZSBvY2VhbiBidXJpZWQuIiArIAorICAgICAgICAgICAgIk5vdyBhcmUgb3VyIGJyb3dzIGJvdW5kIHdpdGggdmljdG9yaW91cyB3cmVhdGhzOyIgKyAKKyAgICAgICAgICAgICJPdXIgYnJ1aXNlZCBhcm1zIGh1bmcgdXAgZm9yIG1vbnVtZW50czsiICsgCisgICAgICAgICAgICAiT3VyIHN0ZXJuIGFsYXJ1bXMgY2hhbmdlZCB0byBtZXJyeSBtZWV0aW5ncywiICsgCisgICAgICAgICAgICAiT3VyIGRyZWFkZnVsIG1hcmNoZXMgdG8gZGVsaWdodGZ1bCBtZWFzdXJlcy4iICsgCisgICAgICAgICAgICAiR3JpbS12aXNhZ2VkIHdhciBoYXRoIHNtb290aCdkIGhpcyB3cmlua2xlZCBmcm9udDsiICsgCisgICAgICAgICAgICAiQW5kIG5vdywgaW5zdGVhZCBvZiBtb3VudGluZyBiYXJkZWQgc3RlZWRzIiArIAorICAgICAgICAgICAgIlRvIGZyaWdodCB0aGUgc291bHMgb2YgZmVhcmZ1bCBhZHZlcnNhcmllcywiICsgCisgICAgICAgICAgICAiSGUgY2FwZXJzIG5pbWJseSBpbiBhIGxhZHkncyBjaGFtYmVyIiArIAorICAgICAgICAgICAgIlRvIHRoZSBsYXNjaXZpb3VzIHBsZWFzaW5nIG9mIGEgbHV0ZS4iICsgCisgICAgICAgICAgICAiQnV0IEksIHRoYXQgYW0gbm90IHNoYXBlZCBmb3Igc3BvcnRpdmUgdHJpY2tzLCIgKyAKKyAgICAgICAgICAgICJOb3IgbWFkZSB0byBjb3VydCBhbiBhbW9yb3VzIGxvb2tpbmctZ2xhc3M7IiArIAorICAgICAgICAgICAgIkksIHRoYXQgYW0gcnVkZWx5IHN0YW1wJ2QsIGFuZCB3YW50IGxvdmUncyBtYWplc3R5IiArIAorICAgICAgICAgICAgIlRvIHN0cnV0IGJlZm9yZSBhIHdhbnRvbiBhbWJsaW5nIG55bXBoOyIgKyAKKyAgICAgICAgICAgICJJLCB0aGF0IGFtIGN1cnRhaWwnZCBvZiB0aGlzIGZhaXIgcHJvcG9ydGlvbiwiICsgCisgICAgICAgICAgICAiQ2hlYXRlZCBvZiBmZWF0dXJlIGJ5IGRpc3NlbWJsaW5nIG5hdHVyZSwiICsgCisgICAgICAgICAgICAiRGVmb3JtZWQsIHVuZmluaXNoJ2QsIHNlbnQgYmVmb3JlIG15IHRpbWUiICsgCisgICAgICAgICAgICAiSW50byB0aGlzIGJyZWF0aGluZyB3b3JsZCwgc2NhcmNlIGhhbGYgbWFkZSB1cCwiICsgCisgICAgICAgICAgICAiQW5kIHRoYXQgc28gbGFtZWx5IGFuZCB1bmZhc2hpb25hYmxlIiArIAorICAgICAgICAgICAgIlRoYXQgZG9ncyBiYXJrIGF0IG1lIGFzIEkgaGFsdCBieSB0aGVtOyIgKyAKKyAgICAgICAgICAgICJXaHksIEksIGluIHRoaXMgd2VhayBwaXBpbmcgdGltZSBvZiBwZWFjZSwiICsgCisgICAgICAgICAgICAiSGF2ZSBubyBkZWxpZ2h0IHRvIHBhc3MgYXdheSB0aGUgdGltZSwiICsgCisgICAgICAgICAgICAiVW5sZXNzIHRvIHNweSBteSBzaGFkb3cgaW4gdGhlIHN1biIgKyAKKyAgICAgICAgICAgICJBbmQgZGVzY2FudCBvbiBtaW5lIG93biBkZWZvcm1pdHk6IiArIAorICAgICAgICAgICAgIkFuZCB0aGVyZWZvcmUsIHNpbmNlIEkgY2Fubm90IHByb3ZlIGEgbG92ZXIsIiArIAorICAgICAgICAgICAgIlRvIGVudGVydGFpbiB0aGVzZSBmYWlyIHdlbGwtc3Bva2VuIGRheXMsIiArIAorICAgICAgICAgICAgIkkgYW0gZGV0ZXJtaW5lZCB0byBwcm92ZSBhIHZpbGxhaW4iICsgCisgICAgICAgICAgICAiQW5kIGhhdGUgdGhlIGlkbGUgcGxlYXN1cmVzIG9mIHRoZXNlIGRheXMuIiArIAorICAgICAgICAgICAgIlBsb3RzIGhhdmUgSSBsYWlkLCBpbmR1Y3Rpb25zIGRhbmdlcm91cywiICsgCisgICAgICAgICAgICAiQnkgZHJ1bmtlbiBwcm9waGVjaWVzLCBsaWJlbHMgYW5kIGRyZWFtcywiICsgCisgICAgICAgICAgICAiVG8gc2V0IG15IGJyb3RoZXIgQ2xhcmVuY2UgYW5kIHRoZSBraW5nIiArIAorICAgICAgICAgICAgIkluIGRlYWRseSBoYXRlIHRoZSBvbmUgYWdhaW5zdCB0aGUgb3RoZXI6IiArIAorICAgICAgICAgICAgIkFuZCBpZiBLaW5nIEVkd2FyZCBiZSBhcyB0cnVlIGFuZCBqdXN0IiArIAorICAgICAgICAgICAgIkFzIEkgYW0gc3VidGxlLCBmYWxzZSBhbmQgdHJlYWNoZXJvdXMsIiArIAorICAgICAgICAgICAgIlRoaXMgZGF5IHNob3VsZCBDbGFyZW5jZSBjbG9zZWx5IGJlIG1ldydkIHVwLCIgKyAKKyAgICAgICAgICAgICJBYm91dCBhIHByb3BoZWN5LCB3aGljaCBzYXlzIHRoYXQgJ0cnIiArIAorICAgICAgICAgICAgIk9mIEVkd2FyZCdzIGhlaXJzIHRoZSBtdXJkZXJlciBzaGFsbCBiZS4iICsgCisgICAgICAgICAgICAiRGl2ZSwgdGhvdWdodHMsIGRvd24gdG8gbXkgc291bDogaGVyZSIgKyAKKyAgICAgICAgICAgICJDbGFyZW5jZSBjb21lcy4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiVG8gYmFpdCBmaXNoIHdpdGhhbDogaWYgaXQgd2lsbCBmZWVkIG5vdGhpbmcgZWxzZSwiICsgCisgICAgICAgICAgICAiaXQgd2lsbCBmZWVkIG15IHJldmVuZ2UuIEhlIGhhdGggZGlzZ3JhY2VkIG1lLCBhbmQiICsgCisgICAgICAgICAgICAiaGluZGVyZWQgbWUgaGFsZiBhIG1pbGxpb247IGxhdWdoZWQgYXQgbXkgbG9zc2VzLCIgKyAKKyAgICAgICAgICAgICJtb2NrZWQgYXQgbXkgZ2FpbnMsIHNjb3JuZWQgbXkgbmF0aW9uLCB0aHdhcnRlZCBteSIgKyAKKyAgICAgICAgICAgICJiYXJnYWlucywgY29vbGVkIG15IGZyaWVuZHMsIGhlYXRlZCBtaW5lIiArIAorICAgICAgICAgICAgImVuZW1pZXM7IGFuZCB3aGF0J3MgaGlzIHJlYXNvbj8gSSBhbSBhIEpldy4gSGF0aCIgKyAKKyAgICAgICAgICAgICJub3QgYSBKZXcgZXllcz8gaGF0aCBub3QgYSBKZXcgaGFuZHMsIG9yZ2FucywiICsgCisgICAgICAgICAgICAiZGltZW5zaW9ucywgc2Vuc2VzLCBhZmZlY3Rpb25zLCBwYXNzaW9ucz8gZmVkIHdpdGgiICsgCisgICAgICAgICAgICAidGhlIHNhbWUgZm9vZCwgaHVydCB3aXRoIHRoZSBzYW1lIHdlYXBvbnMsIHN1YmplY3QiICsgCisgICAgICAgICAgICAidG8gdGhlIHNhbWUgZGlzZWFzZXMsIGhlYWxlZCBieSB0aGUgc2FtZSBtZWFucywiICsgCisgICAgICAgICAgICAid2FybWVkIGFuZCBjb29sZWQgYnkgdGhlIHNhbWUgd2ludGVyIGFuZCBzdW1tZXIsIGFzIiArIAorICAgICAgICAgICAgImEgQ2hyaXN0aWFuIGlzPyBJZiB5b3UgcHJpY2sgdXMsIGRvIHdlIG5vdCBibGVlZD8iICsgCisgICAgICAgICAgICAiaWYgeW91IHRpY2tsZSB1cywgZG8gd2Ugbm90IGxhdWdoPyBpZiB5b3UgcG9pc29uIiArIAorICAgICAgICAgICAgInVzLCBkbyB3ZSBub3QgZGllPyBhbmQgaWYgeW91IHdyb25nIHVzLCBzaGFsbCB3ZSBub3QiICsgCisgICAgICAgICAgICAicmV2ZW5nZT8gSWYgd2UgYXJlIGxpa2UgeW91IGluIHRoZSByZXN0LCB3ZSB3aWxsIiArIAorICAgICAgICAgICAgInJlc2VtYmxlIHlvdSBpbiB0aGF0LiBJZiBhIEpldyB3cm9uZyBhIENocmlzdGlhbiwiICsgCisgICAgICAgICAgICAid2hhdCBpcyBoaXMgaHVtaWxpdHk/IFJldmVuZ2UuIElmIGEgQ2hyaXN0aWFuIiArIAorICAgICAgICAgICAgIndyb25nIGEgSmV3LCB3aGF0IHNob3VsZCBoaXMgc3VmZmVyYW5jZSBiZSBieSIgKyAKKyAgICAgICAgICAgICJDaHJpc3RpYW4gZXhhbXBsZT8gV2h5LCByZXZlbmdlLiBUaGUgdmlsbGFueSB5b3UiICsgCisgICAgICAgICAgICAidGVhY2ggbWUsIEkgd2lsbCBleGVjdXRlLCBhbmQgaXQgc2hhbGwgZ28gaGFyZCBidXQgSSIgKyAKKyAgICAgICAgICAgICJ3aWxsIGJldHRlciB0aGUgaW5zdHJ1Y3Rpb24uIiwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIlZpcnR1ZSEgYSBmaWchICd0aXMgaW4gb3Vyc2VsdmVzIHRoYXQgd2UgYXJlIHRodXMiICsgCisgICAgICAgICAgICAib3IgdGh1cy4gT3VyIGJvZGllcyBhcmUgb3VyIGdhcmRlbnMsIHRvIHRoZSB3aGljaCIgKyAKKyAgICAgICAgICAgICJvdXIgd2lsbHMgYXJlIGdhcmRlbmVyczogc28gdGhhdCBpZiB3ZSB3aWxsIHBsYW50IiArIAorICAgICAgICAgICAgIm5ldHRsZXMsIG9yIHNvdyBsZXR0dWNlLCBzZXQgaHlzc29wIGFuZCB3ZWVkIHVwIiArIAorICAgICAgICAgICAgInRoeW1lLCBzdXBwbHkgaXQgd2l0aCBvbmUgZ2VuZGVyIG9mIGhlcmJzLCBvciIgKyAKKyAgICAgICAgICAgICJkaXN0cmFjdCBpdCB3aXRoIG1hbnksIGVpdGhlciB0byBoYXZlIGl0IHN0ZXJpbGUiICsgCisgICAgICAgICAgICAid2l0aCBpZGxlbmVzcywgb3IgbWFudXJlZCB3aXRoIGluZHVzdHJ5LCB3aHksIHRoZSIgKyAKKyAgICAgICAgICAgICJwb3dlciBhbmQgY29ycmlnaWJsZSBhdXRob3JpdHkgb2YgdGhpcyBsaWVzIGluIG91ciIgKyAKKyAgICAgICAgICAgICJ3aWxscy4gSWYgdGhlIGJhbGFuY2Ugb2Ygb3VyIGxpdmVzIGhhZCBub3Qgb25lIiArIAorICAgICAgICAgICAgInNjYWxlIG9mIHJlYXNvbiB0byBwb2lzZSBhbm90aGVyIG9mIHNlbnN1YWxpdHksIHRoZSIgKyAKKyAgICAgICAgICAgICJibG9vZCBhbmQgYmFzZW5lc3Mgb2Ygb3VyIG5hdHVyZXMgd291bGQgY29uZHVjdCB1cyIgKyAKKyAgICAgICAgICAgICJ0byBtb3N0IHByZXBvc3Rlcm91cyBjb25jbHVzaW9uczogYnV0IHdlIGhhdmUiICsgCisgICAgICAgICAgICAicmVhc29uIHRvIGNvb2wgb3VyIHJhZ2luZyBtb3Rpb25zLCBvdXIgY2FybmFsIiArIAorICAgICAgICAgICAgInN0aW5ncywgb3VyIHVuYml0dGVkIGx1c3RzLCB3aGVyZW9mIEkgdGFrZSB0aGlzIHRoYXQiICsgCisgICAgICAgICAgICAieW91IGNhbGwgbG92ZSB0byBiZSBhIHNlY3Qgb3Igc2Npb24uIiwKKworICAgICAgICAgICAgIkJsb3csIHdpbmRzLCBhbmQgY3JhY2sgeW91ciBjaGVla3MhIHJhZ2UhIGJsb3chIiArIAorICAgICAgICAgICAgIllvdSBjYXRhcmFjdHMgYW5kIGh1cnJpY2Fub2VzLCBzcG91dCIgKyAKKyAgICAgICAgICAgICJUaWxsIHlvdSBoYXZlIGRyZW5jaCdkIG91ciBzdGVlcGxlcywgZHJvd24nZCB0aGUgY29ja3MhIiArIAorICAgICAgICAgICAgIllvdSBzdWxwaHVyb3VzIGFuZCB0aG91Z2h0LWV4ZWN1dGluZyBmaXJlcywiICsgCisgICAgICAgICAgICAiVmF1bnQtY291cmllcnMgdG8gb2FrLWNsZWF2aW5nIHRodW5kZXJib2x0cywiICsgCisgICAgICAgICAgICAiU2luZ2UgbXkgd2hpdGUgaGVhZCEgQW5kIHRob3UsIGFsbC1zaGFraW5nIHRodW5kZXIsIiArIAorICAgICAgICAgICAgIlNtaXRlIGZsYXQgdGhlIHRoaWNrIHJvdHVuZGl0eSBvJyB0aGUgd29ybGQhIiArIAorICAgICAgICAgICAgIkNyYWNrIG5hdHVyZSdzIG1vdWxkcywgYW4gZ2VybWVucyBzcGlsbCBhdCBvbmNlLCIgKyAKKyAgICAgICAgICAgICJUaGF0IG1ha2UgaW5ncmF0ZWZ1bCBtYW4hIgorICAgIH07Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvbkNsb25pbmcuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uQ2xvbmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODk2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvbkNsb25pbmcuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLio7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisKK3B1YmxpYyBjbGFzcyBBbmltYXRpb25DbG9uaW5nIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9jbG9uaW5nKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUFuaW1hdGlvblZpZXcgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPiBiYWxscyA9IG5ldyBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+KCk7CisgICAgICAgIEFuaW1hdG9yU2V0IGFuaW1hdGlvbiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURlbnNpdHk7CisKKyAgICAgICAgcHVibGljIE15QW5pbWF0aW9uVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBtRGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CisKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwwID0gYWRkQmFsbCg1MGYsIDI1Zik7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBiYWxsMSA9IGFkZEJhbGwoMTUwZiwgMjVmKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwyID0gYWRkQmFsbCgyNTBmLCAyNWYpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgYmFsbDMgPSBhZGRCYWxsKDM1MGYsIDI1Zik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbTEgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGxzLmdldCgwKSwgInkiLAorICAgICAgICAgICAgICAgICAgICAgICAgMGYsIGdldEhlaWdodCgpIC0gYmFsbHMuZ2V0KDApLmdldEhlaWdodCgpKS5zZXREdXJhdGlvbig1MDApOworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW0yID0gYW5pbTEuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBhbmltMi5zZXRUYXJnZXQoYmFsbHMuZ2V0KDEpKTsKKyAgICAgICAgICAgICAgICBhbmltMS5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwyID0gYmFsbHMuZ2V0KDIpOworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW1Eb3duID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsMiwgInkiLAorICAgICAgICAgICAgICAgICAgICAgICAgMGYsIGdldEhlaWdodCgpIC0gYmFsbDIuZ2V0SGVpZ2h0KCkpLnNldER1cmF0aW9uKDUwMCk7CisgICAgICAgICAgICAgICAgYW5pbURvd24uc2V0SW50ZXJwb2xhdG9yKG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW1VcCA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQoYmFsbDIsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlaWdodCgpIC0gYmFsbDIuZ2V0SGVpZ2h0KCksIDBmKS5zZXREdXJhdGlvbig1MDApOworICAgICAgICAgICAgICAgIGFuaW1VcC5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICAgICAgQW5pbWF0b3JTZXQgczEgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgICAgICBzMS5wbGF5U2VxdWVudGlhbGx5KGFuaW1Eb3duLCBhbmltVXApOworICAgICAgICAgICAgICAgIGFuaW1Eb3duLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGFuaW1VcC5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBBbmltYXRvclNldCBzMiA9IChBbmltYXRvclNldCkgczEuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBzMi5zZXRUYXJnZXQoYmFsbHMuZ2V0KDMpKTsKKworICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5wbGF5VG9nZXRoZXIoYW5pbTEsIGFuaW0yLCBzMSk7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnBsYXlTZXF1ZW50aWFsbHkoczEsIHMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZSg1MGYgKiBtRGVuc2l0eSwgNTBmICogbURlbnNpdHkpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHggLSAyNWYpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5IC0gMjVmKTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsgLy9uZXcgUGFpbnQoUGFpbnQuQU5USV9BTElBU19GTEFHKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhbGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBiYWxscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHNoYXBlSG9sZGVyLmdldFgoKSwgc2hhcGVIb2xkZXIuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICBzaGFwZUhvbGRlci5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uTG9hZGluZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25Mb2FkaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZWUyOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uTG9hZGluZy5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldDsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBsb2FkaW5nIEFuaW1hdG9yIG9iamVjdHMgZnJvbSBYTUwgcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgQW5pbWF0aW9uTG9hZGluZyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEVVJBVElPTiA9IDE1MDA7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hbmltYXRpb25fbG9hZGluZyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEJBTExfU0laRSA9IDEwMGY7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBBbmltYXRvciBhbmltYXRpb24gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGFkZEJhbGwoNTAsIDUwKTsKKyAgICAgICAgICAgIGFkZEJhbGwoMjAwLCA1MCk7CisgICAgICAgICAgICBhZGRCYWxsKDM1MCwgNTApOworICAgICAgICAgICAgYWRkQmFsbCg1MDAsIDUwLCBDb2xvci5HUkVFTik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgQ29udGV4dCBhcHBDb250ZXh0ID0gQW5pbWF0aW9uTG9hZGluZy50aGlzOworCisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0gKE9iamVjdEFuaW1hdG9yKSBBbmltYXRvckluZmxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEFuaW1hdG9yKGFwcENvbnRleHQsIFIuYW5pbS5vYmplY3RfYW5pbWF0b3IpOworICAgICAgICAgICAgICAgIGFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoYmFsbHMuZ2V0KDApKTsKKworICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgZmFkZXIgPSAoVmFsdWVBbmltYXRvcikgQW5pbWF0b3JJbmZsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBbmltYXRvcihhcHBDb250ZXh0LCBSLmFuaW0uYW5pbWF0b3IpOworICAgICAgICAgICAgICAgIGZhZGVyLmFkZFVwZGF0ZUxpc3RlbmVyKG5ldyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWxscy5nZXQoMSkuc2V0QWxwaGEoKEZsb2F0KSBhbmltYXRpb24uZ2V0QW5pbWF0ZWRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgQW5pbWF0b3JTZXQgc2VxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChBbmltYXRvclNldCkgQW5pbWF0b3JJbmZsYXRlci5sb2FkQW5pbWF0b3IoYXBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5hbmltYXRvcl9zZXQpOworICAgICAgICAgICAgICAgIHNlcS5zZXRUYXJnZXQoYmFsbHMuZ2V0KDIpKTsKKworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIGNvbG9yaXplciA9IChPYmplY3RBbmltYXRvcikgQW5pbWF0b3JJbmZsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBbmltYXRvcihhcHBDb250ZXh0LCBSLmFuaW0uY29sb3JfYW5pbWF0b3IpOworICAgICAgICAgICAgICAgIGNvbG9yaXplci5zZXRUYXJnZXQoYmFsbHMuZ2V0KDMpKTsKKworICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgICAgICgoQW5pbWF0b3JTZXQpIGFuaW1hdGlvbikucGxheVRvZ2V0aGVyKGFuaW0sIGZhZGVyLCBzZXEsIGNvbG9yaXplcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGNyZWF0ZUJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoQkFMTF9TSVpFLCBCQUxMX1NJWkUpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHgpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5KTsKKyAgICAgICAgICAgIHJldHVybiBzaGFwZUhvbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBhZGRCYWxsKGZsb2F0IHgsIGZsb2F0IHksIGludCBjb2xvcikgeworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBjcmVhdGVCYWxsKHgsIHkpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0Q29sb3IoY29sb3IpOworICAgICAgICAgICAgYmFsbHMuYWRkKHNoYXBlSG9sZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBhZGRCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gY3JlYXRlQmFsbCh4LCB5KTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gc2hhcGVIb2xkZXIuZ2V0U2hhcGUoKS5nZXRQYWludCgpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGZvciAoU2hhcGVIb2xkZXIgYmFsbCA6IGJhbGxzKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtYmFsbC5nZXRYKCksIC1iYWxsLmdldFkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gYmFsbHMuZ2V0KDApOworICAgICAgICAgICAgYmFsbC5zZXRZKChGbG9hdClhbmltYXRpb24uZ2V0QW5pbWF0ZWRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvblNlZWtpbmcuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uU2Vla2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjkxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvblNlZWtpbmcuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5Cb3VuY2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHRoZSBzZWVraW5nIGNhcGFiaWxpdHkgb2YgVmFsdWVBbmltYXRvci4gVGhlIFNlZWtCYXIgaW4gdGhlCisgKiBVSSBhbGxvd3MgeW91IHRvIHNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbi4gUHJlc3NpbmcgdGhlIFJ1biBidXR0b24gd2lsbCBwbGF5IGZyb20KKyAqIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRpb25TZWVraW5nIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERVUkFUSU9OID0gMTUwMDsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVNlZWtCYXI7CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hbmltYXRpb25fc2Vla2luZyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVNlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQuc2Vla0Jhcik7CisgICAgICAgIG1TZWVrQmFyLnNldE1heChEVVJBVElPTik7CisgICAgICAgIG1TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBzZWVraW5nIG9uIGFwcCBjcmVhdGlvbgorICAgICAgICAgICAgICAgIGlmIChhbmltVmlldy5nZXRIZWlnaHQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW1WaWV3LnNlZWsocHJvZ3Jlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIsIEFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUQgPSAweGZmRkY4MDgwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxVRSA9IDB4ZmY4MDgwRkY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWUFOID0gMHhmZjgwZmZmZjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOID0gMHhmZjgwZmY4MDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQkFMTF9TSVpFID0gMTAwZjsKKworICAgICAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPiBiYWxscyA9IG5ldyBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+KCk7CisgICAgICAgIEFuaW1hdG9yU2V0IGFuaW1hdGlvbiA9IG51bGw7CisgICAgICAgIFZhbHVlQW5pbWF0b3IgYm91bmNlQW5pbSA9IG51bGw7CisgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJhbGwgPSBhZGRCYWxsKDIwMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGJvdW5jZUFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIEJBTExfU0laRSkuc2V0RHVyYXRpb24oMTUwMCk7CisgICAgICAgICAgICAgICAgYm91bmNlQW5pbS5zZXRJbnRlcnBvbGF0b3IobmV3IEJvdW5jZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGJvdW5jZUFuaW0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBzZWVrVGltZSkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnNldEN1cnJlbnRQbGF5VGltZShzZWVrVGltZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGFkZEJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoQkFMTF9TSVpFLCBCQUxMX1NJWkUpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHgpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5KTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJhbGwuZ2V0WCgpLCBiYWxsLmdldFkoKSk7CisgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGxvbmcgcGxheXRpbWUgPSBib3VuY2VBbmltLmdldEN1cnJlbnRQbGF5VGltZSgpOworICAgICAgICAgICAgLy9tU2Vla0Jhci5zZXRQcm9ncmVzcygoaW50KXBsYXl0aW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBiYWxscy5yZW1vdmUoKChPYmplY3RBbmltYXRvcilhbmltYXRpb24pLmdldFRhcmdldCgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0b3JFdmVudHMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0b3JFdmVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWVjZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRvckV2ZW50cy5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGRlbW8gc2hvd3MgaG93IHRoZSBBbmltYXRvckxpc3RlbmVyIGV2ZW50cyB3b3JrLgorICovCitwdWJsaWMgY2xhc3MgQW5pbWF0b3JFdmVudHMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBUZXh0VmlldyBzdGFydFRleHQsIHJlcGVhdFRleHQsIGNhbmNlbFRleHQsIGVuZFRleHQ7CisgICAgVGV4dFZpZXcgc3RhcnRUZXh0QW5pbWF0b3IsIHJlcGVhdFRleHRBbmltYXRvciwgY2FuY2VsVGV4dEFuaW1hdG9yLCBlbmRUZXh0QW5pbWF0b3I7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdG9yX2V2ZW50cyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisgICAgICAgIHN0YXJ0VGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRUZXh0KTsKKyAgICAgICAgc3RhcnRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgIHJlcGVhdFRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnJlcGVhdFRleHQpOworICAgICAgICByZXBlYXRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgIGNhbmNlbFRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhbmNlbFRleHQpOworICAgICAgICBjYW5jZWxUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgIGVuZFRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVuZFRleHQpOworICAgICAgICBlbmRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgIHN0YXJ0VGV4dEFuaW1hdG9yID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydFRleHRBbmltYXRvcik7CisgICAgICAgIHN0YXJ0VGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgIHJlcGVhdFRleHRBbmltYXRvciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucmVwZWF0VGV4dEFuaW1hdG9yKTsKKyAgICAgICAgcmVwZWF0VGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgIGNhbmNlbFRleHRBbmltYXRvciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2FuY2VsVGV4dEFuaW1hdG9yKTsKKyAgICAgICAgY2FuY2VsVGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgIGVuZFRleHRBbmltYXRvciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW5kVGV4dEFuaW1hdG9yKTsKKyAgICAgICAgZW5kVGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgIGZpbmFsIENoZWNrQm94IGVuZENCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5lbmRDQik7CisKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnN0YXJ0QW5pbWF0aW9uKGVuZENCLmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQnV0dG9uIGNhbmNlbGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuY2FuY2VsQnV0dG9uKTsKKyAgICAgICAgY2FuY2VsZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5jYW5jZWxBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQnV0dG9uIGVuZGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW5kQnV0dG9uKTsKKyAgICAgICAgZW5kZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5lbmRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIsCisgICAgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPiBiYWxscyA9IG5ldyBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+KCk7CisgICAgICAgIEFuaW1hdG9yIGFuaW1hdGlvbjsKKyAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gZW5kSW1tZWRpYXRlbHkgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gY3JlYXRlQmFsbCgyNSwgMjUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHlBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsLCAieSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFkoKSwgZ2V0SGVpZ2h0KCkgLSA1MGYpLnNldER1cmF0aW9uKDE1MDApOworICAgICAgICAgICAgICAgIHlBbmltLnNldFJlcGVhdENvdW50KDApOworICAgICAgICAgICAgICAgIHlBbmltLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5zZXRJbnRlcnBvbGF0b3IobmV3IEFjY2VsZXJhdGVJbnRlcnBvbGF0b3IoMmYpKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5hZGRMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHhBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsLCAieCIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFgoKSwgYmFsbC5nZXRYKCkgKyAzMDApLnNldER1cmF0aW9uKDEwMDApOworICAgICAgICAgICAgICAgIHhBbmltLnNldFN0YXJ0RGVsYXkoMCk7CisgICAgICAgICAgICAgICAgeEFuaW0uc2V0UmVwZWF0Q291bnQoMCk7CisgICAgICAgICAgICAgICAgeEFuaW0uc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworICAgICAgICAgICAgICAgIHhBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigyZikpOworCisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgYWxwaGFBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsLCAiYWxwaGEiLCAxZiwgLjVmKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldER1cmF0aW9uKDEwMDApOworICAgICAgICAgICAgICAgIEFuaW1hdG9yU2V0IGFscGhhU2VxID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgYWxwaGFTZXEucGxheShhbHBoYUFuaW0pOworCisgICAgICAgICAgICAgICAgYW5pbWF0aW9uID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgKChBbmltYXRvclNldCkgYW5pbWF0aW9uKS5wbGF5VG9nZXRoZXIoeUFuaW0sIHhBbmltKTsKKyAgICAgICAgICAgICAgICBhbmltYXRpb24uYWRkTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbihib29sZWFuIGVuZEltbWVkaWF0ZWx5KSB7CisgICAgICAgICAgICB0aGlzLmVuZEltbWVkaWF0ZWx5ID0gZW5kSW1tZWRpYXRlbHk7CisgICAgICAgICAgICBzdGFydFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIHJlcGVhdFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIGNhbmNlbFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIGVuZFRleHQuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIHN0YXJ0VGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgICAgICByZXBlYXRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIGNhbmNlbFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgZW5kVGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBhbmltYXRpb24uY2FuY2VsKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbmRBbmltYXRpb24oKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgY3JlYXRlQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZSg1MGYsIDUwZik7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCAtIDI1Zik7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkgLSAyNWYpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOyAvL25ldyBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIHJldHVybiBzaGFwZUhvbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgQW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgICAgICBzdGFydFRleHQuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydFRleHRBbmltYXRvci5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5kSW1tZWRpYXRlbHkpIHsKKyAgICAgICAgICAgICAgICBhbmltYXRpb24uZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBBbmltYXRvclNldCkgeworICAgICAgICAgICAgICAgIGVuZFRleHQuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmRUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgQW5pbWF0b3JTZXQpIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0LnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FuY2VsVGV4dEFuaW1hdG9yLnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIEFuaW1hdG9yU2V0KSB7CisgICAgICAgICAgICAgICAgcmVwZWF0VGV4dC5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGVhdFRleHRBbmltYXRvci5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9Cb3VuY2luZ0JhbGxzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0JvdW5jaW5nQmFsbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTI4ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9Cb3VuY2luZ0JhbGxzLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi4qOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKworcHVibGljIGNsYXNzIEJvdW5jaW5nQmFsbHMgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYm91bmNpbmdfYmFsbHMpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcobmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUQgPSAweGZmRkY4MDgwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxVRSA9IDB4ZmY4MDgwRkY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDWUFOID0gMHhmZjgwZmZmZjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOID0gMHhmZjgwZmY4MDsKKworICAgICAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPiBiYWxscyA9IG5ldyBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+KCk7CisgICAgICAgIEFuaW1hdG9yU2V0IGFuaW1hdGlvbiA9IG51bGw7CisKKyAgICAgICAgcHVibGljIE15QW5pbWF0aW9uVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICAvLyBBbmltYXRlIGJhY2tncm91bmQgY29sb3IKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBzZXR0aW5nIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdpbGwgYXV0b21hdGljYWxseSBpbnZhbGlkYXRlIHRoZQorICAgICAgICAgICAgLy8gdmlldywgc28gdGhhdCB0aGUgYW5pbWF0ZWQgY29sb3IsIGFuZCB0aGUgYm91bmNpbmcgYmFsbHMsIGdldCByZWRpc3BsYXllZCBvbgorICAgICAgICAgICAgLy8gZXZlcnkgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgY29sb3JBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZJbnQodGhpcywgImJhY2tncm91bmRDb2xvciIsIFJFRCwgQkxVRSk7CisgICAgICAgICAgICBjb2xvckFuaW0uc2V0RHVyYXRpb24oMzAwMCk7CisgICAgICAgICAgICBjb2xvckFuaW0uc2V0RXZhbHVhdG9yKG5ldyBBcmdiRXZhbHVhdG9yKCkpOworICAgICAgICAgICAgY29sb3JBbmltLnNldFJlcGVhdENvdW50KFZhbHVlQW5pbWF0b3IuSU5GSU5JVEUpOworICAgICAgICAgICAgY29sb3JBbmltLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2hhcGVIb2xkZXIgbmV3QmFsbCA9IGFkZEJhbGwoZXZlbnQuZ2V0WCgpLCBldmVudC5nZXRZKCkpOworCisgICAgICAgICAgICAvLyBCb3VuY2luZyBhbmltYXRpb24gd2l0aCBzcXVhc2ggYW5kIHN0cmV0Y2gKKyAgICAgICAgICAgIGZsb2F0IHN0YXJ0WSA9IG5ld0JhbGwuZ2V0WSgpOworICAgICAgICAgICAgZmxvYXQgZW5kWSA9IGdldEhlaWdodCgpIC0gNTBmOworICAgICAgICAgICAgZmxvYXQgaCA9IChmbG9hdClnZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGZsb2F0IGV2ZW50WSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpKDUwMCAqICgoaCAtIGV2ZW50WSkvaCkpOworICAgICAgICAgICAgVmFsdWVBbmltYXRvciBib3VuY2VBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChuZXdCYWxsLCAieSIsIHN0YXJ0WSwgZW5kWSk7CisgICAgICAgICAgICBib3VuY2VBbmltLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIGJvdW5jZUFuaW0uc2V0SW50ZXJwb2xhdG9yKG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgVmFsdWVBbmltYXRvciBzcXVhc2hBbmltMSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobmV3QmFsbCwgIngiLCBuZXdCYWxsLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3QmFsbC5nZXRYKCkgLSAyNWYpOworICAgICAgICAgICAgc3F1YXNoQW5pbTEuc2V0RHVyYXRpb24oZHVyYXRpb24vNCk7CisgICAgICAgICAgICBzcXVhc2hBbmltMS5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0xLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0xLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3Igc3F1YXNoQW5pbTIgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG5ld0JhbGwsICJ3aWR0aCIsIG5ld0JhbGwuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3QmFsbC5nZXRXaWR0aCgpICsgNTApOworICAgICAgICAgICAgc3F1YXNoQW5pbTIuc2V0RHVyYXRpb24oZHVyYXRpb24vNCk7CisgICAgICAgICAgICBzcXVhc2hBbmltMi5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0yLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0yLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3Igc3RyZXRjaEFuaW0xID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChuZXdCYWxsLCAieSIsIGVuZFksCisgICAgICAgICAgICAgICAgICAgIGVuZFkgKyAyNWYpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0xLnNldER1cmF0aW9uKGR1cmF0aW9uLzQpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0xLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0xLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMS5zZXRSZXBlYXRNb2RlKFZhbHVlQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIHN0cmV0Y2hBbmltMiA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobmV3QmFsbCwgImhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgIG5ld0JhbGwuZ2V0SGVpZ2h0KCksIG5ld0JhbGwuZ2V0SGVpZ2h0KCkgLSAyNSk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTIuc2V0RHVyYXRpb24oZHVyYXRpb24vNCk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTIuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTIuc2V0SW50ZXJwb2xhdG9yKG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0yLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYm91bmNlQmFja0FuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG5ld0JhbGwsICJ5IiwgZW5kWSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRZKTsKKyAgICAgICAgICAgIGJvdW5jZUJhY2tBbmltLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIGJvdW5jZUJhY2tBbmltLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIC8vIFNlcXVlbmNlIHRoZSBkb3duL3NxdWFzaCZzdHJldGNoL3VwIGFuaW1hdGlvbnMKKyAgICAgICAgICAgIEFuaW1hdG9yU2V0IGJvdW5jZXIgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgIGJvdW5jZXIucGxheShib3VuY2VBbmltKS5iZWZvcmUoc3F1YXNoQW5pbTEpOworICAgICAgICAgICAgYm91bmNlci5wbGF5KHNxdWFzaEFuaW0xKS53aXRoKHNxdWFzaEFuaW0yKTsKKyAgICAgICAgICAgIGJvdW5jZXIucGxheShzcXVhc2hBbmltMSkud2l0aChzdHJldGNoQW5pbTEpOworICAgICAgICAgICAgYm91bmNlci5wbGF5KHNxdWFzaEFuaW0xKS53aXRoKHN0cmV0Y2hBbmltMik7CisgICAgICAgICAgICBib3VuY2VyLnBsYXkoYm91bmNlQmFja0FuaW0pLmFmdGVyKHN0cmV0Y2hBbmltMik7CisKKyAgICAgICAgICAgIC8vIEZhZGluZyBhbmltYXRpb24gLSByZW1vdmUgdGhlIGJhbGwgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUKKyAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgZmFkZUFuaW0gPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG5ld0JhbGwsICJhbHBoYSIsIDFmLCAwZik7CisgICAgICAgICAgICBmYWRlQW5pbS5zZXREdXJhdGlvbigyNTApOworICAgICAgICAgICAgZmFkZUFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICBiYWxscy5yZW1vdmUoKChPYmplY3RBbmltYXRvcilhbmltYXRpb24pLmdldFRhcmdldCgpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBTZXF1ZW5jZSB0aGUgdHdvIGFuaW1hdGlvbnMgdG8gcGxheSBvbmUgYWZ0ZXIgdGhlIG90aGVyCisgICAgICAgICAgICBBbmltYXRvclNldCBhbmltYXRvclNldCA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgYW5pbWF0b3JTZXQucGxheShib3VuY2VyKS5iZWZvcmUoZmFkZUFuaW0pOworCisgICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICBhbmltYXRvclNldC5zdGFydCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZSg1MGYsIDUwZik7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCAtIDI1Zik7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkgLSAyNWYpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOyAvL25ldyBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFsbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IGJhbGxzLmdldChpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoc2hhcGVIb2xkZXIuZ2V0WCgpLCBzaGFwZUhvbGRlci5nZXRZKCkpOworICAgICAgICAgICAgICAgIHNoYXBlSG9sZGVyLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9DdXN0b21FdmFsdWF0b3IuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQ3VzdG9tRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzNDUwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQ3VzdG9tRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworcHVibGljIGNsYXNzIEN1c3RvbUV2YWx1YXRvciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYW5pbWF0b3JfY3VzdG9tX2V2YWx1YXRvcik7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFhZSG9sZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtWDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtWTsKKworICAgICAgICBwdWJsaWMgWFlIb2xkZXIoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgbVggPSB4OworICAgICAgICAgICAgbVkgPSB5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgICAgIG1YID0geDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WShmbG9hdCB5KSB7CisgICAgICAgICAgICBtWSA9IHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgWFlFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICAgICAgWFlIb2xkZXIgc3RhcnRYWSA9IChYWUhvbGRlcikgc3RhcnRWYWx1ZTsKKyAgICAgICAgICAgIFhZSG9sZGVyIGVuZFhZID0gKFhZSG9sZGVyKSBlbmRWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWFlIb2xkZXIoc3RhcnRYWS5nZXRYKCkgKyBmcmFjdGlvbiAqIChlbmRYWS5nZXRYKCkgLSBzdGFydFhZLmdldFgoKSksCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0WFkuZ2V0WSgpICsgZnJhY3Rpb24gKiAoZW5kWFkuZ2V0WSgpIC0gc3RhcnRYWS5nZXRZKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBCYWxsWFlIb2xkZXIgeworCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgbUJhbGw7CisKKyAgICAgICAgcHVibGljIEJhbGxYWUhvbGRlcihTaGFwZUhvbGRlciBiYWxsKSB7CisgICAgICAgICAgICBtQmFsbCA9IGJhbGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRYWShYWUhvbGRlciB4eUhvbGRlcikgeworICAgICAgICAgICAgbUJhbGwuc2V0WCh4eUhvbGRlci5nZXRYKCkpOworICAgICAgICAgICAgbUJhbGwuc2V0WSh4eUhvbGRlci5nZXRZKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhZSG9sZGVyIGdldFhZKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYWUhvbGRlcihtQmFsbC5nZXRYKCksIG1CYWxsLmdldFkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBWYWx1ZUFuaW1hdG9yIGJvdW5jZUFuaW0gPSBudWxsOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKyAgICAgICAgQmFsbFhZSG9sZGVyIGJhbGxIb2xkZXIgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJhbGwgPSBjcmVhdGVCYWxsKDI1LCAyNSk7CisgICAgICAgICAgICBiYWxsSG9sZGVyID0gbmV3IEJhbGxYWUhvbGRlcihiYWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmltYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoYm91bmNlQW5pbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgWFlIb2xkZXIgc3RhcnRYWSA9IG5ldyBYWUhvbGRlcigwZiwgMGYpOworICAgICAgICAgICAgICAgIFhZSG9sZGVyIGVuZFhZID0gbmV3IFhZSG9sZGVyKDMwMGYsIDUwMGYpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0gPSBPYmplY3RBbmltYXRvci5vZk9iamVjdChiYWxsSG9sZGVyLCAieFkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhZRXZhbHVhdG9yKCksIGVuZFhZKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldER1cmF0aW9uKDE1MDApOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBjcmVhdGVCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKDUwZiwgNTBmKTsKKyAgICAgICAgICAgIFNoYXBlRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgU2hhcGVEcmF3YWJsZShjaXJjbGUpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBuZXcgU2hhcGVIb2xkZXIoZHJhd2FibGUpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WCh4IC0gMjVmKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFkoeSAtIDI1Zik7CisgICAgICAgICAgICBpbnQgcmVkID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgZ3JlZW4gPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBibHVlID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSAweGZmMDAwMDAwIHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBQYWludCBwYWludCA9IGRyYXdhYmxlLmdldFBhaW50KCk7IC8vbmV3IFBhaW50KFBhaW50LkFOVElfQUxJQVNfRkxBRyk7CisgICAgICAgICAgICBpbnQgZGFya0NvbG9yID0gMHhmZjAwMDAwMCB8IHJlZC80IDw8IDE2IHwgZ3JlZW4vNCA8PCA4IHwgYmx1ZS80OworICAgICAgICAgICAgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgUmFkaWFsR3JhZGllbnQoMzcuNWYsIDEyLjVmLAorICAgICAgICAgICAgICAgICAgICA1MGYsIGNvbG9yLCBkYXJrQ29sb3IsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBwYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgYmFsbC5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9GaXhlZEdyaWRMYXlvdXQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vRml4ZWRHcmlkTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MmU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vRml4ZWRHcmlkTGF5b3V0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCisvKioKKyAqIEEgbGF5b3V0IHRoYXQgYXJyYW5nZXMgaXRzIGNoaWxkcmVuIGluIGEgZ3JpZC4gIFRoZSBzaXplIG9mIHRoZQorICogY2VsbHMgaXMgc2V0IGJ5IHRoZSB7QGxpbmsgI3NldENlbGxTaXplfSBtZXRob2QgYW5kIHRoZQorICogYW5kcm9pZDpjZWxsX3dpZHRoIGFuZCBhbmRyb2lkOmNlbGxfaGVpZ2h0IGF0dHJpYnV0ZXMgaW4gWE1MLgorICogVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGlzIGRldGVybWluZWQgYXQgcnVudGltZS4gIEVhY2gKKyAqIGNlbGwgY29udGFpbnMgZXhhY3RseSBvbmUgdmlldywgYW5kIHRoZXkgZmxvdyBpbiB0aGUgbmF0dXJhbAorICogY2hpbGQgb3JkZXIgKHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQsIG9yIHRoZSBpbmRleAorICogaW4ge0BsaW5rICNhZGRWaWV3QXR9LiAgVmlld3MgY2FuIG5vdCBzcGFuIG11bHRpcGxlIGNlbGxzLgorICoKKyAqIDxwPlRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBGaXhlZEdyaWRMYXlvdXQgQXBpIGRlbW87IHNlZSB0aGF0IGRlbW8gZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBsYXlvdXQuPC9wPgorICovCitwdWJsaWMgY2xhc3MgRml4ZWRHcmlkTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBpbnQgbUNlbGxXaWR0aDsKKyAgICBpbnQgbUNlbGxIZWlnaHQ7CisKKyAgICBwdWJsaWMgRml4ZWRHcmlkTGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsV2lkdGgoaW50IHB4KSB7CisgICAgICAgIG1DZWxsV2lkdGggPSBweDsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENlbGxIZWlnaHQoaW50IHB4KSB7CisgICAgICAgIG1DZWxsSGVpZ2h0ID0gcHg7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgY2VsbFdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtQ2VsbFdpZHRoLAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkFUX01PU1QpOworICAgICAgICBpbnQgY2VsbEhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobUNlbGxIZWlnaHQsCisgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpbmRleD0wOyBpbmRleDxjb3VudDsgaW5kZXgrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXgpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjZWxsV2lkdGhTcGVjLCBjZWxsSGVpZ2h0U3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVXNlIHRoZSBzaXplIG91ciBwYXJlbnRzIGdhdmUgdXMsIGJ1dCBkZWZhdWx0IHRvIGEgbWluaW11bSBzaXplIHRvIGF2b2lkCisgICAgICAgIC8vIGNsaXBwaW5nIHRyYW5zaXRpb25pbmcgY2hpbGRyZW4KKyAgICAgICAgaW50IG1pbkNvdW50ID0gIGNvdW50ID4gMyA/IGNvdW50IDogMzsKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24ocmVzb2x2ZVNpemUobUNlbGxXaWR0aCAqIG1pbkNvdW50LCB3aWR0aE1lYXN1cmVTcGVjKSwKKyAgICAgICAgICAgICAgICByZXNvbHZlU2l6ZShtQ2VsbEhlaWdodCAqIG1pbkNvdW50LCBoZWlnaHRNZWFzdXJlU3BlYykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IGNlbGxXaWR0aCA9IG1DZWxsV2lkdGg7CisgICAgICAgIGludCBjZWxsSGVpZ2h0ID0gbUNlbGxIZWlnaHQ7CisgICAgICAgIGludCBjb2x1bW5zID0gKHIgLSBsKSAvIGNlbGxXaWR0aDsKKyAgICAgICAgaWYgKGNvbHVtbnMgPCAwKSB7CisgICAgICAgICAgICBjb2x1bW5zID0gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgeCA9IDA7CisgICAgICAgIGludCB5ID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGluZGV4PTA7IGluZGV4PGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpbmRleCk7CisKKyAgICAgICAgICAgIGludCB3ID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGggPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICBpbnQgbGVmdCA9IHggKyAoKGNlbGxXaWR0aC13KS8yKTsKKyAgICAgICAgICAgIGludCB0b3AgPSB5ICsgKChjZWxsSGVpZ2h0LWgpLzIpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobGVmdCwgdG9wLCBsZWZ0K3csIHRvcCtoKTsKKyAgICAgICAgICAgIGlmIChpID49IChjb2x1bW5zLTEpKSB7CisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIHkgKz0gY2VsbEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHggKz0gY2VsbFdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWQ3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnMuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb247CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIExheW91dFRyYW5zaXRpb24gdG8gYXV0b21hdGUgdHJhbnNpdGlvbiBhbmltYXRpb25zCisgKiBhcyBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIG9yIGFkZGVkIHRvIGEgY29udGFpbmVyLgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0QW5pbWF0aW9ucyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgaW50IG51bUJ1dHRvbnMgPSAxOworICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgIEFuaW1hdG9yIGRlZmF1bHRBcHBlYXJpbmdBbmltLCBkZWZhdWx0RGlzYXBwZWFyaW5nQW5pbTsKKyAgICBBbmltYXRvciBkZWZhdWx0Q2hhbmdpbmdBcHBlYXJpbmdBbmltLCBkZWZhdWx0Q2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworICAgIEFuaW1hdG9yIGN1c3RvbUFwcGVhcmluZ0FuaW0sIGN1c3RvbURpc2FwcGVhcmluZ0FuaW07CisgICAgQW5pbWF0b3IgY3VzdG9tQ2hhbmdpbmdBcHBlYXJpbmdBbmltLCBjdXN0b21DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisgICAgQW5pbWF0b3IgY3VycmVudEFwcGVhcmluZ0FuaW0sIGN1cnJlbnREaXNhcHBlYXJpbmdBbmltOworICAgIEFuaW1hdG9yIGN1cnJlbnRDaGFuZ2luZ0FwcGVhcmluZ0FuaW0sIGN1cnJlbnRDaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5sYXlvdXRfYW5pbWF0aW9ucyk7CisKKyAgICAgICAgY29udGFpbmVyID0gbmV3IEZpeGVkR3JpZExheW91dCh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLnNldENsaXBDaGlsZHJlbihmYWxzZSk7CisgICAgICAgICgoRml4ZWRHcmlkTGF5b3V0KWNvbnRhaW5lcikuc2V0Q2VsbEhlaWdodCg1MCk7CisgICAgICAgICgoRml4ZWRHcmlkTGF5b3V0KWNvbnRhaW5lcikuc2V0Q2VsbFdpZHRoKDIwMCk7CisgICAgICAgIGZpbmFsIExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbmVyID0gbmV3IExheW91dFRyYW5zaXRpb24oKTsKKyAgICAgICAgY29udGFpbmVyLnNldExheW91dFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgZGVmYXVsdEFwcGVhcmluZ0FuaW0gPSB0cmFuc2l0aW9uZXIuZ2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5BUFBFQVJJTkcpOworICAgICAgICBkZWZhdWx0RGlzYXBwZWFyaW5nQW5pbSA9CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLmdldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HKTsKKyAgICAgICAgZGVmYXVsdENoYW5naW5nQXBwZWFyaW5nQW5pbSA9CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLmdldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORyk7CisgICAgICAgIGRlZmF1bHRDaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPQorICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci5nZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcpOworICAgICAgICBjcmVhdGVDdXN0b21BbmltYXRpb25zKHRyYW5zaXRpb25lcik7CisgICAgICAgIGN1cnJlbnRBcHBlYXJpbmdBbmltID0gZGVmYXVsdEFwcGVhcmluZ0FuaW07CisgICAgICAgIGN1cnJlbnREaXNhcHBlYXJpbmdBbmltID0gZGVmYXVsdERpc2FwcGVhcmluZ0FuaW07CisgICAgICAgIGN1cnJlbnRDaGFuZ2luZ0FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdpbmdBcHBlYXJpbmdBbmltOworICAgICAgICBjdXJyZW50Q2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltID0gZGVmYXVsdENoYW5naW5nRGlzYXBwZWFyaW5nQW5pbTsKKworICAgICAgICBWaWV3R3JvdXAgcGFyZW50ID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKFIuaWQucGFyZW50KTsKKyAgICAgICAgcGFyZW50LmFkZFZpZXcoY29udGFpbmVyKTsKKyAgICAgICAgcGFyZW50LnNldENsaXBDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIEJ1dHRvbiBhZGRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5hZGROZXdCdXR0b24pOworICAgICAgICBhZGRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24oTGF5b3V0QW5pbWF0aW9ucy50aGlzKTsKKyAgICAgICAgICAgICAgICBuZXdCdXR0b24uc2V0VGV4dCgiQ2xpY2sgdG8gRGVsZXRlICIgKyAobnVtQnV0dG9ucysrKSk7CisgICAgICAgICAgICAgICAgbmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucmVtb3ZlVmlldyh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KG5ld0J1dHRvbiwgTWF0aC5taW4oMSwgY29udGFpbmVyLmdldENoaWxkQ291bnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBDaGVja0JveCBjdXN0b21BbmltQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbUFuaW1DQik7CisgICAgICAgIGN1c3RvbUFuaW1DQi5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc2V0dXBUcmFuc2l0aW9uKHRyYW5zaXRpb25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIENoZWNrIGZvciBkaXNhYmxlZCBhbmltYXRpb25zCisgICAgICAgIENoZWNrQm94IGFwcGVhcmluZ0NCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5hcHBlYXJpbmdDQik7CisgICAgICAgIGFwcGVhcmluZ0NCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENoZWNrQm94IGRpc2FwcGVhcmluZ0NCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNhcHBlYXJpbmdDQik7CisgICAgICAgIGRpc2FwcGVhcmluZ0NCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENoZWNrQm94IGNoYW5naW5nQXBwZWFyaW5nQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmNoYW5naW5nQXBwZWFyaW5nQ0IpOworICAgICAgICBjaGFuZ2luZ0FwcGVhcmluZ0NCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENoZWNrQm94IGNoYW5naW5nRGlzYXBwZWFyaW5nQ0IgPSAoQ2hlY2tCb3gpIGZpbmRWaWV3QnlJZChSLmlkLmNoYW5naW5nRGlzYXBwZWFyaW5nQ0IpOworICAgICAgICBjaGFuZ2luZ0Rpc2FwcGVhcmluZ0NCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgQ2hlY2tCb3ggY3VzdG9tQW5pbUNCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5jdXN0b21BbmltQ0IpOworICAgICAgICBDaGVja0JveCBhcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuYXBwZWFyaW5nQ0IpOworICAgICAgICBDaGVja0JveCBkaXNhcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuZGlzYXBwZWFyaW5nQ0IpOworICAgICAgICBDaGVja0JveCBjaGFuZ2luZ0FwcGVhcmluZ0NCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5jaGFuZ2luZ0FwcGVhcmluZ0NCKTsKKyAgICAgICAgQ2hlY2tCb3ggY2hhbmdpbmdEaXNhcHBlYXJpbmdDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuY2hhbmdpbmdEaXNhcHBlYXJpbmdDQik7CisgICAgICAgIHRyYW5zaXRpb24uc2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5BUFBFQVJJTkcsIGFwcGVhcmluZ0NCLmlzQ2hlY2tlZCgpID8KKyAgICAgICAgICAgICAgICAoY3VzdG9tQW5pbUNCLmlzQ2hlY2tlZCgpID8gY3VzdG9tQXBwZWFyaW5nQW5pbSA6IGRlZmF1bHRBcHBlYXJpbmdBbmltKSA6IG51bGwpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HLCBkaXNhcHBlYXJpbmdDQi5pc0NoZWNrZWQoKSA/CisgICAgICAgICAgICAgICAgKGN1c3RvbUFuaW1DQi5pc0NoZWNrZWQoKSA/IGN1c3RvbURpc2FwcGVhcmluZ0FuaW0gOiBkZWZhdWx0RGlzYXBwZWFyaW5nQW5pbSkgOiBudWxsKTsKKyAgICAgICAgdHJhbnNpdGlvbi5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9BUFBFQVJJTkcsIGNoYW5naW5nQXBwZWFyaW5nQ0IuaXNDaGVja2VkKCkgPworICAgICAgICAgICAgICAgIChjdXN0b21BbmltQ0IuaXNDaGVja2VkKCkgPyBjdXN0b21DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENoYW5naW5nQXBwZWFyaW5nQW5pbSkgOiBudWxsKTsKKyAgICAgICAgdHJhbnNpdGlvbi5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcsCisgICAgICAgICAgICAgICAgY2hhbmdpbmdEaXNhcHBlYXJpbmdDQi5pc0NoZWNrZWQoKSA/CisgICAgICAgICAgICAgICAgKGN1c3RvbUFuaW1DQi5pc0NoZWNrZWQoKSA/IGN1c3RvbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltKSA6IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDdXN0b21BbmltYXRpb25zKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbikgeworICAgICAgICAvLyBDaGFuZ2luZyB3aGlsZSBBZGRpbmcKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZoTGVmdCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoImxlZnQiLCAwLCAxKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZoVG9wID0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludCgidG9wIiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFJpZ2h0ID0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludCgicmlnaHQiLCAwLCAxKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZoQm90dG9tID0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludCgiYm90dG9tIiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFNjYWxlWCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgic2NhbGVYIiwgMWYsIDBmLCAxZik7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFNjYWxlWSA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgic2NhbGVZIiwgMWYsIDBmLCAxZik7CisgICAgICAgIGN1c3RvbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20sIHB2aFNjYWxlWCwgcHZoU2NhbGVZKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORykpOworICAgICAgICBjdXN0b21DaGFuZ2luZ0FwcGVhcmluZ0FuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFNjYWxlWCgxZik7CisgICAgICAgICAgICAgICAgdmlldy5zZXRTY2FsZVkoMWYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBDaGFuZ2luZyB3aGlsZSBSZW1vdmluZworICAgICAgICBLZXlmcmFtZSBrZjAgPSBLZXlmcmFtZS5vZkZsb2F0KDBmLCAwZik7CisgICAgICAgIEtleWZyYW1lIGtmMSA9IEtleWZyYW1lLm9mRmxvYXQoLjk5OTlmLCAzNjBmKTsKKyAgICAgICAgS2V5ZnJhbWUga2YyID0gS2V5ZnJhbWUub2ZGbG9hdCgxZiwgMGYpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhSb3RhdGlvbiA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZLZXlmcmFtZSgicm90YXRpb24iLCBrZjAsIGtmMSwga2YyKTsKKyAgICAgICAgY3VzdG9tQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZQcm9wZXJ0eVZhbHVlc0hvbGRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHB2aExlZnQsIHB2aFRvcCwgcHZoUmlnaHQsIHB2aEJvdHRvbSwgcHZoUm90YXRpb24pLgorICAgICAgICAgICAgICAgIHNldER1cmF0aW9uKHRyYW5zaXRpb24uZ2V0RHVyYXRpb24oTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfRElTQVBQRUFSSU5HKSk7CisgICAgICAgIGN1c3RvbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Um90YXRpb24oMGYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBBZGRpbmcKKyAgICAgICAgY3VzdG9tQXBwZWFyaW5nQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobnVsbCwgInJvdGF0aW9uWSIsIDkwZiwgMGYpLgorICAgICAgICAgICAgICAgIHNldER1cmF0aW9uKHRyYW5zaXRpb24uZ2V0RHVyYXRpb24oTGF5b3V0VHJhbnNpdGlvbi5BUFBFQVJJTkcpKTsKKyAgICAgICAgY3VzdG9tQXBwZWFyaW5nQW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Um90YXRpb25ZKDBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gUmVtb3ZpbmcKKyAgICAgICAgY3VzdG9tRGlzYXBwZWFyaW5nQW5pbSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobnVsbCwgInJvdGF0aW9uWCIsIDBmLCA5MGYpLgorICAgICAgICAgICAgICAgIHNldER1cmF0aW9uKHRyYW5zaXRpb24uZ2V0RHVyYXRpb24oTGF5b3V0VHJhbnNpdGlvbi5ESVNBUFBFQVJJTkcpKTsKKyAgICAgICAgY3VzdG9tRGlzYXBwZWFyaW5nQW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Um90YXRpb25YKDBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnNCeURlZmF1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I5YjUxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHRoZSBhbmltYXRlTGF5b3V0Q2hhbmdlcyB0YWcgaW4gWE1MIHRvIGF1dG9tYXRlCisgKiB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgYXMgaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBvciBhZGRlZCB0byBhIGNvbnRhaW5lci4KKyAqLworcHVibGljIGNsYXNzIExheW91dEFuaW1hdGlvbnNCeURlZmF1bHQgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGludCBudW1CdXR0b25zID0gMTsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGF5b3V0X2FuaW1hdGlvbnNfYnlfZGVmYXVsdCk7CisKKyAgICAgICAgZmluYWwgVmlld0dyb3VwIGhvcml6b250YWxDb250YWluZXIgPSAoVmlld0dyb3VwKSBmaW5kVmlld0J5SWQoUi5pZC5ob3Jpem9udGFsQ29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwIHZlcnRpY2FsQ29udGFpbmVyID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKFIuaWQudmVydGljYWxDb250YWluZXIpOworCisgICAgICAgIEJ1dHRvbiBhZGRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5hZGROZXdCdXR0b24pOworICAgICAgICBhZGRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24oTGF5b3V0QW5pbWF0aW9uc0J5RGVmYXVsdC50aGlzKTsKKyAgICAgICAgICAgICAgICBuZXdCdXR0b24uc2V0VGV4dCgiQ2xpY2sgVG8gUmVtb3ZlICIgKyAobnVtQnV0dG9ucysrKSk7CisgICAgICAgICAgICAgICAgbmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsQ29udGFpbmVyLnJlbW92ZVZpZXcodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBob3Jpem9udGFsQ29udGFpbmVyLmFkZFZpZXcobmV3QnV0dG9uLCBNYXRoLm1pbigxLCBob3Jpem9udGFsQ29udGFpbmVyLmdldENoaWxkQ291bnQoKSkpOworCisgICAgICAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihMYXlvdXRBbmltYXRpb25zQnlEZWZhdWx0LnRoaXMpOworICAgICAgICAgICAgICAgIG5ld0J1dHRvbi5zZXRUZXh0KCJDbGljayBUbyBSZW1vdmUgIiArIChudW1CdXR0b25zKyspKTsKKyAgICAgICAgICAgICAgICBuZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsQ29udGFpbmVyLnJlbW92ZVZpZXcodik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB2ZXJ0aWNhbENvbnRhaW5lci5hZGRWaWV3KG5ld0J1dHRvbiwgTWF0aC5taW4oMSwgdmVydGljYWxDb250YWluZXIuZ2V0Q2hpbGRDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGF5b3V0QW5pbWF0aW9uc0hpZGVTaG93LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnNIaWRlU2hvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTdiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xheW91dEFuaW1hdGlvbnNIaWRlU2hvdy5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgTGF5b3V0VHJhbnNpdGlvbiB0byBhdXRvbWF0ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMKKyAqIGFzIGl0ZW1zIGFyZSBoaWRkZW4gb3Igc2hvd24gaW4gYSBjb250YWluZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRBbmltYXRpb25zSGlkZVNob3cgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGludCBudW1CdXR0b25zID0gMTsKKyAgICBWaWV3R3JvdXAgY29udGFpbmVyID0gbnVsbDsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxheW91dF9hbmltYXRpb25zX2hpZGVzaG93KTsKKworICAgICAgICBmaW5hbCBDaGVja0JveCBoaWRlR29uZUNCID0gKENoZWNrQm94KSBmaW5kVmlld0J5SWQoUi5pZC5oaWRlR29uZUNCKTsKKworICAgICAgICBjb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0UGFyYW1zKG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisKKyAgICAgICAgLy8gQWRkIGEgc2xldyBvZiBidXR0b25zIHRvIHRoZSBjb250YWluZXIuIFdlIHdvbid0IGFkZCBhbnkgbW9yZSBidXR0b25zIGF0IHJ1bnRpbWUsIGJ1dAorICAgICAgICAvLyB3aWxsIGp1c3Qgc2hvdy9oaWRlIHRoZSBidXR0b25zIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgQnV0dG9uIG5ld0J1dHRvbiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgICAgICBuZXdCdXR0b24uc2V0VGV4dCgiQ2xpY2sgdG8gSGlkZSAiICsgaSk7CisgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhuZXdCdXR0b24pOworICAgICAgICAgICAgbmV3QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KGhpZGVHb25lQ0IuaXNDaGVja2VkKCkgPyBWaWV3LkdPTkUgOiBWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uZXIgPSBuZXcgTGF5b3V0VHJhbnNpdGlvbigpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0VHJhbnNpdGlvbih0cmFuc2l0aW9uZXIpOworCisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQgPSAoVmlld0dyb3VwKSBmaW5kVmlld0J5SWQoUi5pZC5wYXJlbnQpOworICAgICAgICBwYXJlbnQuYWRkVmlldyhjb250YWluZXIpOworCisgICAgICAgIEJ1dHRvbiBhZGRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5hZGROZXdCdXR0b24pOworICAgICAgICBhZGRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpIGNvbnRhaW5lci5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIENoZWNrQm94IGN1c3RvbUFuaW1DQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tQW5pbUNCKTsKKyAgICAgICAgY3VzdG9tQW5pbUNCLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HLCAzMCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci5zZXRTdGFnZ2VyKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0RJU0FQUEVBUklORywgMzApOworICAgICAgICAgICAgICAgICAgICBzZXR1cEFuaW1hdGlvbnModHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSA1MDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfQVBQRUFSSU5HLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldFN0YWdnZXIoTGF5b3V0VHJhbnNpdGlvbi5DSEFOR0VfRElTQVBQRUFSSU5HLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDMwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvbmVyLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQW5pbWF0aW9ucyhMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgLy8gQ2hhbmdpbmcgd2hpbGUgQWRkaW5nCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aExlZnQgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mSW50KCJsZWZ0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFRvcCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInRvcCIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhSaWdodCA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoInJpZ2h0IiwgMCwgMSk7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEJvdHRvbSA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQoImJvdHRvbSIsIDAsIDEpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVggPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWCIsIDFmLCAwZiwgMWYpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhTY2FsZVkgPQorICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInNjYWxlWSIsIDFmLCAwZiwgMWYpOworICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBjaGFuZ2VJbiA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20sIHB2aFNjYWxlWCwgcHZoU2NhbGVZKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORykpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQ0hBTkdFX0FQUEVBUklORywgY2hhbmdlSW4pOworICAgICAgICBjaGFuZ2VJbi5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0U2NhbGVYKDFmKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFNjYWxlWSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIENoYW5naW5nIHdoaWxlIFJlbW92aW5nCisgICAgICAgIEtleWZyYW1lIGtmMCA9IEtleWZyYW1lLm9mRmxvYXQoMGYsIDBmKTsKKyAgICAgICAgS2V5ZnJhbWUga2YxID0gS2V5ZnJhbWUub2ZGbG9hdCguOTk5OWYsIDM2MGYpOworICAgICAgICBLZXlmcmFtZSBrZjIgPSBLZXlmcmFtZS5vZkZsb2F0KDFmLCAwZik7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFJvdGF0aW9uID0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZktleWZyYW1lKCJyb3RhdGlvbiIsIGtmMCwga2YxLCBrZjIpOworICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBjaGFuZ2VPdXQgPSBPYmplY3RBbmltYXRvci5vZlByb3BlcnR5VmFsdWVzSG9sZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcHZoTGVmdCwgcHZoVG9wLCBwdmhSaWdodCwgcHZoQm90dG9tLCBwdmhSb3RhdGlvbikuCisgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24odHJhbnNpdGlvbi5nZXREdXJhdGlvbihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcpKTsKKyAgICAgICAgdHJhbnNpdGlvbi5zZXRBbmltYXRvcihMYXlvdXRUcmFuc2l0aW9uLkNIQU5HRV9ESVNBUFBFQVJJTkcsIGNoYW5nZU91dCk7CisgICAgICAgIGNoYW5nZU91dC5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgVmlldyB2aWV3ID0gKFZpZXcpICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0Um90YXRpb24oMGYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBBZGRpbmcKKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbUluID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChudWxsLCAicm90YXRpb25ZIiwgOTBmLCAwZikuCisgICAgICAgICAgICAgICAgc2V0RHVyYXRpb24odHJhbnNpdGlvbi5nZXREdXJhdGlvbihMYXlvdXRUcmFuc2l0aW9uLkFQUEVBUklORykpOworICAgICAgICB0cmFuc2l0aW9uLnNldEFuaW1hdG9yKExheW91dFRyYW5zaXRpb24uQVBQRUFSSU5HLCBhbmltSW4pOworICAgICAgICBhbmltSW4uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWSgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFJlbW92aW5nCisgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW1PdXQgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG51bGwsICJyb3RhdGlvblgiLCAwZiwgOTBmKS4KKyAgICAgICAgICAgICAgICBzZXREdXJhdGlvbih0cmFuc2l0aW9uLmdldER1cmF0aW9uKExheW91dFRyYW5zaXRpb24uRElTQVBQRUFSSU5HKSk7CisgICAgICAgIHRyYW5zaXRpb24uc2V0QW5pbWF0b3IoTGF5b3V0VHJhbnNpdGlvbi5ESVNBUFBFQVJJTkcsIGFuaW1PdXQpOworICAgICAgICBhbmltSW4uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5nZXRUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB2aWV3LnNldFJvdGF0aW9uWCgwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGlzdEZsaXBwZXIuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTGlzdEZsaXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2MwM2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MaXN0RmxpcHBlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIFZhbHVlQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTGlzdEZsaXBwZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSAxNTAwOworICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1RfU1RSSU5HU19FTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiT25lIiwKKyAgICAgICAgICAgICJUd28iLAorICAgICAgICAgICAgIlRocmVlIiwKKyAgICAgICAgICAgICJGb3VyIiwKKyAgICAgICAgICAgICJGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUX1NUUklOR1NfRlIgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIlVuIiwKKyAgICAgICAgICAgICJEZXV4IiwKKyAgICAgICAgICAgICJUcm9pcyIsCisgICAgICAgICAgICAiUXVhdHJlIiwKKyAgICAgICAgICAgICJMZSBGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKworICAgIExpc3RWaWV3IG1FbmdsaXNoTGlzdDsKKyAgICBMaXN0VmlldyBtRnJlbmNoTGlzdDsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJvdGF0aW5nX2xpc3QpOworICAgICAgICAvL0ZyYW1lTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIG1FbmdsaXNoTGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdF9lbik7CisgICAgICAgIG1GcmVuY2hMaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0X2ZyKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBMaXN0VmlldworICAgICAgICBmaW5hbCBBcnJheUFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyRW4gPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgTElTVF9TVFJJTkdTX0VOKTsKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgTGlzdFZpZXcKKyAgICAgICAgZmluYWwgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlckZyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIExJU1RfU1RSSU5HU19GUik7CisKKyAgICAgICAgbUVuZ2xpc2hMaXN0LnNldEFkYXB0ZXIoYWRhcHRlckVuKTsKKyAgICAgICAgbUZyZW5jaExpc3Quc2V0QWRhcHRlcihhZGFwdGVyRnIpOworICAgICAgICBtRnJlbmNoTGlzdC5zZXRSb3RhdGlvblkoLTkwZik7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGZsaXBpdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBhY2NlbGVyYXRvciA9IG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgZGVjZWxlcmF0b3IgPSBuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgdm9pZCBmbGlwaXQoKSB7CisgICAgICAgIGZpbmFsIExpc3RWaWV3IHZpc2libGVMaXN0OworICAgICAgICBmaW5hbCBMaXN0VmlldyBpbnZpc2libGVMaXN0OworICAgICAgICBpZiAobUVuZ2xpc2hMaXN0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgIHZpc2libGVMaXN0ID0gbUZyZW5jaExpc3Q7CisgICAgICAgICAgICBpbnZpc2libGVMaXN0ID0gbUVuZ2xpc2hMaXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52aXNpYmxlTGlzdCA9IG1GcmVuY2hMaXN0OworICAgICAgICAgICAgdmlzaWJsZUxpc3QgPSBtRW5nbGlzaExpc3Q7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgdmlzVG9JbnZpcyA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQodmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLCAwZiwgOTBmKTsKKyAgICAgICAgdmlzVG9JbnZpcy5zZXREdXJhdGlvbig1MDApOworICAgICAgICB2aXNUb0ludmlzLnNldEludGVycG9sYXRvcihhY2NlbGVyYXRvcik7CisgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGludmlzVG9WaXMgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGludmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLAorICAgICAgICAgICAgICAgIC05MGYsIDBmKTsKKyAgICAgICAgaW52aXNUb1Zpcy5zZXREdXJhdGlvbig1MDApOworICAgICAgICBpbnZpc1RvVmlzLnNldEludGVycG9sYXRvcihkZWNlbGVyYXRvcik7CisgICAgICAgIHZpc1RvSW52aXMuYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltKSB7CisgICAgICAgICAgICAgICAgdmlzaWJsZUxpc3Quc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGludmlzVG9WaXMuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVMaXN0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHZpc1RvSW52aXMuc3RhcnQoKTsKKyAgICB9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9NdWx0aVByb3BlcnR5QW5pbWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhZjAzZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uKjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5Cb3VuY2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIFZhbHVlQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEVVJBVElPTiA9IDE1MDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eSk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUFuaW1hdGlvblZpZXcgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBCQUxMX1NJWkUgPSAxMDBmOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3JTZXQgYW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgQW5pbWF0b3IgYm91bmNlQW5pbSA9IG51bGw7CisgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGFkZEJhbGwoNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgxNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgyNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgzNTAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChib3VuY2VBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTaGFwZUhvbGRlciBiYWxsOworICAgICAgICAgICAgICAgIGJhbGwgPSBiYWxscy5nZXQoMCk7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeUJvdW5jZXIgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIEJBTExfU0laRSkuc2V0RHVyYXRpb24oRFVSQVRJT04pOworICAgICAgICAgICAgICAgIHlCb3VuY2VyLnNldEludGVycG9sYXRvcihuZXcgQm91bmNlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgIHlCb3VuY2VyLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAgICAgYmFsbCA9IGJhbGxzLmdldCgxKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhZID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgieSIsIGJhbGwuZ2V0WSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgLSBCQUxMX1NJWkUpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEFscGhhID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgiYWxwaGEiLCAxLjBmLCAwZik7CisgICAgICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgeUFscGhhQm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2aFksIHB2aEFscGhhKS5zZXREdXJhdGlvbihEVVJBVElPTi8yKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHlBbHBoYUJvdW5jZXIuc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworCisKKyAgICAgICAgICAgICAgICBiYWxsID0gYmFsbHMuZ2V0KDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFcgPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJ3aWR0aCIsIGJhbGwuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0V2lkdGgoKSAqIDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEggPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJoZWlnaHQiLCBiYWxsLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFsbC5nZXRIZWlnaHQoKSAqIDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2VFggPSBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KCJ4IiwgYmFsbC5nZXRYKCksCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFgoKSAtIEJBTExfU0laRS8yZik7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZUWSA9IFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInkiLCBiYWxsLmdldFkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpIC0gQkFMTF9TSVpFLzJmKTsKKyAgICAgICAgICAgICAgICBPYmplY3RBbmltYXRvciB3aHh5Qm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwgcHZoVywgcHZoSCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2VFgsIHB2VFkpLnNldER1cmF0aW9uKERVUkFUSU9OLzIpOworICAgICAgICAgICAgICAgIHdoeHlCb3VuY2VyLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHdoeHlCb3VuY2VyLnNldFJlcGVhdE1vZGUoVmFsdWVBbmltYXRvci5SRVZFUlNFKTsKKworICAgICAgICAgICAgICAgIGJhbGwgPSBiYWxscy5nZXQoMyk7CisgICAgICAgICAgICAgICAgcHZoWSA9IFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQoInkiLCBiYWxsLmdldFkoKSwgZ2V0SGVpZ2h0KCkgLSBCQUxMX1NJWkUpOworICAgICAgICAgICAgICAgIGZsb2F0IGJhbGxYID0gYmFsbC5nZXRYKCk7CisgICAgICAgICAgICAgICAgS2V5ZnJhbWUga2YwID0gS2V5ZnJhbWUub2ZGbG9hdCgwZiwgYmFsbFgpOworICAgICAgICAgICAgICAgIEtleWZyYW1lIGtmMSA9IEtleWZyYW1lLm9mRmxvYXQoLjVmLCBiYWxsWCArIDEwMGYpOworICAgICAgICAgICAgICAgIEtleWZyYW1lIGtmMiA9IEtleWZyYW1lLm9mRmxvYXQoMWYsIGJhbGxYICsgNTBmKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhYID0gUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZLZXlmcmFtZSgieCIsIGtmMCwga2YxLCBrZjIpOworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHl4Qm91bmNlciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoYmFsbCwgcHZoWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB2aFgpLnNldER1cmF0aW9uKERVUkFUSU9OLzIpOworICAgICAgICAgICAgICAgIHl4Qm91bmNlci5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgICAgICB5eEJvdW5jZXIuc2V0UmVwZWF0TW9kZShWYWx1ZUFuaW1hdG9yLlJFVkVSU0UpOworCisKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICAgICAgICAgICAgKChBbmltYXRvclNldClib3VuY2VBbmltKS5wbGF5VG9nZXRoZXIoeUJvdW5jZXIsIHlBbHBoYUJvdW5jZXIsIHdoeHlCb3VuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgeXhCb3VuY2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGFkZEJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoQkFMTF9TSVpFLCBCQUxMX1NJWkUpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHgpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5KTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmb3IgKFNoYXBlSG9sZGVyIGJhbGwgOiBiYWxscykgeworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWJhbGwuZ2V0WCgpLCAtYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vUmV2ZXJzaW5nQW5pbWF0aW9uLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1JldmVyc2luZ0FuaW1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWY2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1JldmVyc2luZ0FuaW1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworcHVibGljIGNsYXNzIFJldmVyc2luZ0FuaW1hdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYW5pbWF0aW9uX3JldmVyc2luZyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBmaW5hbCBNeUFuaW1hdGlvblZpZXcgYW5pbVZpZXcgPSBuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhhbmltVmlldyk7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQnV0dG9uIHJldmVyc2VyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQucmV2ZXJzZUJ1dHRvbik7CisgICAgICAgIHJldmVyc2VyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnJldmVyc2VBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBWYWx1ZUFuaW1hdG9yIGJvdW5jZUFuaW0gPSBudWxsOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gY3JlYXRlQmFsbCgyNSwgMjUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChib3VuY2VBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChiYWxsLCAieSIsIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIDUwZikuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXREdXJhdGlvbigxNTAwKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigyZikpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5yZXZlcnNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgc2Vla1RpbWUpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zZXRDdXJyZW50UGxheVRpbWUoc2Vla1RpbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBjcmVhdGVCYWxsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIE92YWxTaGFwZSBjaXJjbGUgPSBuZXcgT3ZhbFNoYXBlKCk7CisgICAgICAgICAgICBjaXJjbGUucmVzaXplKDUwZiwgNTBmKTsKKyAgICAgICAgICAgIFNoYXBlRHJhd2FibGUgZHJhd2FibGUgPSBuZXcgU2hhcGVEcmF3YWJsZShjaXJjbGUpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgc2hhcGVIb2xkZXIgPSBuZXcgU2hhcGVIb2xkZXIoZHJhd2FibGUpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WCh4IC0gMjVmKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFkoeSAtIDI1Zik7CisgICAgICAgICAgICBpbnQgcmVkID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgZ3JlZW4gPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBibHVlID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgY29sb3IgPSAweGZmMDAwMDAwIHwgcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBQYWludCBwYWludCA9IGRyYXdhYmxlLmdldFBhaW50KCk7IC8vbmV3IFBhaW50KFBhaW50LkFOVElfQUxJQVNfRkxBRyk7CisgICAgICAgICAgICBpbnQgZGFya0NvbG9yID0gMHhmZjAwMDAwMCB8IHJlZC80IDw8IDE2IHwgZ3JlZW4vNCA8PCA4IHwgYmx1ZS80OworICAgICAgICAgICAgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQgPSBuZXcgUmFkaWFsR3JhZGllbnQoMzcuNWYsIDEyLjVmLAorICAgICAgICAgICAgICAgICAgICA1MGYsIGNvbG9yLCBkYXJrQ29sb3IsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBwYWludC5zZXRTaGFkZXIoZ3JhZGllbnQpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0UGFpbnQocGFpbnQpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgYmFsbC5nZXRTaGFwZSgpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDA2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1NoYXBlSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCisvKioKKyAqIEEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhIFNoYXBlIGFuZCB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUKKyAqIGhvdyB0aGUgc2hhcGUgaXMgZHJhd24uCisgKi8KK3B1YmxpYyBjbGFzcyBTaGFwZUhvbGRlciB7CisgICAgcHJpdmF0ZSBmbG9hdCB4ID0gMCwgeSA9IDA7CisgICAgcHJpdmF0ZSBTaGFwZURyYXdhYmxlIHNoYXBlOworICAgIHByaXZhdGUgaW50IGNvbG9yOworICAgIHByaXZhdGUgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQ7CisgICAgcHJpdmF0ZSBmbG9hdCBhbHBoYSA9IDFmOworICAgIHByaXZhdGUgUGFpbnQgcGFpbnQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludChQYWludCB2YWx1ZSkgeworICAgICAgICBwYWludCA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgUGFpbnQgZ2V0UGFpbnQoKSB7CisgICAgICAgIHJldHVybiBwYWludDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHggPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHkgPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIGZsb2F0IGdldFkoKSB7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTaGFwZShTaGFwZURyYXdhYmxlIHZhbHVlKSB7CisgICAgICAgIHNoYXBlID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBTaGFwZURyYXdhYmxlIGdldFNoYXBlKCkgeworICAgICAgICByZXR1cm4gc2hhcGU7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0Q29sb3IoKSB7CisgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IHZhbHVlKSB7CisgICAgICAgIHNoYXBlLmdldFBhaW50KCkuc2V0Q29sb3IodmFsdWUpOworICAgICAgICBjb2xvciA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRHcmFkaWVudChSYWRpYWxHcmFkaWVudCB2YWx1ZSkgeworICAgICAgICBncmFkaWVudCA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgUmFkaWFsR3JhZGllbnQgZ2V0R3JhZGllbnQoKSB7CisgICAgICAgIHJldHVybiBncmFkaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICB0aGlzLmFscGhhID0gYWxwaGE7CisgICAgICAgIHNoYXBlLnNldEFscGhhKChpbnQpKChhbHBoYSAqIDI1NWYpICsgLjVmKSk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gc2hhcGUuZ2V0U2hhcGUoKS5nZXRXaWR0aCgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChmbG9hdCB3aWR0aCkgeworICAgICAgICBTaGFwZSBzID0gc2hhcGUuZ2V0U2hhcGUoKTsKKyAgICAgICAgcy5yZXNpemUod2lkdGgsIHMuZ2V0SGVpZ2h0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBzaGFwZS5nZXRTaGFwZSgpLmdldEhlaWdodCgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoZmxvYXQgaGVpZ2h0KSB7CisgICAgICAgIFNoYXBlIHMgPSBzaGFwZS5nZXRTaGFwZSgpOworICAgICAgICBzLnJlc2l6ZShzLmdldFdpZHRoKCksIGhlaWdodCk7CisgICAgfQorCisgICAgcHVibGljIFNoYXBlSG9sZGVyKFNoYXBlRHJhd2FibGUgcykgeworICAgICAgICBzaGFwZSA9IHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJEaXNwbGF5T3B0aW9ucy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJEaXNwbGF5T3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODVjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhckRpc3BsYXlPcHRpb25zLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworCisvKioKKyAqIFRoaXMgZGVtbyBzaG93cyBob3cgdmFyaW91cyBhY3Rpb24gYmFyIGRpc3BsYXkgb3B0aW9uIGZsYWdzIGNhbiBiZSBjb21iaW5lZCBhbmQgdGhlaXIgZWZmZWN0cy4KKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhckRpc3BsYXlPcHRpb25zIGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciwgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjdGlvbl9iYXJfZGlzcGxheV9vcHRpb25zKTsKKworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC50b2dnbGVfaG9tZV9hc191cCkuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC50b2dnbGVfc2hvd19ob21lKS5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLnRvZ2dsZV91c2VfbG9nbykuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC50b2dnbGVfc2hvd190aXRsZSkuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC50b2dnbGVfc2hvd19jdXN0b20pLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQudG9nZ2xlX25hdmlnYXRpb24pLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuY3ljbGVfY3VzdG9tX2dyYXZpdHkpLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBtQ3VzdG9tVmlldyA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX2Rpc3BsYXlfb3B0aW9uc19jdXN0b20sIG51bGwpOworICAgICAgICAvLyBDb25maWd1cmUgc2V2ZXJhbCBhY3Rpb24gYmFyIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSB0b2dnbGVkIGJ5IGRpc3BsYXkgb3B0aW9ucy4KKyAgICAgICAgZmluYWwgQWN0aW9uQmFyIGJhciA9IGdldEFjdGlvbkJhcigpOworICAgICAgICBiYXIuc2V0Q3VzdG9tVmlldyhtQ3VzdG9tVmlldywKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uQmFyLkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisKKyAgICAgICAgYmFyLmFkZFRhYihiYXIubmV3VGFiKCkuc2V0VGV4dCgiVGFiIDEiKS5zZXRUYWJMaXN0ZW5lcih0aGlzKSk7CisgICAgICAgIGJhci5hZGRUYWIoYmFyLm5ld1RhYigpLnNldFRleHQoIlRhYiAyIikuc2V0VGFiTGlzdGVuZXIodGhpcykpOworICAgICAgICBiYXIuYWRkVGFiKGJhci5uZXdUYWIoKS5zZXRUZXh0KCJUYWIgMyIpLnNldFRhYkxpc3RlbmVyKHRoaXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5kaXNwbGF5X29wdGlvbnNfYWN0aW9ucywgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBiYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgc3dpdGNoICh2LmdldElkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC50b2dnbGVfaG9tZV9hc191cDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IEFjdGlvbkJhci5ESVNQTEFZX0hPTUVfQVNfVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX3Nob3dfaG9tZToKKyAgICAgICAgICAgICAgICBmbGFncyA9IEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfSE9NRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUi5pZC50b2dnbGVfdXNlX2xvZ286CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUi5pZC50b2dnbGVfc2hvd190aXRsZToKKyAgICAgICAgICAgICAgICBmbGFncyA9IEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFIuaWQudG9nZ2xlX3Nob3dfY3VzdG9tOgorICAgICAgICAgICAgICAgIGZsYWdzID0gQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19DVVNUT007CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUi5pZC50b2dnbGVfbmF2aWdhdGlvbjoKKyAgICAgICAgICAgICAgICBiYXIuc2V0TmF2aWdhdGlvbk1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBiYXIuZ2V0TmF2aWdhdGlvbk1vZGUoKSA9PSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBSLmlkLmN5Y2xlX2N1c3RvbV9ncmF2aXR5OgorICAgICAgICAgICAgICAgIEFjdGlvbkJhci5MYXlvdXRQYXJhbXMgbHAgPSAoQWN0aW9uQmFyLkxheW91dFBhcmFtcykgbUN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IG5ld0dyYXZpdHkgPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAobHAuZ3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdHcmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUw6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdHcmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuUklHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdHcmF2aXR5ID0gR3Jhdml0eS5MRUZUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBscC5ncmF2aXR5ICYgfkdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0sgfCBuZXdHcmF2aXR5OworICAgICAgICAgICAgICAgIGJhci5zZXRDdXN0b21WaWV3KG1DdXN0b21WaWV3LCBscCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNoYW5nZSA9IGJhci5nZXREaXNwbGF5T3B0aW9ucygpIF4gZmxhZ3M7CisgICAgICAgIGJhci5zZXREaXNwbGF5T3B0aW9ucyhjaGFuZ2UsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlVuc2VsZWN0ZWQoVGFiIHRhYiwgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGFiUmVzZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJNZWNoYW5pY3MuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyTWVjaGFuaWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3OTc4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyTWVjaGFuaWNzLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIHRoZSBBY3Rpb24gQmFyIGFuZCBob3cgaXQgaW50ZXJvcGVyYXRlcyB3aXRoIHRoZQorICogc3RhbmRhcmQgb3B0aW9ucyBtZW51LiBUaGlzIGRlbW8gaXMgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzIG9ubHk7IHNlZSBBY3Rpb25CYXJVc2FnZSBmb3IKKyAqIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIEFjdGlvbiBCYXIgaW4gYSBtb3JlIGlkaW9tYXRpYyBtYW5uZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJNZWNoYW5pY3MgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIFRoZSBBY3Rpb24gQmFyIGlzIGEgd2luZG93IGZlYXR1cmUuIFRoZSBmZWF0dXJlIG11c3QgYmUgcmVxdWVzdGVkCisgICAgICAgIC8vIGJlZm9yZSBzZXR0aW5nIGEgY29udGVudCB2aWV3LiBOb3JtYWxseSB0aGlzIGlzIHNldCBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGJ5IHlvdXIgQWN0aXZpdHkncyB0aGVtZSBpbiB5b3VyIG1hbmlmZXN0LiBUaGUgcHJvdmlkZWQgc3lzdGVtCisgICAgICAgIC8vIHRoZW1lIFRoZW1lLldpdGhBY3Rpb25CYXIgZW5hYmxlcyB0aGlzIGZvciB5b3UuIFVzZSBpdCBhcyB5b3Ugd291bGQKKyAgICAgICAgLy8gdXNlIFRoZW1lLk5vVGl0bGVCYXIuIFlvdSBjYW4gYWRkIGFuIEFjdGlvbiBCYXIgdG8geW91ciBvd24gdGhlbWVzCisgICAgICAgIC8vIGJ5IGFkZGluZyB0aGUgZWxlbWVudCA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgLy8gdG8geW91ciBzdHlsZSBkZWZpbml0aW9uLgorICAgICAgICBnZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICAvLyBNZW51IGl0ZW1zIGRlZmF1bHQgdG8gbmV2ZXIgc2hvdyBpbiB0aGUgYWN0aW9uIGJhci4gT24gbW9zdCBkZXZpY2VzIHRoaXMgbWVhbnMKKyAgICAgICAgLy8gdGhleSB3aWxsIHNob3cgaW4gdGhlIHN0YW5kYXJkIG9wdGlvbnMgbWVudSBwYW5lbCB3aGVuIHRoZSBtZW51IGJ1dHRvbiBpcyBwcmVzc2VkLgorICAgICAgICAvLyBPbiB4bGFyZ2Utc2NyZWVuIGRldmljZXMgYSAiTW9yZSIgYnV0dG9uIHdpbGwgYXBwZWFyIGluIHRoZSBmYXIgcmlnaHQgb2YgdGhlCisgICAgICAgIC8vIEFjdGlvbiBCYXIgdGhhdCB3aWxsIGRpc3BsYXkgcmVtYWluaW5nIGl0ZW1zIGluIGEgY2FzY2FkaW5nIG1lbnUuCisgICAgICAgIG1lbnUuYWRkKCJOb3JtYWwgaXRlbSIpOworCisgICAgICAgIE1lbnVJdGVtIGFjdGlvbkl0ZW0gPSBtZW51LmFkZCgiQWN0aW9uIEJ1dHRvbiIpOworCisgICAgICAgIC8vIEl0ZW1zIHRoYXQgc2hvdyBhcyBhY3Rpb25zIHNob3VsZCBmYXZvciB0aGUgImlmIHJvb20iIHNldHRpbmcsIHdoaWNoIHdpbGwKKyAgICAgICAgLy8gcHJldmVudCB0b28gbWFueSBidXR0b25zIGZyb20gY3Jvd2RpbmcgdGhlIGJhci4gRXh0cmEgaXRlbXMgd2lsbCBzaG93IGluIHRoZQorICAgICAgICAvLyBvdmVyZmxvdyBhcmVhLgorICAgICAgICBhY3Rpb25JdGVtLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKworICAgICAgICAvLyBJdGVtcyB0aGF0IHNob3cgYXMgYWN0aW9ucyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgYW4gaWNvbi4KKyAgICAgICAgLy8gVGhlc2UgaWNvbnMgYXJlIHNob3duIHdpdGhvdXQgYSB0ZXh0IGRlc2NyaXB0aW9uLCBhbmQgdGhlcmVmb3JlIHNob3VsZAorICAgICAgICAvLyBiZSBzdWZmaWNpZW50bHkgZGVzY3JpcHRpdmUgb24gdGhlaXIgb3duLgorICAgICAgICBhY3Rpb25JdGVtLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfc2hhcmUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJTZWxlY3RlZCBJdGVtOiAiICsgaXRlbS5nZXRUaXRsZSgpLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJUYWJzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhclRhYnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdiZjUxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJUYWJzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisvKioKKyAqIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYWN0aW9uIGJhciB0YWJzIGFuZCBob3cgdGhleSBpbnRlcmFjdAorICogd2l0aCBvdGhlciBhY3Rpb24gYmFyIGZlYXR1cmVzLgorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyVGFicyBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWN0aW9uX2Jhcl90YWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFkZFRhYihWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgQWN0aW9uQmFyIGJhciA9IGdldEFjdGlvbkJhcigpOworICAgICAgICBmaW5hbCBpbnQgdGFiQ291bnQgPSBiYXIuZ2V0VGFiQ291bnQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSAiVGFiICIgKyB0YWJDb3VudDsKKyAgICAgICAgYmFyLmFkZFRhYihiYXIubmV3VGFiKCkKKyAgICAgICAgICAgICAgICAuc2V0VGV4dCh0ZXh0KQorICAgICAgICAgICAgICAgIC5zZXRUYWJMaXN0ZW5lcihuZXcgVGFiTGlzdGVuZXIobmV3IFRhYkNvbnRlbnRGcmFnbWVudCh0ZXh0KSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJlbW92ZVRhYihWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgQWN0aW9uQmFyIGJhciA9IGdldEFjdGlvbkJhcigpOworICAgICAgICBiYXIucmVtb3ZlVGFiQXQoYmFyLmdldFRhYkNvdW50KCkgLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRvZ2dsZVRhYnMoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBiYXIgPSBnZXRBY3Rpb25CYXIoKTsKKworICAgICAgICBpZiAoYmFyLmdldE5hdmlnYXRpb25Nb2RlKCkgPT0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTKSB7CisgICAgICAgICAgICBiYXIuc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgICAgICBiYXIuc2V0RGlzcGxheU9wdGlvbnMoQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSwgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXIuc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTKTsKKyAgICAgICAgICAgIGJhci5zZXREaXNwbGF5T3B0aW9ucygwLCBBY3Rpb25CYXIuRElTUExBWV9TSE9XX1RJVExFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3ZlQWxsVGFicyhWaWV3IHYpIHsKKyAgICAgICAgZ2V0QWN0aW9uQmFyKCkucmVtb3ZlQWxsVGFicygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgVGFiTGlzdGVuZXIgcmVjZWl2ZXMgZXZlbnQgY2FsbGJhY2tzIGZyb20gdGhlIGFjdGlvbiBiYXIgYXMgdGFicworICAgICAqIGFyZSBkZXNlbGVjdGVkLCBzZWxlY3RlZCwgYW5kIHJlc2VsZWN0ZWQuIEEgRnJhZ21lbnRUcmFuc2FjdGlvbgorICAgICAqIGlzIHByb3ZpZGVkIHRvIGVhY2ggb2YgdGhlc2UgY2FsbGJhY2tzOyBpZiBhbnkgb3BlcmF0aW9ucyBhcmUgYWRkZWQKKyAgICAgKiB0byBpdCwgaXQgd2lsbCBiZSBjb21taXR0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZnVsbCB0YWIgc3dpdGNoIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGxldHMgdGFiIHN3aXRjaGVzIGJlIGF0b21pYyB3aXRob3V0IHRoZSBhcHAgbmVlZGluZyB0byB0cmFjaworICAgICAqIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBkaWZmZXJlbnQgdGFicy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFRhYkxpc3RlbmVyIGltcGxlbWVudHMgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBUYWJDb250ZW50RnJhZ21lbnQgbUZyYWdtZW50OworCisgICAgICAgIHB1YmxpYyBUYWJMaXN0ZW5lcihUYWJDb250ZW50RnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJTZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KSB7CisgICAgICAgICAgICBmdC5hZGQoUi5pZC5mcmFnbWVudF9jb250ZW50LCBtRnJhZ21lbnQsIG1GcmFnbWVudC5nZXRUZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJVbnNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgICAgIGZ0LnJlbW92ZShtRnJhZ21lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UYWJSZXNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KEFjdGlvbkJhclRhYnMudGhpcywgIlJlc2VsZWN0ZWQhIiwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVGFiQ29udGVudEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGV4dDsKKworICAgICAgICBwdWJsaWMgVGFiQ29udGVudEZyYWdtZW50KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgZnJhZ1ZpZXcgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGFiX2NvbnRlbnQsIGNvbnRhaW5lciwgZmFsc2UpOworCisgICAgICAgICAgICBUZXh0VmlldyB0ZXh0ID0gKFRleHRWaWV3KSBmcmFnVmlldy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgIHRleHQuc2V0VGV4dChtVGV4dCk7CisKKyAgICAgICAgICAgIHJldHVybiBmcmFnVmlldzsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJVc2FnZS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJVc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmNkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhclVzYWdlLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldy5PblF1ZXJ5VGV4dExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKKy8qKgorICogVGhpcyBkZW1vbnN0cmF0ZXMgaWRpb21hdGljIHVzYWdlIG9mIHRoZSBBY3Rpb24gQmFyLiBUaGUgZGVmYXVsdCBIb25leWNvbWIgdGhlbWUKKyAqIGluY2x1ZGVzIHRoZSBhY3Rpb24gYmFyIGJ5IGRlZmF1bHQgYW5kIGEgbWVudSByZXNvdXJjZSBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZQorICogbWVudSBkYXRhIGl0c2VsZi4gSWYgeW91J2QgbGlrZSB0byBzZWUgaG93IHRoZXNlIHRoaW5ncyB3b3JrIHVuZGVyIHRoZSBob29kLCBzZWUKKyAqIEFjdGlvbkJhck1lY2hhbmljcy4KKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhclVzYWdlIGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBPblF1ZXJ5VGV4dExpc3RlbmVyIHsKKyAgICBUZXh0VmlldyBtU2VhcmNoVGV4dDsKKyAgICBpbnQgbVNvcnRNb2RlID0gLTE7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1TZWFyY2hUZXh0ID0gbmV3IFRleHRWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtU2VhcmNoVGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51LmFjdGlvbnMsIG1lbnUpOworICAgICAgICBTZWFyY2hWaWV3IHNlYXJjaFZpZXcgPSAoU2VhcmNoVmlldykgbWVudS5maW5kSXRlbShSLmlkLmFjdGlvbl9zZWFyY2gpLmdldEFjdGlvblZpZXcoKTsKKyAgICAgICAgc2VhcmNoVmlldy5zZXRPblF1ZXJ5VGV4dExpc3RlbmVyKHRoaXMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgaWYgKG1Tb3J0TW9kZSAhPSAtMSkgeworICAgICAgICAgICAgRHJhd2FibGUgaWNvbiA9IG1lbnUuZmluZEl0ZW0obVNvcnRNb2RlKS5nZXRJY29uKCk7CisgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQuYWN0aW9uX3NvcnQpLnNldEljb24oaWNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJTZWxlY3RlZCBJdGVtOiAiICsgaXRlbS5nZXRUaXRsZSgpLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVGhpcyBtZXRob2QgaXMgc3BlY2lmaWVkIGFzIGFuIG9uQ2xpY2sgaGFuZGxlciBpbiB0aGUgbWVudSB4bWwgYW5kIHdpbGwKKyAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgQWN0aXZpdHkncyBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQgbWV0aG9kLgorICAgIC8vIFNlZSByZXMvbWVudS9hY3Rpb25zLnhtbCBmb3IgbW9yZSBpbmZvLgorICAgIHB1YmxpYyB2b2lkIG9uU29ydChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIG1Tb3J0TW9kZSA9IGl0ZW0uZ2V0SXRlbUlkKCk7CisgICAgICAgIC8vIFJlcXVlc3QgYSBjYWxsIHRvIG9uUHJlcGFyZU9wdGlvbnNNZW51IHNvIHdlIGNhbiBjaGFuZ2UgdGhlIHNvcnQgaWNvbgorICAgICAgICBpbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGZvciB0aGUgU2VhcmNoVmlldy5PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIKKyAgICAvLyBGb3IgbW9yZSBhYm91dCB1c2luZyBTZWFyY2hWaWV3LCBzZWUgc3JjLy4uLi92aWV3L1NlYXJjaFZpZXcxLmphdmEgYW5kIFNlYXJjaFZpZXcyLmphdmEKKyAgICBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dENoYW5nZShTdHJpbmcgbmV3VGV4dCkgeworICAgICAgICBuZXdUZXh0ID0gbmV3VGV4dC5pc0VtcHR5KCkgPyAiIiA6ICJRdWVyeSBzbyBmYXI6ICIgKyBuZXdUZXh0OworICAgICAgICBtU2VhcmNoVGV4dC5zZXRUZXh0KG5ld1RleHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dFN1Ym1pdChTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIlNlYXJjaGluZyBmb3I6ICIgKyBxdWVyeSArICIuLi4iLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpdml0eVJlY3JlYXRlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGl2aXR5UmVjcmVhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzExMmIzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpdml0eVJlY3JlYXRlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTG9jYWxTZXJ2aWNlQWN0aXZpdGllcy5Db250cm9sbGVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK3B1YmxpYyBjbGFzcyBBY3Rpdml0eVJlY3JlYXRlIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIGludCBtQ3VyVGhlbWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ3VyVGhlbWUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0aGVtZSIpOworCisgICAgICAgICAgICAvLyBTd2l0Y2ggdG8gYSBuZXcgdGhlbWUgZGlmZmVyZW50IGZyb20gbGFzdCB0aGVtZS4KKyAgICAgICAgICAgIHN3aXRjaCAobUN1clRoZW1lKSB7CisgICAgICAgICAgICAgICAgY2FzZSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfSG9sb19MaWdodDoKKyAgICAgICAgICAgICAgICAgICAgbUN1clRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZzoKKyAgICAgICAgICAgICAgICAgICAgbUN1clRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0hvbG87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1DdXJUaGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvX0xpZ2h0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFRoZW1lKG1DdXJUaGVtZSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9yZWNyZWF0ZSk7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnJlY3JlYXRlKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUmVjcmVhdGVMaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2F2ZWRJbnN0YW5jZVN0YXRlLnB1dEludCgidGhlbWUiLCBtQ3VyVGhlbWUpOworICAgIH0KKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1SZWNyZWF0ZUxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHJlY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiYmM0NS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7Ci0KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLkNoZWNrQm94UHJlZmVyZW5jZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKLQotLyoqCi0gKiBFeGFtcGxlIHRoYXQgc2hvd3MgZmluZGluZyBhIHByZWZlcmVuY2UgZnJvbSB0aGUgaGllcmFyY2h5IGFuZCBhIGN1c3RvbSBwcmVmZXJlbmNlIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZHZhbmNlZFByZWZlcmVuY2VzIGV4dGVuZHMgUHJlZmVyZW5jZUFjdGl2aXR5IGltcGxlbWVudHMgT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NWV9QUkVGRVJFTkNFID0gIm15X3ByZWZlcmVuY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BRFZBTkNFRF9DSEVDS0JPWF9QUkVGRVJFTkNFID0gImFkdmFuY2VkX2NoZWNrYm94X3ByZWZlcmVuY2UiOwotCi0gICAgcHJpdmF0ZSBDaGVja0JveFByZWZlcmVuY2UgbUNoZWNrQm94UHJlZmVyZW5jZTsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBjb250cm9sbGluZyBhIHByZWZlcmVuY2UgZnJvbSBjb2RlLgotICAgICAqLwotICAgIHByaXZhdGUgUnVubmFibGUgbUZvcmNlQ2hlY2tCb3hSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1DaGVja0JveFByZWZlcmVuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGVja0JveFByZWZlcmVuY2Uuc2V0Q2hlY2tlZCghbUNoZWNrQm94UHJlZmVyZW5jZS5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZvcmNlIHRvZ2dsZSBhZ2FpbiBpbiBhIHNlY29uZAotICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICAvLyBMb2FkIHRoZSBYTUwgcHJlZmVyZW5jZXMgZmlsZQotICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5hZHZhbmNlZF9wcmVmZXJlbmNlcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNoZWNrYm94IHByZWZlcmVuY2UKLSAgICAgICAgbUNoZWNrQm94UHJlZmVyZW5jZSA9IChDaGVja0JveFByZWZlcmVuY2UpZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmZpbmRQcmVmZXJlbmNlKAotICAgICAgICAgICAgICAgIEtFWV9BRFZBTkNFRF9DSEVDS0JPWF9QUkVGRVJFTkNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgZm9yY2UgdG9nZ2xlCi0gICAgICAgIG1Gb3JjZUNoZWNrQm94UnVubmFibGUucnVuKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdXAgYSBsaXN0ZW5lciB3aGVuZXZlciBhIGtleSBjaGFuZ2VzCi0gICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKS5nZXRTaGFyZWRQcmVmZXJlbmNlcygpLnJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotCi0gICAgICAgIC8vIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVyIHdoZW5ldmVyIGEga2V5IGNoYW5nZXMKLSAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmdldFNoYXJlZFByZWZlcmVuY2VzKCkudW5yZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1Gb3JjZUNoZWNrQm94UnVubmFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZWQoU2hhcmVkUHJlZmVyZW5jZXMgc2hhcmVkUHJlZmVyZW5jZXMsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgLy8gTGV0J3MgZG8gc29tZXRoaW5nIHdoZW4gbXkgY291bnRlciBwcmVmZXJlbmNlIHZhbHVlIGNoYW5nZXMKLSAgICAgICAgaWYgKGtleS5lcXVhbHMoS0VZX01ZX1BSRUZFUkVOQ0UpKSB7Ci0gICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiVGhhbmtzISBZb3UgaW5jcmVhc2VkIG15IGNvdW50IHRvICIKLSAgICAgICAgICAgICAgICAgICAgKyBzaGFyZWRQcmVmZXJlbmNlcy5nZXRJbnQoa2V5LCAwKSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FsZXJ0RGlhbG9nU2FtcGxlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BbGVydERpYWxvZ1NhbXBsZXMuamF2YQppbmRleCA2NzE0MTc1Li5hMjI3NTNhIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FsZXJ0RGlhbG9nU2FtcGxlcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWxlcnREaWFsb2dTYW1wbGVzLmphdmEKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX01VTFRJUExFX0NIT0lDRSA9IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQUxPR19URVhUX0VOVFJZID0gNzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX01VTFRJUExFX0NIT0lDRV9DVVJTT1IgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUFMT0dfWUVTX05PX1VMVFJBX0xPTkdfTUVTU0FHRSA9IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQUxPR19ZRVNfTk9fT0xEX1NDSE9PTF9NRVNTQUdFID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQUxPR19ZRVNfTk9fSE9MT19MSUdIVF9NRVNTQUdFID0gMTE7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwOwogICAgIApAQCAtNzYsNyArNzksNyBAQAogICAgICAgICBzd2l0Y2ggKGlkKSB7CiAgICAgICAgIGNhc2UgRElBTE9HX1lFU19OT19NRVNTQUdFOgogICAgICAgICAgICAgcmV0dXJuIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKEFsZXJ0RGlhbG9nU2FtcGxlcy50aGlzKQotICAgICAgICAgICAgICAgIC5zZXRJY29uKFIuZHJhd2FibGUuYWxlcnRfZGlhbG9nX2ljb24pCisgICAgICAgICAgICAgICAgLnNldEljb25BdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dJY29uKQogICAgICAgICAgICAgICAgIC5zZXRUaXRsZShSLnN0cmluZy5hbGVydF9kaWFsb2dfdHdvX2J1dHRvbnNfdGl0bGUpCiAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19vaywgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CkBAIC05MSw5ICs5NCwzNSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgIGNhc2UgRElBTE9HX1lFU19OT19PTERfU0NIT09MX01FU1NBR0U6CisgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoQWxlcnREaWFsb2dTYW1wbGVzLnRoaXMsIEFsZXJ0RGlhbG9nLlRIRU1FX1RSQURJVElPTkFMKQorICAgICAgICAgICAgICAgIC5zZXRJY29uQXR0cmlidXRlKGFuZHJvaWQuUi5hdHRyLmFsZXJ0RGlhbG9nSWNvbikKKyAgICAgICAgICAgICAgICAuc2V0VGl0bGUoUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zX3RpdGxlKQorICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5hbGVydF9kaWFsb2dfb2ssIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaEJ1dHRvbikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX2NhbmNlbCwgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgY2FzZSBESUFMT0dfWUVTX05PX0hPTE9fTElHSFRfTUVTU0FHRToKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihBbGVydERpYWxvZ1NhbXBsZXMudGhpcywgQWxlcnREaWFsb2cuVEhFTUVfSE9MT19MSUdIVCkKKyAgICAgICAgICAgICAgICAuc2V0SWNvbkF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ0ljb24pCisgICAgICAgICAgICAgICAgLnNldFRpdGxlKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc190aXRsZSkKKyAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLCBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19jYW5jZWwsIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaEJ1dHRvbikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CiAgICAgICAgIGNhc2UgRElBTE9HX1lFU19OT19MT05HX01FU1NBR0U6CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoQWxlcnREaWFsb2dTYW1wbGVzLnRoaXMpCi0gICAgICAgICAgICAgICAgLnNldEljb24oUi5kcmF3YWJsZS5hbGVydF9kaWFsb2dfaWNvbikKKyAgICAgICAgICAgICAgICAuc2V0SWNvbkF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ0ljb24pCiAgICAgICAgICAgICAgICAgLnNldFRpdGxlKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc19tc2cpCiAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zMl9tc2cpCiAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19vaywgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CkBAIC0xMTUsNiArMTQ0LDMwIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgY2FzZSBESUFMT0dfWUVTX05PX1VMVFJBX0xPTkdfTUVTU0FHRToKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihBbGVydERpYWxvZ1NhbXBsZXMudGhpcykKKyAgICAgICAgICAgICAgICAuc2V0SWNvbkF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ0ljb24pCisgICAgICAgICAgICAgICAgLnNldFRpdGxlKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ190d29fYnV0dG9uc19tc2cpCisgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zMnVsdHJhX21zZykKKyAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLCBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlciBjbGlja2VkIE9LIHNvIGRvIHNvbWUgc3R1ZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLnNldE5ldXRyYWxCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3NvbWV0aGluZywgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgY2xpY2tlZCBTb21ldGhpbmcgc28gZG8gc29tZSBzdHVmZiAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX2NhbmNlbCwgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgY2xpY2tlZCBDYW5jZWwgc28gZG8gc29tZSBzdHVmZiAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CiAgICAgICAgIGNhc2UgRElBTE9HX0xJU1Q6CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoQWxlcnREaWFsb2dTYW1wbGVzLnRoaXMpCiAgICAgICAgICAgICAgICAgLnNldFRpdGxlKFIuc3RyaW5nLnNlbGVjdF9kaWFsb2cpCkBAIC0xMzEsNyArMTg0LDcgQEAKICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CiAgICAgICAgIGNhc2UgRElBTE9HX1BST0dSRVNTOgogICAgICAgICAgICAgbVByb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKEFsZXJ0RGlhbG9nU2FtcGxlcy50aGlzKTsKLSAgICAgICAgICAgIG1Qcm9ncmVzc0RpYWxvZy5zZXRJY29uKFIuZHJhd2FibGUuYWxlcnRfZGlhbG9nX2ljb24pOworICAgICAgICAgICAgbVByb2dyZXNzRGlhbG9nLnNldEljb25BdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dJY29uKTsKICAgICAgICAgICAgIG1Qcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5zZWxlY3RfZGlhbG9nKTsKICAgICAgICAgICAgIG1Qcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzc1N0eWxlKFByb2dyZXNzRGlhbG9nLlNUWUxFX0hPUklaT05UQUwpOwogICAgICAgICAgICAgbVByb2dyZXNzRGlhbG9nLnNldE1heChNQVhfUFJPR1JFU1MpOwpAQCAtMTUyLDcgKzIwNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbVByb2dyZXNzRGlhbG9nOwogICAgICAgICBjYXNlIERJQUxPR19TSU5HTEVfQ0hPSUNFOgogICAgICAgICAgICAgcmV0dXJuIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKEFsZXJ0RGlhbG9nU2FtcGxlcy50aGlzKQotICAgICAgICAgICAgICAgIC5zZXRJY29uKFIuZHJhd2FibGUuYWxlcnRfZGlhbG9nX2ljb24pCisgICAgICAgICAgICAgICAgLnNldEljb25BdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dJY29uKQogICAgICAgICAgICAgICAgIC5zZXRUaXRsZShSLnN0cmluZy5hbGVydF9kaWFsb2dfc2luZ2xlX2Nob2ljZSkKICAgICAgICAgICAgICAgICAuc2V0U2luZ2xlQ2hvaWNlSXRlbXMoUi5hcnJheS5zZWxlY3RfZGlhbG9nX2l0ZW1zMiwgMCwgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CkBAIC0yMjksNyArMjgyLDcgQEAKICAgICAgICAgICAgIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHRoaXMpOwogICAgICAgICAgICAgZmluYWwgVmlldyB0ZXh0RW50cnlWaWV3ID0gZmFjdG9yeS5pbmZsYXRlKFIubGF5b3V0LmFsZXJ0X2RpYWxvZ190ZXh0X2VudHJ5LCBudWxsKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihBbGVydERpYWxvZ1NhbXBsZXMudGhpcykKLSAgICAgICAgICAgICAgICAuc2V0SWNvbihSLmRyYXdhYmxlLmFsZXJ0X2RpYWxvZ19pY29uKQorICAgICAgICAgICAgICAgIC5zZXRJY29uQXR0cmlidXRlKGFuZHJvaWQuUi5hdHRyLmFsZXJ0RGlhbG9nSWNvbikKICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3RleHRfZW50cnkpCiAgICAgICAgICAgICAgICAgLnNldFZpZXcodGV4dEVudHJ5VmlldykKICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLCBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKQEAgLTI3Nyw2ICszMzAsMTUgQEAKICAgICAgICAgfSk7CiAgICAgICAgIAogICAgICAgICAKKyAgICAgICAgLyogRGlzcGxheSBhbiB1bHRyYSBsb25nIHRleHQgbWVzc2FnZSB3aXRoIHllcy9ubyBidXR0b25zIGFuZCBoYW5kbGUgZWFjaCBtZXNzYWdlIGFzIHdlbGwgYXMgdGhlIGNhbmNlbCBhY3Rpb24gKi8KKyAgICAgICAgQnV0dG9uIHR3b0J1dHRvbnMyVWx0cmFUaXRsZSA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnR3b19idXR0b25zMnVsdHJhKTsKKyAgICAgICAgdHdvQnV0dG9uczJVbHRyYVRpdGxlLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKERJQUxPR19ZRVNfTk9fVUxUUkFfTE9OR19NRVNTQUdFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKwogICAgICAgICAvKiBEaXNwbGF5IGEgbGlzdCBvZiBpdGVtcyAqLwogICAgICAgICBCdXR0b24gc2VsZWN0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc2VsZWN0X2J1dHRvbik7CiAgICAgICAgIHNlbGVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKQEAgLTMyOCw2ICszOTAsMjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgICAgIAorICAgICAgICAvKiBUd28gcG9pbnRzLCBpbiB0aGUgdHJhZGl0aW9uYWwgdGhlbWUgKi8KKyAgICAgICAgQnV0dG9uIHR3b0J1dHRvbnNPbGRTY2hvb2xUaXRsZSA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnR3b19idXR0b25zX29sZF9zY2hvb2wpOworICAgICAgICB0d29CdXR0b25zT2xkU2Nob29sVGl0bGUuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coRElBTE9HX1lFU19OT19PTERfU0NIT09MX01FU1NBR0UpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIC8qIFR3byBwb2ludHMsIGluIHRoZSBsaWdodCBob2xvZ3JhcGhpYyB0aGVtZSAqLworICAgICAgICBCdXR0b24gdHdvQnV0dG9uc0hvbG9MaWdodFRpdGxlID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQudHdvX2J1dHRvbnNfaG9sb19saWdodCk7CisgICAgICAgIHR3b0J1dHRvbnNIb2xvTGlnaHRUaXRsZS5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgc2hvd0RpYWxvZyhESUFMT0dfWUVTX05PX0hPTE9fTElHSFRfTUVTU0FHRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKICAgICAgICAgbVByb2dyZXNzSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FuaW1hdGlvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BbmltYXRpb24uamF2YQppbmRleCA1YmE0MWM0Li5iZDJiZDg5IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FuaW1hdGlvbi5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQW5pbWF0aW9uLmphdmEKQEAgLTMwLDEwICszMCw3IEBACiAKIAogLyoqCi0gKiA8cD5FeGFtcGxlIG9mIGV4cGxpY2l0bHkgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIHRoZSB7QGxpbmsgTG9jYWxTZXJ2aWNlfS4KLSAqIFRoaXMgZGVtb25zdHJhdGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UgdGhhdCBydW5zIGluIHRoZSBzYW1lCi0gKiBwcm9jZXNzIGFzIHRoZSByZXN0IG9mIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2ggaXMgZXhwbGljaXRseSBzdGFydGVkIGFuZCBzdG9wcGVkCi0gKiBhcyBkZXNpcmVkLjwvcD4KKyAqIDxwPkV4YW1wbGUgb2YgdXNpbmcgYSBjdXN0b20gYW5pbWF0aW9uIHdoZW4gdHJhbnNpdGlvbmluZyBiZXR3ZWVuIGFjdGl2aXRpZXMuPC9wPgogICovCiBwdWJsaWMgY2xhc3MgQW5pbWF0aW9uIGV4dGVuZHMgQWN0aXZpdHkgewogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BcHBVcGRhdGVSZWNlaXZlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BcHBVcGRhdGVSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FwcFVwZGF0ZVJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKKy8qKgorICogRXhlY3V0ZWQgd2hlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBpcyBpcyBpbnN0YWxsZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBVcGRhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGNvbnRleHQsIFIuc3RyaW5nLmFwcF91cGRhdGVfcmVjZWl2ZWQsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RlZmF1bHRWYWx1ZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGVmYXVsdFZhbHVlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTRhMmVhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGVmYXVsdFZhbHVlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKLQotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5BcGlEZW1vc0FwcGxpY2F0aW9uOwotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgYWN0aXZpdHkgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBzZXR0aW5ncyBzY3JlZW4gdGhhdCBoYXMgZGVmYXVsdAotICogdmFsdWVzLgotICogPHA+Ci0gKiBJbiBvcmRlciBmb3IgdGhlIGRlZmF1bHQgdmFsdWVzIHRvIGJlIHBvcHVsYXRlZCBpbnRvIHRoZQotICoge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfSAoZnJvbSB0aGUgcHJlZmVyZW5jZXMgWE1MIGZpbGUpLCB0aGUgY2xpZW50IG11c3QKLSAqIGNhbGwKLSAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNzZXREZWZhdWx0VmFsdWVzKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGJvb2xlYW4pfS4KLSAqIDxwPgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGVhcmx5LCB0eXBpY2FsbHkgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZmlyc3QgY3JlYXRlZC4KLSAqIFRoaXMgZW5zdXJlcyBhbnkgb2YgdGhlIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcywgc2VydmljZXMsIGV0Yy4gd2lsbCBoYXZlCi0gKiB0aGUgZGVmYXVsdCB2YWx1ZXMgcHJlc2VudCwgZXZlbiBpZiB0aGUgdXNlciBoYXMgbm90IHdhbmRlcmVkIGludG8gdGhlCi0gKiBhcHBsaWNhdGlvbidzIHNldHRpbmdzLiBGb3IgQXBpRGVtb3MsIHRoaXMgaXMge0BsaW5rIEFwaURlbW9zQXBwbGljYXRpb259LAotICogYW5kIHlvdSBjYW4gZmluZCB0aGUgY2FsbCB0bwotICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI3NldERlZmF1bHRWYWx1ZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYm9vbGVhbil9Ci0gKiBpbiBpdHMge0BsaW5rIEFwaURlbW9zQXBwbGljYXRpb24jb25DcmVhdGUoKSBvbkNyZWF0ZX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsdWVzIGV4dGVuZHMgUHJlZmVyZW5jZUFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLmRlZmF1bHRfdmFsdWVzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGV2aWNlQWRtaW5TYW1wbGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGV2aWNlQWRtaW5TYW1wbGUuamF2YQppbmRleCBiM2ZjMmY5Li4wNDk0NGVmIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RldmljZUFkbWluU2FtcGxlLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9EZXZpY2VBZG1pblNhbXBsZS5qYXZhCkBAIC0zNSwxMiArMzUsMTYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCiAvKioKICAqIEV4YW1wbGUgb2YgYSBkby1ub3RoaW5nIGFkbWluIGNsYXNzLiAgV2hlbiBlbmFibGVkLCBpdCBsZXRzIHlvdSBjb250cm9sCkBAIC00OCwyMSArNTIsMzQgQEAKICAqLwogcHVibGljIGNsYXNzIERldmljZUFkbWluU2FtcGxlIGV4dGVuZHMgRGV2aWNlQWRtaW5SZWNlaXZlciB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRldmljZUFkbWluU2FtcGxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1TX1BFUl9EQVkgPSA4NjQwMCAqIDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNU19QRVJfSE9VUiA9IDM2MDAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTVNfUEVSX01JTlVURSA9IDYwICogMTAwMDsKKwogICAgIHN0YXRpYyBTaGFyZWRQcmVmZXJlbmNlcyBnZXRTYW1wbGVQcmVmZXJlbmNlcyhDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoRGV2aWNlQWRtaW5SZWNlaXZlci5jbGFzcy5nZXROYW1lKCksIDApOwogICAgIH0KIAogICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9RVUFMSVRZID0gInBhc3N3b3JkX3F1YWxpdHkiOwogICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9MRU5HVEggPSAicGFzc3dvcmRfbGVuZ3RoIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTID0gInBhc3N3b3JkX21pbmltdW1fbGV0dGVycyI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fVVBQRVJDQVNFID0gInBhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MT1dFUkNBU0UgPSAicGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2UiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMgPSAicGFzc3dvcmRfbWluaW11bV9udW1lcmljIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9TWU1CT0xTID0gInBhc3N3b3JkX21pbmltdW1fc3ltYm9scyI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fTk9OTEVUVEVSID0gInBhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEggPSAicGFzc3dvcmRfaGlzdG9yeV9sZW5ndGgiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9FWFBJUkFUSU9OX1RJTUVPVVQgPSAicGFzc3dvcmRfZXhwaXJhdGlvbl90aW1lb3V0IjsKICAgICBzdGF0aWMgU3RyaW5nIFBSRUZfTUFYX0ZBSUxFRF9QVyA9ICJtYXhfZmFpbGVkX3B3IjsKIAogICAgIHZvaWQgc2hvd1RvYXN0KENvbnRleHQgY29udGV4dCwgQ2hhclNlcXVlbmNlIG1zZykgewotICAgICAgICBUb2FzdC5tYWtlVGV4dChjb250ZXh0LCBtc2csIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICBUb2FzdC5tYWtlVGV4dChjb250ZXh0LCAiU2FtcGxlIERldmljZSBBZG1pbjogIiArIG1zZywgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25FbmFibGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgIlNhbXBsZSBEZXZpY2UgQWRtaW46IGVuYWJsZWQiKTsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJlbmFibGVkIik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC03MiwyMiArODksNDMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRGlzYWJsZWQoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHNob3dUb2FzdChjb250ZXh0LCAiU2FtcGxlIERldmljZSBBZG1pbjogZGlzYWJsZWQiKTsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJkaXNhYmxlZCIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUGFzc3dvcmRDaGFuZ2VkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgIlNhbXBsZSBEZXZpY2UgQWRtaW46IHB3IGNoYW5nZWQiKTsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJwdyBjaGFuZ2VkIik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25QYXNzd29yZEZhaWxlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgRGV2aWNlIEFkbWluOiBwdyBmYWlsZWQiKTsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJwdyBmYWlsZWQiKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblBhc3N3b3JkU3VjY2VlZGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgIlNhbXBsZSBEZXZpY2UgQWRtaW46IHB3IHN1Y2NlZWRlZCIpOworICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgInB3IHN1Y2NlZWRlZCIpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgY291bnRkb3duU3RyaW5nKGxvbmcgdGltZSkgeworICAgICAgICBsb25nIGRheXMgPSB0aW1lIC8gTVNfUEVSX0RBWTsKKyAgICAgICAgbG9uZyBob3VycyA9ICh0aW1lIC8gTVNfUEVSX0hPVVIpICUgMjQ7CisgICAgICAgIGxvbmcgbWludXRlcyA9ICh0aW1lIC8gTVNfUEVSX01JTlVURSkgJSA2MDsKKyAgICAgICAgcmV0dXJuIGRheXMgKyAiZCIgKyBob3VycyArICJoIiArIG1pbnV0ZXMgKyAibSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXNzd29yZEV4cGlyaW5nKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IChEZXZpY2VQb2xpY3lNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29udGV4dC5ERVZJQ0VfUE9MSUNZX1NFUlZJQ0UpOworICAgICAgICBsb25nIGV4cHIgPSBkcG0uZ2V0UGFzc3dvcmRFeHBpcmF0aW9uKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIERldmljZUFkbWluU2FtcGxlLmNsYXNzKSk7CisgICAgICAgIGxvbmcgZGVsdGEgPSBleHByIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGJvb2xlYW4gZXhwaXJlZCA9IGRlbHRhIDwgMEw7CisgICAgICAgIFN0cmluZyBtc2cgPSBleHBpcmVkID8gIlBhc3N3b3JkIGV4cGlyZWQgIiA6ICJQYXNzd29yZCB3aWxsIGV4cGlyZSAiCisgICAgICAgICAgICAgICAgKyBjb3VudGRvd25TdHJpbmcoTWF0aC5hYnMoZGVsdGEpKQorICAgICAgICAgICAgICAgICsgKGV4cGlyZWQgPyAiIGFnbyIgOiAiIGZyb20gbm93Iik7CisgICAgICAgIHNob3dUb2FzdChjb250ZXh0LCBtc2cpOworICAgICAgICBMb2cudihUQUcsIG1zZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05OSw3ICsxMzcsMTEgQEAKICAgICAgKiBhbGwgdG9nZXRoZXI7IHR5cGljYWxseSB0aGlzIGNvZGUgd291bGQgYXBwZWFyIGluIHNvbWUgc2VwYXJhdGUgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgQWN0aXZpdHkgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9FTkFCTEUgPSAxOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9DT0RFX0VOQUJMRV9BRE1JTiA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9DT0RFX1NUQVJUX0VOQ1JZUFRJT04gPSAyOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTVNfUEVSX01JTlVURSA9IDYwKjEwMDA7CiAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtRFBNOwogICAgICAgICBBY3Rpdml0eU1hbmFnZXIgbUFNOwpAQCAtMTE1LDEwICsxNTcsMTkgQEAKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsCiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQywKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDLAotICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQywKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYCiAgICAgICAgIH07CisKICAgICAgICAgU3Bpbm5lciBtUGFzc3dvcmRRdWFsaXR5OwogICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRMZW5ndGg7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtTnVtZXJpYzsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bVN5bWJvbHM7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXI7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZEhpc3RvcnlMZW5ndGg7CiAgICAgICAgIEJ1dHRvbiBtU2V0UGFzc3dvcmRCdXR0b247CiAKICAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkOwpAQCAtMTM0LDYgKzE4NSwxNyBAQAogCiAgICAgICAgIHByaXZhdGUgRWRpdFRleHQgbVRpbWVvdXQ7CiAKKyAgICAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtUGFzc3dvcmRFeHBpcmF0aW9uVGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSBCdXR0b24gbVBhc3N3b3JkRXhwaXJhdGlvbkJ1dHRvbjsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtUGFzc3dvcmRFeHBpcmF0aW9uU3RhdHVzOworICAgICAgICBwcml2YXRlIEJ1dHRvbiBtUGFzc3dvcmRFeHBpcmF0aW9uU3RhdHVzQnV0dG9uOworCisgICAgICAgIHByaXZhdGUgQnV0dG9uIG1FbmFibGVFbmNyeXB0aW9uQnV0dG9uOworICAgICAgICBwcml2YXRlIEJ1dHRvbiBtRGlzYWJsZUVuY3J5cHRpb25CdXR0b247CisgICAgICAgIHByaXZhdGUgQnV0dG9uIG1BY3RpdmF0ZUVuY3J5cHRpb25CdXR0b247CisgICAgICAgIHByaXZhdGUgQnV0dG9uIG1FbmNyeXB0aW9uU3RhdHVzQnV0dG9uOworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1FbmNyeXB0aW9uU3RhdHVzOworCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwpAQCAtMTc5LDYgKzI0MSwxMjAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxldHRlcnMgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV9sZXR0ZXJzKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2UuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1VcHBlcmNhc2UoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZSA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX2xvd2VyY2FzZSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fbnVtZXJpYyk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTnVtZXJpYy5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVN5bWJvbHMgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV9zeW1ib2xzKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9oaXN0b3J5X2xlbmd0aCk7CisgICAgICAgICAgICBtUGFzc3dvcmRIaXN0b3J5TGVuZ3RoLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbVBhc3N3b3JkRXhwaXJhdGlvblRpbWVvdXQgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfZXhwaXJhdGlvbik7CisgICAgICAgICAgICBtUGFzc3dvcmRFeHBpcmF0aW9uQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQudXBkYXRlX2V4cGlyYXRpb25fYnV0dG9uKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEV4cGlyYXRpb25CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkRXhwaXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcobVBhc3N3b3JkRXhwaXJhdGlvblRpbWVvdXQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhc3N3b3JkRXhwaXJhdGlvblN0YXR1cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBtUGFzc3dvcmRFeHBpcmF0aW9uU3RhdHVzID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9leHBpcmF0aW9uX3N0YXR1cyk7CisgICAgICAgICAgICBtUGFzc3dvcmRFeHBpcmF0aW9uU3RhdHVzQnV0dG9uID0KKyAgICAgICAgICAgICAgICAgICAgKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQudXBkYXRlX2V4cGlyYXRpb25fc3RhdHVzX2J1dHRvbik7CisgICAgICAgICAgICBtUGFzc3dvcmRFeHBpcmF0aW9uU3RhdHVzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhc3N3b3JkRXhwaXJhdGlvblN0YXR1cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCiAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNldF9wYXNzd29yZCk7CiAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXRQYXNzd29yZExpc3RlbmVyKTsKIApAQCAtMjE1LDYgKzM5MSwxNiBAQAogICAgICAgICAgICAgbVRpbWVvdXQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnRpbWVvdXQpOwogICAgICAgICAgICAgbVRpbWVvdXRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zZXRfdGltZW91dCk7CiAgICAgICAgICAgICBtVGltZW91dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVNldFRpbWVvdXRMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIG1FbmFibGVFbmNyeXB0aW9uQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW5jcnlwdGlvbl9lbmFibGVfYnV0dG9uKTsKKyAgICAgICAgICAgIG1FbmFibGVFbmNyeXB0aW9uQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRW5jcnlwdGlvbkJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1EaXNhYmxlRW5jcnlwdGlvbkJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVuY3J5cHRpb25fZGlzYWJsZV9idXR0b24pOworICAgICAgICAgICAgbURpc2FibGVFbmNyeXB0aW9uQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRW5jcnlwdGlvbkJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1BY3RpdmF0ZUVuY3J5cHRpb25CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbmNyeXB0aW9uX2FjdGl2YXRlX2J1dHRvbik7CisgICAgICAgICAgICBtQWN0aXZhdGVFbmNyeXB0aW9uQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRW5jcnlwdGlvbkJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1FbmNyeXB0aW9uU3RhdHVzQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW5jcnlwdGlvbl91cGRhdGVfc3RhdHVzX2J1dHRvbik7CisgICAgICAgICAgICBtRW5jcnlwdGlvblN0YXR1c0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUVuY3J5cHRpb25CdXR0b25MaXN0ZW5lcik7CisgICAgICAgICAgICBtRW5jcnlwdGlvblN0YXR1cyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW5jcnlwdGlvbl9zdGF0dXMpOwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCB1cGRhdGVCdXR0b25TdGF0ZXMoKSB7CkBAIC0yMjQsMjMgKzQxMCw0NSBAQAogICAgICAgICAgICAgICAgIG1EaXNhYmxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkUXVhbGl0eS5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1QYXNzd29yZExlbmd0aC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Mb3dlcmNhc2Uuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtU3ltYm9scy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlci5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmQuc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtUmVzZXRQYXNzd29yZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1Gb3JjZUxvY2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtV2lwZURhdGFCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtV2lwZUFsbERhdGFCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtRW5hYmxlRW5jcnlwdGlvbkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1EaXNhYmxlRW5jcnlwdGlvbkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1BY3RpdmF0ZUVuY3J5cHRpb25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtRW5jcnlwdGlvblN0YXR1c0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtRW5hYmxlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbURpc2FibGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkUXVhbGl0eS5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmRMZW5ndGguc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxldHRlcnMuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aC5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1SZXNldFBhc3N3b3JkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1Gb3JjZUxvY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVdpcGVEYXRhQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1XaXBlQWxsRGF0YUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtRW5hYmxlRW5jcnlwdGlvbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtRGlzYWJsZUVuY3J5cHRpb25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbUFjdGl2YXRlRW5jcnlwdGlvbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtRW5jcnlwdGlvblN0YXR1c0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNDksNiArNDU3LDE0IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgcHdRdWFsaXR5ID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfUVVBTElUWSwKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgICAgIGZpbmFsIGludCBwd0xlbmd0aCA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX0xFTkdUSCwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5MZXR0ZXJzID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pblVwcGVyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fVVBQRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbkxvd2VyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTE9XRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbk51bWVyaWMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluU3ltYm9scyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fU1lNQk9MUywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5Ob25MZXR0ZXIgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05PTkxFVFRFUiwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdIaXN0b3J5TGVuZ3RoID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEgsIDApOworICAgICAgICAgICAgZmluYWwgbG9uZyBwd0V4cGlyYXRpb25UaW1lb3V0ID0gcHJlZnMuZ2V0TG9uZyhQUkVGX1BBU1NXT1JEX0VYUElSQVRJT05fVElNRU9VVCwgMEwpOwogICAgICAgICAgICAgZmluYWwgaW50IG1heEZhaWxlZFB3ID0gcHJlZnMuZ2V0SW50KFBSRUZfTUFYX0ZBSUxFRF9QVywgMCk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtUGFzc3dvcmRRdWFsaXR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7CkBAIC0yNTcsMjEgKzQ3Myw4MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYXNzd29yZExlbmd0aC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdMZW5ndGgpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pbkxldHRlcnMpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2Uuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluVXBwZXJjYXNlKSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pbkxvd2VyY2FzZSkpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVN5bWJvbHMuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluU3ltYm9scykpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU51bWVyaWMuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluTnVtZXJpYykpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlci5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdNaW5Ob25MZXR0ZXIpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3SGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgbVBhc3N3b3JkRXhwaXJhdGlvblRpbWVvdXQuc2V0VGV4dChMb25nLnRvU3RyaW5nKHB3RXhwaXJhdGlvblRpbWVvdXQvTVNfUEVSX01JTlVURSkpOwogICAgICAgICAgICAgbU1heEZhaWxlZFB3LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtYXhGYWlsZWRQdykpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCB1cGRhdGVQYXNzd29yZEV4cGlyYXRpb25TdGF0dXMoKSB7CisgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IG1EUE0uaXNBZG1pbkFjdGl2ZShtRGV2aWNlQWRtaW5TYW1wbGUpOworICAgICAgICAgICAgU3RyaW5nIHN0YXR1c1RleHQ7CisgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBxdWVyeSB0aGUgRGV2aWNlUG9saWN5TWFuYWdlciB0d2ljZSAtIGZpcnN0IGZvciB0aGUgZXhwaXJhdGlvbiB2YWx1ZXMKKyAgICAgICAgICAgICAgICAvLyBzZXQgYnkgdGhlIHNhbXBsZSBhcHAsIGFuZCBsYXRlciwgZm9yIHRoZSBzeXN0ZW0gdmFsdWVzICh3aGljaCBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBhZG1pbmlzdHJhdG9yIGFjdGl2ZS4pCisgICAgICAgICAgICAgICAgbG9uZyBleHBpcmF0aW9uRGF0ZSA9IG1EUE0uZ2V0UGFzc3dvcmRFeHBpcmF0aW9uKG1EZXZpY2VBZG1pblNhbXBsZSk7CisgICAgICAgICAgICAgICAgbG9uZyBtU2VjVW50aWxFeHBpcmF0aW9uID0gZXhwaXJhdGlvbkRhdGUgLSBub3c7CisgICAgICAgICAgICAgICAgaWYgKG1TZWNVbnRpbEV4cGlyYXRpb24gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIkV4cGlyYXRpb24gaW4gIiArIGNvdW50ZG93blN0cmluZyhtU2VjVW50aWxFeHBpcmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIkV4cGlyZWQgIiArIGNvdW50ZG93blN0cmluZygtbVNlY1VudGlsRXhwaXJhdGlvbikgKyAiIGFnbyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXhwaXJhdGlvblRpbWVvdXQgaXMgdGhlIGN5Y2xlIHRpbWUgYmV0d2VlbiByZXF1aXJlZCBwYXNzd29yZCByZWZyZXNoCisgICAgICAgICAgICAgICAgbG9uZyBleHBpcmF0aW9uVGltZW91dCA9IG1EUE0uZ2V0UGFzc3dvcmRFeHBpcmF0aW9uVGltZW91dChtRGV2aWNlQWRtaW5TYW1wbGUpOworICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gIiAvIHRpbWVvdXQgcGVyaW9kICIgKyBjb3VudGRvd25TdHJpbmcoZXhwaXJhdGlvblRpbWVvdXQpOworCisgICAgICAgICAgICAgICAgLy8gTm93IHJlcG9ydCB0aGUgYWdncmVnYXRlIChnbG9iYWwpIGV4cGlyYXRpb24gdGltZQorICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gIiAvIEFnZ3JlZ2F0ZSAiOworICAgICAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlID0gbURQTS5nZXRQYXNzd29yZEV4cGlyYXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgbVNlY1VudGlsRXhwaXJhdGlvbiA9IGV4cGlyYXRpb25EYXRlIC0gbm93OworICAgICAgICAgICAgICAgIGlmIChtU2VjVW50aWxFeHBpcmF0aW9uID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCArPSAiZXhwaXJhdGlvbiBpbiAiICsgY291bnRkb3duU3RyaW5nKG1TZWNVbnRpbEV4cGlyYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQgKz0gImV4cGlyZWQgIiArIGNvdW50ZG93blN0cmluZygtbVNlY1VudGlsRXhwaXJhdGlvbikgKyAiIGFnbyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNUZXh0ID0gIjxpbmFjdGl2ZT4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhc3N3b3JkRXhwaXJhdGlvblN0YXR1cy5zZXRUZXh0KHN0YXR1c1RleHQpOworICAgICAgICB9CisKICAgICAgICAgdm9pZCB1cGRhdGVQb2xpY2llcygpIHsKICAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgcHdRdWFsaXR5ID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfUVVBTElUWSwKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgICAgIGZpbmFsIGludCBwd0xlbmd0aCA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX0xFTkdUSCwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5MZXR0ZXJzID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pblVwcGVyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fVVBQRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbkxvd2VyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTE9XRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbk51bWVyaWMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluU3ltYm9scyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fU1lNQk9MUywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5Ob25MZXR0ZXIgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05PTkxFVFRFUiwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdIaXN0b3J5TGVuZ3RoID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEgsIDApOworICAgICAgICAgICAgZmluYWwgbG9uZyBwd0V4cGlyYXRpb24gPSBwcmVmcy5nZXRMb25nKFBSRUZfUEFTU1dPUkRfRVhQSVJBVElPTl9USU1FT1VULCAwTCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbWF4RmFpbGVkUHcgPSBwcmVmcy5nZXRJbnQoUFJFRl9NQVhfRkFJTEVEX1BXLCAwKTsKIAogICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSBtRFBNLmlzQWRtaW5BY3RpdmUobURldmljZUFkbWluU2FtcGxlKTsKICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKICAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkUXVhbGl0eShtRGV2aWNlQWRtaW5TYW1wbGUsIHB3UXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobURldmljZUFkbWluU2FtcGxlLCBwd0xlbmd0aCk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5MZXR0ZXJzKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluVXBwZXJjYXNlKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluTG93ZXJjYXNlKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bU51bWVyaWMobURldmljZUFkbWluU2FtcGxlLCBwd01pbk51bWVyaWMpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluU3ltYm9scyk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobURldmljZUFkbWluU2FtcGxlLCBwd01pbk5vbkxldHRlcik7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgobURldmljZUFkbWluU2FtcGxlLCBwd0hpc3RvcnlMZW5ndGgpOwogICAgICAgICAgICAgICAgIG1EUE0uc2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUobURldmljZUFkbWluU2FtcGxlLCBtYXhGYWlsZWRQdyk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZEV4cGlyYXRpb25UaW1lb3V0KG1EZXZpY2VBZG1pblNhbXBsZSwgcHdFeHBpcmF0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODcsNiArNTYyLDY0IEBACiAgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9VUFBFUkNBU0UsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlcmNhc2UoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xPV0VSQ0FTRSwgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9TWU1CT0xTLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OT05MRVRURVIsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9ISVNUT1JZX0xFTkdUSCwgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBhc3N3b3JkRXhwaXJhdGlvbihsb25nIGV4cGlyYXRpb24pIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBsb25nIGV4cCA9IGV4cGlyYXRpb24gKiBNU19QRVJfTUlOVVRFOyAvLyBjb252ZXJ0IGZyb20gVUkgdW5pdHMgdG8gbXMKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRMb25nKFBSRUZfUEFTU1dPUkRfRVhQSVJBVElPTl9USU1FT1VULCBleHApLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgICAgIC8vIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZworICAgICAgICAgICAgbG9uZyBjb25maXJtID0gbURQTS5nZXRQYXNzd29yZEV4cGlyYXRpb24obURldmljZUFkbWluU2FtcGxlKTsKKyAgICAgICAgICAgIFN0cmluZyBkYXRlID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuREVGQVVMVCwgRGF0ZUZvcm1hdC5ERUZBVUxUKQorICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KG5ldyBEYXRlKGNvbmZpcm0pKTsKKyAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKCJQYXNzd29yZCB3aWxsIGV4cGlyZSBvbiAiICsgZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKCJPSyIsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKQorICAgICAgICAgICAgICAgICAgICAuc2hvdygpOworICAgICAgICB9CisKICAgICAgICAgdm9pZCBzZXRNYXhGYWlsZWRQdyhpbnQgbGVuZ3RoKSB7CiAgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNhbXBsZVByZWZlcmVuY2VzKHRoaXMpOwogICAgICAgICAgICAgcHJlZnMuZWRpdCgpLnB1dEludChQUkVGX01BWF9GQUlMRURfUFcsIGxlbmd0aCkuY29tbWl0KCk7CkBAIC0yOTcsMTggKzYzMCwyMiBAQAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CiAgICAgICAgICAgICB1cGRhdGVCdXR0b25TdGF0ZXMoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhc3N3b3JkRXhwaXJhdGlvblN0YXR1cygpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICAgICAgICAgIHN3aXRjaCAocmVxdWVzdENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJFU1VMVF9FTkFCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0NPREVfRU5BQkxFX0FETUlOOgogICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBBY3Rpdml0eS5SRVNVTFRfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJEZXZpY2VBZG1pblNhbXBsZSIsICJBZG1pbiBlbmFibGVkISIpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWRtaW4gZW5hYmxlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKCJEZXZpY2VBZG1pblNhbXBsZSIsICJBZG1pbiBlbmFibGUgRkFJTEVEISIpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWRtaW4gZW5hYmxlIEZBSUxFRCEiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0NPREVfU1RBUlRfRU5DUllQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRW5jcnlwdGlvblN0YXR1cygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwpAQCAtMzIyLDcgKzY1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQWRtaW5TYW1wbGUpOwogICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShEZXZpY2VQb2xpY3lNYW5hZ2VyLkVYVFJBX0FERF9FWFBMQU5BVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICJBZGRpdGlvbmFsIHRleHQgZXhwbGFpbmluZyB3aHkgdGhpcyBuZWVkcyB0byBiZSBhZGRlZC4iKTsKLSAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgUkVTVUxUX0VOQUJMRSk7CisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFJFUVVFU1RfQ09ERV9FTkFCTEVfQURNSU4pOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogCkBAIC0zNDMsNyArNjgwLDcgQEAKIAogICAgICAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtUmVzZXRQYXNzd29yZExpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BTS5pc1VzZXJBTW9ua2V5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyLmlzVXNlckFNb25rZXkoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnVzdCBtb25rZXlzIHRvIGRvIHRoZSByaWdodCB0aGluZyEKICAgICAgICAgICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoQ29udHJvbGxlci50aGlzKTsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKCJZb3UgY2FuJ3QgcmVzZXQgbXkgcGFzc3dvcmQgYmVjYXVzZSB5b3UgYXJlIGEgbW9ua2V5ISIpOwpAQCAtMzYxLDcgKzY5OCw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbUZvcmNlTG9ja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BTS5pc1VzZXJBTW9ua2V5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyLmlzVXNlckFNb25rZXkoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnVzdCBtb25rZXlzIHRvIGRvIHRoZSByaWdodCB0aGluZyEKICAgICAgICAgICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoQ29udHJvbGxlci50aGlzKTsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRNZXNzYWdlKCJZb3UgY2FuJ3QgbG9jayBteSBzY3JlZW4gYmVjYXVzZSB5b3UgYXJlIGEgbW9ua2V5ISIpOwpAQCAtMzc4LDcgKzcxNSw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbVdpcGVEYXRhTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBpZiAobUFNLmlzVXNlckFNb25rZXkoKSkgeworICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXIuaXNVc2VyQU1vbmtleSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRydXN0IG1vbmtleXMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIQogICAgICAgICAgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihDb250cm9sbGVyLnRoaXMpOwogICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoIllvdSBjYW4ndCB3aXBlIG15IGRhdGEgYmVjYXVzZSB5b3UgYXJlIGEgbW9ua2V5ISIpOwpAQCAtNDIyLDcgKzc1OSw3IEBACiAgICAgICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1TZXRUaW1lb3V0TGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgewogCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGlmIChtQU0uaXNVc2VyQU1vbmtleSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlci5pc1VzZXJBTW9ua2V5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ1c3QgbW9ua2V5cyB0byBkbyB0aGUgcmlnaHQgdGhpbmchCiAgICAgICAgICAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKENvbnRyb2xsZXIudGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TWVzc2FnZSgiWW91IGNhbid0IGxvY2sgbXkgc2NyZWVuIGJlY2F1c2UgeW91IGFyZSBhIG1vbmtleSEiKTsKQEAgLTQzNyw1ICs3NzQsNzAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbUVuY3J5cHRpb25CdXR0b25MaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGludCBidXR0b25JZCA9IHYuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnV0dG9uSWQgPT0gUi5pZC5lbmNyeXB0aW9uX2VuYWJsZV9idXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgbURQTS5zZXRTdG9yYWdlRW5jcnlwdGlvbihtRGV2aWNlQWRtaW5TYW1wbGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnV0dG9uSWQgPT0gUi5pZC5lbmNyeXB0aW9uX2Rpc2FibGVfYnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgIG1EUE0uc2V0U3RvcmFnZUVuY3J5cHRpb24obURldmljZUFkbWluU2FtcGxlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidXR0b25JZCA9PSBSLmlkLmVuY3J5cHRpb25fYWN0aXZhdGVfYnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXIuaXNVc2VyQU1vbmtleSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnVzdCBtb25rZXlzIHRvIGRvIHRoZSByaWdodCB0aGluZyEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKENvbnRyb2xsZXIudGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoIllvdSBjYW4ndCBhY3RpdmF0ZSBlbmNyeXB0aW9uLCB5b3UncmUgYSBtb25rZXkhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKCJJIGFkbWl0IGRlZmVhdCIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EUE0uZ2V0U3RvcmFnZUVuY3J5cHRpb25TdGF0dXMoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuRU5DUllQVElPTl9TVEFUVVNfVU5TVVBQT1JURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKENvbnRyb2xsZXIudGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoIkVuY3J5cHRpb24gaXMgdW5zdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKCJPSyIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTGF1bmNoIHRoZSBhY3Rpdml0eSB0byBhY3RpdmF0ZSBlbmNyeXB0aW9uLiAgTWF5IG9yIG1heSBub3QgcmV0dXJuIQorICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChEZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9TVEFSVF9FTkNSWVBUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFJFUVVFU1RfQ09ERV9TVEFSVF9FTkNSWVBUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJbiBhbGwgY2FzZXMsIGZhbGwgdGhyb3VnaCB0byB1cGRhdGUgc3RhdHVzCisgICAgICAgICAgICAgICAgdXBkYXRlRW5jcnlwdGlvblN0YXR1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVFbmNyeXB0aW9uU3RhdHVzKCkgeworICAgICAgICAgICAgYm9vbGVhbiBzYW1wbGVBZG1pblN0YXR1c1ZhbHVlID0gbURQTS5nZXRTdG9yYWdlRW5jcnlwdGlvbihtRGV2aWNlQWRtaW5TYW1wbGUpOworICAgICAgICAgICAgU3RyaW5nIHNhbXBsZUFkbWluU3RhdHVzID0gQm9vbGVhbi50b1N0cmluZyhzYW1wbGVBZG1pblN0YXR1c1ZhbHVlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYWRtaW5TdGF0dXNWYWx1ZSA9IG1EUE0uZ2V0U3RvcmFnZUVuY3J5cHRpb24obnVsbCk7CisgICAgICAgICAgICBTdHJpbmcgYWRtaW5TdGF0dXMgPSBCb29sZWFuLnRvU3RyaW5nKGFkbWluU3RhdHVzVmFsdWUpOworICAgICAgICAgICAgaW50IGRldmljZVN0YXR1c0NvZGUgPSBtRFBNLmdldFN0b3JhZ2VFbmNyeXB0aW9uU3RhdHVzKCk7CisgICAgICAgICAgICBTdHJpbmcgZGV2aWNlU3RhdHVzID0gc3RhdHVzQ29kZVRvU3RyaW5nKGRldmljZVN0YXR1c0NvZGUpOworICAgICAgICAgICAgbUVuY3J5cHRpb25TdGF0dXMuc2V0VGV4dCgic2FtcGxlOiIgKyBzYW1wbGVBZG1pblN0YXR1cyArICIgYWRtaW5zOiIgKyBhZG1pblN0YXR1cworICAgICAgICAgICAgICAgICAgICArICIgZGV2aWNlOiIgKyBkZXZpY2VTdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzQ29kZVRvU3RyaW5nKGludCBuZXdTdGF0dXNDb2RlKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV3U3RhdHVzID0gInVua25vd24iOworICAgICAgICAgICAgc3dpdGNoIChuZXdTdGF0dXNDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLkVOQ1JZUFRJT05fU1RBVFVTX1VOU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0dXMgPSAidW5zdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuRU5DUllQVElPTl9TVEFUVVNfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1cyA9ICJpbmFjdGl2ZSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5FTkNSWVBUSU9OX1NUQVRVU19BQ1RJVkFUSU5HOgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0dXMgPSAiYWN0aXZhdGluZyI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5FTkNSWVBUSU9OX1NUQVRVU19BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1cyA9ICJhY3RpdmUiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXdTdGF0dXM7CisgICAgICAgIH0KICAgICB9CiB9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGlhbG9nQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGlhbG9nQWN0aXZpdHkuamF2YQppbmRleCA3NDQxYjc1Li5kOWRlYjQ3IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RpYWxvZ0FjdGl2aXR5LmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9EaWFsb2dBY3Rpdml0eS5qYXZhCkBAIC0xOCwxNiArMTgsMjEgQEAKIAogLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCiAvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLQotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAogLyoqCiAgKiA8aDM+RGlhbG9nIEFjdGl2aXR5PC9oMz4KLSAqIAotICogPHA+VGhpcyBkZW1vbnN0cmF0ZXMgdGhlIGhvdyB0byB3cml0ZSBhbiBhY3Rpdml0eSB0aGF0IGxvb2tzIGxpa2UgCisgKgorICogPHA+VGhpcyBkZW1vbnN0cmF0ZXMgdGhlIGhvdyB0byB3cml0ZSBhbiBhY3Rpdml0eSB0aGF0IGxvb2tzIGxpa2UKICAqIGEgcG9wLXVwIGRpYWxvZy48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBEaWFsb2dBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKQEAgLTQwLDE1ICs0NSw0MiBAQAogCXByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgLy8gQmUgc3VyZSB0byBjYWxsIHRoZSBzdXBlciBjbGFzcy4KICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCisKICAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OKTsKLSAgICAgICAgCisKKwogICAgICAgICAvLyBTZWUgYXNzZXRzL3Jlcy9hbnkvbGF5b3V0L2RpYWxvZ19hY3Rpdml0eS54bWwgZm9yIHRoaXMKICAgICAgICAgLy8gdmlldyBsYXlvdXQgZGVmaW5pdGlvbiwgd2hpY2ggaXMgYmVpbmcgc2V0IGhlcmUgYXMKICAgICAgICAgLy8gdGhlIGNvbnRlbnQgb2Ygb3VyIHNjcmVlbi4KICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZGlhbG9nX2FjdGl2aXR5KTsKLSAgICAgICAgCi0gICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVEcmF3YWJsZVJlc291cmNlKFdpbmRvdy5GRUFUVVJFX0xFRlRfSUNPTiwgCisgICAgICAgIGdldFdpbmRvdygpLnNldFRpdGxlKCJUaGlzIGlzIGp1c3QgYSB0ZXN0Iik7CisKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZURyYXdhYmxlUmVzb3VyY2UoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLAogICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5kcmF3YWJsZS5pY19kaWFsb2dfYWxlcnQpOworCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmFkZCk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUFkZENvbnRlbnRMaXN0ZW5lcik7CisgICAgICAgIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQucmVtb3ZlKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUmVtb3ZlQ29udGVudExpc3RlbmVyKTsKICAgICB9CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtQWRkQ29udGVudExpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIExpbmVhckxheW91dCBsYXlvdXQgPSAoTGluZWFyTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmlubmVyX2NvbnRlbnQpOworICAgICAgICAgICAgSW1hZ2VWaWV3IGl2ID0gbmV3IEltYWdlVmlldyhEaWFsb2dBY3Rpdml0eS50aGlzKTsKKyAgICAgICAgICAgIGl2LnNldEltYWdlRHJhd2FibGUoZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uNDh4NDhfMSkpOworICAgICAgICAgICAgaXYuc2V0UGFkZGluZyg0LCA0LCA0LCA0KTsKKyAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KGl2KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtUmVtb3ZlQ29udGVudExpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIExpbmVhckxheW91dCBsYXlvdXQgPSAoTGluZWFyTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmlubmVyX2NvbnRlbnQpOworICAgICAgICAgICAgaW50IG51bSA9IGxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAobnVtID4gMCkgeworICAgICAgICAgICAgICAgIGxheW91dC5yZW1vdmVWaWV3QXQobnVtLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRm9yZWdyb3VuZFNlcnZpY2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRm9yZWdyb3VuZFNlcnZpY2UuamF2YQppbmRleCA3ZTA2MWVkLi45Zjg0YmUxIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZvcmVncm91bmRTZXJ2aWNlLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Gb3JlZ3JvdW5kU2VydmljZS5qYXZhCkBAIC00OSwxNyArNDksMzMgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9CQUNLR1JPVU5EID0gImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5CQUNLR1JPVU5EIjsKICAgICAKICAvLyBCRUdJTl9JTkNMVURFKGZvcmVncm91bmRfY29tcGF0aWJpbGl0eSkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1TZXRGb3JlZ3JvdW5kU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgICAgICBib29sZWFuLmNsYXNzfTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1TdGFydEZvcmVncm91bmRTaWduYXR1cmUgPSBuZXcgQ2xhc3NbXSB7CiAgICAgICAgIGludC5jbGFzcywgTm90aWZpY2F0aW9uLmNsYXNzfTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1TdG9wRm9yZWdyb3VuZFNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgYm9vbGVhbi5jbGFzc307CiAgICAgCiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1OTTsKKyAgICBwcml2YXRlIE1ldGhvZCBtU2V0Rm9yZWdyb3VuZDsKICAgICBwcml2YXRlIE1ldGhvZCBtU3RhcnRGb3JlZ3JvdW5kOwogICAgIHByaXZhdGUgTWV0aG9kIG1TdG9wRm9yZWdyb3VuZDsKKyAgICBwcml2YXRlIE9iamVjdFtdIG1TZXRGb3JlZ3JvdW5kQXJncyA9IG5ldyBPYmplY3RbMV07CiAgICAgcHJpdmF0ZSBPYmplY3RbXSBtU3RhcnRGb3JlZ3JvdW5kQXJncyA9IG5ldyBPYmplY3RbMl07CiAgICAgcHJpdmF0ZSBPYmplY3RbXSBtU3RvcEZvcmVncm91bmRBcmdzID0gbmV3IE9iamVjdFsxXTsKICAgICAKKyAgICB2b2lkIGludm9rZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kLmludm9rZSh0aGlzLCBtU3RhcnRGb3JlZ3JvdW5kQXJncyk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICBMb2cudygiQXBpRGVtb3MiLCAiVW5hYmxlIHRvIGludm9rZSBtZXRob2QiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgIExvZy53KCJBcGlEZW1vcyIsICJVbmFibGUgdG8gaW52b2tlIG1ldGhvZCIsIGUpOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmV3IHN0YXJ0Rm9yZWdyb3VuZCBtZXRob2QsIHVzaW5nIHRoZSBvbGRlcgogICAgICAqIEFQSXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZS4KQEAgLTY5LDIwICs4NSwxMyBAQAogICAgICAgICBpZiAobVN0YXJ0Rm9yZWdyb3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kQXJnc1swXSA9IEludGVnZXIudmFsdWVPZihpZCk7CiAgICAgICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kQXJnc1sxXSA9IG5vdGlmaWNhdGlvbjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVN0YXJ0Rm9yZWdyb3VuZC5pbnZva2UodGhpcywgbVN0YXJ0Rm9yZWdyb3VuZEFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICAgICAgTG9nLncoIkFwaURlbW9zIiwgIlVuYWJsZSB0byBpbnZva2Ugc3RhcnRGb3JlZ3JvdW5kIiwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KLSAgICAgICAgICAgICAgICBMb2cudygiQXBpRGVtb3MiLCAiVW5hYmxlIHRvIGludm9rZSBzdGFydEZvcmVncm91bmQiLCBlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludm9rZU1ldGhvZChtU3RhcnRGb3JlZ3JvdW5kLCBtU3RhcnRGb3JlZ3JvdW5kQXJncyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIEZhbGwgYmFjayBvbiB0aGUgb2xkIEFQSS4KLSAgICAgICAgc2V0Rm9yZWdyb3VuZCh0cnVlKTsKKyAgICAgICAgbVNldEZvcmVncm91bmRBcmdzWzBdID0gQm9vbGVhbi5UUlVFOworICAgICAgICBpbnZva2VNZXRob2QobVNldEZvcmVncm91bmQsIG1TZXRGb3JlZ3JvdW5kQXJncyk7CiAgICAgICAgIG1OTS5ub3RpZnkoaWQsIG5vdGlmaWNhdGlvbik7CiAgICAgfQogICAgIApAQCAtMTA5LDcgKzExOCw4IEBACiAgICAgICAgIC8vIEZhbGwgYmFjayBvbiB0aGUgb2xkIEFQSS4gIE5vdGUgdG8gY2FuY2VsIEJFRk9SRSBjaGFuZ2luZyB0aGUKICAgICAgICAgLy8gZm9yZWdyb3VuZCBzdGF0ZSwgc2luY2Ugd2UgY291bGQgYmUga2lsbGVkIGF0IHRoYXQgcG9pbnQuCiAgICAgICAgIG1OTS5jYW5jZWwoaWQpOwotICAgICAgICBzZXRGb3JlZ3JvdW5kKGZhbHNlKTsKKyAgICAgICAgbVNldEZvcmVncm91bmRBcmdzWzBdID0gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgaW52b2tlTWV0aG9kKG1TZXRGb3JlZ3JvdW5kLCBtU2V0Rm9yZWdyb3VuZEFyZ3MpOwogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKQEAgLTEyMyw2ICsxMzMsMTQgQEAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIFJ1bm5pbmcgb24gYW4gb2xkZXIgcGxhdGZvcm0uCiAgICAgICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kID0gbVN0b3BGb3JlZ3JvdW5kID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNldEZvcmVncm91bmQgPSBnZXRDbGFzcygpLmdldE1ldGhvZCgic2V0Rm9yZWdyb3VuZCIsCisgICAgICAgICAgICAgICAgICAgIG1TZXRGb3JlZ3JvdW5kU2lnbmF0dXJlKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJPUyBkb2Vzbid0IGhhdmUgU2VydmljZS5zdGFydEZvcmVncm91bmQgT1IgU2VydmljZS5zZXRGb3JlZ3JvdW5kISIpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbGVydERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZGRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgdG8gc2hvdyBhbiBBbGVydERpYWxvZyB0aGF0IGlzIG1hbmFnZWQgYnkgYSBGcmFnbWVudC4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50QWxlcnREaWFsb2cgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgYW4gYWxlcnQgZGlhbG9nIHdpdGggYSBEaWFsb2dGcmFnbWVudCIpOworCisgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zaG93KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGFjdGl2aXR5KQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zX3RpdGxlKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhnZXRGcmFnbWVudE1hbmFnZXIoKSwgImRpYWxvZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zaXRpdmVDbGljaygpIHsKKyAgICAgICAgLy8gRG8gc3R1ZmYgaGVyZS4KKyAgICAgICAgTG9nLmkoIkZyYWdtZW50QWxlcnREaWFsb2ciLCAiUG9zaXRpdmUgY2xpY2shIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRvTmVnYXRpdmVDbGljaygpIHsKKyAgICAgICAgLy8gRG8gc3R1ZmYgaGVyZS4KKyAgICAgICAgTG9nLmkoIkZyYWdtZW50QWxlcnREaWFsb2ciLCAiTmVnYXRpdmUgY2xpY2shIik7CisgICAgfQorLy9FTkRfSU5DTFVERShhY3Rpdml0eSkKKyAgICAKKy8vQkVHSU5fSU5DTFVERShkaWFsb2cpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IHRpdGxlKSB7CisgICAgICAgICAgICBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgZnJhZyA9IG5ldyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoInRpdGxlIiwgdGl0bGUpOworICAgICAgICAgICAgZnJhZy5zZXRBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gZnJhZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgaW50IHRpdGxlID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJ0aXRsZSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0QWN0aXZpdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24oUi5kcmF3YWJsZS5hbGVydF9kaWFsb2dfaWNvbikKKyAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKHRpdGxlKQorICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGcmFnbWVudEFsZXJ0RGlhbG9nKWdldEFjdGl2aXR5KCkpLmRvUG9zaXRpdmVDbGljaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX2NhbmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRnJhZ21lbnRBbGVydERpYWxvZylnZXRBY3Rpdml0eSgpKS5kb05lZ2F0aXZlQ2xpY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkaWFsb2cpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QXJndW1lbnRzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QXJndW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxNzcyOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBcmd1bWVudHMuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0ZXMgYSBmcmFnbWVudCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRocm91Z2ggYm90aCBCdW5kbGUgYXJndW1lbnRzCisgKiBhbmQgbGF5b3V0IGF0dHJpYnV0ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudEFyZ3VtZW50cyBleHRlbmRzIEFjdGl2aXR5IHsKKy8vQkVHSU5fSU5DTFVERShjcmVhdGUpCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfYXJndW1lbnRzKTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LXRpbWUgaW5pdDsgY3JlYXRlIGZyYWdtZW50IHRvIGVtYmVkIGluIGFjdGl2aXR5LgorICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIEZyYWdtZW50IG5ld0ZyYWdtZW50ID0gTXlGcmFnbWVudC5uZXdJbnN0YW5jZSgiRnJvbSBBcmd1bWVudHMiKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLmNyZWF0ZWQsIG5ld0ZyYWdtZW50KTsKKyAgICAgICAgICAgIGZ0LmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShjcmVhdGUpCisKKy8vQkVHSU5fSU5DTFVERShmcmFnbWVudCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIENoYXJTZXF1ZW5jZSBtTGFiZWw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBNeUZyYWdtZW50IHRoYXQgd2lsbCBiZSBpbml0aWFsaXplZAorICAgICAgICAgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlGcmFnbWVudCBuZXdJbnN0YW5jZShDaGFyU2VxdWVuY2UgbGFiZWwpIHsKKyAgICAgICAgICAgIE15RnJhZ21lbnQgZiA9IG5ldyBNeUZyYWdtZW50KCk7CisgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGIucHV0Q2hhclNlcXVlbmNlKCJsYWJlbCIsIGxhYmVsKTsKKyAgICAgICAgICAgIGYuc2V0QXJndW1lbnRzKGIpOworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2UgYXR0cmlidXRlcyBkdXJpbmcgaW5mbGF0aW9uIGZyb20gYSB2aWV3IGhpZXJhcmNoeSBpbnRvIHRoZQorICAgICAgICAgKiBhcmd1bWVudHMgd2UgaGFuZGxlLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uSW5mbGF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uSW5mbGF0ZShhY3Rpdml0eSwgYXR0cnMsIHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkZyYWdtZW50QXJndW1lbnRzKTsKKyAgICAgICAgICAgIG1MYWJlbCA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5GcmFnbWVudEFyZ3VtZW50c19hbmRyb2lkX2xhYmVsKTsKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1cmluZyBjcmVhdGlvbiwgaWYgYXJndW1lbnRzIGhhdmUgYmVlbiBzdXBwbGllZCB0byB0aGUgZnJhZ21lbnQKKyAgICAgICAgICogdGhlbiBwYXJzZSB0aG9zZSBvdXQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGFiZWwgPSBhcmdzLmdldENoYXJTZXF1ZW5jZSgibGFiZWwiLCBtTGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSB0aGUgdmlldyBmb3IgdGhpcyBmcmFnbWVudCwgdXNpbmcgdGhlIGFyZ3VtZW50cyBnaXZlbiB0byBpdC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5oZWxsb193b3JsZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQobUxhYmVsICE9IG51bGwgPyBtTGFiZWwgOiAiKG5vIGxhYmVsKSIpOworICAgICAgICAgICAgdHYuc2V0QmFja2dyb3VuZERyYXdhYmxlKGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGFuZHJvaWQuUi5kcmF3YWJsZS5nYWxsZXJ5X3RodW1iKSk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZnJhZ21lbnQpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRDb250ZXh0TWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzczZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIGRpc3BsYXlpbmcgYSBjb250ZXh0IG1lbnUgZnJvbSBhIGZyYWdtZW50LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRDb250ZXh0TWVudSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBDb250ZXh0TWVudUZyYWdtZW50IGNvbnRlbnQgPSBuZXcgQ29udGV4dE1lbnVGcmFnbWVudCgpOworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBjb250ZW50KS5jb21taXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRleHRNZW51RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHJvb3QgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X2NvbnRleHRfbWVudSwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICByZWdpc3RlckZvckNvbnRleHRNZW51KHJvb3QuZmluZFZpZXdCeUlkKFIuaWQubG9uZ19wcmVzcykpOworICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgICAgICAgICBtZW51LmFkZChNZW51Lk5PTkUsIFIuaWQuYV9pdGVtLCBNZW51Lk5PTkUsICJNZW51IEEiKTsKKyAgICAgICAgICAgIG1lbnUuYWRkKE1lbnUuTk9ORSwgUi5pZC5iX2l0ZW0sIE1lbnUuTk9ORSwgIk1lbnUgQiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuYV9pdGVtOgorICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQ29udGV4dE1lbnUiLCAiSXRlbSAxYSB3YXMgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5iX2l0ZW06CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJDb250ZXh0TWVudSIsICJJdGVtIDFiIHdhcyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTE2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50RGlhbG9nIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIGludCBtU3RhY2tMZXZlbCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgZGlhbG9ncyB3aXRoIGEgRGlhbG9nRnJhZ21lbnQuICAiCisgICAgICAgICAgICAgICAgKyAiUHJlc3MgdGhlIHNob3cgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgZmlyc3QgZGlhbG9nOyBwcmVzc2luZyAiCisgICAgICAgICAgICAgICAgKyAic3VjY2Vzc2l2ZSBzaG93IGJ1dHRvbnMgd2lsbCBkaXNwbGF5IG90aGVyIGRpYWxvZyBzdHlsZXMgYXMgYSAiCisgICAgICAgICAgICAgICAgKyAic3RhY2ssIHdpdGggZGlzbWlzc2luZyBvciBiYWNrIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBkaWFsb2cuIik7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNob3cpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3RhY2tMZXZlbCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoImxldmVsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJsZXZlbCIsIG1TdGFja0xldmVsKTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShhZGRfZGlhbG9nKQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgbVN0YWNrTGV2ZWwrKzsKKworICAgICAgICAvLyBEaWFsb2dGcmFnbWVudC5zaG93KCkgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIHRoZSBmcmFnbWVudAorICAgICAgICAvLyBpbiBhIHRyYW5zYWN0aW9uLiAgV2UgYWxzbyB3YW50IHRvIHJlbW92ZSBhbnkgY3VycmVudGx5IHNob3dpbmcKKyAgICAgICAgLy8gZGlhbG9nLCBzbyBtYWtlIG91ciBvd24gdHJhbnNhY3Rpb24gYW5kIHRha2UgY2FyZSBvZiB0aGF0IGhlcmUuCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIEZyYWdtZW50IHByZXYgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeVRhZygiZGlhbG9nIik7CisgICAgICAgIGlmIChwcmV2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZ0LnJlbW92ZShwcmV2KTsKKyAgICAgICAgfQorICAgICAgICBmdC5hZGRUb0JhY2tTdGFjayhudWxsKTsKKworICAgICAgICAvLyBDcmVhdGUgYW5kIHNob3cgdGhlIGRpYWxvZy4KKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKG1TdGFja0xldmVsKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhmdCwgImRpYWxvZyIpOworICAgIH0KKy8vRU5EX0lOQ0xVREUoYWRkX2RpYWxvZykKKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZvck51bShpbnQgbnVtKSB7CisgICAgICAgIHN3aXRjaCAoKG51bS0xKSU2KSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAiU1RZTEVfTk9fVElUTEUiOworICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gIlNUWUxFX05PX0ZSQU1FIjsKKyAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuICJTVFlMRV9OT19JTlBVVCAodGhpcyB3aW5kb3cgY2FuJ3QgcmVjZWl2ZSBpbnB1dCwgc28gIgorICAgICAgICAgICAgICAgICAgICArICJ5b3Ugd2lsbCBuZWVkIHRvIHByZXNzIHRoZSBib3R0b20gc2hvdyBidXR0b24pIjsKKyAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuICJTVFlMRV9OT1JNQUwgd2l0aCBkYXJrIGZ1bGxzY3JlZW4gdGhlbWUiOworICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gIlNUWUxFX05PUk1BTCB3aXRoIGxpZ2h0IHRoZW1lIjsKKyAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuICJTVFlMRV9OT19USVRMRSB3aXRoIGxpZ2h0IHRoZW1lIjsKKyAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuICJTVFlMRV9OT19GUkFNRSB3aXRoIGxpZ2h0IHRoZW1lIjsKKyAgICAgICAgICAgIGNhc2UgODogcmV0dXJuICJTVFlMRV9OT1JNQUwgd2l0aCBsaWdodCBmdWxsc2NyZWVuIHRoZW1lIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlNUWUxFX05PUk1BTCI7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICAgICAgaW50IG1OdW07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBNeURpYWxvZ0ZyYWdtZW50LCBwcm92aWRpbmcgIm51bSIKKyAgICAgICAgICogYXMgYW4gYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlEaWFsb2dGcmFnbWVudCBuZXdJbnN0YW5jZShpbnQgbnVtKSB7CisgICAgICAgICAgICBNeURpYWxvZ0ZyYWdtZW50IGYgPSBuZXcgTXlEaWFsb2dGcmFnbWVudCgpOworCisgICAgICAgICAgICAvLyBTdXBwbHkgbnVtIGlucHV0IGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmdzLnB1dEludCgibnVtIiwgbnVtKTsKKyAgICAgICAgICAgIGYuc2V0QXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBtTnVtID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKTsKKworICAgICAgICAgICAgLy8gUGljayBhIHN0eWxlIGJhc2VkIG9uIHRoZSBudW0uCisgICAgICAgICAgICBpbnQgc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUwsIHRoZW1lID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgMTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19USVRMRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0ZSQU1FOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9fSU5QVVQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19USVRMRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3OiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0ZSQU1FOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDg6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9STUFMOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgNDogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfSG9sbzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OiB0aGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvX0xpZ2h0X0RpYWxvZzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OiB0aGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvX0xpZ2h0OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDc6IHRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0hvbG9fTGlnaHRfUGFuZWw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgODogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfSG9sb19MaWdodDsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwgdGhlbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZywgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIkRpYWxvZyAjIiArIG1OdW0gKyAiOiB1c2luZyBzdHlsZSAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0TmFtZUZvck51bShtTnVtKSk7CisKKyAgICAgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC5zaG93KTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJ1dHRvbiBpcyBjbGlja2VkLCBjYWxsIHVwIHRvIG93bmluZyBhY3Rpdml0eS4KKyAgICAgICAgICAgICAgICAgICAgKChGcmFnbWVudERpYWxvZylnZXRBY3Rpdml0eSgpKS5zaG93RGlhbG9nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkaWFsb2cpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJiZTIyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBGcmFnbWVudERpYWxvZ09yQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkpOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QtdGltZSBpbml0OyBjcmVhdGUgZnJhZ21lbnQgdG8gZW1iZWQgaW4gYWN0aXZpdHkuCisvL0JFR0lOX0lOQ0xVREUoZW1iZWQpCisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmdC5hZGQoUi5pZC5lbWJlZGRlZCwgbmV3RnJhZ21lbnQpOworICAgICAgICAgICAgZnQuY29tbWl0KCk7CisvL0VORF9JTkNMVURFKGVtYmVkKQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNob3dfZGlhbG9nKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKHNob3dfZGlhbG9nKQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBmcmFnbWVudCBhbmQgc2hvdyBpdCBhcyBhIGRpYWxvZy4KKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIG5ld0ZyYWdtZW50LnNob3coZ2V0RnJhZ21lbnRNYW5hZ2VyKCksICJkaWFsb2ciKTsKKyAgICB9CisvL0VORF9JTkNMVURFKHNob3dfZGlhbG9nKQorCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICAgICAgc3RhdGljIE15RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15RGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5oZWxsb193b3JsZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIlRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgTXlEaWFsb2dGcmFnbWVudCIpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRpYWxvZykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRIaWRlU2hvdy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEhpZGVTaG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlMjU5OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRIaWRlU2hvdy5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgaGlkaW5nIGFuZCBzaG93aW5nIGZyYWdtZW50cy4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50SGlkZVNob3cgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2hpZGVfc2hvdyk7CisKKyAgICAgICAgLy8gVGhlIGNvbnRlbnQgdmlldyBlbWJlZHMgdHdvIGZyYWdtZW50czsgbm93IHJldHJpZXZlIHRoZW0gYW5kIGF0dGFjaAorICAgICAgICAvLyB0aGVpciAiaGlkZSIgYnV0dG9uLgorICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKyAgICAgICAgYWRkU2hvd0hpZGVMaXN0ZW5lcihSLmlkLmZyYWcxaGlkZSwgZm0uZmluZEZyYWdtZW50QnlJZChSLmlkLmZyYWdtZW50MSkpOworICAgICAgICBhZGRTaG93SGlkZUxpc3RlbmVyKFIuaWQuZnJhZzJoaWRlLCBmbS5maW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ21lbnQyKSk7CisgICAgfQorCisgICAgdm9pZCBhZGRTaG93SGlkZUxpc3RlbmVyKGludCBidXR0b25JZCwgZmluYWwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGJ1dHRvbklkKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGZ0LnNldEN1c3RvbUFuaW1hdGlvbnMoYW5kcm9pZC5SLmFuaW1hdG9yLmZhZGVfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuYW5pbWF0b3IuZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5pc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGZ0LnNob3coZnJhZ21lbnQpOworICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VGV4dCgiSGlkZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZ0LmhpZGUoZnJhZ21lbnQpOworICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VGV4dCgiU2hvdyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaXJzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICBUZXh0VmlldyBtVGV4dFZpZXc7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxhYmVsZWRfdGV4dF9lZGl0LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm1zZyk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJUaGUgZnJhZ21lbnQgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoaXMgdGV4dC4iKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRleHQgZWRpdG9yLCBhbmQgcmVzdG9yZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZSBpZiBuZWVkZWQuCisgICAgICAgICAgICBtVGV4dFZpZXcgPSAoVGV4dFZpZXcpdi5maW5kVmlld0J5SWQoUi5pZC5zYXZlZCk7CisgICAgICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Q2hhclNlcXVlbmNlKCJ0ZXh0IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY3VycmVudCB0ZXh0LCB0byByZXN0b3JlIGlmIHdlIGxhdGVyIHJlc3RhcnQuCisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRDaGFyU2VxdWVuY2UoInRleHQiLCBtVGV4dFZpZXcuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxhYmVsZWRfdGV4dF9lZGl0LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm1zZyk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJUaGUgVGV4dFZpZXcgc2F2ZXMgYW5kIHJlc3RvcmVzIHRoaXMgdGV4dC4iKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRleHQgZWRpdG9yIGFuZCB0ZWxsIGl0IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzIHN0YXRlLgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHlvdSB3aWxsIG9mdGVuIHNldCB0aGlzIGluIHRoZSBsYXlvdXQgWE1MLCBidXQgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIGFyZSBzaGFyaW5nIG91ciBsYXlvdXQgd2l0aCB0aGUgb3RoZXIgZnJhZ21lbnQgd2Ugd2lsbCBjdXN0b21pemUKKyAgICAgICAgICAgIC8vIGl0IGhlcmUuCisgICAgICAgICAgICAoKFRleHRWaWV3KXYuZmluZFZpZXdCeUlkKFIuaWQuc2F2ZWQpKS5zZXRTYXZlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGY0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuU2hha2VzcGVhcmU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHVzaW5nIGZyYWdtZW50cyB0byBpbXBsZW1lbnQgZGlmZmVyZW50IGFjdGl2aXR5IGxheW91dHMuCisgKiBUaGlzIHNhbXBsZSBwcm92aWRlcyBhIGRpZmZlcmVudCBsYXlvdXQgKGFuZCBhY3Rpdml0eSBmbG93KSB3aGVuIHJ1biBpbgorICogbGFuZHNjYXBlLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMYXlvdXQgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKy8vQkVHSU5fSU5DTFVERShtYWluKQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2xheW91dCk7CisgICAgfQorLy9FTkRfSU5DTFVERShtYWluKQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNlY29uZGFyeSBhY3Rpdml0eSwgdG8gc2hvdyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZAorICAgICAqIHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIHNob3cgaXQgYWxsIGluIG9uZSBhY3Rpdml0eS4KKyAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShkZXRhaWxzX2FjdGl2aXR5KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGV0YWlsc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBpZiAoZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLm9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmVlbiBpcyBub3cgaW4gbGFuZHNjYXBlIG1vZGUsIHdlIGNhbiBzaG93IHRoZQorICAgICAgICAgICAgICAgIC8vIGRpYWxvZyBpbi1saW5lIHdpdGggdGhlIGxpc3Qgc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGFjdGl2aXR5LgorICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRHVyaW5nIGluaXRpYWwgc2V0dXAsIHBsdWcgaW4gdGhlIGRldGFpbHMgZnJhZ21lbnQuCisgICAgICAgICAgICAgICAgRGV0YWlsc0ZyYWdtZW50IGRldGFpbHMgPSBuZXcgRGV0YWlsc0ZyYWdtZW50KCk7CisgICAgICAgICAgICAgICAgZGV0YWlscy5zZXRBcmd1bWVudHMoZ2V0SW50ZW50KCkuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsIGRldGFpbHMpLmNvbW1pdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkZXRhaWxzX2FjdGl2aXR5KQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgInRvcC1sZXZlbCIgZnJhZ21lbnQsIHNob3dpbmcgYSBsaXN0IG9mIGl0ZW1zIHRoYXQgdGhlCisgICAgICogdXNlciBjYW4gcGljay4gIFVwb24gcGlja2luZyBhbiBpdGVtLCBpdCB0YWtlcyBjYXJlIG9mIGRpc3BsYXlpbmcgdGhlCisgICAgICogZGF0YSB0byB0aGUgdXNlciBhcyBhcHByb3ByaWF0ZSBiYXNlZCBvbiB0aGUgY3VycnJlbnQgVUkgbGF5b3V0LgorICAgICAqLworLy9CRUdJTl9JTkNMVURFKHRpdGxlcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpdGxlc0ZyYWdtZW50IGV4dGVuZHMgTGlzdEZyYWdtZW50IHsKKyAgICAgICAgYm9vbGVhbiBtRHVhbFBhbmU7CisgICAgICAgIGludCBtQ3VyQ2hlY2tQb3NpdGlvbiA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIGxpc3Qgd2l0aCBvdXIgc3RhdGljIGFycmF5IG9mIHRpdGxlcy4KKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEsIFNoYWtlc3BlYXJlLlRJVExFUykpOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGZyYW1lIGluIHdoaWNoIHRvIGVtYmVkIHRoZSBkZXRhaWxzCisgICAgICAgICAgICAvLyBmcmFnbWVudCBkaXJlY3RseSBpbiB0aGUgY29udGFpbmluZyBVSS4KKyAgICAgICAgICAgIFZpZXcgZGV0YWlsc0ZyYW1lID0gZ2V0QWN0aXZpdHkoKS5maW5kVmlld0J5SWQoUi5pZC5kZXRhaWxzKTsKKyAgICAgICAgICAgIG1EdWFsUGFuZSA9IGRldGFpbHNGcmFtZSAhPSBudWxsICYmIGRldGFpbHNGcmFtZS5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworCisgICAgICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGxhc3Qgc3RhdGUgZm9yIGNoZWNrZWQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgbUN1ckNoZWNrUG9zaXRpb24gPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJjdXJDaG9pY2UiLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EdWFsUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIEluIGR1YWwtcGFuZSBtb2RlLCB0aGUgbGlzdCB2aWV3IGhpZ2hsaWdodHMgdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91ciBVSSBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZS4KKyAgICAgICAgICAgICAgICBzaG93RGV0YWlscyhtQ3VyQ2hlY2tQb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KCJjdXJDaG9pY2UiLCBtQ3VyQ2hlY2tQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBzaG93RGV0YWlscyhwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHNob3cgdGhlIGRldGFpbHMgb2YgYSBzZWxlY3RlZCBpdGVtLCBlaXRoZXIgYnkKKyAgICAgICAgICogZGlzcGxheWluZyBhIGZyYWdtZW50IGluLXBsYWNlIGluIHRoZSBjdXJyZW50IFVJLCBvciBzdGFydGluZyBhCisgICAgICAgICAqIHdob2xlIG5ldyBhY3Rpdml0eSBpbiB3aGljaCBpdCBpcyBkaXNwbGF5ZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNob3dEZXRhaWxzKGludCBpbmRleCkgeworICAgICAgICAgICAgbUN1ckNoZWNrUG9zaXRpb24gPSBpbmRleDsKKworICAgICAgICAgICAgaWYgKG1EdWFsUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBkaXNwbGF5IGV2ZXJ5dGhpbmcgaW4tcGxhY2Ugd2l0aCBmcmFnbWVudHMsIHNvIHVwZGF0ZQorICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHRvIGhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgaXRlbSBhbmQgc2hvdyB0aGUgZGF0YS4KKyAgICAgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldEl0ZW1DaGVja2VkKGluZGV4LCB0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoYXQgZnJhZ21lbnQgaXMgY3VycmVudGx5IHNob3duLCByZXBsYWNlIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBEZXRhaWxzRnJhZ21lbnQgZGV0YWlscyA9IChEZXRhaWxzRnJhZ21lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeUlkKFIuaWQuZGV0YWlscyk7CisgICAgICAgICAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbCB8fCBkZXRhaWxzLmdldFNob3duSW5kZXgoKSAhPSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIG5ldyBmcmFnbWVudCB0byBzaG93IHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBkZXRhaWxzID0gRGV0YWlsc0ZyYWdtZW50Lm5ld0luc3RhbmNlKGluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIGEgdHJhbnNhY3Rpb24sIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGlzIG9uZSBpbnNpZGUgdGhlIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmdC5yZXBsYWNlKFIuaWQuZGV0YWlscywgZGV0YWlscyk7CisgICAgICAgICAgICAgICAgICAgIGZ0LnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0ZBREUpOworICAgICAgICAgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gbGF1bmNoIGEgbmV3IGFjdGl2aXR5IHRvIGRpc3BsYXkKKyAgICAgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIGZyYWdtZW50IHdpdGggc2VsZWN0ZWQgdGV4dC4KKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzcyhnZXRBY3Rpdml0eSgpLCBEZXRhaWxzQWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiaW5kZXgiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERSh0aXRsZXMpCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgZnJhZ21lbnQsIGRpc3BsYXlpbmcgdGhlIGRldGFpbHMgb2YgYSBwYXJ0aWN1bGFyCisgICAgICogaXRlbS4KKyAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShkZXRhaWxzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGV0YWlsc0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIERldGFpbHNGcmFnbWVudCwgaW5pdGlhbGl6ZWQgdG8KKyAgICAgICAgICogc2hvdyB0aGUgdGV4dCBhdCAnaW5kZXgnLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBEZXRhaWxzRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IGluZGV4KSB7CisgICAgICAgICAgICBEZXRhaWxzRnJhZ21lbnQgZiA9IG5ldyBEZXRhaWxzRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IGluZGV4IGlucHV0IGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmdzLnB1dEludCgiaW5kZXgiLCBpbmRleCk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFNob3duSW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJpbmRleCIsIDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGRpZmZlcmVudCBsYXlvdXRzLCBhbmQgaW4gb25lIG9mIHRoZW0gdGhpcworICAgICAgICAgICAgICAgIC8vIGZyYWdtZW50J3MgY29udGFpbmluZyBmcmFtZSBkb2Vzbid0IGV4aXN0LiAgVGhlIGZyYWdtZW50CisgICAgICAgICAgICAgICAgLy8gbWF5IHN0aWxsIGJlIGNyZWF0ZWQgZnJvbSBpdHMgc2F2ZWQgc3RhdGUsIGJ1dCB0aGVyZSBpcworICAgICAgICAgICAgICAgIC8vIG5vIHJlYXNvbiB0byB0cnkgdG8gY3JlYXRlIGl0cyB2aWV3IGhpZXJhcmNoeSBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgLy8gd29uJ3QgYmUgZGlzcGxheWVkLiAgTm90ZSB0aGlzIGlzIG5vdCBuZWVkZWQgLS0gd2UgY291bGQKKyAgICAgICAgICAgICAgICAvLyBqdXN0IHJ1biB0aGUgY29kZSBiZWxvdywgd2hlcmUgd2Ugd291bGQgY3JlYXRlIGFuZCByZXR1cm4KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyBoaWVyYXJjaHk7IGl0IHdvdWxkIGp1c3QgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IG5ldyBTY3JvbGxWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgVGV4dFZpZXcgdGV4dCA9IG5ldyBUZXh0VmlldyhnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgICAgIGludCBwYWRkaW5nID0gKGludClUeXBlZFZhbHVlLmFwcGx5RGltZW5zaW9uKFR5cGVkVmFsdWUuQ09NUExFWF9VTklUX0RJUCwKKyAgICAgICAgICAgICAgICAgICAgNCwgZ2V0QWN0aXZpdHkoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpKTsKKyAgICAgICAgICAgIHRleHQuc2V0UGFkZGluZyhwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIHNjcm9sbGVyLmFkZFZpZXcodGV4dCk7CisgICAgICAgICAgICB0ZXh0LnNldFRleHQoU2hha2VzcGVhcmUuRElBTE9HVUVbZ2V0U2hvd25JbmRleCgpXSk7CisgICAgICAgICAgICByZXR1cm4gc2Nyb2xsZXI7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRldGFpbHMpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGlzdEFycmF5LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGlzdEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNmRkYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMaXN0QXJyYXkuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlNoYWtlc3BlYXJlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgdXNpbmcgTGlzdEZyYWdtZW50IHRvIHNob3cgYSBsaXN0IG9mIGl0ZW1zCisgKiBmcm9tIGEgY2FubmVkIGFycmF5LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMaXN0QXJyYXkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZyYWdtZW50IGFuZCBhZGQgaXQgYXMgb3VyIHNvbGUgY29udGVudC4KKyAgICAgICAgaWYgKGdldEZyYWdtZW50TWFuYWdlcigpLmZpbmRGcmFnbWVudEJ5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpID09IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgQXJyYXlMaXN0RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsIGxpc3QpLmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcnJheUxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIFNoYWtlc3BlYXJlLlRJVExFUykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgTG9nLmkoIkZyYWdtZW50TGlzdCIsICJJdGVtIGNsaWNrZWQ6ICIgKyBpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TWVudS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudE1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU4OGQxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudE1lbnUuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgZnJhZ21lbnRzIGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGUgb3B0aW9ucyBtZW51LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRNZW51IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEZyYWdtZW50IG1GcmFnbWVudDE7CisgICAgRnJhZ21lbnQgbUZyYWdtZW50MjsKKyAgICBDaGVja0JveCBtQ2hlY2tCb3gxOworICAgIENoZWNrQm94IG1DaGVja0JveDI7CisKKyAgICAvLyBVcGRhdGUgZnJhZ21lbnQgdmlzaWJpbGl0eSB3aGVuIGNoZWNrIGJveGVzIGFyZSBjaGFuZ2VkLgorICAgIGZpbmFsIE9uQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X21lbnUpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0d28gbWVudSBmcmFnbWVudHMgYXJlIGNyZWF0ZWQuCisgICAgICAgIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEZyYWdtZW50TWFuYWdlcigpOworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZm0uYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBtRnJhZ21lbnQxID0gZm0uZmluZEZyYWdtZW50QnlUYWcoImYxIik7CisgICAgICAgIGlmIChtRnJhZ21lbnQxID09IG51bGwpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudDEgPSBuZXcgTWVudUZyYWdtZW50KCk7CisgICAgICAgICAgICBmdC5hZGQobUZyYWdtZW50MSwgImYxIik7CisgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50MiA9IGZtLmZpbmRGcmFnbWVudEJ5VGFnKCJmMiIpOworICAgICAgICBpZiAobUZyYWdtZW50MiA9PSBudWxsKSB7CisgICAgICAgICAgICBtRnJhZ21lbnQyID0gbmV3IE1lbnUyRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGZ0LmFkZChtRnJhZ21lbnQyLCAiZjIiKTsKKyAgICAgICAgfQorICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFdhdGNoIGNoZWNrIGJveCBjbGlja3MuCisgICAgICAgIG1DaGVja0JveDEgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTEpOworICAgICAgICBtQ2hlY2tCb3gxLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1DaGVja0JveDIgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTIpOworICAgICAgICBtQ2hlY2tCb3gyLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgZnJhZ21lbnRzIHN0YXJ0IG91dCB3aXRoIGNvcnJlY3QgdmlzaWJpbGl0eS4KKyAgICAgICAgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGZyYWdtZW50cyBhcmUgdXBkYXRlZCBhZnRlciBjaGVjayBib3ggdmlldyBzdGF0ZSBpcyByZXN0b3JlZC4KKyAgICAgICAgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIGZyYWdtZW50IHZpc2liaWxpdHkgYmFzZWQgb24gY3VycmVudCBjaGVjayBib3ggc3RhdGUuCisgICAgdm9pZCB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtQ2hlY2tCb3gxLmlzQ2hlY2tlZCgpKSBmdC5zaG93KG1GcmFnbWVudDEpOworICAgICAgICBlbHNlIGZ0LmhpZGUobUZyYWdtZW50MSk7CisgICAgICAgIGlmIChtQ2hlY2tCb3gyLmlzQ2hlY2tlZCgpKSBmdC5zaG93KG1GcmFnbWVudDIpOworICAgICAgICBlbHNlIGZ0LmhpZGUobUZyYWdtZW50Mik7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZnJhZ21lbnQgdGhhdCBkaXNwbGF5cyBhIG1lbnUuICBUaGlzIGZyYWdtZW50IGhhcHBlbnMgdG8gbm90CisgICAgICogaGF2ZSBhIFVJIChpdCBkb2VzIG5vdCBpbXBsZW1lbnQgb25DcmVhdGVWaWV3KSwgYnV0IGl0IGNvdWxkIGFsc28KKyAgICAgKiBoYXZlIG9uZSBpZiBpdCB3YW50ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZW51RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICBtZW51LmFkZCgiTWVudSAxYSIpLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgICAgIG1lbnUuYWRkKCJNZW51IDFiIikuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2Vjb25kIGZyYWdtZW50IHdpdGggYSBtZW51LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVudTJGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKCJNZW51IDIiKS5zZXRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmVjZWl2ZVJlc3VsdC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJlY2VpdmVSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA3Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJlY2VpdmVSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRSZWNlaXZlUmVzdWx0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgRnJhbWVMYXlvdXQgZnJhbWUgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGZyYW1lLnNldElkKFIuaWQuc2ltcGxlX2ZyYWdtZW50KTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoZnJhbWUsIGxwKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRG8gZmlyc3QgdGltZSBpbml0aWFsaXphdGlvbiAtLSBhZGQgZnJhZ21lbnQuIAorICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBuZXcgUmVjZWl2ZVJlc3VsdEZyYWdtZW50KCk7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZnQuYWRkKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlY2VpdmVSZXN1bHRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgLy8gRGVmaW5pdGlvbiBvZiB0aGUgb25lIHJlcXVlc3RDb2RlIHdlIHVzZSBmb3IgcmVjZWl2aW5nIHJlc3Vscy4KKyAgICAgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEdFVF9DT0RFID0gMDsKKworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1SZXN1bHRzOworCisgICAgICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1HZXRMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhY3Rpdml0eSB3aG9zZSByZXN1bHQgd2Ugd2FudCB0byByZXRyaWV2ZS4gIFRoZQorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCB3aWxsIGNvbWUgYmFjayB3aXRoIHJlcXVlc3QgY29kZSBHRVRfQ09ERS4KKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChnZXRBY3Rpdml0eSgpLCBTZW5kUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgR0VUX0NPREUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5yZWNlaXZlX3Jlc3VsdCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBUZXh0VmlldyB3aWRnZXQgdGhhdCB3aWxsIGRpc3BsYXkgcmVzdWx0cy4KKyAgICAgICAgICAgIG1SZXN1bHRzID0gKFRleHRWaWV3KXYuZmluZFZpZXdCeUlkKFIuaWQucmVzdWx0cyk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGxhdGVyIGV4dGVuZCB0aGUgdGV4dCBidWZmZXIuCisgICAgICAgICAgICBtUmVzdWx0cy5zZXRUZXh0KG1SZXN1bHRzLmdldFRleHQoKSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5FRElUQUJMRSk7CisKKyAgICAgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICAgICAgQnV0dG9uIGdldEJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC5nZXQpOworICAgICAgICAgICAgZ2V0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtR2V0TGlzdGVuZXIpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc2VuZGluZyBhY3Rpdml0eSBoYXMgZmluaXNoZWQsIHdpdGggdGhlCisgICAgICAgICAqIHJlc3VsdCBpdCBzdXBwbGllZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgICAgICAvLyBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdENvZGUgdG8gc2VsZWN0IGJldHdlZW4gbXVsdGlwbGUgY2hpbGQKKyAgICAgICAgICAgIC8vIGFjdGl2aXRpZXMgeW91IG1heSBoYXZlIHN0YXJ0ZWQuICBIZXJlIHRoZXJlIGlzIG9ubHkgb25lIHRoaW5nCisgICAgICAgICAgICAvLyB3ZSBsYXVuY2guCisgICAgICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gR0VUX0NPREUpIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYmUgYWRkaW5nIHRvIG91ciB0ZXh0LgorICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoRWRpdGFibGUpbVJlc3VsdHMuZ2V0VGV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YW5kYXJkIHJlc3VsdENvZGUgdGhhdCBpcyBzZW50IGJhY2sgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgZG9lc24ndCBzdXBwbHkgYW4gZXhwbGljaXQgcmVzdWx0LiAgSXQgd2lsbCBhbHNvCisgICAgICAgICAgICAgICAgLy8gYmUgcmV0dXJuZWQgaWYgdGhlIGFjdGl2aXR5IGZhaWxlZCB0byBsYXVuY2guCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gUkVTVUxUX0NBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIoY2FuY2VsbGVkKSIpOworCisgICAgICAgICAgICAgICAgLy8gT3VyIHByb3RvY29sIHdpdGggdGhlIHNlbmRpbmcgYWN0aXZpdHkgaXMgdGhhdCBpdCB3aWxsIHNlbmQKKyAgICAgICAgICAgICAgICAvLyB0ZXh0IGluICdkYXRhJyBhcyBpdHMgcmVzdWx0LgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIob2theSAiKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhyZXN1bHRDb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIpICIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZChkYXRhLmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmV0YWluSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRkYWUyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgeW91IGNhbiB1c2UgYSBGcmFnbWVudCB0byBlYXNpbHkgcHJvcGFnYXRlIHN0YXRlCisgKiAoc3VjaCBhcyB0aHJlYWRzKSBhY3Jvc3MgYWN0aXZpdHkgaW5zdGFuY2VzIHdoZW4gYW4gYWN0aXZpdHkgbmVlZHMgdG8gYmUKKyAqIHJlc3RhcnRlZCBkdWUgdG8sIGZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLiAgVGhpcyBpcyBhIGxvdAorICogZWFzaWVyIHRoYW4gdXNpbmcgdGhlIHJhdyBBY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpbkluc3RhbmNlKCkgQVBJLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRSZXRhaW5JbnN0YW5jZSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCB0aW1lIGluaXQsIGNyZWF0ZSB0aGUgVUkuCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFVpRnJhZ21lbnQoKSkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgZnJhZ21lbnQgc2hvd2luZyBVSSB0aGF0IHdpbGwgYmUgdXBkYXRlZCBmcm9tIHdvcmsgZG9uZQorICAgICAqIGluIHRoZSByZXRhaW5lZCBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVpRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIFJldGFpbmVkRnJhZ21lbnQgbVdvcmtGcmFnbWVudDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlLCBjb250YWluZXIsIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbil2LmZpbmRWaWV3QnlJZChSLmlkLnJlc3RhcnQpOworICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQucmVzdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgcmV0YWluZWQgdGhlIHdvcmtlciBmcmFnbWVudC4KKyAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQgPSAoUmV0YWluZWRGcmFnbWVudClmbS5maW5kRnJhZ21lbnRCeVRhZygid29yayIpOworCisgICAgICAgICAgICAvLyBJZiBub3QgcmV0YWluZWQgKG9yIGZpcnN0IHRpbWUgcnVubmluZyksIHdlIG5lZWQgdG8gY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKG1Xb3JrRnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQgPSBuZXcgUmV0YWluZWRGcmFnbWVudCgpOworICAgICAgICAgICAgICAgIC8vIFRlbGwgaXQgd2hvIGl0IGlzIHdvcmtpbmcgd2l0aC4KKyAgICAgICAgICAgICAgICBtV29ya0ZyYWdtZW50LnNldFRhcmdldEZyYWdtZW50KHRoaXMsIDApOworICAgICAgICAgICAgICAgIGZtLmJlZ2luVHJhbnNhY3Rpb24oKS5hZGQobVdvcmtGcmFnbWVudCwgIndvcmsiKS5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgRnJhZ21lbnQgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIHJldGFpbmVkIGFjcm9zcworICAgICAqIGFjdGl2aXR5IGluc3RhbmNlcy4gIEl0IHJlcHJlc2VudHMgc29tZSBvbmdvaW5nIHdvcmssIGhlcmUgYSB0aHJlYWQKKyAgICAgKiB3ZSBoYXZlIHRoYXQgc2l0cyBhcm91bmQgaW5jcmVtZW50aW5nIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV0YWluZWRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzQmFyOworICAgICAgICBpbnQgbVBvc2l0aW9uOworICAgICAgICBib29sZWFuIG1SZWFkeSA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1RdWl0aW5nID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIHRocmVhZCB0aGF0IHdpbGwgZG8gb3VyIHdvcmsuICBJdCBzaXRzIGluIGEgbG9vcCBydW5uaW5nCisgICAgICAgICAqIHRoZSBwcm9ncmVzcyB1cCB1bnRpbCBpdCBoYXMgcmVhY2hlZCB0aGUgdG9wLCB0aGVuIHN0b3BzIGFuZCB3YWl0cy4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFRocmVhZCBtVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGZpZ3VyZSB0aGUgcmVhbCB2YWx1ZSBvdXQgbGF0ZXIuCisgICAgICAgICAgICAgICAgaW50IG1heCA9IDEwMDAwOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgcnVucyBhbG1vc3QgZm9yZXZlci4KKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgc2hhcmVkIHN0YXRlIHdpdGggdGhlIFVJLgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91ciB0aHJlYWQgaXMgc3RvcHBlZCBpZiB0aGUgVUkgaXMgbm90IHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCBoYXMgY29tcGxldGVkIGl0cyB3b3JrLgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFtUmVhZHkgfHwgbVBvc2l0aW9uID49IG1heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUXVpdGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIHRoZSBwcm9ncmVzcy4gIE5vdGUgaXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRvdWNoIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCB0aGUgbG9jayBoZWxkLCBzbyBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBkaXNhcHBlYXIgb24gdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1Qcm9ncmVzc0Jhci5nZXRNYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0Jhci5zZXRQcm9ncmVzcyhtUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2Ugd291bGQgYmUgZG9pbmcgc29tZSB3b3JrLCBidXQgcHV0IGEga2x1ZGdlCisgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgdG8gcHJldGVuZCBsaWtlIHdlIGFyZS4KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoNTApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGcmFnbWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdheSB3ZSB3YW50IHRvIGJlIHJldGFpbmVkIGFuZAorICAgICAgICAgKiBzdGFydCBvdXIgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGZyYW1ld29yayB0byB0cnkgdG8ga2VlcCB0aGlzIGZyYWdtZW50IGFyb3VuZAorICAgICAgICAgICAgLy8gZHVyaW5nIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICBzZXRSZXRhaW5JbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQncyBBY3Rpdml0eSBpcyByZWFkeSB0byBnbywgYWZ0ZXIKKyAgICAgICAgICogaXRzIGNvbnRlbnQgdmlldyBoYXMgYmVlbiBpbnN0YWxsZWQ7IGl0IGlzIGNhbGxlZCBib3RoIGFmdGVyCisgICAgICAgICAqIHRoZSBpbml0aWFsIGZyYWdtZW50IGNyZWF0aW9uIGFuZCBhZnRlciB0aGUgZnJhZ21lbnQgaXMgcmUtYXR0YWNoZWQKKyAgICAgICAgICogdG8gYSBuZXcgYWN0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByb2dyZXNzIGJhciBmcm9tIHRoZSB0YXJnZXQncyB2aWV3IGhpZXJhcmNoeS4KKyAgICAgICAgICAgIG1Qcm9ncmVzc0JhciA9IChQcm9ncmVzc0JhcilnZXRUYXJnZXRGcmFnbWVudCgpLmdldFZpZXcoKS5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIFIuaWQucHJvZ3Jlc3NfaG9yaXpvbnRhbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGFyZSByZWFkeSBmb3Igb3VyIHRocmVhZCB0byBnby4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZCkgeworICAgICAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRocmVhZC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBnb2luZyBhd2F5LiAgSXQgaXMgTk9UIGNhbGxlZAorICAgICAgICAgKiB3aGVuIHRoZSBmcmFnbWVudCBpcyBiZWluZyBwcm9wYWdhdGVkIGJldHdlZW4gYWN0aXZpdHkgaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHRocmVhZCBnbyBhd2F5LgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVF1aXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgZGV0YWNoZWQgZnJvbSBpdHMKKyAgICAgICAgICogY3VycmVudCBhY3Rpdml0eSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSBpdHMgYWN0aXZpdHkuICBXZSBuZWVkCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgaXRzIHRocmVhZCBpcyBub3QgZ29pbmcgdG8gdG91Y2ggYW55IGFjdGl2aXR5CisgICAgICAgICAgICAvLyBzdGF0ZSBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQmFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzdXBlci5vbkRldGFjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFQSSBmb3Igb3VyIFVJIHRvIHJlc3RhcnQgdGhlIHByb2dyZXNzIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3RhcnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWVkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50U3RhY2suamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRTdGFjayBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBpbnQgbVN0YWNrTGV2ZWwgPSAxOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9zdGFjayk7CisgICAgICAgIAorICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQubmV3X2ZyYWdtZW50KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhZGRGcmFnbWVudFRvU3RhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBEbyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uIC0tIGFkZCBpbml0aWFsIGZyYWdtZW50LgorICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBDb3VudGluZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKG1TdGFja0xldmVsKTsKKyAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5hZGQoUi5pZC5zaW1wbGVfZnJhZ21lbnQsIG5ld0ZyYWdtZW50KS5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGFja0xldmVsID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgibGV2ZWwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoImxldmVsIiwgbVN0YWNrTGV2ZWwpOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGFkZF9zdGFjaykKKyAgICB2b2lkIGFkZEZyYWdtZW50VG9TdGFjaygpIHsKKyAgICAgICAgbVN0YWNrTGV2ZWwrKzsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyBmcmFnbWVudC4KKyAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBDb3VudGluZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKG1TdGFja0xldmVsKTsKKworICAgICAgICAvLyBBZGQgdGhlIGZyYWdtZW50IHRvIHRoZSBhY3Rpdml0eSwgcHVzaGluZyB0aGlzIHRyYW5zYWN0aW9uCisgICAgICAgIC8vIG9uIHRvIHRoZSBiYWNrIHN0YWNrLgorICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmdC5yZXBsYWNlKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCk7CisgICAgICAgIGZ0LnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU4pOworICAgICAgICBmdC5hZGRUb0JhY2tTdGFjayhudWxsKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorLy9FTkRfSU5DTFVERShhZGRfc3RhY2spCisKKy8vQkVHSU5fSU5DTFVERShmcmFnbWVudCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50aW5nRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIGludCBtTnVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQ291bnRpbmdGcmFnbWVudCwgcHJvdmlkaW5nICJudW0iCisgICAgICAgICAqIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIENvdW50aW5nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IG51bSkgeworICAgICAgICAgICAgQ291bnRpbmdGcmFnbWVudCBmID0gbmV3IENvdW50aW5nRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IG51bSBpbnB1dCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoIm51bSIsIG51bSk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBjcmVhdGluZywgcmV0cmlldmUgdGhpcyBpbnN0YW5jZSdzIG51bWJlciBmcm9tIGl0cyBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIG1OdW0gPSBnZXRBcmd1bWVudHMoKSAhPSBudWxsID8gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKSA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEZyYWdtZW50J3MgVUkgaXMganVzdCBhIHNpbXBsZSB0ZXh0IHZpZXcgc2hvd2luZyBpdHMKKyAgICAgICAgICogaW5zdGFuY2UgbnVtYmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmhlbGxvX3dvcmxkLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiRnJhZ21lbnQgIyIgKyBtTnVtKTsKKyAgICAgICAgICAgIHR2LnNldEJhY2tncm91bmREcmF3YWJsZShnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShhbmRyb2lkLlIuZHJhd2FibGUuZ2FsbGVyeV90aHVtYikpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGZyYWdtZW50KQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JbmNvbWluZ01lc3NhZ2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvSW5jb21pbmdNZXNzYWdlLmphdmEKaW5kZXggZDQ0YzAwOC4uNDFkMmVhMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JbmNvbWluZ01lc3NhZ2UuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0luY29taW5nTWVzc2FnZS5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CiAKIHB1YmxpYyBjbGFzcyBJbmNvbWluZ01lc3NhZ2UgZXh0ZW5kcyBBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCkBAIC00MSwzMSArNDIsMTEgQEAKICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm5vdGlmeSk7CiAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IEJ1dHRvbi5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgdG9hc3QgcG9wcyB1cCBhIHF1aWNrIG1lc3NhZ2UgdG8gdGhlIHVzZXIgc2hvd2luZyB3aGF0IGNvdWxkIGJlCi0gICAgICogdGhlIHRleHQgb2YgYW4gaW5jb21pbmcgbWVzc2FnZS4gIEl0IHVzZXMgYSBjdXN0b20gdmlldyB0byBkbyBzby4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93VG9hc3QoKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGUgdmlldwotICAgICAgICBWaWV3IHZpZXcgPSBpbmZsYXRlVmlldyhSLmxheW91dC5pbmNvbWluZ19tZXNzYWdlX3BhbmVsKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHRleHQgaW4gdGhlIHZpZXcKLSAgICAgICAgVGV4dFZpZXcgdHYgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5tZXNzYWdlKTsKLSAgICAgICAgdHYuc2V0VGV4dCgia2h0eC4gbWVldCB1IGZvciBkaW5uZXIuIGN1bDhyIik7Ci0KLSAgICAgICAgLy8gc2hvdyB0aGUgdG9hc3QKLSAgICAgICAgVG9hc3QgdG9hc3QgPSBuZXcgVG9hc3QodGhpcyk7Ci0gICAgICAgIHRvYXN0LnNldFZpZXcodmlldyk7Ci0gICAgICAgIHRvYXN0LnNldER1cmF0aW9uKFRvYXN0LkxFTkdUSF9MT05HKTsKLSAgICAgICAgdG9hc3Quc2hvdygpOwotICAgIH0KLQogICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVmlldyhpbnQgcmVzb3VyY2UpIHsKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgdmkgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKICAgICAgICAgcmV0dXJuIHZpLmluZmxhdGUocmVzb3VyY2UsIG51bGwpOwpAQCAtODQsOCArNjUsMTAgQEAKICAgICAgICAgQ2hhclNlcXVlbmNlIG1lc3NhZ2UgPSAia3RoeC4gbWVldCB1IGZvciBkaW5uZXIuIGN1bDhyIjsKIAogICAgICAgICAvLyBUaGUgUGVuZGluZ0ludGVudCB0byBsYXVuY2ggb3VyIGFjdGl2aXR5IGlmIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBub3RpZmljYXRpb24KKy8vQkVHSU5fSU5DTFVERShwZW5kaW5nX2ludGVudCkKICAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSh0aGlzLCAwLAogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQodGhpcywgSW5jb21pbmdNZXNzYWdlVmlldy5jbGFzcyksIDApOworLy9FTkRfSU5DTFVERShwZW5kaW5nX2ludGVudCkKIAogICAgICAgICAvLyBUaGUgdGlja2VyIHRleHQsIHRoaXMgdXNlcyBhIGZvcm1hdHRlZCBzdHJpbmcgc28gb3VyIG1lc3NhZ2UgY291bGQgYmUgbG9jYWxpemVkCiAgICAgICAgIFN0cmluZyB0aWNrZXJUZXh0ID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmltY29taW5nX21lc3NhZ2VfdGlja2VyX3RleHQsIG1lc3NhZ2UpOwpAQCAtOTcsOSArODAsMjAgQEAKICAgICAgICAgLy8gU2V0IHRoZSBpbmZvIGZvciB0aGUgdmlld3MgdGhhdCBzaG93IGluIHRoZSBub3RpZmljYXRpb24gcGFuZWwuCiAgICAgICAgIG5vdGlmLnNldExhdGVzdEV2ZW50SW5mbyh0aGlzLCBmcm9tLCBtZXNzYWdlLCBjb250ZW50SW50ZW50KTsKIAotICAgICAgICAvLyBhZnRlciBhIDEwMG1zIGRlbGF5LCB2aWJyYXRlIGZvciAyNTBtcywgcGF1c2UgZm9yIDEwMCBtcyBhbmQKKyAgICAgICAgLyoKKyAgICAgICAgLy8gT24gdGFibGV0cywgdGhlIHRpY2tlciBzaG93cyB0aGUgc2VuZGVyLCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbWVzc2FnZSwKKyAgICAgICAgLy8gdGhlIHBob3RvIG9mIHRoZSBwZXJzb24gYW5kIHRoZSBhcHAgaWNvbi4gIEZvciBvdXIgc2FtcGxlLCB3ZSBqdXN0IHNob3cKKyAgICAgICAgLy8gdGhlIHNhbWUgaWNvbiB0d2ljZS4gIElmIHRoZXJlIGlzIG5vIHNlbmRlciwganVzdCBwYXNzIGFuIGFycmF5IG9mIDEgQml0bWFwLgorICAgICAgICBub3RpZi50aWNrZXJUaXRsZSA9IGZyb207CisgICAgICAgIG5vdGlmLnRpY2tlclN1YnRpdGxlID0gbWVzc2FnZTsKKyAgICAgICAgbm90aWYudGlja2VySWNvbnMgPSBuZXcgQml0bWFwWzJdOworICAgICAgICBub3RpZi50aWNrZXJJY29uc1swXSA9IGdldEljb25CaXRtYXAoKTs7CisgICAgICAgIG5vdGlmLnRpY2tlckljb25zWzFdID0gZ2V0SWNvbkJpdG1hcCgpOzsKKyAgICAgICAgKi8KKworICAgICAgICAvLyBhZnRlciBhIDBtcyBkZWxheSwgdmlicmF0ZSBmb3IgMjUwbXMsIHBhdXNlIGZvciAxMDAgbXMgYW5kCiAgICAgICAgIC8vIHRoZW4gdmlicmF0ZSBmb3IgNTAwbXMuCi0gICAgICAgIG5vdGlmLnZpYnJhdGUgPSBuZXcgbG9uZ1tdIHsgMTAwLCAyNTAsIDEwMCwgNTAwfTsKKyAgICAgICAgbm90aWYudmlicmF0ZSA9IG5ldyBsb25nW10geyAwLCAyNTAsIDEwMCwgNTAwfTsKIAogICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIFIubGF5b3V0LmluY29taW5nX21lc3NhZ2VfcGFuZWwgYXMgdGhlIElEIGZvcgogICAgICAgICAvLyB0aGUgbm90aWZpY2F0aW9uLiAgSXQgY291bGQgYmUgYW55IGludGVnZXIgeW91IHdhbnQsIGJ1dCB3ZSB1c2UKQEAgLTEwOCw0ICsxMDIsMTAgQEAKICAgICAgICAgLy8gYXBwbGljYXRpb24uCiAgICAgICAgIG5tLm5vdGlmeShSLnN0cmluZy5pbWNvbWluZ19tZXNzYWdlX3RpY2tlcl90ZXh0LCBub3RpZik7CiAgICAgfQorCisgICAgcHJpdmF0ZSBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKKyAgICAgICAgQml0bWFwRmFjdG9yeSBmID0gbmV3IEJpdG1hcEZhY3RvcnkoKTsKKyAgICAgICAgcmV0dXJuIGYuZGVjb2RlUmVzb3VyY2UoZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuYXBwX3NhbXBsZV9jb2RlKTsKKyAgICB9CiB9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvSW50ZW50QWN0aXZpdHlGbGFncy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9JbnRlbnRBY3Rpdml0eUZsYWdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmOWQwZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvSW50ZW50QWN0aXZpdHlGbGFncy5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworCisvKioKKyAqIEV4YW1wbGUgb2YgdmFyaW91cyBJbnRlbnQgZmxhZ3MgdG8gbW9kaWZ5IHRoZSBhY3Rpdml0eSBzdGFjay4KKyAqLworcHVibGljIGNsYXNzIEludGVudEFjdGl2aXR5RmxhZ3MgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmludGVudF9hY3Rpdml0eV9mbGFncyk7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLmZsYWdfYWN0aXZpdHlfY2xlYXJfdGFzayk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZsYWdBY3Rpdml0eUNsZWFyVGFza0xpc3RlbmVyKTsKKyAgICAgICAgYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5mbGFnX2FjdGl2aXR5X2NsZWFyX3Rhc2tfcGkpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GbGFnQWN0aXZpdHlDbGVhclRhc2tQSUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gYXJyYXkgb2YgSW50ZW50IG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBiYWNrIHN0YWNrCisgICAgICogZm9yIGEgdXNlciBnb2luZyBpbnRvIHRoZSBWaWV3cy9MaXN0cyBBUEkgZGVtb3MuCisgICAgICovCisvL0JFR0lOX0lOQ0xVREUoaW50ZW50X2FycmF5KQorICAgIHByaXZhdGUgSW50ZW50W10gYnVpbGRJbnRlbnRzVG9WaWV3c0xpc3RzKCkgeworICAgICAgICAvLyBXZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgdGFzayB3aXRoIGEgbmV3IGJhY2sgc3RhY2suICBUaGlzIHdpbGwKKyAgICAgICAgLy8gYmUgZG9uZSBieSBsYXVuY2hpbmcgYW4gYXJyYXkgb2YgSW50ZW50cywgcmVwcmVzZW50aW5nIHRoZSBuZXcKKyAgICAgICAgLy8gYmFjayBzdGFjayB0byBiZSBjcmVhdGVkLCB3aXRoIHRoZSBmaXJzdCBlbnRyeSBob2xkaW5nIHRoZSByb290CisgICAgICAgIC8vIGFuZCByZXF1ZXN0aW5nIHRvIHJlc2V0IHRoZSBiYWNrIHN0YWNrLgorICAgICAgICBJbnRlbnRbXSBpbnRlbnRzID0gbmV3IEludGVudFszXTsKKworICAgICAgICAvLyBGaXJzdDogcm9vdCBhY3Rpdml0eSBvZiBBcGlEZW1vcy4KKyAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IHRvIG1ha2UgdGhlIHByb3BlciBJbnRlbnQgdG8gbGF1bmNoIGFuZAorICAgICAgICAvLyByZXNldCBhbiBhcHBsaWNhdGlvbidzIHRhc2suCisgICAgICAgIGludGVudHNbMF0gPSBJbnRlbnQubWFrZVJlc3RhcnRBY3Rpdml0eVRhc2sobmV3IENvbXBvbmVudE5hbWUodGhpcywKKyAgICAgICAgICAgICAgICBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuQXBpRGVtb3MuY2xhc3MpKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoSW50ZW50QWN0aXZpdHlGbGFncy50aGlzLCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuQXBpRGVtb3MuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5QYXRoIiwgIlZpZXdzIik7CisgICAgICAgIGludGVudHNbMV0gPSBpbnRlbnQ7CisKKyAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoSW50ZW50QWN0aXZpdHlGbGFncy50aGlzLCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuQXBpRGVtb3MuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5QYXRoIiwgIlZpZXdzL0xpc3RzIik7CisKKyAgICAgICAgaW50ZW50c1syXSA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIGludGVudHM7CisgICAgfQorLy9FTkRfSU5DTFVERShpbnRlbnRfYXJyYXkpCisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtRmxhZ0FjdGl2aXR5Q2xlYXJUYXNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgc3RhcnRBY3Rpdml0aWVzKGJ1aWxkSW50ZW50c1RvVmlld3NMaXN0cygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtRmxhZ0FjdGl2aXR5Q2xlYXJUYXNrUElMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBJbnRlbnRBY3Rpdml0eUZsYWdzLnRoaXM7CisvL0JFR0lOX0lOQ0xVREUocGVuZGluZ19pbnRlbnQpCisgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0aWVzKGNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkSW50ZW50c1RvVmlld3NMaXN0cygpLCBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOworLy9FTkRfSU5DTFVERShwZW5kaW5nX2ludGVudCkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGkuc2VuZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KCJJbnRlbnRBY3Rpdml0eUZsYWdzIiwgIkZhaWxlZCBzZW5kaW5nIFBlbmRpbmdJbnRlbnQiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTE1MjIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9MYXVuY2hpbmdQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7Ci0KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zOwotCi0vKioKLSAqIERlbW9uc3RyYXRlcyBsYXVuY2hpbmcgYSBQcmVmZXJlbmNlQWN0aXZpdHkgYW5kIGdyYWJiaW5nIGEgdmFsdWUgaXQgc2F2ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hpbmdQcmVmZXJlbmNlcyBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPREVfUFJFRkVSRU5DRVMgPSAxOwotICAgIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbUNvdW50ZXJUZXh0OwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGlzIHdlcmUgbXkgYXBwJ3MgbWFpbiBhY3Rpdml0eSwgSSB3b3VsZCBsb2FkIHRoZSBkZWZhdWx0IHZhbHVlcwotICAgICAgICAgKiBzbyB0aGV5J3JlIHNldCBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90IGdvIGludG8gdGhlIHByZWZlcmVuY2VzCi0gICAgICAgICAqIHNjcmVlbi4gQW5vdGhlciBnb29kIHBsYWNlIHRvIGNhbGwgdGhpcyBtZXRob2Qgd291bGQgYmUgZnJvbSBhCi0gICAgICAgICAqIHN1YmNsYXNzIG9mIEFwcGxpY2F0aW9uLCBzbyB5b3VyIGRlZmF1bHQgdmFsdWVzIHdvdWxkIGJlIGxvYWRlZAotICAgICAgICAgKiByZWdhcmRsZXNzIG9mIGVudHJ5IGludG8geW91ciBhcHBsaWNhdGlvbiAoZm9yIGV4YW1wbGUsIGEgc2VydmljZSBvcgotICAgICAgICAgKiBhY3Rpdml0eSkuCi0gICAgICAgICAqLyAgCi0gICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLnNldERlZmF1bHRWYWx1ZXModGhpcywgUi54bWwuYWR2YW5jZWRfcHJlZmVyZW5jZXMsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbXBsZSBsYXlvdXQKLSAgICAgICAgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7Ci0gICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIGJ1dHRvbiB0aGF0IHdpbGwgbGF1bmNoIHRoZSBwcmVmZXJlbmNlcwotICAgICAgICBCdXR0b24gbGF1bmNoUHJlZmVyZW5jZXMgPSBuZXcgQnV0dG9uKHRoaXMpOwotICAgICAgICBsYXVuY2hQcmVmZXJlbmNlcy5zZXRUZXh0KGdldFN0cmluZyhSLnN0cmluZy5sYXVuY2hfcHJlZmVyZW5jZV9hY3Rpdml0eSkpOwotICAgICAgICBsYXVuY2hQcmVmZXJlbmNlcy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGxheW91dC5hZGRWaWV3KGxhdW5jaFByZWZlcmVuY2VzLCBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwotICAgICAgICAKLSAgICAgICAgbUNvdW50ZXJUZXh0ID0gbmV3IFRleHRWaWV3KHRoaXMpOwotICAgICAgICBsYXlvdXQuYWRkVmlldyhtQ291bnRlclRleHQsIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7Ci0gICAgICAgIAotICAgICAgICB1cGRhdGVDb3VudGVyVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBXaGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCwgbGF1bmNoIGFuIGFjdGl2aXR5IHRocm91Z2ggdGhpcyBpbnRlbnQKLSAgICAgICAgSW50ZW50IGxhdW5jaFByZWZlcmVuY2VzSW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEFkdmFuY2VkUHJlZmVyZW5jZXMuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBpdCBhIHN1YmFjdGl2aXR5IHNvIHdlIGtub3cgd2hlbiBpdCByZXR1cm5zCi0gICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQobGF1bmNoUHJlZmVyZW5jZXNJbnRlbnQsIFJFUVVFU1RfQ09ERV9QUkVGRVJFTkNFUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewotICAgICAgICBzdXBlci5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBwcmVmZXJlbmNlcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCBjb2RlIGlzIHdoYXQgd2UgaGFkIGdpdmVuCi0gICAgICAgIC8vIGVhcmxpZXIgaW4gc3RhcnRTdWJBY3Rpdml0eQotICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gUkVRVUVTVF9DT0RFX1BSRUZFUkVOQ0VTKSB7Ci0gICAgICAgICAgICAvLyBSZWFkIGEgc2FtcGxlIHZhbHVlIHRoZXkgaGF2ZSBzZXQKLSAgICAgICAgICAgIHVwZGF0ZUNvdW50ZXJUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ291bnRlclRleHQoKSB7Ci0gICAgICAgIC8vIFNpbmNlIHdlJ3JlIGluIHRoZSBzYW1lIHBhY2thZ2UsIHdlIGNhbiB1c2UgdGhpcyBjb250ZXh0IHRvIGdldAotICAgICAgICAvLyB0aGUgZGVmYXVsdCBzaGFyZWQgcHJlZmVyZW5jZXMKLSAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgc2hhcmVkUHJlZiA9IFByZWZlcmVuY2VNYW5hZ2VyLmdldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzKTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ZXIgPSBzaGFyZWRQcmVmLmdldEludChBZHZhbmNlZFByZWZlcmVuY2VzLktFWV9NWV9QUkVGRVJFTkNFLCAwKTsKLSAgICAgICAgbUNvdW50ZXJUZXh0LnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLmNvdW50ZXJfdmFsdWVfaXMpICsgIiAiICsgY291bnRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Mb2FkZXJDdXJzb3IuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyQ3Vyc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYzBkNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyQ3Vyc29yLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3Lk9uUXVlcnlUZXh0TGlzdGVuZXI7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiB0aGUgdXNlIG9mIGEgQ3Vyc29yTG9hZGVyIHRvIGxvYWQgYW5kIGRpc3BsYXkgY29udGFjdHMKKyAqIGRhdGEgaW4gYSBmcmFnbWVudC4KKyAqLworcHVibGljIGNsYXNzIExvYWRlckN1cnNvciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBmbS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBsaXN0KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGZyYWdtZW50X2N1cnNvcikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnNvckxvYWRlckxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudAorICAgICAgICAgICAgaW1wbGVtZW50cyBPblF1ZXJ5VGV4dExpc3RlbmVyLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxDdXJzb3I+IHsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBBZGFwdGVyIGJlaW5nIHVzZWQgdG8gZGlzcGxheSB0aGUgbGlzdCdzIGRhdGEuCisgICAgICAgIFNpbXBsZUN1cnNvckFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAgICAgLy8gSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIGN1cnJlbnQgZmlsdGVyIHRoZSB1c2VyIGhhcyBwcm92aWRlZC4KKyAgICAgICAgU3RyaW5nIG1DdXJGaWx0ZXI7CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0ZXh0IHRvIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gZGF0YS4gIEluIGEgcmVhbAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gdGhpcyB3b3VsZCBjb21lIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgIHNldEVtcHR5VGV4dCgiTm8gcGhvbmUgbnVtYmVycyIpOworCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWVudSBpdGVtIHRvIHNob3cgaW4gYWN0aW9uIGJhci4KKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYWRhcHRlciB3ZSB3aWxsIHVzZSB0byBkaXNwbGF5IHRoZSBsb2FkZWQgZGF0YS4KKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnRhY3RzLkRJU1BMQVlfTkFNRSwgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSwgMCk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbG9hZGVyLiAgRWl0aGVyIHJlLWNvbm5lY3Qgd2l0aCBhbiBleGlzdGluZyBvbmUsCisgICAgICAgICAgICAvLyBvciBzdGFydCBhIG5ldyBvbmUuCisgICAgICAgICAgICBnZXRMb2FkZXJNYW5hZ2VyKCkuaW5pdExvYWRlcigwLCBudWxsLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICAvLyBQbGFjZSBhbiBhY3Rpb24gYmFyIGl0ZW0gZm9yIHNlYXJjaGluZy4KKyAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmFkZCgiU2VhcmNoIik7CisgICAgICAgICAgICBpdGVtLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfc2VhcmNoKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgU2VhcmNoVmlldyBzdiA9IG5ldyBTZWFyY2hWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgc3Yuc2V0T25RdWVyeVRleHRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlldyhzdik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dENoYW5nZShTdHJpbmcgbmV3VGV4dCkgeworICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGFjdGlvbiBiYXIgc2VhcmNoIHRleHQgaGFzIGNoYW5nZWQuICBVcGRhdGUKKyAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggZmlsdGVyLCBhbmQgcmVzdGFydCB0aGUgbG9hZGVyIHRvIGRvIGEgbmV3IHF1ZXJ5CisgICAgICAgICAgICAvLyB3aXRoIHRoaXMgZmlsdGVyLgorICAgICAgICAgICAgbUN1ckZpbHRlciA9ICFUZXh0VXRpbHMuaXNFbXB0eShuZXdUZXh0KSA/IG5ld1RleHQgOiBudWxsOworICAgICAgICAgICAgZ2V0TG9hZGVyTWFuYWdlcigpLnJlc3RhcnRMb2FkZXIoMCwgbnVsbCwgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dFN1Ym1pdChTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGNhcmUgYWJvdXQgdGhpcy4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGRlc2lyZWQgYmVoYXZpb3IgaGVyZS4KKyAgICAgICAgICAgIExvZy5pKCJGcmFnbWVudENvbXBsZXhMaXN0IiwgIkl0ZW0gY2xpY2tlZDogIiArIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgQ29udGFjdHMgcm93cyB0aGF0IHdlIHdpbGwgcmV0cmlldmUuCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05UQUNUU19TVU1NQVJZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgQ29udGFjdHMuX0lELAorICAgICAgICAgICAgQ29udGFjdHMuRElTUExBWV9OQU1FLAorICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMsCisgICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1BSRVNFTkNFLAorICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCisgICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBMb2FkZXI8Q3Vyc29yPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbmV3IExvYWRlciBuZWVkcyB0byBiZSBjcmVhdGVkLiAgVGhpcworICAgICAgICAgICAgLy8gc2FtcGxlIG9ubHkgaGFzIG9uZSBMb2FkZXIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIElELgorICAgICAgICAgICAgLy8gRmlyc3QsIHBpY2sgdGhlIGJhc2UgVVJJIHRvIHVzZSBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSBmaWx0ZXJpbmcuCisgICAgICAgICAgICBVcmkgYmFzZVVyaTsKKyAgICAgICAgICAgIGlmIChtQ3VyRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiYXNlVXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQ29udGFjdHMuQ09OVEVOVF9GSUxURVJfVVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJpLmVuY29kZShtQ3VyRmlsdGVyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2VVcmkgPSBDb250YWN0cy5DT05URU5UX1VSSTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSBhbmQgcmV0dXJuIGEgQ3Vyc29yTG9hZGVyIHRoYXQgd2lsbCB0YWtlIGNhcmUgb2YKKyAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgQ3Vyc29yIGZvciB0aGUgZGF0YSBiZWluZyBkaXNwbGF5ZWQuCisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIigoIiArIENvbnRhY3RzLkRJU1BMQVlfTkFNRSArICIgTk9UTlVMTCkgQU5EICgiCisgICAgICAgICAgICAgICAgICAgICsgQ29udGFjdHMuSEFTX1BIT05FX05VTUJFUiArICI9MSkgQU5EICgiCisgICAgICAgICAgICAgICAgICAgICsgQ29udGFjdHMuRElTUExBWV9OQU1FICsgIiAhPSAnJyApKSI7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvckxvYWRlcihnZXRBY3Rpdml0eSgpLCBiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICBDT05UQUNUU19TVU1NQVJZX1BST0pFQ1RJT04sIHNlbGVjdCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQ29udGFjdHMuRElTUExBWV9OQU1FICsgIiBDT0xMQVRFIExPQ0FMSVpFRCBBU0MiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxDdXJzb3I+IGxvYWRlciwgQ3Vyc29yIGRhdGEpIHsKKyAgICAgICAgICAgIC8vIFN3YXAgdGhlIG5ldyBjdXJzb3IgaW4uICAoVGhlIGZyYW1ld29yayB3aWxsIHRha2UgY2FyZSBvZiBjbG9zaW5nIHRoZQorICAgICAgICAgICAgLy8gb2xkIGN1cnNvciBvbmNlIHdlIHJldHVybi4pCisgICAgICAgICAgICBtQWRhcHRlci5zd2FwQ3Vyc29yKGRhdGEpOworCisgICAgICAgICAgICAvLyBUaGUgbGlzdCBzaG91bGQgbm93IGJlIHNob3duLgorICAgICAgICAgICAgc2V0TGlzdFNob3duKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkZXJSZXNldChMb2FkZXI8Q3Vyc29yPiBsb2FkZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGxhc3QgQ3Vyc29yIHByb3ZpZGVkIHRvIG9uTG9hZEZpbmlzaGVkKCkKKyAgICAgICAgICAgIC8vIGFib3ZlIGlzIGFib3V0IHRvIGJlIGNsb3NlZC4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFyZSBubworICAgICAgICAgICAgLy8gbG9uZ2VyIHVzaW5nIGl0LgorICAgICAgICAgICAgbUFkYXB0ZXIuc3dhcEN1cnNvcihudWxsKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZnJhZ21lbnRfY3Vyc29yKQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Mb2FkZXJDdXN0b20uamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyQ3VzdG9tLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzYWIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyQ3VzdG9tLmphdmEKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXcuT25RdWVyeVRleHRMaXN0ZW5lcjsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGN1c3RvbSBMb2FkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJDdXN0b20gZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRnJhZ21lbnRNYW5hZ2VyIGZtID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZyYWdtZW50IGFuZCBhZGQgaXQgYXMgb3VyIHNvbGUgY29udGVudC4KKyAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpID09IG51bGwpIHsKKyAgICAgICAgICAgIEFwcExpc3RGcmFnbWVudCBsaXN0ID0gbmV3IEFwcExpc3RGcmFnbWVudCgpOworICAgICAgICAgICAgZm0uYmVnaW5UcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwgbGlzdCkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShsb2FkZXIpCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBob2xkcyB0aGUgcGVyLWl0ZW0gZGF0YSBpbiBvdXIgTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwRW50cnkgeworICAgICAgICBwdWJsaWMgQXBwRW50cnkoQXBwTGlzdExvYWRlciBsb2FkZXIsIEFwcGxpY2F0aW9uSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBtTG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgbUluZm8gPSBpbmZvOworICAgICAgICAgICAgbUFwa0ZpbGUgPSBuZXcgRmlsZShpbmZvLnNvdXJjZURpcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXBwbGljYXRpb25JbmZvIGdldEFwcGxpY2F0aW9uSW5mbygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICBpZiAobUljb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQXBrRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBtSWNvbiA9IG1JbmZvLmxvYWRJY29uKG1Mb2FkZXIubVBtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1JY29uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VudGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghbU1vdW50ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIHdhc24ndCBtb3VudGVkIGJ1dCBpcyBub3cgbW91bnRlZCwgcmVsb2FkCisgICAgICAgICAgICAgICAgLy8gaXRzIGljb24uCisgICAgICAgICAgICAgICAgaWYgKG1BcGtGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VudGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUljb24gPSBtSW5mby5sb2FkSWNvbihtTG9hZGVyLm1QbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXIuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuZHJhd2FibGUuc3ltX2RlZl9hcHBfaWNvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGFiZWw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGxvYWRMYWJlbChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChtTGFiZWwgPT0gbnVsbCB8fCAhbU1vdW50ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1BcGtGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VudGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1MYWJlbCA9IG1JbmZvLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb3VudGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGxhYmVsID0gbUluZm8ubG9hZExhYmVsKGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1MYWJlbCA9IGxhYmVsICE9IG51bGwgPyBsYWJlbC50b1N0cmluZygpIDogbUluZm8ucGFja2FnZU5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcHBMaXN0TG9hZGVyIG1Mb2FkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXBwbGljYXRpb25JbmZvIG1JbmZvOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgbUFwa0ZpbGU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1MYWJlbDsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Nb3VudGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYWxwaGFiZXRpY2FsIGNvbXBhcmlzb24gb2YgYXBwbGljYXRpb24gZW50cnkgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8QXBwRW50cnk+IEFMUEhBX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxBcHBFbnRyeT4oKSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGF0b3Igc0NvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBcHBFbnRyeSBvYmplY3QxLCBBcHBFbnRyeSBvYmplY3QyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUob2JqZWN0MS5nZXRMYWJlbCgpLCBvYmplY3QyLmdldExhYmVsKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQgaW4gYW4gaW50ZXJlc3RpbmcKKyAgICAgKiB3YXkgc28gd2UgbmVlZCB0byByZWJ1aWxkIHRoZSBhcHAgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyZXN0aW5nQ29uZmlnQ2hhbmdlcyB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbUxhc3RDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaW50IG1MYXN0RGVuc2l0eTsKKworICAgICAgICBib29sZWFuIGFwcGx5TmV3Q29uZmlnKFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIGludCBjb25maWdDaGFuZ2VzID0gbUxhc3RDb25maWd1cmF0aW9uLnVwZGF0ZUZyb20ocmVzLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgICAgICBib29sZWFuIGRlbnNpdHlDaGFuZ2VkID0gbUxhc3REZW5zaXR5ICE9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpZiAoZGVuc2l0eUNoYW5nZWQgfHwgKGNvbmZpZ0NoYW5nZXMmKEFjdGl2aXR5SW5mby5DT05GSUdfTE9DQUxFCisgICAgICAgICAgICAgICAgICAgIHxBY3Rpdml0eUluZm8uQ09ORklHX1VJX01PREV8QWN0aXZpdHlJbmZvLkNPTkZJR19TQ1JFRU5fTEFZT1VUKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1MYXN0RGVuc2l0eSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdG8gbG9vayBmb3IgaW50ZXJlc3RpbmcgY2hhbmdlcyB0byB0aGUgaW5zdGFsbGVkIGFwcHMKKyAgICAgKiBzbyB0aGF0IHRoZSBsb2FkZXIgY2FuIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrYWdlSW50ZW50UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIGZpbmFsIEFwcExpc3RMb2FkZXIgbUxvYWRlcjsKKworICAgICAgICBwdWJsaWMgUGFja2FnZUludGVudFJlY2VpdmVyKEFwcExpc3RMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgICAgICBtTG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOworICAgICAgICAgICAgbUxvYWRlci5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcih0aGlzLCBmaWx0ZXIpOworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZm9yIGV2ZW50cyByZWxhdGVkIHRvIHNkY2FyZCBpbnN0YWxsYXRpb24uCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgc2RGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBzZEZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9FWFRFUk5BTF9BUFBMSUNBVElPTlNfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIHNkRmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0VYVEVSTkFMX0FQUExJQ0FUSU9OU19VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICBtTG9hZGVyLmdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKHRoaXMsIHNkRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAvLyBUZWxsIHRoZSBsb2FkZXIgYWJvdXQgdGhlIGNoYW5nZS4KKyAgICAgICAgICAgIG1Mb2FkZXIub25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjdXN0b20gTG9hZGVyIHRoYXQgbG9hZHMgYWxsIG9mIHRoZSBpbnN0YWxsZWQgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwTGlzdExvYWRlciBleHRlbmRzIEFzeW5jVGFza0xvYWRlcjxMaXN0PEFwcEVudHJ5Pj4geworICAgICAgICBmaW5hbCBJbnRlcmVzdGluZ0NvbmZpZ0NoYW5nZXMgbUxhc3RDb25maWcgPSBuZXcgSW50ZXJlc3RpbmdDb25maWdDaGFuZ2VzKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QbTsKKworICAgICAgICBMaXN0PEFwcEVudHJ5PiBtQXBwczsKKyAgICAgICAgUGFja2FnZUludGVudFJlY2VpdmVyIG1QYWNrYWdlT2JzZXJ2ZXI7CisKKyAgICAgICAgcHVibGljIEFwcExpc3RMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHBhY2thZ2UgbWFuYWdlciBmb3IgbGF0ZXIgdXNlOyBub3RlIHdlIGRvbid0CisgICAgICAgICAgICAvLyB1c2UgJ2NvbnRleHQnIGRpcmVjdGx5IGJ1dCBpbnN0ZWFkIHRoZSBzYXZlIGdsb2JhbCBhcHBsaWNhdGlvbgorICAgICAgICAgICAgLy8gY29udGV4dCByZXR1cm5lZCBieSBnZXRDb250ZXh0KCkuCisgICAgICAgICAgICBtUG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHdoZXJlIHRoZSBidWxrIG9mIG91ciB3b3JrIGlzIGRvbmUuICBUaGlzIGZ1bmN0aW9uIGlzCisgICAgICAgICAqIGNhbGxlZCBpbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZCBzaG91bGQgZ2VuZXJhdGUgYSBuZXcgc2V0IG9mCisgICAgICAgICAqIGRhdGEgdG8gYmUgcHVibGlzaGVkIGJ5IHRoZSBsb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIExpc3Q8QXBwRW50cnk+IGxvYWRJbkJhY2tncm91bmQoKSB7CisgICAgICAgICAgICAvLyBSZXRyaWV2ZSBhbGwga25vd24gYXBwbGljYXRpb25zLgorICAgICAgICAgICAgTGlzdDxBcHBsaWNhdGlvbkluZm8+IGFwcHMgPSBtUG0uZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zKAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfVU5JTlNUQUxMRURfUEFDS0FHRVMgfAorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfRElTQUJMRURfQ09NUE9ORU5UUyk7CisgICAgICAgICAgICBpZiAoYXBwcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXBwcyA9IG5ldyBBcnJheUxpc3Q8QXBwbGljYXRpb25JbmZvPigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIGVudHJpZXMgYW5kIGxvYWQgdGhlaXIgbGFiZWxzLgorICAgICAgICAgICAgTGlzdDxBcHBFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8QXBwRW50cnk+KGFwcHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhcHBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXBwRW50cnkgZW50cnkgPSBuZXcgQXBwRW50cnkodGhpcywgYXBwcy5nZXQoaSkpOworICAgICAgICAgICAgICAgIGVudHJ5LmxvYWRMYWJlbChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNvcnQgdGhlIGxpc3QuCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVudHJpZXMsIEFMUEhBX0NPTVBBUkFUT1IpOworCisgICAgICAgICAgICAvLyBEb25lIQorICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgbmV3IGRhdGEgdG8gZGVsaXZlciB0byB0aGUgY2xpZW50LiAgVGhlCisgICAgICAgICAqIHN1cGVyIGNsYXNzIHdpbGwgdGFrZSBjYXJlIG9mIGRlbGl2ZXJpbmcgaXQ7IHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgKiBoZXJlIGp1c3QgYWRkcyBhIGxpdHRsZSBtb3JlIGxvZ2ljLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGRlbGl2ZXJSZXN1bHQoTGlzdDxBcHBFbnRyeT4gYXBwcykgeworICAgICAgICAgICAgaWYgKGlzUmVzZXQoKSkgeworICAgICAgICAgICAgICAgIC8vIEFuIGFzeW5jIHF1ZXJ5IGNhbWUgaW4gd2hpbGUgdGhlIGxvYWRlciBpcyBzdG9wcGVkLiAgV2UKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHRoZSByZXN1bHQuCisgICAgICAgICAgICAgICAgaWYgKGFwcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvblJlbGVhc2VSZXNvdXJjZXMoYXBwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxBcHBFbnRyeT4gb2xkQXBwcyA9IGFwcHM7CisgICAgICAgICAgICBtQXBwcyA9IGFwcHM7CisKKyAgICAgICAgICAgIGlmIChpc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBMb2FkZXIgaXMgY3VycmVudGx5IHN0YXJ0ZWQsIHdlIGNhbiBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXIgaXRzIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgc3VwZXIuZGVsaXZlclJlc3VsdChhcHBzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjYW4gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgLy8gJ29sZEFwcHMnIGlmIG5lZWRlZDsgbm93IHRoYXQgdGhlIG5ldyByZXN1bHQgaXMgZGVsaXZlcmVkIHdlCisgICAgICAgICAgICAvLyBrbm93IHRoYXQgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKyAgICAgICAgICAgIGlmIChvbGRBcHBzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvblJlbGVhc2VSZXNvdXJjZXMob2xkQXBwcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHJlcXVlc3QgdG8gc3RhcnQgdGhlIExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0TG9hZGluZygpIHsKKyAgICAgICAgICAgIGlmIChtQXBwcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY3VycmVudGx5IGhhdmUgYSByZXN1bHQgYXZhaWxhYmxlLCBkZWxpdmVyIGl0CisgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgZGVsaXZlclJlc3VsdChtQXBwcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciBjaGFuZ2VzIGluIHRoZSBhcHAgZGF0YS4KKyAgICAgICAgICAgIGlmIChtUGFja2FnZU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGFja2FnZU9ic2VydmVyID0gbmV3IFBhY2thZ2VJbnRlbnRSZWNlaXZlcih0aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSGFzIHNvbWV0aGluZyBpbnRlcmVzdGluZyBpbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VkIHNpbmNlIHdlCisgICAgICAgICAgICAvLyBsYXN0IGJ1aWx0IHRoZSBhcHAgbGlzdD8KKyAgICAgICAgICAgIGJvb2xlYW4gY29uZmlnQ2hhbmdlID0gbUxhc3RDb25maWcuYXBwbHlOZXdDb25maWcoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpKTsKKworICAgICAgICAgICAgaWYgKHRha2VDb250ZW50Q2hhbmdlZCgpIHx8IG1BcHBzID09IG51bGwgfHwgY29uZmlnQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGEgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgbG9hZGVkCisgICAgICAgICAgICAgICAgLy8gb3IgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUsIHN0YXJ0IGEgbG9hZC4KKyAgICAgICAgICAgICAgICBmb3JjZUxvYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgcmVxdWVzdCB0byBzdG9wIHRoZSBMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25TdG9wTG9hZGluZygpIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGxvYWQgdGFzayBpZiBwb3NzaWJsZS4KKyAgICAgICAgICAgIGNhbmNlbExvYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgcmVxdWVzdCB0byBjYW5jZWwgYSBsb2FkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQ2FuY2VsZWQoTGlzdDxBcHBFbnRyeT4gYXBwcykgeworICAgICAgICAgICAgc3VwZXIub25DYW5jZWxlZChhcHBzKTsKKworICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjYW4gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCAnYXBwcycKKyAgICAgICAgICAgIC8vIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIG9uUmVsZWFzZVJlc291cmNlcyhhcHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgcmVxdWVzdCB0byBjb21wbGV0ZWx5IHJlc2V0IHRoZSBMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXNldCgpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uUmVzZXQoKTsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICAgICAgb25TdG9wTG9hZGluZygpOworCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbiByZWxlYXNlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoICdhcHBzJworICAgICAgICAgICAgLy8gaWYgbmVlZGVkLgorICAgICAgICAgICAgaWYgKG1BcHBzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvblJlbGVhc2VSZXNvdXJjZXMobUFwcHMpOworICAgICAgICAgICAgICAgIG1BcHBzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RvcCBtb25pdG9yaW5nIGZvciBjaGFuZ2VzLgorICAgICAgICAgICAgaWYgKG1QYWNrYWdlT2JzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVBhY2thZ2VPYnNlcnZlcik7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBvZiByZWxlYXNpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQKKyAgICAgICAgICogd2l0aCBhbiBhY3RpdmVseSBsb2FkZWQgZGF0YSBzZXQuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlbGVhc2VSZXNvdXJjZXMoTGlzdDxBcHBFbnRyeT4gYXBwcykgeworICAgICAgICAgICAgLy8gRm9yIGEgc2ltcGxlIExpc3Q8PiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgRm9yIHNvbWV0aGluZworICAgICAgICAgICAgLy8gbGlrZSBhIEN1cnNvciwgd2Ugd291bGQgY2xvc2UgaXQgaGVyZS4KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUobG9hZGVyKQorCisvL0JFR0lOX0lOQ0xVREUoZnJhZ21lbnQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcHBMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxBcHBFbnRyeT4geworICAgICAgICBwcml2YXRlIGZpbmFsIExheW91dEluZmxhdGVyIG1JbmZsYXRlcjsKKworICAgICAgICBwdWJsaWMgQXBwTGlzdEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMik7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YShMaXN0PEFwcEVudHJ5PiBkYXRhKSB7CisgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZEFsbChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQb3B1bGF0ZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFZpZXcgdmlldzsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gbUluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubGlzdF9pdGVtX2ljb25fdGV4dCwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpZXcgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXBwRW50cnkgaXRlbSA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgKChJbWFnZVZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5pY29uKSkuc2V0SW1hZ2VEcmF3YWJsZShpdGVtLmdldEljb24oKSk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGV4dCkpLnNldFRleHQoaXRlbS5nZXRMYWJlbCgpKTsKKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcExpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudAorICAgICAgICAgICAgaW1wbGVtZW50cyBPblF1ZXJ5VGV4dExpc3RlbmVyLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxMaXN0PEFwcEVudHJ5Pj4geworCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIEFkYXB0ZXIgYmVpbmcgdXNlZCB0byBkaXNwbGF5IHRoZSBsaXN0J3MgZGF0YS4KKyAgICAgICAgQXBwTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAgICAgLy8gSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIGN1cnJlbnQgZmlsdGVyIHRoZSB1c2VyIGhhcyBwcm92aWRlZC4KKyAgICAgICAgU3RyaW5nIG1DdXJGaWx0ZXI7CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0ZXh0IHRvIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gZGF0YS4gIEluIGEgcmVhbAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gdGhpcyB3b3VsZCBjb21lIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgIHNldEVtcHR5VGV4dCgiTm8gYXBwbGljYXRpb25zIik7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtZW51IGl0ZW0gdG8gc2hvdyBpbiBhY3Rpb24gYmFyLgorICAgICAgICAgICAgc2V0SGFzT3B0aW9uc01lbnUodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBhZGFwdGVyIHdlIHdpbGwgdXNlIHRvIGRpc3BsYXkgdGhlIGxvYWRlZCBkYXRhLgorICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgQXBwTGlzdEFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IG91dCB3aXRoIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbG9hZGVyLiAgRWl0aGVyIHJlLWNvbm5lY3Qgd2l0aCBhbiBleGlzdGluZyBvbmUsCisgICAgICAgICAgICAvLyBvciBzdGFydCBhIG5ldyBvbmUuCisgICAgICAgICAgICBnZXRMb2FkZXJNYW5hZ2VyKCkuaW5pdExvYWRlcigwLCBudWxsLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICAvLyBQbGFjZSBhbiBhY3Rpb24gYmFyIGl0ZW0gZm9yIHNlYXJjaGluZy4KKyAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmFkZCgiU2VhcmNoIik7CisgICAgICAgICAgICBpdGVtLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfc2VhcmNoKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgU2VhcmNoVmlldyBzdiA9IG5ldyBTZWFyY2hWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgc3Yuc2V0T25RdWVyeVRleHRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlldyhzdik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2UoU3RyaW5nIG5ld1RleHQpIHsKKyAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhY3Rpb24gYmFyIHNlYXJjaCB0ZXh0IGhhcyBjaGFuZ2VkLiAgU2luY2UgdGhpcworICAgICAgICAgICAgLy8gaXMgYSBzaW1wbGUgYXJyYXkgYWRhcHRlciwgd2UgY2FuIGp1c3QgaGF2ZSBpdCBkbyB0aGUgZmlsdGVyaW5nLgorICAgICAgICAgICAgbUN1ckZpbHRlciA9ICFUZXh0VXRpbHMuaXNFbXB0eShuZXdUZXh0KSA/IG5ld1RleHQgOiBudWxsOworICAgICAgICAgICAgbUFkYXB0ZXIuZ2V0RmlsdGVyKCkuZmlsdGVyKG1DdXJGaWx0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25RdWVyeVRleHRTdWJtaXQoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgICAgICAvLyBEb24ndCBjYXJlIGFib3V0IHRoaXMuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBkZXNpcmVkIGJlaGF2aW9yIGhlcmUuCisgICAgICAgICAgICBMb2cuaSgiTG9hZGVyQ3VzdG9tIiwgIkl0ZW0gY2xpY2tlZDogIiArIGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgTG9hZGVyPExpc3Q8QXBwRW50cnk+PiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbmV3IExvYWRlciBuZWVkcyB0byBiZSBjcmVhdGVkLiAgVGhpcworICAgICAgICAgICAgLy8gc2FtcGxlIG9ubHkgaGFzIG9uZSBMb2FkZXIgd2l0aCBubyBhcmd1bWVudHMsIHNvIGl0IGlzIHNpbXBsZS4KKyAgICAgICAgICAgIHJldHVybiBuZXcgQXBwTGlzdExvYWRlcihnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8TGlzdDxBcHBFbnRyeT4+IGxvYWRlciwgTGlzdDxBcHBFbnRyeT4gZGF0YSkgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBuZXcgZGF0YSBpbiB0aGUgYWRhcHRlci4KKyAgICAgICAgICAgIG1BZGFwdGVyLnNldERhdGEoZGF0YSk7CisKKyAgICAgICAgICAgIC8vIFRoZSBsaXN0IHNob3VsZCBub3cgYmUgc2hvd24uCisgICAgICAgICAgICBzZXRMaXN0U2hvd24odHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25Mb2FkZXJSZXNldChMb2FkZXI8TGlzdDxBcHBFbnRyeT4+IGxvYWRlcikgeworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGRhdGEgaW4gdGhlIGFkYXB0ZXIuCisgICAgICAgICAgICBtQWRhcHRlci5zZXREYXRhKG51bGwpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShmcmFnbWVudCkKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyVGhyb3R0bGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTG9hZGVyVGhyb3R0bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRjODM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Mb2FkZXJUaHJvdHRsZS5qYXZhCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCisvL0JFR0lOX0lOQ0xVREUoY29tcGxldGUpCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgYm90dG9tIHRvIHRvcCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRlbnQgcHJvdmlkZXIgaG9sZGluZworICogc3RydWN0dXJlZCBkYXRhIHRocm91Z2ggZGlzcGxheWluZyBpdCBpbiB0aGUgVUksIHVzaW5nIHRocm90dGxpbmcgdG8gcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgZG9uZSB3aGVuIGl0cyBkYXRhIGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJUaHJvdHRsZSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvLyBEZWJ1Z2dpbmcuCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9hZGVyVGhyb3R0bGUiOworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvcml0eSB3ZSB1c2UgdG8gZ2V0IHRvIG91ciBzYW1wbGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTG9hZGVyVGhyb3R0bGUiOworCisgICAgLyoqCisgICAgICogRGVmaW5pdGlvbiBvZiB0aGUgY29udHJhY3QgZm9yIHRoZSBtYWluIHRhYmxlIG9mIG91ciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1haW5UYWJsZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICAvLyBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgICAgcHJpdmF0ZSBNYWluVGFibGUoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGFibGUgbmFtZSBvZmZlcmVkIGJ5IHRoaXMgcHJvdmlkZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAibWFpbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvbWFpbiIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudCBVUkkgYmFzZSBmb3IgYSBzaW5nbGUgcm93IG9mIGRhdGEuIENhbGxlcnMgbXVzdAorICAgICAgICAgKiBhcHBlbmQgYSBudW1lcmljIHJvdyBpZCB0byB0aGlzIFVyaSB0byByZXRyaWV2ZSBhIHJvdworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9JRF9VUklfQkFTRQorICAgICAgICAgICAgICAgID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvbWFpbi8iKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRQorICAgICAgICAgICAgICAgID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvdm5kLmV4YW1wbGUuYXBpLWRlbW9zLXRocm90dGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgcm93LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUKKyAgICAgICAgICAgICAgICA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS92bmQuZXhhbXBsZS5hcGktZGVtb3MtdGhyb3R0bGUiOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1JUX09SREVSID0gImRhdGEgQ09MTEFURSBMT0NBTElaRUQgQVNDIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29sdW1uIG5hbWUgZm9yIHRoZSBzaW5nbGUgY29sdW1uIGhvbGRpbmcgb3VyIGRhdGEuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRV9EQVRBID0gImRhdGEiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaGVscHMgb3BlbiwgY3JlYXRlLCBhbmQgdXBncmFkZSB0aGUgZGF0YWJhc2UgZmlsZS4KKyAgICAgKi8KKyAgIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworCisgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX05BTUUgPSAibG9hZGVyX3Rocm90dGxlLmRiIjsKKyAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTiA9IDI7CisKKyAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICAgICAvLyBjYWxscyB0aGUgc3VwZXIgY29uc3RydWN0b3IsIHJlcXVlc3RpbmcgdGhlIGRlZmF1bHQgY3Vyc29yIGZhY3RvcnkuCisgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOworICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqCisgICAgICAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB3aXRoIHRhYmxlIG5hbWUgYW5kIGNvbHVtbiBuYW1lcyB0YWtlbiBmcm9tIHRoZQorICAgICAgICAqIE5vdGVQYWQgY2xhc3MuCisgICAgICAgICovCisgICAgICAgQE92ZXJyaWRlCisgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgZGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBNYWluVGFibGUuVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICAgICAgICArIE1haW5UYWJsZS5fSUQgKyAiIElOVEVHRVIgUFJJTUFSWSBLRVksIgorICAgICAgICAgICAgICAgICAgICsgTWFpblRhYmxlLkNPTFVNTl9OQU1FX0RBVEEgKyAiIFRFWFQiCisgICAgICAgICAgICAgICAgICAgKyAiKTsiKTsKKyAgICAgICB9CisKKyAgICAgICAvKioKKyAgICAgICAgKgorICAgICAgICAqIERlbW9uc3RyYXRlcyB0aGF0IHRoZSBwcm92aWRlciBtdXN0IGNvbnNpZGVyIHdoYXQgaGFwcGVucyB3aGVuIHRoZQorICAgICAgICAqIHVuZGVybHlpbmcgZGF0YXN0b3JlIGlzIGNoYW5nZWQuIEluIHRoaXMgc2FtcGxlLCB0aGUgZGF0YWJhc2UgaXMgdXBncmFkZWQgdGhlIGRhdGFiYXNlCisgICAgICAgICogYnkgZGVzdHJveWluZyB0aGUgZXhpc3RpbmcgZGF0YS4KKyAgICAgICAgKiBBIHJlYWwgYXBwbGljYXRpb24gc2hvdWxkIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGluIHBsYWNlLgorICAgICAgICAqLworICAgICAgIEBPdmVycmlkZQorICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7CisKKyAgICAgICAgICAgLy8gTG9ncyB0aGF0IHRoZSBkYXRhYmFzZSBpcyBiZWluZyB1cGdyYWRlZAorICAgICAgICAgICBMb2cudyhUQUcsICJVcGdyYWRpbmcgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKyBvbGRWZXJzaW9uICsgIiB0byAiCisgICAgICAgICAgICAgICAgICAgKyBuZXdWZXJzaW9uICsgIiwgd2hpY2ggd2lsbCBkZXN0cm95IGFsbCBvbGQgZGF0YSIpOworCisgICAgICAgICAgIC8vIEtpbGxzIHRoZSB0YWJsZSBhbmQgZXhpc3RpbmcgZGF0YQorICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyBub3RlcyIpOworCisgICAgICAgICAgIC8vIFJlY3JlYXRlcyB0aGUgZGF0YWJhc2Ugd2l0aCBhIG5ldyB2ZXJzaW9uCisgICAgICAgICAgIG9uQ3JlYXRlKGRiKTsKKyAgICAgICB9CisgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZlcnkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGEgY29udGVudCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKKyAgICAgICAgLy8gQSBwcm9qZWN0aW9uIG1hcCB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU5vdGVzUHJvamVjdGlvbk1hcDsKKyAgICAgICAgLy8gVXJpIG1hdGNoZXIgdG8gZGVjb2RlIGluY29taW5nIFVSSXMuCisgICAgICAgIHByaXZhdGUgZmluYWwgVXJpTWF0Y2hlciBtVXJpTWF0Y2hlcjsKKworICAgICAgICAvLyBUaGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlIG1haW4gdGFibGUgVVJJIHBhdHRlcm4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU4gPSAxOworICAgICAgICAvLyBUaGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlIG1haW4gdGFibGUgcm93IElEIFVSSSBwYXR0ZXJuCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQUlOX0lEID0gMjsKKworICAgICAgICAvLyBIYW5kbGUgdG8gYSBuZXcgRGF0YWJhc2VIZWxwZXIuCisgICAgICAgIHByaXZhdGUgRGF0YWJhc2VIZWxwZXIgbU9wZW5IZWxwZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdsb2JhbCBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTaW1wbGVQcm92aWRlcigpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBVUkkgbWF0Y2hlci4KKyAgICAgICAgICAgIG1VcmlNYXRjaGVyID0gbmV3IFVyaU1hdGNoZXIoVXJpTWF0Y2hlci5OT19NQVRDSCk7CisgICAgICAgICAgICBtVXJpTWF0Y2hlci5hZGRVUkkoQVVUSE9SSVRZLCBNYWluVGFibGUuVEFCTEVfTkFNRSwgTUFJTik7CisgICAgICAgICAgICBtVXJpTWF0Y2hlci5hZGRVUkkoQVVUSE9SSVRZLCBNYWluVGFibGUuVEFCTEVfTkFNRSArICIvIyIsIE1BSU5fSUQpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIGluaXRpYWxpemUgcHJvamVjdGlvbiBtYXAgZm9yIGFsbCBjb2x1bW5zLiAgVGhpcyBpcworICAgICAgICAgICAgLy8gc2ltcGx5IGFuIGlkZW50aXR5IG1hcHBpbmcuCisgICAgICAgICAgICBtTm90ZXNQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICBtTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChNYWluVGFibGUuX0lELCBNYWluVGFibGUuX0lEKTsKKyAgICAgICAgICAgIG1Ob3Rlc1Byb2plY3Rpb25NYXAucHV0KE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBLCBNYWluVGFibGUuQ09MVU1OX05BTUVfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybSBwcm92aWRlciBjcmVhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1PcGVuSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAvLyBBc3N1bWVzIHRoYXQgYW55IGZhaWx1cmVzIHdpbGwgYmUgcmVwb3J0ZWQgYnkgYSB0aHJvd24gZXhjZXB0aW9uLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIGluY29taW5nIHF1ZXJpZXMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBxdWVyeSBidWlsZGVyIGFuZCBzZXRzIGl0cyB0YWJsZSBuYW1lCisgICAgICAgICAgICBTUUxpdGVRdWVyeUJ1aWxkZXIgcWIgPSBuZXcgU1FMaXRlUXVlcnlCdWlsZGVyKCk7CisgICAgICAgICAgICBxYi5zZXRUYWJsZXMoTWFpblRhYmxlLlRBQkxFX05BTUUpOworCisgICAgICAgICAgICBzd2l0Y2ggKG1VcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1BSU46CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgaXMgZm9yIG1haW4gdGFibGUuCisgICAgICAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAobU5vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNQUlOX0lEOgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgVVJJIGlzIGZvciBhIHNpbmdsZSByb3cuCisgICAgICAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAobU5vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICAgICAgIHFiLmFwcGVuZFdoZXJlKE1haW5UYWJsZS5fSUQgKyAiPT8iKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IERhdGFiYXNlVXRpbHMuYXBwZW5kU2VsZWN0aW9uQXJncyhzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSB9KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc29ydE9yZGVyKSkgeworICAgICAgICAgICAgICAgIHNvcnRPcmRlciA9IE1haW5UYWJsZS5ERUZBVUxUX1NPUlRfT1JERVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworCisgICAgICAgICAgICBDdXJzb3IgYyA9IHFiLnF1ZXJ5KGRiLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbm8gZ3JvdXAgKi8sIG51bGwgLyogbm8gZmlsdGVyICovLCBzb3J0T3JkZXIpOworCisgICAgICAgICAgICBjLnNldE5vdGlmaWNhdGlvblVyaShnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIE1JTUUgdHlwZSBmb3IgYW4ga25vd24gVVJJIGluIHRoZSBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICAgICAgc3dpdGNoIChtVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNQUlOOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWFpblRhYmxlLkNPTlRFTlRfVFlQRTsKKyAgICAgICAgICAgICAgICBjYXNlIE1BSU5fSUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYWluVGFibGUuQ09OVEVOVF9JVEVNX1RZUEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlciBpbnNlcnRpbmcgbmV3IGRhdGEuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKSB7CisgICAgICAgICAgICBpZiAobVVyaU1hdGNoZXIubWF0Y2godXJpKSAhPSBNQUlOKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuIG9ubHkgaW5zZXJ0IGludG8gdG8gbWFpbiBVUkkuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzOworCisgICAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoaW5pdGlhbFZhbHVlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTWFpblRhYmxlLkNPTFVNTl9OQU1FX0RBVEEpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNYWluVGFibGUuQ09MVU1OX05BTUVfREFUQSwgIiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKworICAgICAgICAgICAgbG9uZyByb3dJZCA9IGRiLmluc2VydChNYWluVGFibGUuVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGluc2VydCBzdWNjZWVkZWQsIHRoZSByb3cgSUQgZXhpc3RzLgorICAgICAgICAgICAgaWYgKHJvd0lkID4gMCkgeworICAgICAgICAgICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoTWFpblRhYmxlLkNPTlRFTlRfSURfVVJJX0JBU0UsIHJvd0lkKTsKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKG5vdGVVcmksIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBub3RlVXJpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5zZXJ0IHJvdyBpbnRvICIgKyB1cmkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSBkZWxldGluZyBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyB3aGVyZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBmaW5hbFdoZXJlOworCisgICAgICAgICAgICBpbnQgY291bnQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobVVyaU1hdGNoZXIubWF0Y2godXJpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUFJTjoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgVVJJIGlzIG1haW4gdGFibGUsIGRlbGV0ZSB1c2VzIGluY29taW5nIHdoZXJlIGNsYXVzZSBhbmQgYXJncy4KKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBkYi5kZWxldGUoTWFpblRhYmxlLlRBQkxFX05BTUUsIHdoZXJlLCB3aGVyZUFyZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgYSBzaW5nbGUgbm90ZSBJRCwgZG9lcyB0aGUgZGVsZXRlIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBpbmNvbWluZyBkYXRhLCBidXQgbW9kaWZpZXMgdGhlIHdoZXJlIGNsYXVzZSB0byByZXN0cmljdCBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljdWxhciBub3RlIElELgorICAgICAgICAgICAgICAgIGNhc2UgTUFJTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgVVJJIGlzIGZvciBhIHBhcnRpY3VsYXIgcm93IElELCBkZWxldGUgaXMgYmFzZWQgb24gaW5jb21pbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBidXQgbW9kaWZpZWQgdG8gcmVzdHJpY3QgdG8gdGhlIGdpdmVuIElELgorICAgICAgICAgICAgICAgICAgICBmaW5hbFdoZXJlID0gRGF0YWJhc2VVdGlscy5jb25jYXRlbmF0ZVdoZXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW5UYWJsZS5fSUQgKyAiID0gIiArIENvbnRlbnRVcmlzLnBhcnNlSWQodXJpKSwgd2hlcmUpOworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZShNYWluVGFibGUuVEFCTEVfTkFNRSwgZmluYWxXaGVyZSwgd2hlcmVBcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm5vdGlmeUNoYW5nZSh1cmksIG51bGwpOworCisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHVwZGF0aW5nIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyB3aGVyZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgIFN0cmluZyBmaW5hbFdoZXJlOworCisgICAgICAgICAgICBzd2l0Y2ggKG1VcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1BSU46CisgICAgICAgICAgICAgICAgICAgIC8vIElmIFVSSSBpcyBtYWluIHRhYmxlLCB1cGRhdGUgdXNlcyBpbmNvbWluZyB3aGVyZSBjbGF1c2UgYW5kIGFyZ3MuCisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKE1haW5UYWJsZS5UQUJMRV9OQU1FLCB2YWx1ZXMsIHdoZXJlLCB3aGVyZUFyZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTUFJTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgVVJJIGlzIGZvciBhIHBhcnRpY3VsYXIgcm93IElELCB1cGRhdGUgaXMgYmFzZWQgb24gaW5jb21pbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBidXQgbW9kaWZpZWQgdG8gcmVzdHJpY3QgdG8gdGhlIGdpdmVuIElELgorICAgICAgICAgICAgICAgICAgICBmaW5hbFdoZXJlID0gRGF0YWJhc2VVdGlscy5jb25jYXRlbmF0ZVdoZXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW5UYWJsZS5fSUQgKyAiID0gIiArIENvbnRlbnRVcmlzLnBhcnNlSWQodXJpKSwgd2hlcmUpOworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGRiLnVwZGF0ZShNYWluVGFibGUuVEFCTEVfTkFNRSwgdmFsdWVzLCBmaW5hbFdoZXJlLCB3aGVyZUFyZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKHVyaSwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBmbS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBsaXN0KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50IGV4dGVuZHMgTGlzdEZyYWdtZW50CisgICAgICAgICAgICBpbXBsZW1lbnRzIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEN1cnNvcj4geworCisgICAgICAgIC8vIE1lbnUgaWRlbnRpZmllcnMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBQT1BVTEFURV9JRCA9IE1lbnUuRklSU1Q7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfSUQgPSBNZW51LkZJUlNUKzE7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgQWRhcHRlciBiZWluZyB1c2VkIHRvIGRpc3BsYXkgdGhlIGxpc3QncyBkYXRhLgorICAgICAgICBTaW1wbGVDdXJzb3JBZGFwdGVyIG1BZGFwdGVyOworCisgICAgICAgIC8vIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBjdXJyZW50IGZpbHRlciB0aGUgdXNlciBoYXMgcHJvdmlkZWQuCisgICAgICAgIFN0cmluZyBtQ3VyRmlsdGVyOworCisgICAgICAgIC8vIFRhc2sgd2UgaGF2ZSBydW5uaW5nIHRvIHBvcHVsYXRlIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+IG1Qb3B1bGF0aW5nVGFzazsKKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgc2V0RW1wdHlUZXh0KCJObyBkYXRhLiAgU2VsZWN0ICdQb3B1bGF0ZScgdG8gZmlsbCB3aXRoIGRhdGEgZnJvbSBaIHRvIEEgYXQgYSByYXRlIG9mIDQgcGVyIHNlY29uZC4iKTsKKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYWRhcHRlciB3ZSB3aWxsIHVzZSB0byBkaXNwbGF5IHRoZSBsb2FkZWQgZGF0YS4KKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSB9LCAwKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbG9hZGVyLiAgRWl0aGVyIHJlLWNvbm5lY3Qgd2l0aCBhbiBleGlzdGluZyBvbmUsCisgICAgICAgICAgICAvLyBvciBzdGFydCBhIG5ldyBvbmUuCisgICAgICAgICAgICBnZXRMb2FkZXJNYW5hZ2VyKCkuaW5pdExvYWRlcigwLCBudWxsLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICBtZW51LmFkZChNZW51Lk5PTkUsIFBPUFVMQVRFX0lELCAwLCAiUG9wdWxhdGUiKQorICAgICAgICAgICAgICAgICAgICAuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgbWVudS5hZGQoTWVudS5OT05FLCBDTEVBUl9JRCwgMCwgIkNsZWFyIikKKyAgICAgICAgICAgICAgICAgICAgLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gZ2V0QWN0aXZpdHkoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1BVTEFURV9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3B1bGF0aW5nVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2sgPSBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFyIGM9J1onOyBjPj0nQSc7IGMtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIkRhdGEgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWFpblRhYmxlLkNPTFVNTl9OQU1FX0RBVEEsIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyLmluc2VydChNYWluVGFibGUuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgYSBiaXQgYmV0d2VlbiBlYWNoIGluc2VydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1bGF0aW5nVGFzay5leGVjdXRlT25FeGVjdXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IsIChWb2lkW10pbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3B1bGF0aW5nVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3B1bGF0aW5nVGFzayA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+IHRhc2sgPSBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKE1haW5UYWJsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRhc2suZXhlY3V0ZSgoVm9pZFtdKW51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgZGVzaXJlZCBiZWhhdmlvciBoZXJlLgorICAgICAgICAgICAgTG9nLmkoVEFHLCAiSXRlbSBjbGlja2VkOiAiICsgaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSByb3dzIHRoYXQgd2Ugd2lsbCByZXRyaWV2ZS4KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTWFpblRhYmxlLl9JRCwKKyAgICAgICAgICAgIE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBMb2FkZXI8Q3Vyc29yPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBDdXJzb3JMb2FkZXIgY2wgPSBuZXcgQ3Vyc29yTG9hZGVyKGdldEFjdGl2aXR5KCksIE1haW5UYWJsZS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjbC5zZXRVcGRhdGVUaHJvdHRsZSgyMDAwKTsgLy8gdXBkYXRlIGF0IG1vc3QgZXZlcnkgMiBzZWNvbmRzLgorICAgICAgICAgICAgcmV0dXJuIGNsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyLCBDdXJzb3IgZGF0YSkgeworICAgICAgICAgICAgbUFkYXB0ZXIuc3dhcEN1cnNvcihkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZGVyUmVzZXQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyKSB7CisgICAgICAgICAgICBtQWRhcHRlci5zd2FwQ3Vyc29yKG51bGwpOworICAgICAgICB9CisgICAgfQorfQorLy9FTkRfSU5DTFVERShjb21wbGV0ZSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTXlQcmVmZXJlbmNlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL015UHJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdjMTgxLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTXlQcmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKLQotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGN1c3RvbSBwcmVmZXJlbmNlIHR5cGUuIFRoZSBwcmVmZXJlbmNlIGNvdW50cyB0aGUKLSAqIG51bWJlciBvZiBjbGlja3MgaXQgaGFzIHJlY2VpdmVkIGFuZCBzdG9yZXMvcmV0cmlldmVzIGl0IGZyb20gdGhlIHN0b3JhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVByZWZlcmVuY2UgZXh0ZW5kcyBQcmVmZXJlbmNlIHsKLSAgICBwcml2YXRlIGludCBtQ2xpY2tDb3VudGVyOwotICAgIAotICAgIC8vIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIGNhbGxlZCBieSB0aGUgaW5mbGF0ZXIKLSAgICBwdWJsaWMgTXlQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgCi0gICAgICAgIHNldFdpZGdldExheW91dFJlc291cmNlKFIubGF5b3V0LnByZWZlcmVuY2Vfd2lkZ2V0X215cHJlZmVyZW5jZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkJpbmRWaWV3KFZpZXcgdmlldykgewotICAgICAgICBzdXBlci5vbkJpbmRWaWV3KHZpZXcpOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0IG91ciBjdXN0b20gdmlld3MgaW5zaWRlIHRoZSBsYXlvdXQKLSAgICAgICAgZmluYWwgVGV4dFZpZXcgbXlUZXh0VmlldyA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5teXByZWZlcmVuY2Vfd2lkZ2V0KTsKLSAgICAgICAgaWYgKG15VGV4dFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgbXlUZXh0Vmlldy5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKG1DbGlja0NvdW50ZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ2xpY2soKSB7Ci0gICAgICAgIGludCBuZXdWYWx1ZSA9IG1DbGlja0NvdW50ZXIgKyAxOwotICAgICAgICAvLyBHaXZlIHRoZSBjbGllbnQgYSBjaGFuY2UgdG8gaWdub3JlIHRoaXMgY2hhbmdlIGlmIHRoZXkgZGVlbSBpdAotICAgICAgICAvLyBpbnZhbGlkCi0gICAgICAgIGlmICghY2FsbENoYW5nZUxpc3RlbmVyKG5ld1ZhbHVlKSkgewotICAgICAgICAgICAgLy8gVGhleSBkb24ndCB3YW50IHRoZSB2YWx1ZSB0byBiZSBzZXQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSW5jcmVtZW50IGNvdW50ZXIKLSAgICAgICAgbUNsaWNrQ291bnRlciA9IG5ld1ZhbHVlOwotICAgICAgICAKLSAgICAgICAgLy8gU2F2ZSB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgKHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoaXMKLSAgICAgICAgLy8gcHJlZmVyZW5jZSBzaG91bGQgYmUgcGVyc2lzdGVudCwgYWxvbmcgd2l0aCBvdGhlciB1c2VmdWwgY2hlY2tzKQotICAgICAgICBwZXJzaXN0SW50KG1DbGlja0NvdW50ZXIpOwotICAgICAgICAKLSAgICAgICAgLy8gRGF0YSBoYXMgY2hhbmdlZCwgbm90aWZ5IHNvIFVJIGNhbiBiZSByZWZyZXNoZWQhCi0gICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7Ci0gICAgICAgIC8vIFRoaXMgcHJlZmVyZW5jZSB0eXBlJ3MgdmFsdWUgdHlwZSBpcyBJbnRlZ2VyLCBzbyB3ZSByZWFkIHRoZSBkZWZhdWx0Ci0gICAgICAgIC8vIHZhbHVlIGZyb20gdGhlIGF0dHJpYnV0ZXMgYXMgYW4gSW50ZWdlci4KLSAgICAgICAgcmV0dXJuIGEuZ2V0SW50ZWdlcihpbmRleCwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25TZXRJbml0aWFsVmFsdWUoYm9vbGVhbiByZXN0b3JlVmFsdWUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVWYWx1ZSkgewotICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQotICAgICAgICAgICAgbUNsaWNrQ291bnRlciA9IGdldFBlcnNpc3RlZEludChtQ2xpY2tDb3VudGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNldCBzdGF0ZQotICAgICAgICAgICAgaW50IHZhbHVlID0gKEludGVnZXIpIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgIG1DbGlja0NvdW50ZXIgPSB2YWx1ZTsKLSAgICAgICAgICAgIHBlcnNpc3RJbnQodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU3VwcG9zZSBhIGNsaWVudCB1c2VzIHRoaXMgcHJlZmVyZW5jZSB0eXBlIHdpdGhvdXQgcGVyc2lzdGluZy4gV2UKLSAgICAgICAgICogbXVzdCBzYXZlIHRoZSBpbnN0YW5jZSBzdGF0ZSBzbyBpdCBpcyBhYmxlIHRvLCBmb3IgZXhhbXBsZSwgc3Vydml2ZQotICAgICAgICAgKiBvcmllbnRhdGlvbiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKLSAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7Ci0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUgc2luY2UgaXQncyBwZXJzaXN0ZW50Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXJTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhdmUgdGhlIGluc3RhbmNlIHN0YXRlCi0gICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOwotICAgICAgICBteVN0YXRlLmNsaWNrQ291bnRlciA9IG1DbGlja0NvdW50ZXI7Ci0gICAgICAgIHJldHVybiBteVN0YXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBpZiAoIXN0YXRlLmdldENsYXNzKCkuZXF1YWxzKFNhdmVkU3RhdGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAvLyBEaWRuJ3Qgc2F2ZSBzdGF0ZSBmb3IgdXMgaW4gb25TYXZlSW5zdGFuY2VTdGF0ZQotICAgICAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgCi0gICAgICAgIC8vIFJlc3RvcmUgdGhlIGluc3RhbmNlIHN0YXRlCi0gICAgICAgIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IChTYXZlZFN0YXRlKSBzdGF0ZTsKLSAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShteVN0YXRlLmdldFN1cGVyU3RhdGUoKSk7Ci0gICAgICAgIG1DbGlja0NvdW50ZXIgPSBteVN0YXRlLmNsaWNrQ291bnRlcjsKLSAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYXZlZFN0YXRlLCBhIHN1YmNsYXNzIG9mIHtAbGluayBCYXNlU2F2ZWRTdGF0ZX0sIHdpbGwgc3RvcmUgdGhlIHN0YXRlCi0gICAgICogb2YgTXlQcmVmZXJlbmNlLCBhIHN1YmNsYXNzIG9mIFByZWZlcmVuY2UuCi0gICAgICogPHA+Ci0gICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGFsd2F5cyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBpbnQgY2xpY2tDb3VudGVyOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgewotICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xpY2sgY291bnRlcgotICAgICAgICAgICAgY2xpY2tDb3VudGVyID0gc291cmNlLnJlYWRJbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTYXZlIHRoZSBjbGljayBjb3VudGVyCi0gICAgICAgICAgICBkZXN0LndyaXRlSW50KGNsaWNrQ291bnRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKLSAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9Ci0gICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MyMmRlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKLQotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VEZXBlbmRlbmNpZXMgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VzRnJvbUNvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyMmI0OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VzRnJvbUNvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLkVkaXRUZXh0UHJlZmVyZW5jZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuTGlzdFByZWZlcmVuY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5OwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwotCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0Zyb21Db2RlIGV4dGVuZHMgUHJlZmVyZW5jZUFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4oY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByZWZlcmVuY2VTY3JlZW4gY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpIHsKLSAgICAgICAgLy8gUm9vdAotICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIHJvb3QgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbmxpbmUgcHJlZmVyZW5jZXMgCi0gICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBpbmxpbmVQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKLSAgICAgICAgaW5saW5lUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5pbmxpbmVfcHJlZmVyZW5jZXMpOwotICAgICAgICByb290LmFkZFByZWZlcmVuY2UoaW5saW5lUHJlZkNhdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUb2dnbGUgcHJlZmVyZW5jZQotICAgICAgICBDaGVja0JveFByZWZlcmVuY2UgdG9nZ2xlUHJlZiA9IG5ldyBDaGVja0JveFByZWZlcmVuY2UodGhpcyk7Ci0gICAgICAgIHRvZ2dsZVByZWYuc2V0S2V5KCJ0b2dnbGVfcHJlZmVyZW5jZSIpOwotICAgICAgICB0b2dnbGVQcmVmLnNldFRpdGxlKFIuc3RyaW5nLnRpdGxlX3RvZ2dsZV9wcmVmZXJlbmNlKTsKLSAgICAgICAgdG9nZ2xlUHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfdG9nZ2xlX3ByZWZlcmVuY2UpOwotICAgICAgICBpbmxpbmVQcmVmQ2F0LmFkZFByZWZlcmVuY2UodG9nZ2xlUHJlZik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIERpYWxvZyBiYXNlZCBwcmVmZXJlbmNlcwotICAgICAgICBQcmVmZXJlbmNlQ2F0ZWdvcnkgZGlhbG9nQmFzZWRQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKLSAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19iYXNlZF9wcmVmZXJlbmNlcyk7Ci0gICAgICAgIHJvb3QuYWRkUHJlZmVyZW5jZShkaWFsb2dCYXNlZFByZWZDYXQpOwotCi0gICAgICAgIC8vIEVkaXQgdGV4dCBwcmVmZXJlbmNlCi0gICAgICAgIEVkaXRUZXh0UHJlZmVyZW5jZSBlZGl0VGV4dFByZWYgPSBuZXcgRWRpdFRleHRQcmVmZXJlbmNlKHRoaXMpOwotICAgICAgICBlZGl0VGV4dFByZWYuc2V0RGlhbG9nVGl0bGUoUi5zdHJpbmcuZGlhbG9nX3RpdGxlX2VkaXR0ZXh0X3ByZWZlcmVuY2UpOwotICAgICAgICBlZGl0VGV4dFByZWYuc2V0S2V5KCJlZGl0dGV4dF9wcmVmZXJlbmNlIik7Ci0gICAgICAgIGVkaXRUZXh0UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKLSAgICAgICAgZWRpdFRleHRQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKLSAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LmFkZFByZWZlcmVuY2UoZWRpdFRleHRQcmVmKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExpc3QgcHJlZmVyZW5jZQotICAgICAgICBMaXN0UHJlZmVyZW5jZSBsaXN0UHJlZiA9IG5ldyBMaXN0UHJlZmVyZW5jZSh0aGlzKTsKLSAgICAgICAgbGlzdFByZWYuc2V0RW50cmllcyhSLmFycmF5LmVudHJpZXNfbGlzdF9wcmVmZXJlbmNlKTsKLSAgICAgICAgbGlzdFByZWYuc2V0RW50cnlWYWx1ZXMoUi5hcnJheS5lbnRyeXZhbHVlc19saXN0X3ByZWZlcmVuY2UpOwotICAgICAgICBsaXN0UHJlZi5zZXREaWFsb2dUaXRsZShSLnN0cmluZy5kaWFsb2dfdGl0bGVfbGlzdF9wcmVmZXJlbmNlKTsKLSAgICAgICAgbGlzdFByZWYuc2V0S2V5KCJsaXN0X3ByZWZlcmVuY2UiKTsKLSAgICAgICAgbGlzdFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfbGlzdF9wcmVmZXJlbmNlKTsKLSAgICAgICAgbGlzdFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X2xpc3RfcHJlZmVyZW5jZSk7Ci0gICAgICAgIGRpYWxvZ0Jhc2VkUHJlZkNhdC5hZGRQcmVmZXJlbmNlKGxpc3RQcmVmKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExhdW5jaCBwcmVmZXJlbmNlcwotICAgICAgICBQcmVmZXJlbmNlQ2F0ZWdvcnkgbGF1bmNoUHJlZkNhdCA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7Ci0gICAgICAgIGxhdW5jaFByZWZDYXQuc2V0VGl0bGUoUi5zdHJpbmcubGF1bmNoX3ByZWZlcmVuY2VzKTsKLSAgICAgICAgcm9vdC5hZGRQcmVmZXJlbmNlKGxhdW5jaFByZWZDYXQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBQcmVmZXJlbmNlcyBzY3JlZW5QcmVmIHNlcnZlcyBhcyBhIHNjcmVlbiBicmVhayAoc2ltaWxhciB0byBwYWdlCi0gICAgICAgICAqIGJyZWFrIGluIHdvcmQgcHJvY2Vzc2luZykuIExpa2UgZm9yIG90aGVyIHByZWZlcmVuY2UgdHlwZXMsIHdlIGFzc2lnbgotICAgICAgICAgKiBhIGtleSBoZXJlIHNvIHRoYXQgaXQgaXMgYWJsZSB0byBzYXZlIGFuZCByZXN0b3JlIGl0cyBpbnN0YW5jZSBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFNjcmVlbiBwcmVmZXJlbmNlCi0gICAgICAgIFByZWZlcmVuY2VTY3JlZW4gc2NyZWVuUHJlZiA9IGdldFByZWZlcmVuY2VNYW5hZ2VyKCkuY3JlYXRlUHJlZmVyZW5jZVNjcmVlbih0aGlzKTsKLSAgICAgICAgc2NyZWVuUHJlZi5zZXRLZXkoInNjcmVlbl9wcmVmZXJlbmNlIik7Ci0gICAgICAgIHNjcmVlblByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfc2NyZWVuX3ByZWZlcmVuY2UpOwotICAgICAgICBzY3JlZW5QcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9zY3JlZW5fcHJlZmVyZW5jZSk7Ci0gICAgICAgIGxhdW5jaFByZWZDYXQuYWRkUHJlZmVyZW5jZShzY3JlZW5QcmVmKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFlvdSBjYW4gYWRkIG1vcmUgcHJlZmVyZW5jZXMgdG8gc2NyZWVuUHJlZiB0aGF0IHdpbGwgYmUgc2hvd24gb24gdGhlCi0gICAgICAgICAqIG5leHQgc2NyZWVuLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIC8vIEV4YW1wbGUgb2YgbmV4dCBzY3JlZW4gdG9nZ2xlIHByZWZlcmVuY2UKLSAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIG5leHRTY3JlZW5DaGVja0JveFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOwotICAgICAgICBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmLnNldEtleSgibmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiKTsKLSAgICAgICAgbmV4dFNjcmVlbkNoZWNrQm94UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSk7Ci0gICAgICAgIG5leHRTY3JlZW5DaGVja0JveFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlKTsKLSAgICAgICAgc2NyZWVuUHJlZi5hZGRQcmVmZXJlbmNlKG5leHRTY3JlZW5DaGVja0JveFByZWYpOwotICAgICAgICAKLSAgICAgICAgLy8gSW50ZW50IHByZWZlcmVuY2UKLSAgICAgICAgUHJlZmVyZW5jZVNjcmVlbiBpbnRlbnRQcmVmID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5jcmVhdGVQcmVmZXJlbmNlU2NyZWVuKHRoaXMpOwotICAgICAgICBpbnRlbnRQcmVmLnNldEludGVudChuZXcgSW50ZW50KCkuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fVklFVykKLSAgICAgICAgICAgICAgICAuc2V0RGF0YShVcmkucGFyc2UoImh0dHA6Ly93d3cuYW5kcm9pZC5jb20iKSkpOwotICAgICAgICBpbnRlbnRQcmVmLnNldFRpdGxlKFIuc3RyaW5nLnRpdGxlX2ludGVudF9wcmVmZXJlbmNlKTsKLSAgICAgICAgaW50ZW50UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfaW50ZW50X3ByZWZlcmVuY2UpOwotICAgICAgICBsYXVuY2hQcmVmQ2F0LmFkZFByZWZlcmVuY2UoaW50ZW50UHJlZik7Ci0gICAgICAgIAotICAgICAgICAvLyBQcmVmZXJlbmNlIGF0dHJpYnV0ZXMKLSAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IHByZWZBdHRyc0NhdCA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7Ci0gICAgICAgIHByZWZBdHRyc0NhdC5zZXRUaXRsZShSLnN0cmluZy5wcmVmZXJlbmNlX2F0dHJpYnV0ZXMpOwotICAgICAgICByb290LmFkZFByZWZlcmVuY2UocHJlZkF0dHJzQ2F0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZpc3VhbCBwYXJlbnQgdG9nZ2xlIHByZWZlcmVuY2UKLSAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIHBhcmVudENoZWNrQm94UHJlZiA9IG5ldyBDaGVja0JveFByZWZlcmVuY2UodGhpcyk7Ci0gICAgICAgIHBhcmVudENoZWNrQm94UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9wYXJlbnRfcHJlZmVyZW5jZSk7Ci0gICAgICAgIHBhcmVudENoZWNrQm94UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfcGFyZW50X3ByZWZlcmVuY2UpOwotICAgICAgICBwcmVmQXR0cnNDYXQuYWRkUHJlZmVyZW5jZShwYXJlbnRDaGVja0JveFByZWYpOwotICAgICAgICAKLSAgICAgICAgLy8gVmlzdWFsIGNoaWxkIHRvZ2dsZSBwcmVmZXJlbmNlCi0gICAgICAgIC8vIFNlZSByZXMvdmFsdWVzL2F0dHJzLnhtbCBmb3IgdGhlIDxkZWNsYXJlLXN0eWxlYWJsZT4gdGhhdCBkZWZpbmVzCi0gICAgICAgIC8vIFRvZ2dsZVByZWZBdHRycy4KLSAgICAgICAgVHlwZWRBcnJheSBhID0gb2J0YWluU3R5bGVkQXR0cmlidXRlcyhSLnN0eWxlYWJsZS5Ub2dnbGVQcmVmQXR0cnMpOwotICAgICAgICBDaGVja0JveFByZWZlcmVuY2UgY2hpbGRDaGVja0JveFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOwotICAgICAgICBjaGlsZENoZWNrQm94UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9jaGlsZF9wcmVmZXJlbmNlKTsKLSAgICAgICAgY2hpbGRDaGVja0JveFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X2NoaWxkX3ByZWZlcmVuY2UpOwotICAgICAgICBjaGlsZENoZWNrQm94UHJlZi5zZXRMYXlvdXRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuVG9nZ2xlUHJlZkF0dHJzX2FuZHJvaWRfcHJlZmVyZW5jZUxheW91dENoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgMCkpOwotICAgICAgICBwcmVmQXR0cnNDYXQuYWRkUHJlZmVyZW5jZShjaGlsZENoZWNrQm94UHJlZik7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYmJhYzIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7Ci0KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0Zyb21YbWwgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKLSAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZXMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Tb2Z0SW5wdXRNb2Rlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9Tb2Z0SW5wdXRNb2Rlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNmRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1NvZnRJbnB1dE1vZGVzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyOworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgdGhlIHZhcmlvdXMgc29mdCBpbnB1dCBtb2RlcyBpbXBhY3Qgd2luZG93IHJlc2l6aW5nLgorICovCitwdWJsaWMgY2xhc3MgU29mdElucHV0TW9kZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgU3Bpbm5lciBtUmVzaXplTW9kZTsKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2VbXSBtUmVzaXplTW9kZUxhYmVscyA9IG5ldyBDaGFyU2VxdWVuY2VbXSB7CisgICAgICAgICAgICAiVW5zcGVjaWZpZWQiLCAiUmVzaXplIiwgIlBhbiIsICJOb3RoaW5nIgorICAgIH07CisgICAgZmluYWwgaW50W10gbVJlc2l6ZU1vZGVWYWx1ZXMgPSBuZXcgaW50W10geworICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUsCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU4sCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9OT1RISU5HLAorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIEFjdGl2aXR5IGFmdGVyIGl0IGlzIGZpcnN0IGNyZWF0ZWQuICBIZXJlIHdlIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzZXRDb250ZW50VmlldyBzZXRDb250ZW50VmlldygpfSB0byBzZXQgdXAKKyAgICAgKiB0aGUgQWN0aXZpdHkncyBjb250ZW50LCBhbmQgcmV0cmlldmUgdGhlIEVkaXRUZXh0IHdpZGdldCB3aG9zZSBzdGF0ZSB3ZQorICAgICAqIHdpbGwgcGVyc2lzdGVudC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIC8vIEJlIHN1cmUgdG8gY2FsbCB0aGUgc3VwZXIgY2xhc3MuCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gU2VlIGFzc2V0cy9yZXMvYW55L2xheW91dC9zYXZlX3Jlc3RvcmVfc3RhdGUueG1sIGZvciB0aGlzCisgICAgICAgIC8vIHZpZXcgbGF5b3V0IGRlZmluaXRpb24sIHdoaWNoIGlzIGJlaW5nIHNldCBoZXJlIGFzCisgICAgICAgIC8vIHRoZSBjb250ZW50IG9mIG91ciBzY3JlZW4uCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnNvZnRfaW5wdXRfbW9kZXMpOworICAgICAgICAKKyAgICAgICAgbVJlc2l6ZU1vZGUgPSAoU3Bpbm5lcilmaW5kVmlld0J5SWQoUi5pZC5yZXNpemVfbW9kZSk7CisgICAgICAgIEFycmF5QWRhcHRlcjxDaGFyU2VxdWVuY2U+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPENoYXJTZXF1ZW5jZT4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1SZXNpemVNb2RlTGFiZWxzKTsKKyAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOworICAgICAgICBtUmVzaXplTW9kZS5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtUmVzaXplTW9kZS5zZXRTZWxlY3Rpb24oMCk7CisgICAgICAgIG1SZXNpemVNb2RlLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbmV3IE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFdpbmRvdygpLnNldFNvZnRJbnB1dE1vZGUobVJlc2l6ZU1vZGVWYWx1ZXNbcG9zaXRpb25dKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2luZG93KCkuc2V0U29mdElucHV0TW9kZShtUmVzaXplTW9kZVZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1N0YXR1c0Jhck5vdGlmaWNhdGlvbnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvU3RhdHVzQmFyTm90aWZpY2F0aW9ucy5qYXZhCmluZGV4IDliOTExY2MuLjcxNzliMjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvU3RhdHVzQmFyTm90aWZpY2F0aW9ucy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvU3RhdHVzQmFyTm90aWZpY2F0aW9ucy5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtMTQ4LDE1ICsxNDksNDcgQEAKICAgICAgICAgLy8gVGhlIFBlbmRpbmdJbnRlbnQgdG8gbGF1bmNoIG91ciBhY3Rpdml0eSBpZiB0aGUgdXNlciBzZWxlY3RzIHRoaXMKICAgICAgICAgLy8gbm90aWZpY2F0aW9uLiAgTm90ZSB0aGUgdXNlIG9mIEZMQUdfVVBEQVRFX0NVUlJFTlQgc28gdGhhdCBpZiB0aGVyZQogICAgICAgICAvLyBpcyBhbHJlYWR5IGFuIGFjdGl2ZSBtYXRjaGluZyBwZW5kaW5nIGludGVudCwgd2Ugd2lsbCB1cGRhdGUgaXRzCi0gICAgICAgIC8vIGV4dHJhcyB0byBiZSB0aGUgb25lcyBwYXNzZWQgaW4gaGVyZS4KKyAgICAgICAgLy8gZXh0cmFzIChhbmQgb3RoZXIgSW50ZW50cyBpbiB0aGUgYXJyYXkpIHRvIGJlIHRoZSBvbmVzIHBhc3NlZCBpbiBoZXJlLgogICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KHRoaXMsIDAsCi0gICAgICAgICAgICAgICAgbmV3IEludGVudCh0aGlzLCBOb3RpZmljYXRpb25EaXNwbGF5LmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dEV4dHJhKCJtb29kaW1nIiwgbW9vZElkKSwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KHRoaXMsIE5vdGlmaWNhdGlvbkRpc3BsYXkuY2xhc3MpLnB1dEV4dHJhKCJtb29kaW1nIiwgbW9vZElkKSwKICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOwogICAgICAgICByZXR1cm4gY29udGVudEludGVudDsKICAgICB9CiAgICAgCisvL0JFR0lOX0lOQ0xVREUoaW50ZW50X2FycmF5KQorICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtYWtlRGVmYXVsdEludGVudCgpIHsKKyAgICAgICAgLy8gQSB0eXBpY2FsIGNvbnZlbnRpb24gZm9yIG5vdGlmaWNhdGlvbnMgaXMgdG8gbGF1bmNoIHRoZSB1c2VyIGRlZXBseQorICAgICAgICAvLyBpbnRvIGFuIGFwcGxpY2F0aW9uIHJlcHJlc2VudGluZyB0aGUgZGF0YSBpbiB0aGUgbm90aWZpY2F0aW9uOyB0bworICAgICAgICAvLyBhY2NvbXBsaXNoIHRoaXMsIHdlIGNhbiBidWlsZCBhbiBhcnJheSBvZiBpbnRlbnRzIHRvIGluc2VydCB0aGUgYmFjaworICAgICAgICAvLyBzdGFjayBzdGFjayBoaXN0b3J5IGFib3ZlIHRoZSBpdGVtIGJlaW5nIGRpc3BsYXllZC4KKyAgICAgICAgSW50ZW50W10gaW50ZW50cyA9IG5ldyBJbnRlbnRbNF07CisKKyAgICAgICAgLy8gRmlyc3Q6IHJvb3QgYWN0aXZpdHkgb2YgQXBpRGVtb3MuCisgICAgICAgIC8vIFRoaXMgaXMgYSBjb252ZW5pZW50IHdheSB0byBtYWtlIHRoZSBwcm9wZXIgSW50ZW50IHRvIGxhdW5jaCBhbmQKKyAgICAgICAgLy8gcmVzZXQgYW4gYXBwbGljYXRpb24ncyB0YXNrLgorICAgICAgICBpbnRlbnRzWzBdID0gSW50ZW50Lm1ha2VSZXN0YXJ0QWN0aXZpdHlUYXNrKG5ldyBDb21wb25lbnROYW1lKHRoaXMsCisgICAgICAgICAgICAgICAgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLkFwaURlbW9zLmNsYXNzKSk7CisKKyAgICAgICAgLy8gIkFwcCIKKyAgICAgICAgaW50ZW50c1sxXSA9IG5ldyBJbnRlbnQodGhpcywgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLkFwaURlbW9zLmNsYXNzKTsKKyAgICAgICAgaW50ZW50c1sxXS5wdXRFeHRyYSgiY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlBhdGgiLCAiQXBwIik7CisgICAgICAgIC8vICJBcHAvTm90aWZpY2F0aW9uIgorICAgICAgICBpbnRlbnRzWzJdID0gbmV3IEludGVudCh0aGlzLCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuQXBpRGVtb3MuY2xhc3MpOworICAgICAgICBpbnRlbnRzWzJdLnB1dEV4dHJhKCJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUGF0aCIsICJBcHAvTm90aWZpY2F0aW9uIik7CisKKyAgICAgICAgLy8gTm93IHRoZSBhY3Rpdml0eSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgorICAgICAgICBpbnRlbnRzWzNdID0gbmV3IEludGVudCh0aGlzLCBTdGF0dXNCYXJOb3RpZmljYXRpb25zLmNsYXNzKTsKKworICAgICAgICAvLyBUaGUgUGVuZGluZ0ludGVudCB0byBsYXVuY2ggb3VyIGFjdGl2aXR5IGlmIHRoZSB1c2VyIHNlbGVjdHMgdGhpcworICAgICAgICAvLyBub3RpZmljYXRpb24uICBOb3RlIHRoZSB1c2Ugb2YgRkxBR19VUERBVEVfQ1VSUkVOVCBzbyB0aGF0IGlmIHRoZXJlCisgICAgICAgIC8vIGlzIGFscmVhZHkgYW4gYWN0aXZlIG1hdGNoaW5nIHBlbmRpbmcgaW50ZW50LCB3ZSB3aWxsIHVwZGF0ZSBpdHMKKyAgICAgICAgLy8gZXh0cmFzIChhbmQgb3RoZXIgSW50ZW50cyBpbiB0aGUgYXJyYXkpIHRvIGJlIHRoZSBvbmVzIHBhc3NlZCBpbiBoZXJlLgorICAgICAgICBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXRpZXModGhpcywgMCwKKyAgICAgICAgICAgICAgICBpbnRlbnRzLCBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOworICAgICAgICByZXR1cm4gY29udGVudEludGVudDsKKyAgICB9CisvL0VORF9JTkNMVURFKGludGVudF9hcnJheSkKKwogICAgIHByaXZhdGUgdm9pZCBzZXRNb29kKGludCBtb29kSWQsIGludCB0ZXh0SWQsIGJvb2xlYW4gc2hvd1RpY2tlcikgewogICAgICAgICAvLyBJbiB0aGlzIHNhbXBsZSwgd2UnbGwgdXNlIHRoZSBzYW1lIHRleHQgZm9yIHRoZSB0aWNrZXIgYW5kIHRoZSBleHBhbmRlZCBub3RpZmljYXRpb24KICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBnZXRUZXh0KHRleHRJZCk7CkBAIC0yMTAsOCArMjQzLDcgQEAKICAgICAgICAgLy8gVGhpcyBtZXRob2Qgc2V0cyB0aGUgZGVmYXVsdHMgb24gdGhlIG5vdGlmaWNhdGlvbiBiZWZvcmUgcG9zdGluZyBpdC4KICAgICAgICAgCiAgICAgICAgIC8vIFRoaXMgaXMgd2hvIHNob3VsZCBiZSBsYXVuY2hlZCBpZiB0aGUgdXNlciBzZWxlY3RzIG91ciBub3RpZmljYXRpb24uCi0gICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkodGhpcywgMCwKLSAgICAgICAgICAgICAgICBuZXcgSW50ZW50KHRoaXMsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbnMuY2xhc3MpLCAwKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbWFrZURlZmF1bHRJbnRlbnQoKTsKIAogICAgICAgICAvLyBJbiB0aGlzIHNhbXBsZSwgd2UnbGwgdXNlIHRoZSBzYW1lIHRleHQgZm9yIHRoZSB0aWNrZXIgYW5kIHRoZSBleHBhbmRlZCBub3RpZmljYXRpb24KICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm90aWZpY2F0aW9uc19oYXBweV9tZXNzYWdlKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL19pbmRleC5odG1sCmluZGV4IGZmZjVjZTIuLjcxY2NiNTQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvX2luZGV4Lmh0bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9faW5kZXguaHRtbApAQCAtMSw1ICsxLDE4IEBACiAKLTxoMz5BY3Rpdml0eTwvaDM+Cis8cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgc2FtcGxlcyBmb3I6PC9wPgorPHVsPgorICA8bGk+PGEgaHJlZj0iI0FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0ZyYWdtZW50Ij5GcmFnbWVudDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0FjdGlvbkJhciI+QWN0aW9uIEJhcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0xvYWRlck1hbmFnZXIiPkxvYWRlck1hbmFnZXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNBbGFybSI+QWxhcm08L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNOb3RpZmljYXRpb24iPk5vdGlmaWNhdGlvbjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1NlYXJjaCI+U2VhcmNoPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjTWlzYyI+TWlzYzwvYT48L2xpPgorPC91bD4KKworCis8aDMgaWQ9IkFjdGl2aXR5Ij5BY3Rpdml0eTwvaDM+CiA8ZGw+CiAgIDxkdD48YSBocmVmPSJIZWxsb1dvcmxkLmh0bWwiPkhlbGxvIFdvcmxkPC9hPjwvZHQ+CiAgIDxkZD5EZW1vbnN0cmF0ZXMgYSBiYXNpYyBzY3JlZW4gYWN0aXZpdHkuCkBAIC0zNyw0NyArNTAsMTY2IEBACiAgIDxkdD48YSBocmVmPSJUcmFuc2x1Y2VudEJsdXJBY3Rpdml0eS5odG1sIj5UcmFuc2x1Y2VudEJsdXI8L2E+PC9kdD4KICAgPGRkPkRlbW9uc3RyYXRlcyBob3cgdG8gbWFrZSBhbiBhY3Rpdml0eSB3aXRoIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB3aXRoCiAgIGEgc3BlY2lhbCBlZmZlY3QgKGJsdXIpLiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJEaWFsb2dBY3Rpdml0eS5odG1sIj5EaWFsb2cgQWN0aXZpdHk8L2E+PC9kdD4KKyAgPGRkPkFuIEFjdGl2aXR5IHRoYXQgc2V0cyBpdHMgdGhlbWUgdG8gYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2cgc28gdGhhdAorICBpdCBsb29rcyBsaWtlIGEgRGlhbG9nLjwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9IkN1c3RvbVRpdGxlLmh0bWwiPkN1c3RvbSBUaXRsZTwvYT48L2R0PgorICA8ZGQ+QW4gQWN0aXZpdHkgdGhhdCBwbGFjZXMgYSBjdXN0b20gVUkgaW4gaXRzIHRpdGxlLjwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9IkFuaW1hdGlvbi5odG1sIj5BbmltYXRpb248L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGN1c3RvbSBhbmltYXRpb25zIHdoZW4gbW92aW5nIGJldHdlZW4gYWN0aXZpdGllcy4gPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iQWN0aXZpdHlSZWNyZWF0ZS5odG1sIj5BY3Rpdml0eSBSZWNyZWF0ZTwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGhvdyBhbiBBY3Rpdml0eSBjYW4gY2F1c2UgaXRzZWxmIHRvIGJlIHJlY3JlYXRlZC48L2RkPgorCisgIDxkdD48YSBocmVmPSJTY3JlZW5PcmllbnRhdGlvbi5odG1sIj5TY3JlZW4gT3JpZW50YXRpb248L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB0aGUgZGlmZmVyZW50IHNjcmVlbiBvcmllbnRhdGlvbnMgYW4gQWN0aXZpdHkgY2FuIHJlcXVlc3QuPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iU29mdElucHV0TW9kZXMuaHRtbCI+U29mdCBJbnB1dCBNb2RlczwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGhvdyBkaWZmZXJlbnQgc29mdCBpbnB1dCBtb2RlcyBzZXQgaW4gYW4gQWN0aXZpdHkncworICB3aW5kb3cgaW1wYWN0cyBob3cgaXQgYWRqdXN0cyB0byBhY2NvbW1vZGF0ZSBhbiBJTUUuPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iSW50ZW50QWN0aXZpdHlGbGFncy5odG1sIj5JbnRlbnQgQWN0aXZpdHkgRmxhZ3M8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB2YXJpb3VzIHVzZXMgb2YgSW50ZW50IGZsYWdzIHRvIG1vZGlmeSBhbiBhcHBsaWNhdGlvbgorICB0YXNrJ3MgYWN0aXZpdHkgc3RhY2sgaW4gY29tbW9uIHdheXMuPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iUmVvcmRlck9uTGF1bmNoLmh0bWwiPlJlb3JkZXIgb24gTGF1bmNoPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IHRoZSBhY3Rpdml0aWVzIGluIGEgdGFzayBjYW4gYmUgcmVvcmRlcmVkLiAgVUkgZmxvdworICBnb2VzIHRocm91Z2ggdGhlIGFjdGl2aXRpZXMgPGEgaHJlZj0iUmVvcmRlck9uTGF1bmNoLmh0bWwiPlJlb3JkZXJPbkxhdW5jaDwvYT4sCisgIDxhIGhyZWY9IlJlb3JkZXJUd28uaHRtbCI+UmVvcmRlclR3bzwvYT4sIDxhIGhyZWY9IlJlb3JkZXJUaHJlZS5odG1sIj5SZW9yZGVyVGhyZWU8L2E+LAorICBhbmQgPGEgaHJlZj0iUmVvcmRlckZvdXIuaHRtbCI+UmVvcmRlckZvdXI8L2E+LjwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9IldhbGxwYXBlckFjdGl2aXR5Lmh0bWwiPldhbGxwYXBlciBBY3Rpdml0eTwvYT48L2R0PgorICA8ZGQ+QW4gQWN0aXZpdHkgdGhhdCB1c2VzIGFuZHJvaWQ6c3R5bGUvVGhlbWUuV2FsbHBhcGVyIHRvIGJlIGRpc3BsYXllZAorICBvbiB0b3Agb2YgdGhlIHN5c3RlbSB3YWxscGFwZXIuPC9kZD4KIDwvZGw+CiAKLTxoMz5TZXJ2aWNlPC9oMz4KKzxoMyBpZD0iRnJhZ21lbnQiPkZyYWdtZW50PC9oMz4KIDxkbD4KLSAgPGR0PjxhIGhyZWY9IkxvY2FsU2VydmljZS5odG1sIj5Mb2NhbCBTZXJ2aWNlIENvbnRyb2xsZXIgYW5kCi0gICAgICAgIExvY2FsIFNlcnZpY2UgQmluZGluZzwvYT48L2R0PgorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnRBbGVydERpYWxvZy5odG1sIj5GcmFnbWVudCBBbGVydCBEaWFsb2c8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGEgRGlhbG9nRnJhZ21lbnQgdG8gc2hvdyBhbmQgbWFuYWdlIGFuCisgIEFsZXJ0RGlhbG9nLjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnRBcmd1bWVudHMuaHRtbCI+RnJhZ21lbnQgQXJndW1lbnRzPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IGEgZnJhZ21lbnQgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYXJndW1lbnRzLAorICBzdXBwbHlpbmcgdGhlbSBlaXRoZXIgYXMgYW4gYXJndW1lbnQgQnVuZGxlIGF0IHJ1bnRpbWUgb3IgWE1MIGF0dHJpYnV0ZXMKKyAgaW4gYSAmbHQ7ZnJhZ21lbnQ+IHRhZy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9IkZyYWdtZW50Q29udGV4dE1lbnUuaHRtbCI+RnJhZ21lbnQgQ29udGV4dCBNZW51PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IHRvIGRpc3BsYXkgYW5kIHJlc3BvbmQgdG8gYSBjb250ZXh0IG1lbnUgdGhhdCBpcworICBkaXNwbGF5IGZyb20gYSBmcmFnbWVudCdzIHZpZXcgaGllcmFyY2h5LjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnREaWFsb2cuaHRtbCI+RnJhZ21lbnQgRGlhbG9nPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgdXNlIG9mIERpYWxvZ0ZyYWdtZW50IHRvIHNob3cgdmFyaW91cyB0eXBlcyBvZiBkaWFsb2dzLjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5Lmh0bWwiPkZyYWdtZW50IERpYWxvZyBvciBBY3Rpdml0eTwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGhvdyB0aGUgc2FtZSBGcmFnbWVudCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHRoZSBVSQorICBmb3IgZWl0aGVyIGFuIEFjdGl2aXR5IG9yIERpYWxvZy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9IkZyYWdtZW50SGlkZVNob3cuaHRtbCI+RnJhZ21lbnQgSGlkZSBTaG93PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaGlkaW5nIGFuZCBzaG93aW5nIGZyYWdtZW50cy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9IkZyYWdtZW50TGF5b3V0Lmh0bWwiPkZyYWdtZW50IExheW91dDwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHVzZSBvZiB0aGUgJmx0O2ZyYWdtZW50Jmd0OyB0YWcgdG8gZW1iZWQgYSBGcmFnbWVudCBpbgorICBhbiBBY3Rpdml0eSdzIGNvbnRlbnQgdmlldyBsYXlvdXQsIGFuZCBtYWtpbmcgdGhlIGxheW91dCBjaGFuZ2UgYmFzZWQgb24KKyAgY29uZmlndXJhdGlvbiB0byBhY2hpZXZlIGRpZmZlcmVudCBVSSBmbG93cy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9IkZyYWdtZW50TGlzdEFycmF5Lmh0bWwiPkZyYWdtZW50IExpc3QgQXJyYXk8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB1c2Ugb2YgTGlzdEZyYWdtZW50IHRvIHNob3cgdGhlIGNvbnRlbnRzIG9mIGEgc2ltcGxlIEFycmF5QWRhcHRlci48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9IkZyYWdtZW50TWVudS5odG1sIj5GcmFnbWVudCBNZW51PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgcG9wdWxhdGluZyBjdXN0b20gbWVudSBpdGVtcyBmcm9tIGEgRnJhZ21lbnQuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJGcmFnbWVudFJlY2VpdmVSZXN1bHQuaHRtbCI+RnJhZ21lbnQgUmVjZWl2ZSBSZXN1bHQ8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBzdGFydGluZyBhIG5ldyBBY3Rpdml0eSBmcm9tIGEgRnJhZ21lbnQsIGFuZCByZWNlaXZpbmcKKyAgYSByZXN1bHQgYmFjayBmcm9tIGl0LjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnRSZXRhaW5JbnN0YW5jZS5odG1sIj5GcmFnbWVudCBSZXRhaW4gSW5zdGFuY2U8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBhIEZyYWdtZW50IGNhbiBiZSB1c2VkIHRvIGVhc2lseSByZXRhaW4gYWN0aXZlIHN0YXRlIGFjcm9zcworICBhbiBBY3Rpdml0eSdzIGNvbmZpZ3VyYXRpb24gY2hhbmdlLjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iRnJhZ21lbnRTdGFjay5odG1sIj5GcmFnbWVudCBTdGFjazwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGNyZWF0aW5nIGEgc3RhY2sgb2YgRnJhZ21lbnQgaW5zdGFuY2VzIHNpbWlsYXIgdG8gdGhlCisgIHRyYWRpdGlvbmFsIHN0YWNrIG9mIGFjdGl2aXRpZXMuPC9kZD4KKyAgCis8L2RsPgorCisKKzxoMyBpZD0iQWN0aW9uQmFyIj5BY3Rpb24gQmFyPC9oMz4KKzxkbD4KKyAgPGR0PjxhIGhyZWY9IkFjdGlvbkJhck1lY2hhbmljcy5odG1sIj5BY3Rpb24gQmFyIE1lY2hhbmljczwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHRoZSBiYXNpY3Mgb2YgdGhlIEFjdGlvbiBCYXIgYW5kIGhvdyBpdCBpbnRlcm9wZXJhdGVzIHdpdGggdGhlIHN0YW5kYXJkIG9wdGlvbnMKK21lbnUuIFRoaXMgZGVtbyBpcyBmb3IgaW5mb3JtYXRpdmUgcHVycG9zZXMgb25seTsgc2VlIFVzYWdlIGZvciBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZQorQWN0aW9uIEJhciBpbiBhIG1vcmUgaWRpb21hdGljIG1hbm5lci48L2RkPgorICA8ZHQ+PGEgaHJlZj0iQWN0aW9uQmFyVGFicy5odG1sIj5BY3Rpb24gQmFyIFRhYnM8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIEFjdGlvbiBCYXIgdGFicyBhbmQgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCBvdGhlciBhY3Rpb24gYmFyCitmZWF0dXJlcy48L2RkPgorICA8ZHQ+PGEgaHJlZj0iQWN0aW9uQmFyVXNhZ2UuaHRtbCI+QWN0aW9uIEJhciBVc2FnZTwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGltcGxlIHVzYWdlIG9mIHRoZSBBY3Rpb24gQmFyLCBpbmNsdWRpbmcgYSBTZWFyY2hWaWV3IGFzIGFuIGFjdGlvbiBpdGVtLiBUaGUKK2RlZmF1bHQgSG9uZXljb21iIHRoZW1lIGluY2x1ZGVzIHRoZSBBY3Rpb24gQmFyIGJ5IGRlZmF1bHQgYW5kIGEgbWVudSByZXNvdXJjZSBpcyB1c2VkIHRvIHBvcHVsYXRlCit0aGUgbWVudSBkYXRhIGl0c2VsZi4gSWYgeW91J2QgbGlrZSB0byBzZWUgaG93IHRoZXNlIHRoaW5ncyB3b3JrIHVuZGVyIHRoZSBob29kLCBzZWUKK01lY2hhbmljcy48L2RkPgorICA8ZHQ+PGEgaHJlZj0iQWN0aW9uQmFyRGlzcGxheU9wdGlvbnMuaHRtbCI+RGlzcGxheSBPcHRpb25zPC9hPjwvZHQ+CisgIDxkZD5TaG93cyBob3cgdmFyaW91cyBBY3Rpb24gQmFyIGRpc3BsYXkgb3B0aW9uIGZsYWdzIGNhbiBiZSBjb21iaW5lZCBhbmQgdGhlaXIgZWZmZWN0cy48L2RkPgorPC9kbD4KKworCis8aDMgaWQ9IkxvYWRlck1hbmFnZXIiPkxvYWRlck1hbmFnZXI8L2gzPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iTG9hZGVyQ3Vyc29yLmh0bWwiPkxvYWRlciBDdXJzb3I8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB1c2Ugb2YgTG9hZGVyTWFuYWdlciB0byBwZXJmb3JtIGEgcXVlcnkgZm9yIGEgQ3Vyc29yIHRoYXQKKyAgcG9wdWxhdGVzIGEgTGlzdEZyYWdtZW50LjwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9IkxvYWRlclRocm90dGxlLmh0bWwiPkxvYWRlciBUaHJvdHRsZTwvYT48L2R0PgorICA8ZGQ+Q29tcGxldGUgZW5kLXRvLWVuZCBkZW1vbnN0cmF0aW9uIG9mIGEgc2ltcGxlIGNvbnRlbnQgcHJvdmlkZXIgdGhhdAorICBwb3B1bGF0ZXMgZGF0YSBpbiBhIGxpc3QgdGhyb3VnaCBhIGN1cnNvciBsb2FkZXIuICBUaGUgVUkgYWxsb3dzIHRoZSBsaXN0CisgIHRvIGJlIHBvcHVsYXRlZCB3aXRoIGEgc2VyaWVzIG9mIGl0ZW1zLCBzaG93aW5nIGhvdyBBc3luY1Rhc2tMb2FkZXIncworICB0aHJvdHRsaW5nIGZhY2lsaXR5IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgaG93IG11Y2ggYSBMb2FkZXIgaXMgcmVmcmVzaGVkCisgIGluIHRoaXMgY2FzZS48L2RkPgorPC9kbD4KKyAgCis8aDMgaWQ9IlNlcnZpY2UiPlNlcnZpY2U8L2gzPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iTG9jYWxTZXJ2aWNlLmh0bWwiPkxvY2FsIFNlcnZpY2U8L2E+PC9kdD4KICAgPGRkPkRlbW9uc3RyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UgdGhhdCBydW5zIGluIHRoZSBzYW1lCiAgIHByb2Nlc3MgYXMgaXRzIGNsaWVudChzKS4gIFNob3dzIGhvdyB0aG9zZSBjbGllbnRzIGNhbiBlaXRoZXIgc3RhcnQvc3RvcCBpdAotICB3aXRoIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UKLSAgQ29udGV4dC5zdGFydFNlcnZpY2V9IGFuZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RvcFNlcnZpY2UKLSAgQ29udGV4dC5zdG9wU2VydmljZX0sIG9yIGJpbmQgYW5kIGNhbGwgaXQgd2l0aAotICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UgQ29udGV4dC5iaW5kU2VydmljZX0gYW5kCi0gIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCN1bmJpbmRTZXJ2aWNlIENvbnRleHQudW5pbmRTZXJ2aWNlfS4KKyAgd2l0aCBDb250ZXh0LnN0YXJ0U2VydmljZSBhbmQgQ29udGV4dC5zdG9wU2VydmljZSwgb3IgYmluZCBhbmQgY2FsbCBpdCB3aXRoCisgIENvbnRleHQuYmluZFNlcnZpY2UgYW5kIENvbnRleHQudW5pbmRTZXJ2aWNlLgogICBUaGlzIGFsc28gc2hvd3MgaG93IHlvdSBjYW4gc2ltcGxpZnkgd29ya2luZwotICB3aXRoIGEgc2VydmljZSB3aGVuIHlvdSBrbm93IGl0IHdpbGwgb25seSBydW4gaW4geW91ciBvd24gcHJvY2Vzcy48L2RkPgorICB3aXRoIGEgc2VydmljZSB3aGVuIHlvdSBrbm93IGl0IHdpbGwgb25seSBydW4gaW4geW91ciBvd24gcHJvY2Vzcy4gIFRoZSBjbGllbnQKKyAgY29kZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmljZSBpcyBpbgorICA8YSBocmVmPSJMb2NhbFNlcnZpY2VBY3Rpdml0aWVzLmh0bWwiPkxvY2FsIFNlcnZpY2UgQWN0aXZpdGllczwvYT4uPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJNZXNzZW5nZXJTZXJ2aWNlLmh0bWwiPk1lc3NlbmdlciBTZXJ2aWNlPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYmluZGluZyB0byBhIFNlcnZpY2Ugd2hvc2UgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIHdpdGgKKyAgdGhlIE1lc3NlbmdlciBjbGFzcy4gIFRoaXMgaXMgb2Z0ZW4gYW4gZWFzaWVyIHdheSB0byBkbyByZW1vdGUgY29tbXVuaWNhdGlvbgorICB3aXRoIGEgU2VydmljZSB0aGFuIHVzaW5nIGEgcmF3IEFJREwgaW50ZXJmYWNlLiAgVGhlIGNsaWVudAorICBjb2RlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBzZXJ2aWNlIGlzIGluCisgIDxhIGhyZWY9Ik1lc3NlbmdlclNlcnZpY2VBY3Rpdml0aWVzLmh0bWwiPk1lc3NlbmdlciBTZXJ2aWNlIEFjdGl2aXRpZXM8L2E+LjwvZGQ+CiAgIAogICA8ZHQ+PGEgaHJlZj0iUmVtb3RlU2VydmljZS5odG1sIj5SZW1vdGUgU2VydmljZSBDb250cm9sbGVyIGFuZAogICAgICAgICBSZW1vdmUgU2VydmljZSBCaW5kaW5nPC9hPjwvZHQ+CiAgIDxkZD5EZW1vbnN0cmF0ZXMgc3RhcnRpbmcgYSBzZXJ2aWNlIGluIGEgc2VwYXJhdGUgcHJvY2VzcywgYnkgYXNzaWduaW5nCiAgIDxjb2RlPmFuZHJvaWQ6cHJvY2Vzcz0mcXVvdDs6cmVtb3RlJnF1b3Q7PC9jb2RlPiB0byB0aGUgc2VydmljZSBpbiB0aGUKICAgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlLiAgU2hvd3MgaG93IHRob3NlIGNsaWVudHMgY2FuIGVpdGhlciBzdGFydC9zdG9wIGl0Ci0gIHdpdGgge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZQotICBDb250ZXh0LnN0YXJ0U2VydmljZX0gYW5kIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdG9wU2VydmljZQotICBDb250ZXh0LnN0b3BTZXJ2aWNlfSwgb3IgYmluZCBhbmQgY2FsbCBpdCB3aXRoCi0gIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNiaW5kU2VydmljZSBDb250ZXh0LmJpbmRTZXJ2aWNlfSBhbmQKLSAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3VuYmluZFNlcnZpY2UgQ29udGV4dC51bmluZFNlcnZpY2V9LgorICB3aXRoIENvbnRleHQuc3RhcnRTZXJ2aWNlIGFuZCBDb250ZXh0LnN0b3BTZXJ2aWNlLCBvciBiaW5kIGFuZCBjYWxsIGl0IHdpdGgKKyAgQ29udGV4dC5iaW5kU2VydmljZSBhbmQgQ29udGV4dC51bmluZFNlcnZpY2UuCiAgIEJpbmRpbmcgaXMgc2ltaWxhciB0byB0aGUgbG9jYWwgc2VydmljZSBzYW1wbGUsCiAgIGJ1dCBpbGx1c3RyYXRlcyB0aGUgYWRkaXRpb25hbCB3b3JrIChkZWZpbmluZyBhaWRsCiAgIGludGVyZmFjZXMpIG5lZWRlZCB0byBpbnRlcmFjdCB3aXRoIGEgc2VydmljZSBpbiBhbm90aGVyIHByb2Nlc3MuICBBbHNvCiAgIHNob3dzIGhvdyBhIHNlcnZpY2UgY2FuIHB1Ymxpc2ggbXVsdGlwbGUgaW50ZXJmYWNlcyBhbmQgaW1wbGVtZW50CiAgIGNhbGxiYWNrcyB0byBpdHMgY2xpZW50cy48L2RkPgogCi0gIDxkdD48YSBocmVmPSJTZXJ2aWNlU3RhcnRBcmd1bWVudHMuaHRtbCI+U2VydmljZSBTdGFydCBBcmd1bWVudHMgQ29udHJvbGxlcjwvYT48L2R0PgorICA8ZHQ+PGEgaHJlZj0iU2VydmljZVN0YXJ0QXJndW1lbnRzLmh0bWwiPlNlcnZpY2UgU3RhcnQgQXJndW1lbnRzPC9hPjwvZHQ+CiAgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IHlvdSBjYW4gdXNlIGEgU2VydmljZSBhcyBhIGpvYiBxdWV1ZSwgd2hlcmUgeW91IAotICBzdWJtaXQgam9icyB0byBpdCB3aXRoIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UKLSAgQ29udGV4dC5zdGFydFNlcnZpY2V9IGluc3RlYWQgb2YgYmluZGluZyB0byB0aGUgc2VydmljZS4gIFN1Y2ggYSBzZXJ2aWNlCisgIHN1Ym1pdCBqb2JzIHRvIGl0IHdpdGggQ29udGV4dC5zdGFydFNlcnZpY2UgaW5zdGVhZCBvZiBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlLiAgU3VjaCBhIHNlcnZpY2UKICAgYXV0b21hdGljYWxseSBzdG9wcyBpdHNlbGYgb25jZSBhbGwgam9icyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcyBjYW4gYmUKICAgYSB2ZXJ5IGNvbnZlbmllbnQgd2F5IHRvIGludGVyYWN0IHdpdGggYSBzZXJ2aWNlIHdoZW4geW91IGRvIG5vdCBuZWVkCiAgIGEgcmVzdWx0IGJhY2sgZnJvbSBpdC48L2RkPgogICAKLSAgPGR0PjxhIGhyZWY9IkZvcmVncm91bmRTZXJ2aWNlLmh0bWwiPkZvcmVncm91bmQgU2VydmljZSBDb250cm9sbGVyPC9hPjwvZHQ+CisgIDxkdD48YSBocmVmPSJGb3JlZ3JvdW5kU2VydmljZS5odG1sIj5Gb3JlZ3JvdW5kIFNlcnZpY2U8L2E+PC9kdD4KICAgPGRkPlNob3dzIGhvdyB5b3UKICAgY2FuIHdyaXRlIGEgU2VydmljZSB0aGF0IHJ1bnMgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvcmtzIG9uIGJvdGggcHJlLTIuMAogICBhbmQgcG9zdC0yLjAgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtLiAgVGhpcyBleGFtcGxlIHdpbGwgc2VsZWN0aXZlbHkgdXNlCkBAIC04Niw3ICsyMTgsNyBAQAogCiA8L2RsPgogCi08aDM+QWxhcm08L2gzPgorPGgzIGlkPSJBbGFybSI+QWxhcm08L2gzPgogPGRsPgogICA8ZHQ+PGEgaHJlZj0iQWxhcm1Db250cm9sbGVyLmh0bWwiPkFsYXJtIENvbnRyb2xsZXI8L2E+PC9kdD4KICAgPGRkPkRlbW9uc3RyYXRlcyB0d28gd2F5cyB5b3UgY2FuIHNjaGVkdWxlIGFsYXJtczogYSBvbmUtc2hvdCBhbGFybSB0aGF0CkBAIC0xMTksMTYgKzI1MSwyMCBAQAogICA8L2RkPgogPC9kbD4KIAotPGgzPk5vdGlmaWNhdGlvbjwvaDM+Cis8aDMgaWQ9Ik5vdGlmaWNhdGlvbiI+Tm90aWZpY2F0aW9uPC9oMz4KIDxkbD4KICAgPGR0PjxhIGhyZWY9Ik5vdGlmeVdpdGhUZXh0Lmh0bWwiPk5vdGlmeVdpdGhUZXh0PC9hPjwvZHQ+CiAgIDxkZD5EZW1vbnN0cmF0ZXMgcG9wdXAgbm90aWZpY2F0aW9ucyBvZiB2YXJ5aW5nIGxlbmd0aC48L2RkPgogCiAgIDxkdD48YSBocmVmPSJJbmNvbWluZ01lc3NhZ2UuaHRtbCI+SW5jb21pbmdNZXNzYWdlPC9hPjwvZHQ+CiAgIDxkZD4gRGVtb25zdHJhdGVzIHNlbmRpbmcgcGVyc2lzdGVudCBhbmQgdHJhbnNpZW50IG5vdGlmaWNhdGlvbnMsIHdpdGggYSBWaWV3IG9iamVjdCBpbiB0aGUgbm90aWZpY2F0aW9uLiBJdCBhbHNvIGRlbW9uc3RyYXRlZCBpbmZsYXRpbmcgYSBWaWV3IG9iamVjdCBmcm9tIGFuIFhNTCBsYXlvdXQgcmVzb3VyY2UuIDwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9IlN0YXR1c0Jhck5vdGlmaWNhdGlvbnMuaHRtbCI+U3RhdHVzIEJhciBOb3RpZmljYXRpb25zPC9hPjwvZHQ+CisgIDxkZD4gRGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgbm90aWZpY2F0aW9ucyB0aGF0IGNhbiBiZSBwb3N0ZWQgaW4KKyAgdGhlIHN0YXR1cyBiYXIsIGFuZCBhIHN0YW5kYXJkIHdheSBmb3IgaGFuZGxpbmcgdGhlbS48L2RkPgogPC9kbD4KIAotPGgzPlNlYXJjaDwvaDM+Cis8aDMgaWQ9IlNlYXJjaCI+U2VhcmNoPC9oMz4KIDxkbD4KICAgPGR0PjxhIGhyZWY9IlNlYXJjaEludm9rZS5odG1sIj5TZWFyY2hJbnZva2U8L2E+PC9kdD4KICAgPGRkPkRlbW9uc3RyYXRlcyB2YXJpb3VzIHdheXMgaW4gd2hpY2ggYWN0aXZpdGllcyBjYW4gbGF1bmNoIHRoZSBTZWFyY2ggVUkuPC9kZD4KQEAgLTE0MSwzICsyNzcsMTIgQEAKIDwvZGw+CiAKIAorPGgzIGlkPSJNaXNjIj5NaXNjPC9oMz4KKzxkbD4KKyAgPGR0PjxhIGhyZWY9IkFsZXJ0RGlhbG9nU2FtcGxlcy5odG1sIj5BbGVydCBEaWFsb2cgU2FtcGxlczwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHZhcmlvdXMgc3R5bGVzIG9mIGFsZXJ0IGRpYWxvZ3MuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJEZXZpY2VBZG1pblNhbXBsZS5odG1sIj5EZXZpY2UgQWRtaW4gU2FtcGxlPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0aW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbXBsZSBkZXZpY2UgYWRtaW5pc3RyYXRvcgorICBhbmQgaXRzIHVzZSBvZiB0aGUgRGV2aWNlUG9saWN5TWFuYWdlci48L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L0NsaXBib2FyZFNhbXBsZS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2NvbnRlbnQvQ2xpcGJvYXJkU2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ODkwMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L0NsaXBib2FyZFNhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmNvbnRlbnQ7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgQ2xpcGJvYXJkU2FtcGxlIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIENsaXBib2FyZE1hbmFnZXIgbUNsaXBib2FyZDsKKworICAgIFNwaW5uZXIgbVNwaW5uZXI7CisgICAgVGV4dFZpZXcgbU1pbWVUeXBlczsKKyAgICBFZGl0VGV4dCBtRWRpdFRleHQ7CisKKyAgICBDaGFyU2VxdWVuY2UgbVN0eWxlZFRleHQ7CisgICAgU3RyaW5nIG1QbGFpblRleHQ7CisKKyAgICBDbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbVByaW1hcnlDaGFuZ2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNsaXBEYXRhKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1DbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAvLyBTZWUgcmVzL2FueS9sYXlvdXQvcmVzb3VyY2VzLnhtbCBmb3IgdGhpcyB2aWV3IGxheW91dCBkZWZpbml0aW9uLgorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jbGlwYm9hcmQpOworCisgICAgICAgIFRleHRWaWV3IHR2OworCisgICAgICAgIG1TdHlsZWRUZXh0ID0gZ2V0VGV4dChSLnN0cmluZy5zdHlsZWRfdGV4dCk7CisgICAgICAgIHR2ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0eWxlZF90ZXh0KTsKKyAgICAgICAgdHYuc2V0VGV4dChtU3R5bGVkVGV4dCk7CisKKyAgICAgICAgbVBsYWluVGV4dCA9IG1TdHlsZWRUZXh0LnRvU3RyaW5nKCk7CisgICAgICAgIHR2ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnBsYWluX3RleHQpOworICAgICAgICB0di5zZXRUZXh0KG1QbGFpblRleHQpOworCisgICAgICAgIG1TcGlubmVyID0gKFNwaW5uZXIpIGZpbmRWaWV3QnlJZChSLmlkLmNsaXBfdHlwZSk7CisgICAgICAgIEFycmF5QWRhcHRlcjxDaGFyU2VxdWVuY2U+IGFkYXB0ZXIgPSBBcnJheUFkYXB0ZXIuY3JlYXRlRnJvbVJlc291cmNlKAorICAgICAgICAgICAgICAgIHRoaXMsIFIuYXJyYXkuY2xpcF9kYXRhX3R5cGVzLCBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0pOworICAgICAgICBhZGFwdGVyLnNldERyb3BEb3duVmlld1Jlc291cmNlKGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX3NwaW5uZXJfZHJvcGRvd25faXRlbSk7CisgICAgICAgIG1TcGlubmVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIG1TcGlubmVyLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbmV3IE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIG1NaW1lVHlwZXMgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY2xpcF9taW1lX3R5cGVzKTsKKyAgICAgICAgbUVkaXRUZXh0ID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLmNsaXBfdGV4dCk7CisKKyAgICAgICAgbUNsaXBib2FyZC5hZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihtUHJpbWFyeUNoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgdXBkYXRlQ2xpcERhdGEoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBtQ2xpcGJvYXJkLnJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKG1QcmltYXJ5Q2hhbmdlTGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhc3RlU3R5bGVkVGV4dChWaWV3IGJ1dHRvbikgeworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dCgiU3R5bGVkIFRleHQiLCBtU3R5bGVkVGV4dCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhc3RlUGxhaW5UZXh0KFZpZXcgYnV0dG9uKSB7CisgICAgICAgIG1DbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KCJTdHlsZWQgVGV4dCIsIG1QbGFpblRleHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXN0ZUludGVudChWaWV3IGJ1dHRvbikgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcsIFVyaS5wYXJzZSgiaHR0cDovL3d3dy5hbmRyb2lkLmNvbS8iKSk7CisgICAgICAgIG1DbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3SW50ZW50KCJWSUVXIGludGVudCIsIGludGVudCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhc3RlVXJpKFZpZXcgYnV0dG9uKSB7CisgICAgICAgIG1DbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UmF3VXJpKCJVUkkiLCBVcmkucGFyc2UoImh0dHA6Ly93d3cuYW5kcm9pZC5jb20vIikpKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUNsaXBEYXRhKCkgeworICAgICAgICBDbGlwRGF0YSBjbGlwID0gbUNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBTdHJpbmdbXSBtaW1lVHlwZXMgPSBjbGlwICE9IG51bGwgPyBjbGlwLmdldERlc2NyaXB0aW9uKCkuZmlsdGVyTWltZVR5cGVzKCIqLyoiKSA6IG51bGw7CisgICAgICAgIG1NaW1lVHlwZXMuc2V0VGV4dCgiIik7CisgICAgICAgIGlmIChtaW1lVHlwZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG1NaW1lVHlwZXMuYXBwZW5kKG1pbWVUeXBlc1tpXSk7CisgICAgICAgICAgICAgICAgbU1pbWVUeXBlcy5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaXAgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDApOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoIiIpOworICAgICAgICB9IGVsc2UgaWYgKGNsaXAuZ2V0SXRlbUF0KDApLmdldFRleHQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3Bpbm5lci5zZXRTZWxlY3Rpb24oMSk7CisgICAgICAgICAgICBtRWRpdFRleHQuc2V0VGV4dChjbGlwLmdldEl0ZW1BdCgwKS5nZXRUZXh0KCkpOworICAgICAgICB9IGVsc2UgaWYgKGNsaXAuZ2V0SXRlbUF0KDApLmdldEludGVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbigyKTsKKyAgICAgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KGNsaXAuZ2V0SXRlbUF0KDApLmdldEludGVudCgpLnRvVXJpKDApKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGlwLmdldEl0ZW1BdCgwKS5nZXRVcmkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3Bpbm5lci5zZXRTZWxlY3Rpb24oMyk7CisgICAgICAgICAgICBtRWRpdFRleHQuc2V0VGV4dChjbGlwLmdldEl0ZW1BdCgwKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbigwKTsKKyAgICAgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KCJDbGlwIGNvbnRhaW5pbmcgbm8gZGF0YSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2NvbnRlbnQvUmVzb3VyY2VzU2FtcGxlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQppbmRleCBmMzhiZTBmLi5kNDZhODUxIDEwMDc1NQotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YQpAQCAtMzgsMTEgKzM4LDkgQEAKICAqIEBzZWUgU3R5bGVkVGV4dCBmb3IgbW9yZSBkZXB0aCBhYm91dCB1c2luZyBzdHlsZWQgdGV4dCwgYm90aCB3aXRoIGdldFN0cmluZygpCiAgKiAgICAgICAgICAgICAgICAgYW5kIGluIHRoZSBsYXlvdXQgeG1sIGZpbGVzLgogICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VzU2FtcGxlIGV4dGVuZHMgQWN0aXZpdHkKLXsKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNTYW1wbGUgZXh0ZW5kcyBBY3Rpdml0eSB7CiAgICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKLSAgICB7CisJcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIC8vIFNlZSByZXMvYW55L2xheW91dC9yZXNvdXJjZXMueG1sIGZvciB0aGlzIHZpZXcgbGF5b3V0IGRlZmluaXRpb24uCkBAIC01NCw4ICs1Miw4IEBACiAKICAgICAgICAgLy8gPT09PT09IFVzaW5nIHRoZSBDb250ZXh0LmdldFN0cmluZygpIGNvbnZlbmllbmNlIG1ldGhvZCA9PT09PT09PT09PQogCi0gICAgICAgIC8vIFVzaW5nIHRoZSBnZXRTdHJpbmcoKSBjb25ldmVuaWVuY2UgbWV0aG9kLCByZXRyaWV2ZSBhIHN0cmluZwotICAgICAgICAvLyByZXNvdXJjZSB0aGF0IGhhcGVwbnMgdG8gaGF2ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhlIHVzZSBvZgorICAgICAgICAvLyBVc2luZyB0aGUgZ2V0U3RyaW5nKCkgY29udmVuaWVuY2UgbWV0aG9kLCByZXRyaWV2ZSBhIHN0cmluZworICAgICAgICAvLyByZXNvdXJjZSB0aGF0IGhhcHBlbnMgdG8gaGF2ZSBzdHlsZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhlIHVzZSBvZgogICAgICAgICAvLyBDaGFyU2VxdWVuY2UgaW5zdGVhZCBvZiBTdHJpbmcgc28gd2UgZG9uJ3QgbG9zZSB0aGUgc3R5bGUgaW5mby4KICAgICAgICAgY3MgPSBnZXRUZXh0KFIuc3RyaW5nLnN0eWxlZF90ZXh0KTsKICAgICAgICAgdHYgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3R5bGVkX3RleHQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2NvbnRlbnQvUmVzb3VyY2VzV2lkdGhBbmRIZWlnaHQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L1Jlc291cmNlc1dpZHRoQW5kSGVpZ2h0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NGU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L1Jlc291cmNlc1dpZHRoQW5kSGVpZ2h0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmNvbnRlbnQ7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzV2lkdGhBbmRIZWlnaHQgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIFRoaXMgbGF5b3V0IHVzZXMgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIHRvIGFkanVzdAorICAgICAgICAvLyB3aGF0IGlzIHNob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yZXNvdXJjZXNfd2lkdGhfYW5kX2hlaWdodCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL0ZpbmdlclBhaW50LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvRmluZ2VyUGFpbnQuamF2YQppbmRleCBmY2ZkMjhmLi4zMjFlYjA4IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvRmluZ2VyUGFpbnQuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvRmluZ2VyUGFpbnQuamF2YQpAQCAtNjgsOCArNjgsNiBAQAogICAgICAgICBwdWJsaWMgTXlWaWV3KENvbnRleHQgYykgewogICAgICAgICAgICAgc3VwZXIoYyk7CiAKLSAgICAgICAgICAgIG1CaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKDMyMCwgNDgwLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgICAgICBtQ2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKICAgICAgICAgICAgIG1QYXRoID0gbmV3IFBhdGgoKTsKICAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludChQYWludC5ESVRIRVJfRkxBRyk7CiAgICAgICAgIH0KQEAgLTc3LDYgKzc1LDggQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CisgICAgICAgICAgICBtQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3LCBoLCBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICBtQ2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL1RyaWFuZ2xlQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9ncmFwaGljcy9UcmlhbmdsZUFjdGl2aXR5LmphdmEKaW5kZXggN2Q3Y2Q0YS4uZjY3ODMyNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL1RyaWFuZ2xlQWN0aXZpdHkuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvZ3JhcGhpY3MvVHJpYW5nbGVBY3Rpdml0eS5qYXZhCkBAIC0yNiw4ICsyNiwxMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgbUdMVmlldyA9IG5ldyBHTFN1cmZhY2VWaWV3KHRoaXMpOwotICAgICAgICBtR0xWaWV3LnNldEVHTENvbmZpZ0Nob29zZXIoZmFsc2UpOwogICAgICAgICBtR0xWaWV3LnNldFJlbmRlcmVyKG5ldyBTdGF0aWNUcmlhbmdsZVJlbmRlcmVyKHRoaXMpKTsKKyAgICAgICAgLypJbWFnZVZpZXcgaW1hZ2VWaWV3ID0gbmV3IEltYWdlVmlldyh0aGlzKTsKKyAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlUmVzb3VyY2UoUi5yYXcucm9ib3QpOworICAgICAgICBzZXRDb250ZW50VmlldyhpbWFnZVZpZXcpOyovCiAgICAgICAgIHNldENvbnRlbnRWaWV3KG1HTFZpZXcpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL25mYy9Gb3JlZ3JvdW5kRGlzcGF0Y2guamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9uZmMvRm9yZWdyb3VuZERpc3BhdGNoLmphdmEKaW5kZXggZjI5YzI2OC4uM2ZlZmUwZiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL25mYy9Gb3JlZ3JvdW5kRGlzcGF0Y2guamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvbmZjL0ZvcmVncm91bmREaXNwYXRjaC5qYXZhCkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtQWRhcHRlci5kaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoKHRoaXMpOworICAgICAgICAvL21BZGFwdGVyLmRpc2FibGVGb3JlZ3JvdW5kRGlzcGF0Y2godGhpcyk7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvblBhdXNlIG5vdCBpbXBsZW1lbnRlZCB0byBmaXggYnVpbGQiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9BZHZhbmNlZFByZWZlcmVuY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyOGIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5PblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuQ2hlY2tCb3hQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisvKioKKyAqIEV4YW1wbGUgdGhhdCBzaG93cyBmaW5kaW5nIGEgcHJlZmVyZW5jZSBmcm9tIHRoZSBoaWVyYXJjaHkgYW5kIGEgY3VzdG9tIHByZWZlcmVuY2UgdHlwZS4KKyAqLworcHVibGljIGNsYXNzIEFkdmFuY2VkUHJlZmVyZW5jZXMgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgaW1wbGVtZW50cyBPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01ZX1BSRUZFUkVOQ0UgPSAibXlfcHJlZmVyZW5jZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FEVkFOQ0VEX0NIRUNLQk9YX1BSRUZFUkVOQ0UgPSAiYWR2YW5jZWRfY2hlY2tib3hfcHJlZmVyZW5jZSI7CisKKyAgICBwcml2YXRlIENoZWNrQm94UHJlZmVyZW5jZSBtQ2hlY2tCb3hQcmVmZXJlbmNlOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgY29udHJvbGxpbmcgYSBwcmVmZXJlbmNlIGZyb20gY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bm5hYmxlIG1Gb3JjZUNoZWNrQm94UnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tCb3hQcmVmZXJlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tCb3hQcmVmZXJlbmNlLnNldENoZWNrZWQoIW1DaGVja0JveFByZWZlcmVuY2UuaXNDaGVja2VkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3JjZSB0b2dnbGUgYWdhaW4gaW4gYSBzZWNvbmQKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKHRoaXMsIDEwMDApOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBMb2FkIHRoZSBYTUwgcHJlZmVyZW5jZXMgZmlsZQorICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5hZHZhbmNlZF9wcmVmZXJlbmNlcyk7CisKKyAgICAgICAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBjaGVja2JveCBwcmVmZXJlbmNlCisgICAgICAgIG1DaGVja0JveFByZWZlcmVuY2UgPSAoQ2hlY2tCb3hQcmVmZXJlbmNlKWdldFByZWZlcmVuY2VTY3JlZW4oKS5maW5kUHJlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICBLRVlfQURWQU5DRURfQ0hFQ0tCT1hfUFJFRkVSRU5DRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIGZvcmNlIHRvZ2dsZQorICAgICAgICBtRm9yY2VDaGVja0JveFJ1bm5hYmxlLnJ1bigpOworCisgICAgICAgIC8vIFNldCB1cCBhIGxpc3RlbmVyIHdoZW5ldmVyIGEga2V5IGNoYW5nZXMKKyAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmdldFNoYXJlZFByZWZlcmVuY2VzKCkucmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisKKyAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgbGlzdGVuZXIgd2hlbmV2ZXIgYSBrZXkgY2hhbmdlcworICAgICAgICBnZXRQcmVmZXJlbmNlU2NyZWVuKCkuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoKS51bnJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1Gb3JjZUNoZWNrQm94UnVubmFibGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZWQoU2hhcmVkUHJlZmVyZW5jZXMgc2hhcmVkUHJlZmVyZW5jZXMsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgLy8gTGV0J3MgZG8gc29tZXRoaW5nIHdoZW4gbXkgY291bnRlciBwcmVmZXJlbmNlIHZhbHVlIGNoYW5nZXMKKyAgICAgICAgaWYgKGtleS5lcXVhbHMoS0VZX01ZX1BSRUZFUkVOQ0UpKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCAiVGhhbmtzISBZb3UgaW5jcmVhc2VkIG15IGNvdW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBzaGFyZWRQcmVmZXJlbmNlcy5nZXRJbnQoa2V5LCAwKSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0RlZmF1bHRWYWx1ZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0RlZmF1bHRWYWx1ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNmNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRGVmYXVsdFZhbHVlcy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLkFwaURlbW9zQXBwbGljYXRpb247CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIHNldHRpbmdzIHNjcmVlbiB0aGF0IGhhcyBkZWZhdWx0CisgKiB2YWx1ZXMuCisgKiA8cD4KKyAqIEluIG9yZGVyIGZvciB0aGUgZGVmYXVsdCB2YWx1ZXMgdG8gYmUgcG9wdWxhdGVkIGludG8gdGhlCisgKiB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IChmcm9tIHRoZSBwcmVmZXJlbmNlcyBYTUwgZmlsZSksIHRoZSBjbGllbnQgbXVzdAorICogY2FsbAorICoge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyI3NldERlZmF1bHRWYWx1ZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYm9vbGVhbil9LgorICogPHA+CisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZWFybHksIHR5cGljYWxseSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBmaXJzdCBjcmVhdGVkLgorICogVGhpcyBlbnN1cmVzIGFueSBvZiB0aGUgYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzLCBzZXJ2aWNlcywgZXRjLiB3aWxsIGhhdmUKKyAqIHRoZSBkZWZhdWx0IHZhbHVlcyBwcmVzZW50LCBldmVuIGlmIHRoZSB1c2VyIGhhcyBub3Qgd2FuZGVyZWQgaW50byB0aGUKKyAqIGFwcGxpY2F0aW9uJ3Mgc2V0dGluZ3MuIEZvciBBcGlEZW1vcywgdGhpcyBpcyB7QGxpbmsgQXBpRGVtb3NBcHBsaWNhdGlvbn0sCisgKiBhbmQgeW91IGNhbiBmaW5kIHRoZSBjYWxsIHRvCisgKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjc2V0RGVmYXVsdFZhbHVlcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBib29sZWFuKX0KKyAqIGluIGl0cyB7QGxpbmsgQXBpRGVtb3NBcHBsaWNhdGlvbiNvbkNyZWF0ZSgpIG9uQ3JlYXRlfS4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZXMgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLmRlZmF1bHRfdmFsdWVzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTljNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRnJhZ21lbnRQcmVmZXJlbmNlcy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgUHJlZmVyZW5jZUZyYWdtZW50LCBzaG93aW5nIGEgc2luZ2xlIGZyYWdtZW50IGluIGFuCisgKiBhY3Rpdml0eS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50UHJlZmVyZW5jZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gRGlzcGxheSB0aGUgZnJhZ21lbnQgYXMgdGhlIG1haW4gY29udGVudC4KKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpLnJlcGxhY2UoYW5kcm9pZC5SLmlkLmNvbnRlbnQsCisgICAgICAgICAgICAgICAgbmV3IFByZWZzRnJhZ21lbnQoKSkuY29tbWl0KCk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoZnJhZ21lbnQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmc0ZyYWdtZW50IGV4dGVuZHMgUHJlZmVyZW5jZUZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKKyAgICAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VzKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZnJhZ21lbnQpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9MYXVuY2hpbmdQcmVmZXJlbmNlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY0NzdiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zOworCisvKioKKyAqIERlbW9uc3RyYXRlcyBsYXVuY2hpbmcgYSBQcmVmZXJlbmNlQWN0aXZpdHkgYW5kIGdyYWJiaW5nIGEgdmFsdWUgaXQgc2F2ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXVuY2hpbmdQcmVmZXJlbmNlcyBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0NPREVfUFJFRkVSRU5DRVMgPSAxOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQ291bnRlclRleHQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyB3ZXJlIG15IGFwcCdzIG1haW4gYWN0aXZpdHksIEkgd291bGQgbG9hZCB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgICogc28gdGhleSdyZSBzZXQgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdCBnbyBpbnRvIHRoZSBwcmVmZXJlbmNlcworICAgICAgICAgKiBzY3JlZW4uIEFub3RoZXIgZ29vZCBwbGFjZSB0byBjYWxsIHRoaXMgbWV0aG9kIHdvdWxkIGJlIGZyb20gYQorICAgICAgICAgKiBzdWJjbGFzcyBvZiBBcHBsaWNhdGlvbiwgc28geW91ciBkZWZhdWx0IHZhbHVlcyB3b3VsZCBiZSBsb2FkZWQKKyAgICAgICAgICogcmVnYXJkbGVzcyBvZiBlbnRyeSBpbnRvIHlvdXIgYXBwbGljYXRpb24gKGZvciBleGFtcGxlLCBhIHNlcnZpY2Ugb3IKKyAgICAgICAgICogYWN0aXZpdHkpLgorICAgICAgICAgKi8KKyAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuc2V0RGVmYXVsdFZhbHVlcyh0aGlzLCBSLnhtbC5hZHZhbmNlZF9wcmVmZXJlbmNlcywgZmFsc2UpOworCisgICAgICAgIC8vIFNpbXBsZSBsYXlvdXQKKyAgICAgICAgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBidXR0b24gdGhhdCB3aWxsIGxhdW5jaCB0aGUgcHJlZmVyZW5jZXMKKyAgICAgICAgQnV0dG9uIGxhdW5jaFByZWZlcmVuY2VzID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgbGF1bmNoUHJlZmVyZW5jZXMuc2V0VGV4dChnZXRTdHJpbmcoUi5zdHJpbmcubGF1bmNoX3ByZWZlcmVuY2VfYWN0aXZpdHkpKTsKKyAgICAgICAgbGF1bmNoUHJlZmVyZW5jZXMuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhsYXVuY2hQcmVmZXJlbmNlcywgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKworICAgICAgICBtQ291bnRlclRleHQgPSBuZXcgVGV4dFZpZXcodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KG1Db3VudGVyVGV4dCwgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKworICAgICAgICB1cGRhdGVDb3VudGVyVGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisKKyAgICAgICAgLy8gV2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQsIGxhdW5jaCBhbiBhY3Rpdml0eSB0aHJvdWdoIHRoaXMgaW50ZW50CisgICAgICAgIEludGVudCBsYXVuY2hQcmVmZXJlbmNlc0ludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDbGFzcyh0aGlzLCBBZHZhbmNlZFByZWZlcmVuY2VzLmNsYXNzKTsKKworICAgICAgICAvLyBNYWtlIGl0IGEgc3ViYWN0aXZpdHkgc28gd2Uga25vdyB3aGVuIGl0IHJldHVybnMKKyAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChsYXVuY2hQcmVmZXJlbmNlc0ludGVudCwgUkVRVUVTVF9DT0RFX1BSRUZFUkVOQ0VTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIC8vIFRoZSBwcmVmZXJlbmNlcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdCBjb2RlIGlzIHdoYXQgd2UgaGFkIGdpdmVuCisgICAgICAgIC8vIGVhcmxpZXIgaW4gc3RhcnRTdWJBY3Rpdml0eQorICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gUkVRVUVTVF9DT0RFX1BSRUZFUkVOQ0VTKSB7CisgICAgICAgICAgICAvLyBSZWFkIGEgc2FtcGxlIHZhbHVlIHRoZXkgaGF2ZSBzZXQKKyAgICAgICAgICAgIHVwZGF0ZUNvdW50ZXJUZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ291bnRlclRleHQoKSB7CisgICAgICAgIC8vIFNpbmNlIHdlJ3JlIGluIHRoZSBzYW1lIHBhY2thZ2UsIHdlIGNhbiB1c2UgdGhpcyBjb250ZXh0IHRvIGdldAorICAgICAgICAvLyB0aGUgZGVmYXVsdCBzaGFyZWQgcHJlZmVyZW5jZXMKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgc2hhcmVkUHJlZiA9IFByZWZlcmVuY2VNYW5hZ2VyLmdldERlZmF1bHRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ZXIgPSBzaGFyZWRQcmVmLmdldEludChBZHZhbmNlZFByZWZlcmVuY2VzLktFWV9NWV9QUkVGRVJFTkNFLCAwKTsKKyAgICAgICAgbUNvdW50ZXJUZXh0LnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLmNvdW50ZXJfdmFsdWVfaXMpICsgIiAiICsgY291bnRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTXlQcmVmZXJlbmNlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9NeVByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI4YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTXlQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY3VzdG9tIHByZWZlcmVuY2UgdHlwZS4gVGhlIHByZWZlcmVuY2UgY291bnRzIHRoZQorICogbnVtYmVyIG9mIGNsaWNrcyBpdCBoYXMgcmVjZWl2ZWQgYW5kIHN0b3Jlcy9yZXRyaWV2ZXMgaXQgZnJvbSB0aGUgc3RvcmFnZS4KKyAqLworcHVibGljIGNsYXNzIE15UHJlZmVyZW5jZSBleHRlbmRzIFByZWZlcmVuY2UgeworICAgIHByaXZhdGUgaW50IG1DbGlja0NvdW50ZXI7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBjYWxsZWQgYnkgdGhlIGluZmxhdGVyCisgICAgcHVibGljIE15UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgc2V0V2lkZ2V0TGF5b3V0UmVzb3VyY2UoUi5sYXlvdXQucHJlZmVyZW5jZV93aWRnZXRfbXlwcmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJpbmRWaWV3KFZpZXcgdmlldykgeworICAgICAgICBzdXBlci5vbkJpbmRWaWV3KHZpZXcpOworCisgICAgICAgIC8vIFNldCBvdXIgY3VzdG9tIHZpZXdzIGluc2lkZSB0aGUgbGF5b3V0CisgICAgICAgIGZpbmFsIFRleHRWaWV3IG15VGV4dFZpZXcgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXlwcmVmZXJlbmNlX3dpZGdldCk7CisgICAgICAgIGlmIChteVRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG15VGV4dFZpZXcuc2V0VGV4dChTdHJpbmcudmFsdWVPZihtQ2xpY2tDb3VudGVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBpbnQgbmV3VmFsdWUgPSBtQ2xpY2tDb3VudGVyICsgMTsKKyAgICAgICAgLy8gR2l2ZSB0aGUgY2xpZW50IGEgY2hhbmNlIHRvIGlnbm9yZSB0aGlzIGNoYW5nZSBpZiB0aGV5IGRlZW0gaXQKKyAgICAgICAgLy8gaW52YWxpZAorICAgICAgICBpZiAoIWNhbGxDaGFuZ2VMaXN0ZW5lcihuZXdWYWx1ZSkpIHsKKyAgICAgICAgICAgIC8vIFRoZXkgZG9uJ3Qgd2FudCB0aGUgdmFsdWUgdG8gYmUgc2V0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBJbmNyZW1lbnQgY291bnRlcgorICAgICAgICBtQ2xpY2tDb3VudGVyID0gbmV3VmFsdWU7CisKKyAgICAgICAgLy8gU2F2ZSB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgKHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoaXMKKyAgICAgICAgLy8gcHJlZmVyZW5jZSBzaG91bGQgYmUgcGVyc2lzdGVudCwgYWxvbmcgd2l0aCBvdGhlciB1c2VmdWwgY2hlY2tzKQorICAgICAgICBwZXJzaXN0SW50KG1DbGlja0NvdW50ZXIpOworCisgICAgICAgIC8vIERhdGEgaGFzIGNoYW5nZWQsIG5vdGlmeSBzbyBVSSBjYW4gYmUgcmVmcmVzaGVkIQorICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBvbkdldERlZmF1bHRWYWx1ZShUeXBlZEFycmF5IGEsIGludCBpbmRleCkgeworICAgICAgICAvLyBUaGlzIHByZWZlcmVuY2UgdHlwZSdzIHZhbHVlIHR5cGUgaXMgSW50ZWdlciwgc28gd2UgcmVhZCB0aGUgZGVmYXVsdAorICAgICAgICAvLyB2YWx1ZSBmcm9tIHRoZSBhdHRyaWJ1dGVzIGFzIGFuIEludGVnZXIuCisgICAgICAgIHJldHVybiBhLmdldEludGVnZXIoaW5kZXgsIDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGlmIChyZXN0b3JlVmFsdWUpIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgc3RhdGUKKyAgICAgICAgICAgIG1DbGlja0NvdW50ZXIgPSBnZXRQZXJzaXN0ZWRJbnQobUNsaWNrQ291bnRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgc3RhdGUKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IChJbnRlZ2VyKSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICBtQ2xpY2tDb3VudGVyID0gdmFsdWU7CisgICAgICAgICAgICBwZXJzaXN0SW50KHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFN1cHBvc2UgYSBjbGllbnQgdXNlcyB0aGlzIHByZWZlcmVuY2UgdHlwZSB3aXRob3V0IHBlcnNpc3RpbmcuIFdlCisgICAgICAgICAqIG11c3Qgc2F2ZSB0aGUgaW5zdGFuY2Ugc3RhdGUgc28gaXQgaXMgYWJsZSB0bywgZm9yIGV4YW1wbGUsIHN1cnZpdmUKKyAgICAgICAgICogb3JpZW50YXRpb24gY2hhbmdlcy4KKyAgICAgICAgICovCisKKyAgICAgICAgZmluYWwgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICBpZiAoaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSBpbnN0YW5jZSBzdGF0ZSBzaW5jZSBpdCdzIHBlcnNpc3RlbnQKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgZmluYWwgU2F2ZWRTdGF0ZSBteVN0YXRlID0gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSk7CisgICAgICAgIG15U3RhdGUuY2xpY2tDb3VudGVyID0gbUNsaWNrQ291bnRlcjsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShQYXJjZWxhYmxlIHN0YXRlKSB7CisgICAgICAgIGlmICghc3RhdGUuZ2V0Q2xhc3MoKS5lcXVhbHMoU2F2ZWRTdGF0ZS5jbGFzcykpIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzYXZlIHN0YXRlIGZvciB1cyBpbiBvblNhdmVJbnN0YW5jZVN0YXRlCisgICAgICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RvcmUgdGhlIGluc3RhbmNlIHN0YXRlCisgICAgICAgIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IChTYXZlZFN0YXRlKSBzdGF0ZTsKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShteVN0YXRlLmdldFN1cGVyU3RhdGUoKSk7CisgICAgICAgIG1DbGlja0NvdW50ZXIgPSBteVN0YXRlLmNsaWNrQ291bnRlcjsKKyAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVkU3RhdGUsIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIEJhc2VTYXZlZFN0YXRlfSwgd2lsbCBzdG9yZSB0aGUgc3RhdGUKKyAgICAgKiBvZiBNeVByZWZlcmVuY2UsIGEgc3ViY2xhc3Mgb2YgUHJlZmVyZW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBpbXBvcnRhbnQgdG8gYWx3YXlzIGNhbGwgdGhyb3VnaCB0byBzdXBlciBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCBjbGlja0NvdW50ZXI7CisKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xpY2sgY291bnRlcgorICAgICAgICAgICAgY2xpY2tDb3VudGVyID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBjbGljayBjb3VudGVyCisgICAgICAgICAgICBkZXN0LndyaXRlSW50KGNsaWNrQ291bnRlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VEZXBlbmRlbmNpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE0ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5OworCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZURlcGVuZGVuY2llcyBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVdpdGhIZWFkZXJzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM3ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVdpdGhIZWFkZXJzLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIFByZWZlcmVuY2VBY3Rpdml0eSB0byBtYWtlIGEgdG9wLWxldmVsIHByZWZlcmVuY2UKKyAqIHBhbmVsIHdpdGggaGVhZGVycy4KKyAqLworLy9CRUdJTl9JTkNMVURFKGFjdGl2aXR5KQorcHVibGljIGNsYXNzIFByZWZlcmVuY2VXaXRoSGVhZGVycyBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgLy8gQWRkIGEgYnV0dG9uIHRvIHRoZSBoZWFkZXIgbGlzdC4KKyAgICAgICAgaWYgKGhhc0hlYWRlcnMoKSkgeworICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgICAgICBidXR0b24uc2V0VGV4dCgiU29tZSBhY3Rpb24iKTsKKyAgICAgICAgICAgIHNldExpc3RGb290ZXIoYnV0dG9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB0aGUgYWN0aXZpdHkgd2l0aCB0aGUgdG9wLWxldmVsIGhlYWRlcnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25CdWlsZEhlYWRlcnMoTGlzdDxIZWFkZXI+IHRhcmdldCkgeworICAgICAgICBsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZShSLnhtbC5wcmVmZXJlbmNlX2hlYWRlcnMsIHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmcmFnbWVudCBzaG93cyB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoZSBmaXJzdCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmczFGcmFnbWVudCBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBwcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCByZXNvdXJjZQorICAgICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwuZnJhZ21lbnRlZF9wcmVmZXJlbmNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgc2Vjb25kLWxldmVsIHNldCBvZiBwcmVmZXJlbmNlIHRoYXQgeW91CisgICAgICogY2FuIGdldCB0byBieSB0YXBwaW5nIGFuIGl0ZW0gaW4gdGhlIGZpcnN0IHByZWZlcmVuY2VzIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZnMxRnJhZ21lbnRJbm5lciBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICAvLyBDYW4gcmV0cmlldmUgYXJndW1lbnRzIGZyb20gcHJlZmVyZW5jZSBYTUwuCisgICAgICAgICAgICBMb2cuaSgiYXJncyIsICJBcmd1bWVudHM6ICIgKyBnZXRBcmd1bWVudHMoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCisgICAgICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5mcmFnbWVudGVkX3ByZWZlcmVuY2VzX2lubmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnJhZ21lbnQgc2hvd3MgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgc2Vjb25kIGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZWZzMkZyYWdtZW50IGV4dGVuZHMgUHJlZmVyZW5jZUZyYWdtZW50IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIENhbiByZXRyaWV2ZSBhcmd1bWVudHMgZnJvbSBoZWFkZXJzIFhNTC4KKyAgICAgICAgICAgIExvZy5pKCJhcmdzIiwgIkFyZ3VtZW50czogIiArIGdldEFyZ3VtZW50cygpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKKyAgICAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VfZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKy8vRU5EX0lOQ0xVREUoYWN0aXZpdHkpCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlNmI0MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VzRnJvbUNvZGUuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLkNoZWNrQm94UHJlZmVyZW5jZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5MaXN0UHJlZmVyZW5jZTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnk7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW47CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworcHVibGljIGNsYXNzIFByZWZlcmVuY2VzRnJvbUNvZGUgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4oY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByZWZlcmVuY2VTY3JlZW4gY3JlYXRlUHJlZmVyZW5jZUhpZXJhcmNoeSgpIHsKKyAgICAgICAgLy8gUm9vdAorICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIHJvb3QgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7CisKKyAgICAgICAgLy8gSW5saW5lIHByZWZlcmVuY2VzCisgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBpbmxpbmVQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKKyAgICAgICAgaW5saW5lUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5pbmxpbmVfcHJlZmVyZW5jZXMpOworICAgICAgICByb290LmFkZFByZWZlcmVuY2UoaW5saW5lUHJlZkNhdCk7CisKKyAgICAgICAgLy8gVG9nZ2xlIHByZWZlcmVuY2UKKyAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIHRvZ2dsZVByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOworICAgICAgICB0b2dnbGVQcmVmLnNldEtleSgidG9nZ2xlX3ByZWZlcmVuY2UiKTsKKyAgICAgICAgdG9nZ2xlUHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV90b2dnbGVfcHJlZmVyZW5jZSk7CisgICAgICAgIHRvZ2dsZVByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X3RvZ2dsZV9wcmVmZXJlbmNlKTsKKyAgICAgICAgaW5saW5lUHJlZkNhdC5hZGRQcmVmZXJlbmNlKHRvZ2dsZVByZWYpOworCisgICAgICAgIC8vIERpYWxvZyBiYXNlZCBwcmVmZXJlbmNlcworICAgICAgICBQcmVmZXJlbmNlQ2F0ZWdvcnkgZGlhbG9nQmFzZWRQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKKyAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19iYXNlZF9wcmVmZXJlbmNlcyk7CisgICAgICAgIHJvb3QuYWRkUHJlZmVyZW5jZShkaWFsb2dCYXNlZFByZWZDYXQpOworCisgICAgICAgIC8vIEVkaXQgdGV4dCBwcmVmZXJlbmNlCisgICAgICAgIEVkaXRUZXh0UHJlZmVyZW5jZSBlZGl0VGV4dFByZWYgPSBuZXcgRWRpdFRleHRQcmVmZXJlbmNlKHRoaXMpOworICAgICAgICBlZGl0VGV4dFByZWYuc2V0RGlhbG9nVGl0bGUoUi5zdHJpbmcuZGlhbG9nX3RpdGxlX2VkaXR0ZXh0X3ByZWZlcmVuY2UpOworICAgICAgICBlZGl0VGV4dFByZWYuc2V0S2V5KCJlZGl0dGV4dF9wcmVmZXJlbmNlIik7CisgICAgICAgIGVkaXRUZXh0UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKKyAgICAgICAgZWRpdFRleHRQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKKyAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LmFkZFByZWZlcmVuY2UoZWRpdFRleHRQcmVmKTsKKworICAgICAgICAvLyBMaXN0IHByZWZlcmVuY2UKKyAgICAgICAgTGlzdFByZWZlcmVuY2UgbGlzdFByZWYgPSBuZXcgTGlzdFByZWZlcmVuY2UodGhpcyk7CisgICAgICAgIGxpc3RQcmVmLnNldEVudHJpZXMoUi5hcnJheS5lbnRyaWVzX2xpc3RfcHJlZmVyZW5jZSk7CisgICAgICAgIGxpc3RQcmVmLnNldEVudHJ5VmFsdWVzKFIuYXJyYXkuZW50cnl2YWx1ZXNfbGlzdF9wcmVmZXJlbmNlKTsKKyAgICAgICAgbGlzdFByZWYuc2V0RGlhbG9nVGl0bGUoUi5zdHJpbmcuZGlhbG9nX3RpdGxlX2xpc3RfcHJlZmVyZW5jZSk7CisgICAgICAgIGxpc3RQcmVmLnNldEtleSgibGlzdF9wcmVmZXJlbmNlIik7CisgICAgICAgIGxpc3RQcmVmLnNldFRpdGxlKFIuc3RyaW5nLnRpdGxlX2xpc3RfcHJlZmVyZW5jZSk7CisgICAgICAgIGxpc3RQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9saXN0X3ByZWZlcmVuY2UpOworICAgICAgICBkaWFsb2dCYXNlZFByZWZDYXQuYWRkUHJlZmVyZW5jZShsaXN0UHJlZik7CisKKyAgICAgICAgLy8gTGF1bmNoIHByZWZlcmVuY2VzCisgICAgICAgIFByZWZlcmVuY2VDYXRlZ29yeSBsYXVuY2hQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKKyAgICAgICAgbGF1bmNoUHJlZkNhdC5zZXRUaXRsZShSLnN0cmluZy5sYXVuY2hfcHJlZmVyZW5jZXMpOworICAgICAgICByb290LmFkZFByZWZlcmVuY2UobGF1bmNoUHJlZkNhdCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIFByZWZlcmVuY2VzIHNjcmVlblByZWYgc2VydmVzIGFzIGEgc2NyZWVuIGJyZWFrIChzaW1pbGFyIHRvIHBhZ2UKKyAgICAgICAgICogYnJlYWsgaW4gd29yZCBwcm9jZXNzaW5nKS4gTGlrZSBmb3Igb3RoZXIgcHJlZmVyZW5jZSB0eXBlcywgd2UgYXNzaWduCisgICAgICAgICAqIGEga2V5IGhlcmUgc28gdGhhdCBpdCBpcyBhYmxlIHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzIGluc3RhbmNlIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgLy8gU2NyZWVuIHByZWZlcmVuY2UKKyAgICAgICAgUHJlZmVyZW5jZVNjcmVlbiBzY3JlZW5QcmVmID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5jcmVhdGVQcmVmZXJlbmNlU2NyZWVuKHRoaXMpOworICAgICAgICBzY3JlZW5QcmVmLnNldEtleSgic2NyZWVuX3ByZWZlcmVuY2UiKTsKKyAgICAgICAgc2NyZWVuUHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9zY3JlZW5fcHJlZmVyZW5jZSk7CisgICAgICAgIHNjcmVlblByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X3NjcmVlbl9wcmVmZXJlbmNlKTsKKyAgICAgICAgbGF1bmNoUHJlZkNhdC5hZGRQcmVmZXJlbmNlKHNjcmVlblByZWYpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFlvdSBjYW4gYWRkIG1vcmUgcHJlZmVyZW5jZXMgdG8gc2NyZWVuUHJlZiB0aGF0IHdpbGwgYmUgc2hvd24gb24gdGhlCisgICAgICAgICAqIG5leHQgc2NyZWVuLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBFeGFtcGxlIG9mIG5leHQgc2NyZWVuIHRvZ2dsZSBwcmVmZXJlbmNlCisgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmID0gbmV3IENoZWNrQm94UHJlZmVyZW5jZSh0aGlzKTsKKyAgICAgICAgbmV4dFNjcmVlbkNoZWNrQm94UHJlZi5zZXRLZXkoIm5leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIik7CisgICAgICAgIG5leHRTY3JlZW5DaGVja0JveFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UpOworICAgICAgICBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSk7CisgICAgICAgIHNjcmVlblByZWYuYWRkUHJlZmVyZW5jZShuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmKTsKKworICAgICAgICAvLyBJbnRlbnQgcHJlZmVyZW5jZQorICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIGludGVudFByZWYgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7CisgICAgICAgIGludGVudFByZWYuc2V0SW50ZW50KG5ldyBJbnRlbnQoKS5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9WSUVXKQorICAgICAgICAgICAgICAgIC5zZXREYXRhKFVyaS5wYXJzZSgiaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIpKSk7CisgICAgICAgIGludGVudFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfaW50ZW50X3ByZWZlcmVuY2UpOworICAgICAgICBpbnRlbnRQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9pbnRlbnRfcHJlZmVyZW5jZSk7CisgICAgICAgIGxhdW5jaFByZWZDYXQuYWRkUHJlZmVyZW5jZShpbnRlbnRQcmVmKTsKKworICAgICAgICAvLyBQcmVmZXJlbmNlIGF0dHJpYnV0ZXMKKyAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IHByZWZBdHRyc0NhdCA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7CisgICAgICAgIHByZWZBdHRyc0NhdC5zZXRUaXRsZShSLnN0cmluZy5wcmVmZXJlbmNlX2F0dHJpYnV0ZXMpOworICAgICAgICByb290LmFkZFByZWZlcmVuY2UocHJlZkF0dHJzQ2F0KTsKKworICAgICAgICAvLyBWaXN1YWwgcGFyZW50IHRvZ2dsZSBwcmVmZXJlbmNlCisgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBwYXJlbnRDaGVja0JveFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOworICAgICAgICBwYXJlbnRDaGVja0JveFByZWYuc2V0VGl0bGUoUi5zdHJpbmcudGl0bGVfcGFyZW50X3ByZWZlcmVuY2UpOworICAgICAgICBwYXJlbnRDaGVja0JveFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X3BhcmVudF9wcmVmZXJlbmNlKTsKKyAgICAgICAgcHJlZkF0dHJzQ2F0LmFkZFByZWZlcmVuY2UocGFyZW50Q2hlY2tCb3hQcmVmKTsKKworICAgICAgICAvLyBWaXN1YWwgY2hpbGQgdG9nZ2xlIHByZWZlcmVuY2UKKyAgICAgICAgLy8gU2VlIHJlcy92YWx1ZXMvYXR0cnMueG1sIGZvciB0aGUgPGRlY2xhcmUtc3R5bGVhYmxlPiB0aGF0IGRlZmluZXMKKyAgICAgICAgLy8gVG9nZ2xlUHJlZkF0dHJzLgorICAgICAgICBUeXBlZEFycmF5IGEgPSBvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKFIuc3R5bGVhYmxlLlRvZ2dsZVByZWZBdHRycyk7CisgICAgICAgIENoZWNrQm94UHJlZmVyZW5jZSBjaGlsZENoZWNrQm94UHJlZiA9IG5ldyBDaGVja0JveFByZWZlcmVuY2UodGhpcyk7CisgICAgICAgIGNoaWxkQ2hlY2tCb3hQcmVmLnNldFRpdGxlKFIuc3RyaW5nLnRpdGxlX2NoaWxkX3ByZWZlcmVuY2UpOworICAgICAgICBjaGlsZENoZWNrQm94UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfY2hpbGRfcHJlZmVyZW5jZSk7CisgICAgICAgIGNoaWxkQ2hlY2tCb3hQcmVmLnNldExheW91dFJlc291cmNlKAorICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5Ub2dnbGVQcmVmQXR0cnNfYW5kcm9pZF9wcmVmZXJlbmNlTGF5b3V0Q2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CisgICAgICAgIHByZWZBdHRyc0NhdC5hZGRQcmVmZXJlbmNlKGNoaWxkQ2hlY2tCb3hQcmVmKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhlMzNjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CisKK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0Zyb21YbWwgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCisgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvX2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YTU3MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L19pbmRleC5odG1sCkBAIC0wLDAgKzEsNzYgQEAKKworPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIHNhbXBsZXMgc2hvd2luZyB0aGUgdXNlIG9mIEFuZHJvaWQncworc3RhdGljIHN1cHBvcnQgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBjb250YWlucyBjb2RlIHRoYXQgeW91IGNhbgorYnVpbGQgaW4gdG8geW91ciBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgbmV3IGZlYXR1cmVzIGFuZCBjb21tb24KK3V0aWxpdGllcyB3aGlsZSBiZWluZyBhYmxlIHRvIHJ1biBkb3duIHRvIHZlcnNpb24gMS42IChBUEkgNCkKK29mIHRoZSBwbGF0Zm9ybS48L3A+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjRnJhZ21lbnQiPkZyYWdtZW50PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjTG9hZGVyTWFuYWdlciI+TG9hZGVyTWFuYWdlcjwvYT48L2xpPgorPC91bD4KKworCis8aDMgaWQ9IkZyYWdtZW50Ij5GcmFnbWVudDwvaDM+Cis8ZGw+CisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnRBbGVydERpYWxvZ1N1cHBvcnQuaHRtbCI+RnJhZ21lbnQgQWxlcnQgRGlhbG9nPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhIERpYWxvZ0ZyYWdtZW50IHRvIHNob3cgYW5kIG1hbmFnZSBhbgorICBBbGVydERpYWxvZy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudEFyZ3VtZW50c1N1cHBvcnQuaHRtbCI+RnJhZ21lbnQgQXJndW1lbnRzPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgaG93IGEgZnJhZ21lbnQgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYXJndW1lbnRzLAorICBzdXBwbHlpbmcgdGhlbSBlaXRoZXIgYXMgYW4gYXJndW1lbnQgQnVuZGxlIGF0IHJ1bnRpbWUgb3IgWE1MIGF0dHJpYnV0ZXMKKyAgaW4gYSAmbHQ7ZnJhZ21lbnQ+IHRhZy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudENvbnRleHRNZW51U3VwcG9ydC5odG1sIj5GcmFnbWVudCBDb250ZXh0IE1lbnU8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBob3cgdG8gZGlzcGxheSBhbmQgcmVzcG9uZCB0byBhIGNvbnRleHQgbWVudSB0aGF0IGlzCisgIGRpc3BsYXkgZnJvbSBhIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnREaWFsb2dTdXBwb3J0Lmh0bWwiPkZyYWdtZW50IERpYWxvZzwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHVzZSBvZiBEaWFsb2dGcmFnbWVudCB0byBzaG93IHZhcmlvdXMgdHlwZXMgb2YgZGlhbG9ncy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHlTdXBwb3J0Lmh0bWwiPkZyYWdtZW50IERpYWxvZyBvciBBY3Rpdml0eTwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGhvdyB0aGUgc2FtZSBGcmFnbWVudCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHRoZSBVSQorICBmb3IgZWl0aGVyIGFuIEFjdGl2aXR5IG9yIERpYWxvZy48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudEhpZGVTaG93U3VwcG9ydC5odG1sIj5GcmFnbWVudCBIaWRlIFNob3c8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBoaWRpbmcgYW5kIHNob3dpbmcgZnJhZ21lbnRzLjwvZGQ+CisgIAorICA8ZHQ+PGEgaHJlZj0iYXBwL0ZyYWdtZW50TGF5b3V0U3VwcG9ydC5odG1sIj5GcmFnbWVudCBMYXlvdXQ8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB1c2Ugb2YgdGhlICZsdDtmcmFnbWVudCZndDsgdGFnIHRvIGVtYmVkIGEgRnJhZ21lbnQgaW4KKyAgYW4gQWN0aXZpdHkncyBjb250ZW50IHZpZXcgbGF5b3V0LCBhbmQgbWFraW5nIHRoZSBsYXlvdXQgY2hhbmdlIGJhc2VkIG9uCisgIGNvbmZpZ3VyYXRpb24gdG8gYWNoaWV2ZSBkaWZmZXJlbnQgVUkgZmxvd3MuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnRMaXN0QXJyYXlTdXBwb3J0Lmh0bWwiPkZyYWdtZW50IExpc3QgQXJyYXk8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB1c2Ugb2YgTGlzdEZyYWdtZW50IHRvIHNob3cgdGhlIGNvbnRlbnRzIG9mIGEgc2ltcGxlIEFycmF5QWRhcHRlci48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudExpc3RDdXJzb3JMb2FkZXJTdXBwb3J0Lmh0bWwiPkZyYWdtZW50IExpc3QgQ3Vyc29yIExvYWRlcjwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHVzZSBvZiBMb2FkZXJNYW5hZ2VyIHRvIHBlcmZvcm0gYSBxdWVyeSBmb3IgYSBDdXJzb3IgdGhhdAorICBwb3B1bGF0ZXMgYSBMaXN0RnJhZ21lbnQuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnRNZW51U3VwcG9ydC5odG1sIj5GcmFnbWVudCBNZW51PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgcG9wdWxhdGluZyBjdXN0b20gbWVudSBpdGVtcyBmcm9tIGEgRnJhZ21lbnQuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0U3VwcG9ydC5odG1sIj5GcmFnbWVudCBSZWNlaXZlIFJlc3VsdDwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIHN0YXJ0aW5nIGEgbmV3IEFjdGl2aXR5IGZyb20gYSBGcmFnbWVudCwgYW5kIHJlY2VpdmluZworICBhIHJlc3VsdCBiYWNrIGZyb20gaXQuPC9kZD4KKyAgCisgIDxkdD48YSBocmVmPSJhcHAvRnJhZ21lbnRSZXRhaW5JbnN0YW5jZVN1cHBvcnQuaHRtbCI+RnJhZ21lbnQgUmV0YWluIEluc3RhbmNlPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSBGcmFnbWVudCBjYW4gYmUgdXNlZCB0byBlYXNpbHkgcmV0YWluIGFjdGl2ZSBzdGF0ZSBhY3Jvc3MKKyAgYW4gQWN0aXZpdHkncyBjb25maWd1cmF0aW9uIGNoYW5nZS48L2RkPgorICAKKyAgPGR0PjxhIGhyZWY9ImFwcC9GcmFnbWVudFN0YWNrU3VwcG9ydC5odG1sIj5GcmFnbWVudCBTdGFjazwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGNyZWF0aW5nIGEgc3RhY2sgb2YgRnJhZ21lbnQgaW5zdGFuY2VzIHNpbWlsYXIgdG8gdGhlCisgIHRyYWRpdGlvbmFsIHN0YWNrIG9mIGFjdGl2aXRpZXMuPC9kZD4KKyAgCis8L2RsPgorCis8aDMgaWQ9IkxvYWRlck1hbmFnZXIiPkxvYWRlck1hbmFnZXI8L2gzPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iYXBwL0xvYWRlclRocm90dGxlU3VwcG9ydC5odG1sIj5Mb2FkZXIgVGhyb3R0bGU8L2E+PC9kdD4KKyAgPGRkPkNvbXBsZXRlIGVuZC10by1lbmQgZGVtb25zdHJhdGlvbiBvZiBhIHNpbXBsZSBjb250ZW50IHByb3ZpZGVyIHRoYXQKKyAgcG9wdWxhdGVzIGRhdGEgaW4gYSBsaXN0IHRocm91Z2ggYSBjdXJzb3IgbG9hZGVyLiAgVGhlIFVJIGFsbG93cyB0aGUgbGlzdAorICB0byBiZSBwb3B1bGF0ZWQgd2l0aCBhIHNlcmllcyBvZiBpdGVtcywgc2hvd2luZyBob3cgQXN5bmNUYXNrTG9hZGVyJ3MKKyAgdGhyb3R0bGluZyBmYWNpbGl0eSBjYW4gYmUgdXNlZCB0byBjb250cm9sIGhvdyBtdWNoIGEgTG9hZGVyIGlzIHJlZnJlc2hlZAorICBpbiB0aGlzIGNhc2UuPC9kZD4KKzwvZGw+CisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nU3VwcG9ydC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2dTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmNmFlOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgdG8gc2hvdyBhbiBBbGVydERpYWxvZyB0aGF0IGlzIG1hbmFnZWQgYnkgYSBGcmFnbWVudC4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50QWxlcnREaWFsb2dTdXBwb3J0IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgYW4gYWxlcnQgZGlhbG9nIHdpdGggYSBEaWFsb2dGcmFnbWVudCIpOworCisgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zaG93KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGFjdGl2aXR5KQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zX3RpdGxlKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCksICJkaWFsb2ciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc2l0aXZlQ2xpY2soKSB7CisgICAgICAgIC8vIERvIHN0dWZmIGhlcmUuCisgICAgICAgIExvZy5pKCJGcmFnbWVudEFsZXJ0RGlhbG9nIiwgIlBvc2l0aXZlIGNsaWNrISIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvTmVnYXRpdmVDbGljaygpIHsKKyAgICAgICAgLy8gRG8gc3R1ZmYgaGVyZS4KKyAgICAgICAgTG9nLmkoIkZyYWdtZW50QWxlcnREaWFsb2ciLCAiTmVnYXRpdmUgY2xpY2shIik7CisgICAgfQorLy9FTkRfSU5DTFVERShhY3Rpdml0eSkKKworLy9CRUdJTl9JTkNMVURFKGRpYWxvZykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QWxlcnREaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIE15QWxlcnREaWFsb2dGcmFnbWVudCBuZXdJbnN0YW5jZShpbnQgdGl0bGUpIHsKKyAgICAgICAgICAgIE15QWxlcnREaWFsb2dGcmFnbWVudCBmcmFnID0gbmV3IE15QWxlcnREaWFsb2dGcmFnbWVudCgpOworICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmdzLnB1dEludCgidGl0bGUiLCB0aXRsZSk7CisgICAgICAgICAgICBmcmFnLnNldEFyZ3VtZW50cyhhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBmcmFnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgaW50IHRpdGxlID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJ0aXRsZSIpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0QWN0aXZpdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24oUi5kcmF3YWJsZS5hbGVydF9kaWFsb2dfaWNvbikKKyAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKHRpdGxlKQorICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGcmFnbWVudEFsZXJ0RGlhbG9nU3VwcG9ydClnZXRBY3Rpdml0eSgpKS5kb1Bvc2l0aXZlQ2xpY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKFIuc3RyaW5nLmFsZXJ0X2RpYWxvZ19jYW5jZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaEJ1dHRvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZyYWdtZW50QWxlcnREaWFsb2dTdXBwb3J0KWdldEFjdGl2aXR5KCkpLmRvTmVnYXRpdmVDbGljaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRpYWxvZykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEFyZ3VtZW50c1N1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEFyZ3VtZW50c1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY3MTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50QXJndW1lbnRzU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBhIGZyYWdtZW50IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBib3RoIEJ1bmRsZSBhcmd1bWVudHMKKyAqIGFuZCBsYXlvdXQgYXR0cmlidXRlcy4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50QXJndW1lbnRzU3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworLy9CRUdJTl9JTkNMVURFKGNyZWF0ZSkKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9hcmd1bWVudHNfc3VwcG9ydCk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdC10aW1lIGluaXQ7IGNyZWF0ZSBmcmFnbWVudCB0byBlbWJlZCBpbiBhY3Rpdml0eS4KKyAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeUZyYWdtZW50Lm5ld0luc3RhbmNlKCJGcm9tIEFyZ3VtZW50cyIpOworICAgICAgICAgICAgZnQuYWRkKFIuaWQuY3JlYXRlZCwgbmV3RnJhZ21lbnQpOworICAgICAgICAgICAgZnQuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGNyZWF0ZSkKKworLy9CRUdJTl9JTkNMVURFKGZyYWdtZW50KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG1MYWJlbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIE15RnJhZ21lbnQgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkCisgICAgICAgICAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeUZyYWdtZW50IG5ld0luc3RhbmNlKENoYXJTZXF1ZW5jZSBsYWJlbCkgeworICAgICAgICAgICAgTXlGcmFnbWVudCBmID0gbmV3IE15RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYi5wdXRDaGFyU2VxdWVuY2UoImxhYmVsIiwgbGFiZWwpOworICAgICAgICAgICAgZi5zZXRBcmd1bWVudHMoYik7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZSBhdHRyaWJ1dGVzIGR1cmluZyBpbmZsYXRpb24gZnJvbSBhIHZpZXcgaGllcmFyY2h5IGludG8gdGhlCisgICAgICAgICAqIGFyZ3VtZW50cyB3ZSBoYW5kbGUuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25JbmZsYXRlKEFjdGl2aXR5IGFjdGl2aXR5LCBBdHRyaWJ1dGVTZXQgYXR0cnMsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25JbmZsYXRlKGFjdGl2aXR5LCBhdHRycywgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gYWN0aXZpdHkub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuRnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICAgICAgbUxhYmVsID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkZyYWdtZW50QXJndW1lbnRzX2FuZHJvaWRfbGFiZWwpOworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRHVyaW5nIGNyZWF0aW9uLCBpZiBhcmd1bWVudHMgaGF2ZSBiZWVuIHN1cHBsaWVkIHRvIHRoZSBmcmFnbWVudAorICAgICAgICAgKiB0aGVuIHBhcnNlIHRob3NlIG91dC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBsYWJlbCA9IGFyZ3MuZ2V0Q2hhclNlcXVlbmNlKCJsYWJlbCIpOworICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgdGhlIHZpZXcgZm9yIHRoaXMgZnJhZ21lbnQsIHVzaW5nIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuaGVsbG9fd29ybGQsIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KG1MYWJlbCAhPSBudWxsID8gbUxhYmVsIDogIihubyBsYWJlbCkiKTsKKyAgICAgICAgICAgIHR2LnNldEJhY2tncm91bmREcmF3YWJsZShnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShhbmRyb2lkLlIuZHJhd2FibGUuZ2FsbGVyeV90aHVtYikpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGZyYWdtZW50KQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnVTdXBwb3J0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRDb250ZXh0TWVudVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM0MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnVTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnN1cHBvcnQuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgZGlzcGxheWluZyBhIGNvbnRleHQgbWVudSBmcm9tIGEgZnJhZ21lbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudENvbnRleHRNZW51U3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBmcmFnbWVudCBhbmQgYWRkIGl0IGFzIG91ciBzb2xlIGNvbnRlbnQuCisgICAgICAgIENvbnRleHRNZW51RnJhZ21lbnQgY29udGVudCA9IG5ldyBDb250ZXh0TWVudUZyYWdtZW50KCk7CisgICAgICAgIGdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pZC5jb250ZW50LCBjb250ZW50KS5jb21taXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRleHRNZW51RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHJvb3QgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X2NvbnRleHRfbWVudSwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICByZWdpc3RlckZvckNvbnRleHRNZW51KHJvb3QuZmluZFZpZXdCeUlkKFIuaWQubG9uZ19wcmVzcykpOworICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgICAgICAgICBtZW51LmFkZChNZW51Lk5PTkUsIFIuaWQuYV9pdGVtLCBNZW51Lk5PTkUsICJNZW51IEEiKTsKKyAgICAgICAgICAgIG1lbnUuYWRkKE1lbnUuTk9ORSwgUi5pZC5iX2l0ZW0sIE1lbnUuTk9ORSwgIk1lbnUgQiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuYV9pdGVtOgorICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQ29udGV4dE1lbnUiLCAiSXRlbSAxYSB3YXMgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5iX2l0ZW06CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJDb250ZXh0TWVudSIsICJJdGVtIDFiIHdhcyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eVN1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHlTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NzdhYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHlTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnN1cHBvcnQuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5U3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5KTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LXRpbWUgaW5pdDsgY3JlYXRlIGZyYWdtZW50IHRvIGVtYmVkIGluIGFjdGl2aXR5LgorLy9CRUdJTl9JTkNMVURFKGVtYmVkKQorICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLmVtYmVkZGVkLCBuZXdGcmFnbWVudCk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKy8vRU5EX0lOQ0xVREUoZW1iZWQpCisgICAgICAgIH0KKworICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc2hvd19kaWFsb2cpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoc2hvd19kaWFsb2cpCisgICAgdm9pZCBzaG93RGlhbG9nKCkgeworICAgICAgICAvLyBDcmVhdGUgdGhlIGZyYWdtZW50IGFuZCBzaG93IGl0IGFzIGEgZGlhbG9nLgorICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCksICJkaWFsb2ciKTsKKyAgICB9CisvL0VORF9JTkNMVURFKHNob3dfZGlhbG9nKQorCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICAgICAgc3RhdGljIE15RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15RGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5oZWxsb193b3JsZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIlRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgTXlEaWFsb2dGcmFnbWVudCIpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRpYWxvZykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudERpYWxvZ1N1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudERpYWxvZ1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYxNTFkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50RGlhbG9nU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50RGlhbG9nU3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworICAgIGludCBtU3RhY2tMZXZlbCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgZGlhbG9ncyB3aXRoIGEgRGlhbG9nRnJhZ21lbnQuICAiCisgICAgICAgICAgICAgICAgKyAiUHJlc3MgdGhlIHNob3cgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgZmlyc3QgZGlhbG9nOyBwcmVzc2luZyAiCisgICAgICAgICAgICAgICAgKyAic3VjY2Vzc2l2ZSBzaG93IGJ1dHRvbnMgd2lsbCBkaXNwbGF5IG90aGVyIGRpYWxvZyBzdHlsZXMgYXMgYSAiCisgICAgICAgICAgICAgICAgKyAic3RhY2ssIHdpdGggZGlzbWlzc2luZyBvciBiYWNrIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBkaWFsb2cuIik7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNob3cpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3RhY2tMZXZlbCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoImxldmVsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJsZXZlbCIsIG1TdGFja0xldmVsKTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShhZGRfZGlhbG9nKQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgbVN0YWNrTGV2ZWwrKzsKKworICAgICAgICAvLyBEaWFsb2dGcmFnbWVudC5zaG93KCkgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIHRoZSBmcmFnbWVudAorICAgICAgICAvLyBpbiBhIHRyYW5zYWN0aW9uLiAgV2UgYWxzbyB3YW50IHRvIHJlbW92ZSBhbnkgY3VycmVudGx5IHNob3dpbmcKKyAgICAgICAgLy8gZGlhbG9nLCBzbyBtYWtlIG91ciBvd24gdHJhbnNhY3Rpb24gYW5kIHRha2UgY2FyZSBvZiB0aGF0IGhlcmUuCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBGcmFnbWVudCBwcmV2ID0gZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpLmZpbmRGcmFnbWVudEJ5VGFnKCJkaWFsb2ciKTsKKyAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgeworICAgICAgICAgICAgZnQucmVtb3ZlKHByZXYpOworICAgICAgICB9CisgICAgICAgIGZ0LmFkZFRvQmFja1N0YWNrKG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgc2hvdyB0aGUgZGlhbG9nLgorICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UobVN0YWNrTGV2ZWwpOworICAgICAgICBuZXdGcmFnbWVudC5zaG93KGZ0LCAiZGlhbG9nIik7CisgICAgfQorLy9FTkRfSU5DTFVERShhZGRfZGlhbG9nKQorCisgICAgc3RhdGljIFN0cmluZyBnZXROYW1lRm9yTnVtKGludCBudW0pIHsKKyAgICAgICAgc3dpdGNoICgobnVtLTEpJTYpIHsKKyAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuICJTVFlMRV9OT19USVRMRSI7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiAiU1RZTEVfTk9fRlJBTUUiOworICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gIlNUWUxFX05PX0lOUFVUICh0aGlzIHdpbmRvdyBjYW4ndCByZWNlaXZlIGlucHV0LCBzbyAiCisgICAgICAgICAgICAgICAgICAgICsgInlvdSB3aWxsIG5lZWQgdG8gcHJlc3MgdGhlIGJvdHRvbSBzaG93IGJ1dHRvbikiOworICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gIlNUWUxFX05PUk1BTCB3aXRoIGRhcmsgZnVsbHNjcmVlbiB0aGVtZSI7CisgICAgICAgICAgICBjYXNlIDU6IHJldHVybiAiU1RZTEVfTk9STUFMIHdpdGggbGlnaHQgdGhlbWUiOworICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gIlNUWUxFX05PX1RJVExFIHdpdGggbGlnaHQgdGhlbWUiOworICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gIlNUWUxFX05PX0ZSQU1FIHdpdGggbGlnaHQgdGhlbWUiOworICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gIlNUWUxFX05PUk1BTCB3aXRoIGxpZ2h0IGZ1bGxzY3JlZW4gdGhlbWUiOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiU1RZTEVfTk9STUFMIjsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShkaWFsb2cpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeURpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworICAgICAgICBpbnQgbU51bTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIE15RGlhbG9nRnJhZ21lbnQsIHByb3ZpZGluZyAibnVtIgorICAgICAgICAgKiBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeURpYWxvZ0ZyYWdtZW50IG5ld0luc3RhbmNlKGludCBudW0pIHsKKyAgICAgICAgICAgIE15RGlhbG9nRnJhZ21lbnQgZiA9IG5ldyBNeURpYWxvZ0ZyYWdtZW50KCk7CisKKyAgICAgICAgICAgIC8vIFN1cHBseSBudW0gaW5wdXQgYXMgYW4gYXJndW1lbnQuCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0SW50KCJudW0iLCBudW0pOworICAgICAgICAgICAgZi5zZXRBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBtTnVtID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKTsKKworICAgICAgICAgICAgLy8gUGljayBhIHN0eWxlIGJhc2VkIG9uIHRoZSBudW0uCisgICAgICAgICAgICBpbnQgc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUwsIHRoZW1lID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgMTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19USVRMRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0ZSQU1FOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9fSU5QVVQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19USVRMRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0ZSQU1FOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDc6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9STUFMOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgMjogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfUGFuZWw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTGlnaHQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTGlnaHRfUGFuZWw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNzogdGhlbWUgPSBhbmRyb2lkLlIuc3R5bGUuVGhlbWVfTGlnaHQ7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIHRoZW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5mcmFnbWVudF9kaWFsb2csIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJEaWFsb2cgIyIgKyBtTnVtICsgIjogdXNpbmcgc3R5bGUgIgorICAgICAgICAgICAgICAgICAgICArIGdldE5hbWVGb3JOdW0obU51bSkpOworCisgICAgICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKXYuZmluZFZpZXdCeUlkKFIuaWQuc2hvdyk7CisgICAgICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBidXR0b24gaXMgY2xpY2tlZCwgY2FsbCB1cCB0byBvd25pbmcgYWN0aXZpdHkuCisgICAgICAgICAgICAgICAgICAgICgoRnJhZ21lbnREaWFsb2dTdXBwb3J0KWdldEFjdGl2aXR5KCkpLnNob3dEaWFsb2coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRpYWxvZykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEhpZGVTaG93U3VwcG9ydC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50SGlkZVNob3dTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0NzE2MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudEhpZGVTaG93U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBoaWRpbmcgYW5kIHNob3dpbmcgZnJhZ21lbnRzLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRIaWRlU2hvd1N1cHBvcnQgZXh0ZW5kcyBGcmFnbWVudEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfaGlkZV9zaG93X3N1cHBvcnQpOworCisgICAgICAgIC8vIFRoZSBjb250ZW50IHZpZXcgZW1iZWRzIHR3byBmcmFnbWVudHM7IG5vdyByZXRyaWV2ZSB0aGVtIGFuZCBhdHRhY2gKKyAgICAgICAgLy8gdGhlaXIgImhpZGUiIGJ1dHRvbi4KKyAgICAgICAgRnJhZ21lbnRNYW5hZ2VyIGZtID0gZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpOworICAgICAgICBhZGRTaG93SGlkZUxpc3RlbmVyKFIuaWQuZnJhZzFoaWRlLCBmbS5maW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ21lbnQxKSk7CisgICAgICAgIGFkZFNob3dIaWRlTGlzdGVuZXIoUi5pZC5mcmFnMmhpZGUsIGZtLmZpbmRGcmFnbWVudEJ5SWQoUi5pZC5mcmFnbWVudDIpKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFNob3dIaWRlTGlzdGVuZXIoaW50IGJ1dHRvbklkLCBmaW5hbCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoYnV0dG9uSWQpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGZ0LnNldEN1c3RvbUFuaW1hdGlvbnMoYW5kcm9pZC5SLmFuaW0uZmFkZV9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hbmltLmZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuaXNIaWRkZW4oKSkgeworICAgICAgICAgICAgICAgICAgICBmdC5zaG93KGZyYWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoIkhpZGUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmdC5oaWRlKGZyYWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoIlNob3ciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnQuY29tbWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlyc3RGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgVGV4dFZpZXcgbVRleHRWaWV3OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5sYWJlbGVkX3RleHRfZWRpdCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC5tc2cpOworICAgICAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiVGhlIGZyYWdtZW50IHNhdmVzIGFuZCByZXN0b3JlcyB0aGlzIHRleHQuIik7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSB0ZXh0IGVkaXRvciwgYW5kIHJlc3RvcmUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGUgaWYgbmVlZGVkLgorICAgICAgICAgICAgbVRleHRWaWV3ID0gKFRleHRWaWV3KXYuZmluZFZpZXdCeUlkKFIuaWQuc2F2ZWQpOworICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRleHRWaWV3LnNldFRleHQoc2F2ZWRJbnN0YW5jZVN0YXRlLmdldENoYXJTZXF1ZW5jZSgidGV4dCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKworICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgdGV4dCwgdG8gcmVzdG9yZSBpZiB3ZSBsYXRlciByZXN0YXJ0LgorICAgICAgICAgICAgb3V0U3RhdGUucHV0Q2hhclNlcXVlbmNlKCJ0ZXh0IiwgbVRleHRWaWV3LmdldFRleHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5sYWJlbGVkX3RleHRfZWRpdCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC5tc2cpOworICAgICAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiVGhlIFRleHRWaWV3IHNhdmVzIGFuZCByZXN0b3JlcyB0aGlzIHRleHQuIik7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSB0ZXh0IGVkaXRvciBhbmQgdGVsbCBpdCB0byBzYXZlIGFuZCByZXN0b3JlIGl0cyBzdGF0ZS4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB5b3Ugd2lsbCBvZnRlbiBzZXQgdGhpcyBpbiB0aGUgbGF5b3V0IFhNTCwgYnV0IHNpbmNlCisgICAgICAgICAgICAvLyB3ZSBhcmUgc2hhcmluZyBvdXIgbGF5b3V0IHdpdGggdGhlIG90aGVyIGZyYWdtZW50IHdlIHdpbGwgY3VzdG9taXplCisgICAgICAgICAgICAvLyBpdCBoZXJlLgorICAgICAgICAgICAgKChUZXh0Vmlldyl2LmZpbmRWaWV3QnlJZChSLmlkLnNhdmVkKSkuc2V0U2F2ZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudExheW91dFN1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudExheW91dFN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50TGF5b3V0U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuU2hha2VzcGVhcmU7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5MaXN0RnJhZ21lbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHVzaW5nIGZyYWdtZW50cyB0byBpbXBsZW1lbnQgZGlmZmVyZW50IGFjdGl2aXR5IGxheW91dHMuCisgKiBUaGlzIHNhbXBsZSBwcm92aWRlcyBhIGRpZmZlcmVudCBsYXlvdXQgKGFuZCBhY3Rpdml0eSBmbG93KSB3aGVuIHJ1biBpbgorICogbGFuZHNjYXBlLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMYXlvdXRTdXBwb3J0IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eSB7CisKKy8vQkVHSU5fSU5DTFVERShtYWluKQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9sYXlvdXRfc3VwcG9ydCk7CisgICAgfQorLy9FTkRfSU5DTFVERShtYWluKQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNlY29uZGFyeSBhY3Rpdml0eSwgdG8gc2hvdyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZAorICAgICAqIHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIHNob3cgaXQgYWxsIGluIG9uZSBhY3Rpdml0eS4KKyAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShkZXRhaWxzX2FjdGl2aXR5KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGV0YWlsc0FjdGl2aXR5IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIGlmIChnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkub3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2NyZWVuIGlzIG5vdyBpbiBsYW5kc2NhcGUgbW9kZSwgd2UgY2FuIHNob3cgdGhlCisgICAgICAgICAgICAgICAgLy8gZGlhbG9nIGluLWxpbmUgd2l0aCB0aGUgbGlzdCBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgYWN0aXZpdHkuCisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBEdXJpbmcgaW5pdGlhbCBzZXR1cCwgcGx1ZyBpbiB0aGUgZGV0YWlscyBmcmFnbWVudC4KKyAgICAgICAgICAgICAgICBEZXRhaWxzRnJhZ21lbnQgZGV0YWlscyA9IG5ldyBEZXRhaWxzRnJhZ21lbnQoKTsKKyAgICAgICAgICAgICAgICBkZXRhaWxzLnNldEFyZ3VtZW50cyhnZXRJbnRlbnQoKS5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICAgICAgZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKS5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuaWQuY29udGVudCwgZGV0YWlscykuY29tbWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGRldGFpbHNfYWN0aXZpdHkpCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSAidG9wLWxldmVsIiBmcmFnbWVudCwgc2hvd2luZyBhIGxpc3Qgb2YgaXRlbXMgdGhhdCB0aGUKKyAgICAgKiB1c2VyIGNhbiBwaWNrLiAgVXBvbiBwaWNraW5nIGFuIGl0ZW0sIGl0IHRha2VzIGNhcmUgb2YgZGlzcGxheWluZyB0aGUKKyAgICAgKiBkYXRhIHRvIHRoZSB1c2VyIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBjdXJycmVudCBVSSBsYXlvdXQuCisgICAgICovCisvL0JFR0lOX0lOQ0xVREUodGl0bGVzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGl0bGVzRnJhZ21lbnQgZXh0ZW5kcyBMaXN0RnJhZ21lbnQgeworICAgICAgICBib29sZWFuIG1EdWFsUGFuZTsKKyAgICAgICAgaW50IG1DdXJDaGVja1Bvc2l0aW9uID0gMDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gUG9wdWxhdGUgbGlzdCB3aXRoIG91ciBzdGF0aWMgYXJyYXkgb2YgdGl0bGVzLgorICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KGdldEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fY2hlY2thYmxlXzEsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwgU2hha2VzcGVhcmUuVElUTEVTKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgZnJhbWUgaW4gd2hpY2ggdG8gZW1iZWQgdGhlIGRldGFpbHMKKyAgICAgICAgICAgIC8vIGZyYWdtZW50IGRpcmVjdGx5IGluIHRoZSBjb250YWluaW5nIFVJLgorICAgICAgICAgICAgVmlldyBkZXRhaWxzRnJhbWUgPSBnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZChSLmlkLmRldGFpbHMpOworICAgICAgICAgICAgbUR1YWxQYW5lID0gZGV0YWlsc0ZyYW1lICE9IG51bGwgJiYgZGV0YWlsc0ZyYW1lLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisKKyAgICAgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgbGFzdCBzdGF0ZSBmb3IgY2hlY2tlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQ3VyQ2hlY2tQb3NpdGlvbiA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoImN1ckNob2ljZSIsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUR1YWxQYW5lKSB7CisgICAgICAgICAgICAgICAgLy8gSW4gZHVhbC1wYW5lIG1vZGUsIHRoZSBsaXN0IHZpZXcgaGlnaGxpZ2h0cyB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIFVJIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLgorICAgICAgICAgICAgICAgIHNob3dEZXRhaWxzKG1DdXJDaGVja1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoImN1ckNob2ljZSIsIG1DdXJDaGVja1Bvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIHNob3dEZXRhaWxzKHBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gc2hvdyB0aGUgZGV0YWlscyBvZiBhIHNlbGVjdGVkIGl0ZW0sIGVpdGhlciBieQorICAgICAgICAgKiBkaXNwbGF5aW5nIGEgZnJhZ21lbnQgaW4tcGxhY2UgaW4gdGhlIGN1cnJlbnQgVUksIG9yIHN0YXJ0aW5nIGEKKyAgICAgICAgICogd2hvbGUgbmV3IGFjdGl2aXR5IGluIHdoaWNoIGl0IGlzIGRpc3BsYXllZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2hvd0RldGFpbHMoaW50IGluZGV4KSB7CisgICAgICAgICAgICBtQ3VyQ2hlY2tQb3NpdGlvbiA9IGluZGV4OworCisgICAgICAgICAgICBpZiAobUR1YWxQYW5lKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGRpc3BsYXkgZXZlcnl0aGluZyBpbi1wbGFjZSB3aXRoIGZyYWdtZW50cywgc28gdXBkYXRlCisgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdG8gaGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBpdGVtIGFuZCBzaG93IHRoZSBkYXRhLgorICAgICAgICAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQoaW5kZXgsIHRydWUpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hhdCBmcmFnbWVudCBpcyBjdXJyZW50bHkgc2hvd24sIHJlcGxhY2UgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIERldGFpbHNGcmFnbWVudCBkZXRhaWxzID0gKERldGFpbHNGcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLmZpbmRGcmFnbWVudEJ5SWQoUi5pZC5kZXRhaWxzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV0YWlscyA9PSBudWxsIHx8IGRldGFpbHMuZ2V0U2hvd25JbmRleCgpICE9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgbmV3IGZyYWdtZW50IHRvIHNob3cgdGhpcyBzZWxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIGRldGFpbHMgPSBEZXRhaWxzRnJhZ21lbnQubmV3SW5zdGFuY2UoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBmcmFnbWVudAorICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoaXMgb25lIGluc2lkZSB0aGUgZnJhbWUuCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGZ0LnJlcGxhY2UoUi5pZC5kZXRhaWxzLCBkZXRhaWxzKTsKKyAgICAgICAgICAgICAgICAgICAgZnQuc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfRkFERSk7CisgICAgICAgICAgICAgICAgICAgIGZ0LmNvbW1pdCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgbmVlZCB0byBsYXVuY2ggYSBuZXcgYWN0aXZpdHkgdG8gZGlzcGxheQorICAgICAgICAgICAgICAgIC8vIHRoZSBkaWFsb2cgZnJhZ21lbnQgd2l0aCBzZWxlY3RlZCB0ZXh0LgorICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKGdldEFjdGl2aXR5KCksIERldGFpbHNBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKHRpdGxlcykKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHNlY29uZGFyeSBmcmFnbWVudCwgZGlzcGxheWluZyB0aGUgZGV0YWlscyBvZiBhIHBhcnRpY3VsYXIKKyAgICAgKiBpdGVtLgorICAgICAqLworLy9CRUdJTl9JTkNMVURFKGRldGFpbHMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXRhaWxzRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRGV0YWlsc0ZyYWdtZW50LCBpbml0aWFsaXplZCB0bworICAgICAgICAgKiBzaG93IHRoZSB0ZXh0IGF0ICdpbmRleCcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIERldGFpbHNGcmFnbWVudCBuZXdJbnN0YW5jZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIERldGFpbHNGcmFnbWVudCBmID0gbmV3IERldGFpbHNGcmFnbWVudCgpOworCisgICAgICAgICAgICAvLyBTdXBwbHkgaW5kZXggaW5wdXQgYXMgYW4gYXJndW1lbnQuCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0SW50KCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgICAgIGYuc2V0QXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U2hvd25JbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRBcmd1bWVudHMoKS5nZXRJbnQoImluZGV4IiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgZGlmZmVyZW50IGxheW91dHMsIGFuZCBpbiBvbmUgb2YgdGhlbSB0aGlzCisgICAgICAgICAgICAgICAgLy8gZnJhZ21lbnQncyBjb250YWluaW5nIGZyYW1lIGRvZXNuJ3QgZXhpc3QuICBUaGUgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICAvLyBtYXkgc3RpbGwgYmUgY3JlYXRlZCBmcm9tIGl0cyBzYXZlZCBzdGF0ZSwgYnV0IHRoZXJlIGlzCisgICAgICAgICAgICAgICAgLy8gbm8gcmVhc29uIHRvIHRyeSB0byBjcmVhdGUgaXRzIHZpZXcgaGllcmFyY2h5IGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBiZSBkaXNwbGF5ZWQuICBOb3RlIHRoaXMgaXMgbm90IG5lZWRlZCAtLSB3ZSBjb3VsZAorICAgICAgICAgICAgICAgIC8vIGp1c3QgcnVuIHRoZSBjb2RlIGJlbG93LCB3aGVyZSB3ZSB3b3VsZCBjcmVhdGUgYW5kIHJldHVybgorICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3IGhpZXJhcmNoeTsgaXQgd291bGQganVzdCBuZXZlciBiZSB1c2VkLgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY3JvbGxWaWV3IHNjcm9sbGVyID0gbmV3IFNjcm9sbFZpZXcoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgICAgICBUZXh0VmlldyB0ZXh0ID0gbmV3IFRleHRWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgaW50IHBhZGRpbmcgPSAoaW50KVR5cGVkVmFsdWUuYXBwbHlEaW1lbnNpb24oVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfRElQLAorICAgICAgICAgICAgICAgICAgICA0LCBnZXRBY3Rpdml0eSgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkpOworICAgICAgICAgICAgdGV4dC5zZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgc2Nyb2xsZXIuYWRkVmlldyh0ZXh0KTsKKyAgICAgICAgICAgIHRleHQuc2V0VGV4dChTaGFrZXNwZWFyZS5ESUFMT0dVRVtnZXRTaG93bkluZGV4KCldKTsKKyAgICAgICAgICAgIHJldHVybiBzY3JvbGxlcjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGV0YWlscykKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudExpc3RBcnJheVN1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudExpc3RBcnJheVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmNjMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50TGlzdEFycmF5U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5zdXBwb3J0LmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5TaGFrZXNwZWFyZTsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkxpc3RGcmFnbWVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgdXNpbmcgTGlzdEZyYWdtZW50IHRvIHNob3cgYSBsaXN0IG9mIGl0ZW1zCisgKiBmcm9tIGEgY2FubmVkIGFycmF5LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMaXN0QXJyYXlTdXBwb3J0IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZyYWdtZW50IGFuZCBhZGQgaXQgYXMgb3VyIHNvbGUgY29udGVudC4KKyAgICAgICAgaWYgKGdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KSA9PSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3RGcmFnbWVudCBsaXN0ID0gbmV3IEFycmF5TGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwgbGlzdCkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFycmF5TGlzdEZyYWdtZW50IGV4dGVuZHMgTGlzdEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgU2hha2VzcGVhcmUuVElUTEVTKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBMb2cuaSgiRnJhZ21lbnRMaXN0IiwgIkl0ZW0gY2xpY2tlZDogIiArIGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudE1lbnVTdXBwb3J0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRNZW51U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzMwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRNZW51U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5NZW51Q29tcGF0OworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworCisvKioKKyAqIERlbW9uc3RyYXRlcyBob3cgZnJhZ21lbnRzIGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGUgb3B0aW9ucyBtZW51LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRNZW51U3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworICAgIEZyYWdtZW50IG1GcmFnbWVudDE7CisgICAgRnJhZ21lbnQgbUZyYWdtZW50MjsKKyAgICBDaGVja0JveCBtQ2hlY2tCb3gxOworICAgIENoZWNrQm94IG1DaGVja0JveDI7CisKKyAgICAvLyBVcGRhdGUgZnJhZ21lbnQgdmlzaWJpbGl0eSB3aGVuIGNoZWNrIGJveGVzIGFyZSBjaGFuZ2VkLgorICAgIGZpbmFsIE9uQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X21lbnUpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdHdvIG1lbnUgZnJhZ21lbnRzIGFyZSBjcmVhdGVkLgorICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBmbS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1GcmFnbWVudDEgPSBmbS5maW5kRnJhZ21lbnRCeVRhZygiZjEiKTsKKyAgICAgICAgaWYgKG1GcmFnbWVudDEgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZyYWdtZW50MSA9IG5ldyBNZW51RnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGZ0LmFkZChtRnJhZ21lbnQxLCAiZjEiKTsKKyAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnQyID0gZm0uZmluZEZyYWdtZW50QnlUYWcoImYyIik7CisgICAgICAgIGlmIChtRnJhZ21lbnQyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudDIgPSBuZXcgTWVudTJGcmFnbWVudCgpOworICAgICAgICAgICAgZnQuYWRkKG1GcmFnbWVudDIsICJmMiIpOworICAgICAgICB9CisgICAgICAgIGZ0LmNvbW1pdCgpOworCisgICAgICAgIC8vIFdhdGNoIGNoZWNrIGJveCBjbGlja3MuCisgICAgICAgIG1DaGVja0JveDEgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTEpOworICAgICAgICBtQ2hlY2tCb3gxLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1DaGVja0JveDIgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTIpOworICAgICAgICBtQ2hlY2tCb3gyLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGZyYWdtZW50cyBzdGFydCBvdXQgd2l0aCBjb3JyZWN0IHZpc2liaWxpdHkuCisgICAgICAgIHVwZGF0ZUZyYWdtZW50VmlzaWJpbGl0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBmcmFnbWVudHMgYXJlIHVwZGF0ZWQgYWZ0ZXIgY2hlY2sgYm94IHZpZXcgc3RhdGUgaXMgcmVzdG9yZWQuCisgICAgICAgIHVwZGF0ZUZyYWdtZW50VmlzaWJpbGl0eSgpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSBmcmFnbWVudCB2aXNpYmlsaXR5IGJhc2VkIG9uIGN1cnJlbnQgY2hlY2sgYm94IHN0YXRlLgorICAgIHZvaWQgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCkgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKG1DaGVja0JveDEuaXNDaGVja2VkKCkpIGZ0LnNob3cobUZyYWdtZW50MSk7CisgICAgICAgIGVsc2UgZnQuaGlkZShtRnJhZ21lbnQxKTsKKyAgICAgICAgaWYgKG1DaGVja0JveDIuaXNDaGVja2VkKCkpIGZ0LnNob3cobUZyYWdtZW50Mik7CisgICAgICAgIGVsc2UgZnQuaGlkZShtRnJhZ21lbnQyKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbWVudS4gIFRoaXMgZnJhZ21lbnQgaGFwcGVucyB0byBub3QKKyAgICAgKiBoYXZlIGEgVUkgKGl0IGRvZXMgbm90IGltcGxlbWVudCBvbkNyZWF0ZVZpZXcpLCBidXQgaXQgY291bGQgYWxzbworICAgICAqIGhhdmUgb25lIGlmIGl0IHdhbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lbnVGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW07CisgICAgICAgICAgICBpdGVtID0gbWVudS5hZGQoIk1lbnUgMWEiKTsKKyAgICAgICAgICAgIE1lbnVDb21wYXQuc2V0U2hvd0FzQWN0aW9uKGl0ZW0sIE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgaXRlbSA9IG1lbnUuYWRkKCJNZW51IDFiIik7CisgICAgICAgICAgICBNZW51Q29tcGF0LnNldFNob3dBc0FjdGlvbihpdGVtLCBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlY29uZCBmcmFnbWVudCB3aXRoIGEgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lbnUyRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICBNZW51SXRlbSBpdGVtOworICAgICAgICAgICAgaXRlbSA9IG1lbnUuYWRkKCJNZW51IDIiKTsKKyAgICAgICAgICAgIE1lbnVDb21wYXQuc2V0U2hvd0FzQWN0aW9uKGl0ZW0sIE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50UGFnZXJTdXBwb3J0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRQYWdlclN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQyOWFjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50UGFnZXJTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5zdXBwb3J0LmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5TaGFrZXNwZWFyZTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRQYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50UGFnZXJTdXBwb3J0IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eQorICAgICAgICBpbXBsZW1lbnRzIEZyYWdtZW50UGFnZXIuQWRhcHRlciB7CisgICAgc3RhdGljIGZpbmFsIGludCBOVU1fSVRFTVMgPSAxMDsKKworICAgIEZyYWdtZW50UGFnZXIgbVBhZ2VyOworICAgIGludCBtQ3VyUG9zOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9wYWdlcik7CisKKyAgICAgICAgbVBhZ2VyID0gKEZyYWdtZW50UGFnZXIpZmluZFZpZXdCeUlkKFIuaWQucGFnZXIpOworICAgICAgICBtUGFnZXIuc2V0QWRhcHRlcih0aGlzKTsKKworICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQubmV3X2ZyYWdtZW50KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtQ3VyUG9zKys7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJQb3MgPCBOVU1fSVRFTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBhZ2VyLnNldEN1cnJlbnRJdGVtKG1DdXJQb3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJQb3MtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBOVU1fSVRFTVM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZyYWdtZW50IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJldHVybiBBcnJheUxpc3RGcmFnbWVudC5uZXdJbnN0YW5jZShwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcnJheUxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgICAgIGludCBtTnVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQ291bnRpbmdGcmFnbWVudCwgcHJvdmlkaW5nICJudW0iCisgICAgICAgICAqIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIEFycmF5TGlzdEZyYWdtZW50IG5ld0luc3RhbmNlKGludCBudW0pIHsKKyAgICAgICAgICAgIEFycmF5TGlzdEZyYWdtZW50IGYgPSBuZXcgQXJyYXlMaXN0RnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IG51bSBpbnB1dCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoIm51bSIsIG51bSk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBjcmVhdGluZywgcmV0cmlldmUgdGhpcyBpbnN0YW5jZSdzIG51bWJlciBmcm9tIGl0cyBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIG1OdW0gPSBnZXRBcmd1bWVudHMoKSAhPSBudWxsID8gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKSA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEZyYWdtZW50J3MgVUkgaXMganVzdCBhIHNpbXBsZSB0ZXh0IHZpZXcgc2hvd2luZyBpdHMKKyAgICAgICAgICogaW5zdGFuY2UgbnVtYmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X3BhZ2VyX2xpc3QsIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJGcmFnbWVudCAjIiArIG1OdW0pOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgU2hha2VzcGVhcmUuVElUTEVTKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBMb2cuaSgiRnJhZ21lbnRMaXN0IiwgIkl0ZW0gY2xpY2tlZDogIiArIGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudFJlY2VpdmVSZXN1bHRTdXBwb3J0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzBlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLlNlbmRSZXN1bHQ7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRSZWNlaXZlUmVzdWx0U3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgRnJhbWVMYXlvdXQgZnJhbWUgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGZyYW1lLnNldElkKFIuaWQuc2ltcGxlX2ZyYWdtZW50KTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoZnJhbWUsIGxwKTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIERvIGZpcnN0IHRpbWUgaW5pdGlhbGl6YXRpb24gLS0gYWRkIGZyYWdtZW50LgorICAgICAgICAgICAgRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBuZXcgUmVjZWl2ZVJlc3VsdEZyYWdtZW50KCk7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLnNpbXBsZV9mcmFnbWVudCwgbmV3RnJhZ21lbnQpLmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWNlaXZlUmVzdWx0RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIC8vIERlZmluaXRpb24gb2YgdGhlIG9uZSByZXF1ZXN0Q29kZSB3ZSB1c2UgZm9yIHJlY2VpdmluZyByZXN1bHMuCisgICAgICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBHRVRfQ09ERSA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtUmVzdWx0czsKKworICAgICAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtR2V0TGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgYWN0aXZpdHkgd2hvc2UgcmVzdWx0IHdlIHdhbnQgdG8gcmV0cmlldmUuICBUaGUKKyAgICAgICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBjb21lIGJhY2sgd2l0aCByZXF1ZXN0IGNvZGUgR0VUX0NPREUuCisgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoZ2V0QWN0aXZpdHkoKSwgU2VuZFJlc3VsdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIEdFVF9DT0RFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQucmVjZWl2ZV9yZXN1bHQsIGNvbnRhaW5lciwgZmFsc2UpOworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgVGV4dFZpZXcgd2lkZ2V0IHRoYXQgd2lsbCBkaXNwbGF5IHJlc3VsdHMuCisgICAgICAgICAgICBtUmVzdWx0cyA9IChUZXh0Vmlldyl2LmZpbmRWaWV3QnlJZChSLmlkLnJlc3VsdHMpOworCisgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBsYXRlciBleHRlbmQgdGhlIHRleHQgYnVmZmVyLgorICAgICAgICAgICAgbVJlc3VsdHMuc2V0VGV4dChtUmVzdWx0cy5nZXRUZXh0KCksIFRleHRWaWV3LkJ1ZmZlclR5cGUuRURJVEFCTEUpOworCisgICAgICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgICAgIEJ1dHRvbiBnZXRCdXR0b24gPSAoQnV0dG9uKXYuZmluZFZpZXdCeUlkKFIuaWQuZ2V0KTsKKyAgICAgICAgICAgIGdldEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUdldExpc3RlbmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNlbmRpbmcgYWN0aXZpdHkgaGFzIGZpbmlzaGVkLCB3aXRoIHRoZQorICAgICAgICAgKiByZXN1bHQgaXQgc3VwcGxpZWQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgICAgICAgICAgLy8gWW91IGNhbiB1c2UgdGhlIHJlcXVlc3RDb2RlIHRvIHNlbGVjdCBiZXR3ZWVuIG11bHRpcGxlIGNoaWxkCisgICAgICAgICAgICAvLyBhY3Rpdml0aWVzIHlvdSBtYXkgaGF2ZSBzdGFydGVkLiAgSGVyZSB0aGVyZSBpcyBvbmx5IG9uZSB0aGluZworICAgICAgICAgICAgLy8gd2UgbGF1bmNoLgorICAgICAgICAgICAgaWYgKHJlcXVlc3RDb2RlID09IEdFVF9DT0RFKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGJlIGFkZGluZyB0byBvdXIgdGV4dC4KKyAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKEVkaXRhYmxlKW1SZXN1bHRzLmdldFRleHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFuZGFyZCByZXN1bHRDb2RlIHRoYXQgaXMgc2VudCBiYWNrIGlmIHRoZQorICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGRvZXNuJ3Qgc3VwcGx5IGFuIGV4cGxpY2l0IHJlc3VsdC4gIEl0IHdpbGwgYWxzbworICAgICAgICAgICAgICAgIC8vIGJlIHJldHVybmVkIGlmIHRoZSBhY3Rpdml0eSBmYWlsZWQgdG8gbGF1bmNoLgorICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IFJFU1VMVF9DQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgiKGNhbmNlbGxlZCkiKTsKKworICAgICAgICAgICAgICAgIC8vIE91ciBwcm90b2NvbCB3aXRoIHRoZSBzZW5kaW5nIGFjdGl2aXR5IGlzIHRoYXQgaXQgd2lsbCBzZW5kCisgICAgICAgICAgICAgICAgLy8gdGV4dCBpbiAnZGF0YScgYXMgaXRzIHJlc3VsdC4KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgiKG9rYXkgIik7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocmVzdWx0Q29kZSkpOworICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgiKSAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoZGF0YS5nZXRBY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlU3VwcG9ydC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0ZyYWdtZW50UmV0YWluSW5zdGFuY2VTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMGNmYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuc3VwcG9ydC5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qcm9ncmVzc0JhcjsKKworLyoqCisgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBjYW4gdXNlIGEgRnJhZ21lbnQgdG8gZWFzaWx5IHByb3BhZ2F0ZSBzdGF0ZQorICogKHN1Y2ggYXMgdGhyZWFkcykgYWNyb3NzIGFjdGl2aXR5IGluc3RhbmNlcyB3aGVuIGFuIGFjdGl2aXR5IG5lZWRzIHRvIGJlCisgKiByZXN0YXJ0ZWQgZHVlIHRvLCBmb3IgZXhhbXBsZSwgYSBjb25maWd1cmF0aW9uIGNoYW5nZS4gIFRoaXMgaXMgYSBsb3QKKyAqIGVhc2llciB0aGFuIHVzaW5nIHRoZSByYXcgQWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW5JbnN0YW5jZSgpIEFQSS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50UmV0YWluSW5zdGFuY2VTdXBwb3J0IGV4dGVuZHMgRnJhZ21lbnRBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIEZpcnN0IHRpbWUgaW5pdCwgY3JlYXRlIHRoZSBVSS4KKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpLmFkZChhbmRyb2lkLlIuaWQuY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFVpRnJhZ21lbnQoKSkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgZnJhZ21lbnQgc2hvd2luZyBVSSB0aGF0IHdpbGwgYmUgdXBkYXRlZCBmcm9tIHdvcmsgZG9uZQorICAgICAqIGluIHRoZSByZXRhaW5lZCBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVpRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIFJldGFpbmVkRnJhZ21lbnQgbVdvcmtGcmFnbWVudDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlLCBjb250YWluZXIsIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbil2LmZpbmRWaWV3QnlJZChSLmlkLnJlc3RhcnQpOworICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQucmVzdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgcmV0YWluZWQgdGhlIHdvcmtlciBmcmFnbWVudC4KKyAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQgPSAoUmV0YWluZWRGcmFnbWVudClmbS5maW5kRnJhZ21lbnRCeVRhZygid29yayIpOworCisgICAgICAgICAgICAvLyBJZiBub3QgcmV0YWluZWQgKG9yIGZpcnN0IHRpbWUgcnVubmluZyksIHdlIG5lZWQgdG8gY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKG1Xb3JrRnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Xb3JrRnJhZ21lbnQgPSBuZXcgUmV0YWluZWRGcmFnbWVudCgpOworICAgICAgICAgICAgICAgIC8vIFRlbGwgaXQgd2hvIGl0IGlzIHdvcmtpbmcgd2l0aC4KKyAgICAgICAgICAgICAgICBtV29ya0ZyYWdtZW50LnNldFRhcmdldEZyYWdtZW50KHRoaXMsIDApOworICAgICAgICAgICAgICAgIGZtLmJlZ2luVHJhbnNhY3Rpb24oKS5hZGQobVdvcmtGcmFnbWVudCwgIndvcmsiKS5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgRnJhZ21lbnQgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIHJldGFpbmVkIGFjcm9zcworICAgICAqIGFjdGl2aXR5IGluc3RhbmNlcy4gIEl0IHJlcHJlc2VudHMgc29tZSBvbmdvaW5nIHdvcmssIGhlcmUgYSB0aHJlYWQKKyAgICAgKiB3ZSBoYXZlIHRoYXQgc2l0cyBhcm91bmQgaW5jcmVtZW50aW5nIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV0YWluZWRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzQmFyOworICAgICAgICBpbnQgbVBvc2l0aW9uOworICAgICAgICBib29sZWFuIG1SZWFkeSA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1RdWl0aW5nID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIHRocmVhZCB0aGF0IHdpbGwgZG8gb3VyIHdvcmsuICBJdCBzaXRzIGluIGEgbG9vcCBydW5uaW5nCisgICAgICAgICAqIHRoZSBwcm9ncmVzcyB1cCB1bnRpbCBpdCBoYXMgcmVhY2hlZCB0aGUgdG9wLCB0aGVuIHN0b3BzIGFuZCB3YWl0cy4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFRocmVhZCBtVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGZpZ3VyZSB0aGUgcmVhbCB2YWx1ZSBvdXQgbGF0ZXIuCisgICAgICAgICAgICAgICAgaW50IG1heCA9IDEwMDAwOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgcnVucyBhbG1vc3QgZm9yZXZlci4KKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgc2hhcmVkIHN0YXRlIHdpdGggdGhlIFVJLgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91ciB0aHJlYWQgaXMgc3RvcHBlZCBpZiB0aGUgVUkgaXMgbm90IHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCBoYXMgY29tcGxldGVkIGl0cyB3b3JrLgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFtUmVhZHkgfHwgbVBvc2l0aW9uID49IG1heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUXVpdGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdXBkYXRlIHRoZSBwcm9ncmVzcy4gIE5vdGUgaXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRvdWNoIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCB0aGUgbG9jayBoZWxkLCBzbyBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBkaXNhcHBlYXIgb24gdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1Qcm9ncmVzc0Jhci5nZXRNYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0Jhci5zZXRQcm9ncmVzcyhtUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2Ugd291bGQgYmUgZG9pbmcgc29tZSB3b3JrLCBidXQgcHV0IGEga2x1ZGdlCisgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgdG8gcHJldGVuZCBsaWtlIHdlIGFyZS4KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQoNTApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGcmFnbWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdheSB3ZSB3YW50IHRvIGJlIHJldGFpbmVkIGFuZAorICAgICAgICAgKiBzdGFydCBvdXIgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGZyYW1ld29yayB0byB0cnkgdG8ga2VlcCB0aGlzIGZyYWdtZW50IGFyb3VuZAorICAgICAgICAgICAgLy8gZHVyaW5nIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICBzZXRSZXRhaW5JbnN0YW5jZSh0cnVlKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgdXAgdGhlIHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQncyBBY3Rpdml0eSBpcyByZWFkeSB0byBnbywgYWZ0ZXIKKyAgICAgICAgICogaXRzIGNvbnRlbnQgdmlldyBoYXMgYmVlbiBpbnN0YWxsZWQ7IGl0IGlzIGNhbGxlZCBib3RoIGFmdGVyCisgICAgICAgICAqIHRoZSBpbml0aWFsIGZyYWdtZW50IGNyZWF0aW9uIGFuZCBhZnRlciB0aGUgZnJhZ21lbnQgaXMgcmUtYXR0YWNoZWQKKyAgICAgICAgICogdG8gYSBuZXcgYWN0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHByb2dyZXNzIGJhciBmcm9tIHRoZSB0YXJnZXQncyB2aWV3IGhpZXJhcmNoeS4KKyAgICAgICAgICAgIG1Qcm9ncmVzc0JhciA9IChQcm9ncmVzc0JhcilnZXRUYXJnZXRGcmFnbWVudCgpLmdldFZpZXcoKS5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIFIuaWQucHJvZ3Jlc3NfaG9yaXpvbnRhbCk7CisKKyAgICAgICAgICAgIC8vIFdlIGFyZSByZWFkeSBmb3Igb3VyIHRocmVhZCB0byBnby4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZCkgeworICAgICAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRocmVhZC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBnb2luZyBhd2F5LiAgSXQgaXMgTk9UIGNhbGxlZAorICAgICAgICAgKiB3aGVuIHRoZSBmcmFnbWVudCBpcyBiZWluZyBwcm9wYWdhdGVkIGJldHdlZW4gYWN0aXZpdHkgaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHRocmVhZCBnbyBhd2F5LgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVF1aXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgZGV0YWNoZWQgZnJvbSBpdHMKKyAgICAgICAgICogY3VycmVudCBhY3Rpdml0eSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgZGV0YWNoZWQgZnJvbSBpdHMgYWN0aXZpdHkuICBXZSBuZWVkCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgaXRzIHRocmVhZCBpcyBub3QgZ29pbmcgdG8gdG91Y2ggYW55IGFjdGl2aXR5CisgICAgICAgICAgICAvLyBzdGF0ZSBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQmFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkLm5vdGlmeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBlci5vbkRldGFjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFQSSBmb3Igb3VyIFVJIHRvIHJlc3RhcnQgdGhlIHByb2dyZXNzIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3RhcnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRTdGFja1N1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9GcmFnbWVudFN0YWNrU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDcyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvRnJhZ21lbnRTdGFja1N1cHBvcnQuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnN1cHBvcnQuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRTdGFja1N1cHBvcnQgZXh0ZW5kcyBGcmFnbWVudEFjdGl2aXR5IHsKKyAgICBpbnQgbVN0YWNrTGV2ZWwgPSAxOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9zdGFjayk7CisKKyAgICAgICAgLy8gV2F0Y2ggZm9yIGJ1dHRvbiBjbGlja3MuCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLm5ld19mcmFnbWVudCk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYWRkRnJhZ21lbnRUb1N0YWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRG8gZmlyc3QgdGltZSBpbml0aWFsaXphdGlvbiAtLSBhZGQgaW5pdGlhbCBmcmFnbWVudC4KKyAgICAgICAgICAgIEZyYWdtZW50IG5ld0ZyYWdtZW50ID0gQ291bnRpbmdGcmFnbWVudC5uZXdJbnN0YW5jZShtU3RhY2tMZXZlbCk7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0U3VwcG9ydEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLnNpbXBsZV9mcmFnbWVudCwgbmV3RnJhZ21lbnQpLmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YWNrTGV2ZWwgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJsZXZlbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgICAgIG91dFN0YXRlLnB1dEludCgibGV2ZWwiLCBtU3RhY2tMZXZlbCk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoYWRkX3N0YWNrKQorICAgIHZvaWQgYWRkRnJhZ21lbnRUb1N0YWNrKCkgeworICAgICAgICBtU3RhY2tMZXZlbCsrOworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IGZyYWdtZW50LgorICAgICAgICBGcmFnbWVudCBuZXdGcmFnbWVudCA9IENvdW50aW5nRnJhZ21lbnQubmV3SW5zdGFuY2UobVN0YWNrTGV2ZWwpOworCisgICAgICAgIC8vIEFkZCB0aGUgZnJhZ21lbnQgdG8gdGhlIGFjdGl2aXR5LCBwdXNoaW5nIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgLy8gb24gdG8gdGhlIGJhY2sgc3RhY2suCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRTdXBwb3J0RnJhZ21lbnRNYW5hZ2VyKCkuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmdC5yZXBsYWNlKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCk7CisgICAgICAgIGZ0LnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU4pOworICAgICAgICBmdC5hZGRUb0JhY2tTdGFjayhudWxsKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorLy9FTkRfSU5DTFVERShhZGRfc3RhY2spCisKKy8vQkVHSU5fSU5DTFVERShmcmFnbWVudCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50aW5nRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIGludCBtTnVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQ291bnRpbmdGcmFnbWVudCwgcHJvdmlkaW5nICJudW0iCisgICAgICAgICAqIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIENvdW50aW5nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IG51bSkgeworICAgICAgICAgICAgQ291bnRpbmdGcmFnbWVudCBmID0gbmV3IENvdW50aW5nRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IG51bSBpbnB1dCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoIm51bSIsIG51bSk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBjcmVhdGluZywgcmV0cmlldmUgdGhpcyBpbnN0YW5jZSdzIG51bWJlciBmcm9tIGl0cyBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIG1OdW0gPSBnZXRBcmd1bWVudHMoKSAhPSBudWxsID8gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKSA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEZyYWdtZW50J3MgVUkgaXMganVzdCBhIHNpbXBsZSB0ZXh0IHZpZXcgc2hvd2luZyBpdHMKKyAgICAgICAgICogaW5zdGFuY2UgbnVtYmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmhlbGxvX3dvcmxkLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiRnJhZ21lbnQgIyIgKyBtTnVtKTsKKyAgICAgICAgICAgIHR2LnNldEJhY2tncm91bmREcmF3YWJsZShnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShhbmRyb2lkLlIuZHJhd2FibGUuZ2FsbGVyeV90aHVtYikpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKGZyYWdtZW50KQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3N1cHBvcnQvYXBwL0xvYWRlckN1cnNvclN1cHBvcnQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9Mb2FkZXJDdXJzb3JTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxYWUwZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9Mb2FkZXJDdXJzb3JTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5zdXBwb3J0LmFwcDsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkxvYWRlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ3Vyc29yTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHRoZSB1c2Ugb2YgYSBDdXJzb3JMb2FkZXIgdG8gbG9hZCBhbmQgZGlzcGxheSBjb250YWN0cworICogZGF0YSBpbiBhIGZyYWdtZW50LgorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyQ3Vyc29yU3VwcG9ydCBleHRlbmRzIEZyYWdtZW50QWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgQ3Vyc29yTG9hZGVyTGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBmbS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBsaXN0KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGZyYWdtZW50X2N1cnNvcikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnNvckxvYWRlckxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudAorICAgICAgICAgICAgaW1wbGVtZW50cyBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxDdXJzb3I+IHsKKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBBZGFwdGVyIGJlaW5nIHVzZWQgdG8gZGlzcGxheSB0aGUgbGlzdCdzIGRhdGEuCisgICAgICAgIFNpbXBsZUN1cnNvckFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICAgICAgLy8gSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIGN1cnJlbnQgZmlsdGVyIHRoZSB1c2VyIGhhcyBwcm92aWRlZC4KKyAgICAgICAgU3RyaW5nIG1DdXJGaWx0ZXI7CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0ZXh0IHRvIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gZGF0YS4gIEluIGEgcmVhbAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gdGhpcyB3b3VsZCBjb21lIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgIHNldEVtcHR5VGV4dCgiTm8gcGhvbmUgbnVtYmVycyIpOworCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWVudSBpdGVtIHRvIHNob3cgaW4gYWN0aW9uIGJhci4KKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYWRhcHRlciB3ZSB3aWxsIHVzZSB0byBkaXNwbGF5IHRoZSBsb2FkZWQgZGF0YS4KKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnRhY3RzLkRJU1BMQVlfTkFNRSwgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSwgMCk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIGxvYWRlci4gIEVpdGhlciByZS1jb25uZWN0IHdpdGggYW4gZXhpc3Rpbmcgb25lLAorICAgICAgICAgICAgLy8gb3Igc3RhcnQgYSBuZXcgb25lLgorICAgICAgICAgICAgZ2V0TG9hZGVyTWFuYWdlcigpLmluaXRMb2FkZXIoMCwgbnVsbCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICAgICAgLy8gUGxhY2UgYW4gYWN0aW9uIGJhciBpdGVtIGZvciBzZWFyY2hpbmcuCisgICAgICAgICAgICAvL01lbnVJdGVtIGl0ZW0gPSBtZW51LmFkZCgiU2VhcmNoIik7CisgICAgICAgICAgICAvL2l0ZW0uc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfbWVudV9zZWFyY2gpOworICAgICAgICAgICAgLy9pdGVtLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgICAgIC8vU2VhcmNoVmlldyBzdiA9IG5ldyBTZWFyY2hWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgLy9zdi5zZXRPblF1ZXJ5VGV4dExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgLy9pdGVtLnNldEFjdGlvblZpZXcoc3YpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2UoU3RyaW5nIG5ld1RleHQpIHsKKyAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhY3Rpb24gYmFyIHNlYXJjaCB0ZXh0IGhhcyBjaGFuZ2VkLiAgVXBkYXRlCisgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIGZpbHRlciwgYW5kIHJlc3RhcnQgdGhlIGxvYWRlciB0byBkbyBhIG5ldyBxdWVyeQorICAgICAgICAgICAgLy8gd2l0aCB0aGlzIGZpbHRlci4KKyAgICAgICAgICAgIG1DdXJGaWx0ZXIgPSAhVGV4dFV0aWxzLmlzRW1wdHkobmV3VGV4dCkgPyBuZXdUZXh0IDogbnVsbDsKKyAgICAgICAgICAgIGdldExvYWRlck1hbmFnZXIoKS5yZXN0YXJ0TG9hZGVyKDAsIG51bGwsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgZGVzaXJlZCBiZWhhdmlvciBoZXJlLgorICAgICAgICAgICAgTG9nLmkoIkZyYWdtZW50Q29tcGxleExpc3QiLCAiSXRlbSBjbGlja2VkOiAiICsgaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBDb250YWN0cyByb3dzIHRoYXQgd2Ugd2lsbCByZXRyaWV2ZS4KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RTX1NVTU1BUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBDb250YWN0cy5fSUQsCisgICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCisgICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKKyAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCisgICAgICAgICAgICBDb250YWN0cy5QSE9UT19JRCwKKyAgICAgICAgICAgIENvbnRhY3RzLkxPT0tVUF9LRVksCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIExvYWRlcjxDdXJzb3I+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBuZXcgTG9hZGVyIG5lZWRzIHRvIGJlIGNyZWF0ZWQuICBUaGlzCisgICAgICAgICAgICAvLyBzYW1wbGUgb25seSBoYXMgb25lIExvYWRlciwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgSUQuCisgICAgICAgICAgICAvLyBGaXJzdCwgcGljayB0aGUgYmFzZSBVUkkgdG8gdXNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZQorICAgICAgICAgICAgLy8gY3VycmVudGx5IGZpbHRlcmluZy4KKyAgICAgICAgICAgIFVyaSBiYXNlVXJpOworICAgICAgICAgICAgaWYgKG1DdXJGaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJhc2VVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChDb250YWN0cy5DT05URU5UX0ZJTFRFUl9VUkksCisgICAgICAgICAgICAgICAgICAgICAgICBVcmkuZW5jb2RlKG1DdXJGaWx0ZXIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFzZVVyaSA9IENvbnRhY3RzLkNPTlRFTlRfVVJJOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgY3JlYXRlIGFuZCByZXR1cm4gYSBDdXJzb3JMb2FkZXIgdGhhdCB3aWxsIHRha2UgY2FyZSBvZgorICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBDdXJzb3IgZm9yIHRoZSBkYXRhIGJlaW5nIGRpc3BsYXllZC4KKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3QgPSAiKCgiICsgQ29udGFjdHMuRElTUExBWV9OQU1FICsgIiBOT1ROVUxMKSBBTkQgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBDb250YWN0cy5IQVNfUEhPTkVfTlVNQkVSICsgIj0xKSBBTkQgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBDb250YWN0cy5ESVNQTEFZX05BTUUgKyAiICE9ICcnICkpIjsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yTG9hZGVyKGdldEFjdGl2aXR5KCksIGJhc2VVcmksCisgICAgICAgICAgICAgICAgICAgIENPTlRBQ1RTX1NVTU1BUllfUFJPSkVDVElPTiwgc2VsZWN0LCBudWxsLAorICAgICAgICAgICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUgKyAiIENPTExBVEUgTE9DQUxJWkVEIEFTQyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyLCBDdXJzb3IgZGF0YSkgeworICAgICAgICAgICAgLy8gU3dhcCB0aGUgbmV3IGN1cnNvciBpbi4gIChUaGUgZnJhbWV3b3JrIHdpbGwgdGFrZSBjYXJlIG9mIGNsb3NpbmcgdGhlCisgICAgICAgICAgICAvLyBvbGQgY3Vyc29yIG9uY2Ugd2UgcmV0dXJuLikKKyAgICAgICAgICAgIG1BZGFwdGVyLnN3YXBDdXJzb3IoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRlclJlc2V0KExvYWRlcjxDdXJzb3I+IGxvYWRlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbGFzdCBDdXJzb3IgcHJvdmlkZWQgdG8gb25Mb2FkRmluaXNoZWQoKQorICAgICAgICAgICAgLy8gYWJvdmUgaXMgYWJvdXQgdG8gYmUgY2xvc2VkLiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgYXJlIG5vCisgICAgICAgICAgICAvLyBsb25nZXIgdXNpbmcgaXQuCisgICAgICAgICAgICBtQWRhcHRlci5zd2FwQ3Vyc29yKG51bGwpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShmcmFnbWVudF9jdXJzb3IpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvTG9hZGVyVGhyb3R0bGVTdXBwb3J0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvc3VwcG9ydC9hcHAvTG9hZGVyVGhyb3R0bGVTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmNGFmNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2FwcC9Mb2FkZXJUaHJvdHRsZVN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDUwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnN1cHBvcnQuYXBwOworCisvL0JFR0lOX0lOQ0xVREUoY29tcGxldGUpCitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuTG9hZGVyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuY29udGVudC5DdXJzb3JMb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnlCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIERlbW9uc3RyYXRpb24gb2YgYm90dG9tIHRvIHRvcCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbnRlbnQgcHJvdmlkZXIgaG9sZGluZworICogc3RydWN0dXJlZCBkYXRhIHRocm91Z2ggZGlzcGxheWluZyBpdCBpbiB0aGUgVUksIHVzaW5nIHRocm90dGxpbmcgdG8gcmVkdWNlCisgKiB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgZG9uZSB3aGVuIGl0cyBkYXRhIGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJUaHJvdHRsZVN1cHBvcnQgZXh0ZW5kcyBGcmFnbWVudEFjdGl2aXR5IHsKKyAgICAvLyBEZWJ1Z2dpbmcuCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9hZGVyVGhyb3R0bGUiOworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvcml0eSB3ZSB1c2UgdG8gZ2V0IHRvIG91ciBzYW1wbGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5zdXBwb3J0LmFwcC5Mb2FkZXJUaHJvdHRsZSI7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbml0aW9uIG9mIHRoZSBjb250cmFjdCBmb3IgdGhlIG1haW4gdGFibGUgb2Ygb3VyIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWFpblRhYmxlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIC8vIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICBwcml2YXRlIE1haW5UYWJsZSgpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0YWJsZSBuYW1lIG9mZmVyZWQgYnkgdGhpcyBwcm92aWRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJtYWluIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9ICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9tYWluIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50IFVSSSBiYXNlIGZvciBhIHNpbmdsZSByb3cgb2YgZGF0YS4gQ2FsbGVycyBtdXN0CisgICAgICAgICAqIGFwcGVuZCBhIG51bWVyaWMgcm93IGlkIHRvIHRoaXMgVXJpIHRvIHJldHJpZXZlIGEgcm93CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0lEX1VSSV9CQVNFCisgICAgICAgICAgICAgICAgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9tYWluLyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFCisgICAgICAgICAgICAgICAgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci92bmQuZXhhbXBsZS5hcGktZGVtb3MtdGhyb3R0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSByb3cuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRQorICAgICAgICAgICAgICAgID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5leGFtcGxlLmFwaS1kZW1vcy10aHJvdHRsZSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiZGF0YSBDT0xMQVRFIExPQ0FMSVpFRCBBU0MiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb2x1bW4gbmFtZSBmb3IgdGhlIHNpbmdsZSBjb2x1bW4gaG9sZGluZyBvdXIgZGF0YS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FX0RBVEEgPSAiZGF0YSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBoZWxwcyBvcGVuLCBjcmVhdGUsIGFuZCB1cGdyYWRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAqLworICAgc3RhdGljIGNsYXNzIERhdGFiYXNlSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CisKKyAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfTkFNRSA9ICJsb2FkZXJfdGhyb3R0bGUuZGIiOworICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gMjsKKworICAgICAgIERhdGFiYXNlSGVscGVyKENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgICAgIC8vIGNhbGxzIHRoZSBzdXBlciBjb25zdHJ1Y3RvciwgcmVxdWVzdGluZyB0aGUgZGVmYXVsdCBjdXJzb3IgZmFjdG9yeS4KKyAgICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgfQorCisgICAgICAgLyoqCisgICAgICAgICoKKyAgICAgICAgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHdpdGggdGFibGUgbmFtZSBhbmQgY29sdW1uIG5hbWVzIHRha2VuIGZyb20gdGhlCisgICAgICAgICogTm90ZVBhZCBjbGFzcy4KKyAgICAgICAgKi8KKyAgICAgICBAT3ZlcnJpZGUKKyAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICBkYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIE1haW5UYWJsZS5UQUJMRV9OQU1FICsgIiAoIgorICAgICAgICAgICAgICAgICAgICsgTWFpblRhYmxlLl9JRCArICIgSU5URUdFUiBQUklNQVJZIEtFWSwiCisgICAgICAgICAgICAgICAgICAgKyBNYWluVGFibGUuQ09MVU1OX05BTUVfREFUQSArICIgVEVYVCIKKyAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqCisgICAgICAgICogRGVtb25zdHJhdGVzIHRoYXQgdGhlIHByb3ZpZGVyIG11c3QgY29uc2lkZXIgd2hhdCBoYXBwZW5zIHdoZW4gdGhlCisgICAgICAgICogdW5kZXJseWluZyBkYXRhc3RvcmUgaXMgY2hhbmdlZC4gSW4gdGhpcyBzYW1wbGUsIHRoZSBkYXRhYmFzZSBpcyB1cGdyYWRlZCB0aGUgZGF0YWJhc2UKKyAgICAgICAgKiBieSBkZXN0cm95aW5nIHRoZSBleGlzdGluZyBkYXRhLgorICAgICAgICAqIEEgcmVhbCBhcHBsaWNhdGlvbiBzaG91bGQgdXBncmFkZSB0aGUgZGF0YWJhc2UgaW4gcGxhY2UuCisgICAgICAgICovCisgICAgICAgQE92ZXJyaWRlCisgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKworICAgICAgICAgICAvLyBMb2dzIHRoYXQgdGhlIGRhdGFiYXNlIGlzIGJlaW5nIHVwZ3JhZGVkCisgICAgICAgICAgIExvZy53KFRBRywgIlVwZ3JhZGluZyBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArIG9sZFZlcnNpb24gKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICArIG5ld1ZlcnNpb24gKyAiLCB3aGljaCB3aWxsIGRlc3Ryb3kgYWxsIG9sZCBkYXRhIik7CisKKyAgICAgICAgICAgLy8gS2lsbHMgdGhlIHRhYmxlIGFuZCBleGlzdGluZyBkYXRhCisgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTIG5vdGVzIik7CisKKyAgICAgICAgICAgLy8gUmVjcmVhdGVzIHRoZSBkYXRhYmFzZSB3aXRoIGEgbmV3IHZlcnNpb24KKyAgICAgICAgICAgb25DcmVhdGUoZGIpOworICAgICAgIH0KKyAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmVyeSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgICAgICAvLyBBIHByb2plY3Rpb24gbWFwIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtTm90ZXNQcm9qZWN0aW9uTWFwOworICAgICAgICAvLyBVcmkgbWF0Y2hlciB0byBkZWNvZGUgaW5jb21pbmcgVVJJcy4KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVcmlNYXRjaGVyIG1VcmlNYXRjaGVyOworCisgICAgICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgbWFpbiB0YWJsZSBVUkkgcGF0dGVybgorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFJTiA9IDE7CisgICAgICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgbWFpbiB0YWJsZSByb3cgSUQgVVJJIHBhdHRlcm4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BSU5fSUQgPSAyOworCisgICAgICAgIC8vIEhhbmRsZSB0byBhIG5ldyBEYXRhYmFzZUhlbHBlci4KKyAgICAgICAgcHJpdmF0ZSBEYXRhYmFzZUhlbHBlciBtT3BlbkhlbHBlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2xvYmFsIHByb3ZpZGVyIGluaXRpYWxpemF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNpbXBsZVByb3ZpZGVyKCkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIFVSSSBtYXRjaGVyLgorICAgICAgICAgICAgbVVyaU1hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcihVcmlNYXRjaGVyLk5PX01BVENIKTsKKyAgICAgICAgICAgIG1VcmlNYXRjaGVyLmFkZFVSSShBVVRIT1JJVFksIE1haW5UYWJsZS5UQUJMRV9OQU1FLCBNQUlOKTsKKyAgICAgICAgICAgIG1VcmlNYXRjaGVyLmFkZFVSSShBVVRIT1JJVFksIE1haW5UYWJsZS5UQUJMRV9OQU1FICsgIi8jIiwgTUFJTl9JRCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBwcm9qZWN0aW9uIG1hcCBmb3IgYWxsIGNvbHVtbnMuICBUaGlzIGlzCisgICAgICAgICAgICAvLyBzaW1wbHkgYW4gaWRlbnRpdHkgbWFwcGluZy4KKyAgICAgICAgICAgIG1Ob3Rlc1Byb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1Ob3Rlc1Byb2plY3Rpb25NYXAucHV0KE1haW5UYWJsZS5fSUQsIE1haW5UYWJsZS5fSUQpOworICAgICAgICAgICAgbU5vdGVzUHJvamVjdGlvbk1hcC5wdXQoTWFpblRhYmxlLkNPTFVNTl9OQU1FX0RBVEEsIE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtIHByb3ZpZGVyIGNyZWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICAgICAgbU9wZW5IZWxwZXIgPSBuZXcgRGF0YWJhc2VIZWxwZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIC8vIEFzc3VtZXMgdGhhdCBhbnkgZmFpbHVyZXMgd2lsbCBiZSByZXBvcnRlZCBieSBhIHRocm93biBleGNlcHRpb24uCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgaW5jb21pbmcgcXVlcmllcy4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgeworCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHF1ZXJ5IGJ1aWxkZXIgYW5kIHNldHMgaXRzIHRhYmxlIG5hbWUKKyAgICAgICAgICAgIFNRTGl0ZVF1ZXJ5QnVpbGRlciBxYiA9IG5ldyBTUUxpdGVRdWVyeUJ1aWxkZXIoKTsKKyAgICAgICAgICAgIHFiLnNldFRhYmxlcyhNYWluVGFibGUuVEFCTEVfTkFNRSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobVVyaU1hdGNoZXIubWF0Y2godXJpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUFJTjoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBpcyBmb3IgbWFpbiB0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgcWIuc2V0UHJvamVjdGlvbk1hcChtTm90ZXNQcm9qZWN0aW9uTWFwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1BSU5fSUQ6CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgaXMgZm9yIGEgc2luZ2xlIHJvdy4KKyAgICAgICAgICAgICAgICAgICAgcWIuc2V0UHJvamVjdGlvbk1hcChtTm90ZXNQcm9qZWN0aW9uTWFwKTsKKyAgICAgICAgICAgICAgICAgICAgcWIuYXBwZW5kV2hlcmUoTWFpblRhYmxlLl9JRCArICI9PyIpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gRGF0YWJhc2VVdGlscy5hcHBlbmRTZWxlY3Rpb25BcmdzKHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgdXJpLmdldExhc3RQYXRoU2VnbWVudCgpIH0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzb3J0T3JkZXIpKSB7CisgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gTWFpblRhYmxlLkRFRkFVTFRfU09SVF9PUkRFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisKKyAgICAgICAgICAgIEN1cnNvciBjID0gcWIucXVlcnkoZGIsIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyBncm91cCAqLywgbnVsbCAvKiBubyBmaWx0ZXIgKi8sIHNvcnRPcmRlcik7CisKKyAgICAgICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uVXJpKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwgdXJpKTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIGZvciBhbiBrbm93biBVUkkgaW4gdGhlIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1VcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1BSU46CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYWluVGFibGUuQ09OVEVOVF9UWVBFOworICAgICAgICAgICAgICAgIGNhc2UgTUFJTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1haW5UYWJsZS5DT05URU5UX0lURU1fVFlQRTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVyIGluc2VydGluZyBuZXcgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMpIHsKKyAgICAgICAgICAgIGlmIChtVXJpTWF0Y2hlci5tYXRjaCh1cmkpICE9IE1BSU4pIHsKKyAgICAgICAgICAgICAgICAvLyBDYW4gb25seSBpbnNlcnQgaW50byB0byBtYWluIFVSSS4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXM7CisKKyAgICAgICAgICAgIGlmIChpbml0aWFsVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcyhpbml0aWFsVmFsdWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShNYWluVGFibGUuQ09MVU1OX05BTUVfREFUQSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBLCAiIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworCisgICAgICAgICAgICBsb25nIHJvd0lkID0gZGIuaW5zZXJ0KE1haW5UYWJsZS5UQUJMRV9OQU1FLCBudWxsLCB2YWx1ZXMpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgaW5zZXJ0IHN1Y2NlZWRlZCwgdGhlIHJvdyBJRCBleGlzdHMuCisgICAgICAgICAgICBpZiAocm93SWQgPiAwKSB7CisgICAgICAgICAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChNYWluVGFibGUuQ09OVEVOVF9JRF9VUklfQkFTRSwgcm93SWQpOworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2Uobm90ZVVyaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vdGVVcmk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIkZhaWxlZCB0byBpbnNlcnQgcm93IGludG8gIiArIHVyaSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIGRlbGV0aW5nIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHdoZXJlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgU3RyaW5nIGZpbmFsV2hlcmU7CisKKyAgICAgICAgICAgIGludCBjb3VudDsKKworICAgICAgICAgICAgc3dpdGNoIChtVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNQUlOOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBVUkkgaXMgbWFpbiB0YWJsZSwgZGVsZXRlIHVzZXMgaW5jb21pbmcgd2hlcmUgY2xhdXNlIGFuZCBhcmdzLgorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZShNYWluVGFibGUuVEFCTEVfTkFNRSwgd2hlcmUsIHdoZXJlQXJncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyBhIHNpbmdsZSBub3RlIElELCBkb2VzIHRoZSBkZWxldGUgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGluY29taW5nIGRhdGEsIGJ1dCBtb2RpZmllcyB0aGUgd2hlcmUgY2xhdXNlIHRvIHJlc3RyaWN0IGl0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIG5vdGUgSUQuCisgICAgICAgICAgICAgICAgY2FzZSBNQUlOX0lEOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBVUkkgaXMgZm9yIGEgcGFydGljdWxhciByb3cgSUQsIGRlbGV0ZSBpcyBiYXNlZCBvbiBpbmNvbWluZworICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGJ1dCBtb2RpZmllZCB0byByZXN0cmljdCB0byB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsV2hlcmUgPSBEYXRhYmFzZVV0aWxzLmNvbmNhdGVuYXRlV2hlcmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpblRhYmxlLl9JRCArICIgPSAiICsgQ29udGVudFVyaXMucGFyc2VJZCh1cmkpLCB3aGVyZSk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZGIuZGVsZXRlKE1haW5UYWJsZS5UQUJMRV9OQU1FLCBmaW5hbFdoZXJlLCB3aGVyZUFyZ3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKHVyaSwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdXBkYXRpbmcgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHdoZXJlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgU3RyaW5nIGZpbmFsV2hlcmU7CisKKyAgICAgICAgICAgIHN3aXRjaCAobVVyaU1hdGNoZXIubWF0Y2godXJpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUFJTjoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgVVJJIGlzIG1haW4gdGFibGUsIHVwZGF0ZSB1c2VzIGluY29taW5nIHdoZXJlIGNsYXVzZSBhbmQgYXJncy4KKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoTWFpblRhYmxlLlRBQkxFX05BTUUsIHZhbHVlcywgd2hlcmUsIHdoZXJlQXJncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNQUlOX0lEOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiBVUkkgaXMgZm9yIGEgcGFydGljdWxhciByb3cgSUQsIHVwZGF0ZSBpcyBiYXNlZCBvbiBpbmNvbWluZworICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGJ1dCBtb2RpZmllZCB0byByZXN0cmljdCB0byB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsV2hlcmUgPSBEYXRhYmFzZVV0aWxzLmNvbmNhdGVuYXRlV2hlcmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpblRhYmxlLl9JRCArICIgPSAiICsgQ29udGVudFVyaXMucGFyc2VJZCh1cmkpLCB3aGVyZSk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKE1haW5UYWJsZS5UQUJMRV9OQU1FLCB2YWx1ZXMsIGZpbmFsV2hlcmUsIHdoZXJlQXJncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2UodXJpLCBudWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlJZChhbmRyb2lkLlIuaWQuY29udGVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50IGxpc3QgPSBuZXcgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBmbS5iZWdpblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBsaXN0KS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyb3R0bGVkTG9hZGVyTGlzdEZyYWdtZW50IGV4dGVuZHMgTGlzdEZyYWdtZW50CisgICAgICAgICAgICBpbXBsZW1lbnRzIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPEN1cnNvcj4geworCisgICAgICAgIC8vIE1lbnUgaWRlbnRpZmllcnMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBQT1BVTEFURV9JRCA9IE1lbnUuRklSU1Q7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfSUQgPSBNZW51LkZJUlNUKzE7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgQWRhcHRlciBiZWluZyB1c2VkIHRvIGRpc3BsYXkgdGhlIGxpc3QncyBkYXRhLgorICAgICAgICBTaW1wbGVDdXJzb3JBZGFwdGVyIG1BZGFwdGVyOworCisgICAgICAgIC8vIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBjdXJyZW50IGZpbHRlciB0aGUgdXNlciBoYXMgcHJvdmlkZWQuCisgICAgICAgIFN0cmluZyBtQ3VyRmlsdGVyOworCisgICAgICAgIC8vIFRhc2sgd2UgaGF2ZSBydW5uaW5nIHRvIHBvcHVsYXRlIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+IG1Qb3B1bGF0aW5nVGFzazsKKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgc2V0RW1wdHlUZXh0KCJObyBkYXRhLiAgU2VsZWN0ICdQb3B1bGF0ZScgdG8gZmlsbCB3aXRoIGRhdGEgZnJvbSBaIHRvIEEgYXQgYSByYXRlIG9mIDQgcGVyIHNlY29uZC4iKTsKKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgYWRhcHRlciB3ZSB3aWxsIHVzZSB0byBkaXNwbGF5IHRoZSBsb2FkZWQgZGF0YS4KKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSB9LCAwKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbG9hZGVyLiAgRWl0aGVyIHJlLWNvbm5lY3Qgd2l0aCBhbiBleGlzdGluZyBvbmUsCisgICAgICAgICAgICAvLyBvciBzdGFydCBhIG5ldyBvbmUuCisgICAgICAgICAgICBnZXRMb2FkZXJNYW5hZ2VyKCkuaW5pdExvYWRlcigwLCBudWxsLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgICAgICBtZW51LmFkZChNZW51Lk5PTkUsIFBPUFVMQVRFX0lELCAwLCAiUG9wdWxhdGUiKQorICAgICAgICAgICAgICAgICAgICAuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgbWVudS5hZGQoTWVudS5OT05FLCBDTEVBUl9JRCwgMCwgIkNsZWFyIikKKyAgICAgICAgICAgICAgICAgICAgLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gZ2V0QWN0aXZpdHkoKS5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1BVTEFURV9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3B1bGF0aW5nVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2sgPSBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFyIGM9J1onOyBjPj0nQSc7IGMtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIkRhdGEgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWFpblRhYmxlLkNPTFVNTl9OQU1FX0RBVEEsIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyLmluc2VydChNYWluVGFibGUuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgYSBiaXQgYmV0d2VlbiBlYWNoIGluc2VydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1bGF0aW5nVGFzay5leGVjdXRlT25FeGVjdXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IsIChWb2lkW10pbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3B1bGF0aW5nVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9wdWxhdGluZ1Rhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3B1bGF0aW5nVGFzayA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+IHRhc2sgPSBuZXcgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKE1haW5UYWJsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRhc2suZXhlY3V0ZSgoVm9pZFtdKW51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgZGVzaXJlZCBiZWhhdmlvciBoZXJlLgorICAgICAgICAgICAgTG9nLmkoVEFHLCAiSXRlbSBjbGlja2VkOiAiICsgaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSByb3dzIHRoYXQgd2Ugd2lsbCByZXRyaWV2ZS4KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTWFpblRhYmxlLl9JRCwKKyAgICAgICAgICAgIE1haW5UYWJsZS5DT0xVTU5fTkFNRV9EQVRBLAorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBMb2FkZXI8Q3Vyc29yPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBDdXJzb3JMb2FkZXIgY2wgPSBuZXcgQ3Vyc29yTG9hZGVyKGdldEFjdGl2aXR5KCksIE1haW5UYWJsZS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjbC5zZXRVcGRhdGVUaHJvdHRsZSgyMDAwKTsgLy8gdXBkYXRlIGF0IG1vc3QgZXZlcnkgMiBzZWNvbmRzLgorICAgICAgICAgICAgcmV0dXJuIGNsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkRmluaXNoZWQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyLCBDdXJzb3IgZGF0YSkgeworICAgICAgICAgICAgbUFkYXB0ZXIuc3dhcEN1cnNvcihkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZGVyUmVzZXQoTG9hZGVyPEN1cnNvcj4gbG9hZGVyKSB7CisgICAgICAgICAgICBtQWRhcHRlci5zd2FwQ3Vyc29yKG51bGwpOworICAgICAgICB9CisgICAgfQorfQorLy9FTkRfSU5DTFVERShjb21wbGV0ZSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy90ZXh0L19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3RleHQvX2luZGV4Lmh0bWwKaW5kZXggZWUxMDIwYi4uYzk5NWEwYyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3RleHQvX2luZGV4Lmh0bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3RleHQvX2luZGV4Lmh0bWwKQEAgLTEsNiArMSw4IEBACiA8ZGw+CiAgIDxkdD48YSBocmVmPSJMaW5rLmh0bWwiPkxpbmtpZnk8L2E+PC9kdD4KLSAgPGRkPkRlbW9uc3RyYXRlcyB0aGUge0BsaW5rIGFuZHJvaWQudGV4dC51dGlsLkxpbmtpZnkgTGlua2lmeX0gY2xhc3MsIHdoaWNoIGNvbnZlcnRzIFVSTHMgaW4gYSBibG9jayBvZiB0ZXh0IGludG8gaHlwZXJsaW5rcy4gPC9kZD4KKyAgPGRkPkRlbW9uc3RyYXRlcyB0aGUgPGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC90ZXh0L3V0aWwvTGlua2lmeS5odG1sIj48Y29kZT5MaW5raWZ5PC9jb2RlPgorY2xhc3MsIHdoaWNoIGNvbnZlcnRzIFVSTHMgaW4gYSBibG9jayBvZiB0ZXh0IGludG8gaHlwZXJsaW5rcy4gPC9kZD4KIDwvZGw+CiAKIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ2hlY2thYmxlRnJhbWVMYXlvdXQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NoZWNrYWJsZUZyYW1lTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiMjIyZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NoZWNrYWJsZUZyYW1lTGF5b3V0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja2FibGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBDaGVja2FibGVGcmFtZUxheW91dCBleHRlbmRzIEZyYW1lTGF5b3V0IGltcGxlbWVudHMgQ2hlY2thYmxlIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNoZWNrZWQ7CisKKyAgICBwdWJsaWMgQ2hlY2thYmxlRnJhbWVMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBDaGVja2FibGVGcmFtZUxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgbUNoZWNrZWQgPSBjaGVja2VkOworICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoY2hlY2tlZCA/IG5ldyBDb2xvckRyYXdhYmxlKDB4ZmYwMDAwYTApIDogbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgeworICAgICAgICByZXR1cm4gbUNoZWNrZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG9nZ2xlKCkgeworICAgICAgICBzZXRDaGVja2VkKCFtQ2hlY2tlZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9DaGVlc2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9DaGVlc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmN2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NoZWVzZXMuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKworcHVibGljIGNsYXNzIENoZWVzZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzQ2hlZXNlU3RyaW5ncyA9IHsKKyAgICAgICAgICAgICJBYmJheWUgZGUgQmVsbG9jIiwgIkFiYmF5ZSBkdSBNb250IGRlcyBDYXRzIiwgIkFiZXJ0YW0iLCAiQWJvbmRhbmNlIiwgIkFja2F3aSIsCisgICAgICAgICAgICAiQWNvcm4iLCAiQWRlbG9zdCIsICJBZmZpZGVsaWNlIGF1IENoYWJsaXMiLCAiQWZ1ZWdhJ2wgUGl0dSIsICJBaXJhZyIsICJBaXJlZGFsZSIsCisgICAgICAgICAgICAiQWlzeSBDZW5kcmUiLCAiQWxsZ2F1ZXIgRW1tZW50YWxlciIsICJBbHZlcmNhIiwgIkFtYmVydCIsICJBbWVyaWNhbiBDaGVlc2UiLAorICAgICAgICAgICAgIkFtaSBkdSBDaGFtYmVydGluIiwgIkFuZWpvIEVuY2hpbGFkbyIsICJBbm5lYXUgZHUgVmljLUJpbGgiLCAiQW50aG9yaXJvIiwgIkFwcGVuemVsbCIsCisgICAgICAgICAgICAiQXJhZ29uIiwgIkFyZGkgR2FzbmEiLCAiQXJkcmFoYW4iLCAiQXJtZW5pYW4gU3RyaW5nIiwgIkFyb21lcyBhdSBHZW5lIGRlIE1hcmMiLAorICAgICAgICAgICAgIkFzYWRlcm8iLCAiQXNpYWdvIiwgIkF1YmlzcXVlIFB5cmVuZWVzIiwgIkF1dHVuIiwgIkF2YXh0c2t5ciIsICJCYWJ5IFN3aXNzIiwKKyAgICAgICAgICAgICJCYWJ5YmVsIiwgIkJhZ3VldHRlIExhb25uYWlzZSIsICJCYWtlcnMiLCAiQmFsYWRpIiwgIkJhbGF0b24iLCAiQmFuZGFsIiwgIkJhbm9uIiwKKyAgICAgICAgICAgICJCYXJyeSdzIEJheSBDaGVkZGFyIiwgIkJhc2luZyIsICJCYXNrZXQgQ2hlZXNlIiwgIkJhdGggQ2hlZXNlIiwgIkJhdmFyaWFuIEJlcmdrYXNlIiwKKyAgICAgICAgICAgICJCYXlsb3VnaCIsICJCZWF1Zm9ydCIsICJCZWF1dm9vcmRlIiwgIkJlZW5sZWlnaCBCbHVlIiwgIkJlZXIgQ2hlZXNlIiwgIkJlbCBQYWVzZSIsCisgICAgICAgICAgICAiQmVyZ2FkZXIiLCAiQmVyZ2VyZSBCbGV1ZSIsICJCZXJrc3dlbGwiLCAiQmV5YXogUGV5bmlyIiwgIkJpZXJrYXNlIiwgIkJpc2hvcCBLZW5uZWR5IiwKKyAgICAgICAgICAgICJCbGFybmV5IiwgIkJsZXUgZCdBdXZlcmduZSIsICJCbGV1IGRlIEdleCIsICJCbGV1IGRlIExhcXVldWlsbGUiLAorICAgICAgICAgICAgIkJsZXUgZGUgU2VwdG1vbmNlbCIsICJCbGV1IERlcyBDYXVzc2VzIiwgIkJsdWUiLCAiQmx1ZSBDYXN0ZWxsbyIsICJCbHVlIFJhdGhnb3JlIiwKKyAgICAgICAgICAgICJCbHVlIFZlaW4gKEF1c3RyYWxpYW4pIiwgIkJsdWUgVmVpbiBDaGVlc2VzIiwgIkJvY2NvbmNpbmkiLCAiQm9jY29uY2luaSAoQXVzdHJhbGlhbikiLAorICAgICAgICAgICAgIkJvZXJlbiBMZWlkZW5rYWFzIiwgIkJvbmNoZXN0ZXIiLCAiQm9zd29ydGgiLCAiQm91Z29uIiwgIkJvdWxlIER1IFJvdmVzIiwKKyAgICAgICAgICAgICJCb3VsZXR0ZSBkJ0F2ZXNuZXMiLCAiQm91cnNhdWx0IiwgIkJvdXJzaW4iLCAiQm91eXNzb3UiLCAiQnJhIiwgIkJyYXVkb3N0dXIiLAorICAgICAgICAgICAgIkJyZWFrZmFzdCBDaGVlc2UiLCAiQnJlYmlzIGR1IExhdm9ydCIsICJCcmViaXMgZHUgTG9jaG9pcyIsICJCcmViaXMgZHUgUHV5ZmF1Y29uIiwKKyAgICAgICAgICAgICJCcmVzc2UgQmxldSIsICJCcmljayIsICJCcmllIiwgIkJyaWUgZGUgTWVhdXgiLCAiQnJpZSBkZSBNZWx1biIsICJCcmlsbGF0LVNhdmFyaW4iLAorICAgICAgICAgICAgIkJyaW4iLCAiQnJpbiBkJyBBbW91ciIsICJCcmluIGQnQW1vdXIiLCAiQnJpbnphIChCdXJkdWYgQnJpbnphKSIsCisgICAgICAgICAgICAiQnJpcXVldHRlIGRlIEJyZWJpcyIsICJCcmlxdWV0dGUgZHUgRm9yZXoiLCAiQnJvY2NpbyIsICJCcm9jY2lvIERlbWktQWZmaW5lIiwKKyAgICAgICAgICAgICJCcm91c3NlIGR1IFJvdmUiLCAiQnJ1ZGVyIEJhc2lsIiwgIkJydXNzZWxhZSBLYWFzIChGcm9tYWdlIGRlIEJydXhlbGxlcykiLCAiQnJ5bmR6YSIsCisgICAgICAgICAgICAiQnVjaGV0dGUgZCdBbmpvdSIsICJCdWZmYWxvIiwgIkJ1cmdvcyIsICJCdXR0ZSIsICJCdXR0ZXJrYXNlIiwgIkJ1dHRvbiAoSW5uZXMpIiwKKyAgICAgICAgICAgICJCdXh0b24gQmx1ZSIsICJDYWJlY291IiwgIkNhYm9jIiwgIkNhYnJhbGVzIiwgIkNhY2hhaWxsZSIsICJDYWNpb2NhdmFsbG8iLCAiQ2FjaW90dGEiLAorICAgICAgICAgICAgIkNhZXJwaGlsbHkiLCAiQ2Fpcm5zbW9yZSIsICJDYWxlbnphbmEiLCAiQ2FtYmF6b2xhIiwgIkNhbWVtYmVydCBkZSBOb3JtYW5kaWUiLAorICAgICAgICAgICAgIkNhbmFkaWFuIENoZWRkYXIiLCAiQ2FuZXN0cmF0byIsICJDYW50YWwiLCAiQ2FwcmljZSBkZXMgRGlldXgiLCAiQ2Fwcmljb3JuIEdvYXQiLAorICAgICAgICAgICAgIkNhcHJpb2xlIEJhbm9uIiwgIkNhcnJlIGRlIGwnRXN0IiwgIkNhc2Npb3R0YSBkaSBVcmJpbm8iLCAiQ2FzaGVsIEJsdWUiLCAiQ2FzdGVsbGFubyIsCisgICAgICAgICAgICAiQ2FzdGVsbGVubyIsICJDYXN0ZWxtYWdubyIsICJDYXN0ZWxvIEJyYW5jbyIsICJDYXN0aWdsaWFubyIsICJDYXRoZWxhaW4iLAorICAgICAgICAgICAgIkNlbHRpYyBQcm9taXNlIiwgIkNlbmRyZSBkJ09saXZldCIsICJDZXJuZXkiLCAiQ2hhYmljaG91IiwgIkNoYWJpY2hvdSBkdSBQb2l0b3UiLAorICAgICAgICAgICAgIkNoYWJpcyBkZSBHYXRpbmUiLCAiQ2hhb3VyY2UiLCAiQ2hhcm9sYWlzIiwgIkNoYXVtZXMiLCAiQ2hlZGRhciIsCisgICAgICAgICAgICAiQ2hlZGRhciBDbG90aGJvdW5kIiwgIkNoZXNoaXJlIiwgIkNoZXZyZXMiLCAiQ2hldnJvdGluIGRlcyBBcmF2aXMiLCAiQ2hvbnRhbGVubyIsCisgICAgICAgICAgICAiQ2l2cmF5IiwgIkNvZXVyIGRlIENhbWVtYmVydCBhdSBDYWx2YWRvcyIsICJDb2V1ciBkZSBDaGV2cmUiLCAiQ29sYnkiLCAiQ29sZCBQYWNrIiwKKyAgICAgICAgICAgICJDb210ZSIsICJDb29sZWEiLCAiQ29vbGVuZXkiLCAiQ29xdWV0ZGFsZSIsICJDb3JsZWdneSIsICJDb3JuaXNoIFBlcHBlciIsCisgICAgICAgICAgICAiQ290aGVyc3RvbmUiLCAiQ290aWphIiwgIkNvdHRhZ2UgQ2hlZXNlIiwgIkNvdHRhZ2UgQ2hlZXNlIChBdXN0cmFsaWFuKSIsCisgICAgICAgICAgICAiQ291Z2FyIEdvbGQiLCAiQ291bG9tbWllcnMiLCAiQ292ZXJkYWxlIiwgIkNyYXlldXggZGUgUm9uY3EiLCAiQ3JlYW0gQ2hlZXNlIiwKKyAgICAgICAgICAgICJDcmVhbSBIYXZhcnRpIiwgIkNyZW1hIEFncmlhIiwgIkNyZW1hIE1leGljYW5hIiwgIkNyZW1lIEZyYWljaGUiLCAiQ3Jlc2NlbnphIiwKKyAgICAgICAgICAgICJDcm9naGFuIiwgIkNyb3R0aW4gZGUgQ2hhdmlnbm9sIiwgIkNyb3R0aW4gZHUgQ2hhdmlnbm9sIiwgIkNyb3dkaWUiLCAiQ3Jvd2xleSIsCisgICAgICAgICAgICAiQ3VhamFkYSIsICJDdXJkIiwgIkN1cmUgTmFudGFpcyIsICJDdXJ3b3J0aHkiLCAiQ3dtdGF3ZSBQZWNvcmlubyIsCisgICAgICAgICAgICAiQ3lwcmVzcyBHcm92ZSBDaGV2cmUiLCAiRGFuYWJsdSAoRGFuaXNoIEJsdWUpIiwgIkRhbmJvIiwgIkRhbmlzaCBGb250aW5hIiwKKyAgICAgICAgICAgICJEYXJhbGFnamF6c2t5IiwgIkRhdXBoaW4iLCAiRGVsaWNlIGRlcyBGaW91dmVzIiwgIkRlbmhhbnkgRG9yc2V0IERydW0iLCAiRGVyYnkiLAorICAgICAgICAgICAgIkRlc3NlcnRueWogQmVseWoiLCAiRGV2b24gQmx1ZSIsICJEZXZvbiBHYXJsYW5kIiwgIkRvbGNlbGF0dGUiLCAiRG9vbGluIiwKKyAgICAgICAgICAgICJEb3BwZWxyaGFtc3R1ZmVsIiwgIkRvcnNldCBCbHVlIFZpbm5leSIsICJEb3VibGUgR2xvdWNlc3RlciIsICJEb3VibGUgV29yY2VzdGVyIiwKKyAgICAgICAgICAgICJEcmV1eCBhIGxhIEZldWlsbGUiLCAiRHJ5IEphY2siLCAiRHVkZGxlc3dlbGwiLCAiRHVuYmFycmEiLCAiRHVubG9wIiwgIkR1bnN5cmUgQmx1ZSIsCisgICAgICAgICAgICAiRHVyb2JsYW5kbyIsICJEdXJydXMiLCAiRHV0Y2ggTWltb2xldHRlIChDb21taXNzaWVrYWFzKSIsICJFZGFtIiwgIkVkZWxwaWx6IiwKKyAgICAgICAgICAgICJFbWVudGFsIEdyYW5kIENydSIsICJFbWxldHQiLCAiRW1tZW50YWwiLCAiRXBvaXNzZXMgZGUgQm91cmdvZ25lIiwgIkVzYmFyZWljaCIsCisgICAgICAgICAgICAiRXNyb20iLCAiRXRvcmtpIiwgIkV2YW5zZGFsZSBGYXJtaG91c2UgQnJpZSIsICJFdm9yYSBEZSBMJ0FsZW50ZWpvIiwgIkV4bW9vciBCbHVlIiwKKyAgICAgICAgICAgICJFeHBsb3JhdGV1ciIsICJGZXRhIiwgIkZldGEgKEF1c3RyYWxpYW4pIiwgIkZpZ3VlIiwgIkZpbGV0dGEiLCAiRmluLWRlLVNpZWNsZSIsCisgICAgICAgICAgICAiRmlubGFuZGlhIFN3aXNzIiwgIkZpbm4iLCAiRmlvcmUgU2FyZG8iLCAiRmxldXIgZHUgTWFxdWlzIiwgIkZsb3IgZGUgR3VpYSIsCisgICAgICAgICAgICAiRmxvd2VyIE1hcmllIiwgIkZvbGRlZCIsICJGb2xkZWQgY2hlZXNlIHdpdGggbWludCIsICJGb25kYW50IGRlIEJyZWJpcyIsCisgICAgICAgICAgICAiRm9udGFpbmVibGVhdSIsICJGb250YWwiLCAiRm9udGluYSBWYWwgZCdBb3N0YSIsICJGb3JtYWdnaW8gZGkgY2FwcmEiLCAiRm91Z2VydXMiLAorICAgICAgICAgICAgIkZvdXIgSGVyYiBHb3VkYSIsICJGb3VybWUgZCcgQW1iZXJ0IiwgIkZvdXJtZSBkZSBIYXV0ZSBMb2lyZSIsICJGb3VybWUgZGUgTW9udGJyaXNvbiIsCisgICAgICAgICAgICAiRnJlc2ggSmFjayIsICJGcmVzaCBNb3p6YXJlbGxhIiwgIkZyZXNoIFJpY290dGEiLCAiRnJlc2ggVHJ1ZmZsZXMiLCAiRnJpYm91cmdlb2lzIiwKKyAgICAgICAgICAgICJGcmllc2VrYWFzIiwgIkZyaWVzaWFuIiwgIkZyaWVzbGEiLCAiRnJpbmF1bHQiLCAiRnJvbWFnZSBhIFJhY2xldHRlIiwgIkZyb21hZ2UgQ29yc2UiLAorICAgICAgICAgICAgIkZyb21hZ2UgZGUgTW9udGFnbmUgZGUgU2F2b2llIiwgIkZyb21hZ2UgRnJhaXMiLCAiRnJ1aXQgQ3JlYW0gQ2hlZXNlIiwKKyAgICAgICAgICAgICJGcnlpbmcgQ2hlZXNlIiwgIkZ5bmJvIiwgIkdhYnJpZWwiLCAiR2FsZXR0ZSBkdSBQYWx1ZGllciIsICJHYWxldHRlIEx5b25uYWlzZSIsCisgICAgICAgICAgICAiR2FsbG93YXkgR29hdCdzIE1pbGsgR2VtcyIsICJHYW1tZWxvc3QiLCAiR2FwZXJvbiBhIGwnQWlsIiwgIkdhcnJvdHhhIiwgIkdhc3RhbmJlcnJhIiwKKyAgICAgICAgICAgICJHZWl0b3N0IiwgIkdpcHBzbGFuZCBCbHVlIiwgIkdqZXRvc3QiLCAiR2xvdWNlc3RlciIsICJHb2xkZW4gQ3Jvc3MiLCAiR29yZ29uem9sYSIsCisgICAgICAgICAgICAiR29ybnlhbHRhanNraSIsICJHb3NwZWwgR3JlZW4iLCAiR291ZGEiLCAiR291dHUiLCAiR293cmllIiwgIkdyYWJldHRvIiwgIkdyYWRkb3N0IiwKKyAgICAgICAgICAgICJHcmFmdG9uIFZpbGxhZ2UgQ2hlZGRhciIsICJHcmFuYSIsICJHcmFuYSBQYWRhbm8iLCAiR3JhbmQgVmF0ZWwiLAorICAgICAgICAgICAgIkdyYXRhcm9uIGQnIEFyZWNoZXMiLCAiR3JhdHRlLVBhaWxsZSIsICJHcmF2aWVyYSIsICJHcmV1aWxoIiwgIkdyZXZlIiwKKyAgICAgICAgICAgICJHcmlzIGRlIExpbGxlIiwgIkdydXllcmUiLCAiR3ViYmVlbiIsICJHdWVyYmlnbnkiLCAiSGFsbG91bWkiLAorICAgICAgICAgICAgIkhhbGxvdW15IChBdXN0cmFsaWFuKSIsICJIYWxvdW1pLVN0eWxlIENoZWVzZSIsICJIYXJib3VybmUgQmx1ZSIsICJIYXZhcnRpIiwKKyAgICAgICAgICAgICJIZWlkaSBHcnV5ZXJlIiwgIkhlcmVmb3JkIEhvcCIsICJIZXJyZ2FyZHNvc3QiLCAiSGVycmlvdCBGYXJtaG91c2UiLCAiSGVydmUiLAorICAgICAgICAgICAgIkhpcGkgSXRpIiwgIkh1YmJhcmRzdG9uIEJsdWUgQ293IiwgIkh1c2hhbGxzb3N0IiwgIkliZXJpY28iLCAiSWRhaG8gR29hdHN0ZXIiLAorICAgICAgICAgICAgIklkaWF6YWJhbCIsICJJbCBCb3NjaGV0dG8gYWwgVGFydHVmbyIsICJJbGUgZCdZZXUiLCAiSXNsZSBvZiBNdWxsIiwgIkphcmxzYmVyZyIsCisgICAgICAgICAgICAiSmVybWkgVG9ydGVzIiwgIkppYm5laCBBcmFiaWVoIiwgIkppbmRpIEJyaWUiLCAiSnViaWxlZSBCbHVlIiwgIkp1dXN0b2xlaXBhIiwKKyAgICAgICAgICAgICJLYWRjaGdhbGwiLCAiS2FzZXJpIiwgIkthc2h0YSIsICJLZWZhbG90eXJpIiwgIktlbmFmYSIsICJLZXJuaGVtIiwgIktlcnZlbGxhIEFmZmluZSIsCisgICAgICAgICAgICAiS2lrb3JhbmdpIiwgIktpbmcgSXNsYW5kIENhcGUgV2lja2hhbSBCcmllIiwgIktpbmcgUml2ZXIgR29sZCIsICJLbG9zdGVya2Flc2UiLAorICAgICAgICAgICAgIktub2NrYWxhcmEiLCAiS3VnZWxrYXNlIiwgIkwnQXZleXJvbm5haXMiLCAiTCdFY2lyIGRlIGwnQXVicmFjIiwgIkxhIFRhdXBpbmllcmUiLAorICAgICAgICAgICAgIkxhIFZhY2hlIFF1aSBSaXQiLCAiTGFndWlvbGUiLCAiTGFpcm9iZWxsIiwgIkxhanRhIiwgIkxhbmFyayBCbHVlIiwgIkxhbmNhc2hpcmUiLAorICAgICAgICAgICAgIkxhbmdyZXMiLCAiTGFwcGkiLCAiTGFydW5zIiwgIkxhdmlzdG93biIsICJMZSBCcmluIiwgIkxlIEZpdW0gT3JibyIsICJMZSBMYWNhbmRvdSIsCisgICAgICAgICAgICAiTGUgUm91bGUiLCAiTGVhZmllbGQiLCAiTGViYmVuZSIsICJMZWVyZGFtbWVyIiwgIkxlaWNlc3RlciIsICJMZXlkZW4iLCAiTGltYnVyZ2VyIiwKKyAgICAgICAgICAgICJMaW5jb2xuc2hpcmUgUG9hY2hlciIsICJMaW5nb3QgU2FpbnQgQm91c3F1ZXQgZCdPcmIiLCAiTGlwdGF1ZXIiLCAiTGl0dGxlIFJ5ZGluZ3MiLAorICAgICAgICAgICAgIkxpdmFyb3QiLCAiTGxhbmJvaWR5IiwgIkxsYW5nbG9mYW4gRmFybWhvdXNlIiwgIkxvY2ggQXJ0aHVyIEZhcm1ob3VzZSIsCisgICAgICAgICAgICAiTG9kZGlzd2VsbCBBdm9uZGFsZSIsICJMb25naG9ybiIsICJMb3UgUGFsb3UiLCAiTG91IFBldnJlIiwgIkx5b25uYWlzIiwgIk1hYXNkYW0iLAorICAgICAgICAgICAgIk1hY2NvbmFpcyIsICJNYWhvZSBBZ2VkIEdvdWRhIiwgIk1haG9uIiwgIk1hbHZlcm4iLCAiTWFtaXJvbGxlIiwgIk1hbmNoZWdvIiwKKyAgICAgICAgICAgICJNYW5vdXJpIiwgIk1hbnVyIiwgIk1hcmJsZSBDaGVkZGFyIiwgIk1hcmJsZWQgQ2hlZXNlcyIsICJNYXJlZHNvdXMiLCAiTWFyZ290aW4iLAorICAgICAgICAgICAgIk1hcmlibyIsICJNYXJvaWxsZXMiLCAiTWFzY2FyZXMiLCAiTWFzY2FycG9uZSIsICJNYXNjYXJwb25lIChBdXN0cmFsaWFuKSIsCisgICAgICAgICAgICAiTWFzY2FycG9uZSBUb3J0YSIsICJNYXRvY3EiLCAiTWF5dGFnIEJsdWUiLCAiTWVpcmEiLCAiTWVuYWxsYWNrIEZhcm1ob3VzZSIsCisgICAgICAgICAgICAiTWVub25pdGEiLCAiTWVyZWRpdGggQmx1ZSIsICJNZXNvc3QiLCAiTWV0dG9uIChDYW5jb2lsbG90dGUpIiwgIk1leWVyIFZpbnRhZ2UgR291ZGEiLAorICAgICAgICAgICAgIk1paGFsaWMgUGV5bmlyIiwgIk1pbGxlZW5zIiwgIk1pbW9sZXR0ZSIsICJNaW5lLUdhYmhhciIsICJNaW5pIEJhYnkgQmVsbHMiLCAiTWl4dGUiLAorICAgICAgICAgICAgIk1vbGJvIiwgIk1vbmFzdGVyeSBDaGVlc2VzIiwgIk1vbmRzZWVyIiwgIk1vbnQgRCdvciBMeW9ubmFpcyIsICJNb250YXNpbyIsCisgICAgICAgICAgICAiTW9udGVyZXkgSmFjayIsICJNb250ZXJleSBKYWNrIERyeSIsICJNb3JiaWVyIiwgIk1vcmJpZXIgQ3J1IGRlIE1vbnRhZ25lIiwKKyAgICAgICAgICAgICJNb3RoYWlzIGEgbGEgRmV1aWxsZSIsICJNb3p6YXJlbGxhIiwgIk1venphcmVsbGEgKEF1c3RyYWxpYW4pIiwKKyAgICAgICAgICAgICJNb3p6YXJlbGxhIGRpIEJ1ZmFsYSIsICJNb3p6YXJlbGxhIEZyZXNoLCBpbiB3YXRlciIsICJNb3p6YXJlbGxhIFJvbGxzIiwgIk11bnN0ZXIiLAorICAgICAgICAgICAgIk11cm9sIiwgIk15Y2VsbGEiLCAiTXl6aXRocmEiLCAiTmFib3Vsc2kiLCAiTmFudGFpcyIsICJOZXVmY2hhdGVsIiwKKyAgICAgICAgICAgICJOZXVmY2hhdGVsIChBdXN0cmFsaWFuKSIsICJOaW9sbyIsICJOb2trZWxvc3QiLCAiTm9ydGh1bWJlcmxhbmQiLCAiT2F4YWNhIiwKKyAgICAgICAgICAgICJPbGRlIFlvcmsiLCAiT2xpdmV0IGF1IEZvaW4iLCAiT2xpdmV0IEJsZXUiLCAiT2xpdmV0IENlbmRyZSIsCisgICAgICAgICAgICAiT3JrbmV5IEV4dHJhIE1hdHVyZSBDaGVkZGFyIiwgIk9ybGEiLCAiT3NjaHRqZXBrYSIsICJPc3NhdSBGZXJtaWVyIiwgIk9zc2F1LUlyYXR5IiwKKyAgICAgICAgICAgICJPc3pjenlwZWsiLCAiT3hmb3JkIEJsdWUiLCAiUCd0aXQgQmVycmljaG9uIiwgIlBhbGV0IGRlIEJhYmxpZ255IiwgIlBhbmVlciIsICJQYW5lbGEiLAorICAgICAgICAgICAgIlBhbm5lcm9uZSIsICJQYW50IHlzIEdhd24iLCAiUGFybWVzYW4gKFBhcm1pZ2lhbm8pIiwgIlBhcm1pZ2lhbm8gUmVnZ2lhbm8iLAorICAgICAgICAgICAgIlBhcyBkZSBsJ0VzY2FsZXR0ZSIsICJQYXNzZW5kYWxlIiwgIlBhc3RldXJpemVkIFByb2Nlc3NlZCIsICJQYXRlIGRlIEZyb21hZ2UiLAorICAgICAgICAgICAgIlBhdGVmaW5lIEZvcnQiLCAiUGF2ZSBkJ0FmZmlub2lzIiwgIlBhdmUgZCdBdWdlIiwgIlBhdmUgZGUgQ2hpcmFjIiwgIlBhdmUgZHUgQmVycnkiLAorICAgICAgICAgICAgIlBlY29yaW5vIiwgIlBlY29yaW5vIGluIFdhbG51dCBMZWF2ZXMiLCAiUGVjb3Jpbm8gUm9tYW5vIiwgIlBlZWtza2lsbCBQeXJhbWlkIiwKKyAgICAgICAgICAgICJQZWxhcmRvbiBkZXMgQ2V2ZW5uZXMiLCAiUGVsYXJkb24gZGVzIENvcmJpZXJlcyIsICJQZW5hbWVsbGVyYSIsICJQZW5icnluIiwKKyAgICAgICAgICAgICJQZW5jYXJyZWciLCAiUGVyYWlsIGRlIEJyZWJpcyIsICJQZXRpdCBNb3JpbiIsICJQZXRpdCBQYXJkb3UiLCAiUGV0aXQtU3Vpc3NlIiwKKyAgICAgICAgICAgICJQaWNvZG9uIGRlIENoZXZyZSIsICJQaWNvcyBkZSBFdXJvcGEiLCAiUGlvcmEiLCAiUGl0aHR2aWVycyBhdSBGb2luIiwKKyAgICAgICAgICAgICJQbGF0ZWF1IGRlIEhlcnZlIiwgIlBseW1vdXRoIENoZWVzZSIsICJQb2RoYWxhbnNraSIsICJQb2l2cmUgZCdBbmUiLCAiUG9sa29sYmluIiwKKyAgICAgICAgICAgICJQb250IGwnRXZlcXVlIiwgIlBvcnQgTmljaG9sc29uIiwgIlBvcnQtU2FsdXQiLCAiUG9zdGVsIiwgIlBvdWxpZ255LVNhaW50LVBpZXJyZSIsCisgICAgICAgICAgICAiUG91cmx5IiwgIlByYXN0b3N0IiwgIlByZXNzYXRvIiwgIlByaW5jZS1KZWFuIiwgIlByb2Nlc3NlZCBDaGVkZGFyIiwgIlByb3ZvbG9uZSIsCisgICAgICAgICAgICAiUHJvdm9sb25lIChBdXN0cmFsaWFuKSIsICJQeWVuZ2FuYSBDaGVkZGFyIiwgIlB5cmFtaWRlIiwgIlF1YXJrIiwKKyAgICAgICAgICAgICJRdWFyayAoQXVzdHJhbGlhbikiLCAiUXVhcnRpcm9sbyBMb21iYXJkbyIsICJRdWF0cmUtVmVudHMiLCAiUXVlcmN5IFBldGl0IiwKKyAgICAgICAgICAgICJRdWVzbyBCbGFuY28iLCAiUXVlc28gQmxhbmNvIGNvbiBGcnV0YXMgLS1QaW5hIHkgTWFuZ28iLCAiUXVlc28gZGUgTXVyY2lhIiwKKyAgICAgICAgICAgICJRdWVzbyBkZWwgTW9udHNlYyIsICJRdWVzbyBkZWwgVGlldGFyIiwgIlF1ZXNvIEZyZXNjbyIsICJRdWVzbyBGcmVzY28gKEFkb2JlcmEpIiwKKyAgICAgICAgICAgICJRdWVzbyBJYmVyaWNvIiwgIlF1ZXNvIEphbGFwZW5vIiwgIlF1ZXNvIE1ham9yZXJvIiwgIlF1ZXNvIE1lZGlhIEx1bmEiLAorICAgICAgICAgICAgIlF1ZXNvIFBhcmEgRnJpZXIiLCAiUXVlc28gUXVlc2FkaWxsYSIsICJSYWJhY2FsIiwgIlJhY2xldHRlIiwgIlJhZ3VzYW5vIiwgIlJhc2NoZXJhIiwKKyAgICAgICAgICAgICJSZWJsb2Nob24iLCAiUmVkIExlaWNlc3RlciIsICJSZWdhbCBkZSBsYSBEb21iZXMiLCAiUmVnZ2lhbml0byIsICJSZW1lZG91IiwKKyAgICAgICAgICAgICJSZXF1ZXNvbiIsICJSaWNoZWxpZXUiLCAiUmljb3R0YSIsICJSaWNvdHRhIChBdXN0cmFsaWFuKSIsICJSaWNvdHRhIFNhbGF0YSIsICJSaWRkZXIiLAorICAgICAgICAgICAgIlJpZ290dGUiLCAiUm9jYW1hZG91ciIsICJSb2xsb3QiLCAiUm9tYW5vIiwgIlJvbWFucyBQYXJ0IERpZXUiLCAiUm9uY2FsIiwgIlJvcXVlZm9ydCIsCisgICAgICAgICAgICAiUm91bGUiLCAiUm91bGVhdSBEZSBCZWF1bGlldSIsICJSb3lhbHAgVGlsc2l0IiwgIlJ1YmVucyIsICJSdXN0aW51IiwgIlNhYWxhbmQgUGZhcnIiLAorICAgICAgICAgICAgIlNhYW5lbmthZXNlIiwgIlNhZ2EiLCAiU2FnZSBEZXJieSIsICJTYWludGUgTWF1cmUiLCAiU2FpbnQtTWFyY2VsbGluIiwKKyAgICAgICAgICAgICJTYWludC1OZWN0YWlyZSIsICJTYWludC1QYXVsaW4iLCAiU2FsZXJzIiwgIlNhbXNvIiwgIlNhbiBTaW1vbiIsICJTYW5jZXJyZSIsCisgICAgICAgICAgICAiU2FwIFNhZ28iLCAiU2FyZG8iLCAiU2FyZG8gRWd5cHRpYW4iLCAiU2JyaW56IiwgIlNjYW1vcnphIiwgIlNjaGFiemllZ2VyIiwgIlNjaGxvc3MiLAorICAgICAgICAgICAgIlNlbGxlcyBzdXIgQ2hlciIsICJTZWx2YSIsICJTZXJhdCIsICJTZXJpb3VzbHkgU3Ryb25nIENoZWRkYXIiLCAiU2VycmEgZGEgRXN0cmVsYSIsCisgICAgICAgICAgICAiU2hhcnBhbSIsICJTaGVsYnVybmUgQ2hlZGRhciIsICJTaHJvcHNoaXJlIEJsdWUiLCAiU2lyYXoiLCAiU2lyZW5lIiwgIlNtb2tlZCBHb3VkYSIsCisgICAgICAgICAgICAiU29tZXJzZXQgQnJpZSIsICJTb25vbWEgSmFjayIsICJTb3R0b2NlbmFyZSBhbCBUYXJ0dWZvIiwgIlNvdW1haW50cmFpbiIsCisgICAgICAgICAgICAiU291cmlyZSBMb3plcmllbiIsICJTcGVud29vZCIsICJTcmFmZm9yZHNoaXJlIE9yZ2FuaWMiLCAiU3QuIEFndXIgQmx1ZSBDaGVlc2UiLAorICAgICAgICAgICAgIlN0aWx0b24iLCAiU3RpbmtpbmcgQmlzaG9wIiwgIlN0cmluZyIsICJTdXNzZXggU2xpcGNvdGUiLCAiU3ZlY2lhb3N0IiwgIlN3YWxlZGFsZSIsCisgICAgICAgICAgICAiU3dlZXQgU3R5bGUgU3dpc3MiLCAiU3dpc3MiLCAiU3lyaWFuIChBcm1lbmlhbiBTdHJpbmcpIiwgIlRhbGEiLCAiVGFsZWdnaW8iLCAiVGFtaWUiLAorICAgICAgICAgICAgIlRhc21hbmlhIEhpZ2hsYW5kIENoZXZyZSBMb2ciLCAiVGF1cGluaWVyZSIsICJUZWlmaSIsICJUZWxlbWVhIiwgIlRlc3RvdXJpIiwKKyAgICAgICAgICAgICJUZXRlIGRlIE1vaW5lIiwgIlRldGlsbGEiLCAiVGV4YXMgR29hdCBDaGVlc2UiLCAiVGliZXQiLCAiVGlsbGFtb29rIENoZWRkYXIiLAorICAgICAgICAgICAgIlRpbHNpdCIsICJUaW1ib29uIEJyaWUiLCAiVG9tYSIsICJUb21tZSBCcnVsZWUiLCAiVG9tbWUgZCdBYm9uZGFuY2UiLAorICAgICAgICAgICAgIlRvbW1lIGRlIENoZXZyZSIsICJUb21tZSBkZSBSb21hbnMiLCAiVG9tbWUgZGUgU2F2b2llIiwgIlRvbW1lIGRlcyBDaG91YW5zIiwgIlRvbW1lcyIsCisgICAgICAgICAgICAiVG9ydGEgZGVsIENhc2FyIiwgIlRvc2NhbmVsbG8iLCAiVG91cmVlIGRlIEwnQXViaWVyIiwgIlRvdXJtYWxldCIsCisgICAgICAgICAgICAiVHJhcHBlIChWZXJpdGFibGUpIiwgIlRyb2lzIENvcm5lcyBEZSBWZW5kZWUiLCAiVHJvbmNob24iLCAiVHJvdSBkdSBDcnUiLCAiVHJ1ZmZlIiwKKyAgICAgICAgICAgICJUdXBpIiwgIlR1cnVubWFhIiwgIlR5bXNib3JvIiwgIlR5biBHcnVnIiwgIlR5bmluZyIsICJVYnJpYWNvIiwgIlVsbG9hIiwKKyAgICAgICAgICAgICJWYWNoZXJpbi1Gcmlib3VyZ2VvaXMiLCAiVmFsZW5jYXkiLCAiVmFzdGVyYm90dGVub3N0IiwgIlZlbmFjbyIsICJWZW5kb21vaXMiLAorICAgICAgICAgICAgIlZpZXV4IENvcnNlIiwgIlZpZ25vdHRlIiwgIlZ1bHNjb21iZSIsICJXYWltYXRhIEZhcm1ob3VzZSBCbHVlIiwKKyAgICAgICAgICAgICJXYXNoZWQgUmluZCBDaGVlc2UgKEF1c3RyYWxpYW4pIiwgIldhdGVybG9vIiwgIldlaWNoa2Flc2UiLCAiV2VsbGluZ3RvbiIsCisgICAgICAgICAgICAiV2Vuc2xleWRhbGUiLCAiV2hpdGUgU3RpbHRvbiIsICJXaGl0ZXN0b25lIEZhcm1ob3VzZSIsICJXaWdtb3JlIiwgIldvb2RzaWRlIENhYmVjb3UiLAorICAgICAgICAgICAgIlhhbmFkdSIsICJYeW5vdHlybyIsICJZYXJnIENvcm5pc2giLCAiWWFycmEgVmFsbGV5IFB5cmFtaWQiLCAiWW9ya3NoaXJlIEJsdWUiLAorICAgICAgICAgICAgIlphbW9yYW5vIiwgIlphbmV0dGkgR3JhbmEgUGFkYW5vIiwgIlphbmV0dGkgUGFybWlnaWFubyBSZWdnaWFubyIKKyAgICB9OworCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczEuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCmluZGV4IGUyZDM0OGYuLjJiNWEzZjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMS5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKIAogCiAvKioKQEAgLTM3LDYgKzM4LDkgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29udHJvbHNfMSk7CiAKKyAgICAgICAgQnV0dG9uIGRpc2FibGVkQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuYnV0dG9uX2Rpc2FibGVkKTsKKyAgICAgICAgZGlzYWJsZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisKICAgICAgICAgU3Bpbm5lciBzMSA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5zcGlubmVyMSk7CiAgICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1TdHJpbmdzKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKaW5kZXggNGY0MDI0Yi4uNDJiYzI5NyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKQEAgLTE2LDM1ICsxNiw0IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKLS8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcwotLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotCi0KLS8qKgotICogQSBnYWxsZXJ5IG9mIGJhc2ljIGNvbnRyb2xzOiBCdXR0b24sIEVkaXRUZXh0LCBSYWRpb0J1dHRvbiwgQ2hlY2tib3gsCi0gKiBTcGlubmVyLiBUaGlzIGV4YW1wbGUgdXNlcyB0aGUgZGVmYXVsdCB0aGVtZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xzMiBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29udHJvbHNfMSk7Ci0KLSAgICAgICAgU3Bpbm5lciBzMSA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5zcGlubmVyMSk7Ci0gICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKLSAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1TdHJpbmdzKTsKLSAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOwotICAgICAgICBzMS5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TdHJpbmdzID0gewotCSAgICAiTWVyY3VyeSIsICJWZW51cyIsICJFYXJ0aCIsICJNYXJzIiwgIkp1cGl0ZXIiLCAiU2F0dXJuIiwgIlVyYW51cyIsICJOZXB0dW5lIgotICAgIH07Ci19CitwdWJsaWMgY2xhc3MgQ29udHJvbHMyIGV4dGVuZHMgQ29udHJvbHMxIHt9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzc2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworcHVibGljIGNsYXNzIENvbnRyb2xzMyBleHRlbmRzIENvbnRyb2xzMSB7fQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNmMzEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK3B1YmxpYyBjbGFzcyBDb250cm9sczQgZXh0ZW5kcyBDb250cm9sczEge30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzNS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjNTE1YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzNS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitwdWJsaWMgY2xhc3MgQ29udHJvbHM1IGV4dGVuZHMgQ29udHJvbHMxIHt9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczYuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDIyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczYuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworcHVibGljIGNsYXNzIENvbnRyb2xzNiBleHRlbmRzIENvbnRyb2xzMSB7fQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRHJhZ0FuZERyb3BEZW1vLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9EcmFnQW5kRHJvcERlbW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWYzYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRHJhZ0FuZERyb3BEZW1vLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5EcmFnRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBEcmFnQW5kRHJvcERlbW8gZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgVGV4dFZpZXcgbVJlc3VsdFRleHQ7CisgICAgRHJhZ2dhYmxlRG90IG1IaWRkZW5Eb3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmRyYWdfbGF5b3V0KTsKKworICAgICAgICBUZXh0VmlldyB0ZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kcmFnX3RleHQpOworICAgICAgICBEcmFnZ2FibGVEb3QgZG90ID0gKERyYWdnYWJsZURvdCkgZmluZFZpZXdCeUlkKFIuaWQuZHJhZ19kb3RfMSk7CisgICAgICAgIGRvdC5zZXRSZXBvcnRWaWV3KHRleHQpOworICAgICAgICBkb3QgPSAoRHJhZ2dhYmxlRG90KSBmaW5kVmlld0J5SWQoUi5pZC5kcmFnX2RvdF8yKTsKKyAgICAgICAgZG90LnNldFJlcG9ydFZpZXcodGV4dCk7CisgICAgICAgIGRvdCA9IChEcmFnZ2FibGVEb3QpIGZpbmRWaWV3QnlJZChSLmlkLmRyYWdfZG90XzMpOworICAgICAgICBkb3Quc2V0UmVwb3J0Vmlldyh0ZXh0KTsKKworICAgICAgICBtSGlkZGVuRG90ID0gKERyYWdnYWJsZURvdCkgZmluZFZpZXdCeUlkKFIuaWQuZHJhZ19kb3RfaGlkZGVuKTsKKyAgICAgICAgbUhpZGRlbkRvdC5zZXRSZXBvcnRWaWV3KHRleHQpOworCisgICAgICAgIG1SZXN1bHRUZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kcmFnX3Jlc3VsdF90ZXh0KTsKKyAgICAgICAgbVJlc3VsdFRleHQuc2V0T25EcmFnTGlzdGVuZXIobmV3IFZpZXcuT25EcmFnTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkRyYWcoVmlldyB2LCBEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfU1RBUlRFRDogeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJpbmcgdXAgYSBmb3VydGggZHJhZ2dhYmxlIGRvdCBvbiB0aGUgZmx5LiBOb3RlIHRoYXQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByb3Blcmx5IG5vdGlmaWVkIGFib3V0IHRoZSBvbmdvaW5nIGRyYWcsIGFuZCBsaWdodHMgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGluZGljYXRlIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgY3VycmVudCBjb250ZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgbUhpZGRlbkRvdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIHN1cnByaXNlIGFnYWluCisgICAgICAgICAgICAgICAgICAgICAgICBtSGlkZGVuRG90LnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgdGhlIGRyb3Avbm8tZHJvcCByZXN1bHQgdG8gdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcHBlZCA9IGV2ZW50LmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFRleHQuc2V0VGV4dChkcm9wcGVkID8gIkRyb3BwZWQhIiA6ICJObyBkcm9wIik7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0RyYWdnYWJsZURvdC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRHJhZ2dhYmxlRG90LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNGVhNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0RyYWdnYWJsZURvdC5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRHJhZ2dhYmxlRG90IGV4dGVuZHMgVmlldyB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRHJhZ2dhYmxlRG90IjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ0luUHJvZ3Jlc3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Ib3ZlcmluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFjY2VwdHNEcmFnOworICAgIFRleHRWaWV3IG1SZXBvcnRWaWV3OworCisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBUZXh0UGFpbnQgbUxlZ2VuZFBhaW50OworICAgIHByaXZhdGUgUGFpbnQgbUdsb3c7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9HTE9XX1NURVBTID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOX1NURVAgPSAweDAwMDBGRjAwIC8gTlVNX0dMT1dfU1RFUFM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdISVRFX1NURVAgPSAweDAwRkZGRkZGIC8gTlVNX0dMT1dfU1RFUFM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMUEhBX1NURVAgPSAweEZGMDAwMDAwIC8gTlVNX0dMT1dfU1RFUFM7CisKKyAgICBpbnQgbVJhZGl1czsKKyAgICBpbnQgbUFuclR5cGU7CisgICAgQ2hhclNlcXVlbmNlIG1MZWdlbmQ7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IEFOUl9OT05FID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEFOUl9TSEFET1cgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5SX0RST1AgPSAyOworCisgICAgdm9pZCBzbGVlcFNpeFNlY29uZHMoKSB7CisgICAgICAgIC8vIGhhbmcgZm9yZXZlcjsgZ29vZCBmb3IgcHJvZHVjaW5nIEFOUnMKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBkbyB7CisgICAgICAgICAgICB0cnkgeyBUaHJlYWQuc2xlZXAoMTAwMCk7IH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0gd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIDwgc3RhcnQgKyA2MDAwKTsKKyAgICB9CisKKyAgICAvLyBTaGFkb3cgYnVpbGRlciB0aGF0IGNhbiBBTlIgaWYgZGVzaXJlZAorICAgIGNsYXNzIEFOUlNoYWRvd0J1aWxkZXIgZXh0ZW5kcyBEcmFnU2hhZG93QnVpbGRlciB7CisgICAgICAgIGJvb2xlYW4gbURvQW5yOworCisgICAgICAgIHB1YmxpYyBBTlJTaGFkb3dCdWlsZGVyKFZpZXcgdmlldywgYm9vbGVhbiBkb0FucikgeworICAgICAgICAgICAgc3VwZXIodmlldyk7CisgICAgICAgICAgICBtRG9BbnIgPSBkb0FucjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdTaGFkb3coQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgaWYgKG1Eb0FucikgeworICAgICAgICAgICAgICAgIHNsZWVwU2l4U2Vjb25kcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIub25EcmF3U2hhZG93KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRHJhZ2dhYmxlRG90KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKworICAgICAgICBtTGVnZW5kID0gIiI7CisKKyAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIG1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgIG1QYWludC5zZXRTdHJva2VXaWR0aCg2KTsKKyAgICAgICAgbVBhaW50LnNldENvbG9yKDB4RkZEMDAwMDApOworCisgICAgICAgIG1MZWdlbmRQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKyAgICAgICAgbUxlZ2VuZFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgbUxlZ2VuZFBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5DRU5URVIpOworICAgICAgICBtTGVnZW5kUGFpbnQuc2V0Q29sb3IoMHhGRkYwRjBGRik7CisKKyAgICAgICAgbUdsb3cgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgbUdsb3cuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICBtR2xvdy5zZXRTdHJva2VXaWR0aCgxKTsKKyAgICAgICAgbUdsb3cuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKworICAgICAgICAvLyBsb29rIHVwIGFueSBsYXlvdXQtZGVmaW5lZCBhdHRyaWJ1dGVzCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5EcmFnZ2FibGVEb3QpOworCisgICAgICAgIGZpbmFsIGludCBOID0gYS5nZXRJbmRleENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYXR0ciA9IGEuZ2V0SW5kZXgoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKGF0dHIpIHsKKyAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuRHJhZ2dhYmxlRG90X3JhZGl1czogeworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZShhdHRyLCAwKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuRHJhZ2dhYmxlRG90X2xlZ2VuZDogeworICAgICAgICAgICAgICAgIG1MZWdlbmQgPSBhLmdldFRleHQoYXR0cik7CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLkRyYWdnYWJsZURvdF9hbnI6IHsKKyAgICAgICAgICAgICAgICBtQW5yVHlwZSA9IGEuZ2V0SW50KGF0dHIsIDApOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExvZy5pKFRBRywgIkRyYWdnYWJsZURvdCBAICIgKyB0aGlzICsgIiA6IHJhZGl1cz0iICsgbVJhZGl1cyArICIgbGVnZW5kPSciICsgbUxlZ2VuZAorICAgICAgICAgICAgICAgICsgIicgYW5yPSIgKyBtQW5yVHlwZSk7CisKKyAgICAgICAgc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25Mb25nQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgQ2xpcERhdGEgZGF0YSA9IENsaXBEYXRhLm5ld1BsYWluVGV4dCgiZG90IiwgIkRvdCA6ICIgKyB2LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHYuc3RhcnREcmFnKGRhdGEsIG5ldyBBTlJTaGFkb3dCdWlsZGVyKHYsIG1BbnJUeXBlID09IEFOUl9TSEFET1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdCl2LCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBzZXRSZXBvcnRWaWV3KFRleHRWaWV3IHZpZXcpIHsKKyAgICAgICAgbVJlcG9ydFZpZXcgPSB2aWV3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGZsb2F0IHdmID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgZmxvYXQgaGYgPSBnZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgY3ggPSB3Zi8yOworICAgICAgICBmaW5hbCBmbG9hdCBjeSA9IGhmLzI7CisgICAgICAgIHdmIC09IGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgaGYgLT0gZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmbG9hdCByYWQgPSAod2YgPCBoZikgPyB3Zi8yIDogaGYvMjsKKyAgICAgICAgY2FudmFzLmRyYXdDaXJjbGUoY3gsIGN5LCByYWQsIG1QYWludCk7CisKKyAgICAgICAgaWYgKG1MZWdlbmQgIT0gbnVsbCAmJiBtTGVnZW5kLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KG1MZWdlbmQsIDAsIG1MZWdlbmQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIGN4LCBjeSArIG1MZWdlbmRQYWludC5nZXRGb250U3BhY2luZygpLzIsCisgICAgICAgICAgICAgICAgICAgIG1MZWdlbmRQYWludCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZHJhZywgbGlnaHQgdXAgYXMgYSBwb3RlbnRpYWwgdGFyZ2V0CisgICAgICAgIGlmIChtRHJhZ0luUHJvZ3Jlc3MgJiYgbUFjY2VwdHNEcmFnKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gTlVNX0dMT1dfU1RFUFM7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAobUhvdmVyaW5nKSA/IFdISVRFX1NURVAgOiBHUkVFTl9TVEVQOworICAgICAgICAgICAgICAgIGNvbG9yID0gaSooY29sb3IgfCBBTFBIQV9TVEVQKTsKKyAgICAgICAgICAgICAgICBtR2xvdy5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdDaXJjbGUoY3gsIGN5LCByYWQsIG1HbG93KTsKKyAgICAgICAgICAgICAgICByYWQgLT0gMC41ZjsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0NpcmNsZShjeCwgY3ksIHJhZCwgbUdsb3cpOworICAgICAgICAgICAgICAgIHJhZCAtPSAwLjVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aFNwZWMsIGludCBoZWlnaHRTcGVjKSB7CisgICAgICAgIGludCB0b3RhbERpYW1ldGVyID0gMiptUmFkaXVzICsgZ2V0UGFkZGluZ0xlZnQoKSArIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih0b3RhbERpYW1ldGVyLCB0b3RhbERpYW1ldGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcmFnIGFuZCBkcm9wCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25EcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfU1RBUlRFRDogeworICAgICAgICAgICAgLy8gY2xhaW0gdG8gYWNjZXB0IGFueSBkcmFnZ2VkIGNvbnRlbnQKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRyYWcgc3RhcnRlZCwgZXZlbnQ9IiArIGV2ZW50KTsKKyAgICAgICAgICAgIC8vIGNhY2hlIHdoZXRoZXIgd2UgYWNjZXB0IHRoZSBkcmFnIHRvIHJldHVybiBmb3IgTE9DQVRJT04gZXZlbnRzCisgICAgICAgICAgICBtRHJhZ0luUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbUFjY2VwdHNEcmFnID0gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlZHJhdyBpbiB0aGUgbmV3IHZpc3VhbCBzdGF0ZSBpZiB3ZSBhcmUgYSBwb3RlbnRpYWwgZHJvcCB0YXJnZXQKKyAgICAgICAgICAgIGlmIChtQWNjZXB0c0RyYWcpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRU5ERUQ6IHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRyYWcgZW5kZWQuIik7CisgICAgICAgICAgICBpZiAobUFjY2VwdHNEcmFnKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURyYWdJblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICBtSG92ZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTjogeworICAgICAgICAgICAgLy8gd2UgcmV0dXJuZWQgdHJ1ZSB0byBEUkFHX1NUQVJURUQsIHNvIHJldHVybiB0cnVlIGhlcmUKKyAgICAgICAgICAgIExvZy5pKFRBRywgIi4uLiBzZWVpbmcgZHJhZyBsb2NhdGlvbnMgLi4uIik7CisgICAgICAgICAgICByZXN1bHQgPSBtQWNjZXB0c0RyYWc7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RST1A6IHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkdvdCBhIGRyb3AhIGRvdD0iICsgdGhpcyArICIgZXZlbnQ9IiArIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChtQW5yVHlwZSA9PSBBTlJfRFJPUCkgeworICAgICAgICAgICAgICAgIHNsZWVwU2l4U2Vjb25kcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvY2Vzc0Ryb3AoZXZlbnQpOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FTlRFUkVEOiB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJFbnRlcmVkIGRvdCBAICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1Ib3ZlcmluZyA9IHRydWU7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRVhJVEVEOiB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJFeGl0ZWQgZG90IEAgIiArIHRoaXMpOworICAgICAgICAgICAgbUhvdmVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExvZy5pKFRBRywgIm90aGVyIGRyYWcgZXZlbnQ6ICIgKyBldmVudCk7CisgICAgICAgICAgICByZXN1bHQgPSBtQWNjZXB0c0RyYWc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEcm9wKERyYWdFdmVudCBldmVudCkgeworICAgICAgICBmaW5hbCBDbGlwRGF0YSBkYXRhID0gZXZlbnQuZ2V0Q2xpcERhdGEoKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBkYXRhLmdldEl0ZW1Db3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQ2xpcERhdGEuSXRlbSBpdGVtID0gZGF0YS5nZXRJdGVtQXQoaSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJEcm9wcGVkIGl0ZW0gIiArIGkgKyAiIDogIiArIGl0ZW0pOworICAgICAgICAgICAgaWYgKG1SZXBvcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGl0ZW0uY29lcmNlVG9UZXh0KGdldENvbnRleHQoKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0TG9jYWxTdGF0ZSgpID09IChPYmplY3QpIHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiIDogRHJvcHBlZCBvbiBzZWxmISI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1SZXBvcnRWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9FeHBhbmRhYmxlTGlzdDIuamF2YQppbmRleCBiNmNjZTI5Li44YjJjYjQzIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9FeHBhbmRhYmxlTGlzdDIuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9FeHBhbmRhYmxlTGlzdDIuamF2YQpAQCAtMTcsNzEgKzE3LDEyMiBAQAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkV4cGFuZGFibGVMaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JUcmVlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JUcmVlQWRhcHRlcjsKIAogLyoqCiAgKiBEZW1vbnN0cmF0ZXMgZXhwYW5kYWJsZSBsaXN0cyBiYWNrZWQgYnkgQ3Vyc29ycwogICovCiBwdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3QyIGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT05UQUNUX0lEID0gMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEFDVFNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgIENvbnRhY3RzLl9JRCwKICAgICAgICAgQ29udGFjdHMuRElTUExBWV9OQU1FCiAgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfSURfQ09MVU1OX0lOREVYID0gMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBQaG9uZS5fSUQsCi0gICAgICAgIFBob25lLkNPTlRBQ1RfSUQsCi0gICAgICAgIFBob25lLk5VTUJFUgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX05VTUJFUl9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIFBob25lLl9JRCwKKyAgICAgICAgICAgIFBob25lLk5VTUJFUgogICAgIH07CiAKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fR1JPVVAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9DSElMRCA9IDE7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUXVlcnlIYW5kbGVyIGV4dGVuZHMgQXN5bmNRdWVyeUhhbmRsZXIgeworICAgICAgICBwcml2YXRlIEN1cnNvclRyZWVBZGFwdGVyIG1BZGFwdGVyOwogCi0gICAgICAgIC8vIFF1ZXJ5IGZvciBwZW9wbGUKLSAgICAgICAgQ3Vyc29yIGdyb3VwQ3Vyc29yID0gbWFuYWdlZFF1ZXJ5KENvbnRhY3RzLkNPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgIENPTlRBQ1RfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHB1YmxpYyBRdWVyeUhhbmRsZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmVlQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpKTsKKyAgICAgICAgICAgIHRoaXMubUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICB9CiAKLSAgICAgICAgLy8gU2V0IHVwIG91ciBhZGFwdGVyCi0gICAgICAgIG1BZGFwdGVyID0gbmV3IE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKGdyb3VwQ3Vyc29yLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfZXhwYW5kYWJsZV9saXN0X2l0ZW1fMSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9leHBhbmRhYmxlX2xpc3RfaXRlbV8xLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Q29udGFjdHMuRElTUExBWV9OQU1FfSwgLy8gTmFtZSBmb3IgZ3JvdXAgbGF5b3V0cwotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7YW5kcm9pZC5SLmlkLnRleHQxfSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1Bob25lLk5VTUJFUn0sIC8vIE51bWJlciBmb3IgY2hpbGQgbGF5b3V0cwotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7YW5kcm9pZC5SLmlkLnRleHQxfSk7Ci0gICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICAgIGNhc2UgVE9LRU5fR1JPVVA6CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIuc2V0R3JvdXBDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUT0tFTl9DSElMRDoKKyAgICAgICAgICAgICAgICBpbnQgZ3JvdXBQb3NpdGlvbiA9IChJbnRlZ2VyKSBjb29raWU7CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIuc2V0Q2hpbGRyZW5DdXJzb3IoZ3JvdXBQb3NpdGlvbiwgY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBjbGFzcyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlciBleHRlbmRzIFNpbXBsZUN1cnNvclRyZWVBZGFwdGVyIHsKIAotICAgICAgICBwdWJsaWMgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoQ3Vyc29yIGN1cnNvciwgQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXBMYXlvdXQsCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgdGFrZSBhIEN1cnNvci4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIHF1ZXJ5aW5nIHRoZSAKKyAgICAgICAgLy8gZGF0YWJhc2Ugb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICBwdWJsaWMgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXBMYXlvdXQsCiAgICAgICAgICAgICAgICAgaW50IGNoaWxkTGF5b3V0LCBTdHJpbmdbXSBncm91cEZyb20sIGludFtdIGdyb3VwVG8sIFN0cmluZ1tdIGNoaWxkcmVuRnJvbSwKICAgICAgICAgICAgICAgICBpbnRbXSBjaGlsZHJlblRvKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjdXJzb3IsIGdyb3VwTGF5b3V0LCBncm91cEZyb20sIGdyb3VwVG8sIGNoaWxkTGF5b3V0LCBjaGlsZHJlbkZyb20sCisKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGdyb3VwTGF5b3V0LCBncm91cEZyb20sIGdyb3VwVG8sIGNoaWxkTGF5b3V0LCBjaGlsZHJlbkZyb20sCiAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuVG8pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBDdXJzb3IgZ2V0Q2hpbGRyZW5DdXJzb3IoQ3Vyc29yIGdyb3VwQ3Vyc29yKSB7Ci0gICAgICAgICAgICBpbnQgY29udGFjdElkID0gZ3JvdXBDdXJzb3IuZ2V0SW50KENPTFVNTl9DT05UQUNUX0lEKTsKLSAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCBDdXJzb3IgTVVTVCBiZSBtYW5hZ2VkIGJ5IHVzLCBzbyB3ZSB1c2UgQWN0aXZpdHkncyBoZWxwZXIKLSAgICAgICAgICAgIC8vIGZ1bmN0aW9uYWxpdHkgdG8gbWFuYWdlIGl0IGZvciB1cy4KLSAgICAgICAgICAgIHJldHVybiBtYW5hZ2VkUXVlcnkoUGhvbmUuQ09OVEVOVF9VUkksCi0gICAgICAgICAgICAgICAgICAgIFBIT05FX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgIFBob25lLkNPTlRBQ1RfSUQgKyAiID0gIiArIGNvbnRhY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAvLyBHaXZlbiB0aGUgZ3JvdXAsIHdlIHJldHVybiBhIGN1cnNvciBmb3IgYWxsIHRoZSBjaGlsZHJlbiB3aXRoaW4gdGhhdCBncm91cCAKKworICAgICAgICAgICAgLy8gUmV0dXJuIGEgY3Vyc29yIHRoYXQgcG9pbnRzIHRvIHRoaXMgY29udGFjdCdzIHBob25lIG51bWJlcnMKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDb250YWN0cy5DT05URU5UX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGdyb3VwQ3Vyc29yLmdldExvbmcoR1JPVVBfSURfQ09MVU1OX0lOREVYKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZEVuY29kZWRQYXRoKENvbnRhY3RzLkRhdGEuQ09OVEVOVF9ESVJFQ1RPUlkpOworICAgICAgICAgICAgVXJpIHBob25lTnVtYmVyc1VyaSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NISUxELCBncm91cEN1cnNvci5nZXRQb3NpdGlvbigpLCBwaG9uZU51bWJlcnNVcmksIAorICAgICAgICAgICAgICAgICAgICBQSE9ORV9OVU1CRVJfUFJPSkVDVElPTiwgUGhvbmUuTUlNRVRZUEUgKyAiPT8iLCAKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUgfSwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDdXJzb3JUcmVlQWRhcHRlciBtQWRhcHRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBTZXQgdXAgb3VyIGFkYXB0ZXIKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9leHBhbmRhYmxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzEsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ29udGFjdHMuRElTUExBWV9OQU1FIH0sIC8vIE5hbWUgZm9yIGdyb3VwIGxheW91dHMKKyAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEgfSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBQaG9uZS5OVU1CRVIgfSwgLy8gTnVtYmVyIGZvciBjaGlsZCBsYXlvdXRzCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxIH0pOworCisgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICBtUXVlcnlIYW5kbGVyID0gbmV3IFF1ZXJ5SGFuZGxlcih0aGlzLCBtQWRhcHRlcik7CisKKyAgICAgICAgLy8gUXVlcnkgZm9yIHBlb3BsZQorICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fR1JPVVAsIG51bGwsIENvbnRhY3RzLkNPTlRFTlRfVVJJLCBDT05UQUNUU19QUk9KRUNUSU9OLCAKKyAgICAgICAgICAgICAgICBDb250YWN0cy5IQVNfUEhPTkVfTlVNQkVSICsgIj0xIiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICAvLyBOdWxsIG91dCB0aGUgZ3JvdXAgY3Vyc29yLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGdyb3VwIGN1cnNvciBhbmQgYWxsIG9mIHRoZSBjaGlsZCBjdXJzb3JzCisgICAgICAgIC8vIHRvIGJlIGNsb3NlZC4KKyAgICAgICAgbUFkYXB0ZXIuY2hhbmdlQ3Vyc29yKG51bGwpOworICAgICAgICBtQWRhcHRlciA9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRm9jdXM1LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Gb2N1czUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg2NzFjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRm9jdXM1LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK3B1YmxpYyBjbGFzcyBGb2N1czUgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZvY3VzXzUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbGxlcnkxLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYWxsZXJ5MS5qYXZhCmluZGV4IDdhYWFhZWYuLmIyNTJkNWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbGxlcnkxLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR2FsbGVyeTEuamF2YQpAQCAtNzEsOCArNzEsMjUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgY2xhc3MgSW1hZ2VBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBpbnQgbUdhbGxlcnlJdGVtQmFja2dyb3VuZDsKLSAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX1dJRFRIID0gMTM2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTV9IRUlHSFQgPSA4ODsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtR2FsbGVyeUl0ZW1CYWNrZ3JvdW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyW10gbUltYWdlSWRzID0geworICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18xLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18yLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18zLAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b180LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b181LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b182LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b183LAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b184CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGVuc2l0eTsKKwogICAgICAgICBwdWJsaWMgSW1hZ2VBZGFwdGVyKENvbnRleHQgYykgewogICAgICAgICAgICAgbUNvbnRleHQgPSBjOwogICAgICAgICAgICAgLy8gU2VlIHJlcy92YWx1ZXMvYXR0cnMueG1sIGZvciB0aGUgPGRlY2xhcmUtc3R5bGVhYmxlPiB0aGF0IGRlZmluZXMKQEAgLTgxLDYgKzk4LDggQEAKICAgICAgICAgICAgIG1HYWxsZXJ5SXRlbUJhY2tncm91bmQgPSBhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkdhbGxlcnkxX2FuZHJvaWRfZ2FsbGVyeUl0ZW1CYWNrZ3JvdW5kLCAwKTsKICAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBtRGVuc2l0eSA9IGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKQEAgLTk2LDMwICsxMTUsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaSA9IG5ldyBJbWFnZVZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgSW1hZ2VWaWV3IGltYWdlVmlldzsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udmVydFZpZXcgPSBuZXcgSW1hZ2VWaWV3KG1Db250ZXh0KTsKIAotICAgICAgICAgICAgaS5zZXRJbWFnZVJlc291cmNlKG1JbWFnZUlkc1twb3NpdGlvbl0pOwotICAgICAgICAgICAgaS5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkpOwotICAgICAgICAgICAgaS5zZXRMYXlvdXRQYXJhbXMobmV3IEdhbGxlcnkuTGF5b3V0UGFyYW1zKDEzNiwgODgpKTsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0U2NhbGVUeXBlKEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZKTsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBHYWxsZXJ5LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChJVEVNX1dJRFRIICogbURlbnNpdHkgKyAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChJVEVNX0hFSUdIVCAqIG1EZW5zaXR5ICsgMC41ZikpKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIHByZWZlcnJlZCBHYWxsZXJ5IGl0ZW0gYmFja2dyb3VuZAotICAgICAgICAgICAgaS5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UobUdhbGxlcnlJdGVtQmFja2dyb3VuZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgR2FsbGVyeSBpdGVtIGJhY2tncm91bmQKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcuc2V0QmFja2dyb3VuZFJlc291cmNlKG1HYWxsZXJ5SXRlbUJhY2tncm91bmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlUmVzb3VyY2UobUltYWdlSWRzW3Bvc2l0aW9uXSk7CisKKyAgICAgICAgICAgIHJldHVybiBpbWFnZVZpZXc7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyW10gbUltYWdlSWRzID0gewotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18xLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18yLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b18zLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b180LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b181LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b182LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b183LAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuZ2FsbGVyeV9waG90b184Ci0gICAgICAgIH07CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYW1lQ29udHJvbGxlcklucHV0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYW1lQ29udHJvbGxlcklucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYTk0OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbWVDb250cm9sbGVySW5wdXQuamF2YQpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZS5Nb3Rpb25SYW5nZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKKworLyoqCisgKiBEZW1vbnN0cmF0ZXMgaG93IHRvIHByb2Nlc3MgaW5wdXQgZXZlbnRzIHJlY2VpdmVkIGZyb20gZ2FtZSBjb250cm9sbGVycy4KKyAqCisgKiBUaGlzIGFjdGl2aXR5IGRpc3BsYXlzIGJ1dHRvbiBzdGF0ZXMgYW5kIGpveXN0aWNrIHBvc2l0aW9ucy4KKyAqIEFsc28gd3JpdGVzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHJlbGV2YW50IGlucHV0IGV2ZW50cyB0byB0aGUgbG9nLgorICoKKyAqIFRoZSBnYW1lIGNvbnRyb2xsZXIgaXMgYWxzbyB1c2VzIHRvIGNvbnRyb2wgYSB2ZXJ5IHNpbXBsZSBnYW1lLiAgU2VlIHtAbGluayBHYW1lVmlld30KKyAqIGZvciB0aGUgZ2FtZSBpdHNlbGYuCisgKi8KK3B1YmxpYyBjbGFzcyBHYW1lQ29udHJvbGxlcklucHV0IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiR2FtZUNvbnRyb2xsZXJJbnB1dCI7CisKKyAgICBwcml2YXRlIFNwYXJzZUFycmF5PElucHV0RGV2aWNlU3RhdGU+IG1JbnB1dERldmljZVN0YXRlczsKKyAgICBwcml2YXRlIEdhbWVWaWV3IG1HYW1lOworICAgIHByaXZhdGUgTGlzdFZpZXcgbVN1bW1hcnlMaXN0OworICAgIHByaXZhdGUgU3VtbWFyeUFkYXB0ZXIgbVN1bW1hcnlBZGFwdGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1JbnB1dERldmljZVN0YXRlcyA9IG5ldyBTcGFyc2VBcnJheTxJbnB1dERldmljZVN0YXRlPigpOworICAgICAgICBtU3VtbWFyeUFkYXB0ZXIgPSBuZXcgU3VtbWFyeUFkYXB0ZXIodGhpcywgZ2V0UmVzb3VyY2VzKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmdhbWVfY29udHJvbGxlcl9pbnB1dCk7CisKKyAgICAgICAgbUdhbWUgPSAoR2FtZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmdhbWUpOworCisgICAgICAgIG1TdW1tYXJ5TGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3VtbWFyeSk7CisgICAgICAgIG1TdW1tYXJ5TGlzdC5zZXRBZGFwdGVyKG1TdW1tYXJ5QWRhcHRlcik7CisgICAgICAgIG1TdW1tYXJ5TGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgbVN1bW1hcnlBZGFwdGVyLm9uSXRlbUNsaWNrKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNGb2N1cykgeworICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNGb2N1cyk7CisKKyAgICAgICAgbUdhbWUucmVxdWVzdEZvY3VzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBVcGRhdGUgZGV2aWNlIHN0YXRlIGZvciB2aXN1YWxpemF0aW9uIGFuZCBsb2dnaW5nLgorICAgICAgICBJbnB1dERldmljZVN0YXRlIHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShldmVudCk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm9uS2V5RG93bihldmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdW1tYXJ5QWRhcHRlci5zaG93KHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm9uS2V5VXAoZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VtbWFyeUFkYXB0ZXIuc2hvdyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoR2VuZXJpY01vdGlvbkV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGV2ZW50IGNhbWUgZnJvbSBhIGpveXN0aWNrIHNpbmNlIGEgZ2VuZXJpYyBtb3Rpb24gZXZlbnQKKyAgICAgICAgLy8gY291bGQgYmUgYWxtb3N0IGFueXRoaW5nLgorICAgICAgICBpZiAoKGV2ZW50LmdldFNvdXJjZSgpICYgSW5wdXREZXZpY2UuU09VUkNFX0NMQVNTX0pPWVNUSUNLKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBkZXZpY2Ugc3RhdGUgZm9yIHZpc3VhbGl6YXRpb24gYW5kIGxvZ2dpbmcuCisgICAgICAgICAgICBJbnB1dERldmljZVN0YXRlIHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShldmVudCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5vbkpveXN0aWNrTW90aW9uKGV2ZW50KSkgeworICAgICAgICAgICAgICAgIG1TdW1tYXJ5QWRhcHRlci5zaG93KHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hHZW5lcmljTW90aW9uRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgSW5wdXREZXZpY2VTdGF0ZSBnZXRJbnB1dERldmljZVN0YXRlKElucHV0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGRldmljZUlkID0gZXZlbnQuZ2V0RGV2aWNlSWQoKTsKKyAgICAgICAgSW5wdXREZXZpY2VTdGF0ZSBzdGF0ZSA9IG1JbnB1dERldmljZVN0YXRlcy5nZXQoZGV2aWNlSWQpOworICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSW5wdXREZXZpY2UgZGV2aWNlID0gZXZlbnQuZ2V0RGV2aWNlKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlID0gbmV3IElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIG1JbnB1dERldmljZVN0YXRlcy5wdXQoZGV2aWNlSWQsIHN0YXRlKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCBkZXZpY2UudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYWNrcyB0aGUgc3RhdGUgb2Ygam95c3RpY2sgYXhlcyBhbmQgZ2FtZSBjb250cm9sbGVyIGJ1dHRvbnMgZm9yIGEgcGFydGljdWxhcgorICAgICAqIGlucHV0IGRldmljZSBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnB1dERldmljZVN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dERldmljZSBtRGV2aWNlOworICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1BeGVzOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUF4aXNWYWx1ZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlSW50QXJyYXkgbUtleXM7CisKKyAgICAgICAgcHVibGljIElucHV0RGV2aWNlU3RhdGUoSW5wdXREZXZpY2UgZGV2aWNlKSB7CisgICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworCisgICAgICAgICAgICBpbnQgbnVtQXhlcyA9IDA7CisgICAgICAgICAgICBmb3IgKE1vdGlvblJhbmdlIHJhbmdlIDogZGV2aWNlLmdldE1vdGlvblJhbmdlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKChyYW5nZS5nZXRTb3VyY2UoKSAmIElucHV0RGV2aWNlLlNPVVJDRV9DTEFTU19KT1lTVElDSykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBudW1BeGVzICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQXhlcyA9IG5ldyBpbnRbbnVtQXhlc107CisgICAgICAgICAgICBtQXhpc1ZhbHVlcyA9IG5ldyBmbG9hdFtudW1BeGVzXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoTW90aW9uUmFuZ2UgcmFuZ2UgOiBkZXZpY2UuZ2V0TW90aW9uUmFuZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJhbmdlLmdldFNvdXJjZSgpICYgSW5wdXREZXZpY2UuU09VUkNFX0NMQVNTX0pPWVNUSUNLKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG51bUF4ZXMgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUF4ZXNbaSsrXSA9IHJhbmdlLmdldEF4aXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUtleXMgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnB1dERldmljZSBnZXREZXZpY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbURldmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QXhpc0NvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1BeGVzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QXhpcyhpbnQgYXhpc0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbUF4ZXNbYXhpc0luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBeGlzVmFsdWUoaW50IGF4aXNJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1BeGlzVmFsdWVzW2F4aXNJbmRleF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEtleUNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1LZXlzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0S2V5Q29kZShpbnQga2V5SW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtS2V5cy5rZXlBdChrZXlJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0tleVByZXNzZWQoaW50IGtleUluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbUtleXMudmFsdWVBdChrZXlJbmRleCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihLZXlFdmVudCBldmVudCkgeworICAgICAgICAgICAgZmluYWwgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisgICAgICAgICAgICBpZiAoaXNHYW1lS2V5KGtleUNvZGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFJlcGVhdENvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3ltYm9saWNOYW1lID0gS2V5RXZlbnQua2V5Q29kZVRvU3RyaW5nKGtleUNvZGUpOworICAgICAgICAgICAgICAgICAgICBtS2V5cy5wdXQoa2V5Q29kZSwgMSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbURldmljZS5nZXROYW1lKCkgKyAiIC0gS2V5IERvd246ICIgKyBzeW1ib2xpY05hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gZXZlbnQuZ2V0S2V5Q29kZSgpOworICAgICAgICAgICAgaWYgKGlzR2FtZUtleShrZXlDb2RlKSkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1LZXlzLmluZGV4T2ZLZXkoa2V5Q29kZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN5bWJvbGljTmFtZSA9IEtleUV2ZW50LmtleUNvZGVUb1N0cmluZyhrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbUtleXMucHV0KGtleUNvZGUsIDApOworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIG1EZXZpY2UuZ2V0TmFtZSgpICsgIiAtIEtleSBVcDogIiArIHN5bWJvbGljTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kb3lzdGlja01vdGlvbihNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKG1EZXZpY2UuZ2V0TmFtZSgpKS5hcHBlbmQoIiAtIEpveXN0aWNrIE1vdGlvbjpcbiIpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgaGlzdG9yeVNpemUgPSBldmVudC5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXhlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBheGlzID0gbUF4ZXNbaV07CisgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgdmFsdWUgPSBldmVudC5nZXRBeGlzVmFsdWUoYXhpcyk7CisgICAgICAgICAgICAgICAgbUF4aXNWYWx1ZXNbaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiICAiKS5hcHBlbmQoTW90aW9uRXZlbnQuYXhpc1RvU3RyaW5nKGF4aXMpKS5hcHBlbmQoIjogIik7CisKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgYWxsIGhpc3RvcmljYWwgdmFsdWVzIGluIHRoZSBiYXRjaC4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBoaXN0b3J5UG9zID0gMDsgaGlzdG9yeVBvcyA8IGhpc3RvcnlTaXplOyBoaXN0b3J5UG9zKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZXZlbnQuZ2V0SGlzdG9yaWNhbEF4aXNWYWx1ZShheGlzLCBoaXN0b3J5UG9zKSk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgY3VycmVudCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuaShUQUcsIG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIGtleSB3ZSBjYXJlIGFib3V0LgorICAgICAgICAvLyBJbiBhIHJlYWwgZ2FtZSwgd2Ugd291bGQgcHJvYmFibHkgbGV0IHRoZSB1c2VyIGNvbmZpZ3VyZSB3aGljaCBrZXlzIHRvIHVzZQorICAgICAgICAvLyBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlIGtleXMgbGlrZSB0aGlzLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR2FtZUtleShpbnQga2V5Q29kZSkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUOgorICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUOgorICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5pc0dhbWVwYWRCdXR0b24oa2V5Q29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3QgYWRhcHRlciB0aGF0IGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgZGV2aWNlIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1bW1hcnlBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9JRF9IRUFESU5HID0gMSA8PCAxMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfSURfREVWSUNFX0lURU0gPSAyIDw8IDEwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9JRF9BWElTX0lURU0gPSAzIDw8IDEwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9JRF9LRVlfSVRFTSA9IDQgPDwgMTA7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlcyBtUmVzb3VyY2VzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8SXRlbT4gbURhdGFJdGVtcyA9IG5ldyBTcGFyc2VBcnJheTxJdGVtPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJdGVtPiBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSGVhZGluZyBtRGV2aWNlSGVhZGluZzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXh0Q29sdW1uIG1EZXZpY2VOYW1lVGV4dENvbHVtbjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhlYWRpbmcgbUF4ZXNIZWFkaW5nOworICAgICAgICBwcml2YXRlIGZpbmFsIEhlYWRpbmcgbUtleXNIZWFkaW5nOworCisgICAgICAgIHByaXZhdGUgSW5wdXREZXZpY2VTdGF0ZSBtU3RhdGU7CisKKyAgICAgICAgcHVibGljIFN1bW1hcnlBZGFwdGVyKENvbnRleHQgY29udGV4dCwgUmVzb3VyY2VzIHJlc291cmNlcykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbVJlc291cmNlcyA9IHJlc291cmNlczsKKworICAgICAgICAgICAgbURldmljZUhlYWRpbmcgPSBuZXcgSGVhZGluZyhCQVNFX0lEX0hFQURJTkcgfCAwLAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5nYW1lX2NvbnRyb2xsZXJfaW5wdXRfaGVhZGluZ19kZXZpY2UpKTsKKyAgICAgICAgICAgIG1EZXZpY2VOYW1lVGV4dENvbHVtbiA9IG5ldyBUZXh0Q29sdW1uKEJBU0VfSURfREVWSUNFX0lURU0gfCAwLAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5nYW1lX2NvbnRyb2xsZXJfaW5wdXRfbGFiZWxfZGV2aWNlX25hbWUpKTsKKworICAgICAgICAgICAgbUF4ZXNIZWFkaW5nID0gbmV3IEhlYWRpbmcoQkFTRV9JRF9IRUFESU5HIHwgMSwKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZ2FtZV9jb250cm9sbGVyX2lucHV0X2hlYWRpbmdfYXhlcykpOworICAgICAgICAgICAgbUtleXNIZWFkaW5nID0gbmV3IEhlYWRpbmcoQkFTRV9JRF9IRUFESU5HIHwgMiwKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZ2FtZV9jb250cm9sbGVyX2lucHV0X2hlYWRpbmdfa2V5cykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUb2FzdCB0b2FzdCA9IFRvYXN0Lm1ha2VUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQsIG1TdGF0ZS5nZXREZXZpY2UoKS50b1N0cmluZygpLCBUb2FzdC5MRU5HVEhfTE9ORyk7CisgICAgICAgICAgICAgICAgdG9hc3Quc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdyhJbnB1dERldmljZVN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIG1WaXNpYmxlSXRlbXMuY2xlYXIoKTsKKworICAgICAgICAgICAgLy8gUG9wdWxhdGUgZGV2aWNlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgbVZpc2libGVJdGVtcy5hZGQobURldmljZUhlYWRpbmcpOworICAgICAgICAgICAgbURldmljZU5hbWVUZXh0Q29sdW1uLnNldENvbnRlbnQoc3RhdGUuZ2V0RGV2aWNlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIG1WaXNpYmxlSXRlbXMuYWRkKG1EZXZpY2VOYW1lVGV4dENvbHVtbik7CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIGF4ZXMuCisgICAgICAgICAgICBtVmlzaWJsZUl0ZW1zLmFkZChtQXhlc0hlYWRpbmcpOworICAgICAgICAgICAgZmluYWwgaW50IGF4aXNDb3VudCA9IHN0YXRlLmdldEF4aXNDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBheGlzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBheGlzID0gc3RhdGUuZ2V0QXhpcyhpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBCQVNFX0lEX0FYSVNfSVRFTSB8IGF4aXM7CisgICAgICAgICAgICAgICAgVGV4dENvbHVtbiBjb2x1bW4gPSAoVGV4dENvbHVtbikgbURhdGFJdGVtcy5nZXQoaWQpOworICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBuZXcgVGV4dENvbHVtbihpZCwgTW90aW9uRXZlbnQuYXhpc1RvU3RyaW5nKGF4aXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFJdGVtcy5wdXQoaWQsIGNvbHVtbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRDb250ZW50KEZsb2F0LnRvU3RyaW5nKHN0YXRlLmdldEF4aXNWYWx1ZShpKSkpOworICAgICAgICAgICAgICAgIG1WaXNpYmxlSXRlbXMuYWRkKGNvbHVtbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFBvcHVsYXRlIGtleXMuCisgICAgICAgICAgICBtVmlzaWJsZUl0ZW1zLmFkZChtS2V5c0hlYWRpbmcpOworICAgICAgICAgICAgZmluYWwgaW50IGtleUNvdW50ID0gc3RhdGUuZ2V0S2V5Q291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBrZXlDb2RlID0gc3RhdGUuZ2V0S2V5Q29kZShpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBCQVNFX0lEX0tFWV9JVEVNIHwga2V5Q29kZTsKKyAgICAgICAgICAgICAgICBUZXh0Q29sdW1uIGNvbHVtbiA9IChUZXh0Q29sdW1uKSBtRGF0YUl0ZW1zLmdldChpZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IG5ldyBUZXh0Q29sdW1uKGlkLCBLZXlFdmVudC5rZXlDb2RlVG9TdHJpbmcoa2V5Q29kZSkpOworICAgICAgICAgICAgICAgICAgICBtRGF0YUl0ZW1zLnB1dChpZCwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29sdW1uLnNldENvbnRlbnQobVJlc291cmNlcy5nZXRTdHJpbmcoc3RhdGUuaXNLZXlQcmVzc2VkKGkpCisgICAgICAgICAgICAgICAgICAgICAgICA/IFIuc3RyaW5nLmdhbWVfY29udHJvbGxlcl9pbnB1dF9rZXlfcHJlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgOiBSLnN0cmluZy5nYW1lX2NvbnRyb2xsZXJfaW5wdXRfa2V5X3JlbGVhc2VkKSk7CisgICAgICAgICAgICAgICAgbVZpc2libGVJdGVtcy5hZGQoY29sdW1uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1WaXNpYmxlSXRlbXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbVZpc2libGVJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5nZXRJdGVtSWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmdldFZpZXcoY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJdGVtIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1JdGVtSWQ7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTGF5b3V0UmVzb3VyY2VJZDsKKyAgICAgICAgICAgIHByaXZhdGUgVmlldyBtVmlldzsKKworICAgICAgICAgICAgcHVibGljIEl0ZW0oaW50IGl0ZW1JZCwgaW50IGxheW91dFJlc291cmNlSWQpIHsKKyAgICAgICAgICAgICAgICBtSXRlbUlkID0gaXRlbUlkOworICAgICAgICAgICAgICAgIG1MYXlvdXRSZXNvdXJjZUlkID0gbGF5b3V0UmVzb3VyY2VJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSXRlbUlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3ID0gaW5mbGF0ZXIuaW5mbGF0ZShtTGF5b3V0UmVzb3VyY2VJZCwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGluaXRWaWV3KG1WaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhlYWRpbmcgZXh0ZW5kcyBJdGVtIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1MYWJlbDsKKworICAgICAgICAgICAgcHVibGljIEhlYWRpbmcoaW50IGl0ZW1JZCwgU3RyaW5nIGxhYmVsKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoaXRlbUlkLCBSLmxheW91dC5nYW1lX2NvbnRyb2xsZXJfaW5wdXRfaGVhZGluZyk7CisgICAgICAgICAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdFZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHZpZXc7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtTGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGV4dENvbHVtbiBleHRlbmRzIEl0ZW0geworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxhYmVsOworCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGVudDsKKyAgICAgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUNvbnRlbnRWaWV3OworCisgICAgICAgICAgICBwdWJsaWMgVGV4dENvbHVtbihpbnQgaXRlbUlkLCBTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihpdGVtSWQsIFIubGF5b3V0LmdhbWVfY29udHJvbGxlcl9pbnB1dF90ZXh0X2NvbHVtbik7CisgICAgICAgICAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBtQ29udGVudCA9IGNvbnRlbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdFZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubGFiZWwpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQobUxhYmVsKTsKKworICAgICAgICAgICAgICAgIG1Db250ZW50VmlldyA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgICAgIG1Db250ZW50Vmlldy5zZXRUZXh0KG1Db250ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbWVWaWV3LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYW1lVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTIzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYW1lVmlldy5qYXZhCkBAIC0wLDAgKzEsNzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIHRyaXZpYWwgam95c3RpY2sgYmFzZWQgcGh5c2ljcyBnYW1lIHRvIGRlbW9uc3RyYXRlIGpveXN0aWNrIGhhbmRsaW5nLgorICoKKyAqIEBzZWUgR2FtZUNvbnRyb2xsZXJJbnB1dAorICovCitwdWJsaWMgY2xhc3MgR2FtZVZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgQU5JTUFUSU9OX1RJTUVfU1RFUCA9IDEwMDAgLyA2MDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBNQVhfT0JTVEFDTEVTID0gMTI7CisKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbSBtUmFuZG9tOworICAgIHByaXZhdGUgU2hpcCBtU2hpcDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QnVsbGV0PiBtQnVsbGV0czsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T2JzdGFjbGU+IG1PYnN0YWNsZXM7CisKKyAgICBwcml2YXRlIGxvbmcgbUxhc3RTdGVwVGltZTsKKyAgICBwcml2YXRlIElucHV0RGV2aWNlIG1MYXN0SW5wdXREZXZpY2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFBBRF9TVEFURV9MRUZUICA9IDEgPDwgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFBBRF9TVEFURV9SSUdIVCA9IDEgPDwgMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFBBRF9TVEFURV9VUCAgICA9IDEgPDwgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFBBRF9TVEFURV9ET1dOICA9IDEgPDwgMzsKKworICAgIHByaXZhdGUgaW50IG1EUGFkU3RhdGU7CisKKyAgICBwcml2YXRlIGZsb2F0IG1TaGlwU2l6ZTsKKyAgICBwcml2YXRlIGZsb2F0IG1NYXhTaGlwVGhydXN0OworICAgIHByaXZhdGUgZmxvYXQgbU1heFNoaXBTcGVlZDsKKworICAgIHByaXZhdGUgZmxvYXQgbUJ1bGxldFNpemU7CisgICAgcHJpdmF0ZSBmbG9hdCBtQnVsbGV0U3BlZWQ7CisKKyAgICBwcml2YXRlIGZsb2F0IG1NaW5PYnN0YWNsZVNpemU7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4T2JzdGFjbGVTaXplOworICAgIHByaXZhdGUgZmxvYXQgbU1pbk9ic3RhY2xlU3BlZWQ7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4T2JzdGFjbGVTcGVlZDsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUFuaW1hdGlvblJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBhbmltYXRlRnJhbWUoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgR2FtZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIG1SYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIG1CdWxsZXRzID0gbmV3IEFycmF5TGlzdDxCdWxsZXQ+KCk7CisgICAgICAgIG1PYnN0YWNsZXMgPSBuZXcgQXJyYXlMaXN0PE9ic3RhY2xlPigpOworCisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisKKyAgICAgICAgZmxvYXQgYmFzZVNpemUgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogNWY7CisgICAgICAgIGZsb2F0IGJhc2VTcGVlZCA9IGJhc2VTaXplICogMzsKKworICAgICAgICBtU2hpcFNpemUgPSBiYXNlU2l6ZSAqIDM7CisgICAgICAgIG1NYXhTaGlwVGhydXN0ID0gYmFzZVNwZWVkICogMC4yNWY7CisgICAgICAgIG1NYXhTaGlwU3BlZWQgPSBiYXNlU3BlZWQgKiAxMjsKKworICAgICAgICBtQnVsbGV0U2l6ZSA9IGJhc2VTaXplOworICAgICAgICBtQnVsbGV0U3BlZWQgPSBiYXNlU3BlZWQgKiAxMjsKKworICAgICAgICBtTWluT2JzdGFjbGVTaXplID0gYmFzZVNpemUgKiAyOworICAgICAgICBtTWF4T2JzdGFjbGVTaXplID0gYmFzZVNpemUgKiAxMjsKKyAgICAgICAgbU1pbk9ic3RhY2xlU3BlZWQgPSBiYXNlU3BlZWQ7CisgICAgICAgIG1NYXhPYnN0YWNsZVNwZWVkID0gYmFzZVNwZWVkICogMzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG9sZHcsIGludCBvbGRoKSB7CisgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGdhbWUgd2hlbiB0aGUgdmlldyBjaGFuZ2VzIHNpemUuCisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBlbnN1cmVJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIEhhbmRsZSBEUGFkIGtleXMgYW5kIGZpcmUgYnV0dG9uIG9uIGluaXRpYWwgZG93biBidXQgbm90IG9uIGF1dG8tcmVwZWF0LgorICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFJlcGVhdENvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgbVNoaXAuc2V0SGVhZGluZ1goLTEpOworICAgICAgICAgICAgICAgICAgICBtRFBhZFN0YXRlIHw9IERQQURfU1RBVEVfTEVGVDsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUOgorICAgICAgICAgICAgICAgICAgICBtU2hpcC5zZXRIZWFkaW5nWCgxKTsKKyAgICAgICAgICAgICAgICAgICAgbURQYWRTdGF0ZSB8PSBEUEFEX1NUQVRFX1JJR0hUOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6CisgICAgICAgICAgICAgICAgICAgIG1TaGlwLnNldEhlYWRpbmdZKC0xKTsKKyAgICAgICAgICAgICAgICAgICAgbURQYWRTdGF0ZSB8PSBEUEFEX1NUQVRFX1VQOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgbVNoaXAuc2V0SGVhZGluZ1koMSk7CisgICAgICAgICAgICAgICAgICAgIG1EUGFkU3RhdGUgfD0gRFBBRF9TVEFURV9ET1dOOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyZUtleShrZXlDb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZWQpIHsKKyAgICAgICAgICAgIHN0ZXAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZW5zdXJlSW5pdGlhbGl6ZWQoKTsKKworICAgICAgICAvLyBIYW5kbGUga2V5cyBnb2luZyB1cC4KKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDoKKyAgICAgICAgICAgICAgICBtU2hpcC5zZXRIZWFkaW5nWCgwKTsKKyAgICAgICAgICAgICAgICBtRFBhZFN0YXRlICY9IH5EUEFEX1NUQVRFX0xFRlQ7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVDoKKyAgICAgICAgICAgICAgICBtU2hpcC5zZXRIZWFkaW5nWCgwKTsKKyAgICAgICAgICAgICAgICBtRFBhZFN0YXRlICY9IH5EUEFEX1NUQVRFX1JJR0hUOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6CisgICAgICAgICAgICAgICAgbVNoaXAuc2V0SGVhZGluZ1koMCk7CisgICAgICAgICAgICAgICAgbURQYWRTdGF0ZSAmPSB+RFBBRF9TVEFURV9VUDsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CisgICAgICAgICAgICAgICAgbVNoaXAuc2V0SGVhZGluZ1koMCk7CisgICAgICAgICAgICAgICAgbURQYWRTdGF0ZSAmPSB+RFBBRF9TVEFURV9ET1dOOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoaXNGaXJlS2V5KGtleUNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlZCkgeworICAgICAgICAgICAgc3RlcChldmVudC5nZXRFdmVudFRpbWUoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZpcmVLZXkoaW50IGtleUNvZGUpIHsKKyAgICAgICAgcmV0dXJuIEtleUV2ZW50LmlzR2FtZXBhZEJ1dHRvbihrZXlDb2RlKQorICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUgorICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNNb3Rpb25FdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBlbnN1cmVJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGV2ZW50IGNhbWUgZnJvbSBhIGpveXN0aWNrIHNpbmNlIGEgZ2VuZXJpYyBtb3Rpb24gZXZlbnQKKyAgICAgICAgLy8gY291bGQgYmUgYWxtb3N0IGFueXRoaW5nLgorICAgICAgICBpZiAoKGV2ZW50LmdldFNvdXJjZSgpICYgSW5wdXREZXZpY2UuU09VUkNFX0NMQVNTX0pPWVNUSUNLKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIC8vIENhY2hlIHRoZSBtb3N0IHJlY2VudGx5IG9idGFpbmVkIGRldmljZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIC8vIFRoZSBkZXZpY2UgaW5mb3JtYXRpb24gbWF5IGNoYW5nZSBvdmVyIHRpbWUgYnV0IGl0IGNhbiBiZQorICAgICAgICAgICAgLy8gc29tZXdoYXQgZXhwZW5zaXZlIHRvIHF1ZXJ5LgorICAgICAgICAgICAgaWYgKG1MYXN0SW5wdXREZXZpY2UgPT0gbnVsbCB8fCBtTGFzdElucHV0RGV2aWNlLmdldElkKCkgIT0gZXZlbnQuZ2V0RGV2aWNlSWQoKSkgeworICAgICAgICAgICAgICAgIG1MYXN0SW5wdXREZXZpY2UgPSBldmVudC5nZXREZXZpY2UoKTsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIGZvciB0aGUgZGV2aWNlIGlkIHRvIGJlIGludmFsaWQuCisgICAgICAgICAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCBnZXREZXZpY2UoKSB3aWxsIHJldHVybiBudWxsLgorICAgICAgICAgICAgICAgIGlmIChtTGFzdElucHV0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWdub3JlIGpveXN0aWNrIHdoaWxlIHRoZSBEUGFkIGlzIHByZXNzZWQgdG8gYXZvaWQgY29uZmxpY3RpbmcgbW90aW9ucy4KKyAgICAgICAgICAgIGlmIChtRFBhZFN0YXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VzcyBhbGwgaGlzdG9yaWNhbCBtb3ZlbWVudCBzYW1wbGVzIGluIHRoZSBiYXRjaC4KKyAgICAgICAgICAgIGZpbmFsIGludCBoaXN0b3J5U2l6ZSA9IGV2ZW50LmdldEhpc3RvcnlTaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpc3RvcnlTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzSm95c3RpY2tJbnB1dChldmVudCwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGN1cnJlbnQgbW92ZW1lbnQgc2FtcGxlIGluIHRoZSBiYXRjaC4KKyAgICAgICAgICAgIHByb2Nlc3NKb3lzdGlja0lucHV0KGV2ZW50LCAtMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25HZW5lcmljTW90aW9uRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSm95c3RpY2tJbnB1dChNb3Rpb25FdmVudCBldmVudCwgaW50IGhpc3RvcnlQb3MpIHsKKyAgICAgICAgLy8gR2V0IGpveXN0aWNrIHBvc2l0aW9uLgorICAgICAgICAvLyBNYW55IGdhbWUgcGFkcyB3aXRoIHR3byBqb3lzdGlja3MgcmVwb3J0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Vjb25kIGpveXN0aWNrCisgICAgICAgIC8vIHVzaW5nIHRoZSBaIGFuZCBSWiBheGVzIHNvIHdlIGFsc28gaGFuZGxlIHRob3NlLgorICAgICAgICAvLyBJbiBhIHJlYWwgZ2FtZSwgd2Ugd291bGQgYWxsb3cgdGhlIHVzZXIgdG8gY29uZmlndXJlIHRoZSBheGVzIG1hbnVhbGx5LgorICAgICAgICBmbG9hdCB4ID0gZ2V0Q2VudGVyZWRBeGlzKGV2ZW50LCBtTGFzdElucHV0RGV2aWNlLCBNb3Rpb25FdmVudC5BWElTX1gsIGhpc3RvcnlQb3MpOworICAgICAgICBpZiAoeCA9PSAwKSB7CisgICAgICAgICAgICB4ID0gZ2V0Q2VudGVyZWRBeGlzKGV2ZW50LCBtTGFzdElucHV0RGV2aWNlLCBNb3Rpb25FdmVudC5BWElTX0hBVF9YLCBoaXN0b3J5UG9zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeCA9PSAwKSB7CisgICAgICAgICAgICB4ID0gZ2V0Q2VudGVyZWRBeGlzKGV2ZW50LCBtTGFzdElucHV0RGV2aWNlLCBNb3Rpb25FdmVudC5BWElTX1osIGhpc3RvcnlQb3MpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgeSA9IGdldENlbnRlcmVkQXhpcyhldmVudCwgbUxhc3RJbnB1dERldmljZSwgTW90aW9uRXZlbnQuQVhJU19ZLCBoaXN0b3J5UG9zKTsKKyAgICAgICAgaWYgKHkgPT0gMCkgeworICAgICAgICAgICAgeSA9IGdldENlbnRlcmVkQXhpcyhldmVudCwgbUxhc3RJbnB1dERldmljZSwgTW90aW9uRXZlbnQuQVhJU19IQVRfWSwgaGlzdG9yeVBvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHkgPT0gMCkgeworICAgICAgICAgICAgeSA9IGdldENlbnRlcmVkQXhpcyhldmVudCwgbUxhc3RJbnB1dERldmljZSwgTW90aW9uRXZlbnQuQVhJU19SWiwgaGlzdG9yeVBvcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIHNoaXAgaGVhZGluZy4KKyAgICAgICAgbVNoaXAuc2V0SGVhZGluZyh4LCB5KTsKKyAgICAgICAgc3RlcChoaXN0b3J5UG9zIDwgMCA/IGV2ZW50LmdldEV2ZW50VGltZSgpIDogZXZlbnQuZ2V0SGlzdG9yaWNhbEV2ZW50VGltZShoaXN0b3J5UG9zKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZ2V0Q2VudGVyZWRBeGlzKE1vdGlvbkV2ZW50IGV2ZW50LCBJbnB1dERldmljZSBkZXZpY2UsCisgICAgICAgICAgICBpbnQgYXhpcywgaW50IGhpc3RvcnlQb3MpIHsKKyAgICAgICAgZmluYWwgSW5wdXREZXZpY2UuTW90aW9uUmFuZ2UgcmFuZ2UgPSBkZXZpY2UuZ2V0TW90aW9uUmFuZ2UoYXhpcywgZXZlbnQuZ2V0U291cmNlKCkpOworICAgICAgICBpZiAocmFuZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgZmxhdCA9IHJhbmdlLmdldEZsYXQoKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHZhbHVlID0gaGlzdG9yeVBvcyA8IDAgPyBldmVudC5nZXRBeGlzVmFsdWUoYXhpcykKKyAgICAgICAgICAgICAgICAgICAgOiBldmVudC5nZXRIaXN0b3JpY2FsQXhpc1ZhbHVlKGF4aXMsIGhpc3RvcnlQb3MpOworCisgICAgICAgICAgICAvLyBJZ25vcmUgYXhpcyB2YWx1ZXMgdGhhdCBhcmUgd2l0aGluIHRoZSAnZmxhdCcgcmVnaW9uIG9mIHRoZSBqb3lzdGljayBheGlzIGNlbnRlci4KKyAgICAgICAgICAgIC8vIEEgam95c3RpY2sgYXQgcmVzdCBkb2VzIG5vdCBhbHdheXMgcmVwb3J0IGFuIGFic29sdXRlIHBvc2l0aW9uIG9mICgwLDApLgorICAgICAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlKSA+IGZsYXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgeworICAgICAgICAvLyBUdXJuIG9uIGFuZCBvZmYgYW5pbWF0aW9ucyBiYXNlZCBvbiB0aGUgd2luZG93IGZvY3VzLgorICAgICAgICAvLyBBbHRlcm5hdGVseSwgd2UgY291bGQgdXBkYXRlIHRoZSBnYW1lIHN0YXRlIHVzaW5nIHRoZSBBY3Rpdml0eSBvblJlc3VtZSgpCisgICAgICAgIC8vIGFuZCBvblBhdXNlKCkgbGlmZWN5Y2xlIGV2ZW50cy4KKyAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKSB7CisgICAgICAgICAgICBnZXRIYW5kbGVyKCkucG9zdERlbGF5ZWQobUFuaW1hdGlvblJ1bm5hYmxlLCBBTklNQVRJT05fVElNRV9TVEVQKTsKKyAgICAgICAgICAgIG1MYXN0U3RlcFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldEhhbmRsZXIoKS5yZW1vdmVDYWxsYmFja3MobUFuaW1hdGlvblJ1bm5hYmxlKTsKKworICAgICAgICAgICAgbURQYWRTdGF0ZSA9IDA7CisgICAgICAgICAgICBpZiAobVNoaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TaGlwLnNldEhlYWRpbmcoMCwgMCk7CisgICAgICAgICAgICAgICAgbVNoaXAuc2V0VmVsb2NpdHkoMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpcmUoKSB7CisgICAgICAgIGlmIChtU2hpcCAhPSBudWxsICYmICFtU2hpcC5pc0Rlc3Ryb3llZCgpKSB7CisgICAgICAgICAgICBCdWxsZXQgYnVsbGV0ID0gbmV3IEJ1bGxldCgpOworICAgICAgICAgICAgYnVsbGV0LnNldFBvc2l0aW9uKG1TaGlwLmdldEJ1bGxldEluaXRpYWxYKCksIG1TaGlwLmdldEJ1bGxldEluaXRpYWxZKCkpOworICAgICAgICAgICAgYnVsbGV0LnNldFZlbG9jaXR5KG1TaGlwLmdldEJ1bGxldFZlbG9jaXR5WChtQnVsbGV0U3BlZWQpLAorICAgICAgICAgICAgICAgICAgICBtU2hpcC5nZXRCdWxsZXRWZWxvY2l0eVkobUJ1bGxldFNwZWVkKSk7CisgICAgICAgICAgICBtQnVsbGV0cy5hZGQoYnVsbGV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbml0aWFsaXplZCgpIHsKKyAgICAgICAgaWYgKG1TaGlwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1TaGlwID0gbmV3IFNoaXAoKTsKKyAgICAgICAgbUJ1bGxldHMuY2xlYXIoKTsKKyAgICAgICAgbU9ic3RhY2xlcy5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgYW5pbWF0ZUZyYW1lKCkgeworICAgICAgICBsb25nIGN1cnJlbnRTdGVwVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBzdGVwKGN1cnJlbnRTdGVwVGltZSk7CisKKyAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOworICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBoYW5kbGVyLnBvc3RBdFRpbWUobUFuaW1hdGlvblJ1bm5hYmxlLCBjdXJyZW50U3RlcFRpbWUgKyBBTklNQVRJT05fVElNRV9TVEVQKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGVwKGxvbmcgY3VycmVudFN0ZXBUaW1lKSB7CisgICAgICAgIGZsb2F0IHRhdSA9IChjdXJyZW50U3RlcFRpbWUgLSBtTGFzdFN0ZXBUaW1lKSAqIDAuMDAxZjsKKyAgICAgICAgbUxhc3RTdGVwVGltZSA9IGN1cnJlbnRTdGVwVGltZTsKKworICAgICAgICBlbnN1cmVJbml0aWFsaXplZCgpOworCisgICAgICAgIC8vIE1vdmUgdGhlIHNoaXAuCisgICAgICAgIG1TaGlwLmFjY2VsZXJhdGUodGF1LCBtTWF4U2hpcFRocnVzdCwgbU1heFNoaXBTcGVlZCk7CisgICAgICAgIGlmICghbVNoaXAuc3RlcCh0YXUpKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSB0aGUgYnVsbGV0cy4KKyAgICAgICAgaW50IG51bUJ1bGxldHMgPSBtQnVsbGV0cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVsbGV0czsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBCdWxsZXQgYnVsbGV0ID0gbUJ1bGxldHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCFidWxsZXQuc3RlcCh0YXUpKSB7CisgICAgICAgICAgICAgICAgbUJ1bGxldHMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIGkgLT0gMTsKKyAgICAgICAgICAgICAgICBudW1CdWxsZXRzIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIG9ic3RhY2xlcy4KKyAgICAgICAgaW50IG51bU9ic3RhY2xlcyA9IG1PYnN0YWNsZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9ic3RhY2xlczsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBPYnN0YWNsZSBvYnN0YWNsZSA9IG1PYnN0YWNsZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCFvYnN0YWNsZS5zdGVwKHRhdSkpIHsKKyAgICAgICAgICAgICAgICBtT2JzdGFjbGVzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBpIC09IDE7CisgICAgICAgICAgICAgICAgbnVtT2JzdGFjbGVzIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgY29sbGlzaW9ucyBiZXR3ZWVuIGJ1bGxldHMgYW5kIG9ic3RhY2xlcy4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWxsZXRzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bGxldCBidWxsZXQgPSBtQnVsbGV0cy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bU9ic3RhY2xlczsgaisrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgT2JzdGFjbGUgb2JzdGFjbGUgPSBtT2JzdGFjbGVzLmdldChqKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVsbGV0LmNvbGxpZGVzV2l0aChvYnN0YWNsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVsbGV0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgb2JzdGFjbGUuZGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgY29sbGlzaW9ucyBiZXR3ZWVuIHRoZSBzaGlwIGFuZCBvYnN0YWNsZXMuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2JzdGFjbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIE9ic3RhY2xlIG9ic3RhY2xlID0gbU9ic3RhY2xlcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAobVNoaXAuY29sbGlkZXNXaXRoKG9ic3RhY2xlKSkgeworICAgICAgICAgICAgICAgIG1TaGlwLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICBvYnN0YWNsZS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGF3biBtb3JlIG9ic3RhY2xlcyBvZmZzY3JlZW4gd2hlbiBuZWVkZWQuCisgICAgICAgIC8vIEF2b2lkIHB1dHRpbmcgdGhlbSByaWdodCBvbiB0b3Agb2YgdGhlIHNoaXAuCisgICAgICAgIE91dGVyTG9vcDogd2hpbGUgKG1PYnN0YWNsZXMuc2l6ZSgpIDwgTUFYX09CU1RBQ0xFUykgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgbWluRGlzdGFuY2UgPSBtU2hpcFNpemUgKiA0OworICAgICAgICAgICAgZmxvYXQgc2l6ZSA9IG1SYW5kb20ubmV4dEZsb2F0KCkgKiAobU1heE9ic3RhY2xlU2l6ZSAtIG1NaW5PYnN0YWNsZVNpemUpCisgICAgICAgICAgICAgICAgICAgICsgbU1pbk9ic3RhY2xlU2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IHBvc2l0aW9uWCwgcG9zaXRpb25ZOworICAgICAgICAgICAgaW50IHRyaWVzID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgZWRnZSA9IG1SYW5kb20ubmV4dEludCg0KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVkZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25YID0gLXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblkgPSBtUmFuZG9tLm5leHRJbnQoZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWCA9IGdldFdpZHRoKCkgKyBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25ZID0gbVJhbmRvbS5uZXh0SW50KGdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblggPSBtUmFuZG9tLm5leHRJbnQoZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblkgPSAtc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25YID0gbVJhbmRvbS5uZXh0SW50KGdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25ZID0gZ2V0SGVpZ2h0KCkgKyBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgrK3RyaWVzID4gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgT3V0ZXJMb29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKG1TaGlwLmRpc3RhbmNlVG8ocG9zaXRpb25YLCBwb3NpdGlvblkpIDwgbWluRGlzdGFuY2UpOworCisgICAgICAgICAgICBmbG9hdCBkaXJlY3Rpb24gPSBtUmFuZG9tLm5leHRGbG9hdCgpICogKGZsb2F0KSBNYXRoLlBJICogMjsKKyAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gbVJhbmRvbS5uZXh0RmxvYXQoKSAqIChtTWF4T2JzdGFjbGVTcGVlZCAtIG1NaW5PYnN0YWNsZVNwZWVkKQorICAgICAgICAgICAgICAgICAgICArIG1NaW5PYnN0YWNsZVNwZWVkOworICAgICAgICAgICAgZmxvYXQgdmVsb2NpdHlYID0gKGZsb2F0KSBNYXRoLmNvcyhkaXJlY3Rpb24pICogc3BlZWQ7CisgICAgICAgICAgICBmbG9hdCB2ZWxvY2l0eVkgPSAoZmxvYXQpIE1hdGguc2luKGRpcmVjdGlvbikgKiBzcGVlZDsKKworICAgICAgICAgICAgT2JzdGFjbGUgb2JzdGFjbGUgPSBuZXcgT2JzdGFjbGUoKTsKKyAgICAgICAgICAgIG9ic3RhY2xlLnNldFBvc2l0aW9uKHBvc2l0aW9uWCwgcG9zaXRpb25ZKTsKKyAgICAgICAgICAgIG9ic3RhY2xlLnNldFNpemUoc2l6ZSk7CisgICAgICAgICAgICBvYnN0YWNsZS5zZXRWZWxvY2l0eSh2ZWxvY2l0eVgsIHZlbG9jaXR5WSk7CisgICAgICAgICAgICBtT2JzdGFjbGVzLmFkZChvYnN0YWNsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBzaGlwLgorICAgICAgICBpZiAobVNoaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNoaXAuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHJhdyBidWxsZXRzLgorICAgICAgICBpbnQgbnVtQnVsbGV0cyA9IG1CdWxsZXRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWxsZXRzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEJ1bGxldCBidWxsZXQgPSBtQnVsbGV0cy5nZXQoaSk7CisgICAgICAgICAgICBidWxsZXQuZHJhdyhjYW52YXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHJhdyBvYnN0YWNsZXMuCisgICAgICAgIGludCBudW1PYnN0YWNsZXMgPSBtT2JzdGFjbGVzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PYnN0YWNsZXM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgT2JzdGFjbGUgb2JzdGFjbGUgPSBtT2JzdGFjbGVzLmdldChpKTsKKyAgICAgICAgICAgIG9ic3RhY2xlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmbG9hdCBweXRoYWcoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICByZXR1cm4gKGZsb2F0KSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBibGVuZChmbG9hdCBhbHBoYSwgaW50IGZyb20sIGludCB0bykgeworICAgICAgICByZXR1cm4gZnJvbSArIChpbnQpICgodG8gLSBmcm9tKSAqIGFscGhhKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRQYWludEFSR0JCbGVuZChQYWludCBwYWludCwgZmxvYXQgYWxwaGEsCisgICAgICAgICAgICBpbnQgYTEsIGludCByMSwgaW50IGcxLCBpbnQgYjEsCisgICAgICAgICAgICBpbnQgYTIsIGludCByMiwgaW50IGcyLCBpbnQgYjIpIHsKKyAgICAgICAgcGFpbnQuc2V0QVJHQihibGVuZChhbHBoYSwgYTEsIGEyKSwgYmxlbmQoYWxwaGEsIHIxLCByMiksCisgICAgICAgICAgICAgICAgYmxlbmQoYWxwaGEsIGcxLCBnMiksIGJsZW5kKGFscGhhLCBiMSwgYjIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIFNwcml0ZSB7CisgICAgICAgIHByb3RlY3RlZCBmbG9hdCBtUG9zaXRpb25YOworICAgICAgICBwcm90ZWN0ZWQgZmxvYXQgbVBvc2l0aW9uWTsKKyAgICAgICAgcHJvdGVjdGVkIGZsb2F0IG1WZWxvY2l0eVg7CisgICAgICAgIHByb3RlY3RlZCBmbG9hdCBtVmVsb2NpdHlZOworICAgICAgICBwcm90ZWN0ZWQgZmxvYXQgbVNpemU7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgICAgIHByb3RlY3RlZCBmbG9hdCBtRGVzdHJveUFuaW1Qcm9ncmVzczsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBtUG9zaXRpb25YID0geDsKKyAgICAgICAgICAgIG1Qb3NpdGlvblkgPSB5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVsb2NpdHkoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgbVZlbG9jaXR5WCA9IHg7CisgICAgICAgICAgICBtVmVsb2NpdHlZID0geTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoZmxvYXQgc2l6ZSkgeworICAgICAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGRpc3RhbmNlVG8oZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgcmV0dXJuIHB5dGhhZyhtUG9zaXRpb25YIC0geCwgbVBvc2l0aW9uWSAtIHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGRpc3RhbmNlVG8oU3ByaXRlIG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VUbyhvdGhlci5tUG9zaXRpb25YLCBvdGhlci5tUG9zaXRpb25ZKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbGxpZGVzV2l0aChTcHJpdGUgb3RoZXIpIHsKKyAgICAgICAgICAgIC8vIFJlYWxseSBiYWQgY29sbGlzaW9uIGRldGVjdGlvbi4KKyAgICAgICAgICAgIHJldHVybiAhbURlc3Ryb3llZCAmJiAhb3RoZXIubURlc3Ryb3llZAorICAgICAgICAgICAgICAgICAgICAmJiBkaXN0YW5jZVRvKG90aGVyKSA8PSBNYXRoLm1heChtU2l6ZSwgb3RoZXIubVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLm1pbihtU2l6ZSwgb3RoZXIubVNpemUpICogMC41ZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJveWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXN0cm95ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdGVwKGZsb2F0IHRhdSkgeworICAgICAgICAgICAgbVBvc2l0aW9uWCArPSBtVmVsb2NpdHlYICogdGF1OworICAgICAgICAgICAgbVBvc2l0aW9uWSArPSBtVmVsb2NpdHlZICogdGF1OworCisgICAgICAgICAgICBpZiAobURlc3Ryb3llZCkgeworICAgICAgICAgICAgICAgIG1EZXN0cm95QW5pbVByb2dyZXNzICs9IHRhdSAvIGdldERlc3Ryb3lBbmltRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAobURlc3Ryb3lBbmltUHJvZ3Jlc3MgPj0gMS4wZikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXREZXN0cm95QW5pbUR1cmF0aW9uKCk7CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRzaWRlUGxheWZpZWxkKCkgeworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gR2FtZVZpZXcudGhpcy5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IEdhbWVWaWV3LnRoaXMuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICByZXR1cm4gbVBvc2l0aW9uWCA8IDAgfHwgbVBvc2l0aW9uWCA+PSB3aWR0aAorICAgICAgICAgICAgICAgICAgICB8fCBtUG9zaXRpb25ZIDwgMCB8fCBtUG9zaXRpb25ZID49IGhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHdyYXBBdFBsYXlmaWVsZEJvdW5kYXJ5KCkgeworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gR2FtZVZpZXcudGhpcy5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IEdhbWVWaWV3LnRoaXMuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICB3aGlsZSAobVBvc2l0aW9uWCA8PSAtbVNpemUpIHsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25YICs9IHdpZHRoICsgbVNpemUgKiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKG1Qb3NpdGlvblggPj0gd2lkdGggKyBtU2l6ZSkgeworICAgICAgICAgICAgICAgIG1Qb3NpdGlvblggLT0gd2lkdGggKyBtU2l6ZSAqIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobVBvc2l0aW9uWSA8PSAtbVNpemUpIHsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25ZICs9IGhlaWdodCArIG1TaXplICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChtUG9zaXRpb25ZID49IGhlaWdodCArIG1TaXplKSB7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uWSAtPSBoZWlnaHQgKyBtU2l6ZSAqIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgICAgICAgICBzdGVwKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTaGlwIGV4dGVuZHMgU3ByaXRlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQ09STkVSX0FOR0xFID0gKGZsb2F0KSBNYXRoLlBJICogMiAvIDM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFRPX0RFR1JFRVMgPSAoZmxvYXQpICgxODAuMCAvIE1hdGguUEkpOworCisgICAgICAgIHByaXZhdGUgZmxvYXQgbUhlYWRpbmdYOworICAgICAgICBwcml2YXRlIGZsb2F0IG1IZWFkaW5nWTsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtSGVhZGluZ0FuZ2xlOworICAgICAgICBwcml2YXRlIGZsb2F0IG1IZWFkaW5nTWFnbml0dWRlOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIG1QYXRoOworCisKKyAgICAgICAgcHVibGljIFNoaXAoKSB7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTdHlsZShTdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgc2V0UG9zaXRpb24oZ2V0V2lkdGgoKSAqIDAuNWYsIGdldEhlaWdodCgpICogMC41Zik7CisgICAgICAgICAgICBzZXRWZWxvY2l0eSgwLCAwKTsKKyAgICAgICAgICAgIHNldFNpemUobVNoaXBTaXplKTsKKworICAgICAgICAgICAgbVBhdGggPSBuZXcgUGF0aCgpOworICAgICAgICAgICAgbVBhdGgubW92ZVRvKDAsIDApOworICAgICAgICAgICAgbVBhdGgubGluZVRvKChmbG9hdClNYXRoLmNvcygtQ09STkVSX0FOR0xFKSAqIG1TaXplLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpTWF0aC5zaW4oLUNPUk5FUl9BTkdMRSkgKiBtU2l6ZSk7CisgICAgICAgICAgICBtUGF0aC5saW5lVG8obVNpemUsIDApOworICAgICAgICAgICAgbVBhdGgubGluZVRvKChmbG9hdClNYXRoLmNvcyhDT1JORVJfQU5HTEUpICogbVNpemUsCisgICAgICAgICAgICAgICAgICAgIChmbG9hdClNYXRoLnNpbihDT1JORVJfQU5HTEUpICogbVNpemUpOworICAgICAgICAgICAgbVBhdGgubGluZVRvKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGluZ1goZmxvYXQgeCkgeworICAgICAgICAgICAgbUhlYWRpbmdYID0geDsKKyAgICAgICAgICAgIHVwZGF0ZUhlYWRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhlYWRpbmdZKGZsb2F0IHkpIHsKKyAgICAgICAgICAgIG1IZWFkaW5nWSA9IHk7CisgICAgICAgICAgICB1cGRhdGVIZWFkaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkaW5nKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIG1IZWFkaW5nWCA9IHg7CisgICAgICAgICAgICBtSGVhZGluZ1kgPSB5OworICAgICAgICAgICAgdXBkYXRlSGVhZGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUhlYWRpbmcoKSB7CisgICAgICAgICAgICBtSGVhZGluZ01hZ25pdHVkZSA9IHB5dGhhZyhtSGVhZGluZ1gsIG1IZWFkaW5nWSk7CisgICAgICAgICAgICBpZiAobUhlYWRpbmdNYWduaXR1ZGUgPiAwLjFmKSB7CisgICAgICAgICAgICAgICAgbUhlYWRpbmdBbmdsZSA9IChmbG9hdCkgTWF0aC5hdGFuMihtSGVhZGluZ1ksIG1IZWFkaW5nWCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IHBvbGFyWChmbG9hdCByYWRpdXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIE1hdGguY29zKG1IZWFkaW5nQW5nbGUpICogcmFkaXVzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBwb2xhclkoZmxvYXQgcmFkaXVzKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KSBNYXRoLnNpbihtSGVhZGluZ0FuZ2xlKSAqIHJhZGl1czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRCdWxsZXRJbml0aWFsWCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb25YICsgcG9sYXJYKG1TaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRCdWxsZXRJbml0aWFsWSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb25ZICsgcG9sYXJZKG1TaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRCdWxsZXRWZWxvY2l0eVgoZmxvYXQgcmVsYXRpdmVTcGVlZCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZWxvY2l0eVggKyBwb2xhclgocmVsYXRpdmVTcGVlZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0QnVsbGV0VmVsb2NpdHlZKGZsb2F0IHJlbGF0aXZlU3BlZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVsb2NpdHlZICsgcG9sYXJZKHJlbGF0aXZlU3BlZWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZWxlcmF0ZShmbG9hdCB0YXUsIGZsb2F0IG1heFRocnVzdCwgZmxvYXQgbWF4U3BlZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHRocnVzdCA9IG1IZWFkaW5nTWFnbml0dWRlICogbWF4VGhydXN0OworICAgICAgICAgICAgbVZlbG9jaXR5WCArPSBwb2xhclgodGhydXN0KTsKKyAgICAgICAgICAgIG1WZWxvY2l0eVkgKz0gcG9sYXJZKHRocnVzdCk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNwZWVkID0gcHl0aGFnKG1WZWxvY2l0eVgsIG1WZWxvY2l0eVkpOworICAgICAgICAgICAgaWYgKHNwZWVkID4gbWF4U3BlZWQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1heFNwZWVkIC8gc3BlZWQ7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5WCA9IG1WZWxvY2l0eVggKiBzY2FsZTsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlZID0gbVZlbG9jaXR5WSAqIHNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN0ZXAoZmxvYXQgdGF1KSB7CisgICAgICAgICAgICBpZiAoIXN1cGVyLnN0ZXAodGF1KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyYXBBdFBsYXlmaWVsZEJvdW5kYXJ5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc2V0UGFpbnRBUkdCQmxlbmQobVBhaW50LCBtRGVzdHJveUFuaW1Qcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgMjU1LCA2MywgMjU1LCA2MywKKyAgICAgICAgICAgICAgICAgICAgMCwgMjU1LCAwLCAwKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShtUG9zaXRpb25YLCBtUG9zaXRpb25ZKTsKKyAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUobUhlYWRpbmdBbmdsZSAqIFRPX0RFR1JFRVMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0RGVzdHJveUFuaW1EdXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAxLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBCdWxsZXQgZXh0ZW5kcyBTcHJpdGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBwdWJsaWMgQnVsbGV0KCkgeworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U3R5bGUoU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgIHNldFNpemUobUJ1bGxldFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN0ZXAoZmxvYXQgdGF1KSB7CisgICAgICAgICAgICBpZiAoIXN1cGVyLnN0ZXAodGF1KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAhaXNPdXRzaWRlUGxheWZpZWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHNldFBhaW50QVJHQkJsZW5kKG1QYWludCwgbURlc3Ryb3lBbmltUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdDaXJjbGUobVBvc2l0aW9uWCwgbVBvc2l0aW9uWSwgbVNpemUsIG1QYWludCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldERlc3Ryb3lBbmltRHVyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMC4xMjVmOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPYnN0YWNsZSBleHRlbmRzIFNwcml0ZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworCisgICAgICAgIHB1YmxpYyBPYnN0YWNsZSgpIHsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCAxMjcsIDEyNywgMjU1KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTdHlsZShTdHlsZS5GSUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdGVwKGZsb2F0IHRhdSkgeworICAgICAgICAgICAgaWYgKCFzdXBlci5zdGVwKHRhdSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cmFwQXRQbGF5ZmllbGRCb3VuZGFyeSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHNldFBhaW50QVJHQkJsZW5kKG1QYWludCwgbURlc3Ryb3lBbmltUHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIDI1NSwgMTI3LCAxMjcsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgMCwgMjU1LCAwLCAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Q2lyY2xlKG1Qb3NpdGlvblgsIG1Qb3NpdGlvblksCisgICAgICAgICAgICAgICAgICAgIG1TaXplICogKDEuMGYgLSBtRGVzdHJveUFuaW1Qcm9ncmVzcyksIG1QYWludCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldERlc3Ryb3lBbmltRHVyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMC4yNWY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR3JpZDMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dyaWQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4NTNlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HcmlkMy5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrYWJsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5HcmlkVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGRlbW8gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCwgYS5rLmEuIHNlbGVjdGlvbiBtb2RlIG9uIEdyaWRWaWV3LgorICovCitwdWJsaWMgY2xhc3MgR3JpZDMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBHcmlkVmlldyBtR3JpZDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBsb2FkQXBwcygpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmdyaWRfMSk7CisgICAgICAgIG1HcmlkID0gKEdyaWRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5teUdyaWQpOworICAgICAgICBtR3JpZC5zZXRBZGFwdGVyKG5ldyBBcHBzQWRhcHRlcigpKTsKKyAgICAgICAgbUdyaWQuc2V0Q2hvaWNlTW9kZShHcmlkVmlldy5DSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCk7CisgICAgICAgIG1HcmlkLnNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKG5ldyBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UmVzb2x2ZUluZm8+IG1BcHBzOworCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRBcHBzKCkgeworICAgICAgICBJbnRlbnQgbWFpbkludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOLCBudWxsKTsKKyAgICAgICAgbWFpbkludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfTEFVTkNIRVIpOworCisgICAgICAgIG1BcHBzID0gZ2V0UGFja2FnZU1hbmFnZXIoKS5xdWVyeUludGVudEFjdGl2aXRpZXMobWFpbkludGVudCwgMCk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEFwcHNBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgeworICAgICAgICBwdWJsaWMgQXBwc0FkYXB0ZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgQ2hlY2thYmxlTGF5b3V0IGw7CisgICAgICAgICAgICBJbWFnZVZpZXcgaTsKKworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpID0gbmV3IEltYWdlVmlldyhHcmlkMy50aGlzKTsKKyAgICAgICAgICAgICAgICBpLnNldFNjYWxlVHlwZShJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOworICAgICAgICAgICAgICAgIGkuc2V0TGF5b3V0UGFyYW1zKG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKDUwLCA1MCkpOworICAgICAgICAgICAgICAgIGwgPSBuZXcgQ2hlY2thYmxlTGF5b3V0KEdyaWQzLnRoaXMpOworICAgICAgICAgICAgICAgIGwuc2V0TGF5b3V0UGFyYW1zKG5ldyBHcmlkVmlldy5MYXlvdXRQYXJhbXMoR3JpZFZpZXcuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyaWRWaWV3LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgICAgICAgICBsLmFkZFZpZXcoaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGwgPSAoQ2hlY2thYmxlTGF5b3V0KSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpID0gKEltYWdlVmlldykgbC5nZXRDaGlsZEF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSZXNvbHZlSW5mbyBpbmZvID0gbUFwcHMuZ2V0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGkuc2V0SW1hZ2VEcmF3YWJsZShpbmZvLmFjdGl2aXR5SW5mby5sb2FkSWNvbihnZXRQYWNrYWdlTWFuYWdlcigpKSk7CisKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgZmluYWwgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1BcHBzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtQXBwcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENoZWNrYWJsZUxheW91dCBleHRlbmRzIEZyYW1lTGF5b3V0IGltcGxlbWVudHMgQ2hlY2thYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DaGVja2VkOworCisgICAgICAgIHB1YmxpYyBDaGVja2FibGVMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBtQ2hlY2tlZCA9IGNoZWNrZWQ7CisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoY2hlY2tlZCA/CisgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuYmx1ZSkKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRvZ2dsZSgpIHsKKyAgICAgICAgICAgIHNldENoZWNrZWQoIW1DaGVja2VkKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGltcGxlbWVudHMgR3JpZFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUoIlNlbGVjdCBJdGVtcyIpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiT25lIGl0ZW0gc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsIGludCBwb3NpdGlvbiwgbG9uZyBpZCwKKyAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgICAgIGludCBzZWxlY3RDb3VudCA9IG1HcmlkLmdldENoZWNrZWRJdGVtQ291bnQoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0Q291bnQpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCJPbmUgaXRlbSBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCIiICsgc2VsZWN0Q291bnQgKyAiIGl0ZW1zIHNlbGVjdGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0hvcml6b250YWxTY3JvbGxWaWV3MS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvSG9yaXpvbnRhbFNjcm9sbFZpZXcxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4YWIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0hvcml6b250YWxTY3JvbGxWaWV3MS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworCitwdWJsaWMgY2xhc3MgSG9yaXpvbnRhbFNjcm9sbFZpZXcxIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5ob3Jpem9udGFsX3Njcm9sbF92aWV3MSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDEuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxLmphdmEKaW5kZXggNTg2MTkyMy4uZjEwM2U1MSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDEuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MS5qYXZhCkBAIC0zOCwxMzUgKzM4LDUgQEAKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRUZXh0RmlsdGVyRW5hYmxlZCh0cnVlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1TdHJpbmdzID0gewotICAgICAgICAgICAgIkFiYmF5ZSBkZSBCZWxsb2MiLCAiQWJiYXllIGR1IE1vbnQgZGVzIENhdHMiLCAiQWJlcnRhbSIsICJBYm9uZGFuY2UiLCAiQWNrYXdpIiwKLSAgICAgICAgICAgICJBY29ybiIsICJBZGVsb3N0IiwgIkFmZmlkZWxpY2UgYXUgQ2hhYmxpcyIsICJBZnVlZ2EnbCBQaXR1IiwgIkFpcmFnIiwgIkFpcmVkYWxlIiwKLSAgICAgICAgICAgICJBaXN5IENlbmRyZSIsICJBbGxnYXVlciBFbW1lbnRhbGVyIiwgIkFsdmVyY2EiLCAiQW1iZXJ0IiwgIkFtZXJpY2FuIENoZWVzZSIsCi0gICAgICAgICAgICAiQW1pIGR1IENoYW1iZXJ0aW4iLCAiQW5lam8gRW5jaGlsYWRvIiwgIkFubmVhdSBkdSBWaWMtQmlsaCIsICJBbnRob3Jpcm8iLCAiQXBwZW56ZWxsIiwKLSAgICAgICAgICAgICJBcmFnb24iLCAiQXJkaSBHYXNuYSIsICJBcmRyYWhhbiIsICJBcm1lbmlhbiBTdHJpbmciLCAiQXJvbWVzIGF1IEdlbmUgZGUgTWFyYyIsCi0gICAgICAgICAgICAiQXNhZGVybyIsICJBc2lhZ28iLCAiQXViaXNxdWUgUHlyZW5lZXMiLCAiQXV0dW4iLCAiQXZheHRza3lyIiwgIkJhYnkgU3dpc3MiLAotICAgICAgICAgICAgIkJhYnliZWwiLCAiQmFndWV0dGUgTGFvbm5haXNlIiwgIkJha2VycyIsICJCYWxhZGkiLCAiQmFsYXRvbiIsICJCYW5kYWwiLCAiQmFub24iLAotICAgICAgICAgICAgIkJhcnJ5J3MgQmF5IENoZWRkYXIiLCAiQmFzaW5nIiwgIkJhc2tldCBDaGVlc2UiLCAiQmF0aCBDaGVlc2UiLCAiQmF2YXJpYW4gQmVyZ2thc2UiLAotICAgICAgICAgICAgIkJheWxvdWdoIiwgIkJlYXVmb3J0IiwgIkJlYXV2b29yZGUiLCAiQmVlbmxlaWdoIEJsdWUiLCAiQmVlciBDaGVlc2UiLCAiQmVsIFBhZXNlIiwKLSAgICAgICAgICAgICJCZXJnYWRlciIsICJCZXJnZXJlIEJsZXVlIiwgIkJlcmtzd2VsbCIsICJCZXlheiBQZXluaXIiLCAiQmllcmthc2UiLCAiQmlzaG9wIEtlbm5lZHkiLAotICAgICAgICAgICAgIkJsYXJuZXkiLCAiQmxldSBkJ0F1dmVyZ25lIiwgIkJsZXUgZGUgR2V4IiwgIkJsZXUgZGUgTGFxdWV1aWxsZSIsCi0gICAgICAgICAgICAiQmxldSBkZSBTZXB0bW9uY2VsIiwgIkJsZXUgRGVzIENhdXNzZXMiLCAiQmx1ZSIsICJCbHVlIENhc3RlbGxvIiwgIkJsdWUgUmF0aGdvcmUiLAotICAgICAgICAgICAgIkJsdWUgVmVpbiAoQXVzdHJhbGlhbikiLCAiQmx1ZSBWZWluIENoZWVzZXMiLCAiQm9jY29uY2luaSIsICJCb2Njb25jaW5pIChBdXN0cmFsaWFuKSIsCi0gICAgICAgICAgICAiQm9lcmVuIExlaWRlbmthYXMiLCAiQm9uY2hlc3RlciIsICJCb3N3b3J0aCIsICJCb3Vnb24iLCAiQm91bGUgRHUgUm92ZXMiLAotICAgICAgICAgICAgIkJvdWxldHRlIGQnQXZlc25lcyIsICJCb3Vyc2F1bHQiLCAiQm91cnNpbiIsICJCb3V5c3NvdSIsICJCcmEiLCAiQnJhdWRvc3R1ciIsCi0gICAgICAgICAgICAiQnJlYWtmYXN0IENoZWVzZSIsICJCcmViaXMgZHUgTGF2b3J0IiwgIkJyZWJpcyBkdSBMb2Nob2lzIiwgIkJyZWJpcyBkdSBQdXlmYXVjb24iLAotICAgICAgICAgICAgIkJyZXNzZSBCbGV1IiwgIkJyaWNrIiwgIkJyaWUiLCAiQnJpZSBkZSBNZWF1eCIsICJCcmllIGRlIE1lbHVuIiwgIkJyaWxsYXQtU2F2YXJpbiIsCi0gICAgICAgICAgICAiQnJpbiIsICJCcmluIGQnIEFtb3VyIiwgIkJyaW4gZCdBbW91ciIsICJCcmluemEgKEJ1cmR1ZiBCcmluemEpIiwKLSAgICAgICAgICAgICJCcmlxdWV0dGUgZGUgQnJlYmlzIiwgIkJyaXF1ZXR0ZSBkdSBGb3JleiIsICJCcm9jY2lvIiwgIkJyb2NjaW8gRGVtaS1BZmZpbmUiLAotICAgICAgICAgICAgIkJyb3Vzc2UgZHUgUm92ZSIsICJCcnVkZXIgQmFzaWwiLCAiQnJ1c3NlbGFlIEthYXMgKEZyb21hZ2UgZGUgQnJ1eGVsbGVzKSIsICJCcnluZHphIiwKLSAgICAgICAgICAgICJCdWNoZXR0ZSBkJ0Fuam91IiwgIkJ1ZmZhbG8iLCAiQnVyZ29zIiwgIkJ1dHRlIiwgIkJ1dHRlcmthc2UiLCAiQnV0dG9uIChJbm5lcykiLAotICAgICAgICAgICAgIkJ1eHRvbiBCbHVlIiwgIkNhYmVjb3UiLCAiQ2Fib2MiLCAiQ2FicmFsZXMiLCAiQ2FjaGFpbGxlIiwgIkNhY2lvY2F2YWxsbyIsICJDYWNpb3R0YSIsCi0gICAgICAgICAgICAiQ2FlcnBoaWxseSIsICJDYWlybnNtb3JlIiwgIkNhbGVuemFuYSIsICJDYW1iYXpvbGEiLCAiQ2FtZW1iZXJ0IGRlIE5vcm1hbmRpZSIsCi0gICAgICAgICAgICAiQ2FuYWRpYW4gQ2hlZGRhciIsICJDYW5lc3RyYXRvIiwgIkNhbnRhbCIsICJDYXByaWNlIGRlcyBEaWV1eCIsICJDYXByaWNvcm4gR29hdCIsCi0gICAgICAgICAgICAiQ2FwcmlvbGUgQmFub24iLCAiQ2FycmUgZGUgbCdFc3QiLCAiQ2FzY2lvdHRhIGRpIFVyYmlubyIsICJDYXNoZWwgQmx1ZSIsICJDYXN0ZWxsYW5vIiwKLSAgICAgICAgICAgICJDYXN0ZWxsZW5vIiwgIkNhc3RlbG1hZ25vIiwgIkNhc3RlbG8gQnJhbmNvIiwgIkNhc3RpZ2xpYW5vIiwgIkNhdGhlbGFpbiIsCi0gICAgICAgICAgICAiQ2VsdGljIFByb21pc2UiLCAiQ2VuZHJlIGQnT2xpdmV0IiwgIkNlcm5leSIsICJDaGFiaWNob3UiLCAiQ2hhYmljaG91IGR1IFBvaXRvdSIsCi0gICAgICAgICAgICAiQ2hhYmlzIGRlIEdhdGluZSIsICJDaGFvdXJjZSIsICJDaGFyb2xhaXMiLCAiQ2hhdW1lcyIsICJDaGVkZGFyIiwKLSAgICAgICAgICAgICJDaGVkZGFyIENsb3RoYm91bmQiLCAiQ2hlc2hpcmUiLCAiQ2hldnJlcyIsICJDaGV2cm90aW4gZGVzIEFyYXZpcyIsICJDaG9udGFsZW5vIiwKLSAgICAgICAgICAgICJDaXZyYXkiLCAiQ29ldXIgZGUgQ2FtZW1iZXJ0IGF1IENhbHZhZG9zIiwgIkNvZXVyIGRlIENoZXZyZSIsICJDb2xieSIsICJDb2xkIFBhY2siLAotICAgICAgICAgICAgIkNvbXRlIiwgIkNvb2xlYSIsICJDb29sZW5leSIsICJDb3F1ZXRkYWxlIiwgIkNvcmxlZ2d5IiwgIkNvcm5pc2ggUGVwcGVyIiwKLSAgICAgICAgICAgICJDb3RoZXJzdG9uZSIsICJDb3RpamEiLCAiQ290dGFnZSBDaGVlc2UiLCAiQ290dGFnZSBDaGVlc2UgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJDb3VnYXIgR29sZCIsICJDb3Vsb21taWVycyIsICJDb3ZlcmRhbGUiLCAiQ3JheWV1eCBkZSBSb25jcSIsICJDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkNyZWFtIEhhdmFydGkiLCAiQ3JlbWEgQWdyaWEiLCAiQ3JlbWEgTWV4aWNhbmEiLCAiQ3JlbWUgRnJhaWNoZSIsICJDcmVzY2VuemEiLAotICAgICAgICAgICAgIkNyb2doYW4iLCAiQ3JvdHRpbiBkZSBDaGF2aWdub2wiLCAiQ3JvdHRpbiBkdSBDaGF2aWdub2wiLCAiQ3Jvd2RpZSIsICJDcm93bGV5IiwKLSAgICAgICAgICAgICJDdWFqYWRhIiwgIkN1cmQiLCAiQ3VyZSBOYW50YWlzIiwgIkN1cndvcnRoeSIsICJDd210YXdlIFBlY29yaW5vIiwKLSAgICAgICAgICAgICJDeXByZXNzIEdyb3ZlIENoZXZyZSIsICJEYW5hYmx1IChEYW5pc2ggQmx1ZSkiLCAiRGFuYm8iLCAiRGFuaXNoIEZvbnRpbmEiLAotICAgICAgICAgICAgIkRhcmFsYWdqYXpza3kiLCAiRGF1cGhpbiIsICJEZWxpY2UgZGVzIEZpb3V2ZXMiLCAiRGVuaGFueSBEb3JzZXQgRHJ1bSIsICJEZXJieSIsCi0gICAgICAgICAgICAiRGVzc2VydG55aiBCZWx5aiIsICJEZXZvbiBCbHVlIiwgIkRldm9uIEdhcmxhbmQiLCAiRG9sY2VsYXR0ZSIsICJEb29saW4iLAotICAgICAgICAgICAgIkRvcHBlbHJoYW1zdHVmZWwiLCAiRG9yc2V0IEJsdWUgVmlubmV5IiwgIkRvdWJsZSBHbG91Y2VzdGVyIiwgIkRvdWJsZSBXb3JjZXN0ZXIiLAotICAgICAgICAgICAgIkRyZXV4IGEgbGEgRmV1aWxsZSIsICJEcnkgSmFjayIsICJEdWRkbGVzd2VsbCIsICJEdW5iYXJyYSIsICJEdW5sb3AiLCAiRHVuc3lyZSBCbHVlIiwKLSAgICAgICAgICAgICJEdXJvYmxhbmRvIiwgIkR1cnJ1cyIsICJEdXRjaCBNaW1vbGV0dGUgKENvbW1pc3NpZWthYXMpIiwgIkVkYW0iLCAiRWRlbHBpbHoiLAotICAgICAgICAgICAgIkVtZW50YWwgR3JhbmQgQ3J1IiwgIkVtbGV0dCIsICJFbW1lbnRhbCIsICJFcG9pc3NlcyBkZSBCb3VyZ29nbmUiLCAiRXNiYXJlaWNoIiwKLSAgICAgICAgICAgICJFc3JvbSIsICJFdG9ya2kiLCAiRXZhbnNkYWxlIEZhcm1ob3VzZSBCcmllIiwgIkV2b3JhIERlIEwnQWxlbnRlam8iLCAiRXhtb29yIEJsdWUiLAotICAgICAgICAgICAgIkV4cGxvcmF0ZXVyIiwgIkZldGEiLCAiRmV0YSAoQXVzdHJhbGlhbikiLCAiRmlndWUiLCAiRmlsZXR0YSIsICJGaW4tZGUtU2llY2xlIiwKLSAgICAgICAgICAgICJGaW5sYW5kaWEgU3dpc3MiLCAiRmlubiIsICJGaW9yZSBTYXJkbyIsICJGbGV1ciBkdSBNYXF1aXMiLCAiRmxvciBkZSBHdWlhIiwKLSAgICAgICAgICAgICJGbG93ZXIgTWFyaWUiLCAiRm9sZGVkIiwgIkZvbGRlZCBjaGVlc2Ugd2l0aCBtaW50IiwgIkZvbmRhbnQgZGUgQnJlYmlzIiwKLSAgICAgICAgICAgICJGb250YWluZWJsZWF1IiwgIkZvbnRhbCIsICJGb250aW5hIFZhbCBkJ0Fvc3RhIiwgIkZvcm1hZ2dpbyBkaSBjYXByYSIsICJGb3VnZXJ1cyIsCi0gICAgICAgICAgICAiRm91ciBIZXJiIEdvdWRhIiwgIkZvdXJtZSBkJyBBbWJlcnQiLCAiRm91cm1lIGRlIEhhdXRlIExvaXJlIiwgIkZvdXJtZSBkZSBNb250YnJpc29uIiwKLSAgICAgICAgICAgICJGcmVzaCBKYWNrIiwgIkZyZXNoIE1venphcmVsbGEiLCAiRnJlc2ggUmljb3R0YSIsICJGcmVzaCBUcnVmZmxlcyIsICJGcmlib3VyZ2VvaXMiLAotICAgICAgICAgICAgIkZyaWVzZWthYXMiLCAiRnJpZXNpYW4iLCAiRnJpZXNsYSIsICJGcmluYXVsdCIsICJGcm9tYWdlIGEgUmFjbGV0dGUiLCAiRnJvbWFnZSBDb3JzZSIsCi0gICAgICAgICAgICAiRnJvbWFnZSBkZSBNb250YWduZSBkZSBTYXZvaWUiLCAiRnJvbWFnZSBGcmFpcyIsICJGcnVpdCBDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkZyeWluZyBDaGVlc2UiLCAiRnluYm8iLCAiR2FicmllbCIsICJHYWxldHRlIGR1IFBhbHVkaWVyIiwgIkdhbGV0dGUgTHlvbm5haXNlIiwKLSAgICAgICAgICAgICJHYWxsb3dheSBHb2F0J3MgTWlsayBHZW1zIiwgIkdhbW1lbG9zdCIsICJHYXBlcm9uIGEgbCdBaWwiLCAiR2Fycm90eGEiLCAiR2FzdGFuYmVycmEiLAotICAgICAgICAgICAgIkdlaXRvc3QiLCAiR2lwcHNsYW5kIEJsdWUiLCAiR2pldG9zdCIsICJHbG91Y2VzdGVyIiwgIkdvbGRlbiBDcm9zcyIsICJHb3Jnb256b2xhIiwKLSAgICAgICAgICAgICJHb3JueWFsdGFqc2tpIiwgIkdvc3BlbCBHcmVlbiIsICJHb3VkYSIsICJHb3V0dSIsICJHb3dyaWUiLCAiR3JhYmV0dG8iLCAiR3JhZGRvc3QiLAotICAgICAgICAgICAgIkdyYWZ0b24gVmlsbGFnZSBDaGVkZGFyIiwgIkdyYW5hIiwgIkdyYW5hIFBhZGFubyIsICJHcmFuZCBWYXRlbCIsCi0gICAgICAgICAgICAiR3JhdGFyb24gZCcgQXJlY2hlcyIsICJHcmF0dGUtUGFpbGxlIiwgIkdyYXZpZXJhIiwgIkdyZXVpbGgiLCAiR3JldmUiLAotICAgICAgICAgICAgIkdyaXMgZGUgTGlsbGUiLCAiR3J1eWVyZSIsICJHdWJiZWVuIiwgIkd1ZXJiaWdueSIsICJIYWxsb3VtaSIsCi0gICAgICAgICAgICAiSGFsbG91bXkgKEF1c3RyYWxpYW4pIiwgIkhhbG91bWktU3R5bGUgQ2hlZXNlIiwgIkhhcmJvdXJuZSBCbHVlIiwgIkhhdmFydGkiLAotICAgICAgICAgICAgIkhlaWRpIEdydXllcmUiLCAiSGVyZWZvcmQgSG9wIiwgIkhlcnJnYXJkc29zdCIsICJIZXJyaW90IEZhcm1ob3VzZSIsICJIZXJ2ZSIsCi0gICAgICAgICAgICAiSGlwaSBJdGkiLCAiSHViYmFyZHN0b24gQmx1ZSBDb3ciLCAiSHVzaGFsbHNvc3QiLCAiSWJlcmljbyIsICJJZGFobyBHb2F0c3RlciIsCi0gICAgICAgICAgICAiSWRpYXphYmFsIiwgIklsIEJvc2NoZXR0byBhbCBUYXJ0dWZvIiwgIklsZSBkJ1lldSIsICJJc2xlIG9mIE11bGwiLCAiSmFybHNiZXJnIiwKLSAgICAgICAgICAgICJKZXJtaSBUb3J0ZXMiLCAiSmlibmVoIEFyYWJpZWgiLCAiSmluZGkgQnJpZSIsICJKdWJpbGVlIEJsdWUiLCAiSnV1c3RvbGVpcGEiLAotICAgICAgICAgICAgIkthZGNoZ2FsbCIsICJLYXNlcmkiLCAiS2FzaHRhIiwgIktlZmFsb3R5cmkiLCAiS2VuYWZhIiwgIktlcm5oZW0iLCAiS2VydmVsbGEgQWZmaW5lIiwKLSAgICAgICAgICAgICJLaWtvcmFuZ2kiLCAiS2luZyBJc2xhbmQgQ2FwZSBXaWNraGFtIEJyaWUiLCAiS2luZyBSaXZlciBHb2xkIiwgIktsb3N0ZXJrYWVzZSIsCi0gICAgICAgICAgICAiS25vY2thbGFyYSIsICJLdWdlbGthc2UiLCAiTCdBdmV5cm9ubmFpcyIsICJMJ0VjaXIgZGUgbCdBdWJyYWMiLCAiTGEgVGF1cGluaWVyZSIsCi0gICAgICAgICAgICAiTGEgVmFjaGUgUXVpIFJpdCIsICJMYWd1aW9sZSIsICJMYWlyb2JlbGwiLCAiTGFqdGEiLCAiTGFuYXJrIEJsdWUiLCAiTGFuY2FzaGlyZSIsCi0gICAgICAgICAgICAiTGFuZ3JlcyIsICJMYXBwaSIsICJMYXJ1bnMiLCAiTGF2aXN0b3duIiwgIkxlIEJyaW4iLCAiTGUgRml1bSBPcmJvIiwgIkxlIExhY2FuZG91IiwKLSAgICAgICAgICAgICJMZSBSb3VsZSIsICJMZWFmaWVsZCIsICJMZWJiZW5lIiwgIkxlZXJkYW1tZXIiLCAiTGVpY2VzdGVyIiwgIkxleWRlbiIsICJMaW1idXJnZXIiLAotICAgICAgICAgICAgIkxpbmNvbG5zaGlyZSBQb2FjaGVyIiwgIkxpbmdvdCBTYWludCBCb3VzcXVldCBkJ09yYiIsICJMaXB0YXVlciIsICJMaXR0bGUgUnlkaW5ncyIsCi0gICAgICAgICAgICAiTGl2YXJvdCIsICJMbGFuYm9pZHkiLCAiTGxhbmdsb2ZhbiBGYXJtaG91c2UiLCAiTG9jaCBBcnRodXIgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJMb2RkaXN3ZWxsIEF2b25kYWxlIiwgIkxvbmdob3JuIiwgIkxvdSBQYWxvdSIsICJMb3UgUGV2cmUiLCAiTHlvbm5haXMiLCAiTWFhc2RhbSIsCi0gICAgICAgICAgICAiTWFjY29uYWlzIiwgIk1haG9lIEFnZWQgR291ZGEiLCAiTWFob24iLCAiTWFsdmVybiIsICJNYW1pcm9sbGUiLCAiTWFuY2hlZ28iLAotICAgICAgICAgICAgIk1hbm91cmkiLCAiTWFudXIiLCAiTWFyYmxlIENoZWRkYXIiLCAiTWFyYmxlZCBDaGVlc2VzIiwgIk1hcmVkc291cyIsICJNYXJnb3RpbiIsCi0gICAgICAgICAgICAiTWFyaWJvIiwgIk1hcm9pbGxlcyIsICJNYXNjYXJlcyIsICJNYXNjYXJwb25lIiwgIk1hc2NhcnBvbmUgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJNYXNjYXJwb25lIFRvcnRhIiwgIk1hdG9jcSIsICJNYXl0YWcgQmx1ZSIsICJNZWlyYSIsICJNZW5hbGxhY2sgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJNZW5vbml0YSIsICJNZXJlZGl0aCBCbHVlIiwgIk1lc29zdCIsICJNZXR0b24gKENhbmNvaWxsb3R0ZSkiLCAiTWV5ZXIgVmludGFnZSBHb3VkYSIsCi0gICAgICAgICAgICAiTWloYWxpYyBQZXluaXIiLCAiTWlsbGVlbnMiLCAiTWltb2xldHRlIiwgIk1pbmUtR2FiaGFyIiwgIk1pbmkgQmFieSBCZWxscyIsICJNaXh0ZSIsCi0gICAgICAgICAgICAiTW9sYm8iLCAiTW9uYXN0ZXJ5IENoZWVzZXMiLCAiTW9uZHNlZXIiLCAiTW9udCBEJ29yIEx5b25uYWlzIiwgIk1vbnRhc2lvIiwKLSAgICAgICAgICAgICJNb250ZXJleSBKYWNrIiwgIk1vbnRlcmV5IEphY2sgRHJ5IiwgIk1vcmJpZXIiLCAiTW9yYmllciBDcnUgZGUgTW9udGFnbmUiLAotICAgICAgICAgICAgIk1vdGhhaXMgYSBsYSBGZXVpbGxlIiwgIk1venphcmVsbGEiLCAiTW96emFyZWxsYSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIk1venphcmVsbGEgZGkgQnVmYWxhIiwgIk1venphcmVsbGEgRnJlc2gsIGluIHdhdGVyIiwgIk1venphcmVsbGEgUm9sbHMiLCAiTXVuc3RlciIsCi0gICAgICAgICAgICAiTXVyb2wiLCAiTXljZWxsYSIsICJNeXppdGhyYSIsICJOYWJvdWxzaSIsICJOYW50YWlzIiwgIk5ldWZjaGF0ZWwiLAotICAgICAgICAgICAgIk5ldWZjaGF0ZWwgKEF1c3RyYWxpYW4pIiwgIk5pb2xvIiwgIk5va2tlbG9zdCIsICJOb3J0aHVtYmVybGFuZCIsICJPYXhhY2EiLAotICAgICAgICAgICAgIk9sZGUgWW9yayIsICJPbGl2ZXQgYXUgRm9pbiIsICJPbGl2ZXQgQmxldSIsICJPbGl2ZXQgQ2VuZHJlIiwKLSAgICAgICAgICAgICJPcmtuZXkgRXh0cmEgTWF0dXJlIENoZWRkYXIiLCAiT3JsYSIsICJPc2NodGplcGthIiwgIk9zc2F1IEZlcm1pZXIiLCAiT3NzYXUtSXJhdHkiLAotICAgICAgICAgICAgIk9zemN6eXBlayIsICJPeGZvcmQgQmx1ZSIsICJQJ3RpdCBCZXJyaWNob24iLCAiUGFsZXQgZGUgQmFibGlnbnkiLCAiUGFuZWVyIiwgIlBhbmVsYSIsCi0gICAgICAgICAgICAiUGFubmVyb25lIiwgIlBhbnQgeXMgR2F3biIsICJQYXJtZXNhbiAoUGFybWlnaWFubykiLCAiUGFybWlnaWFubyBSZWdnaWFubyIsCi0gICAgICAgICAgICAiUGFzIGRlIGwnRXNjYWxldHRlIiwgIlBhc3NlbmRhbGUiLCAiUGFzdGV1cml6ZWQgUHJvY2Vzc2VkIiwgIlBhdGUgZGUgRnJvbWFnZSIsCi0gICAgICAgICAgICAiUGF0ZWZpbmUgRm9ydCIsICJQYXZlIGQnQWZmaW5vaXMiLCAiUGF2ZSBkJ0F1Z2UiLCAiUGF2ZSBkZSBDaGlyYWMiLCAiUGF2ZSBkdSBCZXJyeSIsCi0gICAgICAgICAgICAiUGVjb3Jpbm8iLCAiUGVjb3Jpbm8gaW4gV2FsbnV0IExlYXZlcyIsICJQZWNvcmlubyBSb21hbm8iLCAiUGVla3NraWxsIFB5cmFtaWQiLAotICAgICAgICAgICAgIlBlbGFyZG9uIGRlcyBDZXZlbm5lcyIsICJQZWxhcmRvbiBkZXMgQ29yYmllcmVzIiwgIlBlbmFtZWxsZXJhIiwgIlBlbmJyeW4iLAotICAgICAgICAgICAgIlBlbmNhcnJlZyIsICJQZXJhaWwgZGUgQnJlYmlzIiwgIlBldGl0IE1vcmluIiwgIlBldGl0IFBhcmRvdSIsICJQZXRpdC1TdWlzc2UiLAotICAgICAgICAgICAgIlBpY29kb24gZGUgQ2hldnJlIiwgIlBpY29zIGRlIEV1cm9wYSIsICJQaW9yYSIsICJQaXRodHZpZXJzIGF1IEZvaW4iLAotICAgICAgICAgICAgIlBsYXRlYXUgZGUgSGVydmUiLCAiUGx5bW91dGggQ2hlZXNlIiwgIlBvZGhhbGFuc2tpIiwgIlBvaXZyZSBkJ0FuZSIsICJQb2xrb2xiaW4iLAotICAgICAgICAgICAgIlBvbnQgbCdFdmVxdWUiLCAiUG9ydCBOaWNob2xzb24iLCAiUG9ydC1TYWx1dCIsICJQb3N0ZWwiLCAiUG91bGlnbnktU2FpbnQtUGllcnJlIiwKLSAgICAgICAgICAgICJQb3VybHkiLCAiUHJhc3Rvc3QiLCAiUHJlc3NhdG8iLCAiUHJpbmNlLUplYW4iLCAiUHJvY2Vzc2VkIENoZWRkYXIiLCAiUHJvdm9sb25lIiwKLSAgICAgICAgICAgICJQcm92b2xvbmUgKEF1c3RyYWxpYW4pIiwgIlB5ZW5nYW5hIENoZWRkYXIiLCAiUHlyYW1pZGUiLCAiUXVhcmsiLAotICAgICAgICAgICAgIlF1YXJrIChBdXN0cmFsaWFuKSIsICJRdWFydGlyb2xvIExvbWJhcmRvIiwgIlF1YXRyZS1WZW50cyIsICJRdWVyY3kgUGV0aXQiLAotICAgICAgICAgICAgIlF1ZXNvIEJsYW5jbyIsICJRdWVzbyBCbGFuY28gY29uIEZydXRhcyAtLVBpbmEgeSBNYW5nbyIsICJRdWVzbyBkZSBNdXJjaWEiLAotICAgICAgICAgICAgIlF1ZXNvIGRlbCBNb250c2VjIiwgIlF1ZXNvIGRlbCBUaWV0YXIiLCAiUXVlc28gRnJlc2NvIiwgIlF1ZXNvIEZyZXNjbyAoQWRvYmVyYSkiLAotICAgICAgICAgICAgIlF1ZXNvIEliZXJpY28iLCAiUXVlc28gSmFsYXBlbm8iLCAiUXVlc28gTWFqb3Jlcm8iLCAiUXVlc28gTWVkaWEgTHVuYSIsCi0gICAgICAgICAgICAiUXVlc28gUGFyYSBGcmllciIsICJRdWVzbyBRdWVzYWRpbGxhIiwgIlJhYmFjYWwiLCAiUmFjbGV0dGUiLCAiUmFndXNhbm8iLCAiUmFzY2hlcmEiLAotICAgICAgICAgICAgIlJlYmxvY2hvbiIsICJSZWQgTGVpY2VzdGVyIiwgIlJlZ2FsIGRlIGxhIERvbWJlcyIsICJSZWdnaWFuaXRvIiwgIlJlbWVkb3UiLAotICAgICAgICAgICAgIlJlcXVlc29uIiwgIlJpY2hlbGlldSIsICJSaWNvdHRhIiwgIlJpY290dGEgKEF1c3RyYWxpYW4pIiwgIlJpY290dGEgU2FsYXRhIiwgIlJpZGRlciIsCi0gICAgICAgICAgICAiUmlnb3R0ZSIsICJSb2NhbWFkb3VyIiwgIlJvbGxvdCIsICJSb21hbm8iLCAiUm9tYW5zIFBhcnQgRGlldSIsICJSb25jYWwiLCAiUm9xdWVmb3J0IiwKLSAgICAgICAgICAgICJSb3VsZSIsICJSb3VsZWF1IERlIEJlYXVsaWV1IiwgIlJveWFscCBUaWxzaXQiLCAiUnViZW5zIiwgIlJ1c3RpbnUiLCAiU2FhbGFuZCBQZmFyciIsCi0gICAgICAgICAgICAiU2FhbmVua2Flc2UiLCAiU2FnYSIsICJTYWdlIERlcmJ5IiwgIlNhaW50ZSBNYXVyZSIsICJTYWludC1NYXJjZWxsaW4iLAotICAgICAgICAgICAgIlNhaW50LU5lY3RhaXJlIiwgIlNhaW50LVBhdWxpbiIsICJTYWxlcnMiLCAiU2Ftc28iLCAiU2FuIFNpbW9uIiwgIlNhbmNlcnJlIiwKLSAgICAgICAgICAgICJTYXAgU2FnbyIsICJTYXJkbyIsICJTYXJkbyBFZ3lwdGlhbiIsICJTYnJpbnoiLCAiU2NhbW9yemEiLCAiU2NoYWJ6aWVnZXIiLCAiU2NobG9zcyIsCi0gICAgICAgICAgICAiU2VsbGVzIHN1ciBDaGVyIiwgIlNlbHZhIiwgIlNlcmF0IiwgIlNlcmlvdXNseSBTdHJvbmcgQ2hlZGRhciIsICJTZXJyYSBkYSBFc3RyZWxhIiwKLSAgICAgICAgICAgICJTaGFycGFtIiwgIlNoZWxidXJuZSBDaGVkZGFyIiwgIlNocm9wc2hpcmUgQmx1ZSIsICJTaXJheiIsICJTaXJlbmUiLCAiU21va2VkIEdvdWRhIiwKLSAgICAgICAgICAgICJTb21lcnNldCBCcmllIiwgIlNvbm9tYSBKYWNrIiwgIlNvdHRvY2VuYXJlIGFsIFRhcnR1Zm8iLCAiU291bWFpbnRyYWluIiwKLSAgICAgICAgICAgICJTb3VyaXJlIExvemVyaWVuIiwgIlNwZW53b29kIiwgIlNyYWZmb3Jkc2hpcmUgT3JnYW5pYyIsICJTdC4gQWd1ciBCbHVlIENoZWVzZSIsCi0gICAgICAgICAgICAiU3RpbHRvbiIsICJTdGlua2luZyBCaXNob3AiLCAiU3RyaW5nIiwgIlN1c3NleCBTbGlwY290ZSIsICJTdmVjaWFvc3QiLCAiU3dhbGVkYWxlIiwKLSAgICAgICAgICAgICJTd2VldCBTdHlsZSBTd2lzcyIsICJTd2lzcyIsICJTeXJpYW4gKEFybWVuaWFuIFN0cmluZykiLCAiVGFsYSIsICJUYWxlZ2dpbyIsICJUYW1pZSIsCi0gICAgICAgICAgICAiVGFzbWFuaWEgSGlnaGxhbmQgQ2hldnJlIExvZyIsICJUYXVwaW5pZXJlIiwgIlRlaWZpIiwgIlRlbGVtZWEiLCAiVGVzdG91cmkiLAotICAgICAgICAgICAgIlRldGUgZGUgTW9pbmUiLCAiVGV0aWxsYSIsICJUZXhhcyBHb2F0IENoZWVzZSIsICJUaWJldCIsICJUaWxsYW1vb2sgQ2hlZGRhciIsCi0gICAgICAgICAgICAiVGlsc2l0IiwgIlRpbWJvb24gQnJpZSIsICJUb21hIiwgIlRvbW1lIEJydWxlZSIsICJUb21tZSBkJ0Fib25kYW5jZSIsCi0gICAgICAgICAgICAiVG9tbWUgZGUgQ2hldnJlIiwgIlRvbW1lIGRlIFJvbWFucyIsICJUb21tZSBkZSBTYXZvaWUiLCAiVG9tbWUgZGVzIENob3VhbnMiLCAiVG9tbWVzIiwKLSAgICAgICAgICAgICJUb3J0YSBkZWwgQ2FzYXIiLCAiVG9zY2FuZWxsbyIsICJUb3VyZWUgZGUgTCdBdWJpZXIiLCAiVG91cm1hbGV0IiwKLSAgICAgICAgICAgICJUcmFwcGUgKFZlcml0YWJsZSkiLCAiVHJvaXMgQ29ybmVzIERlIFZlbmRlZSIsICJUcm9uY2hvbiIsICJUcm91IGR1IENydSIsICJUcnVmZmUiLAotICAgICAgICAgICAgIlR1cGkiLCAiVHVydW5tYWEiLCAiVHltc2Jvcm8iLCAiVHluIEdydWciLCAiVHluaW5nIiwgIlVicmlhY28iLCAiVWxsb2EiLAotICAgICAgICAgICAgIlZhY2hlcmluLUZyaWJvdXJnZW9pcyIsICJWYWxlbmNheSIsICJWYXN0ZXJib3R0ZW5vc3QiLCAiVmVuYWNvIiwgIlZlbmRvbW9pcyIsCi0gICAgICAgICAgICAiVmlldXggQ29yc2UiLCAiVmlnbm90dGUiLCAiVnVsc2NvbWJlIiwgIldhaW1hdGEgRmFybWhvdXNlIEJsdWUiLAotICAgICAgICAgICAgIldhc2hlZCBSaW5kIENoZWVzZSAoQXVzdHJhbGlhbikiLCAiV2F0ZXJsb28iLCAiV2VpY2hrYWVzZSIsICJXZWxsaW5ndG9uIiwKLSAgICAgICAgICAgICJXZW5zbGV5ZGFsZSIsICJXaGl0ZSBTdGlsdG9uIiwgIldoaXRlc3RvbmUgRmFybWhvdXNlIiwgIldpZ21vcmUiLCAiV29vZHNpZGUgQ2FiZWNvdSIsCi0gICAgICAgICAgICAiWGFuYWR1IiwgIlh5bm90eXJvIiwgIllhcmcgQ29ybmlzaCIsICJZYXJyYSBWYWxsZXkgUHlyYW1pZCIsICJZb3Jrc2hpcmUgQmx1ZSIsCi0gICAgICAgICAgICAiWmFtb3Jhbm8iLCAiWmFuZXR0aSBHcmFuYSBQYWRhbm8iLCAiWmFuZXR0aSBQYXJtaWdpYW5vIFJlZ2dpYW5vIn07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtU3RyaW5ncyA9IENoZWVzZXMuc0NoZWVzZVN0cmluZ3M7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCmluZGV4IDQxZWI0ODEuLjU1ZjNiMjIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNC5qYXZhCkBAIC0xMzcsMTc4ICsxMzcsNSBAQAogICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgRWZmaWNpZW50QWRhcHRlcih0aGlzKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQSA9IHsKLSAgICAgICAgICAgICJBYmJheWUgZGUgQmVsbG9jIiwgIkFiYmF5ZSBkdSBNb250IGRlcyBDYXRzIiwgIkFiZXJ0YW0iLAotICAgICAgICAgICAgIkFib25kYW5jZSIsICJBY2thd2kiLCAiQWNvcm4iLCAiQWRlbG9zdCIsICJBZmZpZGVsaWNlIGF1IENoYWJsaXMiLAotICAgICAgICAgICAgIkFmdWVnYSdsIFBpdHUiLCAiQWlyYWciLCAiQWlyZWRhbGUiLCAiQWlzeSBDZW5kcmUiLAotICAgICAgICAgICAgIkFsbGdhdWVyIEVtbWVudGFsZXIiLCAiQWx2ZXJjYSIsICJBbWJlcnQiLCAiQW1lcmljYW4gQ2hlZXNlIiwKLSAgICAgICAgICAgICJBbWkgZHUgQ2hhbWJlcnRpbiIsICJBbmVqbyBFbmNoaWxhZG8iLCAiQW5uZWF1IGR1IFZpYy1CaWxoIiwKLSAgICAgICAgICAgICJBbnRob3Jpcm8iLCAiQXBwZW56ZWxsIiwgIkFyYWdvbiIsICJBcmRpIEdhc25hIiwgIkFyZHJhaGFuIiwKLSAgICAgICAgICAgICJBcm1lbmlhbiBTdHJpbmciLCAiQXJvbWVzIGF1IEdlbmUgZGUgTWFyYyIsICJBc2FkZXJvIiwgIkFzaWFnbyIsCi0gICAgICAgICAgICAiQXViaXNxdWUgUHlyZW5lZXMiLCAiQXV0dW4iLCAiQXZheHRza3lyIiwgIkJhYnkgU3dpc3MiLCAiQmFieWJlbCIsCi0gICAgICAgICAgICAiQmFndWV0dGUgTGFvbm5haXNlIiwgIkJha2VycyIsICJCYWxhZGkiLCAiQmFsYXRvbiIsICJCYW5kYWwiLAotICAgICAgICAgICAgIkJhbm9uIiwgIkJhcnJ5J3MgQmF5IENoZWRkYXIiLCAiQmFzaW5nIiwgIkJhc2tldCBDaGVlc2UiLAotICAgICAgICAgICAgIkJhdGggQ2hlZXNlIiwgIkJhdmFyaWFuIEJlcmdrYXNlIiwgIkJheWxvdWdoIiwgIkJlYXVmb3J0IiwKLSAgICAgICAgICAgICJCZWF1dm9vcmRlIiwgIkJlZW5sZWlnaCBCbHVlIiwgIkJlZXIgQ2hlZXNlIiwgIkJlbCBQYWVzZSIsCi0gICAgICAgICAgICAiQmVyZ2FkZXIiLCAiQmVyZ2VyZSBCbGV1ZSIsICJCZXJrc3dlbGwiLCAiQmV5YXogUGV5bmlyIiwKLSAgICAgICAgICAgICJCaWVya2FzZSIsICJCaXNob3AgS2VubmVkeSIsICJCbGFybmV5IiwgIkJsZXUgZCdBdXZlcmduZSIsCi0gICAgICAgICAgICAiQmxldSBkZSBHZXgiLCAiQmxldSBkZSBMYXF1ZXVpbGxlIiwgIkJsZXUgZGUgU2VwdG1vbmNlbCIsCi0gICAgICAgICAgICAiQmxldSBEZXMgQ2F1c3NlcyIsICJCbHVlIiwgIkJsdWUgQ2FzdGVsbG8iLCAiQmx1ZSBSYXRoZ29yZSIsCi0gICAgICAgICAgICAiQmx1ZSBWZWluIChBdXN0cmFsaWFuKSIsICJCbHVlIFZlaW4gQ2hlZXNlcyIsICJCb2Njb25jaW5pIiwKLSAgICAgICAgICAgICJCb2Njb25jaW5pIChBdXN0cmFsaWFuKSIsICJCb2VyZW4gTGVpZGVua2FhcyIsICJCb25jaGVzdGVyIiwKLSAgICAgICAgICAgICJCb3N3b3J0aCIsICJCb3Vnb24iLCAiQm91bGUgRHUgUm92ZXMiLCAiQm91bGV0dGUgZCdBdmVzbmVzIiwKLSAgICAgICAgICAgICJCb3Vyc2F1bHQiLCAiQm91cnNpbiIsICJCb3V5c3NvdSIsICJCcmEiLCAiQnJhdWRvc3R1ciIsCi0gICAgICAgICAgICAiQnJlYWtmYXN0IENoZWVzZSIsICJCcmViaXMgZHUgTGF2b3J0IiwgIkJyZWJpcyBkdSBMb2Nob2lzIiwKLSAgICAgICAgICAgICJCcmViaXMgZHUgUHV5ZmF1Y29uIiwgIkJyZXNzZSBCbGV1IiwgIkJyaWNrIiwgIkJyaWUiLAotICAgICAgICAgICAgIkJyaWUgZGUgTWVhdXgiLCAiQnJpZSBkZSBNZWx1biIsICJCcmlsbGF0LVNhdmFyaW4iLCAiQnJpbiIsCi0gICAgICAgICAgICAiQnJpbiBkJyBBbW91ciIsICJCcmluIGQnQW1vdXIiLCAiQnJpbnphIChCdXJkdWYgQnJpbnphKSIsCi0gICAgICAgICAgICAiQnJpcXVldHRlIGRlIEJyZWJpcyIsICJCcmlxdWV0dGUgZHUgRm9yZXoiLCAiQnJvY2NpbyIsCi0gICAgICAgICAgICAiQnJvY2NpbyBEZW1pLUFmZmluZSIsICJCcm91c3NlIGR1IFJvdmUiLCAiQnJ1ZGVyIEJhc2lsIiwKLSAgICAgICAgICAgICJCcnVzc2VsYWUgS2FhcyAoRnJvbWFnZSBkZSBCcnV4ZWxsZXMpIiwgIkJyeW5kemEiLAotICAgICAgICAgICAgIkJ1Y2hldHRlIGQnQW5qb3UiLCAiQnVmZmFsbyIsICJCdXJnb3MiLCAiQnV0dGUiLCAiQnV0dGVya2FzZSIsCi0gICAgICAgICAgICAiQnV0dG9uIChJbm5lcykiLCAiQnV4dG9uIEJsdWUiLCAiQ2FiZWNvdSIsICJDYWJvYyIsICJDYWJyYWxlcyIsCi0gICAgICAgICAgICAiQ2FjaGFpbGxlIiwgIkNhY2lvY2F2YWxsbyIsICJDYWNpb3R0YSIsICJDYWVycGhpbGx5IiwKLSAgICAgICAgICAgICJDYWlybnNtb3JlIiwgIkNhbGVuemFuYSIsICJDYW1iYXpvbGEiLCAiQ2FtZW1iZXJ0IGRlIE5vcm1hbmRpZSIsCi0gICAgICAgICAgICAiQ2FuYWRpYW4gQ2hlZGRhciIsICJDYW5lc3RyYXRvIiwgIkNhbnRhbCIsICJDYXByaWNlIGRlcyBEaWV1eCIsCi0gICAgICAgICAgICAiQ2Fwcmljb3JuIEdvYXQiLCAiQ2FwcmlvbGUgQmFub24iLCAiQ2FycmUgZGUgbCdFc3QiLAotICAgICAgICAgICAgIkNhc2Npb3R0YSBkaSBVcmJpbm8iLCAiQ2FzaGVsIEJsdWUiLCAiQ2FzdGVsbGFubyIsICJDYXN0ZWxsZW5vIiwKLSAgICAgICAgICAgICJDYXN0ZWxtYWdubyIsICJDYXN0ZWxvIEJyYW5jbyIsICJDYXN0aWdsaWFubyIsICJDYXRoZWxhaW4iLAotICAgICAgICAgICAgIkNlbHRpYyBQcm9taXNlIiwgIkNlbmRyZSBkJ09saXZldCIsICJDZXJuZXkiLCAiQ2hhYmljaG91IiwKLSAgICAgICAgICAgICJDaGFiaWNob3UgZHUgUG9pdG91IiwgIkNoYWJpcyBkZSBHYXRpbmUiLCAiQ2hhb3VyY2UiLCAiQ2hhcm9sYWlzIiwKLSAgICAgICAgICAgICJDaGF1bWVzIiwgIkNoZWRkYXIiLCAiQ2hlZGRhciBDbG90aGJvdW5kIiwgIkNoZXNoaXJlIiwgIkNoZXZyZXMiLAotICAgICAgICAgICAgIkNoZXZyb3RpbiBkZXMgQXJhdmlzIiwgIkNob250YWxlbm8iLCAiQ2l2cmF5IiwKLSAgICAgICAgICAgICJDb2V1ciBkZSBDYW1lbWJlcnQgYXUgQ2FsdmFkb3MiLCAiQ29ldXIgZGUgQ2hldnJlIiwgIkNvbGJ5IiwKLSAgICAgICAgICAgICJDb2xkIFBhY2siLCAiQ29tdGUiLCAiQ29vbGVhIiwgIkNvb2xlbmV5IiwgIkNvcXVldGRhbGUiLAotICAgICAgICAgICAgIkNvcmxlZ2d5IiwgIkNvcm5pc2ggUGVwcGVyIiwgIkNvdGhlcnN0b25lIiwgIkNvdGlqYSIsCi0gICAgICAgICAgICAiQ290dGFnZSBDaGVlc2UiLCAiQ290dGFnZSBDaGVlc2UgKEF1c3RyYWxpYW4pIiwgIkNvdWdhciBHb2xkIiwKLSAgICAgICAgICAgICJDb3Vsb21taWVycyIsICJDb3ZlcmRhbGUiLCAiQ3JheWV1eCBkZSBSb25jcSIsICJDcmVhbSBDaGVlc2UiLAotICAgICAgICAgICAgIkNyZWFtIEhhdmFydGkiLCAiQ3JlbWEgQWdyaWEiLCAiQ3JlbWEgTWV4aWNhbmEiLCAiQ3JlbWUgRnJhaWNoZSIsCi0gICAgICAgICAgICAiQ3Jlc2NlbnphIiwgIkNyb2doYW4iLCAiQ3JvdHRpbiBkZSBDaGF2aWdub2wiLAotICAgICAgICAgICAgIkNyb3R0aW4gZHUgQ2hhdmlnbm9sIiwgIkNyb3dkaWUiLCAiQ3Jvd2xleSIsICJDdWFqYWRhIiwgIkN1cmQiLAotICAgICAgICAgICAgIkN1cmUgTmFudGFpcyIsICJDdXJ3b3J0aHkiLCAiQ3dtdGF3ZSBQZWNvcmlubyIsCi0gICAgICAgICAgICAiQ3lwcmVzcyBHcm92ZSBDaGV2cmUiLCAiRGFuYWJsdSAoRGFuaXNoIEJsdWUpIiwgIkRhbmJvIiwKLSAgICAgICAgICAgICJEYW5pc2ggRm9udGluYSIsICJEYXJhbGFnamF6c2t5IiwgIkRhdXBoaW4iLCAiRGVsaWNlIGRlcyBGaW91dmVzIiwKLSAgICAgICAgICAgICJEZW5oYW55IERvcnNldCBEcnVtIiwgIkRlcmJ5IiwgIkRlc3NlcnRueWogQmVseWoiLCAiRGV2b24gQmx1ZSIsCi0gICAgICAgICAgICAiRGV2b24gR2FybGFuZCIsICJEb2xjZWxhdHRlIiwgIkRvb2xpbiIsICJEb3BwZWxyaGFtc3R1ZmVsIiwKLSAgICAgICAgICAgICJEb3JzZXQgQmx1ZSBWaW5uZXkiLCAiRG91YmxlIEdsb3VjZXN0ZXIiLCAiRG91YmxlIFdvcmNlc3RlciIsCi0gICAgICAgICAgICAiRHJldXggYSBsYSBGZXVpbGxlIiwgIkRyeSBKYWNrIiwgIkR1ZGRsZXN3ZWxsIiwgIkR1bmJhcnJhIiwKLSAgICAgICAgICAgICJEdW5sb3AiLCAiRHVuc3lyZSBCbHVlIiwgIkR1cm9ibGFuZG8iLCAiRHVycnVzIiwKLSAgICAgICAgICAgICJEdXRjaCBNaW1vbGV0dGUgKENvbW1pc3NpZWthYXMpIiwgIkVkYW0iLCAiRWRlbHBpbHoiLAotICAgICAgICAgICAgIkVtZW50YWwgR3JhbmQgQ3J1IiwgIkVtbGV0dCIsICJFbW1lbnRhbCIsICJFcG9pc3NlcyBkZSBCb3VyZ29nbmUiLAotICAgICAgICAgICAgIkVzYmFyZWljaCIsICJFc3JvbSIsICJFdG9ya2kiLCAiRXZhbnNkYWxlIEZhcm1ob3VzZSBCcmllIiwKLSAgICAgICAgICAgICJFdm9yYSBEZSBMJ0FsZW50ZWpvIiwgIkV4bW9vciBCbHVlIiwgIkV4cGxvcmF0ZXVyIiwgIkZldGEiLAotICAgICAgICAgICAgIkZldGEgKEF1c3RyYWxpYW4pIiwgIkZpZ3VlIiwgIkZpbGV0dGEiLCAiRmluLWRlLVNpZWNsZSIsCi0gICAgICAgICAgICAiRmlubGFuZGlhIFN3aXNzIiwgIkZpbm4iLCAiRmlvcmUgU2FyZG8iLCAiRmxldXIgZHUgTWFxdWlzIiwKLSAgICAgICAgICAgICJGbG9yIGRlIEd1aWEiLCAiRmxvd2VyIE1hcmllIiwgIkZvbGRlZCIsCi0gICAgICAgICAgICAiRm9sZGVkIGNoZWVzZSB3aXRoIG1pbnQiLCAiRm9uZGFudCBkZSBCcmViaXMiLCAiRm9udGFpbmVibGVhdSIsCi0gICAgICAgICAgICAiRm9udGFsIiwgIkZvbnRpbmEgVmFsIGQnQW9zdGEiLCAiRm9ybWFnZ2lvIGRpIGNhcHJhIiwgIkZvdWdlcnVzIiwKLSAgICAgICAgICAgICJGb3VyIEhlcmIgR291ZGEiLCAiRm91cm1lIGQnIEFtYmVydCIsICJGb3VybWUgZGUgSGF1dGUgTG9pcmUiLAotICAgICAgICAgICAgIkZvdXJtZSBkZSBNb250YnJpc29uIiwgIkZyZXNoIEphY2siLCAiRnJlc2ggTW96emFyZWxsYSIsCi0gICAgICAgICAgICAiRnJlc2ggUmljb3R0YSIsICJGcmVzaCBUcnVmZmxlcyIsICJGcmlib3VyZ2VvaXMiLCAiRnJpZXNla2FhcyIsCi0gICAgICAgICAgICAiRnJpZXNpYW4iLCAiRnJpZXNsYSIsICJGcmluYXVsdCIsICJGcm9tYWdlIGEgUmFjbGV0dGUiLAotICAgICAgICAgICAgIkZyb21hZ2UgQ29yc2UiLCAiRnJvbWFnZSBkZSBNb250YWduZSBkZSBTYXZvaWUiLCAiRnJvbWFnZSBGcmFpcyIsCi0gICAgICAgICAgICAiRnJ1aXQgQ3JlYW0gQ2hlZXNlIiwgIkZyeWluZyBDaGVlc2UiLCAiRnluYm8iLCAiR2FicmllbCIsCi0gICAgICAgICAgICAiR2FsZXR0ZSBkdSBQYWx1ZGllciIsICJHYWxldHRlIEx5b25uYWlzZSIsCi0gICAgICAgICAgICAiR2FsbG93YXkgR29hdCdzIE1pbGsgR2VtcyIsICJHYW1tZWxvc3QiLCAiR2FwZXJvbiBhIGwnQWlsIiwKLSAgICAgICAgICAgICJHYXJyb3R4YSIsICJHYXN0YW5iZXJyYSIsICJHZWl0b3N0IiwgIkdpcHBzbGFuZCBCbHVlIiwgIkdqZXRvc3QiLAotICAgICAgICAgICAgIkdsb3VjZXN0ZXIiLCAiR29sZGVuIENyb3NzIiwgIkdvcmdvbnpvbGEiLCAiR29ybnlhbHRhanNraSIsCi0gICAgICAgICAgICAiR29zcGVsIEdyZWVuIiwgIkdvdWRhIiwgIkdvdXR1IiwgIkdvd3JpZSIsICJHcmFiZXR0byIsICJHcmFkZG9zdCIsCi0gICAgICAgICAgICAiR3JhZnRvbiBWaWxsYWdlIENoZWRkYXIiLCAiR3JhbmEiLCAiR3JhbmEgUGFkYW5vIiwgIkdyYW5kIFZhdGVsIiwKLSAgICAgICAgICAgICJHcmF0YXJvbiBkJyBBcmVjaGVzIiwgIkdyYXR0ZS1QYWlsbGUiLCAiR3JhdmllcmEiLCAiR3JldWlsaCIsCi0gICAgICAgICAgICAiR3JldmUiLCAiR3JpcyBkZSBMaWxsZSIsICJHcnV5ZXJlIiwgIkd1YmJlZW4iLCAiR3VlcmJpZ255IiwKLSAgICAgICAgICAgICJIYWxsb3VtaSIsICJIYWxsb3VteSAoQXVzdHJhbGlhbikiLCAiSGFsb3VtaS1TdHlsZSBDaGVlc2UiLAotICAgICAgICAgICAgIkhhcmJvdXJuZSBCbHVlIiwgIkhhdmFydGkiLCAiSGVpZGkgR3J1eWVyZSIsICJIZXJlZm9yZCBIb3AiLAotICAgICAgICAgICAgIkhlcnJnYXJkc29zdCIsICJIZXJyaW90IEZhcm1ob3VzZSIsICJIZXJ2ZSIsICJIaXBpIEl0aSIsCi0gICAgICAgICAgICAiSHViYmFyZHN0b24gQmx1ZSBDb3ciLCAiSHVzaGFsbHNvc3QiLCAiSWJlcmljbyIsICJJZGFobyBHb2F0c3RlciIsCi0gICAgICAgICAgICAiSWRpYXphYmFsIiwgIklsIEJvc2NoZXR0byBhbCBUYXJ0dWZvIiwgIklsZSBkJ1lldSIsCi0gICAgICAgICAgICAiSXNsZSBvZiBNdWxsIiwgIkphcmxzYmVyZyIsICJKZXJtaSBUb3J0ZXMiLCAiSmlibmVoIEFyYWJpZWgiLAotICAgICAgICAgICAgIkppbmRpIEJyaWUiLCAiSnViaWxlZSBCbHVlIiwgIkp1dXN0b2xlaXBhIiwgIkthZGNoZ2FsbCIsICJLYXNlcmkiLAotICAgICAgICAgICAgIkthc2h0YSIsICJLZWZhbG90eXJpIiwgIktlbmFmYSIsICJLZXJuaGVtIiwgIktlcnZlbGxhIEFmZmluZSIsCi0gICAgICAgICAgICAiS2lrb3JhbmdpIiwgIktpbmcgSXNsYW5kIENhcGUgV2lja2hhbSBCcmllIiwgIktpbmcgUml2ZXIgR29sZCIsCi0gICAgICAgICAgICAiS2xvc3RlcmthZXNlIiwgIktub2NrYWxhcmEiLCAiS3VnZWxrYXNlIiwgIkwnQXZleXJvbm5haXMiLAotICAgICAgICAgICAgIkwnRWNpciBkZSBsJ0F1YnJhYyIsICJMYSBUYXVwaW5pZXJlIiwgIkxhIFZhY2hlIFF1aSBSaXQiLAotICAgICAgICAgICAgIkxhZ3Vpb2xlIiwgIkxhaXJvYmVsbCIsICJMYWp0YSIsICJMYW5hcmsgQmx1ZSIsICJMYW5jYXNoaXJlIiwKLSAgICAgICAgICAgICJMYW5ncmVzIiwgIkxhcHBpIiwgIkxhcnVucyIsICJMYXZpc3Rvd24iLCAiTGUgQnJpbiIsCi0gICAgICAgICAgICAiTGUgRml1bSBPcmJvIiwgIkxlIExhY2FuZG91IiwgIkxlIFJvdWxlIiwgIkxlYWZpZWxkIiwgIkxlYmJlbmUiLAotICAgICAgICAgICAgIkxlZXJkYW1tZXIiLCAiTGVpY2VzdGVyIiwgIkxleWRlbiIsICJMaW1idXJnZXIiLAotICAgICAgICAgICAgIkxpbmNvbG5zaGlyZSBQb2FjaGVyIiwgIkxpbmdvdCBTYWludCBCb3VzcXVldCBkJ09yYiIsICJMaXB0YXVlciIsCi0gICAgICAgICAgICAiTGl0dGxlIFJ5ZGluZ3MiLCAiTGl2YXJvdCIsICJMbGFuYm9pZHkiLCAiTGxhbmdsb2ZhbiBGYXJtaG91c2UiLAotICAgICAgICAgICAgIkxvY2ggQXJ0aHVyIEZhcm1ob3VzZSIsICJMb2RkaXN3ZWxsIEF2b25kYWxlIiwgIkxvbmdob3JuIiwKLSAgICAgICAgICAgICJMb3UgUGFsb3UiLCAiTG91IFBldnJlIiwgIkx5b25uYWlzIiwgIk1hYXNkYW0iLCAiTWFjY29uYWlzIiwKLSAgICAgICAgICAgICJNYWhvZSBBZ2VkIEdvdWRhIiwgIk1haG9uIiwgIk1hbHZlcm4iLCAiTWFtaXJvbGxlIiwgIk1hbmNoZWdvIiwKLSAgICAgICAgICAgICJNYW5vdXJpIiwgIk1hbnVyIiwgIk1hcmJsZSBDaGVkZGFyIiwgIk1hcmJsZWQgQ2hlZXNlcyIsCi0gICAgICAgICAgICAiTWFyZWRzb3VzIiwgIk1hcmdvdGluIiwgIk1hcmlibyIsICJNYXJvaWxsZXMiLCAiTWFzY2FyZXMiLAotICAgICAgICAgICAgIk1hc2NhcnBvbmUiLCAiTWFzY2FycG9uZSAoQXVzdHJhbGlhbikiLCAiTWFzY2FycG9uZSBUb3J0YSIsCi0gICAgICAgICAgICAiTWF0b2NxIiwgIk1heXRhZyBCbHVlIiwgIk1laXJhIiwgIk1lbmFsbGFjayBGYXJtaG91c2UiLAotICAgICAgICAgICAgIk1lbm9uaXRhIiwgIk1lcmVkaXRoIEJsdWUiLCAiTWVzb3N0IiwgIk1ldHRvbiAoQ2FuY29pbGxvdHRlKSIsCi0gICAgICAgICAgICAiTWV5ZXIgVmludGFnZSBHb3VkYSIsICJNaWhhbGljIFBleW5pciIsICJNaWxsZWVucyIsICJNaW1vbGV0dGUiLAotICAgICAgICAgICAgIk1pbmUtR2FiaGFyIiwgIk1pbmkgQmFieSBCZWxscyIsICJNaXh0ZSIsICJNb2xibyIsCi0gICAgICAgICAgICAiTW9uYXN0ZXJ5IENoZWVzZXMiLCAiTW9uZHNlZXIiLCAiTW9udCBEJ29yIEx5b25uYWlzIiwgIk1vbnRhc2lvIiwKLSAgICAgICAgICAgICJNb250ZXJleSBKYWNrIiwgIk1vbnRlcmV5IEphY2sgRHJ5IiwgIk1vcmJpZXIiLAotICAgICAgICAgICAgIk1vcmJpZXIgQ3J1IGRlIE1vbnRhZ25lIiwgIk1vdGhhaXMgYSBsYSBGZXVpbGxlIiwgIk1venphcmVsbGEiLAotICAgICAgICAgICAgIk1venphcmVsbGEgKEF1c3RyYWxpYW4pIiwgIk1venphcmVsbGEgZGkgQnVmYWxhIiwKLSAgICAgICAgICAgICJNb3p6YXJlbGxhIEZyZXNoLCBpbiB3YXRlciIsICJNb3p6YXJlbGxhIFJvbGxzIiwgIk11bnN0ZXIiLAotICAgICAgICAgICAgIk11cm9sIiwgIk15Y2VsbGEiLCAiTXl6aXRocmEiLCAiTmFib3Vsc2kiLCAiTmFudGFpcyIsCi0gICAgICAgICAgICAiTmV1ZmNoYXRlbCIsICJOZXVmY2hhdGVsIChBdXN0cmFsaWFuKSIsICJOaW9sbyIsICJOb2trZWxvc3QiLAotICAgICAgICAgICAgIk5vcnRodW1iZXJsYW5kIiwgIk9heGFjYSIsICJPbGRlIFlvcmsiLCAiT2xpdmV0IGF1IEZvaW4iLAotICAgICAgICAgICAgIk9saXZldCBCbGV1IiwgIk9saXZldCBDZW5kcmUiLCAiT3JrbmV5IEV4dHJhIE1hdHVyZSBDaGVkZGFyIiwKLSAgICAgICAgICAgICJPcmxhIiwgIk9zY2h0amVwa2EiLCAiT3NzYXUgRmVybWllciIsICJPc3NhdS1JcmF0eSIsICJPc3pjenlwZWsiLAotICAgICAgICAgICAgIk94Zm9yZCBCbHVlIiwgIlAndGl0IEJlcnJpY2hvbiIsICJQYWxldCBkZSBCYWJsaWdueSIsICJQYW5lZXIiLAotICAgICAgICAgICAgIlBhbmVsYSIsICJQYW5uZXJvbmUiLCAiUGFudCB5cyBHYXduIiwgIlBhcm1lc2FuIChQYXJtaWdpYW5vKSIsCi0gICAgICAgICAgICAiUGFybWlnaWFubyBSZWdnaWFubyIsICJQYXMgZGUgbCdFc2NhbGV0dGUiLCAiUGFzc2VuZGFsZSIsCi0gICAgICAgICAgICAiUGFzdGV1cml6ZWQgUHJvY2Vzc2VkIiwgIlBhdGUgZGUgRnJvbWFnZSIsICJQYXRlZmluZSBGb3J0IiwKLSAgICAgICAgICAgICJQYXZlIGQnQWZmaW5vaXMiLCAiUGF2ZSBkJ0F1Z2UiLCAiUGF2ZSBkZSBDaGlyYWMiLAotICAgICAgICAgICAgIlBhdmUgZHUgQmVycnkiLCAiUGVjb3Jpbm8iLCAiUGVjb3Jpbm8gaW4gV2FsbnV0IExlYXZlcyIsCi0gICAgICAgICAgICAiUGVjb3Jpbm8gUm9tYW5vIiwgIlBlZWtza2lsbCBQeXJhbWlkIiwgIlBlbGFyZG9uIGRlcyBDZXZlbm5lcyIsCi0gICAgICAgICAgICAiUGVsYXJkb24gZGVzIENvcmJpZXJlcyIsICJQZW5hbWVsbGVyYSIsICJQZW5icnluIiwgIlBlbmNhcnJlZyIsCi0gICAgICAgICAgICAiUGVyYWlsIGRlIEJyZWJpcyIsICJQZXRpdCBNb3JpbiIsICJQZXRpdCBQYXJkb3UiLCAiUGV0aXQtU3Vpc3NlIiwKLSAgICAgICAgICAgICJQaWNvZG9uIGRlIENoZXZyZSIsICJQaWNvcyBkZSBFdXJvcGEiLCAiUGlvcmEiLAotICAgICAgICAgICAgIlBpdGh0dmllcnMgYXUgRm9pbiIsICJQbGF0ZWF1IGRlIEhlcnZlIiwgIlBseW1vdXRoIENoZWVzZSIsCi0gICAgICAgICAgICAiUG9kaGFsYW5za2kiLCAiUG9pdnJlIGQnQW5lIiwgIlBvbGtvbGJpbiIsICJQb250IGwnRXZlcXVlIiwKLSAgICAgICAgICAgICJQb3J0IE5pY2hvbHNvbiIsICJQb3J0LVNhbHV0IiwgIlBvc3RlbCIsICJQb3VsaWdueS1TYWludC1QaWVycmUiLAotICAgICAgICAgICAgIlBvdXJseSIsICJQcmFzdG9zdCIsICJQcmVzc2F0byIsICJQcmluY2UtSmVhbiIsCi0gICAgICAgICAgICAiUHJvY2Vzc2VkIENoZWRkYXIiLCAiUHJvdm9sb25lIiwgIlByb3ZvbG9uZSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIlB5ZW5nYW5hIENoZWRkYXIiLCAiUHlyYW1pZGUiLCAiUXVhcmsiLCAiUXVhcmsgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJRdWFydGlyb2xvIExvbWJhcmRvIiwgIlF1YXRyZS1WZW50cyIsICJRdWVyY3kgUGV0aXQiLAotICAgICAgICAgICAgIlF1ZXNvIEJsYW5jbyIsICJRdWVzbyBCbGFuY28gY29uIEZydXRhcyAtLVBpbmEgeSBNYW5nbyIsCi0gICAgICAgICAgICAiUXVlc28gZGUgTXVyY2lhIiwgIlF1ZXNvIGRlbCBNb250c2VjIiwgIlF1ZXNvIGRlbCBUaWV0YXIiLAotICAgICAgICAgICAgIlF1ZXNvIEZyZXNjbyIsICJRdWVzbyBGcmVzY28gKEFkb2JlcmEpIiwgIlF1ZXNvIEliZXJpY28iLAotICAgICAgICAgICAgIlF1ZXNvIEphbGFwZW5vIiwgIlF1ZXNvIE1ham9yZXJvIiwgIlF1ZXNvIE1lZGlhIEx1bmEiLAotICAgICAgICAgICAgIlF1ZXNvIFBhcmEgRnJpZXIiLCAiUXVlc28gUXVlc2FkaWxsYSIsICJSYWJhY2FsIiwgIlJhY2xldHRlIiwKLSAgICAgICAgICAgICJSYWd1c2FubyIsICJSYXNjaGVyYSIsICJSZWJsb2Nob24iLCAiUmVkIExlaWNlc3RlciIsCi0gICAgICAgICAgICAiUmVnYWwgZGUgbGEgRG9tYmVzIiwgIlJlZ2dpYW5pdG8iLCAiUmVtZWRvdSIsICJSZXF1ZXNvbiIsCi0gICAgICAgICAgICAiUmljaGVsaWV1IiwgIlJpY290dGEiLCAiUmljb3R0YSAoQXVzdHJhbGlhbikiLCAiUmljb3R0YSBTYWxhdGEiLAotICAgICAgICAgICAgIlJpZGRlciIsICJSaWdvdHRlIiwgIlJvY2FtYWRvdXIiLCAiUm9sbG90IiwgIlJvbWFubyIsCi0gICAgICAgICAgICAiUm9tYW5zIFBhcnQgRGlldSIsICJSb25jYWwiLCAiUm9xdWVmb3J0IiwgIlJvdWxlIiwKLSAgICAgICAgICAgICJSb3VsZWF1IERlIEJlYXVsaWV1IiwgIlJveWFscCBUaWxzaXQiLCAiUnViZW5zIiwgIlJ1c3RpbnUiLAotICAgICAgICAgICAgIlNhYWxhbmQgUGZhcnIiLCAiU2FhbmVua2Flc2UiLCAiU2FnYSIsICJTYWdlIERlcmJ5IiwKLSAgICAgICAgICAgICJTYWludGUgTWF1cmUiLCAiU2FpbnQtTWFyY2VsbGluIiwgIlNhaW50LU5lY3RhaXJlIiwKLSAgICAgICAgICAgICJTYWludC1QYXVsaW4iLCAiU2FsZXJzIiwgIlNhbXNvIiwgIlNhbiBTaW1vbiIsICJTYW5jZXJyZSIsCi0gICAgICAgICAgICAiU2FwIFNhZ28iLCAiU2FyZG8iLCAiU2FyZG8gRWd5cHRpYW4iLCAiU2JyaW56IiwgIlNjYW1vcnphIiwKLSAgICAgICAgICAgICJTY2hhYnppZWdlciIsICJTY2hsb3NzIiwgIlNlbGxlcyBzdXIgQ2hlciIsICJTZWx2YSIsICJTZXJhdCIsCi0gICAgICAgICAgICAiU2VyaW91c2x5IFN0cm9uZyBDaGVkZGFyIiwgIlNlcnJhIGRhIEVzdHJlbGEiLCAiU2hhcnBhbSIsCi0gICAgICAgICAgICAiU2hlbGJ1cm5lIENoZWRkYXIiLCAiU2hyb3BzaGlyZSBCbHVlIiwgIlNpcmF6IiwgIlNpcmVuZSIsCi0gICAgICAgICAgICAiU21va2VkIEdvdWRhIiwgIlNvbWVyc2V0IEJyaWUiLCAiU29ub21hIEphY2siLAotICAgICAgICAgICAgIlNvdHRvY2VuYXJlIGFsIFRhcnR1Zm8iLCAiU291bWFpbnRyYWluIiwgIlNvdXJpcmUgTG96ZXJpZW4iLAotICAgICAgICAgICAgIlNwZW53b29kIiwgIlNyYWZmb3Jkc2hpcmUgT3JnYW5pYyIsICJTdC4gQWd1ciBCbHVlIENoZWVzZSIsCi0gICAgICAgICAgICAiU3RpbHRvbiIsICJTdGlua2luZyBCaXNob3AiLCAiU3RyaW5nIiwgIlN1c3NleCBTbGlwY290ZSIsCi0gICAgICAgICAgICAiU3ZlY2lhb3N0IiwgIlN3YWxlZGFsZSIsICJTd2VldCBTdHlsZSBTd2lzcyIsICJTd2lzcyIsCi0gICAgICAgICAgICAiU3lyaWFuIChBcm1lbmlhbiBTdHJpbmcpIiwgIlRhbGEiLCAiVGFsZWdnaW8iLCAiVGFtaWUiLAotICAgICAgICAgICAgIlRhc21hbmlhIEhpZ2hsYW5kIENoZXZyZSBMb2ciLCAiVGF1cGluaWVyZSIsICJUZWlmaSIsICJUZWxlbWVhIiwKLSAgICAgICAgICAgICJUZXN0b3VyaSIsICJUZXRlIGRlIE1vaW5lIiwgIlRldGlsbGEiLCAiVGV4YXMgR29hdCBDaGVlc2UiLAotICAgICAgICAgICAgIlRpYmV0IiwgIlRpbGxhbW9vayBDaGVkZGFyIiwgIlRpbHNpdCIsICJUaW1ib29uIEJyaWUiLCAiVG9tYSIsCi0gICAgICAgICAgICAiVG9tbWUgQnJ1bGVlIiwgIlRvbW1lIGQnQWJvbmRhbmNlIiwgIlRvbW1lIGRlIENoZXZyZSIsCi0gICAgICAgICAgICAiVG9tbWUgZGUgUm9tYW5zIiwgIlRvbW1lIGRlIFNhdm9pZSIsICJUb21tZSBkZXMgQ2hvdWFucyIsCi0gICAgICAgICAgICAiVG9tbWVzIiwgIlRvcnRhIGRlbCBDYXNhciIsICJUb3NjYW5lbGxvIiwgIlRvdXJlZSBkZSBMJ0F1YmllciIsCi0gICAgICAgICAgICAiVG91cm1hbGV0IiwgIlRyYXBwZSAoVmVyaXRhYmxlKSIsICJUcm9pcyBDb3JuZXMgRGUgVmVuZGVlIiwKLSAgICAgICAgICAgICJUcm9uY2hvbiIsICJUcm91IGR1IENydSIsICJUcnVmZmUiLCAiVHVwaSIsICJUdXJ1bm1hYSIsCi0gICAgICAgICAgICAiVHltc2Jvcm8iLCAiVHluIEdydWciLCAiVHluaW5nIiwgIlVicmlhY28iLCAiVWxsb2EiLAotICAgICAgICAgICAgIlZhY2hlcmluLUZyaWJvdXJnZW9pcyIsICJWYWxlbmNheSIsICJWYXN0ZXJib3R0ZW5vc3QiLCAiVmVuYWNvIiwKLSAgICAgICAgICAgICJWZW5kb21vaXMiLCAiVmlldXggQ29yc2UiLCAiVmlnbm90dGUiLCAiVnVsc2NvbWJlIiwKLSAgICAgICAgICAgICJXYWltYXRhIEZhcm1ob3VzZSBCbHVlIiwgIldhc2hlZCBSaW5kIENoZWVzZSAoQXVzdHJhbGlhbikiLAotICAgICAgICAgICAgIldhdGVybG9vIiwgIldlaWNoa2Flc2UiLCAiV2VsbGluZ3RvbiIsICJXZW5zbGV5ZGFsZSIsCi0gICAgICAgICAgICAiV2hpdGUgU3RpbHRvbiIsICJXaGl0ZXN0b25lIEZhcm1ob3VzZSIsICJXaWdtb3JlIiwKLSAgICAgICAgICAgICJXb29kc2lkZSBDYWJlY291IiwgIlhhbmFkdSIsICJYeW5vdHlybyIsICJZYXJnIENvcm5pc2giLAotICAgICAgICAgICAgIllhcnJhIFZhbGxleSBQeXJhbWlkIiwgIllvcmtzaGlyZSBCbHVlIiwgIlphbW9yYW5vIiwKLSAgICAgICAgICAgICJaYW5ldHRpIEdyYW5hIFBhZGFubyIsICJaYW5ldHRpIFBhcm1pZ2lhbm8gUmVnZ2lhbm8ifTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRBID0gQ2hlZXNlcy5zQ2hlZXNlU3RyaW5nczsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhN2M2NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKKy8qKgorICogVGhpcyBkZW1vIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwsIGEuay5hLiBzZWxlY3Rpb24gbW9kZSBvbiBMaXN0Vmlldy4KKyAqLworcHVibGljIGNsYXNzIExpc3QxNSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBMaXN0VmlldyBsdiA9IGdldExpc3RWaWV3KCk7CisgICAgICAgIGx2LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpOworICAgICAgICBsdi5zZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcihuZXcgTW9kZUNhbGxiYWNrKCkpOworICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fY2hlY2tlZCwgbVN0cmluZ3MpKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Q3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25Qb3N0Q3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldEFjdGlvbkJhcigpLnNldFN1YnRpdGxlKCJMb25nIHByZXNzIHRvIHN0YXJ0IHNlbGVjdGlvbiIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIE1vZGVDYWxsYmFjayBpbXBsZW1lbnRzIExpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUubGlzdF9zZWxlY3RfbWVudSwgbWVudSk7CisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKCJTZWxlY3QgSXRlbXMiKTsKKyAgICAgICAgICAgIHNldFN1YnRpdGxlKG1vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChMaXN0MTUudGhpcywgIlNoYXJlZCAiICsgZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KExpc3QxNS50aGlzLCAiQ2xpY2tlZCAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQsIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgc2V0U3VidGl0bGUobW9kZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0U3VidGl0bGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hlY2tlZENvdW50ID0gZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrZWRDb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCJPbmUgaXRlbSBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCIiICsgY2hlY2tlZENvdW50ICsgIiBpdGVtcyBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSBDaGVlc2VzLnNDaGVlc2VTdHJpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE2LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVhNmVkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE2LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiBUaGlzIGRlbW8gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCwgYS5rLmEuIHNlbGVjdGlvbiBtb2RlIG9uIExpc3RWaWV3CisgKiBjb3VwbGUgd2l0aCB0aGUgbmV3IHNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEgd2hpY2ggdXNlcyBhIGhpZ2hsaWdodGVkIGJvcmRlciBmb3Igc2VsZWN0ZWQKKyAqIGl0ZW1zLgorICovCitwdWJsaWMgY2xhc3MgTGlzdDE2IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIExpc3RWaWV3IGx2ID0gZ2V0TGlzdFZpZXcoKTsKKyAgICAgICAgbHYuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCk7CisgICAgICAgIGx2LnNldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyKG5ldyBNb2RlQ2FsbGJhY2soKSk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMSwgQ2hlZXNlcy5zQ2hlZXNlU3RyaW5ncykpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RDcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblBvc3RDcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0QWN0aW9uQmFyKCkuc2V0U3VidGl0bGUoIkxvbmcgcHJlc3MgdG8gc3RhcnQgc2VsZWN0aW9uIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5saXN0X3NlbGVjdF9tZW51LCBtZW51KTsKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUoIlNlbGVjdCBJdGVtcyIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChMaXN0MTYudGhpcywgIlNoYXJlZCAiICsgZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KExpc3QxNi50aGlzLCAiQ2xpY2tlZCAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKEFjdGlvbk1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQsIGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNoZWNrZWRDb3VudCA9IGdldExpc3RWaWV3KCkuZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpOworICAgICAgICAgICAgc3dpdGNoIChjaGVja2VkQ291bnQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiT25lIGl0ZW0gc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiIiArIGNoZWNrZWRDb3VudCArICIgaXRlbXMgc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE3LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZhMGJkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDE3LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisKKy8qKgorICogQSBsaXN0IHZpZXcgd2hlcmUgdGhlIGxhc3QgaXRlbSB0aGUgdXNlciBjbGlja2VkIGlzIHBsYWNlZCBpbgorICogdGhlICJhY3RpdmF0ZWQiIHN0YXRlLCBjYXVzaW5nIGl0cyBiYWNrZ3JvdW5kIHRvIGhpZ2hsaWdodC4KKyAqLworcHVibGljIGNsYXNzIExpc3QxNyBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLy8gVXNlIHRoZSBidWlsdC1pbiBsYXlvdXQgZm9yIHNob3dpbmcgYSBsaXN0IGl0ZW0gd2l0aCBhIHNpbmdsZQorICAgICAgICAvLyBsaW5lIG9mIHRleHQgd2hvc2UgYmFja2dyb3VuZCBpcyBjaGFuZ2VzIHdoZW4gYWN0aXZhdGVkLgorICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEsIG1TdHJpbmdzKSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0VGV4dEZpbHRlckVuYWJsZWQodHJ1ZSk7CisgICAgICAgIAorICAgICAgICAvLyBUZWxsIHRoZSBsaXN0IHZpZXcgdG8gc2hvdyBvbmUgY2hlY2tlZC9hY3RpdmF0ZWQgaXRlbSBhdCBhIHRpbWUuCisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICAKKyAgICAgICAgLy8gU3RhcnQgd2l0aCBmaXJzdCBpdGVtIGFjdGl2YXRlZC4KKyAgICAgICAgLy8gTWFrZSB0aGUgbmV3bHkgY2xpY2tlZCBpdGVtIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb25lLgorICAgICAgICBnZXRMaXN0VmlldygpLnNldEl0ZW1DaGVja2VkKDAsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAvLyBNYWtlIHRoZSBuZXdseSBjbGlja2VkIGl0ZW0gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvbmUuCisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSBDaGVlc2VzLnNDaGVlc2VTdHJpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q0LmphdmEKaW5kZXggYTE0MGU2MC4uOWMxOGE1ZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDQuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0NC5qYXZhCkBAIC0xNiw4ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKLS8vTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCi0vL2NsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlNoYWtlc3BlYXJlOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyI2dldENvdW50KCkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVRpdGxlcy5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gU2hha2VzcGVhcmUuVElUTEVTLmxlbmd0aDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtOTIsMTIgKzkyLDEyIEBACiAgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CiAgICAgICAgICAgICBTcGVlY2hWaWV3IHN2OwogICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdiA9IG5ldyBTcGVlY2hWaWV3KG1Db250ZXh0LCBtVGl0bGVzW3Bvc2l0aW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaWFsb2d1ZVtwb3NpdGlvbl0pOworICAgICAgICAgICAgICAgIHN2ID0gbmV3IFNwZWVjaFZpZXcobUNvbnRleHQsIFNoYWtlc3BlYXJlLlRJVExFU1twb3NpdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICBTaGFrZXNwZWFyZS5ESUFMT0dVRVtwb3NpdGlvbl0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdiA9IChTcGVlY2hWaWV3KSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgICAgICBzdi5zZXRUaXRsZShtVGl0bGVzW3Bvc2l0aW9uXSk7Ci0gICAgICAgICAgICAgICAgc3Yuc2V0RGlhbG9ndWUobURpYWxvZ3VlW3Bvc2l0aW9uXSk7CisgICAgICAgICAgICAgICAgc3Yuc2V0VGl0bGUoU2hha2VzcGVhcmUuVElUTEVTW3Bvc2l0aW9uXSk7CisgICAgICAgICAgICAgICAgc3Yuc2V0RGlhbG9ndWUoU2hha2VzcGVhcmUuRElBTE9HVUVbcG9zaXRpb25dKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHN2OwpAQCAtMTA3LDIyNiArMTA3LDYgQEAKICAgICAgICAgICogUmVtZW1iZXIgb3VyIGNvbnRleHQgc28gd2UgY2FuIHVzZSBpdCB3aGVuIGNvbnN0cnVjdGluZyB2aWV3cy4KICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdXIgZGF0YSwgcGFydCAxLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGl0bGVzID0gCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAiSGVucnkgSVYgKDEpIiwgICAKLSAgICAgICAgICAgICAgICAiSGVucnkgViIsCi0gICAgICAgICAgICAgICAgIkhlbnJ5IFZJSUkiLCAgICAgICAKLSAgICAgICAgICAgICAgICAiUmljaGFyZCBJSSIsCi0gICAgICAgICAgICAgICAgIlJpY2hhcmQgSUlJIiwKLSAgICAgICAgICAgICAgICAiTWVyY2hhbnQgb2YgVmVuaWNlIiwgIAotICAgICAgICAgICAgICAgICJPdGhlbGxvIiwKLSAgICAgICAgICAgICAgICAiS2luZyBMZWFyIgotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE91ciBkYXRhLCBwYXJ0IDIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1EaWFsb2d1ZSA9IAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIlNvIHNoYWtlbiBhcyB3ZSBhcmUsIHNvIHdhbiB3aXRoIGNhcmUsIiArCi0gICAgICAgICAgICAgICAgIkZpbmQgd2UgYSB0aW1lIGZvciBmcmlnaHRlZCBwZWFjZSB0byBwYW50LCIgKwotICAgICAgICAgICAgICAgICJBbmQgYnJlYXRoZSBzaG9ydC13aW5kZWQgYWNjZW50cyBvZiBuZXcgYnJvaWxzIiArCi0gICAgICAgICAgICAgICAgIlRvIGJlIGNvbW1lbmNlZCBpbiBzdHJhbmRzIGFmYXIgcmVtb3RlLiIgKwotICAgICAgICAgICAgICAgICJObyBtb3JlIHRoZSB0aGlyc3R5IGVudHJhbmNlIG9mIHRoaXMgc29pbCIgKwotICAgICAgICAgICAgICAgICJTaGFsbCBkYXViIGhlciBsaXBzIHdpdGggaGVyIG93biBjaGlsZHJlbidzIGJsb29kOyIgKwotICAgICAgICAgICAgICAgICJOb3IgbW9yZSBzaGFsbCB0cmVuY2hpbmcgd2FyIGNoYW5uZWwgaGVyIGZpZWxkcywiICsKLSAgICAgICAgICAgICAgICAiTm9yIGJydWlzZSBoZXIgZmxvd2VyZXRzIHdpdGggdGhlIGFybWVkIGhvb2ZzIiArCi0gICAgICAgICAgICAgICAgIk9mIGhvc3RpbGUgcGFjZXM6IHRob3NlIG9wcG9zZWQgZXllcywiICsKLSAgICAgICAgICAgICAgICAiV2hpY2gsIGxpa2UgdGhlIG1ldGVvcnMgb2YgYSB0cm91YmxlZCBoZWF2ZW4sIiArCi0gICAgICAgICAgICAgICAgIkFsbCBvZiBvbmUgbmF0dXJlLCBvZiBvbmUgc3Vic3RhbmNlIGJyZWQsIiArCi0gICAgICAgICAgICAgICAgIkRpZCBsYXRlbHkgbWVldCBpbiB0aGUgaW50ZXN0aW5lIHNob2NrIiArCi0gICAgICAgICAgICAgICAgIkFuZCBmdXJpb3VzIGNsb3NlIG9mIGNpdmlsIGJ1dGNoZXJ5IiArCi0gICAgICAgICAgICAgICAgIlNoYWxsIG5vdywgaW4gbXV0dWFsIHdlbGwtYmVzZWVtaW5nIHJhbmtzLCIgKwotICAgICAgICAgICAgICAgICJNYXJjaCBhbGwgb25lIHdheSBhbmQgYmUgbm8gbW9yZSBvcHBvc2VkIiArCi0gICAgICAgICAgICAgICAgIkFnYWluc3QgYWNxdWFpbnRhbmNlLCBraW5kcmVkIGFuZCBhbGxpZXM6IiArCi0gICAgICAgICAgICAgICAgIlRoZSBlZGdlIG9mIHdhciwgbGlrZSBhbiBpbGwtc2hlYXRoZWQga25pZmUsIiArCi0gICAgICAgICAgICAgICAgIk5vIG1vcmUgc2hhbGwgY3V0IGhpcyBtYXN0ZXIuIFRoZXJlZm9yZSwgZnJpZW5kcywiICsKLSAgICAgICAgICAgICAgICAiQXMgZmFyIGFzIHRvIHRoZSBzZXB1bGNocmUgb2YgQ2hyaXN0LCIgKwotICAgICAgICAgICAgICAgICJXaG9zZSBzb2xkaWVyIG5vdywgdW5kZXIgd2hvc2UgYmxlc3NlZCBjcm9zcyIgKwotICAgICAgICAgICAgICAgICJXZSBhcmUgaW1wcmVzc2VkIGFuZCBlbmdhZ2VkIHRvIGZpZ2h0LCIgKwotICAgICAgICAgICAgICAgICJGb3J0aHdpdGggYSBwb3dlciBvZiBFbmdsaXNoIHNoYWxsIHdlIGxldnk7IiArCi0gICAgICAgICAgICAgICAgIldob3NlIGFybXMgd2VyZSBtb3VsZGVkIGluIHRoZWlyIG1vdGhlcnMnIHdvbWIiICsKLSAgICAgICAgICAgICAgICAiVG8gY2hhc2UgdGhlc2UgcGFnYW5zIGluIHRob3NlIGhvbHkgZmllbGRzIiArCi0gICAgICAgICAgICAgICAgIk92ZXIgd2hvc2UgYWNyZXMgd2FsaydkIHRob3NlIGJsZXNzZWQgZmVldCIgKwotICAgICAgICAgICAgICAgICJXaGljaCBmb3VydGVlbiBodW5kcmVkIHllYXJzIGFnbyB3ZXJlIG5haWwnZCIgKwotICAgICAgICAgICAgICAgICJGb3Igb3VyIGFkdmFudGFnZSBvbiB0aGUgYml0dGVyIGNyb3NzLiIgKwotICAgICAgICAgICAgICAgICJCdXQgdGhpcyBvdXIgcHVycG9zZSBub3cgaXMgdHdlbHZlIG1vbnRoIG9sZCwiICsKLSAgICAgICAgICAgICAgICAiQW5kIGJvb3RsZXNzICd0aXMgdG8gdGVsbCB5b3Ugd2Ugd2lsbCBnbzoiICsKLSAgICAgICAgICAgICAgICAiVGhlcmVmb3JlIHdlIG1lZXQgbm90IG5vdy4gVGhlbiBsZXQgbWUgaGVhciIgKwotICAgICAgICAgICAgICAgICJPZiB5b3UsIG15IGdlbnRsZSBjb3VzaW4gV2VzdG1vcmVsYW5kLCIgKwotICAgICAgICAgICAgICAgICJXaGF0IHllc3Rlcm5pZ2h0IG91ciBjb3VuY2lsIGRpZCBkZWNyZWUiICsKLSAgICAgICAgICAgICAgICAiSW4gZm9yd2FyZGluZyB0aGlzIGRlYXIgZXhwZWRpZW5jZS4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJIZWFyIGhpbSBidXQgcmVhc29uIGluIGRpdmluaXR5LCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGFsbC1hZG1pcmluZyB3aXRoIGFuIGlud2FyZCB3aXNoIiArIAotICAgICAgICAgICAgICAgICJZb3Ugd291bGQgZGVzaXJlIHRoZSBraW5nIHdlcmUgbWFkZSBhIHByZWxhdGU6IiArIAotICAgICAgICAgICAgICAgICJIZWFyIGhpbSBkZWJhdGUgb2YgY29tbW9ud2VhbHRoIGFmZmFpcnMsIiArIAotICAgICAgICAgICAgICAgICJZb3Ugd291bGQgc2F5IGl0IGhhdGggYmVlbiBhbGwgaW4gYWxsIGhpcyBzdHVkeToiICsgCi0gICAgICAgICAgICAgICAgIkxpc3QgaGlzIGRpc2NvdXJzZSBvZiB3YXIsIGFuZCB5b3Ugc2hhbGwgaGVhciIgKyAKLSAgICAgICAgICAgICAgICAiQSBmZWFyZnVsIGJhdHRsZSByZW5kZXInZCB5b3UgaW4gbXVzaWM6IiArIAotICAgICAgICAgICAgICAgICJUdXJuIGhpbSB0byBhbnkgY2F1c2Ugb2YgcG9saWN5LCIgKyAKLSAgICAgICAgICAgICAgICAiVGhlIEdvcmRpYW4ga25vdCBvZiBpdCBoZSB3aWxsIHVubG9vc2UsIiArIAotICAgICAgICAgICAgICAgICJGYW1pbGlhciBhcyBoaXMgZ2FydGVyOiB0aGF0LCB3aGVuIGhlIHNwZWFrcywiICsgCi0gICAgICAgICAgICAgICAgIlRoZSBhaXIsIGEgY2hhcnRlcidkIGxpYmVydGluZSwgaXMgc3RpbGwsIiArIAotICAgICAgICAgICAgICAgICJBbmQgdGhlIG11dGUgd29uZGVyIGx1cmtldGggaW4gbWVuJ3MgZWFycywiICsgCi0gICAgICAgICAgICAgICAgIlRvIHN0ZWFsIGhpcyBzd2VldCBhbmQgaG9uZXknZCBzZW50ZW5jZXM7IiArIAotICAgICAgICAgICAgICAgICJTbyB0aGF0IHRoZSBhcnQgYW5kIHByYWN0aWMgcGFydCBvZiBsaWZlIiArIAotICAgICAgICAgICAgICAgICJNdXN0IGJlIHRoZSBtaXN0cmVzcyB0byB0aGlzIHRoZW9yaWM6IiArIAotICAgICAgICAgICAgICAgICJXaGljaCBpcyBhIHdvbmRlciBob3cgaGlzIGdyYWNlIHNob3VsZCBnbGVhbiBpdCwiICsgCi0gICAgICAgICAgICAgICAgIlNpbmNlIGhpcyBhZGRpY3Rpb24gd2FzIHRvIGNvdXJzZXMgdmFpbiwiICsgCi0gICAgICAgICAgICAgICAgIkhpcyBjb21wYW5pZXMgdW5sZXR0ZXInZCwgcnVkZSBhbmQgc2hhbGxvdywiICsgCi0gICAgICAgICAgICAgICAgIkhpcyBob3VycyBmaWxsJ2QgdXAgd2l0aCByaW90cywgYmFucXVldHMsIHNwb3J0cywiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBuZXZlciBub3RlZCBpbiBoaW0gYW55IHN0dWR5LCIgKyAKLSAgICAgICAgICAgICAgICAiQW55IHJldGlyZW1lbnQsIGFueSBzZXF1ZXN0cmF0aW9uIiArIAotICAgICAgICAgICAgICAgICJGcm9tIG9wZW4gaGF1bnRzIGFuZCBwb3B1bGFyaXR5LiIsCi0KLSAgICAgICAgICAgICAgICAiSSBjb21lIG5vIG1vcmUgdG8gbWFrZSB5b3UgbGF1Z2g6IHRoaW5ncyBub3csIiArCi0gICAgICAgICAgICAgICAgIlRoYXQgYmVhciBhIHdlaWdodHkgYW5kIGEgc2VyaW91cyBicm93LCIgKwotICAgICAgICAgICAgICAgICJTYWQsIGhpZ2gsIGFuZCB3b3JraW5nLCBmdWxsIG9mIHN0YXRlIGFuZCB3b2UsIiArCi0gICAgICAgICAgICAgICAgIlN1Y2ggbm9ibGUgc2NlbmVzIGFzIGRyYXcgdGhlIGV5ZSB0byBmbG93LCIgKwotICAgICAgICAgICAgICAgICJXZSBub3cgcHJlc2VudC4gVGhvc2UgdGhhdCBjYW4gcGl0eSwgaGVyZSIgKwotICAgICAgICAgICAgICAgICJNYXksIGlmIHRoZXkgdGhpbmsgaXQgd2VsbCwgbGV0IGZhbGwgYSB0ZWFyOyIgKwotICAgICAgICAgICAgICAgICJUaGUgc3ViamVjdCB3aWxsIGRlc2VydmUgaXQuIFN1Y2ggYXMgZ2l2ZSIgKwotICAgICAgICAgICAgICAgICJUaGVpciBtb25leSBvdXQgb2YgaG9wZSB0aGV5IG1heSBiZWxpZXZlLCIgKwotICAgICAgICAgICAgICAgICJNYXkgaGVyZSBmaW5kIHRydXRoIHRvby4gVGhvc2UgdGhhdCBjb21lIHRvIHNlZSIgKwotICAgICAgICAgICAgICAgICJPbmx5IGEgc2hvdyBvciB0d28sIGFuZCBzbyBhZ3JlZSIgKwotICAgICAgICAgICAgICAgICJUaGUgcGxheSBtYXkgcGFzcywgaWYgdGhleSBiZSBzdGlsbCBhbmQgd2lsbGluZywiICsKLSAgICAgICAgICAgICAgICAiSSdsbCB1bmRlcnRha2UgbWF5IHNlZSBhd2F5IHRoZWlyIHNoaWxsaW5nIiArCi0gICAgICAgICAgICAgICAgIlJpY2hseSBpbiB0d28gc2hvcnQgaG91cnMuIE9ubHkgdGhleSIgKwotICAgICAgICAgICAgICAgICJUaGF0IGNvbWUgdG8gaGVhciBhIG1lcnJ5IGJhd2R5IHBsYXksIiArCi0gICAgICAgICAgICAgICAgIkEgbm9pc2Ugb2YgdGFyZ2V0cywgb3IgdG8gc2VlIGEgZmVsbG93IiArCi0gICAgICAgICAgICAgICAgIkluIGEgbG9uZyBtb3RsZXkgY29hdCBndWFyZGVkIHdpdGggeWVsbG93LCIgKwotICAgICAgICAgICAgICAgICJXaWxsIGJlIGRlY2VpdmVkOyBmb3IsIGdlbnRsZSBoZWFyZXJzLCBrbm93LCIgKwotICAgICAgICAgICAgICAgICJUbyByYW5rIG91ciBjaG9zZW4gdHJ1dGggd2l0aCBzdWNoIGEgc2hvdyIgKwotICAgICAgICAgICAgICAgICJBcyBmb29sIGFuZCBmaWdodCBpcywgYmVzaWRlIGZvcmZlaXRpbmciICsKLSAgICAgICAgICAgICAgICAiT3VyIG93biBicmFpbnMsIGFuZCB0aGUgb3BpbmlvbiB0aGF0IHdlIGJyaW5nLCIgKwotICAgICAgICAgICAgICAgICJUbyBtYWtlIHRoYXQgb25seSB0cnVlIHdlIG5vdyBpbnRlbmQsIiArCi0gICAgICAgICAgICAgICAgIldpbGwgbGVhdmUgdXMgbmV2ZXIgYW4gdW5kZXJzdGFuZGluZyBmcmllbmQuIiArCi0gICAgICAgICAgICAgICAgIlRoZXJlZm9yZSwgZm9yIGdvb2RuZXNzJyBzYWtlLCBhbmQgYXMgeW91IGFyZSBrbm93biIgKwotICAgICAgICAgICAgICAgICJUaGUgZmlyc3QgYW5kIGhhcHBpZXN0IGhlYXJlcnMgb2YgdGhlIHRvd24sIiArCi0gICAgICAgICAgICAgICAgIkJlIHNhZCwgYXMgd2Ugd291bGQgbWFrZSB5ZTogdGhpbmsgeWUgc2VlIiArCi0gICAgICAgICAgICAgICAgIlRoZSB2ZXJ5IHBlcnNvbnMgb2Ygb3VyIG5vYmxlIHN0b3J5IiArCi0gICAgICAgICAgICAgICAgIkFzIHRoZXkgd2VyZSBsaXZpbmc7IHRoaW5rIHlvdSBzZWUgdGhlbSBncmVhdCwiICsKLSAgICAgICAgICAgICAgICAiQW5kIGZvbGxvdydkIHdpdGggdGhlIGdlbmVyYWwgdGhyb25nIGFuZCBzd2VhdCIgKwotICAgICAgICAgICAgICAgICJPZiB0aG91c2FuZCBmcmllbmRzOyB0aGVuIGluIGEgbW9tZW50LCBzZWUiICsKLSAgICAgICAgICAgICAgICAiSG93IHNvb24gdGhpcyBtaWdodGluZXNzIG1lZXRzIG1pc2VyeToiICsKLSAgICAgICAgICAgICAgICAiQW5kLCBpZiB5b3UgY2FuIGJlIG1lcnJ5IHRoZW4sIEknbGwgc2F5IiArCi0gICAgICAgICAgICAgICAgIkEgbWFuIG1heSB3ZWVwIHVwb24gaGlzIHdlZGRpbmctZGF5LiIsCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIkZpcnN0LCBoZWF2ZW4gYmUgdGhlIHJlY29yZCB0byBteSBzcGVlY2ghIiArIAotICAgICAgICAgICAgICAgICJJbiB0aGUgZGV2b3Rpb24gb2YgYSBzdWJqZWN0J3MgbG92ZSwiICsgCi0gICAgICAgICAgICAgICAgIlRlbmRlcmluZyB0aGUgcHJlY2lvdXMgc2FmZXR5IG9mIG15IHByaW5jZSwiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBmcmVlIGZyb20gb3RoZXIgbWlzYmVnb3R0ZW4gaGF0ZSwiICsgCi0gICAgICAgICAgICAgICAgIkNvbWUgSSBhcHBlbGxhbnQgdG8gdGhpcyBwcmluY2VseSBwcmVzZW5jZS4iICsgCi0gICAgICAgICAgICAgICAgIk5vdywgVGhvbWFzIE1vd2JyYXksIGRvIEkgdHVybiB0byB0aGVlLCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIG1hcmsgbXkgZ3JlZXRpbmcgd2VsbDsgZm9yIHdoYXQgSSBzcGVhayIgKyAKLSAgICAgICAgICAgICAgICAiTXkgYm9keSBzaGFsbCBtYWtlIGdvb2QgdXBvbiB0aGlzIGVhcnRoLCIgKyAKLSAgICAgICAgICAgICAgICAiT3IgbXkgZGl2aW5lIHNvdWwgYW5zd2VyIGl0IGluIGhlYXZlbi4iICsgCi0gICAgICAgICAgICAgICAgIlRob3UgYXJ0IGEgdHJhaXRvciBhbmQgYSBtaXNjcmVhbnQsIiArIAotICAgICAgICAgICAgICAgICJUb28gZ29vZCB0byBiZSBzbyBhbmQgdG9vIGJhZCB0byBsaXZlLCIgKyAKLSAgICAgICAgICAgICAgICAiU2luY2UgdGhlIG1vcmUgZmFpciBhbmQgY3J5c3RhbCBpcyB0aGUgc2t5LCIgKyAKLSAgICAgICAgICAgICAgICAiVGhlIHVnbGllciBzZWVtIHRoZSBjbG91ZHMgdGhhdCBpbiBpdCBmbHkuIiArIAotICAgICAgICAgICAgICAgICJPbmNlIG1vcmUsIHRoZSBtb3JlIHRvIGFnZ3JhdmF0ZSB0aGUgbm90ZSwiICsgCi0gICAgICAgICAgICAgICAgIldpdGggYSBmb3VsIHRyYWl0b3IncyBuYW1lIHN0dWZmIEkgdGh5IHRocm9hdDsiICsgCi0gICAgICAgICAgICAgICAgIkFuZCB3aXNoLCBzbyBwbGVhc2UgbXkgc292ZXJlaWduLCBlcmUgSSBtb3ZlLCIgKyAKLSAgICAgICAgICAgICAgICAiV2hhdCBteSB0b25ndWUgc3BlYWtzIG15IHJpZ2h0IGRyYXduIHN3b3JkIG1heSBwcm92ZS4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJOb3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCIgKyAKLSAgICAgICAgICAgICAgICAiTWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgWW9yazsiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBhbGwgdGhlIGNsb3VkcyB0aGF0IGxvdXInZCB1cG9uIG91ciBob3VzZSIgKyAKLSAgICAgICAgICAgICAgICAiSW4gdGhlIGRlZXAgYm9zb20gb2YgdGhlIG9jZWFuIGJ1cmllZC4iICsgCi0gICAgICAgICAgICAgICAgIk5vdyBhcmUgb3VyIGJyb3dzIGJvdW5kIHdpdGggdmljdG9yaW91cyB3cmVhdGhzOyIgKyAKLSAgICAgICAgICAgICAgICAiT3VyIGJydWlzZWQgYXJtcyBodW5nIHVwIGZvciBtb251bWVudHM7IiArIAotICAgICAgICAgICAgICAgICJPdXIgc3Rlcm4gYWxhcnVtcyBjaGFuZ2VkIHRvIG1lcnJ5IG1lZXRpbmdzLCIgKyAKLSAgICAgICAgICAgICAgICAiT3VyIGRyZWFkZnVsIG1hcmNoZXMgdG8gZGVsaWdodGZ1bCBtZWFzdXJlcy4iICsgCi0gICAgICAgICAgICAgICAgIkdyaW0tdmlzYWdlZCB3YXIgaGF0aCBzbW9vdGgnZCBoaXMgd3JpbmtsZWQgZnJvbnQ7IiArIAotICAgICAgICAgICAgICAgICJBbmQgbm93LCBpbnN0ZWFkIG9mIG1vdW50aW5nIGJhcmRlZCBzdGVlZHMiICsgCi0gICAgICAgICAgICAgICAgIlRvIGZyaWdodCB0aGUgc291bHMgb2YgZmVhcmZ1bCBhZHZlcnNhcmllcywiICsgCi0gICAgICAgICAgICAgICAgIkhlIGNhcGVycyBuaW1ibHkgaW4gYSBsYWR5J3MgY2hhbWJlciIgKyAKLSAgICAgICAgICAgICAgICAiVG8gdGhlIGxhc2NpdmlvdXMgcGxlYXNpbmcgb2YgYSBsdXRlLiIgKyAKLSAgICAgICAgICAgICAgICAiQnV0IEksIHRoYXQgYW0gbm90IHNoYXBlZCBmb3Igc3BvcnRpdmUgdHJpY2tzLCIgKyAKLSAgICAgICAgICAgICAgICAiTm9yIG1hZGUgdG8gY291cnQgYW4gYW1vcm91cyBsb29raW5nLWdsYXNzOyIgKyAKLSAgICAgICAgICAgICAgICAiSSwgdGhhdCBhbSBydWRlbHkgc3RhbXAnZCwgYW5kIHdhbnQgbG92ZSdzIG1hamVzdHkiICsgCi0gICAgICAgICAgICAgICAgIlRvIHN0cnV0IGJlZm9yZSBhIHdhbnRvbiBhbWJsaW5nIG55bXBoOyIgKyAKLSAgICAgICAgICAgICAgICAiSSwgdGhhdCBhbSBjdXJ0YWlsJ2Qgb2YgdGhpcyBmYWlyIHByb3BvcnRpb24sIiArIAotICAgICAgICAgICAgICAgICJDaGVhdGVkIG9mIGZlYXR1cmUgYnkgZGlzc2VtYmxpbmcgbmF0dXJlLCIgKyAKLSAgICAgICAgICAgICAgICAiRGVmb3JtZWQsIHVuZmluaXNoJ2QsIHNlbnQgYmVmb3JlIG15IHRpbWUiICsgCi0gICAgICAgICAgICAgICAgIkludG8gdGhpcyBicmVhdGhpbmcgd29ybGQsIHNjYXJjZSBoYWxmIG1hZGUgdXAsIiArIAotICAgICAgICAgICAgICAgICJBbmQgdGhhdCBzbyBsYW1lbHkgYW5kIHVuZmFzaGlvbmFibGUiICsgCi0gICAgICAgICAgICAgICAgIlRoYXQgZG9ncyBiYXJrIGF0IG1lIGFzIEkgaGFsdCBieSB0aGVtOyIgKyAKLSAgICAgICAgICAgICAgICAiV2h5LCBJLCBpbiB0aGlzIHdlYWsgcGlwaW5nIHRpbWUgb2YgcGVhY2UsIiArIAotICAgICAgICAgICAgICAgICJIYXZlIG5vIGRlbGlnaHQgdG8gcGFzcyBhd2F5IHRoZSB0aW1lLCIgKyAKLSAgICAgICAgICAgICAgICAiVW5sZXNzIHRvIHNweSBteSBzaGFkb3cgaW4gdGhlIHN1biIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGRlc2NhbnQgb24gbWluZSBvd24gZGVmb3JtaXR5OiIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIHRoZXJlZm9yZSwgc2luY2UgSSBjYW5ub3QgcHJvdmUgYSBsb3ZlciwiICsgCi0gICAgICAgICAgICAgICAgIlRvIGVudGVydGFpbiB0aGVzZSBmYWlyIHdlbGwtc3Bva2VuIGRheXMsIiArIAotICAgICAgICAgICAgICAgICJJIGFtIGRldGVybWluZWQgdG8gcHJvdmUgYSB2aWxsYWluIiArIAotICAgICAgICAgICAgICAgICJBbmQgaGF0ZSB0aGUgaWRsZSBwbGVhc3VyZXMgb2YgdGhlc2UgZGF5cy4iICsgCi0gICAgICAgICAgICAgICAgIlBsb3RzIGhhdmUgSSBsYWlkLCBpbmR1Y3Rpb25zIGRhbmdlcm91cywiICsgCi0gICAgICAgICAgICAgICAgIkJ5IGRydW5rZW4gcHJvcGhlY2llcywgbGliZWxzIGFuZCBkcmVhbXMsIiArIAotICAgICAgICAgICAgICAgICJUbyBzZXQgbXkgYnJvdGhlciBDbGFyZW5jZSBhbmQgdGhlIGtpbmciICsgCi0gICAgICAgICAgICAgICAgIkluIGRlYWRseSBoYXRlIHRoZSBvbmUgYWdhaW5zdCB0aGUgb3RoZXI6IiArIAotICAgICAgICAgICAgICAgICJBbmQgaWYgS2luZyBFZHdhcmQgYmUgYXMgdHJ1ZSBhbmQganVzdCIgKyAKLSAgICAgICAgICAgICAgICAiQXMgSSBhbSBzdWJ0bGUsIGZhbHNlIGFuZCB0cmVhY2hlcm91cywiICsgCi0gICAgICAgICAgICAgICAgIlRoaXMgZGF5IHNob3VsZCBDbGFyZW5jZSBjbG9zZWx5IGJlIG1ldydkIHVwLCIgKyAKLSAgICAgICAgICAgICAgICAiQWJvdXQgYSBwcm9waGVjeSwgd2hpY2ggc2F5cyB0aGF0ICdHJyIgKyAKLSAgICAgICAgICAgICAgICAiT2YgRWR3YXJkJ3MgaGVpcnMgdGhlIG11cmRlcmVyIHNoYWxsIGJlLiIgKyAKLSAgICAgICAgICAgICAgICAiRGl2ZSwgdGhvdWdodHMsIGRvd24gdG8gbXkgc291bDogaGVyZSIgKyAKLSAgICAgICAgICAgICAgICAiQ2xhcmVuY2UgY29tZXMuIiwKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiVG8gYmFpdCBmaXNoIHdpdGhhbDogaWYgaXQgd2lsbCBmZWVkIG5vdGhpbmcgZWxzZSwiICsgCi0gICAgICAgICAgICAgICAgIml0IHdpbGwgZmVlZCBteSByZXZlbmdlLiBIZSBoYXRoIGRpc2dyYWNlZCBtZSwgYW5kIiArIAotICAgICAgICAgICAgICAgICJoaW5kZXJlZCBtZSBoYWxmIGEgbWlsbGlvbjsgbGF1Z2hlZCBhdCBteSBsb3NzZXMsIiArIAotICAgICAgICAgICAgICAgICJtb2NrZWQgYXQgbXkgZ2FpbnMsIHNjb3JuZWQgbXkgbmF0aW9uLCB0aHdhcnRlZCBteSIgKyAKLSAgICAgICAgICAgICAgICAiYmFyZ2FpbnMsIGNvb2xlZCBteSBmcmllbmRzLCBoZWF0ZWQgbWluZSIgKyAKLSAgICAgICAgICAgICAgICAiZW5lbWllczsgYW5kIHdoYXQncyBoaXMgcmVhc29uPyBJIGFtIGEgSmV3LiBIYXRoIiArIAotICAgICAgICAgICAgICAgICJub3QgYSBKZXcgZXllcz8gaGF0aCBub3QgYSBKZXcgaGFuZHMsIG9yZ2FucywiICsgCi0gICAgICAgICAgICAgICAgImRpbWVuc2lvbnMsIHNlbnNlcywgYWZmZWN0aW9ucywgcGFzc2lvbnM/IGZlZCB3aXRoIiArIAotICAgICAgICAgICAgICAgICJ0aGUgc2FtZSBmb29kLCBodXJ0IHdpdGggdGhlIHNhbWUgd2VhcG9ucywgc3ViamVjdCIgKyAKLSAgICAgICAgICAgICAgICAidG8gdGhlIHNhbWUgZGlzZWFzZXMsIGhlYWxlZCBieSB0aGUgc2FtZSBtZWFucywiICsgCi0gICAgICAgICAgICAgICAgIndhcm1lZCBhbmQgY29vbGVkIGJ5IHRoZSBzYW1lIHdpbnRlciBhbmQgc3VtbWVyLCBhcyIgKyAKLSAgICAgICAgICAgICAgICAiYSBDaHJpc3RpYW4gaXM/IElmIHlvdSBwcmljayB1cywgZG8gd2Ugbm90IGJsZWVkPyIgKyAKLSAgICAgICAgICAgICAgICAiaWYgeW91IHRpY2tsZSB1cywgZG8gd2Ugbm90IGxhdWdoPyBpZiB5b3UgcG9pc29uIiArIAotICAgICAgICAgICAgICAgICJ1cywgZG8gd2Ugbm90IGRpZT8gYW5kIGlmIHlvdSB3cm9uZyB1cywgc2hhbGwgd2Ugbm90IiArIAotICAgICAgICAgICAgICAgICJyZXZlbmdlPyBJZiB3ZSBhcmUgbGlrZSB5b3UgaW4gdGhlIHJlc3QsIHdlIHdpbGwiICsgCi0gICAgICAgICAgICAgICAgInJlc2VtYmxlIHlvdSBpbiB0aGF0LiBJZiBhIEpldyB3cm9uZyBhIENocmlzdGlhbiwiICsgCi0gICAgICAgICAgICAgICAgIndoYXQgaXMgaGlzIGh1bWlsaXR5PyBSZXZlbmdlLiBJZiBhIENocmlzdGlhbiIgKyAKLSAgICAgICAgICAgICAgICAid3JvbmcgYSBKZXcsIHdoYXQgc2hvdWxkIGhpcyBzdWZmZXJhbmNlIGJlIGJ5IiArIAotICAgICAgICAgICAgICAgICJDaHJpc3RpYW4gZXhhbXBsZT8gV2h5LCByZXZlbmdlLiBUaGUgdmlsbGFueSB5b3UiICsgCi0gICAgICAgICAgICAgICAgInRlYWNoIG1lLCBJIHdpbGwgZXhlY3V0ZSwgYW5kIGl0IHNoYWxsIGdvIGhhcmQgYnV0IEkiICsgCi0gICAgICAgICAgICAgICAgIndpbGwgYmV0dGVyIHRoZSBpbnN0cnVjdGlvbi4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJWaXJ0dWUhIGEgZmlnISAndGlzIGluIG91cnNlbHZlcyB0aGF0IHdlIGFyZSB0aHVzIiArIAotICAgICAgICAgICAgICAgICJvciB0aHVzLiBPdXIgYm9kaWVzIGFyZSBvdXIgZ2FyZGVucywgdG8gdGhlIHdoaWNoIiArIAotICAgICAgICAgICAgICAgICJvdXIgd2lsbHMgYXJlIGdhcmRlbmVyczogc28gdGhhdCBpZiB3ZSB3aWxsIHBsYW50IiArIAotICAgICAgICAgICAgICAgICJuZXR0bGVzLCBvciBzb3cgbGV0dHVjZSwgc2V0IGh5c3NvcCBhbmQgd2VlZCB1cCIgKyAKLSAgICAgICAgICAgICAgICAidGh5bWUsIHN1cHBseSBpdCB3aXRoIG9uZSBnZW5kZXIgb2YgaGVyYnMsIG9yIiArIAotICAgICAgICAgICAgICAgICJkaXN0cmFjdCBpdCB3aXRoIG1hbnksIGVpdGhlciB0byBoYXZlIGl0IHN0ZXJpbGUiICsgCi0gICAgICAgICAgICAgICAgIndpdGggaWRsZW5lc3MsIG9yIG1hbnVyZWQgd2l0aCBpbmR1c3RyeSwgd2h5LCB0aGUiICsgCi0gICAgICAgICAgICAgICAgInBvd2VyIGFuZCBjb3JyaWdpYmxlIGF1dGhvcml0eSBvZiB0aGlzIGxpZXMgaW4gb3VyIiArIAotICAgICAgICAgICAgICAgICJ3aWxscy4gSWYgdGhlIGJhbGFuY2Ugb2Ygb3VyIGxpdmVzIGhhZCBub3Qgb25lIiArIAotICAgICAgICAgICAgICAgICJzY2FsZSBvZiByZWFzb24gdG8gcG9pc2UgYW5vdGhlciBvZiBzZW5zdWFsaXR5LCB0aGUiICsgCi0gICAgICAgICAgICAgICAgImJsb29kIGFuZCBiYXNlbmVzcyBvZiBvdXIgbmF0dXJlcyB3b3VsZCBjb25kdWN0IHVzIiArIAotICAgICAgICAgICAgICAgICJ0byBtb3N0IHByZXBvc3Rlcm91cyBjb25jbHVzaW9uczogYnV0IHdlIGhhdmUiICsgCi0gICAgICAgICAgICAgICAgInJlYXNvbiB0byBjb29sIG91ciByYWdpbmcgbW90aW9ucywgb3VyIGNhcm5hbCIgKyAKLSAgICAgICAgICAgICAgICAic3RpbmdzLCBvdXIgdW5iaXR0ZWQgbHVzdHMsIHdoZXJlb2YgSSB0YWtlIHRoaXMgdGhhdCIgKyAKLSAgICAgICAgICAgICAgICAieW91IGNhbGwgbG92ZSB0byBiZSBhIHNlY3Qgb3Igc2Npb24uIiwKLQotICAgICAgICAgICAgICAgICJCbG93LCB3aW5kcywgYW5kIGNyYWNrIHlvdXIgY2hlZWtzISByYWdlISBibG93ISIgKyAKLSAgICAgICAgICAgICAgICAiWW91IGNhdGFyYWN0cyBhbmQgaHVycmljYW5vZXMsIHNwb3V0IiArIAotICAgICAgICAgICAgICAgICJUaWxsIHlvdSBoYXZlIGRyZW5jaCdkIG91ciBzdGVlcGxlcywgZHJvd24nZCB0aGUgY29ja3MhIiArIAotICAgICAgICAgICAgICAgICJZb3Ugc3VscGh1cm91cyBhbmQgdGhvdWdodC1leGVjdXRpbmcgZmlyZXMsIiArIAotICAgICAgICAgICAgICAgICJWYXVudC1jb3VyaWVycyB0byBvYWstY2xlYXZpbmcgdGh1bmRlcmJvbHRzLCIgKyAKLSAgICAgICAgICAgICAgICAiU2luZ2UgbXkgd2hpdGUgaGVhZCEgQW5kIHRob3UsIGFsbC1zaGFraW5nIHRodW5kZXIsIiArIAotICAgICAgICAgICAgICAgICJTbWl0ZSBmbGF0IHRoZSB0aGljayByb3R1bmRpdHkgbycgdGhlIHdvcmxkISIgKyAKLSAgICAgICAgICAgICAgICAiQ3JhY2sgbmF0dXJlJ3MgbW91bGRzLCBhbiBnZXJtZW5zIHNwaWxsIGF0IG9uY2UsIiArIAotICAgICAgICAgICAgICAgICJUaGF0IG1ha2UgaW5ncmF0ZWZ1bCBtYW4hIgotICAgICAgICB9OwogICAgIH0KICAgICAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q5LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0OS5qYXZhCmluZGV4IGIyYWVhMDUuLmI1MGJkNTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q5LmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDkuamF2YQpAQCAtMTQwLDE3OCArMTQwLDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nW10gbVN0cmluZ3MgPSB7Ci0gICAgICAgICAgICAiQWJiYXllIGRlIEJlbGxvYyIsICJBYmJheWUgZHUgTW9udCBkZXMgQ2F0cyIsICJBYmVydGFtIiwKLSAgICAgICAgICAgICJBYm9uZGFuY2UiLCAiQWNrYXdpIiwgIkFjb3JuIiwgIkFkZWxvc3QiLCAiQWZmaWRlbGljZSBhdSBDaGFibGlzIiwKLSAgICAgICAgICAgICJBZnVlZ2EnbCBQaXR1IiwgIkFpcmFnIiwgIkFpcmVkYWxlIiwgIkFpc3kgQ2VuZHJlIiwKLSAgICAgICAgICAgICJBbGxnYXVlciBFbW1lbnRhbGVyIiwgIkFsdmVyY2EiLCAiQW1iZXJ0IiwgIkFtZXJpY2FuIENoZWVzZSIsCi0gICAgICAgICAgICAiQW1pIGR1IENoYW1iZXJ0aW4iLCAiQW5lam8gRW5jaGlsYWRvIiwgIkFubmVhdSBkdSBWaWMtQmlsaCIsCi0gICAgICAgICAgICAiQW50aG9yaXJvIiwgIkFwcGVuemVsbCIsICJBcmFnb24iLCAiQXJkaSBHYXNuYSIsICJBcmRyYWhhbiIsCi0gICAgICAgICAgICAiQXJtZW5pYW4gU3RyaW5nIiwgIkFyb21lcyBhdSBHZW5lIGRlIE1hcmMiLCAiQXNhZGVybyIsICJBc2lhZ28iLAotICAgICAgICAgICAgIkF1YmlzcXVlIFB5cmVuZWVzIiwgIkF1dHVuIiwgIkF2YXh0c2t5ciIsICJCYWJ5IFN3aXNzIiwgIkJhYnliZWwiLAotICAgICAgICAgICAgIkJhZ3VldHRlIExhb25uYWlzZSIsICJCYWtlcnMiLCAiQmFsYWRpIiwgIkJhbGF0b24iLCAiQmFuZGFsIiwKLSAgICAgICAgICAgICJCYW5vbiIsICJCYXJyeSdzIEJheSBDaGVkZGFyIiwgIkJhc2luZyIsICJCYXNrZXQgQ2hlZXNlIiwKLSAgICAgICAgICAgICJCYXRoIENoZWVzZSIsICJCYXZhcmlhbiBCZXJna2FzZSIsICJCYXlsb3VnaCIsICJCZWF1Zm9ydCIsCi0gICAgICAgICAgICAiQmVhdXZvb3JkZSIsICJCZWVubGVpZ2ggQmx1ZSIsICJCZWVyIENoZWVzZSIsICJCZWwgUGFlc2UiLAotICAgICAgICAgICAgIkJlcmdhZGVyIiwgIkJlcmdlcmUgQmxldWUiLCAiQmVya3N3ZWxsIiwgIkJleWF6IFBleW5pciIsCi0gICAgICAgICAgICAiQmllcmthc2UiLCAiQmlzaG9wIEtlbm5lZHkiLCAiQmxhcm5leSIsICJCbGV1IGQnQXV2ZXJnbmUiLAotICAgICAgICAgICAgIkJsZXUgZGUgR2V4IiwgIkJsZXUgZGUgTGFxdWV1aWxsZSIsICJCbGV1IGRlIFNlcHRtb25jZWwiLAotICAgICAgICAgICAgIkJsZXUgRGVzIENhdXNzZXMiLCAiQmx1ZSIsICJCbHVlIENhc3RlbGxvIiwgIkJsdWUgUmF0aGdvcmUiLAotICAgICAgICAgICAgIkJsdWUgVmVpbiAoQXVzdHJhbGlhbikiLCAiQmx1ZSBWZWluIENoZWVzZXMiLCAiQm9jY29uY2luaSIsCi0gICAgICAgICAgICAiQm9jY29uY2luaSAoQXVzdHJhbGlhbikiLCAiQm9lcmVuIExlaWRlbmthYXMiLCAiQm9uY2hlc3RlciIsCi0gICAgICAgICAgICAiQm9zd29ydGgiLCAiQm91Z29uIiwgIkJvdWxlIER1IFJvdmVzIiwgIkJvdWxldHRlIGQnQXZlc25lcyIsCi0gICAgICAgICAgICAiQm91cnNhdWx0IiwgIkJvdXJzaW4iLCAiQm91eXNzb3UiLCAiQnJhIiwgIkJyYXVkb3N0dXIiLAotICAgICAgICAgICAgIkJyZWFrZmFzdCBDaGVlc2UiLCAiQnJlYmlzIGR1IExhdm9ydCIsICJCcmViaXMgZHUgTG9jaG9pcyIsCi0gICAgICAgICAgICAiQnJlYmlzIGR1IFB1eWZhdWNvbiIsICJCcmVzc2UgQmxldSIsICJCcmljayIsICJCcmllIiwKLSAgICAgICAgICAgICJCcmllIGRlIE1lYXV4IiwgIkJyaWUgZGUgTWVsdW4iLCAiQnJpbGxhdC1TYXZhcmluIiwgIkJyaW4iLAotICAgICAgICAgICAgIkJyaW4gZCcgQW1vdXIiLCAiQnJpbiBkJ0Ftb3VyIiwgIkJyaW56YSAoQnVyZHVmIEJyaW56YSkiLAotICAgICAgICAgICAgIkJyaXF1ZXR0ZSBkZSBCcmViaXMiLCAiQnJpcXVldHRlIGR1IEZvcmV6IiwgIkJyb2NjaW8iLAotICAgICAgICAgICAgIkJyb2NjaW8gRGVtaS1BZmZpbmUiLCAiQnJvdXNzZSBkdSBSb3ZlIiwgIkJydWRlciBCYXNpbCIsCi0gICAgICAgICAgICAiQnJ1c3NlbGFlIEthYXMgKEZyb21hZ2UgZGUgQnJ1eGVsbGVzKSIsICJCcnluZHphIiwKLSAgICAgICAgICAgICJCdWNoZXR0ZSBkJ0Fuam91IiwgIkJ1ZmZhbG8iLCAiQnVyZ29zIiwgIkJ1dHRlIiwgIkJ1dHRlcmthc2UiLAotICAgICAgICAgICAgIkJ1dHRvbiAoSW5uZXMpIiwgIkJ1eHRvbiBCbHVlIiwgIkNhYmVjb3UiLCAiQ2Fib2MiLCAiQ2FicmFsZXMiLAotICAgICAgICAgICAgIkNhY2hhaWxsZSIsICJDYWNpb2NhdmFsbG8iLCAiQ2FjaW90dGEiLCAiQ2FlcnBoaWxseSIsCi0gICAgICAgICAgICAiQ2Fpcm5zbW9yZSIsICJDYWxlbnphbmEiLCAiQ2FtYmF6b2xhIiwgIkNhbWVtYmVydCBkZSBOb3JtYW5kaWUiLAotICAgICAgICAgICAgIkNhbmFkaWFuIENoZWRkYXIiLCAiQ2FuZXN0cmF0byIsICJDYW50YWwiLCAiQ2FwcmljZSBkZXMgRGlldXgiLAotICAgICAgICAgICAgIkNhcHJpY29ybiBHb2F0IiwgIkNhcHJpb2xlIEJhbm9uIiwgIkNhcnJlIGRlIGwnRXN0IiwKLSAgICAgICAgICAgICJDYXNjaW90dGEgZGkgVXJiaW5vIiwgIkNhc2hlbCBCbHVlIiwgIkNhc3RlbGxhbm8iLCAiQ2FzdGVsbGVubyIsCi0gICAgICAgICAgICAiQ2FzdGVsbWFnbm8iLCAiQ2FzdGVsbyBCcmFuY28iLCAiQ2FzdGlnbGlhbm8iLCAiQ2F0aGVsYWluIiwKLSAgICAgICAgICAgICJDZWx0aWMgUHJvbWlzZSIsICJDZW5kcmUgZCdPbGl2ZXQiLCAiQ2VybmV5IiwgIkNoYWJpY2hvdSIsCi0gICAgICAgICAgICAiQ2hhYmljaG91IGR1IFBvaXRvdSIsICJDaGFiaXMgZGUgR2F0aW5lIiwgIkNoYW91cmNlIiwgIkNoYXJvbGFpcyIsCi0gICAgICAgICAgICAiQ2hhdW1lcyIsICJDaGVkZGFyIiwgIkNoZWRkYXIgQ2xvdGhib3VuZCIsICJDaGVzaGlyZSIsICJDaGV2cmVzIiwKLSAgICAgICAgICAgICJDaGV2cm90aW4gZGVzIEFyYXZpcyIsICJDaG9udGFsZW5vIiwgIkNpdnJheSIsCi0gICAgICAgICAgICAiQ29ldXIgZGUgQ2FtZW1iZXJ0IGF1IENhbHZhZG9zIiwgIkNvZXVyIGRlIENoZXZyZSIsICJDb2xieSIsCi0gICAgICAgICAgICAiQ29sZCBQYWNrIiwgIkNvbXRlIiwgIkNvb2xlYSIsICJDb29sZW5leSIsICJDb3F1ZXRkYWxlIiwKLSAgICAgICAgICAgICJDb3JsZWdneSIsICJDb3JuaXNoIFBlcHBlciIsICJDb3RoZXJzdG9uZSIsICJDb3RpamEiLAotICAgICAgICAgICAgIkNvdHRhZ2UgQ2hlZXNlIiwgIkNvdHRhZ2UgQ2hlZXNlIChBdXN0cmFsaWFuKSIsICJDb3VnYXIgR29sZCIsCi0gICAgICAgICAgICAiQ291bG9tbWllcnMiLCAiQ292ZXJkYWxlIiwgIkNyYXlldXggZGUgUm9uY3EiLCAiQ3JlYW0gQ2hlZXNlIiwKLSAgICAgICAgICAgICJDcmVhbSBIYXZhcnRpIiwgIkNyZW1hIEFncmlhIiwgIkNyZW1hIE1leGljYW5hIiwgIkNyZW1lIEZyYWljaGUiLAotICAgICAgICAgICAgIkNyZXNjZW56YSIsICJDcm9naGFuIiwgIkNyb3R0aW4gZGUgQ2hhdmlnbm9sIiwKLSAgICAgICAgICAgICJDcm90dGluIGR1IENoYXZpZ25vbCIsICJDcm93ZGllIiwgIkNyb3dsZXkiLCAiQ3VhamFkYSIsICJDdXJkIiwKLSAgICAgICAgICAgICJDdXJlIE5hbnRhaXMiLCAiQ3Vyd29ydGh5IiwgIkN3bXRhd2UgUGVjb3Jpbm8iLAotICAgICAgICAgICAgIkN5cHJlc3MgR3JvdmUgQ2hldnJlIiwgIkRhbmFibHUgKERhbmlzaCBCbHVlKSIsICJEYW5ibyIsCi0gICAgICAgICAgICAiRGFuaXNoIEZvbnRpbmEiLCAiRGFyYWxhZ2phenNreSIsICJEYXVwaGluIiwgIkRlbGljZSBkZXMgRmlvdXZlcyIsCi0gICAgICAgICAgICAiRGVuaGFueSBEb3JzZXQgRHJ1bSIsICJEZXJieSIsICJEZXNzZXJ0bnlqIEJlbHlqIiwgIkRldm9uIEJsdWUiLAotICAgICAgICAgICAgIkRldm9uIEdhcmxhbmQiLCAiRG9sY2VsYXR0ZSIsICJEb29saW4iLCAiRG9wcGVscmhhbXN0dWZlbCIsCi0gICAgICAgICAgICAiRG9yc2V0IEJsdWUgVmlubmV5IiwgIkRvdWJsZSBHbG91Y2VzdGVyIiwgIkRvdWJsZSBXb3JjZXN0ZXIiLAotICAgICAgICAgICAgIkRyZXV4IGEgbGEgRmV1aWxsZSIsICJEcnkgSmFjayIsICJEdWRkbGVzd2VsbCIsICJEdW5iYXJyYSIsCi0gICAgICAgICAgICAiRHVubG9wIiwgIkR1bnN5cmUgQmx1ZSIsICJEdXJvYmxhbmRvIiwgIkR1cnJ1cyIsCi0gICAgICAgICAgICAiRHV0Y2ggTWltb2xldHRlIChDb21taXNzaWVrYWFzKSIsICJFZGFtIiwgIkVkZWxwaWx6IiwKLSAgICAgICAgICAgICJFbWVudGFsIEdyYW5kIENydSIsICJFbWxldHQiLCAiRW1tZW50YWwiLCAiRXBvaXNzZXMgZGUgQm91cmdvZ25lIiwKLSAgICAgICAgICAgICJFc2JhcmVpY2giLCAiRXNyb20iLCAiRXRvcmtpIiwgIkV2YW5zZGFsZSBGYXJtaG91c2UgQnJpZSIsCi0gICAgICAgICAgICAiRXZvcmEgRGUgTCdBbGVudGVqbyIsICJFeG1vb3IgQmx1ZSIsICJFeHBsb3JhdGV1ciIsICJGZXRhIiwKLSAgICAgICAgICAgICJGZXRhIChBdXN0cmFsaWFuKSIsICJGaWd1ZSIsICJGaWxldHRhIiwgIkZpbi1kZS1TaWVjbGUiLAotICAgICAgICAgICAgIkZpbmxhbmRpYSBTd2lzcyIsICJGaW5uIiwgIkZpb3JlIFNhcmRvIiwgIkZsZXVyIGR1IE1hcXVpcyIsCi0gICAgICAgICAgICAiRmxvciBkZSBHdWlhIiwgIkZsb3dlciBNYXJpZSIsICJGb2xkZWQiLAotICAgICAgICAgICAgIkZvbGRlZCBjaGVlc2Ugd2l0aCBtaW50IiwgIkZvbmRhbnQgZGUgQnJlYmlzIiwgIkZvbnRhaW5lYmxlYXUiLAotICAgICAgICAgICAgIkZvbnRhbCIsICJGb250aW5hIFZhbCBkJ0Fvc3RhIiwgIkZvcm1hZ2dpbyBkaSBjYXByYSIsICJGb3VnZXJ1cyIsCi0gICAgICAgICAgICAiRm91ciBIZXJiIEdvdWRhIiwgIkZvdXJtZSBkJyBBbWJlcnQiLCAiRm91cm1lIGRlIEhhdXRlIExvaXJlIiwKLSAgICAgICAgICAgICJGb3VybWUgZGUgTW9udGJyaXNvbiIsICJGcmVzaCBKYWNrIiwgIkZyZXNoIE1venphcmVsbGEiLAotICAgICAgICAgICAgIkZyZXNoIFJpY290dGEiLCAiRnJlc2ggVHJ1ZmZsZXMiLCAiRnJpYm91cmdlb2lzIiwgIkZyaWVzZWthYXMiLAotICAgICAgICAgICAgIkZyaWVzaWFuIiwgIkZyaWVzbGEiLCAiRnJpbmF1bHQiLCAiRnJvbWFnZSBhIFJhY2xldHRlIiwKLSAgICAgICAgICAgICJGcm9tYWdlIENvcnNlIiwgIkZyb21hZ2UgZGUgTW9udGFnbmUgZGUgU2F2b2llIiwgIkZyb21hZ2UgRnJhaXMiLAotICAgICAgICAgICAgIkZydWl0IENyZWFtIENoZWVzZSIsICJGcnlpbmcgQ2hlZXNlIiwgIkZ5bmJvIiwgIkdhYnJpZWwiLAotICAgICAgICAgICAgIkdhbGV0dGUgZHUgUGFsdWRpZXIiLCAiR2FsZXR0ZSBMeW9ubmFpc2UiLAotICAgICAgICAgICAgIkdhbGxvd2F5IEdvYXQncyBNaWxrIEdlbXMiLCAiR2FtbWVsb3N0IiwgIkdhcGVyb24gYSBsJ0FpbCIsCi0gICAgICAgICAgICAiR2Fycm90eGEiLCAiR2FzdGFuYmVycmEiLCAiR2VpdG9zdCIsICJHaXBwc2xhbmQgQmx1ZSIsICJHamV0b3N0IiwKLSAgICAgICAgICAgICJHbG91Y2VzdGVyIiwgIkdvbGRlbiBDcm9zcyIsICJHb3Jnb256b2xhIiwgIkdvcm55YWx0YWpza2kiLAotICAgICAgICAgICAgIkdvc3BlbCBHcmVlbiIsICJHb3VkYSIsICJHb3V0dSIsICJHb3dyaWUiLCAiR3JhYmV0dG8iLCAiR3JhZGRvc3QiLAotICAgICAgICAgICAgIkdyYWZ0b24gVmlsbGFnZSBDaGVkZGFyIiwgIkdyYW5hIiwgIkdyYW5hIFBhZGFubyIsICJHcmFuZCBWYXRlbCIsCi0gICAgICAgICAgICAiR3JhdGFyb24gZCcgQXJlY2hlcyIsICJHcmF0dGUtUGFpbGxlIiwgIkdyYXZpZXJhIiwgIkdyZXVpbGgiLAotICAgICAgICAgICAgIkdyZXZlIiwgIkdyaXMgZGUgTGlsbGUiLCAiR3J1eWVyZSIsICJHdWJiZWVuIiwgIkd1ZXJiaWdueSIsCi0gICAgICAgICAgICAiSGFsbG91bWkiLCAiSGFsbG91bXkgKEF1c3RyYWxpYW4pIiwgIkhhbG91bWktU3R5bGUgQ2hlZXNlIiwKLSAgICAgICAgICAgICJIYXJib3VybmUgQmx1ZSIsICJIYXZhcnRpIiwgIkhlaWRpIEdydXllcmUiLCAiSGVyZWZvcmQgSG9wIiwKLSAgICAgICAgICAgICJIZXJyZ2FyZHNvc3QiLCAiSGVycmlvdCBGYXJtaG91c2UiLCAiSGVydmUiLCAiSGlwaSBJdGkiLAotICAgICAgICAgICAgIkh1YmJhcmRzdG9uIEJsdWUgQ293IiwgIkh1c2hhbGxzb3N0IiwgIkliZXJpY28iLCAiSWRhaG8gR29hdHN0ZXIiLAotICAgICAgICAgICAgIklkaWF6YWJhbCIsICJJbCBCb3NjaGV0dG8gYWwgVGFydHVmbyIsICJJbGUgZCdZZXUiLAotICAgICAgICAgICAgIklzbGUgb2YgTXVsbCIsICJKYXJsc2JlcmciLCAiSmVybWkgVG9ydGVzIiwgIkppYm5laCBBcmFiaWVoIiwKLSAgICAgICAgICAgICJKaW5kaSBCcmllIiwgIkp1YmlsZWUgQmx1ZSIsICJKdXVzdG9sZWlwYSIsICJLYWRjaGdhbGwiLCAiS2FzZXJpIiwKLSAgICAgICAgICAgICJLYXNodGEiLCAiS2VmYWxvdHlyaSIsICJLZW5hZmEiLCAiS2VybmhlbSIsICJLZXJ2ZWxsYSBBZmZpbmUiLAotICAgICAgICAgICAgIktpa29yYW5naSIsICJLaW5nIElzbGFuZCBDYXBlIFdpY2toYW0gQnJpZSIsICJLaW5nIFJpdmVyIEdvbGQiLAotICAgICAgICAgICAgIktsb3N0ZXJrYWVzZSIsICJLbm9ja2FsYXJhIiwgIkt1Z2Vsa2FzZSIsICJMJ0F2ZXlyb25uYWlzIiwKLSAgICAgICAgICAgICJMJ0VjaXIgZGUgbCdBdWJyYWMiLCAiTGEgVGF1cGluaWVyZSIsICJMYSBWYWNoZSBRdWkgUml0IiwKLSAgICAgICAgICAgICJMYWd1aW9sZSIsICJMYWlyb2JlbGwiLCAiTGFqdGEiLCAiTGFuYXJrIEJsdWUiLCAiTGFuY2FzaGlyZSIsCi0gICAgICAgICAgICAiTGFuZ3JlcyIsICJMYXBwaSIsICJMYXJ1bnMiLCAiTGF2aXN0b3duIiwgIkxlIEJyaW4iLAotICAgICAgICAgICAgIkxlIEZpdW0gT3JibyIsICJMZSBMYWNhbmRvdSIsICJMZSBSb3VsZSIsICJMZWFmaWVsZCIsICJMZWJiZW5lIiwKLSAgICAgICAgICAgICJMZWVyZGFtbWVyIiwgIkxlaWNlc3RlciIsICJMZXlkZW4iLCAiTGltYnVyZ2VyIiwKLSAgICAgICAgICAgICJMaW5jb2xuc2hpcmUgUG9hY2hlciIsICJMaW5nb3QgU2FpbnQgQm91c3F1ZXQgZCdPcmIiLCAiTGlwdGF1ZXIiLAotICAgICAgICAgICAgIkxpdHRsZSBSeWRpbmdzIiwgIkxpdmFyb3QiLCAiTGxhbmJvaWR5IiwgIkxsYW5nbG9mYW4gRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJMb2NoIEFydGh1ciBGYXJtaG91c2UiLCAiTG9kZGlzd2VsbCBBdm9uZGFsZSIsICJMb25naG9ybiIsCi0gICAgICAgICAgICAiTG91IFBhbG91IiwgIkxvdSBQZXZyZSIsICJMeW9ubmFpcyIsICJNYWFzZGFtIiwgIk1hY2NvbmFpcyIsCi0gICAgICAgICAgICAiTWFob2UgQWdlZCBHb3VkYSIsICJNYWhvbiIsICJNYWx2ZXJuIiwgIk1hbWlyb2xsZSIsICJNYW5jaGVnbyIsCi0gICAgICAgICAgICAiTWFub3VyaSIsICJNYW51ciIsICJNYXJibGUgQ2hlZGRhciIsICJNYXJibGVkIENoZWVzZXMiLAotICAgICAgICAgICAgIk1hcmVkc291cyIsICJNYXJnb3RpbiIsICJNYXJpYm8iLCAiTWFyb2lsbGVzIiwgIk1hc2NhcmVzIiwKLSAgICAgICAgICAgICJNYXNjYXJwb25lIiwgIk1hc2NhcnBvbmUgKEF1c3RyYWxpYW4pIiwgIk1hc2NhcnBvbmUgVG9ydGEiLAotICAgICAgICAgICAgIk1hdG9jcSIsICJNYXl0YWcgQmx1ZSIsICJNZWlyYSIsICJNZW5hbGxhY2sgRmFybWhvdXNlIiwKLSAgICAgICAgICAgICJNZW5vbml0YSIsICJNZXJlZGl0aCBCbHVlIiwgIk1lc29zdCIsICJNZXR0b24gKENhbmNvaWxsb3R0ZSkiLAotICAgICAgICAgICAgIk1leWVyIFZpbnRhZ2UgR291ZGEiLCAiTWloYWxpYyBQZXluaXIiLCAiTWlsbGVlbnMiLCAiTWltb2xldHRlIiwKLSAgICAgICAgICAgICJNaW5lLUdhYmhhciIsICJNaW5pIEJhYnkgQmVsbHMiLCAiTWl4dGUiLCAiTW9sYm8iLAotICAgICAgICAgICAgIk1vbmFzdGVyeSBDaGVlc2VzIiwgIk1vbmRzZWVyIiwgIk1vbnQgRCdvciBMeW9ubmFpcyIsICJNb250YXNpbyIsCi0gICAgICAgICAgICAiTW9udGVyZXkgSmFjayIsICJNb250ZXJleSBKYWNrIERyeSIsICJNb3JiaWVyIiwKLSAgICAgICAgICAgICJNb3JiaWVyIENydSBkZSBNb250YWduZSIsICJNb3RoYWlzIGEgbGEgRmV1aWxsZSIsICJNb3p6YXJlbGxhIiwKLSAgICAgICAgICAgICJNb3p6YXJlbGxhIChBdXN0cmFsaWFuKSIsICJNb3p6YXJlbGxhIGRpIEJ1ZmFsYSIsCi0gICAgICAgICAgICAiTW96emFyZWxsYSBGcmVzaCwgaW4gd2F0ZXIiLCAiTW96emFyZWxsYSBSb2xscyIsICJNdW5zdGVyIiwKLSAgICAgICAgICAgICJNdXJvbCIsICJNeWNlbGxhIiwgIk15eml0aHJhIiwgIk5hYm91bHNpIiwgIk5hbnRhaXMiLAotICAgICAgICAgICAgIk5ldWZjaGF0ZWwiLCAiTmV1ZmNoYXRlbCAoQXVzdHJhbGlhbikiLCAiTmlvbG8iLCAiTm9ra2Vsb3N0IiwKLSAgICAgICAgICAgICJOb3J0aHVtYmVybGFuZCIsICJPYXhhY2EiLCAiT2xkZSBZb3JrIiwgIk9saXZldCBhdSBGb2luIiwKLSAgICAgICAgICAgICJPbGl2ZXQgQmxldSIsICJPbGl2ZXQgQ2VuZHJlIiwgIk9ya25leSBFeHRyYSBNYXR1cmUgQ2hlZGRhciIsCi0gICAgICAgICAgICAiT3JsYSIsICJPc2NodGplcGthIiwgIk9zc2F1IEZlcm1pZXIiLCAiT3NzYXUtSXJhdHkiLCAiT3N6Y3p5cGVrIiwKLSAgICAgICAgICAgICJPeGZvcmQgQmx1ZSIsICJQJ3RpdCBCZXJyaWNob24iLCAiUGFsZXQgZGUgQmFibGlnbnkiLCAiUGFuZWVyIiwKLSAgICAgICAgICAgICJQYW5lbGEiLCAiUGFubmVyb25lIiwgIlBhbnQgeXMgR2F3biIsICJQYXJtZXNhbiAoUGFybWlnaWFubykiLAotICAgICAgICAgICAgIlBhcm1pZ2lhbm8gUmVnZ2lhbm8iLCAiUGFzIGRlIGwnRXNjYWxldHRlIiwgIlBhc3NlbmRhbGUiLAotICAgICAgICAgICAgIlBhc3RldXJpemVkIFByb2Nlc3NlZCIsICJQYXRlIGRlIEZyb21hZ2UiLCAiUGF0ZWZpbmUgRm9ydCIsCi0gICAgICAgICAgICAiUGF2ZSBkJ0FmZmlub2lzIiwgIlBhdmUgZCdBdWdlIiwgIlBhdmUgZGUgQ2hpcmFjIiwKLSAgICAgICAgICAgICJQYXZlIGR1IEJlcnJ5IiwgIlBlY29yaW5vIiwgIlBlY29yaW5vIGluIFdhbG51dCBMZWF2ZXMiLAotICAgICAgICAgICAgIlBlY29yaW5vIFJvbWFubyIsICJQZWVrc2tpbGwgUHlyYW1pZCIsICJQZWxhcmRvbiBkZXMgQ2V2ZW5uZXMiLAotICAgICAgICAgICAgIlBlbGFyZG9uIGRlcyBDb3JiaWVyZXMiLCAiUGVuYW1lbGxlcmEiLCAiUGVuYnJ5biIsICJQZW5jYXJyZWciLAotICAgICAgICAgICAgIlBlcmFpbCBkZSBCcmViaXMiLCAiUGV0aXQgTW9yaW4iLCAiUGV0aXQgUGFyZG91IiwgIlBldGl0LVN1aXNzZSIsCi0gICAgICAgICAgICAiUGljb2RvbiBkZSBDaGV2cmUiLCAiUGljb3MgZGUgRXVyb3BhIiwgIlBpb3JhIiwKLSAgICAgICAgICAgICJQaXRodHZpZXJzIGF1IEZvaW4iLCAiUGxhdGVhdSBkZSBIZXJ2ZSIsICJQbHltb3V0aCBDaGVlc2UiLAotICAgICAgICAgICAgIlBvZGhhbGFuc2tpIiwgIlBvaXZyZSBkJ0FuZSIsICJQb2xrb2xiaW4iLCAiUG9udCBsJ0V2ZXF1ZSIsCi0gICAgICAgICAgICAiUG9ydCBOaWNob2xzb24iLCAiUG9ydC1TYWx1dCIsICJQb3N0ZWwiLCAiUG91bGlnbnktU2FpbnQtUGllcnJlIiwKLSAgICAgICAgICAgICJQb3VybHkiLCAiUHJhc3Rvc3QiLCAiUHJlc3NhdG8iLCAiUHJpbmNlLUplYW4iLAotICAgICAgICAgICAgIlByb2Nlc3NlZCBDaGVkZGFyIiwgIlByb3ZvbG9uZSIsICJQcm92b2xvbmUgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJQeWVuZ2FuYSBDaGVkZGFyIiwgIlB5cmFtaWRlIiwgIlF1YXJrIiwgIlF1YXJrIChBdXN0cmFsaWFuKSIsCi0gICAgICAgICAgICAiUXVhcnRpcm9sbyBMb21iYXJkbyIsICJRdWF0cmUtVmVudHMiLCAiUXVlcmN5IFBldGl0IiwKLSAgICAgICAgICAgICJRdWVzbyBCbGFuY28iLCAiUXVlc28gQmxhbmNvIGNvbiBGcnV0YXMgLS1QaW5hIHkgTWFuZ28iLAotICAgICAgICAgICAgIlF1ZXNvIGRlIE11cmNpYSIsICJRdWVzbyBkZWwgTW9udHNlYyIsICJRdWVzbyBkZWwgVGlldGFyIiwKLSAgICAgICAgICAgICJRdWVzbyBGcmVzY28iLCAiUXVlc28gRnJlc2NvIChBZG9iZXJhKSIsICJRdWVzbyBJYmVyaWNvIiwKLSAgICAgICAgICAgICJRdWVzbyBKYWxhcGVubyIsICJRdWVzbyBNYWpvcmVybyIsICJRdWVzbyBNZWRpYSBMdW5hIiwKLSAgICAgICAgICAgICJRdWVzbyBQYXJhIEZyaWVyIiwgIlF1ZXNvIFF1ZXNhZGlsbGEiLCAiUmFiYWNhbCIsICJSYWNsZXR0ZSIsCi0gICAgICAgICAgICAiUmFndXNhbm8iLCAiUmFzY2hlcmEiLCAiUmVibG9jaG9uIiwgIlJlZCBMZWljZXN0ZXIiLAotICAgICAgICAgICAgIlJlZ2FsIGRlIGxhIERvbWJlcyIsICJSZWdnaWFuaXRvIiwgIlJlbWVkb3UiLCAiUmVxdWVzb24iLAotICAgICAgICAgICAgIlJpY2hlbGlldSIsICJSaWNvdHRhIiwgIlJpY290dGEgKEF1c3RyYWxpYW4pIiwgIlJpY290dGEgU2FsYXRhIiwKLSAgICAgICAgICAgICJSaWRkZXIiLCAiUmlnb3R0ZSIsICJSb2NhbWFkb3VyIiwgIlJvbGxvdCIsICJSb21hbm8iLAotICAgICAgICAgICAgIlJvbWFucyBQYXJ0IERpZXUiLCAiUm9uY2FsIiwgIlJvcXVlZm9ydCIsICJSb3VsZSIsCi0gICAgICAgICAgICAiUm91bGVhdSBEZSBCZWF1bGlldSIsICJSb3lhbHAgVGlsc2l0IiwgIlJ1YmVucyIsICJSdXN0aW51IiwKLSAgICAgICAgICAgICJTYWFsYW5kIFBmYXJyIiwgIlNhYW5lbmthZXNlIiwgIlNhZ2EiLCAiU2FnZSBEZXJieSIsCi0gICAgICAgICAgICAiU2FpbnRlIE1hdXJlIiwgIlNhaW50LU1hcmNlbGxpbiIsICJTYWludC1OZWN0YWlyZSIsCi0gICAgICAgICAgICAiU2FpbnQtUGF1bGluIiwgIlNhbGVycyIsICJTYW1zbyIsICJTYW4gU2ltb24iLCAiU2FuY2VycmUiLAotICAgICAgICAgICAgIlNhcCBTYWdvIiwgIlNhcmRvIiwgIlNhcmRvIEVneXB0aWFuIiwgIlNicmlueiIsICJTY2Ftb3J6YSIsCi0gICAgICAgICAgICAiU2NoYWJ6aWVnZXIiLCAiU2NobG9zcyIsICJTZWxsZXMgc3VyIENoZXIiLCAiU2VsdmEiLCAiU2VyYXQiLAotICAgICAgICAgICAgIlNlcmlvdXNseSBTdHJvbmcgQ2hlZGRhciIsICJTZXJyYSBkYSBFc3RyZWxhIiwgIlNoYXJwYW0iLAotICAgICAgICAgICAgIlNoZWxidXJuZSBDaGVkZGFyIiwgIlNocm9wc2hpcmUgQmx1ZSIsICJTaXJheiIsICJTaXJlbmUiLAotICAgICAgICAgICAgIlNtb2tlZCBHb3VkYSIsICJTb21lcnNldCBCcmllIiwgIlNvbm9tYSBKYWNrIiwKLSAgICAgICAgICAgICJTb3R0b2NlbmFyZSBhbCBUYXJ0dWZvIiwgIlNvdW1haW50cmFpbiIsICJTb3VyaXJlIExvemVyaWVuIiwKLSAgICAgICAgICAgICJTcGVud29vZCIsICJTcmFmZm9yZHNoaXJlIE9yZ2FuaWMiLCAiU3QuIEFndXIgQmx1ZSBDaGVlc2UiLAotICAgICAgICAgICAgIlN0aWx0b24iLCAiU3RpbmtpbmcgQmlzaG9wIiwgIlN0cmluZyIsICJTdXNzZXggU2xpcGNvdGUiLAotICAgICAgICAgICAgIlN2ZWNpYW9zdCIsICJTd2FsZWRhbGUiLCAiU3dlZXQgU3R5bGUgU3dpc3MiLCAiU3dpc3MiLAotICAgICAgICAgICAgIlN5cmlhbiAoQXJtZW5pYW4gU3RyaW5nKSIsICJUYWxhIiwgIlRhbGVnZ2lvIiwgIlRhbWllIiwKLSAgICAgICAgICAgICJUYXNtYW5pYSBIaWdobGFuZCBDaGV2cmUgTG9nIiwgIlRhdXBpbmllcmUiLCAiVGVpZmkiLCAiVGVsZW1lYSIsCi0gICAgICAgICAgICAiVGVzdG91cmkiLCAiVGV0ZSBkZSBNb2luZSIsICJUZXRpbGxhIiwgIlRleGFzIEdvYXQgQ2hlZXNlIiwKLSAgICAgICAgICAgICJUaWJldCIsICJUaWxsYW1vb2sgQ2hlZGRhciIsICJUaWxzaXQiLCAiVGltYm9vbiBCcmllIiwgIlRvbWEiLAotICAgICAgICAgICAgIlRvbW1lIEJydWxlZSIsICJUb21tZSBkJ0Fib25kYW5jZSIsICJUb21tZSBkZSBDaGV2cmUiLAotICAgICAgICAgICAgIlRvbW1lIGRlIFJvbWFucyIsICJUb21tZSBkZSBTYXZvaWUiLCAiVG9tbWUgZGVzIENob3VhbnMiLAotICAgICAgICAgICAgIlRvbW1lcyIsICJUb3J0YSBkZWwgQ2FzYXIiLCAiVG9zY2FuZWxsbyIsICJUb3VyZWUgZGUgTCdBdWJpZXIiLAotICAgICAgICAgICAgIlRvdXJtYWxldCIsICJUcmFwcGUgKFZlcml0YWJsZSkiLCAiVHJvaXMgQ29ybmVzIERlIFZlbmRlZSIsCi0gICAgICAgICAgICAiVHJvbmNob24iLCAiVHJvdSBkdSBDcnUiLCAiVHJ1ZmZlIiwgIlR1cGkiLCAiVHVydW5tYWEiLAotICAgICAgICAgICAgIlR5bXNib3JvIiwgIlR5biBHcnVnIiwgIlR5bmluZyIsICJVYnJpYWNvIiwgIlVsbG9hIiwKLSAgICAgICAgICAgICJWYWNoZXJpbi1Gcmlib3VyZ2VvaXMiLCAiVmFsZW5jYXkiLCAiVmFzdGVyYm90dGVub3N0IiwgIlZlbmFjbyIsCi0gICAgICAgICAgICAiVmVuZG9tb2lzIiwgIlZpZXV4IENvcnNlIiwgIlZpZ25vdHRlIiwgIlZ1bHNjb21iZSIsCi0gICAgICAgICAgICAiV2FpbWF0YSBGYXJtaG91c2UgQmx1ZSIsICJXYXNoZWQgUmluZCBDaGVlc2UgKEF1c3RyYWxpYW4pIiwKLSAgICAgICAgICAgICJXYXRlcmxvbyIsICJXZWljaGthZXNlIiwgIldlbGxpbmd0b24iLCAiV2Vuc2xleWRhbGUiLAotICAgICAgICAgICAgIldoaXRlIFN0aWx0b24iLCAiV2hpdGVzdG9uZSBGYXJtaG91c2UiLCAiV2lnbW9yZSIsCi0gICAgICAgICAgICAiV29vZHNpZGUgQ2FiZWNvdSIsICJYYW5hZHUiLCAiWHlub3R5cm8iLCAiWWFyZyBDb3JuaXNoIiwKLSAgICAgICAgICAgICJZYXJyYSBWYWxsZXkgUHlyYW1pZCIsICJZb3Jrc2hpcmUgQmx1ZSIsICJaYW1vcmFubyIsCi0gICAgICAgICAgICAiWmFuZXR0aSBHcmFuYSBQYWRhbm8iLCAiWmFuZXR0aSBQYXJtaWdpYW5vIFJlZ2dpYW5vIn07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtU3RyaW5ncyA9IENoZWVzZXMuc0NoZWVzZVN0cmluZ3M7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZThlNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1BvcHVwTWVudTEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBQb3B1cE1lbnUgY2xhc3MuIENsaWNraW5nIHRoZSBidXR0b24gd2lsbCBpbmZsYXRlIGFuZAorICogc2hvdyBhIHBvcHVwIG1lbnUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUxIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucG9wdXBfbWVudV8xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblBvcHVwQnV0dG9uQ2xpY2soVmlldyBidXR0b24pIHsKKyAgICAgICAgUG9wdXBNZW51IHBvcHVwID0gbmV3IFBvcHVwTWVudSh0aGlzLCBidXR0b24pOworICAgICAgICBwb3B1cC5nZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5wb3B1cCwgcG9wdXAuZ2V0TWVudSgpKTsKKworICAgICAgICBwb3B1cC5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihuZXcgUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChQb3B1cE1lbnUxLnRoaXMsICJDbGlja2VkIHBvcHVwIG1lbnUgaXRlbSAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Sb3RhdGluZ0J1dHRvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3NjNjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5IHRvIHRyYW5zZm9ybSB2aWV3cyBpbiAyRCBhbmQgM0QsIHNjYWxpbmcgdGhlbSwKKyAqIHRyYW5zbGF0aW5nIHRoZW0sIGFuZCByb3RhdGluZyB0aGVtIChpbiAyRCBhbmQgM0QpLiBVc2UgdGhlIHNlZWsgYmFycyB0byBzZXQgdGhlIHZhcmlvdXMKKyAqIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIG9mIHRoZSBidXR0b24uCisgKi8KK3B1YmxpYyBjbGFzcyBSb3RhdGluZ0J1dHRvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJvdGF0aW5nX3ZpZXcpOworICAgICAgICBmaW5hbCBCdXR0b24gcm90YXRpbmdCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5yb3RhdGluZ0J1dHRvbik7CisgICAgICAgIFNlZWtCYXIgc2Vla0JhcjsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC50cmFuc2xhdGlvblgpOworICAgICAgICBzZWVrQmFyLnNldE1heCg0MDApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgcm90YXRpbmdCdXR0b24uc2V0VHJhbnNsYXRpb25YKChmbG9hdClwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRyYW5zbGF0aW9uWSk7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDgwMCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFRyYW5zbGF0aW9uWSgoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zY2FsZVgpOworICAgICAgICBzZWVrQmFyLnNldE1heCg1MCk7CisgICAgICAgIHNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICByb3RhdGluZ0J1dHRvbi5zZXRTY2FsZVgoKGZsb2F0KXByb2dyZXNzLzEwZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnNjYWxlWSk7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDUwKTsKKyAgICAgICAgc2Vla0Jhci5zZXRQcm9ncmVzcygxMCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFNjYWxlWSgoZmxvYXQpcHJvZ3Jlc3MvMTBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucm90YXRpb25YKTsKKyAgICAgICAgc2Vla0Jhci5zZXRNYXgoMzYwKTsKKyAgICAgICAgc2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBzZWVraW5nIG9uIGFwcCBjcmVhdGlvbgorICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFJvdGF0aW9uWCgoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yb3RhdGlvblkpOworICAgICAgICBzZWVrQmFyLnNldE1heCgzNjApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHNlZWtpbmcgb24gYXBwIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgcm90YXRpbmdCdXR0b24uc2V0Um90YXRpb25ZKChmbG9hdClwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnJvdGF0aW9uWik7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDM2MCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc2Vla2luZyBvbiBhcHAgY3JlYXRpb24KKyAgICAgICAgICAgICAgICByb3RhdGluZ0J1dHRvbi5zZXRSb3RhdGlvbigoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU2VhcmNoVmlld0FjdGlvbkJhci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU2VhcmNoVmlld0FjdGlvbkJhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODhmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TZWFyY2hWaWV3QWN0aW9uQmFyLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaGFibGVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgZGVtb25zdHJhdGVzIHRoZSB1c2FnZSBvZiBTZWFyY2hWaWV3IGluIGFuIEFjdGlvbkJhciBhcyBhIG1lbnUgaXRlbS4KKyAqIEl0IHNldHMgYSBTZWFyY2hhYmxlSW5mbyBvbiB0aGUgU2VhcmNoVmlldyBmb3Igc3VnZ2VzdGlvbnMgYW5kIHN1Ym1pdHRpbmcgcXVlcmllcyB0by4KKyAqLworcHVibGljIGNsYXNzIFNlYXJjaFZpZXdBY3Rpb25CYXIgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFNlYXJjaFZpZXcuT25RdWVyeVRleHRMaXN0ZW5lciwKKyAgICAgICAgU2VhcmNoVmlldy5PbkNsb3NlTGlzdGVuZXIsIEJ1dHRvbi5PbkNsaWNrTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBTZWFyY2hWaWV3IG1TZWFyY2hWaWV3OworICAgIHByaXZhdGUgQnV0dG9uIG1PcGVuQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIG1DbG9zZUJ1dHRvbjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5zZWFyY2h2aWV3X2FjdGlvbmJhcik7CisKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c190ZXh0KTsKKyAgICAgICAgbU9wZW5CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5vcGVuX2J1dHRvbik7CisgICAgICAgIG1DbG9zZUJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmNsb3NlX2J1dHRvbik7CisgICAgICAgIG1PcGVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOworCisgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5zZWFyY2h2aWV3X2luX21lbnUsIG1lbnUpOworICAgICAgICBtU2VhcmNoVmlldyA9IChTZWFyY2hWaWV3KSBtZW51LmZpbmRJdGVtKFIuaWQuYWN0aW9uX3NlYXJjaCkuZ2V0QWN0aW9uVmlldygpOworICAgICAgICBzZXR1cFNlYXJjaFZpZXcoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBTZWFyY2hWaWV3KCkgeworCisgICAgICAgIG1TZWFyY2hWaWV3LnNldEljb25pZmllZEJ5RGVmYXVsdCh0cnVlKTsKKworICAgICAgICBTZWFyY2hNYW5hZ2VyIHNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgaWYgKHNlYXJjaE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgTGlzdDxTZWFyY2hhYmxlSW5mbz4gc2VhcmNoYWJsZXMgPSBzZWFyY2hNYW5hZ2VyLmdldFNlYXJjaGFibGVzSW5HbG9iYWxTZWFyY2goKTsKKworICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSB0aGUgImFwcGxpY2F0aW9ucyIgZ2xvYmFsIHNlYXJjaCBwcm92aWRlcgorICAgICAgICAgICAgU2VhcmNoYWJsZUluZm8gaW5mbyA9IHNlYXJjaE1hbmFnZXIuZ2V0U2VhcmNoYWJsZUluZm8oZ2V0Q29tcG9uZW50TmFtZSgpKTsKKyAgICAgICAgICAgIGZvciAoU2VhcmNoYWJsZUluZm8gaW5mIDogc2VhcmNoYWJsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mLmdldFN1Z2dlc3RBdXRob3JpdHkoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmYuZ2V0U3VnZ2VzdEF1dGhvcml0eSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9ucyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBpbmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlYXJjaFZpZXcuc2V0U2VhcmNoYWJsZUluZm8oaW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBtU2VhcmNoVmlldy5zZXRPblF1ZXJ5VGV4dExpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2VhcmNoVmlldy5zZXRPbkNsb3NlTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2UoU3RyaW5nIG5ld1RleHQpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VGV4dCgiUXVlcnkgPSAiICsgbmV3VGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dFN1Ym1pdChTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VGV4dCgiUXVlcnkgPSAiICsgcXVlcnkgKyAiIDogc3VibWl0dGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNsb3NlKCkgeworICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KCJDbG9zZWQhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICBpZiAodmlldyA9PSBtQ2xvc2VCdXR0b24pIHsKKyAgICAgICAgICAgIG1TZWFyY2hWaWV3LnNldEljb25pZmllZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2aWV3ID09IG1PcGVuQnV0dG9uKSB7CisgICAgICAgICAgICBtU2VhcmNoVmlldy5zZXRJY29uaWZpZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvU2VhcmNoVmlld0ZpbHRlck1vZGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NlYXJjaFZpZXdGaWx0ZXJNb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NGIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NlYXJjaFZpZXdGaWx0ZXJNb2RlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldzsKKworCisvKioKKyAqIFNob3dzIGEgbGlzdCB0aGF0IGNhbiBiZSBmaWx0ZXJlZCBpbi1wbGFjZSB3aXRoIGEgU2VhcmNoVmlldyBpbiBub24taWNvbmlmaWVkIG1vZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hWaWV3RmlsdGVyTW9kZSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU2VhcmNoVmlldy5PblF1ZXJ5VGV4dExpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2VhcmNoVmlld0ZpbHRlck1vZGUiOworCisgICAgcHJpdmF0ZSBTZWFyY2hWaWV3IG1TZWFyY2hWaWV3OworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworICAgIHByaXZhdGUgQXJyYXlBZGFwdGVyPFN0cmluZz4gbUFkYXB0ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1TdHJpbmdzID0gQ2hlZXNlcy5zQ2hlZXNlU3RyaW5nczsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUik7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc2VhcmNodmlld19maWx0ZXIpOworCisgICAgICAgIG1TZWFyY2hWaWV3ID0gKFNlYXJjaFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF92aWV3KTsKKyAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0X3ZpZXcpOworICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlciA9IG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIG1TdHJpbmdzKSk7CisgICAgICAgIG1MaXN0Vmlldy5zZXRUZXh0RmlsdGVyRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgc2V0dXBTZWFyY2hWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2VhcmNoVmlldygpIHsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGZhbHNlKTsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0T25RdWVyeVRleHRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVNlYXJjaFZpZXcuc2V0U3VibWl0QnV0dG9uRW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1TZWFyY2hWaWV3LnNldFF1ZXJ5SGludChnZXRTdHJpbmcoUi5zdHJpbmcuY2hlZXNlX2h1bnRfaGludCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uUXVlcnlUZXh0Q2hhbmdlKFN0cmluZyBuZXdUZXh0KSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuZXdUZXh0KSkgeworICAgICAgICAgICAgbUxpc3RWaWV3LmNsZWFyVGV4dEZpbHRlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpc3RWaWV3LnNldEZpbHRlclRleHQobmV3VGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblF1ZXJ5VGV4dFN1Ym1pdChTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1NwbGl0VG91Y2hWaWV3LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TcGxpdFRvdWNoVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2I1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9TcGxpdFRvdWNoVmlldy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcjsKKworCisvKioKKyAqIERlbW9uc3RyYXRlcyBzcGxpdHRpbmcgdG91Y2ggZXZlbnRzIGFjcm9zcyBtdWx0aXBsZSB2aWV3cyB3aXRoaW4gYSB2aWV3IGdyb3VwLgorICovCitwdWJsaWMgY2xhc3MgU3BsaXRUb3VjaFZpZXcgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnNwbGl0X3RvdWNoX3ZpZXcpOworICAgICAgICBMaXN0VmlldyBsaXN0MSA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdDEpOworICAgICAgICBMaXN0VmlldyBsaXN0MiA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdDIpOworICAgICAgICBMaXN0QWRhcHRlciBhZGFwdGVyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIENoZWVzZXMuc0NoZWVzZVN0cmluZ3MpOworICAgICAgICBsaXN0MS5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBsaXN0Mi5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIGxpc3QxLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIoaXRlbUNsaWNrTGlzdGVuZXIpOworICAgICAgICBsaXN0Mi5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKGl0ZW1DbGlja0xpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZXNwb25zZUluZGV4ID0gMDsKKworICAgIHByaXZhdGUgZmluYWwgT25JdGVtQ2xpY2tMaXN0ZW5lciBpdGVtQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZXMgPSBnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheShSLmFycmF5LmNoZWVzZV9yZXNwb25zZXMpOworICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcmVzcG9uc2VzW3Jlc3BvbnNlSW5kZXgrKyAlIHJlc3BvbnNlcy5sZW5ndGhdOworCisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5zcGxpdF90b3VjaF92aWV3X2NoZWVzZV90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgQ2hlZXNlcy5zQ2hlZXNlU3RyaW5nc1twb3NpdGlvbl0sIHJlc3BvbnNlKTsKKworICAgICAgICAgICAgVG9hc3QgdG9hc3QgPSBUb2FzdC5tYWtlVGV4dChnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKTsKKyAgICAgICAgICAgIHRvYXN0LnNob3coKTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzMi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczIuamF2YQppbmRleCA3OTVhODZiLi5mNTJhOGM1IDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzMi5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMyLmphdmEKQEAgLTE2LDEyICsxNiwxMyBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OwogCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5UYWJBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UYWJIb3N0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwogCiAvKioKICAqIEV4YW1wbGUgb2YgdXNpbmcgYSB0YWIgY29udGVudCBmYWN0b3J5IGZvciB0aGUgY29udGVudCB2aWEge0BsaW5rIFRhYkhvc3QuVGFiU3BlYyNzZXRDb250ZW50KGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QuVGFiQ29udGVudEZhY3RvcnkpfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMzLmphdmEKaW5kZXggZTA5ZjA0MS4uNTg3YmZlOCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczMuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzMy5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgIC8vIHRoZSB0YWIgaXMgY2xpY2tlZC4KICAgICAgICAgdGFiSG9zdC5hZGRUYWIodGFiSG9zdC5uZXdUYWJTcGVjKCJ0YWIzIikKICAgICAgICAgICAgICAgICAuc2V0SW5kaWNhdG9yKCJkZXN0cm95IikKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudChuZXcgSW50ZW50KHRoaXMsIENvbnRyb2xzMi5jbGFzcykKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudChuZXcgSW50ZW50KHRoaXMsIENvbnRyb2xzMS5jbGFzcykKICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UT1ApKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczQuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnM0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNzI3NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnM0LmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKworLyoqCisgKiBJZGVudGljYWwgdG8gVGFiczIuIFRoZSBjaGFuZ2UgaXMgaW4gdGhlIHRoZW1lIHVzZWQgaW4gdGhlIG1hbmlmZXN0IGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJzNCBleHRlbmRzIFRhYnMyIHt9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzNS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI5ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuVGFiQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGFiSG9zdDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0ZXMgdGhlIFRhYiBzY3JvbGxpbmcgd2hlbiB0b28gbWFueSB0YWJzIGFyZSBkaXNwbGF5ZWQgdG8gZml0IGluIHRoZSBzY3JlZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJzNSBleHRlbmRzIFRhYkFjdGl2aXR5IGltcGxlbWVudHMgVGFiSG9zdC5UYWJDb250ZW50RmFjdG9yeSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudGFic19zY3JvbGwpOworCisgICAgICAgIGZpbmFsIFRhYkhvc3QgdGFiSG9zdCA9IGdldFRhYkhvc3QoKTsKKworICAgICAgICBmb3IgKGludCBpPTE7IGkgPD0gMzA7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiVGFiICIgKyBpOworICAgICAgICAgICAgdGFiSG9zdC5hZGRUYWIodGFiSG9zdC5uZXdUYWJTcGVjKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRpY2F0b3IobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnQodGhpcykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgVmlldyBjcmVhdGVUYWJDb250ZW50KFN0cmluZyB0YWcpIHsKKyAgICAgICAgZmluYWwgVGV4dFZpZXcgdHYgPSBuZXcgVGV4dFZpZXcodGhpcyk7CisgICAgICAgIHR2LnNldFRleHQoIkNvbnRlbnQgZm9yIHRhYiB3aXRoIHRhZyAiICsgdGFnKTsKKyAgICAgICAgcmV0dXJuIHR2OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnM2LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2FlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzNi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5UYWJBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UYWJIb3N0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIFVzZXMgYSByaWdodCBncmF2aXR5IGZvciB0aGUgVGFiV2lkZ2V0LgorICovCitwdWJsaWMgY2xhc3MgVGFiczYgZXh0ZW5kcyBUYWJBY3Rpdml0eSBpbXBsZW1lbnRzIFRhYkhvc3QuVGFiQ29udGVudEZhY3RvcnkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnRhYnNfcmlnaHRfZ3Jhdml0eSk7CisKKyAgICAgICAgZmluYWwgVGFiSG9zdCB0YWJIb3N0ID0gZ2V0VGFiSG9zdCgpOworICAgICAgICB0YWJIb3N0LmFkZFRhYih0YWJIb3N0Lm5ld1RhYlNwZWMoInRhYjEiKQorICAgICAgICAgICAgICAgIC5zZXRJbmRpY2F0b3IoInRhYjEiLCBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN0YXJfYmlnX29uKSkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudCh0aGlzKSk7CisgICAgICAgIHRhYkhvc3QuYWRkVGFiKHRhYkhvc3QubmV3VGFiU3BlYygidGFiMiIpCisgICAgICAgICAgICAgICAgLnNldEluZGljYXRvcigidGFiMiIpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnQodGhpcykpOworICAgICAgICB0YWJIb3N0LmFkZFRhYih0YWJIb3N0Lm5ld1RhYlNwZWMoInRhYjMiKQorICAgICAgICAgICAgICAgIC5zZXRJbmRpY2F0b3IoInRhYjMiKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50KHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBjcmVhdGVUYWJDb250ZW50KFN0cmluZyB0YWcpIHsKKyAgICAgICAgZmluYWwgVGV4dFZpZXcgdHYgPSBuZXcgVGV4dFZpZXcodGhpcyk7CisgICAgICAgIHR2LnNldFRleHQoIkNvbnRlbnQgZm9yIHRhYiB3aXRoIHRhZyAiICsgdGFnKTsKKyAgICAgICAgcmV0dXJuIHR2OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKaW5kZXggYTQ2MmJjMS4uYzVjN2VkMiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKQEAgLTE2Myw2ICsxNjMsMzAgQEAKICAgCiAgIDxkdD48YSBocmVmPSJMaXN0OC5odG1sIj44LiBQaG90b3M8L2E+PC9kdD4KICAgPGRkPiBEZW1vbnN0cmF0ZXMgYSBsaXN0IGFjdGl2aXR5IHRoYXQgdXNlcyBhIGN1c3RvbSBMaXN0QWRhcHRlciwgc2V0dGluZyB0aGUgdmlldyBmb3IgYW4gZW1wdHkgaXRlbSwgYW5kIGFsc28gaG93IHRvIGN1c3RvbWl6ZSB0aGUgbGF5b3V0IG9mIGEgTGlzdEFjdGl2aXR5LiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0OS5odG1sIj45LiBBcnJheSAoT3ZlcmxheSk8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTAuaHRtbCI+MTAuIFNpbmdsZSBjaG9pY2UgbGlzdDwvYT48L2R0PgorICA8ZGQ+IDwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9Ikxpc3QxMS5odG1sIj4xMS4gTXVsdGlwbGUgY2hvaWNlIGxpc3Q8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTIuaHRtbCI+MTIuIFRyYW5zY3JpcHQ8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTMuaHRtbCI+MTMuIFNsb3cgQWRhcHRlcjwvYT48L2R0PgorICA8ZGQ+IDwvZGQ+CisKKyAgPGR0PjxhIGhyZWY9Ikxpc3QxNC5odG1sIj4xNC4gRWZmaWNpZW50IEFkYXB0ZXI8L2E+PC9kdD4KKyAgPGRkPiA8L2RkPgorCisgIDxkdD48YSBocmVmPSJMaXN0MTUuaHRtbCI+MTUuIFNlbGVjdGlvbiBNb2RlPC9hPjwvZHQ+CisgIDxkZD4gRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2Ygc2VsZWN0aW9uIENvbnRleHR1YWwgQWN0aW9uIG1vZGUgdG8gc2VsZWN0IG11bHRpcGxlIGl0ZW1zIGluIGEgbGlzdCBhY3Rpdml0eS4gPC9kZD4KKworICA8ZHQ+PGEgaHJlZj0iTGlzdDE2Lmh0bWwiPjE2LiBCb3JkZXIgc2VsZWN0aW9uIG1vZGU8L2E+PC9kdD4KKyAgPGRkPiBEZW1vbnN0cmF0ZXMgYSBtdWx0aS1zZWxlY3QgbGlzdCBhY3Rpdml0eSB0aGF0IHVzZXMgdGhlIDxjb2RlPnNpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbTwvY29kZT4gYm9yZGVyIGxheW91dCBmb3Igc2VsZWN0ZWQgaXRlbXMuIDwvZGQ+CiA8L2RsPgogCiAKQEAgLTIzMywxNSArMjU3LDQwIEBACiAgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIHRyYW5zZm9ybWF0aW9ucyAoYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pLCBpbmNsdWRpbmcgZmFkaW5nLCBtb3Rpb24sIGFuZCByb3RhdGlvbi4gPC9kZD4KIDwvZGw+CiAKKzxoMz5EcmFnIGFuZCBEcm9wPC9oMz4KKzxkbD4KKyAgPGR0PjxhIGhyZWY9IkRyYWdBbmREcm9wRGVtby5odG1sIj5EcmFnIGFuZCBEcm9wIERlbW88L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBob3cgdG8gcGVyZm9ybSBkcmFnIGFuZCBkcm9wIHVzaW5nIGFuIE9uRHJhZ0xpc3RlbmVyLiAoVXNlcyB0aGUgPGEKK2hyZWY9IkRyYWdnYWJsZURvdC5odG1sIj48Y29kZT5EcmFnZ2FibGVEb3Q8L2NvZGU+PC9hPiBjbGFzcy4pIDwvZGQ+Cis8L2RsPgorCiA8aDM+Q29udHJvbHM8L2gzPgogPGRsPgotICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjEuIFRoZW1lIFdoaXRlPC9hPjwvZHQ+Ci0gIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyB0aGUgd2hpdGUgdGhlbWUuIDwvZGQ+CisgIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+MS4gTGlnaHQgVGhlbWU8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSBsaWdodCB0aGVtZS4gPC9kZD4KIDwvZGw+CiA8ZGw+Ci0gIDxkdD48YSBocmVmPSJDb250cm9sczIuaHRtbCI+Mi4gVGhlbWUgRGFyazwvYT48L2R0PgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjIuIERhcmsgVGhlbWU8L2E+PC9kdD4KICAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSBkYXJrIHRoZW1lLiA8L2RkPgogPC9kbD4KKzxkbD4KKyAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMS5odG1sIj4zLiBIb2xvZ3JhcGhpYyBMaWdodCBUaGVtZTwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBjb21tb24gZm9ybSB0eXBlIHdpZGdldHMsIHN1Y2ggYXMgY2hlY2sgYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgdXNpbmcgdGhlIGxpZ2h0IGhvbG9ncmFwaGljIHRoZW1lLiA8L2RkPgorPC9kbD4KKzxkbD4KKyAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMS5odG1sIj40LiBIb2xvZ3JhcGhpYyBEYXJrIFRoZW1lPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyB0aGUgZGFyayBob2xvZ3JhcGhpYyB0aGVtZS4gPC9kZD4KKzwvZGw+Cis8ZGw+CisgIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+NS4gQ3VzdG9tIFRoZW1lPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyBhIGN1c3RvbQorICB0aGVtZSBiYXNlZCBvbiB0aGUgbGlnaHQgdGhlbWUuIDwvZGQ+Cis8L2RsPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjYuIEhvbG8gb3IgT2xkIFRoZW1lPC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyBhIGN1c3RvbQorICB0aGVtZSB0aGF0IHVzZXMgZWl0aGVyIHRoZSB0cmFkaXRpb25hbCBvciBob2xvIHRoZW1lIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgcGxhdGZvcm0uIDwvZGQ+Cis8L2RsPgogCiA8aDM+QXV0byBDb21wbGV0ZTwvaDM+CiA8ZGw+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvQW5kcm9pZC5tayBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9BbmRyb2lkLm1rCmluZGV4IGMxNjRhNmMuLmFiZTI1MjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9BbmRyb2lkLm1rCisrKyBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9BbmRyb2lkLm1rCkBAIC0xMCw0ICsxMCw2IEBACiAKIExPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKIAorTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5mbGFncworCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9wcm9ndWFyZC5mbGFncyBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg3YWJjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9CYWNrdXBSZXN0b3JlL3Byb2d1YXJkLmZsYWdzCkBAIC0wLDAgKzEsMyBAQAorLWtlZXBjbGFzc21lbWJlcnMgY2xhc3MgY29tLmV4YW1wbGUuYW5kcm9pZC5iYWNrdXByZXN0b3JlLkJhY2t1cFJlc3RvcmVBY3Rpdml0eSB7CisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlQnV0dG9uQ2xpY2soYW5kcm9pZC52aWV3LlZpZXcpOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9CYWNrdXBSZXN0b3JlL3Jlcy9sYXlvdXQvYmFja3VwX3Jlc3RvcmUueG1sIGIvc2FtcGxlcy9CYWNrdXBSZXN0b3JlL3Jlcy9sYXlvdXQvYmFja3VwX3Jlc3RvcmUueG1sCmluZGV4IDE0NTlkNDIuLjllNjFiMDAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9yZXMvbGF5b3V0L2JhY2t1cF9yZXN0b3JlLnhtbAorKysgYi9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvcmVzL2xheW91dC9iYWNrdXBfcmVzdG9yZS54bWwKQEAgLTE2LDU4ICsxNiw3MiBAQAogCiA8IS0tIExheW91dCBkZXNjcmlwdGlvbiBvZiB0aGUgQmFja3VwUmVzdG9yZSBzYW1wbGUncyBtYWluIGFjdGl2aXR5IC0tPgogCi0KLTxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KIAotICAgIDxMaW5lYXJMYXlvdXQKKyAgICA8U2Nyb2xsVmlldwogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CiAKLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9maWxsaW5nX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRwIgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgogCi0gICAgICAgIDxSYWRpb0dyb3VwIGFuZHJvaWQ6aWQ9IkAraWQvZmlsbGluZ19ncm91cCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZpbGxpbmdfdGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgogCi0gICAgICAgICAgICA8UmFkaW9CdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmFjb25fbGFiZWwiLz4KLSAgICAgICAgICAgIDxSYWRpb0J1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3Bhc3RyYW1pIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9wYXN0cmFtaV9sYWJlbCIvPgotICAgICAgICAgICAgPFJhZGlvQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvaHVtbXVzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9odW1tdXNfbGFiZWwiLz4KKyAgICAgICAgICAgIDxSYWRpb0dyb3VwIGFuZHJvaWQ6aWQ9IkAraWQvZmlsbGluZ19ncm91cCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgogCi0gICAgICAgIDwvUmFkaW9Hcm91cD4KKyAgICAgICAgICAgICAgICA8UmFkaW9CdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNvbiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY29uX2xhYmVsIi8+CisgICAgICAgICAgICAgICAgPFJhZGlvQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGFzdHJhbWkiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9wYXN0cmFtaV9sYWJlbCIvPgorICAgICAgICAgICAgICAgIDxSYWRpb0J1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2h1bW11cyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2h1bW11c19sYWJlbCIvPgogCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZXh0cmFzX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8L1JhZGlvR3JvdXA+CiAKLSAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWF5byIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tYXlvX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2V4dHJhc190ZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CiAKLSAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvdG9tYXRvIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RvbWF0b190ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWF5byIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWF5b190ZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgogCi0gICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8Q2hlY2tCb3ggYW5kcm9pZDppZD0iQCtpZC90b21hdG8iCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RvbWF0b190ZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgogCi08L1Njcm9sbFZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvU2Nyb2xsVmlldz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXN0b3JlX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Jlc3RvcmVfdGV4dCIKKyAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblJlc3RvcmVCdXR0b25DbGljayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDY0Y2Q3YTIuLmI3ODUyNDMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yMyw0ICsyMyw2IEBACiAgIDxzdHJpbmcgbmFtZT0iZXh0cmFzX3RleHQiPkV4dHJhczo8L3N0cmluZz4KICAgPHN0cmluZyBuYW1lPSJtYXlvX3RleHQiPk1heW9ubmFpc2VcPzwvc3RyaW5nPgogICA8c3RyaW5nIG5hbWU9InRvbWF0b190ZXh0Ij5Ub21hdG9cPzwvc3RyaW5nPgorCisgIDxzdHJpbmcgbmFtZT0icmVzdG9yZV90ZXh0Ij5SZXN0b3JlIGxhc3QgZGF0YTwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYmFja3VwcmVzdG9yZS9CYWNrdXBSZXN0b3JlQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9iYWNrdXByZXN0b3JlL0JhY2t1cFJlc3RvcmVBY3Rpdml0eS5qYXZhCmluZGV4IDAxYzEwYWUuLjM3YzJmMzYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9iYWNrdXByZXN0b3JlL0JhY2t1cFJlc3RvcmVBY3Rpdml0eS5qYXZhCisrKyBiL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9iYWNrdXByZXN0b3JlL0JhY2t1cFJlc3RvcmVBY3Rpdml0eS5qYXZhCkBAIC0xOCw4ICsxOCwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLlJlc3RvcmVPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXA7CkBAIC0yNDksNCArMjUxLDIxIEBACiAKICAgICAgICAgbUJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgICAgLyoqCisgICAgICogQ2xpY2sgaGFuZGxlciwgZGVzaWduYXRlZCBpbiB0aGUgbGF5b3V0LCB0aGF0IHJ1bnMgYSByZXN0b3JlIG9mIHRoZSBhcHAncworICAgICAqIG1vc3QgcmVjZW50IGRhdGEgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlQnV0dG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgIExvZy52KFRBRywgIlJlcXVlc3RpbmcgcmVzdG9yZSBvZiBvdXIgbW9zdCByZWNlbnQgZGF0YSIpOworICAgICAgICBtQmFja3VwTWFuYWdlci5yZXF1ZXN0UmVzdG9yZSgKKyAgICAgICAgICAgICAgICBuZXcgUmVzdG9yZU9ic2VydmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXN0b3JlRmluaXNoZWQoaW50IGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiogRG9uZSB3aXRoIHRoZSByZXN0b3JlISAgTm93IGRyYXcgdGhlIG5ldyBzdGF0ZSBvZiBvdXIgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiUmVzdG9yZSBmaW5pc2hlZCwgZXJyb3IgPSAiICsgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVVSSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQmFzaWNHTFN1cmZhY2VWaWV3L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0Jhc2ljR0xTdXJmYWNlVmlldy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVkYzdkZjQuLmIwMzc1YWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmFzaWNHTFN1cmZhY2VWaWV3L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2FtcGxlcy9CYXNpY0dMU3VyZmFjZVZpZXcvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNiArMjEsNyBAQAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLmJhc2ljZ2xzdXJmYWNldmlldyI+CiAgICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOmdsRXNWZXJzaW9uPSIweDAwMDIwMDAwIiAvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjExIi8+CiAgICAgPGFwcGxpY2F0aW9uCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iQmFzaWNHTFN1cmZhY2VWaWV3QWN0aXZpdHkiCmRpZmYgLS1naXQgYS9zYW1wbGVzL0JsdWV0b290aENoYXQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDE5OWM2YTUuLjg5NWU2MzMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5EZXZpY2VMaXN0QWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3NlbGVjdF9kZXZpY2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2ciCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvLkRpYWxvZyIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iIC8+CiAgICAgPC9hcHBsaWNhdGlvbj4KIDwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JsdWV0b290aENoYXQvcmVzL21lbnUvb3B0aW9uX21lbnUueG1sIGIvc2FtcGxlcy9CbHVldG9vdGhDaGF0L3Jlcy9tZW51L29wdGlvbl9tZW51LnhtbAppbmRleCAxOGRlNzI1Li5kMDAzNzA4IDEwMDY0NAotLS0gYS9zYW1wbGVzL0JsdWV0b290aENoYXQvcmVzL21lbnUvb3B0aW9uX21lbnUueG1sCisrKyBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9yZXMvbWVudS9vcHRpb25fbWVudS54bWwKQEAgLTE2LDExICsxNiwxNCBAQAogPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NlY3VyZV9jb25uZWN0X3NjYW4iCiAgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKLSAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3NlY3VyZV9jb25uZWN0IiAvPgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2VjdXJlX2Nvbm5lY3QiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbXx3aXRoVGV4dCIgLz4KICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2luc2VjdXJlX2Nvbm5lY3Rfc2NhbiIKICAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VhcmNoIgotICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvaW5zZWN1cmVfY29ubmVjdCIgLz4KKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2luc2VjdXJlX2Nvbm5lY3QiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbXx3aXRoVGV4dCIgLz4KICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2Rpc2NvdmVyYWJsZSIKICAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfbXlsb2NhdGlvbiIKLSAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2Rpc2NvdmVyYWJsZSIgLz4KKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2Rpc2NvdmVyYWJsZSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tfHdpdGhUZXh0IiAvPgogPC9tZW51PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9CbHVldG9vdGhDaGF0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0JsdWV0b290aENoYXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA1M2FmMmEzLi4xN2I4ZTQ1IDEwMDY0NAotLS0gYS9zYW1wbGVzL0JsdWV0b290aENoYXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9zYW1wbGVzL0JsdWV0b290aENoYXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTQsNyArMTQsNyBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08cmVzb3VyY2VzPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CiAgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+Qmx1ZXRvb3RoIENoYXQ8L3N0cmluZz4KIAogICAgIDwhLS0gIEJsdWV0b290aENoYXQgLS0+CkBAIC0yMiw3ICsyMiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJub3RfY29ubmVjdGVkIj5Zb3UgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYSBkZXZpY2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJ0X25vdF9lbmFibGVkX2xlYXZpbmciPkJsdWV0b290aCB3YXMgbm90IGVuYWJsZWQuIExlYXZpbmcgQmx1ZXRvb3RoIENoYXQuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9jb25uZWN0aW5nIj5jb25uZWN0aW5nLi4uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9jb25uZWN0ZWRfdG8iPmNvbm5lY3RlZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9jb25uZWN0ZWRfdG8iPmNvbm5lY3RlZCB0byA8eGxpZmY6ZyBpZD0iZGV2aWNlX25hbWUiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9ub3RfY29ubmVjdGVkIj5ub3QgY29ubmVjdGVkPC9zdHJpbmc+CiAKICAgICA8IS0tICBEZXZpY2VMaXN0QWN0aXZpdHkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JsdWV0b290aENoYXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvQmx1ZXRvb3RoQ2hhdC9CbHVldG9vdGhDaGF0LmphdmEgYi9zYW1wbGVzL0JsdWV0b290aENoYXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvQmx1ZXRvb3RoQ2hhdC9CbHVldG9vdGhDaGF0LmphdmEKaW5kZXggNDI5ZjJkZC4uMmQyNmVlMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9CbHVldG9vdGhDaGF0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL0JsdWV0b290aENoYXQvQmx1ZXRvb3RoQ2hhdC5qYXZhCisrKyBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9CbHVldG9vdGhDaGF0L0JsdWV0b290aENoYXQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuQmx1ZXRvb3RoQ2hhdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKQEAgLTY0LDcgKzY1LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FTkFCTEVfQlQgPSAzOwogCiAgICAgLy8gTGF5b3V0IFZpZXdzCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGU7CiAgICAgcHJpdmF0ZSBMaXN0VmlldyBtQ29udmVyc2F0aW9uVmlldzsKICAgICBwcml2YXRlIEVkaXRUZXh0IG1PdXRFZGl0VGV4dDsKICAgICBwcml2YXRlIEJ1dHRvbiBtU2VuZEJ1dHRvbjsKQEAgLTg3LDE0ICs4Nyw3IEBACiAgICAgICAgIGlmKEQpIExvZy5lKFRBRywgIisrKyBPTiBDUkVBVEUgKysrIik7CiAKICAgICAgICAgLy8gU2V0IHVwIHRoZSB3aW5kb3cgbGF5b3V0Ci0gICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0NVU1RPTV9USVRMRSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwotICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX0NVU1RPTV9USVRMRSwgUi5sYXlvdXQuY3VzdG9tX3RpdGxlKTsKLQotICAgICAgICAvLyBTZXQgdXAgdGhlIGN1c3RvbSB0aXRsZQotICAgICAgICBtVGl0bGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2xlZnRfdGV4dCk7Ci0gICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLmFwcF9uYW1lKTsKLSAgICAgICAgbVRpdGxlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50aXRsZV9yaWdodF90ZXh0KTsKIAogICAgICAgICAvLyBHZXQgbG9jYWwgQmx1ZXRvb3RoIGFkYXB0ZXIKICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CkBAIC0yMzcsNiArMjMwLDE2IEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldFN0YXR1cyhpbnQgcmVzSWQpIHsKKyAgICAgICAgZmluYWwgQWN0aW9uQmFyIGFjdGlvbkJhciA9IGdldEFjdGlvbkJhcigpOworICAgICAgICBhY3Rpb25CYXIuc2V0U3VidGl0bGUocmVzSWQpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRTdGF0dXMoQ2hhclNlcXVlbmNlIHN1YlRpdGxlKSB7CisgICAgICAgIGZpbmFsIEFjdGlvbkJhciBhY3Rpb25CYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgYWN0aW9uQmFyLnNldFN1YnRpdGxlKHN1YlRpdGxlKTsKKyAgICB9CisKICAgICAvLyBUaGUgSGFuZGxlciB0aGF0IGdldHMgaW5mb3JtYXRpb24gYmFjayBmcm9tIHRoZSBCbHVldG9vdGhDaGF0U2VydmljZQogICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTI0NiwxNiArMjQ5LDE1IEBACiAgICAgICAgICAgICAgICAgaWYoRCkgTG9nLmkoVEFHLCAiTUVTU0FHRV9TVEFURV9DSEFOR0U6ICIgKyBtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2cuYXJnMSkgewogICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQ2hhdFNlcnZpY2UuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy50aXRsZV9jb25uZWN0ZWRfdG8pOwotICAgICAgICAgICAgICAgICAgICBtVGl0bGUuYXBwZW5kKG1Db25uZWN0ZWREZXZpY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKGdldFN0cmluZyhSLnN0cmluZy50aXRsZV9jb25uZWN0ZWRfdG8sIG1Db25uZWN0ZWREZXZpY2VOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzYXRpb25BcnJheUFkYXB0ZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhDaGF0U2VydmljZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy50aXRsZV9jb25uZWN0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKFIuc3RyaW5nLnRpdGxlX2Nvbm5lY3RpbmcpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aENoYXRTZXJ2aWNlLlNUQVRFX0xJU1RFTjoKICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aENoYXRTZXJ2aWNlLlNUQVRFX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KFIuc3RyaW5nLnRpdGxlX25vdF9jb25uZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBzZXRTdGF0dXMoUi5zdHJpbmcudGl0bGVfbm90X2Nvbm5lY3RlZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMwNiw3ICszMDgsNyBAQAogICAgICAgICAgICAgICAgIC8vIEJsdWV0b290aCBpcyBub3cgZW5hYmxlZCwgc28gc2V0IHVwIGEgY2hhdCBzZXNzaW9uCiAgICAgICAgICAgICAgICAgc2V0dXBDaGF0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVzZXIgZGlkIG5vdCBlbmFibGUgQmx1ZXRvb3RoIG9yIGFuIGVycm9yIG9jY3VyZWQKKyAgICAgICAgICAgICAgICAvLyBVc2VyIGRpZCBub3QgZW5hYmxlIEJsdWV0b290aCBvciBhbiBlcnJvciBvY2N1cnJlZAogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJUIG5vdCBlbmFibGVkIik7CiAgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcuYnRfbm90X2VuYWJsZWRfbGVhdmluZywgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgZmluaXNoKCk7CkBAIC0zMTgsNyArMzIwLDcgQEAKICAgICAgICAgLy8gR2V0IHRoZSBkZXZpY2UgTUFDIGFkZHJlc3MKICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBkYXRhLmdldEV4dHJhcygpCiAgICAgICAgICAgICAuZ2V0U3RyaW5nKERldmljZUxpc3RBY3Rpdml0eS5FWFRSQV9ERVZJQ0VfQUREUkVTUyk7Ci0gICAgICAgIC8vIEdldCB0aGUgQkx1ZXRvb3RoRGV2aWNlIG9iamVjdAorICAgICAgICAvLyBHZXQgdGhlIEJsdWV0b290aERldmljZSBvYmplY3QKICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1CbHVldG9vdGhBZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKICAgICAgICAgLy8gQXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoZSBkZXZpY2UKICAgICAgICAgbUNoYXRTZXJ2aWNlLmNvbm5lY3QoZGV2aWNlLCBzZWN1cmUpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9CbHVldG9vdGhDaGF0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL0JsdWV0b290aENoYXQvQmx1ZXRvb3RoQ2hhdFNlcnZpY2UuamF2YSBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9CbHVldG9vdGhDaGF0L0JsdWV0b290aENoYXRTZXJ2aWNlLmphdmEKaW5kZXggNDZkNGJjYi4uYzFiM2NkNiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9CbHVldG9vdGhDaGF0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL0JsdWV0b290aENoYXQvQmx1ZXRvb3RoQ2hhdFNlcnZpY2UuamF2YQorKysgYi9zYW1wbGVzL0JsdWV0b290aENoYXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvQmx1ZXRvb3RoQ2hhdC9CbHVldG9vdGhDaGF0U2VydmljZS5qYXZhCkBAIC00NTksNiArNDU5LDggQEAKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImRpc2Nvbm5lY3RlZCIsIGUpOwogICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTG9zdCgpOworICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgc2VydmljZSBvdmVyIHRvIHJlc3RhcnQgbGlzdGVuaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQ2hhdFNlcnZpY2UudGhpcy5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0JsdWV0b290aENoYXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvQmx1ZXRvb3RoQ2hhdC9EZXZpY2VMaXN0QWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9CbHVldG9vdGhDaGF0L0RldmljZUxpc3RBY3Rpdml0eS5qYXZhCmluZGV4IGZhNzIyYTIuLjNhZWZhMTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9CbHVldG9vdGhDaGF0L0RldmljZUxpc3RBY3Rpdml0eS5qYXZhCisrKyBiL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9CbHVldG9vdGhDaGF0L0RldmljZUxpc3RBY3Rpdml0eS5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MpOwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5kZXZpY2VfbGlzdCk7CiAKLSAgICAgICAgLy8gU2V0IHJlc3VsdCBDQU5DRUxFRCBpbmNhc2UgdGhlIHVzZXIgYmFja3Mgb3V0CisgICAgICAgIC8vIFNldCByZXN1bHQgQ0FOQ0VMRUQgaW4gY2FzZSB0aGUgdXNlciBiYWNrcyBvdXQKICAgICAgICAgc2V0UmVzdWx0KEFjdGl2aXR5LlJFU1VMVF9DQU5DRUxFRCk7CiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnV0dG9uIHRvIHBlcmZvcm0gZGV2aWNlIGRpc2NvdmVyeQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWQubWsgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc3MDBmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFwcGxpY2F0aW9uCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIDo9IGRpc2FibGVkCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTYW1wbGVCcm93c2VyUGx1Z2luCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnNhbXBsZXBsdWdpbgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBbHNvIGJ1aWxkIGFsbCBvZiB0aGUgc3ViLXRhcmdldHMgdW5kZXIgdGhpcyBvbmU6IHRoZSBzaGFyZWQgbGlicmFyeS4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyNjcyOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luIgorICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQucGVybWlzc2lvbi5QTFVHSU4iLz4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3NhbXBsZV9icm93c2VyX3BsdWdpbiI+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLlNhbXBsZVBsdWdpbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuUExVR0lOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9InR5cGUiIGFuZHJvaWQ6dmFsdWU9Im5hdGl2ZSIgLz4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9hcHBzL0dyYXBoaWNzTGFiL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXBwcy9HcmFwaGljc0xhYi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBzYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvYXBwcy9HcmFwaGljc0xhYi9OT1RJQ0UgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcHBzL0dyYXBoaWNzTGFiL05PVElDRQpyZW5hbWUgdG8gc2FtcGxlcy9Ccm93c2VyUGx1Z2luL05PVElDRQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL1JFQURNRSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3OTdiMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9SRUFETUUKQEAgLTAsMCArMSwxNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIENPTlRFTlRTICMjIyMjIyMjIyMjCitBLiBJTlRST0RVQ1RJT04KK0IuIFBMVUdJTiBTVFJVQ1RVUkUKK0MuIEhPVyBUTyBERVBMT1kKK0QuIFNVQi1QTFVHSU5TCisgICAgMS4gQU5JTUFUSU9OCisgICAgMi4gQVVESU8KKyAgICAzLiBCQUNLR1JPVU5ECisgICAgNC4gRk9STQorICAgIDUuIFBBSU5UCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAoQSkgSU5UUk9EVUNUSU9OICMjIyMjIyMjIyMKKworVGhlIHNhbXBsZSBwbHVnaW4gaXMgaW50ZW5kZWQgdG8gZ2l2ZSBwbHVnaW4gZGV2ZWxvcGVycyBhIHBvaW50IG9mIHJlZmVyZW5jZSB0bworc2VlIGhvdyBhbiBhbmRyb2lkIGJyb3dzZXIgcGx1Z2luIGlzIGNyZWF0ZWQgYW5kIGhvdyB0byB1c2UgdGhlIGF2YWlsYWJsZSBBUElzLgorQSBwbHVnaW4gaXMgcGFja2FnZWQgbGlrZSBhIHN0YW5kYXJkIGFwayBhbmQgY2FuIGJlIGluc3RhbGxlZCBlaXRoZXIgdmlhIHRoZSAKK21hcmtldCBvciBhZGIuICBUaGUgc2FtcGxlIHBsdWdpbiBhdHRlbXB0cyB0byBleGVyY2lzZSBhcyBtYW55IG9mIHRoZSBBUElzIGFzCitwb3NzaWJsZSBidXQgdW5mb3J0dW5hdGVseSBub3QgYWxsIGFyZSBjb3ZlcmVkLiAKKworVHJ5aW5nIHRvIGhhdmUgYSBzaW5nbGUgcGx1Z2luIGRlbW9uc3RyYXRlIGFsbCBwb3NzaWJsZSBBUEkgaW50ZXJhY3Rpb25zIG9uIG9uZQorc2NyZWVuIHdhcyBub3QgcHJhY3RpY2FsLiBPbiB0aGUgb3RoZXIgaGFuZCB3ZSBhbHNvIGRpZG4ndCB3YW50IGEgc2VwYXJhdGUKK3BsdWdpbiBmb3IgZWFjaCBpbnRlcmN0aW9uLCBhcyB0aGF0IHdvdWxkIHJlc3VsdCBpbiBtYW55IHNlcGFyYXRlIGFwaydzIHRoYXQKK3dvdWxkIG5lZWQgdG8gYmUgbWFpbnRhaW5lZC4gIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSB3ZSBkZXZlbG9wZWQgdGhlIGlkZWEgdG8gdXNlCisic3ViLXBsdWdpbnMiLiBXaXRoIGEgc3ViLXBsdWdpbiBvbmx5IG9uZSBzcGVjaWZpYyBmZWF0dXJlIG9mIHRoZSBwbHVnaW4gd291bGQKK2JlIGFjdGl2ZSBhdCBhIHRpbWUsIGJ1dCB0aGV5IHdvdWxkIGFsbCBzaGFyZSBhcyBtdWNoIGNvbW1vbiBjb2RlIGFzIHBvc3NpYmxlLgorQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBlYWNoIHN1Yi1wbHVnaW4gYW5kIGl0cyBmdW5jdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCitzdWItcGx1Z2lucyBzZWN0aW9uLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIChCKSBQTFVHSU4gU1RSVUNUVVJFICMjIyMjIworCitUaGUgc2FtcGxlIHBsdWdpbiBpcyBwYWNrYWdlZCBhcyBvbmUgcGx1Z2luIGJ1dCBjb250YWlucyBtYW55IHVuaXF1ZSBzdWItcGx1Z2lucworKGUuZy4gYXVkaW8gYW5kIHBhaW50KS4gIFRoZSBwYWNrYWdlIGNvbnNpc3RzIG9mIHR3byBwaWVjZXM6ICgxKSBKYXZhIGNvZGUKK2NvbnRhaW5pbmcgdGhlIGNvbmZpZzsgKDIpIEMrKyBzaGFyZWQgbGlicmFyeSBjb250YWluaW5nIHRoZSBicm93ZXIvcGx1Z2luCitiaW5kaW5ncyBhbmQgdGhlIHN1Yi1wbHVnaW4gY2xhc3Nlcy4gIAorCit+fn5+ICgxKSBKQVZBIH5+fn5+CitBbmRyb2lkLm1rOiBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIEFQSyAoU2FtcGxlQnJvd3NlclBsdWdpbikgYXMgd2VsbCBhcyB3aGljaAorICAgICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyB0byBpbmNsdWRlLgorCitBbmRyb2lkTWFuaWZlc3QueG1sOiBzaW1pbGFyIHRvIGEgc3RhbmRhcmQgYW5kcm9pZCBtYW5pZmVzdCBmaWxlLCBleGNlcHQgdGhhdCBpdAorICAgICAgICAgICAgICAgICAgICAgbXVzdCBjb250YWluIHRoZSAidXNlcy1wZXJtaXNzaW9uIiBhbmQgInNlcnZpY2UiCisgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyB0aGF0IGFyZSBwbHVnaW4gc3BlY2lmaWMuIFRoZSAic2VydmljZSIgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgc3ViLWVsZW1lbnRzIHRoYXQgZGVzY3JpYmUgdGhlIGphdmEgY29tcG9uZW50IG9mCisgICAgICAgICAgICAgICAgICAgICB0aGUgc2VydmljZS4KKworc3JjLyo6IGxvY2F0aW9uIG9mIHRoZSBqYXZhIHNvdXJjZSBmaWxlcy4gIFRoaXMgY29udGFpbnMgdGhlIFNhbXBsZVBsdWdpbi5jbGFzcworICAgICAgIHdoaWNoIGlzIHRoZSBqYXZhIGNvbXBvbmVudCBvZiBvdXIgcGx1Z2luLiAgVGhlIGNvbXBvbmVudCBtdXN0IGV4aXN0IGFuZAorICAgICAgIGltcGxlbWVudCB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlcywgdGhvdWdoIHNpbXBseSByZXR1cm5pbmcgbnVsbCBpcyB2YWxpZC4KKworcmVzLyo6IGxvY2F0aW9uIG9mIHRoZSBzdGF0aWMgcmVzb3VyY2VzIChlLmcuIGFuIGljb24gZm9yIHRoZSBwbHVnaW4pCisKK35+fn4gKDIpIEMrKyB+fn5+fgoram5pL0FuZHJvaWQubWs6IHNwZWNpZmllcyB0aGUgYnVpbGQgcGFyYW1ldGVycyBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHRoYXQgaXMgdG8KKyAgICAgICAgICAgICAgICBiZSBpbmNsdWRlZCB3aXRoIHRoZSBhcGsuIFRoZSBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgYmluZGluZ3MKKyAgICAgICAgICAgICAgICBiZXR3ZWVuIHRoZSBwbHVnaW4gYW5kIHRoZSBicm93c2VyLgorCitqbmkvbWFpbi4qOiB0aGlzIGNvZGUgaXMgdGhlIGJpbmRpbmcgcG9pbnQgYmV0d2VlbiB0aGUgcGx1Z2luIGFuZCB0aGUgYnJvd3Nlci4KKyAgICAgICAgICAgIEl0IHN1cHBvcnRzIGFsbCBvZiB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhIHN0YW5kYXJkIG5ldHNjYXBlCisgICAgICAgICAgICBzdHlsZSBwbHVnaW4gYXMgd2VsbCBhcyBhbGwgdGhlIGFuZHJvaWQgc3BlY2lmaWMgQVBJcy4gVGhlIGluaXRpYWwKKyAgICAgICAgICAgIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgcGx1Z2luIGlzIHRoZSBOUF9Jbml0aWFsaXplIGZ1bmN0aW9uLiBUaGUKKyAgICAgICAgICAgIE5QUF9OZXcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcgdGhlIGlucHV0IGFyZ3MgYW5kCisgICAgICAgICAgICBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIHN1Yi1wbHVnaW4gdG8gaW5zdGFudGlhdGUuIE1vc3Qgb3RoZXIKKyAgICAgICAgICAgIGZ1bmN0aW9ucyBlaXRoZXIgcmV0dXJuIGZpeGVkIHZhbHVlcyBvciBwYXNzIHRoZWlyIGlucHV0cyB0byB0aGUKKyAgICAgICAgICAgIHN1Yi1wbHVnaW4gZm9yIHByb2Nlc3NpbmcuCisKK2puaS9QbHVnaW5PYmplY3QuKjogVGhlIHBsdWdpbk9iamVjdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgY29udGFpbmVyIGluIHdoaWNoIHRvCisgICAgICAgICAgICAgICAgICAgIHN0b3JlIHZhcmlhYmxlcyAodGhlIHBsdWdpbidzIHN0YXRlKS4gIFRoaXMgb2JqZWN0cyB0d28gbWFpbgorICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0aWVzIGFyZSAoMSkgdG8gY29uc3RydWN0IGFuZCBzdG9yZSB0aGUgTlBDbGFzcyAKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IChkb25lIHVzaW5nIGNvZGUgcHJvdmlkZWQgYnkgQXBwbGUpIGFuZCAoMikgcHJvdmlkZQorICAgICAgICAgICAgICAgICAgICB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIHRoZSBzdWItcGx1Z2luIG9iamVjdHMgYW5kIGEgcGxhY2UgdG8gCisgICAgICAgICAgICAgICAgICAgIHN0b3JlIHRoZSBzdWItcGx1Z2luIGFmdGVyIGl0IGlzIGluc3RhbnRpYXRlZC4gIAorCitqbmkvKi8qOiBFYWNoIG9mIHRoZSBzdWItcGx1Z2lucyBoYXMgYSBmb2xkZXIgdGhhdCBjb250YWlucyBpdHMgY2xhc3MgZGVmaW5pdGlvbgorICAgICAgICAgYW5kIGxvZ2ljLiBUaGUgc3ViLXBsdWdpbiByZWNlaXZlcyBldmVudHMgZnJvbSB0aGUgYnJvd3NlciBhbmQgaXQgY2FuCisgICAgICAgICBhbHNvIGNvbW11bmljYXRlIHdpdGggdGhlIGJyb3dzZXIgdXNpbmcgdGhlIG5ldHNjYXBlIHBsdWdpbiBmdW5jdGlvbnMKKyAgICAgICAgIGFzIHdlbGwgYXMgdGhlIHNwZWNpYWxpemVkIGFuZHJvaWQgaW50ZXJmYWNlcy4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIChDKSBIT1cgVE8gREVQTE9ZICMjIyMjIyMjIworCitUbyBjb21waWxlIGFuZCBpbnN0YWxsIGEgcGx1Z2luIG9uIGEgZGV2aWNlL2VtdWxhdG9yIHNpbXBseS4uLgorCisxLiBydW4gIm1ha2UgU2FtcGxlQnJvd3NlclBsdWdpbiIgKGNvbXBpbGVzIGxpYnNhbXBsZXBsdWdpbi5zbyBhbmQgYnVpbGRzIHRoZSBhcGspCisyLiB0aGUgcHJldmlvdXMgY29tbWFuZCBwcm9kdWNlcyBhbiBhcGsgZmlsZSBzbyByZWNvcmQgaXRzIGxvY2F0aW9uCiszLiBydW4gImFkYiBpbnN0YWxsIFthcGtfZmlsZV0iIHRvIGluc3RhbGwgaXQgb24gYSBkZXZpY2UvZW11bGF0b3IKKzQuIHRoZSBicm93c2VyIHdpbGwgYXV0byByZWNvZ25pemUgdGhlIHBsdWdpbiBpcyBhdmFpbGFibGUKKworTm93IHRoYXQgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgeW91IGNhbiBtYW5hZ2UgaXQganVzdCBsaWtlIHlvdSB3b3VsZCBhbnkgb3RoZXIKK2FwcGxpY2F0aW9uIHZpYSBTZXR0aW5ncyAtPiBBcHBsaWNhdGlvbnMgLT4gTWFuYWdlIGFwcGxpY2F0aW9ucy4gVG8gZXhlY3V0ZSB0aGUKK3BsdWdpbiB5b3UgbmVlZCB0byBpbmNsdWRlIGFuIGh0bWwgc25pcHBldCAoc2ltaWxhciB0byB0aGUgb25lIGZvdW5kIGJlbG93KSBpbgorYSBkb2N1bWVudCB0aGF0IGlzIGFjY2Vzc2libGUgYnkgdGhlIGJyb3dzZXIuICBUaGUgbWltZS10eXBlIGNhbm5vdCBjaGFuZ2UgYnV0Cit5b3UgY2FuIGNoYW5nZSB0aGUgd2lkdGgsIGhlaWdodCwgYW5kIHBhcmFtZXRlcnMuICBUaGUgcGFyYW1ldGVycyBhcmUgdXNlZCB0bworbm90aWZ5IHRoZSBwbHVnaW4gd2hpY2ggc3ViLXBsdWdpbiB0byBleGVjdXRlIGFuZCB3aGljaCBkcmF3aW5nIG1vZGVsIHRvIHVzZS4KKworPG9iamVjdCB0eXBlPSJhcHBsaWNhdGlvbi94LXRlc3Ricm93c2VycGx1Z2luIiBoZWlnaHQ9NTAgd2lkdGg9MjUwPgorICAgIDxwYXJhbSBuYW1lPSJEcmF3aW5nTW9kZWwiIHZhbHVlPSJTdXJmYWNlIiAvPgorICAgIDxwYXJhbSBuYW1lPSJQbHVnaW5UeXBlIiB2YWx1ZT0iQmFja2dyb3VuZCIgLz4KKzwvb2JqZWN0PgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgKEQpIFNVQi1QTFVHSU5TICMjIyMjIyMjIyMjCisKK0VhY2ggc3ViLXBsdWdpbiBjb3JyZXNwb25kcyB0byBleGFjdGx5IG9uZSBwbHVnaW4gdHlwZSBhbmQgY2FuIHN1cHBvcnQgb25lIG9yCittb3JlIGRyYXdpbmcgbW9kZWxzLiBJbiB0aGUgc3Vic2VjdGlvbnMgYmVsb3cgdGhlcmUgYXJlIGRlc2NyaXB0aW9ucyBvZiBlYWNoIG9mCit0aGUgc3ViLXBsdWdpbnMgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gY3JlYXRlIHRoZSBodG1sIHNuaXBwZXRzLiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIChEMSkgQU5JTUFUSU9OICMjIyMjCisKK1BMVUdJTiBUWVBFOiBBbmltYXRpb24KK0RSQVdJTkcgTU9ERUw6IEJpdG1hcAorCitUaGlzIHBsdWdpbiBkcmF3cyBhIGJhbGwgYm91bmNpbmcgYXJvdW5kIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgbm90IGVudGlyZWx5CitvbiB0aGUgc2NyZWVuIGFuZCBpdCBpdCB0b3VjaGVkLCB0aGVuIGl0IHdpbGwgYXR0ZW1wdCB0byBjZW50ZXIgaXRzZWxmIG9uIHNjcmVlbi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIChEMikgQVVESU8gIyMjIyMjIyMjCisKK1BMVUdJTiBUWVBFOiBBdWRpbworRFJBV0lORyBNT0RFTDogQml0bWFwCisKK1RoaXMgcGx1Z2luIHBsYXlzIGEgcmF3IGF1ZGlvIGZpbGUgbG9jYXRlZCBhdCAvc2RjYXJkL3NhbXBsZS5yYXcgKG5lZWQgdG8gc3VwcGx5Cit5b3VyIG93bikuIEl0IHVzZXMgdG91Y2ggdG8gdHJpZ2dlciB0aGUgcGxheSwgcGF1c2UsIGFuZCBzdG9wIGJ1dHRvbnMuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAoRDMpIEJBQ0tHUk9VTkQgIyMjIworCitQTFVHSU4gVFlQRTogQmFja2dyb3VuZAorRFJBV0lORyBNT0RFTDogU3VyZmFjZQorCitUaGlzIHBsdWdpbiBoYXMgbWluaW1hbCB2aXN1YWwgY29tcG9uZW50cyBidXQgbWFpbmx5IHJ1bnMgQVBJIHRlc3RzIGluIHRoZSAKK2JhY2tncm91bmQuIFRoZSAgcGx1Z2luIGhhbmRsZXMgc2NhbGluZyBpdHMgb3duIGJpdG1hcCBvbiB6b29tIHdoaWNoIGluIHRoaXMKK2Nhc2UgaXMgYSBzaW1wbGUgc3RyaW5nIG9mIHRleHQuIFRoZSBvdXRwdXQgb2YgdGhpcyBwbHVnaW4gaXMgZm91bmQgaW4gdGhlIGxvZ3MKK2FzIGl0IHByaW50cyBlcnJvcnMgaWYgaXQgZGV0ZWN0cyBhbnkgQVBJIGZhaWx1cmVzLiBTb21lIG9mIHRoZSBBUEkncyB0ZXN0ZWQgYXJlCit0aW1lcnMsIGphdmFzY3JpcHQgYWNjZXNzLCBhbmQgYml0bWFwIGZvcm1hdHRpbmcuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAoRDQpIEZPUk0gIyMjIyMjIyMjIworCitQTFVHSU4gVFlQRTogRm9ybQorRFJBV0lORyBNT0RFTDogQml0bWFwCisKK1RoaXMgcGx1Z2luIG1pbWljcyBhIHNpbXBsZSB1c2VybmFtZS9wYXNzd29yZCBmb3JtLiBZb3UgY2FuIHNlbGVjdCBhIHRleHRib3ggYnkKK2VpdGhlciB0b3VjaGluZyBpdCBvciB1c2luZyB0aGUgbmF2aWdhdGlvbiBrZXlzLiAgT25jZSBzZWxlY3RlZCB0aGUgYm94IHdpbGwKK2hpZ2hsaWdodCBhbmQgdGhlIGtleWJvYXJkIHdpbGwgYXBwZWFyLiBJZiB0aGUgdGV4dGJveCBzZWxlY3RlZCBpcyBub3QgZnVsbHkKK2luIHZpZXcgdGhlbiB0aGUgcGx1Z2luIHdpbGwgZW5zdXJlIGl0IGlzIGNlbnRlcmVkIG9uIHRoZSBzY3JlZW4uICAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIChENSkgUEFJTlQgIyMjIyMjIyMjCisKK1BMVUdJTiBUWVBFOiBQYWludAorRFJBV0lORyBNT0RFTDogU3VyZmFjZQorCitUaGlzIHBsdWdpbiBwcm92aWRlcyBhIHN1cmZhY2UgdGhhdCB0aGUgdXNlciBjYW4gInBhaW50IiBvbi4gIFRoZSBpbnB1dHMgbWV0aG9kCitjYW4gYmUgdG9nZ2xlZCBiZXR3ZWVuIG1vdXNlIChkb3RzKSBhbmQgdG91Y2ggKGxpbmVzKS4gIFRoaXMgcGx1Z2luIGhhcyBhIGZpeGVkCitzdXJmYWNlIGFuZCBhbGxvd3MgdGhlIGJyb3dzZXIgdG8gc2NhbGUgdGhlIHN1cmZhY2Ugd2hlbiB6b29taW5nLiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvQW5kcm9pZC5tayBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTUzZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNzYgQEAKKyMjCisjIworIyMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMjCisjIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyMgYXJlIG1ldDoKKyMjICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMjCisjIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorIyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisjIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorIyMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorIyMgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCW1haW4uY3BwIFwKKwlQbHVnaW5PYmplY3QuY3BwIFwKKwlSZW5kZXJpbmdUaHJlYWQuY3BwIFwKKwlhbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcCBcCisJYW5pbWF0aW9uL0FuaW1hdGlvblRocmVhZC5jcHAgXAorCWF1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBcCisJYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcCBcCisJZm9ybS9Gb3JtUGx1Z2luLmNwcCBcCisJbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmNwcCBcCisJcGFpbnQvUGFpbnRQbHVnaW4uY3BwIFwKKwl2aWRlby9WaWRlb1BsdWdpbi5jcHAgXAorCWpuaS1icmlkZ2UuY3BwIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChMT0NBTF9QQVRIKSBcCisJJChMT0NBTF9QQVRIKS9hbmltYXRpb24gXAorCSQoTE9DQUxfUEFUSCkvYXVkaW8gXAorCSQoTE9DQUxfUEFUSCkvYmFja2dyb3VuZCBcCisJJChMT0NBTF9QQVRIKS9mb3JtIFwKKwkkKExPQ0FMX1BBVEgpL25hdmlnYXRpb24gXAorCSQoTE9DQUxfUEFUSCkvcGFpbnQgXAorCSQoTE9DQUxfUEFUSCkvdmlkZW8gXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL2JyaWRnZSBcCisJZXh0ZXJuYWwvd2Via2l0L1dlYkNvcmUvcGx1Z2lucyBcCisJZXh0ZXJuYWwvd2Via2l0L1dlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9KYXZhVk0gXAorCWV4dGVybmFsL3dlYmtpdC9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zIFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJuYXRpdmVoZWxwZXIgXAorCWxpYnV0aWxzIFwKKwlsaWJjdXRpbHMgXAorCWxpYkVHTCBcCisJbGliR0xFU3YyIFwKKwlsaWJza2lhCisKK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIAorTE9DQUxfUFJFTElOS19NT0RVTEU6PWZhbHNlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnNhbXBsZXBsdWdpbgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjkyNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwCkBAIC0wLDAgKzEsMjE1IEBACisvKgorIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgorIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sCisgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZQorIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCisgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCisKKyBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCisgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZcOVcyBjb3B5cmlnaHRzIGluCisgdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZAorIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorIGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwKKyBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzCisgb3IgbG9nb3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5Cisgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgQXBwbGUKKyBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIKKyBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgorCisgVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTyBXQVJSQU5USUVTLAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsCisgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMKKyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCisKKyBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMCisgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLAorIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQKKyBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SCisgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKK2ludCBTdWJQbHVnaW46OmdldFBsdWdpbldpZHRoKCkgeworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3QoKS0+cGRhdGE7CisgICAgcmV0dXJuIG9iai0+d2luZG93LT53aWR0aDsKK30KKworaW50IFN1YlBsdWdpbjo6Z2V0UGx1Z2luSGVpZ2h0KCkgeworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3QoKS0+cGRhdGE7CisgICAgcmV0dXJuIG9iai0+d2luZG93LT5oZWlnaHQ7Cit9CisKK1N1cmZhY2VTdWJQbHVnaW46On5TdXJmYWNlU3ViUGx1Z2luKCkgeworICAgIHNldENvbnRleHQoTlVMTCk7Cit9CisKK2Jvb2wgU3VyZmFjZVN1YlBsdWdpbjo6c3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsIG1vZGVsKSB7CisgICAgcmV0dXJuIChtb2RlbCA9PSBrU3VyZmFjZV9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIFN1cmZhY2VTdWJQbHVnaW46OnNldENvbnRleHQoam9iamVjdCBjb250ZXh0KSB7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChnVk0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzQpID09IEpOSV9PSykgeworCisgICAgICAgIC8vIGlmIG9uZSBleGlzdHMgdGhlbiBmcmVlIGl0cyBnbG9iYWwgcmVmZXJlbmNlCisgICAgICAgIGlmIChtX2NvbnRleHQpIHsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1fY29udGV4dCk7CisgICAgICAgICAgICBtX2NvbnRleHQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGdsb2JhbCByZWYKKyAgICAgICAgaWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBlbnYtPk5ld0dsb2JhbFJlZihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCB0aGUgdmFsdWUKKyAgICAgICAgbV9jb250ZXh0ID0gY29udGV4dDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbkludmFsaWRhdGUoTlBPYmplY3QgKm9iaik7CitzdGF0aWMgYm9vbCBwbHVnaW5IYXNQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CitzdGF0aWMgYm9vbCBwbHVnaW5IYXNNZXRob2QoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOworc3RhdGljIGJvb2wgcGx1Z2luR2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIE5QVmFyaWFudCAqdmFyaWFudCk7CitzdGF0aWMgYm9vbCBwbHVnaW5TZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YXJpYW50KTsKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOworc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlRGVmYXVsdChOUE9iamVjdCAqb2JqLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCk7CitzdGF0aWMgTlBPYmplY3QgKnBsdWdpbkFsbG9jYXRlKE5QUCBucHAsIE5QQ2xhc3MgKnRoZUNsYXNzKTsKK3N0YXRpYyB2b2lkIHBsdWdpbkRlYWxsb2NhdGUoTlBPYmplY3QgKm9iaik7CitzdGF0aWMgYm9vbCBwbHVnaW5SZW1vdmVQcm9wZXJ0eShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKK3N0YXRpYyBib29sIHBsdWdpbkVudW1lcmF0ZShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciAqKnZhbHVlLCB1aW50MzJfdCAqY291bnQpOworCisKKworc3RhdGljIE5QQ2xhc3MgcGx1Z2luQ2xhc3MgPSB7CisgICAgTlBfQ0xBU1NfU1RSVUNUX1ZFUlNJT04sCisgICAgcGx1Z2luQWxsb2NhdGUsCisgICAgcGx1Z2luRGVhbGxvY2F0ZSwKKyAgICBwbHVnaW5JbnZhbGlkYXRlLAorICAgIHBsdWdpbkhhc01ldGhvZCwKKyAgICBwbHVnaW5JbnZva2UsCisgICAgcGx1Z2luSW52b2tlRGVmYXVsdCwKKyAgICBwbHVnaW5IYXNQcm9wZXJ0eSwKKyAgICBwbHVnaW5HZXRQcm9wZXJ0eSwKKyAgICBwbHVnaW5TZXRQcm9wZXJ0eSwKKyAgICBwbHVnaW5SZW1vdmVQcm9wZXJ0eSwKKyAgICBwbHVnaW5FbnVtZXJhdGUKK307CisKK05QQ2xhc3MgKmdldFBsdWdpbkNsYXNzKHZvaWQpCit7CisgICAgcmV0dXJuICZwbHVnaW5DbGFzczsKK30KKworc3RhdGljIGJvb2wgaWRlbnRpZmllcnNJbml0aWFsaXplZCA9IGZhbHNlOworCisjZGVmaW5lIElEX1RFU1RGSUxFX1BST1BFUlRZICAgICAgICAgICAgMAorI2RlZmluZSBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlMgICAgICAgIDEKKworc3RhdGljIE5QSWRlbnRpZmllciBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW05VTV9QUk9QRVJUWV9JREVOVElGSUVSU107CitzdGF0aWMgY29uc3QgTlBVVEY4ICpwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJOYW1lc1tOVU1fUFJPUEVSVFlfSURFTlRJRklFUlNdID0geworICAgICJ0ZXN0ZmlsZSIKK307CisKKyNkZWZpbmUgSURfR0VUVEVTVEZJTEVfTUVUSE9EICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTlVNX01FVEhPRF9JREVOVElGSUVSUyAgICAgICAgICAgICAgICAgIDEKKworc3RhdGljIE5QSWRlbnRpZmllciBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tOVU1fTUVUSE9EX0lERU5USUZJRVJTXTsKK3N0YXRpYyBjb25zdCBOUFVURjggKnBsdWdpbk1ldGhvZElkZW50aWZpZXJOYW1lc1tOVU1fTUVUSE9EX0lERU5USUZJRVJTXSA9IHsKKyAgICAiZ2V0VGVzdEZpbGUiCit9OworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplSWRlbnRpZmllcnModm9pZCkKK3sKKyAgICBicm93c2VyLT5nZXRzdHJpbmdpZGVudGlmaWVycyhwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJOYW1lcywgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTLCBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzKTsKKyAgICBicm93c2VyLT5nZXRzdHJpbmdpZGVudGlmaWVycyhwbHVnaW5NZXRob2RJZGVudGlmaWVyTmFtZXMsIE5VTV9NRVRIT0RfSURFTlRJRklFUlMsIHBsdWdpbk1ldGhvZElkZW50aWZpZXJzKTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUzsgaSsrKQorICAgICAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW2ldKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5IYXNNZXRob2QoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NRVRIT0RfSURFTlRJRklFUlM7IGkrKykKKyAgICAgICAgaWYgKG5hbWUgPT0gcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbaV0pCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkdldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBOUFZhcmlhbnQgKnZhcmlhbnQpCit7CisgICAgUGx1Z2luT2JqZWN0ICpwbHVnaW4gPSAoUGx1Z2luT2JqZWN0ICopb2JqOworICAgIGlmIChuYW1lID09IHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbSURfVEVTVEZJTEVfUFJPUEVSVFldKSB7CisgICAgICAgIEJPT0xFQU5fVE9fTlBWQVJJQU5UKHRydWUsICp2YXJpYW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpCit7CisgICAgUGx1Z2luT2JqZWN0ICpwbHVnaW4gPSAoUGx1Z2luT2JqZWN0ICopb2JqOworICAgIGlmIChuYW1lID09IHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW0lEX0dFVFRFU1RGSUxFX01FVEhPRF0pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlRGVmYXVsdChOUE9iamVjdCAqb2JqLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbkludmFsaWRhdGUoTlBPYmplY3QgKm9iaikKK3sKKyAgICAvLyBSZWxlYXNlIGFueSByZW1haW5pbmcgcmVmZXJlbmNlcyB0byBKYXZhU2NyaXB0IG9iamVjdHMuCit9CisKK3N0YXRpYyBOUE9iamVjdCAqcGx1Z2luQWxsb2NhdGUoTlBQIG5wcCwgTlBDbGFzcyAqdGhlQ2xhc3MpCit7CisgICAgUGx1Z2luT2JqZWN0ICpuZXdJbnN0YW5jZSA9IChQbHVnaW5PYmplY3QqKSBtYWxsb2Moc2l6ZW9mKFBsdWdpbk9iamVjdCkpOworICAgIG5ld0luc3RhbmNlLT5oZWFkZXIuX2NsYXNzID0gdGhlQ2xhc3M7CisgICAgbmV3SW5zdGFuY2UtPmhlYWRlci5yZWZlcmVuY2VDb3VudCA9IDE7CisKKyAgICBpZiAoIWlkZW50aWZpZXJzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWRlbnRpZmllcnNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIGluaXRpYWxpemVJZGVudGlmaWVycygpOworICAgIH0KKworICAgIG5ld0luc3RhbmNlLT5ucHAgPSBucHA7CisKKyAgICByZXR1cm4gJm5ld0luc3RhbmNlLT5oZWFkZXI7Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbkRlYWxsb2NhdGUoTlBPYmplY3QgKm9iaikKK3sKKyAgICBmcmVlKG9iaik7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpblJlbW92ZVByb3BlcnR5KE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyIG5hbWUpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KQoreworICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjQ0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIGluCisgY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKKyBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlCisgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IKKyByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KKworIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QgdG8gdGhlc2UKKyB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl77+9cyBjb3B5cmlnaHRzIGluCisgdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZAorIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeQorIGZvcm1zOyBwcm92aWRlZCB0aGF0IGlmIHlvdSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlIGluIGl0cyBlbnRpcmV0eSBhbmQgd2l0aG91dAorIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwKKyBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzCisgb3IgbG9nb3Mgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5Cisgc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgQXBwbGUKKyBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIKKyBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgorCisgVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTyBXQVJSQU5USUVTLAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsCisgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMKKyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTiBDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCisKKyBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMCisgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLAorIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQKKyBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SCisgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGx1Z2luT2JqZWN0X19ERUZJTkVECisjZGVmaW5lIFBsdWdpbk9iamVjdF9fREVGSU5FRAorCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgPGpuaS5oPgorCitlbnVtIEN1c3RvbUV2ZW50VHlwZXMgeworICAgIGtTdXJmYWNlQ3JlYXRlZF9DdXN0b21FdmVudCAgICAgPSAwLAorICAgIGtTdXJmYWNlQ2hhbmdlZF9DdXN0b21FdmVudCAgICAgPSAxLAorICAgIGtTdXJmYWNlRGVzdHJveWVkX0N1c3RvbUV2ZW50ICAgPSAyLAorfTsKK3R5cGVkZWYgaW50MzJfdCBDdXN0b21FdmVudFR5cGU7CisKK2NsYXNzIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQorICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKSA9IDA7CisKKyAgICBpbnQgZ2V0UGx1Z2luV2lkdGgoKTsKKyAgICBpbnQgZ2V0UGx1Z2luSGVpZ2h0KCk7CisKKyAgICBOUFAgaW5zdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdDsgfQorCitwcml2YXRlOgorICAgIE5QUCBtX2luc3Q7Cit9OworCitjbGFzcyBTdXJmYWNlU3ViUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgU3VyZmFjZVN1YlBsdWdpbihOUFAgaW5zdCkgOiBTdWJQbHVnaW4oaW5zdCkgeyBtX2NvbnRleHQgPSBOVUxMOyB9CisgICAgdmlydHVhbCB+U3VyZmFjZVN1YlBsdWdpbigpOworICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworCisgICAgdm9pZCBzZXRDb250ZXh0KGpvYmplY3QgY29udGV4dCk7CisKKyAgICBqb2JqZWN0IG1fY29udGV4dDsKK307CisKK2VudW0gUGx1Z2luVHlwZXMgeworICAgIGtBbmltYXRpb25fUGx1Z2luVHlwZSAgPSAxLAorICAgIGtBdWRpb19QbHVnaW5UeXBlICAgICAgPSAyLAorICAgIGtCYWNrZ3JvdW5kX1BsdWdpblR5cGUgPSAzLAorICAgIGtGb3JtX1BsdWdpblR5cGUgICAgICAgPSA0LAorICAgIGtUZXh0X1BsdWdpblR5cGUgICAgICAgPSA1LAorICAgIGtQYWludF9QbHVnaW5UeXBlICAgICAgPSA2LAorICAgIGtWaWRlb19QbHVnaW5UeXBlICAgICAgPSA3LAorICAgIGtOYXZpZ2F0aW9uX1BsdWdpblR5cGUgPSA4LAorfTsKK3R5cGVkZWYgdWludDMyX3QgUGx1Z2luVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgUGx1Z2luT2JqZWN0IHsKKyAgICBOUE9iamVjdCBoZWFkZXI7CisgICAgTlBQIG5wcDsKKyAgICBOUFdpbmRvdyogd2luZG93OworCisgICAgUGx1Z2luVHlwZSBwbHVnaW5UeXBlOworICAgIFN1YlBsdWdpbiogYWN0aXZlUGx1Z2luOworCit9IFBsdWdpbk9iamVjdDsKKworTlBDbGFzcyAqZ2V0UGx1Z2luQ2xhc3Modm9pZCk7CisKKyNlbmRpZiAvLyBQbHVnaW5PYmplY3RfX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUmVuZGVyaW5nVGhyZWFkLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUmVuZGVyaW5nVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2N2VkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9SZW5kZXJpbmdUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJSZW5kZXJpbmdUaHJlYWQuaCIKKworI2luY2x1ZGUgIkFOUE9wZW5HTF9ucGFwaS5oIgorCitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QT3BlbkdMSW50ZXJmYWNlVjAgICAgZ09wZW5HTEk7CisKK1JlbmRlcmluZ1RocmVhZDo6UmVuZGVyaW5nVGhyZWFkKE5QUCBucHApIDogYW5kcm9pZDo6VGhyZWFkKCkgeworICAgIG1fbnBwID0gbnBwOworICAgIG1fd2lkdGggPSAtMTsKKyAgICBtX2hlaWdodCA9IC0xOworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIkNyZWF0ZWQgUmVuZGVyaW5nIFRocmVhZCIpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBSZW5kZXJpbmdUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7CisKKyAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJpbiByZWFkeSB0byBydW4iKTsKKworICAgIEVHTENvbnRleHQgY29udGV4dCA9IGdPcGVuR0xJLmFjcXVpcmVDb250ZXh0KG1fbnBwKTsKKworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgImNvbnRleHQ6ICVwIiwgY29udGV4dCk7CisKKyAgICBpZiAoY29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJVbmFibGUgdG8gY3JlYXRlIEVHTENvbnRleHQgZm9yIGEgVGV4dHVyZVByb2R1Y2VyIHRocmVhZCIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6VU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOworfQorCit2b2lkIFJlbmRlcmluZ1RocmVhZDo6c2V0RGltZW5zaW9ucyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtX3N5bmMpOworICAgIG1fd2lkdGggPSB3aWR0aDsKKyAgICBtX2hlaWdodCA9IGhlaWdodDsKK30KKwordm9pZCBSZW5kZXJpbmdUaHJlYWQ6OmdldERpbWVuc2lvbnMoaW50JiB3aWR0aCwgaW50JiBoZWlnaHQpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgbG9jayhtX3N5bmMpOworICAgIHdpZHRoID0gbV93aWR0aDsKKyAgICBoZWlnaHQgPSBtX2hlaWdodDsKK30KKwordm9pZCBSZW5kZXJpbmdUaHJlYWQ6OnByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKKyAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7CisgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Cit9CisKK3ZvaWQgUmVuZGVyaW5nVGhyZWFkOjpjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKKyAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKKyAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitHTGVudW0gUmVuZGVyaW5nVGhyZWFkOjpnZXRJbnRlcm5hbEZvcm1hdChTa0JpdG1hcDo6Q29uZmlnIGNvbmZpZykKK3sKKyAgICBzd2l0Y2goY29uZmlnKSB7CisgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtBOF9Db25maWc6CisgICAgICAgICAgICByZXR1cm4gR0xfQUxQSEE7CisgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzQ0NDRfQ29uZmlnOgorICAgICAgICAgICAgcmV0dXJuIEdMX1JHQkE7CisgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgorICAgICAgICAgICAgcmV0dXJuIEdMX1JHQkE7CisgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtSR0JfNTY1X0NvbmZpZzoKKyAgICAgICAgICAgIHJldHVybiBHTF9SR0I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitHTGVudW0gUmVuZGVyaW5nVGhyZWFkOjpnZXRUeXBlKFNrQml0bWFwOjpDb25maWcgY29uZmlnKQoreworICAgIHN3aXRjaChjb25maWcpIHsKKyAgICAgICAgY2FzZSBTa0JpdG1hcDo6a0E4X0NvbmZpZzoKKyAgICAgICAgICAgIHJldHVybiBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBjYXNlIFNrQml0bWFwOjprQVJHQl80NDQ0X0NvbmZpZzoKKyAgICAgICAgICAgIHJldHVybiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OworICAgICAgICBjYXNlIFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZzoKKyAgICAgICAgICAgIHJldHVybiBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBjYXNlIFNrQml0bWFwOjprSW5kZXg4X0NvbmZpZzoKKyAgICAgICAgICAgIHJldHVybiAtMTsgLy8gTm8gdHlwZSBmb3IgY29tcHJlc3NlZCBkYXRhLgorICAgICAgICBjYXNlIFNrQml0bWFwOjprUkdCXzU2NV9Db25maWc6CisgICAgICAgICAgICByZXR1cm4gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCit2b2lkIFJlbmRlcmluZ1RocmVhZDo6Y3JlYXRlVGV4dHVyZVdpdGhCaXRtYXAoR0x1aW50IHRleHR1cmUsIFNrQml0bWFwJiBiaXRtYXApIHsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7CisgICAgU2tCaXRtYXA6OkNvbmZpZyBjb25maWcgPSBiaXRtYXAuZ2V0Q29uZmlnKCk7CisgICAgaW50IGludGVybmFsZm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoY29uZmlnKTsKKyAgICBpbnQgdHlwZSA9IGdldFR5cGUoY29uZmlnKTsKKyAgICBiaXRtYXAubG9ja1BpeGVscygpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbGZvcm1hdCwgYml0bWFwLndpZHRoKCksIGJpdG1hcC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgMCwgaW50ZXJuYWxmb3JtYXQsIHR5cGUsIGJpdG1hcC5nZXRQaXhlbHMoKSk7CisgICAgYml0bWFwLnVubG9ja1BpeGVscygpOworICAgIGNoZWNrR2xFcnJvcigiZ2xUZXhJbWFnZTJEIik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworfQorCit2b2lkIFJlbmRlcmluZ1RocmVhZDo6dXBkYXRlVGV4dHVyZVdpdGhCaXRtYXAoR0x1aW50IHRleHR1cmUsIFNrQml0bWFwJiBiaXRtYXApIHsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7CisgICAgU2tCaXRtYXA6OkNvbmZpZyBjb25maWcgPSBiaXRtYXAuZ2V0Q29uZmlnKCk7CisgICAgaW50IGludGVybmFsZm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoY29uZmlnKTsKKyAgICBpbnQgdHlwZSA9IGdldFR5cGUoY29uZmlnKTsKKyAgICBiaXRtYXAubG9ja1BpeGVscygpOworICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCBiaXRtYXAud2lkdGgoKSwgYml0bWFwLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGZvcm1hdCwgdHlwZSwgYml0bWFwLmdldFBpeGVscygpKTsKKyAgICBiaXRtYXAudW5sb2NrUGl4ZWxzKCk7CisgICAgY2hlY2tHbEVycm9yKCJnbFRleFN1YkltYWdlMkQiKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1JlbmRlcmluZ1RocmVhZC5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9SZW5kZXJpbmdUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYwY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9SZW5kZXJpbmdUaHJlYWQuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCisjaW5jbHVkZSAiU2tDYW52YXMuaCIKKyNpbmNsdWRlICJTa0JpdG1hcC5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaWZuZGVmIFJlbmRlcmluZ1RocmVhZF9fREVGSU5FRAorI2RlZmluZSBSZW5kZXJpbmdUaHJlYWRfX0RFRklORUQKKworCitjbGFzcyBSZW5kZXJpbmdUaHJlYWQgOiBwdWJsaWMgYW5kcm9pZDo6VGhyZWFkIHsKK3B1YmxpYzoKKyAgICBSZW5kZXJpbmdUaHJlYWQoTlBQIG5wcCk7CisgICAgdmlydHVhbCB+UmVuZGVyaW5nVGhyZWFkKCkge307CisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCByZWFkeVRvUnVuKCk7CisKKyAgICB2b2lkIHNldERpbWVuc2lvbnMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkIGdldERpbWVuc2lvbnMoaW50JiB3aWR0aCwgaW50JiBoZWlnaHQpOworCitwcm90ZWN0ZWQ6CisgICAgTlBQIG1fbnBwOworCisgICAgc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcyk7CisgICAgc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKTsKKyAgICBzdGF0aWMgR0xlbnVtIGdldEludGVybmFsRm9ybWF0KFNrQml0bWFwOjpDb25maWcgY29uZmlnKTsKKyAgICBzdGF0aWMgR0xlbnVtIGdldFR5cGUoU2tCaXRtYXA6OkNvbmZpZyBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZVRleHR1cmVXaXRoQml0bWFwKEdMdWludCB0ZXh0dXJlLCBTa0JpdG1hcCYgYml0bWFwKTsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVUZXh0dXJlV2l0aEJpdG1hcChHTHVpbnQgdGV4dHVyZSwgU2tCaXRtYXAmIGJpdG1hcCk7CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSA9IDA7CisKKyAgICBhbmRyb2lkOjpNdXRleCBtX3N5bmM7CisgICAgaW50IG1fd2lkdGg7CisgICAgaW50IG1faGVpZ2h0OworfTsKKworCisKKworI2VuZGlmIC8vIFJlbmRlcmluZ1RocmVhZF9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZjg3OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiQW5pbWF0aW9uUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiBOUE5ldHNjYXBlRnVuY3MqICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgIGdDYW52YXNJOworZXh0ZXJuIEFOUFBhaW50SW50ZXJmYWNlVjAgICAgIGdQYWludEk7CitleHRlcm4gQU5QUGF0aEludGVyZmFjZVYwICAgICAgZ1BhdGhJOworZXh0ZXJuIEFOUFN5c3RlbUludGVyZmFjZVYwICAgIGdTeXN0ZW1JOworZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYxICAgIGdXaW5kb3dJOworCitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CisgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIGl4ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpeCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQmFsbEFuaW1hdGlvbjo6QmFsbEFuaW1hdGlvbihOUFAgaW5zdCkgOiBTdXJmYWNlU3ViUGx1Z2luKGluc3QpIHsKKyAgICAvL3JlZ2lzdGVyIGZvciB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga1RvdWNoX0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KKworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIlN0YXJ0aW5nIFJlbmRlcmluZyBUaHJlYWQiKTsKKworICAgIC8vc3RhcnQgYSB0aHJlYWQgYW5kIGRvIHlvdXIgZHJhd2luZyB0aGVyZQorICAgIG1fcmVuZGVyaW5nVGhyZWFkID0gbmV3IEFuaW1hdGlvblRocmVhZChpbnN0KTsKKyAgICBtX3JlbmRlcmluZ1RocmVhZC0+aW5jU3Ryb25nKGluc3QpOworICAgIG1fcmVuZGVyaW5nVGhyZWFkLT5ydW4oIkFuaW1hdGlvblRocmVhZCIpOworfQorCitCYWxsQW5pbWF0aW9uOjp+QmFsbEFuaW1hdGlvbigpIHsKKyAgICBtX3JlbmRlcmluZ1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgZGVzdHJveVN1cmZhY2UoKTsKK30KKworYm9vbCBCYWxsQW5pbWF0aW9uOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtPcGVuR0xfQU5QRHJhd2luZ01vZGVsKTsKK30KKworam9iamVjdCBCYWxsQW5pbWF0aW9uOjpnZXRTdXJmYWNlKCkgeworCisgICAgaWYgKG1fc3VyZmFjZSkgeworICAgICAgICByZXR1cm4gbV9zdXJmYWNlOworICAgIH0KKworICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGphdmEgY2xhc3MgYW5kIGluc3RhbnRpYXRlIGl0CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChnVk0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLSBnZXRTdXJmYWNlOiBmYWlsZWQgdG8gZ2V0IGVudiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luLkFuaW1hdGlvblN1cmZhY2UiOworICAgIGpjbGFzcyBmdWxsU2NyZWVuQ2xhc3MgPSBnU3lzdGVtSS5sb2FkSmF2YUNsYXNzKGluc3QoKSwgY2xhc3NOYW1lKTsKKworICAgIGlmKCFmdWxsU2NyZWVuQ2xhc3MpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0gZ2V0U3VyZmFjZTogZmFpbGVkIHRvIGxvYWQgY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam1ldGhvZElEIGNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChmdWxsU2NyZWVuQ2xhc3MsICI8aW5pdD4iLCAiKExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDspViIpOworICAgIGpvYmplY3QgZnVsbFNjcmVlblN1cmZhY2UgPSBlbnYtPk5ld09iamVjdChmdWxsU2NyZWVuQ2xhc3MsIGNvbnN0cnVjdG9yLCBtX2NvbnRleHQpOworCisgICAgaWYoIWZ1bGxTY3JlZW5TdXJmYWNlKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBjb25zdHJ1Y3Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIG9iamVjdCAlcCIsIGZ1bGxTY3JlZW5TdXJmYWNlKTsKKworICAgIG1fc3VyZmFjZSA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bGxTY3JlZW5TdXJmYWNlKTsKKyAgICByZXR1cm4gbV9zdXJmYWNlOworfQorCit2b2lkIEJhbGxBbmltYXRpb246OmRlc3Ryb3lTdXJmYWNlKCkgeworICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICBpZiAobV9zdXJmYWNlICYmIGdWTS0+R2V0RW52KCh2b2lkKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgPT0gSk5JX09LKSB7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1fc3VyZmFjZSk7CisgICAgICAgIG1fc3VyZmFjZSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIEJhbGxBbmltYXRpb246OnNob3dFbnRpcmVQbHVnaW5PblNjcmVlbigpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworICAgIE5QV2luZG93ICp3aW5kb3cgPSBvYmotPndpbmRvdzsKKworICAgIC8vIGxvZyB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3QKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdCA9IGdXaW5kb3dJLnZpc2libGVSZWN0KGluc3RhbmNlKTsKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICJDdXJyZW50IFZpc2libGVSZWN0OiAoJWQsJWQsJWQsJWQpIiwKKyAgICAgICAgICAgIHZpc2libGVSZWN0LmxlZnQsIHZpc2libGVSZWN0LnRvcCwgdmlzaWJsZVJlY3QucmlnaHQsIHZpc2libGVSZWN0LmJvdHRvbSk7CisKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdHNbMV07CisKKyAgICB2aXNpYmxlUmVjdHNbMF0ubGVmdCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnRvcCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnJpZ2h0ID0gd2luZG93LT53aWR0aDsKKyAgICB2aXNpYmxlUmVjdHNbMF0uYm90dG9tID0gd2luZG93LT5oZWlnaHQ7CisKKyAgICBnV2luZG93SS5zZXRWaXNpYmxlUmVjdHMoaW5zdGFuY2UsIHZpc2libGVSZWN0cywgMSk7CisgICAgZ1dpbmRvd0kuY2xlYXJWaXNpYmxlUmVjdHMoaW5zdGFuY2UpOworfQorCitpbnQxNl90IEJhbGxBbmltYXRpb246OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgc3dpdGNoIChldnQtPmRhdGEuZHJhdy5tb2RlbCkgeworICAgICAgICAgICAgICAgIGNhc2Uga09wZW5HTF9BTlBEcmF3aW5nTW9kZWw6IHsKKyAgICAgICAgICAgICAgICAgICAgLy9zZW5kIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSByZW5kZXJpbmcgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IGV2dC0+ZGF0YS5kcmF3LmRhdGEuc3VyZmFjZS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IGV2dC0+ZGF0YS5kcmF3LmRhdGEuc3VyZmFjZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIk5ldyBEaW1lbnNpb25zICglZCwlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgbV9yZW5kZXJpbmdUaHJlYWQtPnNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAvLyB1bmtub3duIGRyYXdpbmcgbW9kZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgIHNob3dFbnRpcmVQbHVnaW5PblNjcmVlbigpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtEb3VibGVUYXBfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgIGJyb3dzZXItPmdldHVybChpbnN0KCksICJqYXZhc2NyaXB0OmFsZXJ0KCdEZXRlY3RlZCBkb3VibGUgdGFwIGV2ZW50LicpIiwgMCk7CisgICAgICAgICAgICAgICAgZ1dpbmRvd0kucmVxdWVzdEZ1bGxTY3JlZW4oaW5zdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGI2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorI2luY2x1ZGUgIkFuaW1hdGlvblRocmVhZC5oIgorCisjaWZuZGVmIHBsdWdpbkdyYXBoaWNzX19ERUZJTkVECisjZGVmaW5lIHBsdWdpbkdyYXBoaWNzX19ERUZJTkVECisKK2NsYXNzIEJhbGxBbmltYXRpb24gOiBwdWJsaWMgU3VyZmFjZVN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgQmFsbEFuaW1hdGlvbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+QmFsbEFuaW1hdGlvbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKworICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7Citwcml2YXRlOgorICAgIHZvaWQgc2hvd0VudGlyZVBsdWdpbk9uU2NyZWVuKCk7CisgICAgdm9pZCBkZXN0cm95U3VyZmFjZSgpOworCisgICAgam9iamVjdCAgICAgICAgICBtX3N1cmZhY2U7CisgICAgQW5pbWF0aW9uVGhyZWFkKiBtX3JlbmRlcmluZ1RocmVhZDsKK307CisKKyNlbmRpZiAvLyBwbHVnaW5HcmFwaGljc19fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uVGhyZWFkLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2MzQyZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblRocmVhZC5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgIkFuaW1hdGlvblRocmVhZC5oIgorI2luY2x1ZGUgIkFOUE9wZW5HTF9ucGFwaS5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKK2V4dGVybiBBTlBMb2dJbnRlcmZhY2VWMCAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBPcGVuR0xJbnRlcmZhY2VWMCAgICBnT3BlbkdMSTsKKworQW5pbWF0aW9uVGhyZWFkOjpBbmltYXRpb25UaHJlYWQoTlBQIG5wcCkgOiBSZW5kZXJpbmdUaHJlYWQobnBwKSB7CisgICAgbV9jb3VudGVyID0gMDsKKyAgICBtX2xhc3RQcmludFRpbWUgPSBhbmRyb2lkOjp1cHRpbWVNaWxsaXMoKTsKKyAgICBtX2V4ZWN1dGlvblRpbWUgPSAwOworICAgIG1faWRsZVRpbWUgPSAwOworCisgICAgbV94ID0gbV95ID0gMDsKKyAgICBtX2R4ID0gMDsKKyAgICBtX2R5ID0gMDsKKworICAgIG1lbXNldCgmbV9vdmFsLCAwLCBzaXplb2YobV9vdmFsKSk7CisKKyAgICBtX3BhaW50ID0gbmV3IFNrUGFpbnQ7CisgICAgbV9wYWludC0+c2V0QW50aUFsaWFzKHRydWUpOworCisgICAgbV9iaXRtYXAgPSBjb25zdHJ1Y3RCaXRtYXAoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOworICAgIG1fY2FudmFzID0gbmV3IFNrQ2FudmFzKCptX2JpdG1hcCk7CisKKyAgICBtX3N0YXJ0RXhlY3V0aW9uVGltZSA9IDA7CisgICAgbV9zdGFydFRpbWUgPSBhbmRyb2lkOjp1cHRpbWVNaWxsaXMoKTsKK30KKworQW5pbWF0aW9uVGhyZWFkOjp+QW5pbWF0aW9uVGhyZWFkKCkgeworICAgIGRlbGV0ZSBtX3BhaW50OworICAgIGRlbGV0ZSBtX2NhbnZhczsKKyAgICBkZWxldGUgbV9iaXRtYXA7Cit9CisKK1NrQml0bWFwKiBBbmltYXRpb25UaHJlYWQ6OmNvbnN0cnVjdEJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICBTa0JpdG1hcCogYml0bWFwID0gbmV3IFNrQml0bWFwOworICAgIGJpdG1hcC0+c2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgd2lkdGgsIGhlaWdodCk7CisgICAgYml0bWFwLT5hbGxvY1BpeGVscygpOworICAgIGJpdG1hcC0+ZXJhc2VDb2xvcigweDAwMDAwMDAwKTsKKyAgICByZXR1cm4gYml0bWFwOworfQorCitzdGF0aWMgdm9pZCBib3VuY2UoZmxvYXQqIHgsIGZsb2F0KiBkeCwgY29uc3QgZmxvYXQgbWF4KSB7CisgICAgKnggKz0gKmR4OworICAgIGlmICgqeCA8IDApIHsKKyAgICAgICAgKnggPSAwOworICAgICAgICBpZiAoKmR4IDwgMCkgeworICAgICAgICAgICAgKmR4ID0gLSpkeDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKnggPiBtYXgpIHsKKyAgICAgICAgKnggPSBtYXg7CisgICAgICAgIGlmICgqZHggPiAwKSB7CisgICAgICAgICAgICAqZHggPSAtKmR4OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEFuaW1hdGlvblRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKworICAgIG1fc3RhcnRJZGxlVGltZSA9IGFuZHJvaWQ6OnVwdGltZU1pbGxpcygpOworCisgICAgQU5QVGV4dHVyZUluZm8gdGV4dHVyZUluZm8gPSBnT3BlbkdMSS5sb2NrVGV4dHVyZShtX25wcCk7CisgICAgR0x1aW50IHRleHR1cmVJZCA9IHRleHR1cmVJbmZvLnRleHR1cmVJZDsKKworICAgIG1faWRsZVRpbWUgKz0gYW5kcm9pZDo6dXB0aW1lTWlsbGlzKCkgLSBtX3N0YXJ0SWRsZVRpbWU7CisgICAgbV9zdGFydEV4ZWN1dGlvblRpbWUgPSBhbmRyb2lkOjp1cHRpbWVNaWxsaXMoKTsKKworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGdldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAod2lkdGggPD0gMCkKKyAgICAgICAgd2lkdGggPSBERUZBVUxUX1dJRFRIOworICAgIGlmIChoZWlnaHQgPD0gMCkKKyAgICAgICAgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7CisKKyAgICBpZiAobV9iaXRtYXAtPndpZHRoKCkgIT0gd2lkdGggfHwgbV9iaXRtYXAtPmhlaWdodCgpICE9IGhlaWdodCkgeworICAgICAgICBkZWxldGUgbV9jYW52YXM7CisgICAgICAgIGRlbGV0ZSBtX2JpdG1hcDsKKyAgICAgICAgbV9iaXRtYXAgPSBjb25zdHJ1Y3RCaXRtYXAod2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1fY2FudmFzID0gbmV3IFNrQ2FudmFzKCptX2JpdG1hcCk7CisKKyAgICAgICAgLy8gY2hhbmdlIHRoZSBiYWxsJ3Mgc3BlZWQgdG8gbWF0Y2ggdGhlIHNpemUKKyAgICAgICAgbV9keCA9IHdpZHRoICogLjAwNWY7CisgICAgICAgIG1fZHkgPSBoZWlnaHQgKiAuMDA3ZjsKKyAgICB9CisKKyAgICAvLyBzZXR1cCB2YXJpYWJsZXMKKyAgICBjb25zdCBmbG9hdCBPVyA9IHdpZHRoICogLjEyNWY7CisgICAgY29uc3QgZmxvYXQgT0ggPSBoZWlnaHQgKiAuMTI1ZjsKKworICAgIC8vIGNsZWFyIHRoZSBvbGQgb3ZhbAorICAgIG1fYml0bWFwLT5lcmFzZUNvbG9yKDB4ODgwMDAwRkYpOworCisgICAgLy8gdXBkYXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgb3ZhbAorICAgIGJvdW5jZSgmbV94LCAmbV9keCwgd2lkdGggLSBPVyk7CisgICAgYm91bmNlKCZtX3ksICZtX2R5LCBoZWlnaHQgLSBPSCk7CisKKyAgICAvLyBkcmF3IHRoZSBuZXcgb3ZhbAorICAgIG1fb3ZhbC5mTGVmdCA9IG1feDsKKyAgICBtX292YWwuZlRvcCA9IG1feTsKKyAgICBtX292YWwuZlJpZ2h0ID0gbV94ICsgT1c7CisgICAgbV9vdmFsLmZCb3R0b20gPSBtX3kgKyBPSDsKKyAgICBtX3BhaW50LT5zZXRDb2xvcigweEFBRkYwMDAwKTsKKyAgICBtX2NhbnZhcy0+ZHJhd092YWwobV9vdmFsLCAqbV9wYWludCk7CisKKyAgICBpZiAodGV4dHVyZUluZm8ud2lkdGggPT0gd2lkdGggJiYgdGV4dHVyZUluZm8uaGVpZ2h0ID09IGhlaWdodCkgeworICAgICAgICB1cGRhdGVUZXh0dXJlV2l0aEJpdG1hcCh0ZXh0dXJlSWQsICptX2JpdG1hcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JlYXRlVGV4dHVyZVdpdGhCaXRtYXAodGV4dHVyZUlkLCAqbV9iaXRtYXApOworICAgICAgICB0ZXh0dXJlSW5mby53aWR0aCA9IHdpZHRoOworICAgICAgICB0ZXh0dXJlSW5mby5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHRleHR1cmVJbmZvLmludGVybmFsRm9ybWF0ID0gR0xfUkdCQTsKKyAgICB9CisKKyAgICBtX2V4ZWN1dGlvblRpbWUgKz0gYW5kcm9pZDo6dXB0aW1lTWlsbGlzKCkgLSBtX3N0YXJ0RXhlY3V0aW9uVGltZTsKKyAgICBtX2NvdW50ZXIrKzsKKworICAgIGdPcGVuR0xJLnJlbGVhc2VUZXh0dXJlKG1fbnBwLCAmdGV4dHVyZUluZm8pOworCisgICAgaWYgKGFuZHJvaWQ6OnVwdGltZU1pbGxpcygpIC0gbV9sYXN0UHJpbnRUaW1lID4gNTAwMCkgeworICAgICAgICBmbG9hdCBmcHMgPSBtX2NvdW50ZXIgLyAoKGFuZHJvaWQ6OnVwdGltZU1pbGxpcygpIC0gbV9zdGFydFRpbWUpIC8gMTAwMCk7CisgICAgICAgIGZsb2F0IHNwZiA9ICgoYW5kcm9pZDo6dXB0aW1lTWlsbGlzKCkgLSBtX3N0YXJ0VGltZSkpIC8gbV9jb3VudGVyOworICAgICAgICBmbG9hdCBscGYgPSAobV9pZGxlVGltZSkgLyBtX2NvdW50ZXI7CisgICAgICAgIGZsb2F0IGV4ZSA9IChtX2V4ZWN1dGlvblRpbWUpIC8gbV9jb3VudGVyOworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJURVhUOiBjb3VudGVyKCVkKSBmcHMoJWYpIHNwZiglZikgbG9jayglZikgZXhlY3V0aW9uKCVmKVxuIiwgKGludCltX2NvdW50ZXIsIGZwcywgc3BmLCBscGYsIGV4ZSk7CisgICAgICAgIG1fbGFzdFByaW50VGltZSA9IGFuZHJvaWQ6OnVwdGltZU1pbGxpcygpOworCisgICAgICAgIG1fY291bnRlciA9IDA7CisgICAgICAgIG1fZXhlY3V0aW9uVGltZSA9IDA7CisgICAgICAgIG1faWRsZVRpbWUgPSAwOworICAgICAgICBtX3N0YXJ0RXhlY3V0aW9uVGltZSA9IDA7CisgICAgICAgIG1fc3RhcnRUaW1lID0gYW5kcm9pZDo6dXB0aW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25UaHJlYWQuaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzRlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25UaHJlYWQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJSZW5kZXJpbmdUaHJlYWQuaCIKKyNpbmNsdWRlICJTa0NhbnZhcy5oIgorI2luY2x1ZGUgIlNrQml0bWFwLmgiCisjaW5jbHVkZSAiU2tSZWN0LmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorCisjaWZuZGVmIEFuaW1hdGlvblRocmVhZF9fREVGSU5FRAorI2RlZmluZSBBbmltYXRpb25UaHJlYWRfX0RFRklORUQKKworY2xhc3MgQW5pbWF0aW9uVGhyZWFkIDogcHVibGljIFJlbmRlcmluZ1RocmVhZCB7CitwdWJsaWM6CisgICAgQW5pbWF0aW9uVGhyZWFkKE5QUCBucHApOworICAgIHZpcnR1YWwgfkFuaW1hdGlvblRocmVhZCgpOworCitwcml2YXRlOgorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisgICAgU2tCaXRtYXAqIGNvbnN0cnVjdEJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgZmxvYXQgbV9jb3VudGVyOworCisgICAgaW50NjRfdCBtX2xhc3RQcmludFRpbWU7CisgICAgaW50NjRfdCBtX2V4ZWN1dGlvblRpbWU7CisgICAgaW50NjRfdCBtX2lkbGVUaW1lOworICAgIGludDY0X3QgbV9zdGFydFRpbWU7CisgICAgaW50NjRfdCBtX3N0YXJ0RXhlY3V0aW9uVGltZTsKKyAgICBpbnQ2NF90IG1fc3RhcnRJZGxlVGltZTsKKworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBtX3k7CisgICAgZmxvYXQgbV9keDsKKyAgICBmbG9hdCBtX2R5OworCisgICAgU2tSZWN0IG1fb3ZhbDsKKyAgICBTa1BhaW50KiBtX3BhaW50OworICAgIFNrQml0bWFwKiBtX2JpdG1hcDsKKyAgICBTa0NhbnZhcyogbV9jYW52YXM7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IERFRkFVTFRfV0lEVEggPSA0MDA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBERUZBVUxUX0hFSUdIVCA9IDQwMDsKK307CisKKworCisjZW5kaWYgLy8gQW5pbWF0aW9uVGhyZWFkX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWZlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwIGdTb3VuZEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CisKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CisgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIGl4ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgeworICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7CisKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBOUFJlY3QgaW52YWw7CisgICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOworICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7CisgICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOworICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOworfQorCitzdGF0aWMgdm9pZCBhdWRpb0NhbGxiYWNrKEFOUEF1ZGlvRXZlbnQgZXZ0LCB2b2lkKiB1c2VyLCBBTlBBdWRpb0J1ZmZlciogYnVmZmVyKSB7CisgICAgc3dpdGNoIChldnQpIHsKKyAgICAgICAgY2FzZSBrTW9yZURhdGFfQU5QQXVkaW9FdmVudDogeworICAgICAgICAgICAgU291bmRQbGF5KiBwbGF5ID0gcmVpbnRlcnByZXRfY2FzdDxTb3VuZFBsYXkqPih1c2VyKTsKKyAgICAgICAgICAgIHNpemVfdCBhbW91bnQgPSBmcmVhZChidWZmZXItPmJ1ZmZlckRhdGEsIDEsIGJ1ZmZlci0+c2l6ZSwgcGxheS0+ZmlsZSk7CisgICAgICAgICAgICBidWZmZXItPnNpemUgPSBhbW91bnQ7CisgICAgICAgICAgICBpZiAoYW1vdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBnU291bmRJLnN0b3AocGxheS0+dHJhY2spOworICAgICAgICAgICAgICAgIGZjbG9zZShwbGF5LT5maWxlKTsKKyAgICAgICAgICAgICAgICBwbGF5LT5maWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIG5lZWQgdG8gbm90aWZ5IG91ciBtYWluIHRocmVhZCB0byBkZWxldGUgdGhlIHRyYWNrIG5vdworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGxheS0+ZmlsZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyB3ZSBuZWVkIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgcHJvZ3Jlc3MgdmFsdWUKKyAgICAgICAgICAgICAgICBwbGF5LT5wcm9ncmVzcyA9IDE7CisgICAgICAgICAgICAgICAgaW52YWwocGxheS0+aW5zdGFuY2UpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQXVkaW9QbHVnaW46OkF1ZGlvUGx1Z2luKE5QUCBpbnN0KSA6IFN1YlBsdWdpbihpbnN0KSB7CisKKyAgICBjb25zdCBjaGFyIHBhdGhbXSA9ICIvc2RjYXJkL3NhbXBsZS5yYXciOworCisgICAgLy8gb3BlbiBhIGZpbGUgc3RyZWFtCisgICAgRklMRSogZiA9IGZvcGVuKHBhdGgsICJyIik7CisgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tIHBhdGggJXMgRklMRSAlcCIsIHBhdGgsIGYpOworCisgICAgLy8gc2V0dXAgb3VyIHByaXZhdGUgYXVkaW8gc3RydWN0J3MgZGVmYXVsdCB2YWx1ZXMKKyAgICBtX3NvdW5kUGxheSA9IG5ldyBTb3VuZFBsYXk7CisgICAgbV9zb3VuZFBsYXktPmluc3RhbmNlID0gaW5zdDsKKyAgICBtX3NvdW5kUGxheS0+cHJvZ3Jlc3MgPSAwOworICAgIG1fc291bmRQbGF5LT5maWxlU2l6ZSA9IDA7CisgICAgbV9zb3VuZFBsYXktPmZpbGUgPSBmOworICAgIG1fc291bmRQbGF5LT50cmFjayA9IE5VTEw7CisKKyAgICAvLyBjcmVhdGUgdGhlIGF1ZGlvIHRyYWNrCisgICAgaWYgKGYpIHsKKyAgICAgICAgbV9zb3VuZFBsYXktPnRyYWNrID0gZ1NvdW5kSS5uZXdUcmFjayg0NDEwMCwga1BDTTE2Qml0X0FOUFNhbXBsZUZvcm1hdCwgMiwgYXVkaW9DYWxsYmFjaywgbV9zb3VuZFBsYXkpOworICAgICAgICBpZiAoIW1fc291bmRQbGF5LT50cmFjaykgeworICAgICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICAgICAgbV9zb3VuZFBsYXktPmZpbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IHRoZSBhdWRpbyBmaWxlJ3Mgc2l6ZQorICAgIGludCBmaWxlRGVzY3JpcHRvciA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0dXM7CisKKyAgICBpZihmaWxlRGVzY3JpcHRvciA8PSAwKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgImZvcGVuIGVycm9yIik7CisgICAgfQorICAgIGVsc2UgaWYgKGZzdGF0KGZpbGVEZXNjcmlwdG9yLCAmZmlsZVN0YXR1cykgIT0gMCkgeworICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICJGaWxlIFNpemU6ICVkIiwgZmlsZVN0YXR1cy5zdF9zaXplKTsKKyAgICAgICAgbV9zb3VuZFBsYXktPmZpbGVTaXplID0gZmlsZVN0YXR1cy5zdF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgImZzdGF0IGVycm9yIik7CisgICAgfQorCisgICAgLy8gY29uZmlndXJlIHRoZSBVSSBlbGVtZW50cworICAgIG1fYWN0aXZlVG91Y2ggPSBmYWxzZTsKKworICAgIG1lbXNldCgmbV90cmFja1JlY3QsIDAsIHNpemVvZihtX3RyYWNrUmVjdCkpOworICAgIG1lbXNldCgmbV9wbGF5UmVjdCwgIDAsIHNpemVvZihtX3BsYXlSZWN0KSk7CisgICAgbWVtc2V0KCZtX3BhdXNlUmVjdCwgMCwgc2l6ZW9mKG1fcGF1c2VSZWN0KSk7CisgICAgbWVtc2V0KCZtX3N0b3BSZWN0LCAgMCwgc2l6ZW9mKG1fc3RvcFJlY3QpKTsKKworICAgIG1fcGFpbnRUcmFjayA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUcmFjaywgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50VHJhY2spIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFRyYWNrLCAweEZGQzBDMEMwKTsKKworICAgIG1fcGFpbnRSZWN0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFJlY3QsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFJlY3QpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFJlY3QsIDB4RkZBOEE4QTgpOworCisgICAgbV9wYWludFRleHQgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50VGV4dCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50VGV4dCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50VGV4dCwgMHhGRjJGNEY0Rik7CisgICAgZ1BhaW50SS5zZXRUZXh0U2l6ZShtX3BhaW50VGV4dCwgMTgpOworCisgICAgbV9wYWludFRyYWNrUHJvZ3Jlc3MgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50VHJhY2tQcm9ncmVzcywgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50VHJhY2tQcm9ncmVzcykgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50VHJhY2tQcm9ncmVzcywgMHhGRjU0NTQ1NCk7CisKKyAgICBtX3BhaW50QWN0aXZlUmVjdCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmVSZWN0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRBY3RpdmVSZWN0KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRBY3RpdmVSZWN0LCAweEZGNTQ1NDU0KTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRUZXh0LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga1RvdWNoX0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworQXVkaW9QbHVnaW46On5BdWRpb1BsdWdpbigpIHsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUcmFjayk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50UmVjdCk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50VGV4dCk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50VHJhY2tQcm9ncmVzcyk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50QWN0aXZlUmVjdCk7CisgICAgaWYobV9zb3VuZFBsYXktPnRyYWNrKQorICAgICAgICBnU291bmRJLmRlbGV0ZVRyYWNrKG1fc291bmRQbGF5LT50cmFjayk7CisgICAgZGVsZXRlIG1fc291bmRQbGF5OworfQorCitib29sIEF1ZGlvUGx1Z2luOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsKTsKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6ZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApIHsKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKworICAgIEFOUFJlY3RGIGNsaXBSOworICAgIGNsaXBSLmxlZnQgPSBjbGlwLmxlZnQ7CisgICAgY2xpcFIudG9wID0gY2xpcC50b3A7CisgICAgY2xpcFIucmlnaHQgPSBjbGlwLnJpZ2h0OworICAgIGNsaXBSLmJvdHRvbSA9IGNsaXAuYm90dG9tOworICAgIGdDYW52YXNJLmNsaXBSZWN0KGNhbnZhcywgJmNsaXBSKTsKKworICAgIGRyYXcoY2FudmFzKTsKKyAgICBnQ2FudmFzSS5kZWxldGVDYW52YXMoY2FudmFzKTsKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworCisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgdGhpcy0+aW5zdCgpLT5wZGF0YTsKKworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIkRyYXdpbmciKTsKKworICAgIGNvbnN0IGZsb2F0IHRyYWNrSGVpZ2h0ID0gMzA7CisgICAgY29uc3QgZmxvYXQgYnV0dG9uV2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBidXR0b25IZWlnaHQgPSAzMDsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICAvLyBjb2xvciB0aGUgcGx1Z2luIGNhbnZhcworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZDRENEQ0QpOworCisgICAgLy8gZ2V0IGZvbnQgbWV0cmljcworICAgIEFOUEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOworICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MobV9wYWludFRleHQsICZmb250TWV0cmljcyk7CisKKyAgICAvLyBkcmF3IHRoZSB0cmFjayBib3ggKDEgcHggZnJvbSB0aGUgZWRnZSkKKyAgICBtX3RyYWNrUmVjdC5sZWZ0ID0gMTsKKyAgICBtX3RyYWNrUmVjdC50b3AgPSAxOworICAgIG1fdHJhY2tSZWN0LnJpZ2h0ID0gVyAtIDI7CisgICAgbV90cmFja1JlY3QuYm90dG9tID0gMSArIHRyYWNrSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fdHJhY2tSZWN0LCBtX3BhaW50VHJhY2spOworCisgICAgLy8gZHJhdyB0aGUgcHJvZ3Jlc3MgYmFyCisgICAgaWYgKG1fc291bmRQbGF5LT5wcm9ncmVzcyA+IDApIHsKKyAgICAgICAgLy8gVE9ETyBuZWVkIHRvIGRyYXcgcHJvZ3Jlc3MgYmFyIHRvIGNvdmVyIHRoZSBwcm9wZXIgcGVyY2VudGFnZSBvZiB0aGUgdHJhY2sgYmFyCisgICAgICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fdHJhY2tSZWN0LCBtX3BhaW50VHJhY2tQcm9ncmVzcyk7CisgICAgfQorCisgICAgLy8gZHJhdyB0aGUgcGxheSBib3ggKHVuZGVyIHRyYWNrIGJveCkKKyAgICBtX3BsYXlSZWN0LmxlZnQgPSBtX3RyYWNrUmVjdC5sZWZ0ICsgNTsKKyAgICBtX3BsYXlSZWN0LnRvcCA9IG1fdHJhY2tSZWN0LmJvdHRvbSArIDEwOworICAgIG1fcGxheVJlY3QucmlnaHQgPSBtX3BsYXlSZWN0LmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX3BsYXlSZWN0LmJvdHRvbSA9IG1fcGxheVJlY3QudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fcGxheVJlY3QsIGdldFBhaW50KCZtX3BsYXlSZWN0KSk7CisgICAgLy8gZHJhdyB0aGUgcGxheSBib3ggKHVuZGVyIHRyYWNrIGJveCkKKyAgICBjb25zdCBjaGFyIHBsYXlUZXh0W10gPSAiUGxheSI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBwbGF5VGV4dCwgc2l6ZW9mKHBsYXlUZXh0KS0xLCBtX3BsYXlSZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fcGxheVJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworCisgICAgLy8gZHJhdyB0aGUgcGF1c2UgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgbV9wYXVzZVJlY3QubGVmdCA9IG1fcGxheVJlY3QucmlnaHQgKyAyMDsKKyAgICBtX3BhdXNlUmVjdC50b3AgPSBtX3RyYWNrUmVjdC5ib3R0b20gKyAxMDsKKyAgICBtX3BhdXNlUmVjdC5yaWdodCA9IG1fcGF1c2VSZWN0LmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX3BhdXNlUmVjdC5ib3R0b20gPSBtX3BhdXNlUmVjdC50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9wYXVzZVJlY3QsIGdldFBhaW50KCZtX3BhdXNlUmVjdCkpOworICAgIC8vIGRyYXcgdGhlIHRleHQgaW4gdGhlIHBhdXNlIGJveAorICAgIGNvbnN0IGNoYXIgcGF1c2VUZXh0W10gPSAiUGF1c2UiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgcGF1c2VUZXh0LCBzaXplb2YocGF1c2VUZXh0KS0xLCBtX3BhdXNlUmVjdC5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BhdXNlUmVjdC50b3AgLSBmb250TWV0cmljcy5mVG9wLCBtX3BhaW50VGV4dCk7CisKKyAgICAvLyBkcmF3IHRoZSBzdG9wIGJveCAodW5kZXIgdHJhY2sgYm94KQorICAgIG1fc3RvcFJlY3QubGVmdCA9IG1fcGF1c2VSZWN0LnJpZ2h0ICsgMjA7CisgICAgbV9zdG9wUmVjdC50b3AgPSBtX3RyYWNrUmVjdC5ib3R0b20gKyAxMDsKKyAgICBtX3N0b3BSZWN0LnJpZ2h0ID0gbV9zdG9wUmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9zdG9wUmVjdC5ib3R0b20gPSBtX3N0b3BSZWN0LnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3N0b3BSZWN0LCBnZXRQYWludCgmbV9zdG9wUmVjdCkpOworICAgIC8vIGRyYXcgdGhlIHRleHQgaW4gdGhlIHBhdXNlIGJveAorICAgIGNvbnN0IGNoYXIgc3RvcFRleHRbXSA9ICJTdG9wIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIHN0b3BUZXh0LCBzaXplb2Yoc3RvcFRleHQpLTEsIG1fc3RvcFJlY3QubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9zdG9wUmVjdC50b3AgLSBmb250TWV0cmljcy5mVG9wLCBtX3BhaW50VGV4dCk7Cit9CisKK0FOUFBhaW50KiBBdWRpb1BsdWdpbjo6Z2V0UGFpbnQoQU5QUmVjdEYqIGlucHV0KSB7CisgICAgcmV0dXJuIChpbnB1dCA9PSBtX2FjdGl2ZVJlY3QpID8gbV9wYWludEFjdGl2ZVJlY3QgOiBtX3BhaW50UmVjdDsKK30KKworaW50MTZfdCBBdWRpb1BsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZTogeworICAgICAgICAgICAgaW50IHggPSBldnQtPmRhdGEudG91Y2gueDsKKyAgICAgICAgICAgIGludCB5ID0gZXZ0LT5kYXRhLnRvdWNoLnk7CisgICAgICAgICAgICBpZiAoa0Rvd25fQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworCisgICAgICAgICAgICAgICAgbV9hY3RpdmVUb3VjaFJlY3QgPSB2YWxpZFRvdWNoKHgseSk7CisgICAgICAgICAgICAgICAgaWYobV9hY3RpdmVUb3VjaFJlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9hY3RpdmVUb3VjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChrVXBfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiAmJiBtX2FjdGl2ZVRvdWNoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlVG91Y2goeCwgeSk7CisgICAgICAgICAgICAgICAgbV9hY3RpdmVUb3VjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChrQ2FuY2VsX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK3ZvaWQgQXVkaW9QbHVnaW46OmludmFsQWN0aXZlUmVjdCgpIHsKKworfQorCitBTlBSZWN0RiogQXVkaW9QbHVnaW46OnZhbGlkVG91Y2goaW50IHgsIGludCB5KSB7CisKKyAgICBpZiAobV9wbGF5UmVjdC5sZWZ0ICYmIHggPCBtX3BsYXlSZWN0LnJpZ2h0ICYmIHkgPiBtX3BsYXlSZWN0LnRvcCAmJiB5IDwgbV9wbGF5UmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9wbGF5UmVjdDsKKyAgICBlbHNlIGlmIChtX3BhdXNlUmVjdC5sZWZ0ICYmIHggPCBtX3BhdXNlUmVjdC5yaWdodCAmJiB5ID4gbV9wYXVzZVJlY3QudG9wICYmIHkgPCBtX3BhdXNlUmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9wYXVzZVJlY3Q7CisgICAgZWxzZSBpZiAoeCA+IG1fc3RvcFJlY3QubGVmdCAmJiB4IDwgbV9zdG9wUmVjdC5yaWdodCAmJiB5ID4gbV9zdG9wUmVjdC50b3AgJiYgeSA8IG1fc3RvcFJlY3QuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fc3RvcFJlY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6aGFuZGxlVG91Y2goaW50IHgsIGludCB5KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy8gaWYgdGhlIHRyYWNrIGlzIG51bGwgdGhlbiByZXR1cm4KKyAgICBpZiAoTlVMTCA9PSBtX3NvdW5kUGxheS0+dHJhY2spIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSAlcCB1bmFibGUgdG8gY3JlYXRlIHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudFJlY3QgbWF0Y2hlcyB0aGUgYWN0aXZlUmVjdAorICAgIEFOUFJlY3RGKiBjdXJyZW50UmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICBpZiAobV9hY3RpdmVUb3VjaFJlY3QgIT0gY3VycmVudFJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjdXJyZW50UmVjdCA9PSAmbV9wbGF5UmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgc3RhcnRpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmIChnU291bmRJLmlzU3RvcHBlZChtX3NvdW5kUGxheS0+dHJhY2spKSB7CisgICAgICAgICAgICBnU291bmRJLnN0YXJ0KG1fc291bmRQbGF5LT50cmFjayk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3VycmVudFJlY3QgPT0gJm1fcGF1c2VSZWN0KSB7CisKKyAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBwYXVzaW5nIHRyYWNrICglZCkiLAorICAgICAgICAgICAgICAgICAgbV9zb3VuZFBsYXktPnRyYWNrLCBnU291bmRJLmlzU3RvcHBlZChtX3NvdW5kUGxheS0+dHJhY2spKTsKKworICAgICAgICBpZiAoIWdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpIHsKKyAgICAgICAgICAgIGdTb3VuZEkucGF1c2UobV9zb3VuZFBsYXktPnRyYWNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChjdXJyZW50UmVjdCA9PSAmbV9zdG9wUmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgc3RvcHBpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdG9wKG1fc291bmRQbGF5LT50cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fc291bmRQbGF5LT5maWxlKSB7CisgICAgICAgICAgICBmc2VlayhtX3NvdW5kUGxheS0+ZmlsZSwgMCwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2V0IHRoZSBjdXJyZW50UmVjdCB0byBiZSB0aGUgYWN0aXZlUmVjdAorICAgIG1fYWN0aXZlUmVjdCA9IGN1cnJlbnRSZWN0OworICAgIGludmFsKGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjg4YTkyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBhdWRpb1BsdWdpbl9fREVGSU5FRAorI2RlZmluZSBhdWRpb1BsdWdpbl9fREVGSU5FRAorCitzdHJ1Y3QgU291bmRQbGF5IHsKKyAgICBOUFAgICAgICAgICAgICAgaW5zdGFuY2U7CisgICAgQU5QQXVkaW9UcmFjayogIHRyYWNrOworICAgIEZJTEUqICAgICAgICAgICBmaWxlOworICAgIGludCAgICAgICAgICAgICBmaWxlU2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgcHJvZ3Jlc3M7IC8vIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwCit9OworCitjbGFzcyBBdWRpb1BsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEF1ZGlvUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgdm9pZCBoYW5kbGVUb3VjaChpbnQgeCwgaW50IHkpOworICAgIHZvaWQgaW52YWxBY3RpdmVSZWN0KCk7CisgICAgQU5QUGFpbnQqIGdldFBhaW50KEFOUFJlY3RGKik7CisgICAgQU5QUmVjdEYqIHZhbGlkVG91Y2goaW50IHgsIGludCB5KTsKKworICAgIEFOUFJlY3RGICAgIG1fdHJhY2tSZWN0OworICAgIEFOUFJlY3RGICAgIG1fcGxheVJlY3Q7CisgICAgQU5QUmVjdEYgICAgbV9wYXVzZVJlY3Q7CisgICAgQU5QUmVjdEYgICAgbV9zdG9wUmVjdDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUcmFjazsKKyAgICBBTlBQYWludCogICBtX3BhaW50UmVjdDsKKyAgICBBTlBQYWludCogICBtX3BhaW50VGV4dDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUcmFja1Byb2dyZXNzOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRBY3RpdmVSZWN0OworCisgICAgU291bmRQbGF5KiAgbV9zb3VuZFBsYXk7CisKKyAgICBib29sICAgICAgICBtX2FjdGl2ZVRvdWNoOworICAgIEFOUFJlY3RGKiAgIG1fYWN0aXZlVG91Y2hSZWN0OworICAgIEFOUFJlY3RGKiAgIG1fYWN0aXZlUmVjdDsKK307CisKKyNlbmRpZiAvLyBhdWRpb1BsdWdpbl9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5jcHAKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiQmFja2dyb3VuZFBsdWdpbi5oIgorI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiAgICAgICAgYnJvd3NlcjsKK2V4dGVybiBBTlBCaXRtYXBJbnRlcmZhY2VWMCAgICBnQml0bWFwSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICBnQ2FudmFzSTsKK2V4dGVybiBBTlBMb2dJbnRlcmZhY2VWMCAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBQYWludEludGVyZmFjZVYwICAgICBnUGFpbnRJOworZXh0ZXJuIEFOUFN1cmZhY2VJbnRlcmZhY2VWMCAgIGdTdXJmYWNlSTsKK2V4dGVybiBBTlBTeXN0ZW1JbnRlcmZhY2VWMCAgICBnU3lzdGVtSTsKK2V4dGVybiBBTlBUeXBlZmFjZUludGVyZmFjZVYwICBnVHlwZWZhY2VJOworZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYwICAgIGdXaW5kb3dJOworCisjZGVmaW5lIEFSUkFZX0NPVU5UKGFycmF5KSAgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKKworc3RhdGljIHVpbnQzMl90IGdldE1TZWNzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHJldHVybiAodWludDMyX3QpICh0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDAgKTsgLy8gbWljcm9zZWNvbmRzIHRvIG1pbGxpc2Vjb25kcworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhY2tncm91bmRQbHVnaW46OkJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpIDogU3VyZmFjZVN1YlBsdWdpbihpbnN0KSB7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBkcmF3aW5nIHN1cmZhY2UKKyAgICBtX3N1cmZhY2UgPSBOVUxMOworCisgICAgLy9pbml0aWFsaXplIGJpdG1hcCB0cmFuc3BhcmVuY3kgdmFyaWFibGVzCisgICAgbUZpbmlzaGVkU3RhZ2VPbmUgICA9IGZhbHNlOworICAgIG1GaW5pc2hlZFN0YWdlVHdvICAgPSBmYWxzZTsKKyAgICBtRmluaXNoZWRTdGFnZVRocmVlID0gZmFsc2U7CisKKyAgICAvLyB0ZXN0IGJhc2ljIHBsdWdpbiBmdW5jdGlvbmFsaXR5CisgICAgdGVzdF9sb2dnaW5nKCk7IC8vIGFuZHJvaWQgbG9nZ2luZworICAgIHRlc3RfdGltZXJzKCk7ICAvLyBwbHVnaW4gdGltZXJzCisgICAgdGVzdF9iaXRtYXBzKCk7IC8vIGFuZHJvaWQgYml0bWFwcworICAgIHRlc3RfZG9tQWNjZXNzKCk7CisgICAgdGVzdF9qYXZhc2NyaXB0KCk7CisgICAgdGVzdF9sb2FkSmF2YUNsYXNzKCk7CisKKyAgICAvL3JlZ2lzdGVyIGZvciB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga1RvdWNoX0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworQmFja2dyb3VuZFBsdWdpbjo6fkJhY2tncm91bmRQbHVnaW4oKSB7CisgICAgc2V0Q29udGV4dChOVUxMKTsKKyAgICBkZXN0cm95U3VyZmFjZSgpOworfQorCitqb2JqZWN0IEJhY2tncm91bmRQbHVnaW46OmdldFN1cmZhY2UoKSB7CisKKyAgICBpZiAobV9zdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBtX3N1cmZhY2U7CisgICAgfQorCisgICAgLy8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgamF2YSBjbGFzcyBhbmQgaW5zdGFudGlhdGUgaXQKKyAgICBKTklFbnYqIGVudiA9IE5VTEw7CisgICAgaWYgKGdWTS0+R2V0RW52KCh2b2lkKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBnZXQgZW52Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW4uQmFja2dyb3VuZFN1cmZhY2UiOworICAgIGpjbGFzcyBiYWNrZ3JvdW5kQ2xhc3MgPSBnU3lzdGVtSS5sb2FkSmF2YUNsYXNzKGluc3QoKSwgY2xhc3NOYW1lKTsKKworICAgIGlmKCFiYWNrZ3JvdW5kQ2xhc3MpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0gZ2V0U3VyZmFjZTogZmFpbGVkIHRvIGxvYWQgY2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam1ldGhvZElEIGNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChiYWNrZ3JvdW5kQ2xhc3MsICI8aW5pdD4iLCAiKExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDspViIpOworICAgIGpvYmplY3QgYmFja2dyb3VuZFN1cmZhY2UgPSBlbnYtPk5ld09iamVjdChiYWNrZ3JvdW5kQ2xhc3MsIGNvbnN0cnVjdG9yLCBtX2NvbnRleHQpOworCisgICAgaWYoIWJhY2tncm91bmRTdXJmYWNlKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBjb25zdHJ1Y3Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1fc3VyZmFjZSA9IGVudi0+TmV3R2xvYmFsUmVmKGJhY2tncm91bmRTdXJmYWNlKTsKKyAgICByZXR1cm4gbV9zdXJmYWNlOworfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OmRlc3Ryb3lTdXJmYWNlKCkgeworICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICBpZiAobV9zdXJmYWNlICYmIGdWTS0+R2V0RW52KCh2b2lkKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgPT0gSk5JX09LKSB7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1fc3VyZmFjZSk7CisgICAgICAgIG1fc3VyZmFjZSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OmRyYXdQbHVnaW4oaW50IHN1cmZhY2VXaWR0aCwgaW50IHN1cmZhY2VIZWlnaHQpIHsKKworICAgIC8vIGdldCB0aGUgcGx1Z2luJ3MgZGltZW5zaW9ucyBhY2NvcmRpbmcgdG8gdGhlIERPTQorICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3QoKS0+cGRhdGE7CisgICAgY29uc3QgaW50IFcgPSBvYmotPndpbmRvdy0+d2lkdGg7CisgICAgY29uc3QgaW50IEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworCisgICAgLy8gY29tcHV0ZSB0aGUgY3VycmVudCB6b29tIGxldmVsCisgICAgY29uc3QgZmxvYXQgem9vbUZhY3RvclcgPSBzdGF0aWNfY2FzdDxmbG9hdD4oc3VyZmFjZVdpZHRoKSAvIFc7CisgICAgY29uc3QgZmxvYXQgem9vbUZhY3RvckggPSBzdGF0aWNfY2FzdDxmbG9hdD4oc3VyZmFjZUhlaWdodCkgLyBIOworCisgICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB6b29tIGxldmVsIGlzIHVuaWZvcm0KKyAgICBpZiAoem9vbUZhY3RvclcgKyAuMDEgPCB6b29tRmFjdG9ySCAmJiB6b29tRmFjdG9yVyAtIC4wMSA+IHpvb21GYWN0b3JIKQorICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHpvb20gaXMgb3V0IG9mIHN5bmMgKCVmLCVmKSIsCisgICAgICAgICAgICAgICAgICBpbnN0KCksIHpvb21GYWN0b3JXLCB6b29tRmFjdG9ySCk7CisKKyAgICAvLyBzY2FsZSB0aGUgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSB6b29tIGxldmVsCisgICAgY29uc3QgaW50IGZvbnRTaXplID0gKGludCkoem9vbUZhY3RvclcgKiAxNik7CisgICAgY29uc3QgaW50IGxlZnRNYXJnaW4gPSAoaW50KSh6b29tRmFjdG9yVyAqIDEwKTsKKworICAgIC8vIGxvY2sgdGhlIHN1cmZhY2UKKyAgICBBTlBCaXRtYXAgYml0bWFwOworICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICBpZiAoIW1fc3VyZmFjZSB8fCBnVk0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSyB8fAorICAgICAgICAhZ1N1cmZhY2VJLmxvY2soZW52LCBtX3N1cmZhY2UsICZiaXRtYXAsIE5VTEwpKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgdW5hYmxlIHRvIGxvY2sgdGhlIHBsdWdpbiIsIGluc3QoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYSBjYW52YXMKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKyAgICBnQ2FudmFzSS5kcmF3Q29sb3IoY2FudmFzLCAweEZGRkZGRkZGKTsKKworICAgIEFOUFBhaW50KiBwYWludCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKHBhaW50LCBnUGFpbnRJLmdldEZsYWdzKHBhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKHBhaW50LCAweEZGRkYwMDAwKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKHBhaW50LCBmb250U2l6ZSk7CisKKyAgICBBTlBUeXBlZmFjZSogdGYgPSBnVHlwZWZhY2VJLmNyZWF0ZUZyb21OYW1lKCJzZXJpZiIsIGtJdGFsaWNfQU5QVHlwZWZhY2VTdHlsZSk7CisgICAgZ1BhaW50SS5zZXRUeXBlZmFjZShwYWludCwgdGYpOworICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOworCisgICAgQU5QRm9udE1ldHJpY3MgZm07CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhwYWludCwgJmZtKTsKKworICAgIGdQYWludEkuc2V0Q29sb3IocGFpbnQsIDB4RkYwMDAwRkYpOworICAgIGNvbnN0IGNoYXIgY1tdID0gIlRoaXMgaXMgYSBiYWNrZ3JvdW5kIHBsdWdpbi4iOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgYywgc2l6ZW9mKGMpLTEsIGxlZnRNYXJnaW4sIC1mbS5mVG9wLCBwYWludCk7CisKKyAgICAvLyBjbGVhbiB1cCB2YXJpYWJsZXMgYW5kIHVubG9jayB0aGUgc3VyZmFjZQorICAgIGdQYWludEkuZGVsZXRlUGFpbnQocGFpbnQpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworICAgIGdTdXJmYWNlSS51bmxvY2soZW52LCBtX3N1cmZhY2UpOworfQorCitpbnQxNl90IEJhY2tncm91bmRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBkcmF3IGV2ZW50cyIsIGluc3QoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24pICB7CisgICAgICAgICAgICAgICAgY2FzZSBrT25Mb2FkX0FOUExpZmVjeWNsZUFjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBvbkxvYWQiLCBpbnN0KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBjYXNlIGtPblNjcmVlbl9BTlBMaWZlY3ljbGVBY3Rpb246CisgICAgICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgb25TY3JlZW4iLCBpbnN0KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBjYXNlIGtPZmZTY3JlZW5fQU5QTGlmZWN5Y2xlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIG9mZlNjcmVlbiIsIGluc3QoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7IC8vIGVuZCBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZQorICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoa0xvbmdQcmVzc19BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJvd3Nlci0+Z2V0dXJsKGluc3QoKSwgImphdmFzY3JpcHQ6YWxlcnQoJ0RldGVjdGVkIGxvbmcgcHJlc3MgZXZlbnQuJykiLCAwKTsKKyAgICAgICAgICAgICAgICBnV2luZG93SS5yZXF1ZXN0RnVsbFNjcmVlbihpbnN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa0RvdWJsZVRhcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKQorICAgICAgICAgICAgICAgIGJyb3dzZXItPmdldHVybChpbnN0KCksICJqYXZhc2NyaXB0OmFsZXJ0KCdEZXRlY3RlZCBkb3VibGUgdGFwIGV2ZW50LicpIiwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgdGhlIHBsdWdpbiBkaWQgbm90IHJlcXVlc3Qga2V5IGV2ZW50cyIsIGluc3QoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsgICAvLyB1bmtub3duIG9yIHVuaGFuZGxlZCBldmVudAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMT0dHSU5HIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2xvZ2dpbmcoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy9MT0dfRVJST1IoaW5zdGFuY2UsICIgLS0tLS0tICVwIFRlc3RpbmcgTG9nIEVycm9yIiwgaW5zdGFuY2UpOworICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBMb2cgRXJyb3IiLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGtXYXJuaW5nX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFRlc3RpbmcgTG9nIFdhcm5pbmciLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBEZWJ1ZyIsIGluc3RhbmNlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVElNRVIgVEVTVFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBUSU1FUl9JTlRFUlZBTCAgICAgNTAKK3N0YXRpYyB2b2lkIHRpbWVyX29uZXNob3QoTlBQIGluc3RhbmNlLCB1aW50MzJfdCB0aW1lcklEKTsKK3N0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfbmV2ZXJmaXJlcyhOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpOworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfdGltZXJzKCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vU2V0dXAgdGhlIHRlc3RpbmcgY291bnRlcnMKKyAgICBtVGltZXJSZXBlYXRDb3VudCA9IDU7CisgICAgbVRpbWVyTGF0ZW5jeUNvdW50ID0gNTsKKworICAgIC8vIHRlc3QgZm9yIGJvZ3VzIHRpbWVySUQKKyAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDk5OTk5OSk7CisgICAgLy8gdGVzdCBvbmUtc2hvdAorICAgIGJyb3dzZXItPnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDEwMCwgZmFsc2UsIHRpbWVyX29uZXNob3QpOworICAgIC8vIHRlc3QgcmVwZWF0CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgNTAsIHRydWUsIHRpbWVyX3JlcGVhdCk7CisgICAgLy8gdGVzdCB0aW1lciBsYXRlbmN5CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgVElNRVJfSU5URVJWQUwsIHRydWUsIHRpbWVyX2xhdGVuY3kpOworICAgIG1TdGFydFRpbWUgPSBtUHJldlRpbWUgPSBnZXRNU2VjcygpOworICAgIC8vIHRlc3QgdW5zY2hlZHVsZSBpbW1lZGlhdGVseQorICAgIHVpbnQzMl90IGlkID0gYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfbmV2ZXJmaXJlcyk7CisgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7CisgICAgLy8gdGVzdCBkb3VibGUgdW5zY2hlZHVsZSAoc2hvdWxkIGJlIG5vLW9wKQorICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgaWQpOworCit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX29uZXNob3QoTlBQIGluc3RhbmNlLCB1aW50MzJfdCB0aW1lcklEKSB7CisgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tLS0gb25lc2hvdCB0aW1lclxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpIHsKKyAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0tLSByZXBlYXQgdGltZXIgJWRcbiIsCisgICAgICAgICAgICAgIG9iai0+bVRpbWVyUmVwZWF0Q291bnQpOworICAgIGlmICgtLW9iai0+bVRpbWVyUmVwZWF0Q291bnQgPT0gMCkgeworICAgICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIHRpbWVySUQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGltZXJfbmV2ZXJmaXJlcyhOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpIHsKKyAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0tLSB0aW1lcl9uZXZlcmZpcmVzISEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpIHsKKyAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CisKKyAgICBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQgKz0gMTsKKworICAgIHVpbnQzMl90IG5vdyA9IGdldE1TZWNzKCk7CisgICAgdWludDMyX3QgaW50ZXJ2YWwgPSBub3cgLSBvYmotPm1QcmV2VGltZTsKKyAgICB1aW50MzJfdCBkdXIgPSBub3cgLSBvYmotPm1TdGFydFRpbWU7CisgICAgdWludDMyX3QgZXhwZWN0ZWREdXIgPSBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQgKiBUSU1FUl9JTlRFUlZBTDsKKyAgICBpbnQzMl90IGRyaWZ0ID0gZHVyIC0gZXhwZWN0ZWREdXI7CisgICAgaW50MzJfdCBhdmdEcmlmdCA9IGRyaWZ0IC8gb2JqLT5tVGltZXJMYXRlbmN5Q3VycmVudENvdW50OworCisgICAgb2JqLT5tUHJldlRpbWUgPSBub3c7CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsCisgICAgICAgICAgICAgICItLS0tLS0tLSBsYXRlbmN5IHRlc3Q6IFslM2RdIGludGVydmFsICVkIGV4cGVjdGVkICVkLCB0b3RhbCAlZCBleHBlY3RlZCAlZCwgZHJpZnQgJWQgYXZnICVkXG4iLAorICAgICAgICAgICAgICBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQsIGludGVydmFsLCBUSU1FUl9JTlRFUlZBTCwgZHVyLAorICAgICAgICAgICAgICBleHBlY3RlZER1ciwgZHJpZnQsIGF2Z0RyaWZ0KTsKKworICAgIGlmICgtLW9iai0+bVRpbWVyTGF0ZW5jeUNvdW50ID09IDApIHsKKyAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCB0aW1lcklEKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJJVE1BUCBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCB0ZXN0X2Zvcm1hdHMoTlBQIGluc3RhbmNlKTsKKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2JpdG1hcHMoKSB7CisgICAgdGVzdF9mb3JtYXRzKHRoaXMtPmluc3QoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfZm9ybWF0cyhOUFAgaW5zdGFuY2UpIHsKKworICAgIC8vIFRPRE8gcHVsbCBuYW1lcyBmcm9tIGVudW0gaW4gbnBhcGkgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZW0KKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgQU5QQml0bWFwRm9ybWF0IGZGb3JtYXQ7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICBmTmFtZTsKKyAgICB9IGdSZWNzW10gPSB7CisgICAgICAgIHsga1Vua25vd25fQU5QQml0bWFwRm9ybWF0LCAgICJ1bmtub3duIiB9LAorICAgICAgICB7IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0LCAiODg4OCIgfSwKKyAgICAgICAgeyBrUkdCXzU2NV9BTlBCaXRtYXBGb3JtYXQsICAgIjU2NSIgfSwKKyAgICB9OworCisgICAgQU5QUGl4ZWxQYWNraW5nIHBhY2tpbmc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9DT1VOVChnUmVjcyk7IGkrKykgeworICAgICAgICBpZiAoZ0JpdG1hcEkuZ2V0UGl4ZWxQYWNraW5nKGdSZWNzW2ldLmZGb3JtYXQsICZwYWNraW5nKSkgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICJwaXhlbCBmb3JtYXQgWyVkXSAlcyBoYXMgcGFja2luZyBBUkdCIFslZCAlZF0gWyVkICVkXSBbJWQgJWRdIFslZCAlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ1JlY3NbaV0uZkZvcm1hdCwgZ1JlY3NbaV0uZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5BU2hpZnQsIHBhY2tpbmcuQUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5SU2hpZnQsIHBhY2tpbmcuUkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5HU2hpZnQsIHBhY2tpbmcuR0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5CU2hpZnQsIHBhY2tpbmcuQkJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICJwaXhlbCBmb3JtYXQgWyVkXSAlcyBoYXMgbm8gcGFja2luZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBnUmVjc1tpXS5mRm9ybWF0LCBnUmVjc1tpXS5mTmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF9iaXRtYXBfdHJhbnNwYXJlbmN5KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvLyBjaGVjayBkZWZhdWx0ICYgc2V0IHRyYW5zcGFyZW50CisgICAgaWYgKCFtRmluaXNoZWRTdGFnZU9uZSkgeworCisgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIkJFR0lOOiB0ZXN0aW5nIGJpdG1hcCB0cmFuc3BhcmVuY3kiKTsKKworICAgICAgICAvL2NoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBub3QgdHJhbnNwYXJlbnQKKyAgICAgICAgaWYgKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLmZvcm1hdCA9PSBrUkdCQV84ODg4X0FOUEJpdG1hcEZvcm1hdCkgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRlZmF1bHQgZm9ybWF0IGlzIHRyYW5zcGFyZW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvL21ha2UgaXQgdHJhbnNwYXJlbnQgKGFueSBub24tbnVsbCB2YWx1ZSB3aWxsIHNldCBpdCB0byB0cnVlKQorICAgICAgICBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICAgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0YW5jZSwgTlBQVnBsdWdpblRyYW5zcGFyZW50Qm9vbCwgJnZhbHVlKTsKKyAgICAgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2V0dGluZyB0cmFuc3BhcmVuY3kuIik7CisgICAgICAgIH0KKworICAgICAgICBtRmluaXNoZWRTdGFnZU9uZSA9IHRydWU7CisgICAgICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKKyAgICB9CisgICAgLy8gY2hlY2sgdHJhbnNwYXJlbnQgJiBzZXQgb3BhcXVlCisgICAgZWxzZSBpZiAoIW1GaW5pc2hlZFN0YWdlVHdvKSB7CisKKyAgICAgICAgLy9jaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgdHJhbnNwYXJlbnQKKyAgICAgICAgaWYgKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLmZvcm1hdCAhPSBrUkdCQV84ODg4X0FOUEJpdG1hcEZvcm1hdCkgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRpZCBub3QgY2hhbmdlIHRvIHRyYW5zcGFyZW50IGZvcm1hdCIpOworICAgICAgICB9CisKKyAgICAgICAgLy9tYWtlIGl0IG9wYXF1ZQorICAgICAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBOUFBWcGx1Z2luVHJhbnNwYXJlbnRCb29sLCBOVUxMKTsKKyAgICAgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2V0dGluZyB0cmFuc3BhcmVuY3kuIik7CisgICAgICAgIH0KKworICAgICAgICBtRmluaXNoZWRTdGFnZVR3byA9IHRydWU7CisgICAgfQorICAgIC8vIGNoZWNrIG9wYXF1ZQorICAgIGVsc2UgaWYgKCFtRmluaXNoZWRTdGFnZVRocmVlKSB7CisKKyAgICAgICAgLy9jaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgbm90IHRyYW5zcGFyZW50CisgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgPT0ga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgImJpdG1hcCBkZWZhdWx0IGZvcm1hdCBpcyB0cmFuc3BhcmVudCIpOworICAgICAgICB9CisKKyAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiRU5EOiB0ZXN0aW5nIGJpdG1hcCB0cmFuc3BhcmVuY3kiKTsKKworICAgICAgICBtRmluaXNoZWRTdGFnZVRocmVlID0gdHJ1ZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERPTSBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfZG9tQWNjZXNzKCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBET00gQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBVbmFibGUgdG8gcmV0cmlldmUgRE9NIFdpbmRvdyIsIGluc3RhbmNlKTsKKworICAgIC8vIFJldHJpZXZlIGEgcHJvcGVydHkgZnJvbSB0aGUgcGx1Z2luJ3MgRE9NIG9iamVjdAorICAgIE5QSWRlbnRpZmllciB0b3BJZGVudGlmaWVyID0gYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcigidG9wIik7CisgICAgTlBWYXJpYW50IHRvcE9iamVjdFZhcmlhbnQ7CisgICAgYnJvd3Nlci0+Z2V0cHJvcGVydHkoaW5zdGFuY2UsIHdpbmRvd09iamVjdCwgdG9wSWRlbnRpZmllciwgJnRvcE9iamVjdFZhcmlhbnQpOworCisgICAgaWYgKHRvcE9iamVjdFZhcmlhbnQudHlwZSAhPSBOUFZhcmlhbnRUeXBlX09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBJbnZhbGlkIFZhcmlhbnQgdHlwZSBmb3IgRE9NIFByb3BlcnR5OiAlZCwlZCIsIGluc3RhbmNlLCB0b3BPYmplY3RWYXJpYW50LnR5cGUsIE5QVmFyaWFudFR5cGVfT2JqZWN0KTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBKQVZBU0NSSVBUIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2phdmFzY3JpcHQoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIEphdmFTY3JpcHQgQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBVbmFibGUgdG8gcmV0cmlldmUgRE9NIFdpbmRvdyIsIGluc3RhbmNlKTsKKworICAgIC8vIGNyZWF0ZSBhIHN0cmluZyAoSlMgY29kZSkgdGhhdCBpcyBzdG9yZWQgaW4gbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgYnJvd3NlcgorICAgIGNvbnN0IGNoYXIqIGpzU3RyaW5nID0gIjEyMDAgKyAzNCI7CisgICAgdm9pZCogc3RyaW5nTWVtID0gYnJvd3Nlci0+bWVtYWxsb2Moc3RybGVuKGpzU3RyaW5nKSk7CisgICAgbWVtY3B5KHN0cmluZ01lbSwganNTdHJpbmcsIHN0cmxlbihqc1N0cmluZykpOworCisgICAgLy8gZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBpbiB0aGUgcGx1Z2luJ3MgRE9NIG9iamVjdAorICAgIE5QU3RyaW5nIHNjcmlwdCA9IHsgKGNoYXIqKXN0cmluZ01lbSwgc3RybGVuKGpzU3RyaW5nKSB9OworICAgIE5QVmFyaWFudCBzY3JpcHRWYXJpYW50OworICAgIGlmICghYnJvd3Nlci0+ZXZhbHVhdGUoaW5zdGFuY2UsIHdpbmRvd09iamVjdCwgJnNjcmlwdCwgJnNjcmlwdFZhcmlhbnQpKQorICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFVuYWJsZSB0byBldmFsIHRoZSBKUy4iLCBpbnN0YW5jZSk7CisKKyAgICBpZiAoc2NyaXB0VmFyaWFudC50eXBlID09IE5QVmFyaWFudFR5cGVfSW50MzIpIHsKKyAgICAgICAgaWYgKHNjcmlwdFZhcmlhbnQudmFsdWUuaW50VmFsdWUgIT0gMTIzNCkKKyAgICAgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgSW52YWxpZCBWYWx1ZSBmb3IgSlMgUmV0dXJuOiAlZCwxMjM0IiwgaW5zdGFuY2UsIHNjcmlwdFZhcmlhbnQudmFsdWUuaW50VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgSW52YWxpZCBWYXJpYW50IHR5cGUgZm9yIEpTIFJldHVybjogJWQsJWQiLCBpbnN0YW5jZSwgc2NyaXB0VmFyaWFudC50eXBlLCBOUFZhcmlhbnRUeXBlX0ludDMyKTsKKyAgICB9CisKKyAgICAvLyBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHdpdGhpbiB0aGUgYnJvd3NlcgorICAgIGJyb3dzZXItPm1lbWZyZWUoc3RyaW5nTWVtKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTG9hZCBKYXZhIENsYXNzZXMgVGVzdHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBCYWNrZ3JvdW5kUGx1Z2luOjp0ZXN0X2xvYWRKYXZhQ2xhc3MoKSB7CisKKyAgICBKTklFbnYqIGVudiA9IE5VTEw7CisgICAgaWYgKGdWTS0+R2V0RW52KCh2b2lkKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIExvYWRKYXZhVGVzdDogZmFpbGVkIHRvIGdldCBlbnYiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW4uQmFja2dyb3VuZFRlc3QiOworICAgIGpjbGFzcyBiYWNrZ3JvdW5kQ2xhc3MgPSBnU3lzdGVtSS5sb2FkSmF2YUNsYXNzKGluc3QoKSwgY2xhc3NOYW1lKTsKKworICAgIGlmKCFiYWNrZ3JvdW5kQ2xhc3MpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0gTG9hZEphdmFUZXN0OiBmYWlsZWQgdG8gbG9hZCBjbGFzcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgam1ldGhvZElEIGNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChiYWNrZ3JvdW5kQ2xhc3MsICI8aW5pdD4iLCAiKClWIik7CisgICAgam1ldGhvZElEIGFkZE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoYmFja2dyb3VuZENsYXNzLCAiYWRkSW50IiwgIihJSSlJIik7CisgICAgam9iamVjdCBiYWNrZ3JvdW5kT2JqZWN0ID0gZW52LT5OZXdPYmplY3QoYmFja2dyb3VuZENsYXNzLCBjb25zdHJ1Y3Rvcik7CisKKyAgICBpZighYmFja2dyb3VuZE9iamVjdCkgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLSBMb2FkSmF2YVRlc3Q6IGZhaWxlZCB0byBjb25zdHJ1Y3Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChiYWNrZ3JvdW5kT2JqZWN0LCBhZGRNZXRob2QsIDIsIDIpOworCisgICAgaWYgKHJlc3VsdCAhPSA0KSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIExvYWRKYXZhVGVzdDogaW52YWxpZCByZXN1bHQgKCVkICE9IDQpIiwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIwNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIGJhY2tncm91bmRQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgYmFja2dyb3VuZFBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBCYWNrZ3JvdW5kUGx1Z2luIDogcHVibGljIFN1cmZhY2VTdWJQbHVnaW4geworcHVibGljOgorICAgIEJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpOworICAgIHZpcnR1YWwgfkJhY2tncm91bmRQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBqb2JqZWN0IGdldFN1cmZhY2UoKTsKKworICAgIC8vIFRpbWVyIFRlc3RpbmcgVmFyaWFibGVzCisgICAgdWludDMyX3QgbVN0YXJ0VGltZTsKKyAgICB1aW50MzJfdCBtUHJldlRpbWU7CisgICAgaW50ICAgICAgbVRpbWVyUmVwZWF0Q291bnQ7CisgICAgaW50ICAgICAgbVRpbWVyTGF0ZW5jeUNvdW50OworICAgIGludCAgICAgIG1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQ7CisKKyAgICAvLyBCaXRtYXAgVHJhbnNwYXJlbmN5IFZhcmlhYmxlcworICAgIGJvb2wgbUZpbmlzaGVkU3RhZ2VPbmU7ICAgLy8gY2hlY2sgZGVmYXVsdCAmIHNldCB0cmFuc3BhcmVudAorICAgIGJvb2wgbUZpbmlzaGVkU3RhZ2VUd287ICAgLy8gY2hlY2sgdHJhbnNwYXJlbnQgJiBzZXQgb3BhcXVlCisgICAgYm9vbCBtRmluaXNoZWRTdGFnZVRocmVlOyAvLyBjaGVjayBvcGFxdWUKKworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXdQbHVnaW4oaW50IHN1cmZhY2VXaWR0aCwgaW50IHN1cmZhY2VIZWlnaHQpOworICAgIHZvaWQgZGVzdHJveVN1cmZhY2UoKTsKKworICAgIGpvYmplY3QgICAgIG1fc3VyZmFjZTsKKworICAgIHZvaWQgdGVzdF9sb2dnaW5nKCk7CisgICAgdm9pZCB0ZXN0X3RpbWVycygpOworICAgIHZvaWQgdGVzdF9iaXRtYXBzKCk7CisgICAgdm9pZCB0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdm9pZCB0ZXN0X2RvbUFjY2VzcygpOworICAgIHZvaWQgdGVzdF9qYXZhc2NyaXB0KCk7CisgICAgdm9pZCB0ZXN0X2xvYWRKYXZhQ2xhc3MoKTsKKworfTsKKworI2VuZGlmIC8vIGJhY2tncm91bmRQbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBhZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIkZvcm1QbHVnaW4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiAgICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgICBnQ2FudmFzSTsKK2V4dGVybiBBTlBQYWludEludGVyZmFjZVYwICAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBUeXBlZmFjZUludGVyZmFjZVYwICAgZ1R5cGVmYWNlSTsKK2V4dGVybiBBTlBXaW5kb3dJbnRlcmZhY2VWMCAgICAgZ1dpbmRvd0k7CisKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CisgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICAgIGl4ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgeworICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7CisKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBOUFJlY3QgaW52YWw7CisgICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOworICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7CisgICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOworICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Zvcm1QbHVnaW46OkZvcm1QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1faGFzRm9jdXMgPSBmYWxzZTsKKyAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKworICAgIG1lbXNldCgmbV91c2VybmFtZUlucHV0LCAwLCBzaXplb2YobV91c2VybmFtZUlucHV0KSk7CisgICAgbWVtc2V0KCZtX3Bhc3N3b3JkSW5wdXQsIDAsIHNpemVvZihtX3Bhc3N3b3JkSW5wdXQpKTsKKworICAgIG1fdXNlcm5hbWVJbnB1dC50ZXh0WzBdID0gJ1wwJzsKKyAgICBtX3VzZXJuYW1lSW5wdXQuY2hhclB0ciA9IDA7CisKKyAgICBtX3Bhc3N3b3JkSW5wdXQudGV4dFswXSA9ICdcMCc7CisgICAgbV9wYXNzd29yZElucHV0LmNoYXJQdHIgPSAwOworCisgICAgbV9wYWludElucHV0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludElucHV0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRJbnB1dCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50SW5wdXQsIDB4RkZGRkZGRkYpOworCisgICAgbV9wYWludEFjdGl2ZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmUsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZSkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50QWN0aXZlLCAweEZGRkZGRjAwKTsKKworICAgIG1fcGFpbnRUZXh0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRleHQsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFRleHQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFRleHQsIDB4RkYwMDAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludFRleHQsIDE4KTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRUZXh0LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciBrZXkgYW5kIHZpc2libGVSZWN0IGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrS2V5X0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworRm9ybVBsdWdpbjo6fkZvcm1QbHVnaW4oKSB7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50SW5wdXQpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludEFjdGl2ZSk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50VGV4dCk7Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6c3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsIG1vZGVsKSB7CisgICAgcmV0dXJuIChtb2RlbCA9PSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6ZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApIHsKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKworICAgIEFOUFJlY3RGIGNsaXBSOworICAgIGNsaXBSLmxlZnQgPSBjbGlwLmxlZnQ7CisgICAgY2xpcFIudG9wID0gY2xpcC50b3A7CisgICAgY2xpcFIucmlnaHQgPSBjbGlwLnJpZ2h0OworICAgIGNsaXBSLmJvdHRvbSA9IGNsaXAuYm90dG9tOworICAgIGdDYW52YXNJLmNsaXBSZWN0KGNhbnZhcywgJmNsaXBSKTsKKworICAgIGRyYXcoY2FudmFzKTsKKyAgICBnQ2FudmFzSS5kZWxldGVDYW52YXMoY2FudmFzKTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGNvbnN0IGZsb2F0IGlucHV0V2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEhlaWdodCA9IDMwOworICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKworICAgIC8vIGNvbG9yIHRoZSBwbHVnaW4gY2FudmFzCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgKG1faGFzRm9jdXMpID8gMHhGRkNEQ0RDRCA6IDB4RkY1NDU0NTQpOworCisgICAgLy8gZHJhdyB0aGUgdXNlcm5hbWUgYm94ICg1IHB4IGZyb20gdGhlIHRvcCBlZGdlKQorICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LmxlZnQgPSA1OworICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCA9IDU7CisgICAgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3VzZXJuYW1lSW5wdXQucmVjdC5ib3R0b20gPSBtX3VzZXJuYW1lSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3VzZXJuYW1lSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fdXNlcm5hbWVJbnB1dCkpOworICAgIGRyYXdUZXh0KGNhbnZhcywgbV91c2VybmFtZUlucHV0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhc3N3b3JkIGJveCAoNSBweCBmcm9tIHRoZSBib3R0b20gZWRnZSkKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ID0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgPSBIIC0gKGlucHV0SGVpZ2h0ICsgNSk7CisgICAgbV9wYXNzd29yZElucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5ib3R0b20gPSBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3Bhc3N3b3JkSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fcGFzc3dvcmRJbnB1dCkpOworICAgIGRyYXdQYXNzd29yZChjYW52YXMsIG1fcGFzc3dvcmRJbnB1dCk7CisKKyAgICAvL2ludmFsaWRhdGUgdGhlIGNhbnZhcworICAgIC8vaW52YWwoaW5zdGFuY2UpOworfQorCitBTlBQYWludCogRm9ybVBsdWdpbjo6Z2V0UGFpbnQoVGV4dElucHV0KiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVJbnB1dCkgPyBtX3BhaW50QWN0aXZlIDogbV9wYWludElucHV0OworfQorCit2b2lkIEZvcm1QbHVnaW46OmRyYXdUZXh0KEFOUENhbnZhcyogY2FudmFzLCBUZXh0SW5wdXQgdGV4dElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgdGV4dElucHV0LnRleHQsIHRleHRJbnB1dC5jaGFyUHRyLAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmJvdHRvbSAtIGZvbnRNZXRyaWNzLmZCb3R0b20sIG1fcGFpbnRUZXh0KTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3UGFzc3dvcmQoQU5QQ2FudmFzKiBjYW52YXMsIFRleHRJbnB1dCBwYXNzd29yZElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIC8vIGNvbXB1dCB0aGUgY2lyY2xlIGRpbWVuc2lvbnMgYW5kIGluaXRpYWwgbG9jYXRpb24KKyAgICBmbG9hdCBpbml0aWFsWCA9IHBhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICsgNTsKKyAgICBmbG9hdCBvdmFsQm90dG9tID0gcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSAtIDI7CisgICAgZmxvYXQgb3ZhbFRvcCA9IG92YWxCb3R0b20gLSAoZm9udE1ldHJpY3MuZkJvdHRvbSAtIGZvbnRNZXRyaWNzLmZUb3ApOworICAgIGZsb2F0IG92YWxXaWR0aCA9IG92YWxCb3R0b20gLSBvdmFsVG9wOworICAgIGZsb2F0IG92YWxTcGFjaW5nID0gMzsKKworICAgIC8vIGRyYXcgY2lyY2xlcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgdGV4dAorICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBwYXNzd29yZElucHV0LmNoYXJQdHI7IHgrKykgeworICAgICAgICBBTlBSZWN0RiBvdmFsOworICAgICAgICBvdmFsLmxlZnQgPSBpbml0aWFsWCArICgob3ZhbFdpZHRoICsgb3ZhbFNwYWNpbmcpICogKGZsb2F0KSB4KTsKKyAgICAgICAgb3ZhbC5yaWdodCA9IG92YWwubGVmdCArIG92YWxXaWR0aDsKKyAgICAgICAgb3ZhbC50b3AgPSBvdmFsVG9wOworICAgICAgICBvdmFsLmJvdHRvbSA9IG92YWxCb3R0b207CisgICAgICAgIGdDYW52YXNJLmRyYXdPdmFsKGNhbnZhcywgJm92YWwsIG1fcGFpbnRUZXh0KTsKKyAgICB9Cit9CisKK2ludDE2X3QgRm9ybVBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEubGlmZWN5Y2xlLmFjdGlvbiA9PSBrTG9zZUZvY3VzX0FOUExpZmVjeWNsZUFjdGlvbikgeworICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBMb29zaW5nIEZvY3VzIiwgaW5zdGFuY2UpOworCisgICAgICAgICAgICAgICAgaWYgKG1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSB0aGUga2V5Ym9hcmQKKyAgICAgICAgICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9yZXNldCB0aGUgYWN0aXZlSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgbV9hY3RpdmVJbnB1dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbV9oYXNGb2N1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uID09IGtHYWluRm9jdXNfQU5QTGlmZWN5Y2xlQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIEdhaW5pbmcgRm9jdXMiLCBpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgbV9oYXNGb2N1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOiB7CisKKyAgICAgICAgICAgIGludCB4ID0gZXZ0LT5kYXRhLm1vdXNlLng7CisgICAgICAgICAgICBpbnQgeSA9IGV2dC0+ZGF0YS5tb3VzZS55OworICAgICAgICAgICAgaWYgKGtEb3duX0FOUE1vdXNlQWN0aW9uID09IGV2dC0+ZGF0YS5tb3VzZS5hY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIFRleHRJbnB1dCogY3VycmVudElucHV0ID0gdmFsaWRUYXAoeCx5KTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9hY3RpdmVJbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudElucHV0ICE9IG1fYWN0aXZlSW5wdXQpCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaEFjdGl2ZUlucHV0KGN1cnJlbnRJbnB1dCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5LmFjdGlvbiA9PSBrRG93bl9BTlBLZXlBY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIC8vaGFuZGxlIG5hdmlnYXRpb24ga2V5cworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPj0ga0RwYWRVcF9BTlBLZXlDb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPD0ga0RwYWRDZW50ZXJfQU5QS2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlTmF2aWdhdGlvbihldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dElucHV0KG1fYWN0aXZlSW5wdXQsIGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudW5pY2hhcik7CisgICAgICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c3dpdGNoQWN0aXZlSW5wdXQoVGV4dElucHV0KiBuZXdJbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG9sZAorICAgICAgICBnV2luZG93SS5jbGVhclZpc2libGVSZWN0cyhpbnN0YW5jZSk7CisgICAgfQorCisgICAgbV9hY3RpdmVJbnB1dCA9IG5ld0lucHV0OyAvLyBzZXQgdGhlIG5ldyBhY3RpdmUgaW5wdXQKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG5ldworICAgICAgICBzY3JvbGxJbnRvVmlldyhtX2FjdGl2ZUlucHV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6aGFuZGxlTmF2aWdhdGlvbihBTlBLZXlDb2RlIGtleUNvZGUpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tJXAgUmVjdmQgTmF2IEtleSAlZCIsIGluc3RhbmNlLCBrZXlDb2RlKTsKKworICAgIGlmICghbV9hY3RpdmVJbnB1dCkgeworICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIHRydWUpOworICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dCgmbV91c2VybmFtZUlucHV0KTsKKyAgICB9CisgICAgZWxzZSBpZiAobV9hY3RpdmVJbnB1dCA9PSAmbV91c2VybmFtZUlucHV0KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IGtEcGFkRG93bl9BTlBLZXlDb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dCgmbV9wYXNzd29yZElucHV0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09IGtEcGFkQ2VudGVyX0FOUEtleUNvZGUpCisgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIGZhbHNlKTsKKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZFVwX0FOUEtleUNvZGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKG1fYWN0aXZlSW5wdXQgPT0gJm1fcGFzc3dvcmRJbnB1dCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBrRHBhZFVwX0FOUEtleUNvZGUpIHsKKyAgICAgICAgICAgIHN3aXRjaEFjdGl2ZUlucHV0KCZtX3VzZXJuYW1lSW5wdXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT0ga0RwYWRDZW50ZXJfQU5QS2V5Q29kZSkKKyAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgZmFsc2UpOworICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09IGtEcGFkRG93bl9BTlBLZXlDb2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvcm1QbHVnaW46OmhhbmRsZVRleHRJbnB1dChUZXh0SW5wdXQqIGlucHV0LCBBTlBLZXlDb2RlIGtleUNvZGUsIGludDMyX3QgdW5pY2hhcikgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vbWFrZSBzdXJlIHRoZSBpbnB1dCBmaWVsZCBpcyBpbiB2aWV3CisgICAgc2Nyb2xsSW50b1ZpZXcoaW5wdXQpOworCisgICAgLy9oYW5kbGUgdGhlIGRlbGV0ZSBvcGVyYXRpb24KKyAgICBpZiAoa2V5Q29kZSA9PSBrRGVsX0FOUEtleUNvZGUpIHsKKyAgICAgICAgaWYgKGlucHV0LT5jaGFyUHRyID4gMCkgeworICAgICAgICAgICAgaW5wdXQtPmNoYXJQdHItLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9jaGVjayB0byBzZWUgdGhhdCB0aGUgaW5wdXQgaXMgbm90IGZ1bGwKKyAgICBpZiAoaW5wdXQtPmNoYXJQdHIgPj0gKHNpemVvZihpbnB1dC0+dGV4dCkgLSAxKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy9hZGQgdGhlIGNoYXJhY3RlcgorICAgIGlucHV0LT50ZXh0W2lucHV0LT5jaGFyUHRyXSA9IHN0YXRpY19jYXN0PGNoYXI+KHVuaWNoYXIpOworICAgIGlucHV0LT5jaGFyUHRyKys7CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tJXAgVGV4dDogICVjIiwgaW5zdGFuY2UsIHVuaWNoYXIpOworfQorCit2b2lkIEZvcm1QbHVnaW46OnNjcm9sbEludG9WaWV3KFRleHRJbnB1dCogaW5wdXQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworICAgIE5QV2luZG93ICp3aW5kb3cgPSBvYmotPndpbmRvdzsKKworICAgIC8vIGZpbmQgdGhlIHRleHRJbnB1dCdzIGdsb2JhbCByZWN0IGNvb3JkaW5hdGVzCisgICAgQU5QUmVjdEkgdmlzaWJsZVJlY3RzWzFdOworICAgIHZpc2libGVSZWN0c1swXS5sZWZ0ID0gaW5wdXQtPnJlY3QubGVmdDsKKyAgICB2aXNpYmxlUmVjdHNbMF0udG9wID0gaW5wdXQtPnJlY3QudG9wOworICAgIHZpc2libGVSZWN0c1swXS5yaWdodCA9IGlucHV0LT5yZWN0LnJpZ2h0OworICAgIHZpc2libGVSZWN0c1swXS5ib3R0b20gPSBpbnB1dC0+cmVjdC5ib3R0b207CisKKyAgICBnV2luZG93SS5zZXRWaXNpYmxlUmVjdHMoaW5zdGFuY2UsIHZpc2libGVSZWN0cywgMSk7Cit9CisKK1RleHRJbnB1dCogRm9ybVBsdWdpbjo6dmFsaWRUYXAoaW50IHgsIGludCB5KSB7CisKKyAgICBpZiAoeCA+IG1fdXNlcm5hbWVJbnB1dC5yZWN0LmxlZnQgJiYgeCA8IG1fdXNlcm5hbWVJbnB1dC5yZWN0LnJpZ2h0ICYmCisgICAgICAgIHkgPiBtX3VzZXJuYW1lSW5wdXQucmVjdC50b3AgJiYgeSA8IG1fdXNlcm5hbWVJbnB1dC5yZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3VzZXJuYW1lSW5wdXQ7CisgICAgZWxzZSBpZiAoeCA+bV9wYXNzd29yZElucHV0LnJlY3QubGVmdCAmJiB4IDwgbV9wYXNzd29yZElucHV0LnJlY3QucmlnaHQgJiYKKyAgICAgICAgICAgICB5ID4gbV9wYXNzd29yZElucHV0LnJlY3QudG9wICYmIHkgPCBtX3Bhc3N3b3JkSW5wdXQucmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9wYXNzd29yZElucHV0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk4NWEzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIGZvcm1QbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgZm9ybVBsdWdpbl9fREVGSU5FRAorCitzdHJ1Y3QgVGV4dElucHV0IHsKKyAgICBBTlBSZWN0RiAgICByZWN0OworICAgIGNoYXIgICAgICAgIHRleHRbMzBdOworICAgIHVpbnQzMl90ICAgIGNoYXJQdHI7Cit9OworCitjbGFzcyBGb3JtUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgRm9ybVBsdWdpbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+Rm9ybVBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgYm9vbCAgICAgICAgbV9oYXNGb2N1czsKKworICAgIFRleHRJbnB1dCogIG1fYWN0aXZlSW5wdXQ7CisgICAgVGV4dElucHV0ICAgbV91c2VybmFtZUlucHV0OworICAgIFRleHRJbnB1dCAgIG1fcGFzc3dvcmRJbnB1dDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRJbnB1dDsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUZXh0OworCisgICAgQU5QUmVjdEkgICAgbV92aXNpYmxlUmVjdDsKKworICAgIHZvaWQgZHJhd1RleHQoQU5QQ2FudmFzKiwgVGV4dElucHV0KTsKKyAgICB2b2lkIGRyYXdQYXNzd29yZChBTlBDYW52YXMqLCBUZXh0SW5wdXQpOworCisgICAgYm9vbCBoYW5kbGVOYXZpZ2F0aW9uKEFOUEtleUNvZGUga2V5Q29kZSk7CisgICAgdm9pZCBoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpOworICAgIHZvaWQgc2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCk7CisgICAgdm9pZCBzd2l0Y2hBY3RpdmVJbnB1dChUZXh0SW5wdXQqIGlucHV0KTsKKworICAgIEFOUFBhaW50KiBnZXRQYWludChUZXh0SW5wdXQqKTsKKyAgICBUZXh0SW5wdXQqIHZhbGlkVGFwKGludCB4LCBpbnQgeSk7CisKK307CisKKyNlbmRpZiAvLyBmb3JtUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2puaS1icmlkZ2UuY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9qbmktYnJpZGdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmE4YTMyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9qbmktYnJpZGdlLmNwcApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8Sk5JSGVscC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisKK2V4dGVybiBBTlBFdmVudEludGVyZmFjZVYwICAgICAgICAgZ0V2ZW50STsKKworc3RhdGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCBucHAsIGpvYmplY3Qgc3VyZmFjZSkgeworCisgICAgLy8gc2VuZCBjdXN0b20gZXZlbnQKKyAgICBBTlBFdmVudCBldmVudDsKKyAgICBldmVudC5pblNpemUgPSBzaXplb2YoQU5QRXZlbnQpOworICAgIGV2ZW50LmV2ZW50VHlwZSA9IGtDdXN0b21fQU5QRXZlbnRUeXBlOworICAgIGV2ZW50LmRhdGEub3RoZXJbMF0gPSBrU3VyZmFjZUNyZWF0ZWRfQ3VzdG9tRXZlbnQ7CisKKyAgICBnRXZlbnRJLnBvc3RFdmVudCgoTlBQKW5wcCwgJmV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCBucHAsIGppbnQgZm9ybWF0LCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkgeworICAgIC8vIHNlbmQgY3VzdG9tIGV2ZW50CisgICAgQU5QRXZlbnQgZXZlbnQ7CisgICAgZXZlbnQuaW5TaXplID0gc2l6ZW9mKEFOUEV2ZW50KTsKKyAgICBldmVudC5ldmVudFR5cGUgPSBrQ3VzdG9tX0FOUEV2ZW50VHlwZTsKKyAgICBldmVudC5kYXRhLm90aGVyWzBdID0ga1N1cmZhY2VDaGFuZ2VkX0N1c3RvbUV2ZW50OworICAgIGV2ZW50LmRhdGEub3RoZXJbMV0gPSB3aWR0aDsKKyAgICBldmVudC5kYXRhLm90aGVyWzJdID0gaGVpZ2h0OworCisgICAgZ0V2ZW50SS5wb3N0RXZlbnQoKE5QUClucHAsICZldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgamludCBucHApIHsKKyAgICAvLyBzZW5kIGN1c3RvbSBldmVudAorICAgIEFOUEV2ZW50IGV2ZW50OworICAgIGV2ZW50LmluU2l6ZSA9IHNpemVvZihBTlBFdmVudCk7CisgICAgZXZlbnQuZXZlbnRUeXBlID0ga0N1c3RvbV9BTlBFdmVudFR5cGU7CisgICAgZXZlbnQuZGF0YS5vdGhlclswXSA9IGtTdXJmYWNlRGVzdHJveWVkX0N1c3RvbUV2ZW50OworCisgICAgZ0V2ZW50SS5wb3N0RXZlbnQoKE5QUClucHAsICZldmVudCk7Cit9CisKKy8qCisgKiBKTkkgcmVnaXN0cmF0aW9uLgorICovCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdQYWludFN1cmZhY2VNZXRob2RzW10gPSB7CisgICAgeyAibmF0aXZlU3VyZmFjZUNyZWF0ZWQiLCAiKEkpViIsICh2b2lkKikgc3VyZmFjZUNyZWF0ZWQgfSwKKyAgICB7ICJuYXRpdmVTdXJmYWNlQ2hhbmdlZCIsICIoSUlJSSlWIiwgKHZvaWQqKSBzdXJmYWNlQ2hhbmdlZCB9LAorICAgIHsgIm5hdGl2ZVN1cmZhY2VEZXN0cm95ZWQiLCAiKEkpViIsICh2b2lkKikgc3VyZmFjZURlc3Ryb3llZCB9LAorfTsKKworRVhQT1JUIGppbnQgSk5JX09uTG9hZChKYXZhVk0qIHZtLCB2b2lkKiByZXNlcnZlZCkgeworCisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworCisgICAgaWYgKHZtLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSAhPSBKTklfT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vUGFpbnRTdXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1BhaW50U3VyZmFjZU1ldGhvZHMsIE5FTEVNKGdQYWludFN1cmZhY2VNZXRob2RzKSk7CisKKyAgICByZXR1cm4gSk5JX1ZFUlNJT05fMV80OworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1NDg0OAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSAiQW5pbWF0aW9uUGx1Z2luLmgiCisjaW5jbHVkZSAiQXVkaW9QbHVnaW4uaCIKKyNpbmNsdWRlICJCYWNrZ3JvdW5kUGx1Z2luLmgiCisjaW5jbHVkZSAiRm9ybVBsdWdpbi5oIgorI2luY2x1ZGUgIk5hdmlnYXRpb25QbHVnaW4uaCIKKyNpbmNsdWRlICJQYWludFBsdWdpbi5oIgorI2luY2x1ZGUgIlZpZGVvUGx1Z2luLmgiCisKK05QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKK0phdmFWTSogZ1ZNOworCisjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKKyAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CitOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKK05QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOworTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAorICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CitOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKK2ludDMyX3QgICBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOworaW50MzJfdCAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwKKyAgICAgICAgdm9pZCogYnVmZmVyKTsKK3ZvaWQgICAgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKTsKK3ZvaWQgICAgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwordm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCisgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOworTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOworTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOworCitleHRlcm4gIkMiIHsKK0VYUE9SVCBOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2Vudik7CitFWFBPUlQgTlBFcnJvciBOUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CitFWFBPUlQgY29uc3QgY2hhciogTlBfR2V0TUlNRURlc2NyaXB0aW9uKHZvaWQpOworRVhQT1JUIHZvaWQgTlBfU2h1dGRvd24odm9pZCk7Cit9OworCitBTlBBdWRpb1RyYWNrSW50ZXJmYWNlVjAgICAgZ1NvdW5kSTsKK0FOUEJpdG1hcEludGVyZmFjZVYwICAgICAgICBnQml0bWFwSTsKK0FOUENhbnZhc0ludGVyZmFjZVYwICAgICAgICBnQ2FudmFzSTsKK0FOUEV2ZW50SW50ZXJmYWNlVjAgICAgICAgICBnRXZlbnRJOworQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgICAgIGdMb2dJOworQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgICAgIGdQYWludEk7CitBTlBQYXRoSW50ZXJmYWNlVjAgICAgICAgICAgZ1BhdGhJOworQU5QU3VyZmFjZUludGVyZmFjZVYwICAgICAgIGdTdXJmYWNlSTsKK0FOUFN5c3RlbUludGVyZmFjZVYwICAgICAgICBnU3lzdGVtSTsKK0FOUFR5cGVmYWNlSW50ZXJmYWNlVjAgICAgICBnVHlwZWZhY2VJOworQU5QV2luZG93SW50ZXJmYWNlVjEgICAgICAgIGdXaW5kb3dJOworQU5QT3BlbkdMSW50ZXJmYWNlVjAgICAgICAgIGdPcGVuR0xJOworCisjZGVmaW5lIEFSUkFZX0NPVU5UKGFycmF5KSAgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKKyNkZWZpbmUgREVCVUdfUExVR0lOX0VWRU5UUyAgICAgMAorCitOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2VudikKK3sKKyAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZ1bmN0aW9uIHRhYmxlIGVxdWFsIG9yIGxhcmdlciB0aGFuIHdlIGFyZSBidWlsdCBhZ2FpbnN0LgorICAgIGlmIChicm93c2VyRnVuY3MtPnNpemUgPCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSkgeworICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmdW5jdGlvbiB0YWJsZSAoc3RydWN0dXJlKQorICAgIGJyb3dzZXIgPSAoTlBOZXRzY2FwZUZ1bmNzKikgbWFsbG9jKHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKKyAgICBtZW1jcHkoYnJvd3NlciwgYnJvd3NlckZ1bmNzLCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7CisKKyAgICAvLyBCdWlsZCB0aGUgcGx1Z2luIGZ1bmN0aW9uIHRhYmxlCisgICAgcGx1Z2luRnVuY3MtPnZlcnNpb24gPSAxMTsKKyAgICBwbHVnaW5GdW5jcy0+c2l6ZSA9IHNpemVvZihwbHVnaW5GdW5jcyk7CisgICAgcGx1Z2luRnVuY3MtPm5ld3AgPSBOUFBfTmV3OworICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95ID0gTlBQX0Rlc3Ryb3k7CisgICAgcGx1Z2luRnVuY3MtPnNldHdpbmRvdyA9IE5QUF9TZXRXaW5kb3c7CisgICAgcGx1Z2luRnVuY3MtPm5ld3N0cmVhbSA9IE5QUF9OZXdTdHJlYW07CisgICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3lzdHJlYW0gPSBOUFBfRGVzdHJveVN0cmVhbTsKKyAgICBwbHVnaW5GdW5jcy0+YXNmaWxlID0gTlBQX1N0cmVhbUFzRmlsZTsKKyAgICBwbHVnaW5GdW5jcy0+d3JpdGVyZWFkeSA9IE5QUF9Xcml0ZVJlYWR5OworICAgIHBsdWdpbkZ1bmNzLT53cml0ZSA9IChOUFBfV3JpdGVQcm9jUHRyKU5QUF9Xcml0ZTsKKyAgICBwbHVnaW5GdW5jcy0+cHJpbnQgPSBOUFBfUHJpbnQ7CisgICAgcGx1Z2luRnVuY3MtPmV2ZW50ID0gTlBQX0hhbmRsZUV2ZW50OworICAgIHBsdWdpbkZ1bmNzLT51cmxub3RpZnkgPSBOUFBfVVJMTm90aWZ5OworICAgIHBsdWdpbkZ1bmNzLT5nZXR2YWx1ZSA9IE5QUF9HZXRWYWx1ZTsKKyAgICBwbHVnaW5GdW5jcy0+c2V0dmFsdWUgPSBOUFBfU2V0VmFsdWU7CisKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgTlBOVmFyaWFibGUgICAgIHY7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBzaXplOworICAgICAgICBBTlBJbnRlcmZhY2UqICAgaTsKKyAgICB9IGdQYWlyc1tdID0geworICAgICAgICB7IGtBdWRpb1RyYWNrSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgc2l6ZW9mKGdTb3VuZEkpLCAgICAmZ1NvdW5kSSB9LAorICAgICAgICB7IGtCaXRtYXBJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgc2l6ZW9mKGdCaXRtYXBJKSwgICAmZ0JpdG1hcEkgfSwKKyAgICAgICAgeyBrQ2FudmFzSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnQ2FudmFzSSksICAgJmdDYW52YXNJIH0sCisgICAgICAgIHsga0V2ZW50SW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICBzaXplb2YoZ0V2ZW50SSksICAgICZnRXZlbnRJIH0sCisgICAgICAgIHsga0xvZ0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgICBzaXplb2YoZ0xvZ0kpLCAgICAgICZnTG9nSSB9LAorICAgICAgICB7IGtQYWludEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgc2l6ZW9mKGdQYWludEkpLCAgICAmZ1BhaW50SSB9LAorICAgICAgICB7IGtQYXRoSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICAgc2l6ZW9mKGdQYXRoSSksICAgICAmZ1BhdGhJIH0sCisgICAgICAgIHsga1N1cmZhY2VJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICBzaXplb2YoZ1N1cmZhY2VJKSwgICZnU3VyZmFjZUkgfSwKKyAgICAgICAgeyBrU3lzdGVtSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnU3lzdGVtSSksICAgJmdTeXN0ZW1JIH0sCisgICAgICAgIHsga1R5cGVmYWNlSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICBzaXplb2YoZ1R5cGVmYWNlSSksICZnVHlwZWZhY2VJIH0sCisgICAgICAgIHsga1dpbmRvd0ludGVyZmFjZVYxX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ1dpbmRvd0kpLCAgICZnV2luZG93SSB9LAorICAgICAgICB7IGtPcGVuR0xJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgc2l6ZW9mKGdPcGVuR0xJKSwgICAmZ09wZW5HTEkgfSwKKyAgICB9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfQ09VTlQoZ1BhaXJzKTsgaSsrKSB7CisgICAgICAgIGdQYWlyc1tpXS5pLT5pblNpemUgPSBnUGFpcnNbaV0uc2l6ZTsKKyAgICAgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5nZXR2YWx1ZShOVUxMLCBnUGFpcnNbaV0udiwgZ1BhaXJzW2ldLmkpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RvcmUgdGhlIEphdmFWTSBmb3IgdGhlIHBsdWdpbgorICAgIEpOSUVudiogZW52ID0gKEpOSUVudiopamF2YV9lbnY7CisgICAgZW52LT5HZXRKYXZhVk0oJmdWTSk7CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK3ZvaWQgTlBfU2h1dGRvd24odm9pZCkKK3sKKworfQorCitjb25zdCBjaGFyICpOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW46dHN0OlRlc3QgcGx1Z2luIG1pbWV0eXBlIGlzIGFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW4iOworfQorCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKKyAgICAgICAgICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKQoreworCisgICAgLyogQkVHSU46IFNUQU5EQVJEIFBMVUdJTiBGUkFNRVdPUksgKi8KKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IE5VTEw7CisKKyAgICAvLyBTY3JpcHRpbmcgZnVuY3Rpb25zIGFwcGVhcmVkIGluIE5QQVBJIHZlcnNpb24gMTQKKyAgICBpZiAoYnJvd3Nlci0+dmVyc2lvbiA+PSAxNCkgeworICAgICAgICBpbnN0YW5jZS0+cGRhdGEgPSBicm93c2VyLT5jcmVhdGVvYmplY3QgKGluc3RhbmNlLCBnZXRQbHVnaW5DbGFzcygpKTsKKyAgICAgICAgb2JqID0gc3RhdGljX2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0gMDsKKyAgICB9CisgICAgLyogRU5EOiBTVEFOREFSRCBQTFVHSU4gRlJBTUVXT1JLICovCisKKyAgICAvLyBzZWxlY3QgdGhlIGRyYXdpbmcgbW9kZWwgYmFzZWQgb24gdXNlciBpbnB1dAorICAgIEFOUERyYXdpbmdNb2RlbCBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIkRyYXdpbmdNb2RlbCIpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQml0bWFwIikpIHsKKyAgICAgICAgICAgICAgICBtb2RlbCA9IGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiU3VyZmFjZSIpKSB7CisgICAgICAgICAgICAgICBtb2RlbCA9IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIk9wZW5HTCIpKSB7CisgICAgICAgICAgICAgICBtb2RlbCA9IGtPcGVuR0xfQU5QRHJhd2luZ01vZGVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tICVwIERyYXdpbmdNb2RlbCBpcyAlZCIsIGluc3RhbmNlLCBtb2RlbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdGlmeSB0aGUgcGx1Z2luIEFQSSBvZiB0aGUgZHJhd2luZyBtb2RlbCB3ZSB3aXNoIHRvIHVzZS4gVGhpcyBtdXN0IGJlCisgICAgLy8gZG9uZSBwcmlvciB0byBjcmVhdGluZyBjZXJ0YWluIHN1YlBsdWdpbiBvYmplY3RzIChlLmcuIHN1cmZhY2VWaWV3cykKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBrUmVxdWVzdERyYXdpbmdNb2RlbF9BTlBTZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihtb2RlbCkpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAicmVxdWVzdCBtb2RlbCAlZCBlcnIgJWQiLCBtb2RlbCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gZ1N5c3RlbUkuZ2V0QXBwbGljYXRpb25EYXRhRGlyZWN0b3J5KCk7CisgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiQXBwbGljYXRpb24gZGF0YSBkaXIgaXMgJXMiLCBwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJDYW4ndCBmaW5kIEFwcGxpY2F0aW9uIGRhdGEgZGlyIik7CisgICAgfQorCisgICAgLy8gc2VsZWN0IHRoZSBwbHVnaW5UeXBlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIlBsdWdpblR5cGUiKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIkFuaW1hdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEJhbGxBbmltYXRpb24oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQXVkaW8iKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtBdWRpb19QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEF1ZGlvUGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIkJhY2tncm91bmQiKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtCYWNrZ3JvdW5kX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgQmFja2dyb3VuZFBsdWdpbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJGb3JtIikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrRm9ybV9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEZvcm1QbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiTmF2aWdhdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga05hdmlnYXRpb25fUGx1Z2luVHlwZTsKKyAgICAgICAgICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBOYXZpZ2F0aW9uUGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIlBhaW50IikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrUGFpbnRfUGx1Z2luVHlwZTsKKyAgICAgICAgICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBQYWludFBsdWdpbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJWaWRlbyIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga1ZpZGVvX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgVmlkZW9QbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBubyBwbHVnaW5UeXBlIGlzIHNwZWNpZmllZCB0aGVuIGRlZmF1bHQgdG8gQW5pbWF0aW9uCisgICAgaWYgKCFvYmotPnBsdWdpblR5cGUpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tICVwIE5vIFBsdWdpblR5cGUgYXR0cmlidXRlIHdhcyBmb3VuZCIsIGluc3RhbmNlKTsKKyAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBCYWxsQW5pbWF0aW9uKGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgUGx1Z2luVHlwZSBpcyAlZCIsIGluc3RhbmNlLCBvYmotPnBsdWdpblR5cGUpOworCisgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW5UeXBlIHN1cHBvcnRzIHRoZSBtb2RlbAorICAgIGlmICghb2JqLT5hY3RpdmVQbHVnaW4tPnN1cHBvcnRzRHJhd2luZ01vZGVsKG1vZGVsKSkgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgVW5zdXBwb3J0ZWQgRHJhd2luZ01vZGVsICglZCkiLCBpbnN0YW5jZSwgbW9kZWwpOworICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBpZiB0aGUgcGx1Z2luIHVzZXMgdGhlIHN1cmZhY2UgZHJhd2luZyBtb2RlbCB0aGVuIHNldCB0aGUgamF2YSBjb250ZXh0CisgICAgaWYgKG1vZGVsID09IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbCB8fCBtb2RlbCA9PSBrT3BlbkdMX0FOUERyYXdpbmdNb2RlbCkgeworICAgICAgICBTdXJmYWNlU3ViUGx1Z2luKiBzdXJmYWNlUGx1Z2luID0gc3RhdGljX2Nhc3Q8U3VyZmFjZVN1YlBsdWdpbio+KG9iai0+YWN0aXZlUGx1Z2luKTsKKworICAgICAgICBqb2JqZWN0IGNvbnRleHQ7CisgICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIGtKYXZhQ29udGV4dF9BTlBHZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oJmNvbnRleHQpKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAicmVxdWVzdCBjb250ZXh0IGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHN1cmZhY2VQbHVnaW4tPnNldENvbnRleHQoY29udGV4dCk7CisgICAgfQorCisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpCit7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworICAgIGlmIChvYmopIHsKKyAgICAgICAgZGVsZXRlIG9iai0+YWN0aXZlUGx1Z2luOworICAgICAgICBicm93c2VyLT5yZWxlYXNlb2JqZWN0KCZvYmotPmhlYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KQoreworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIC8vIERvIG5vdGhpbmcgaWYgYnJvd3NlciBkaWRuJ3Qgc3VwcG9ydCBOUE5fQ3JlYXRlT2JqZWN0IHdoaWNoIHdvdWxkIGhhdmUgY3JlYXRlZCB0aGUgUGx1Z2luT2JqZWN0LgorICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICBvYmotPndpbmRvdyA9IHdpbmRvdzsKKyAgICB9CisKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCit7CisgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pCit7CisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitpbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sIHZvaWQqIGJ1ZmZlcikKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpCit7Cit9CisKK3ZvaWQgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCkKK3sKK30KKworaW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKKworI2lmIERFQlVHX1BMVUdJTl9FVkVOVFMKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorCisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcubW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpIHsKKworICAgICAgICAgICAgICAgIHN0YXRpYyBBTlBCaXRtYXBGb3JtYXQgY3VycmVudEZvcm1hdCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgIT0gY3VycmVudEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ID0gZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIERyYXcgKGJpdG1hcCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaXA9JWQsJWQsJWQsJWQgZm9ybWF0PSVkIiwgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5jbGlwLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5jbGlwLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3LmNsaXAucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5jbGlwLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLmZvcm1hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgS2V5IGFjdGlvbj0lZCIKKyAgICAgICAgICAgICAgICAgICAgICAiIGNvZGU9JWQgdmNvZGU9JWQgdW5pY2hhcj0lZCByZXBlYXQ9JWQgbW9kcz0leCIsIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkuYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnZpcnR1YWxDb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudW5pY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnJlcGVhdENvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkubW9kaWZpZXJzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIExpZmVjeWNsZSBhY3Rpb249JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIFRvdWNoIGFjdGlvbj0lZCBbJWQgJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiwgZXZ0LT5kYXRhLnRvdWNoLngsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLnRvdWNoLnkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtNb3VzZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIE1vdXNlIGFjdGlvbj0lZCBbJWQgJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLm1vdXNlLmFjdGlvbiwgZXZ0LT5kYXRhLm1vdXNlLngsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLm1vdXNlLnkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtWaXNpYmxlUmVjdF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIFZpc2libGVSZWN0IFslZCAlZCAlZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC5sZWZ0LCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QucmlnaHQsIGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LmJvdHRvbSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSAlcCBVbmtub3duIEV2ZW50IFslZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmV2ZW50VHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKCFvYmotPmFjdGl2ZVBsdWdpbikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJ0aGUgYWN0aXZlIHBsdWdpbiBpcyBudWxsLiIpOworICAgICAgICByZXR1cm4gMDsgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBvYmotPmFjdGl2ZVBsdWdpbi0+aGFuZGxlRXZlbnQoZXZ0KTsKKyAgICB9Cit9CisKK3ZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHVybCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKQoreworCit9CisKK0VYUE9SVCBOUEVycm9yIE5QX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKSB7CisKKyAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpbk5hbWVTdHJpbmcpIHsKKyAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOworICAgICAgICAqc3RyID0gIlRlc3QgUGx1Z2luIjsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luRGVzY3JpcHRpb25TdHJpbmcpIHsKKyAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOworICAgICAgICAqc3RyID0gIkRlc2NyaXB0aW9uIG9mIFRlc3QgUGx1Z2luIjsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpblNjcmlwdGFibGVOUE9iamVjdCkgeworICAgICAgICB2b2lkICoqdiA9ICh2b2lkICoqKXZhbHVlOworICAgICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICAgICAgaWYgKG9iaikKKyAgICAgICAgICAgIGJyb3dzZXItPnJldGFpbm9iamVjdCgmb2JqLT5oZWFkZXIpOworCisgICAgICAgICp2ID0gJihvYmotPmhlYWRlcik7CisgICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAodmFyaWFibGUgPT0ga0phdmFTdXJmYWNlX0FOUEdldFZhbHVlKSB7CisgICAgICAgIC8vZ2V0IHRoZSBzdXJmYWNlIHN1Yi1wbHVnaW4KKyAgICAgICAgUGx1Z2luT2JqZWN0KiBvYmogPSBzdGF0aWNfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgICAgICBpZiAob2JqICYmIG9iai0+YWN0aXZlUGx1Z2luKSB7CisKKyAgICAgICAgICAgIGlmKG9iai0+YWN0aXZlUGx1Z2luLT5zdXBwb3J0c0RyYXdpbmdNb2RlbChrU3VyZmFjZV9BTlBEcmF3aW5nTW9kZWwpCisgICAgICAgICAgICAgICAgICAgIHx8IG9iai0+YWN0aXZlUGx1Z2luLT5zdXBwb3J0c0RyYXdpbmdNb2RlbChrT3BlbkdMX0FOUERyYXdpbmdNb2RlbCkpIHsKKyAgICAgICAgICAgICAgICBTdXJmYWNlU3ViUGx1Z2luKiBwbHVnaW4gPSBzdGF0aWNfY2FzdDxTdXJmYWNlU3ViUGx1Z2luKj4ob2JqLT5hY3RpdmVQbHVnaW4pOworICAgICAgICAgICAgICAgIGpvYmplY3QqIHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxqb2JqZWN0Kj4odmFsdWUpOworICAgICAgICAgICAgICAgICpzdXJmYWNlID0gcGx1Z2luLT5nZXRTdXJmYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICItLSAlcCBUcmllZCB0byByZXRyaWV2ZSBzdXJmYWNlIGZvciBub24tc3VyZmFjZSBwbHVnaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpCit7CisgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmYjRiMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bnBhcGkuaD4KKyNpbmNsdWRlIDxucGZ1bmN0aW9ucy5oPgorI2luY2x1ZGUgPG5wcnVudGltZS5oPgorI2luY2x1ZGUgImFuZHJvaWRfbnBhcGkuaCIKKyNpbmNsdWRlICJBTlBPcGVuR0xfbnBhcGkuaCIKKyNpbmNsdWRlICJBTlBTdXJmYWNlX25wYXBpLmgiCisjaW5jbHVkZSAiQU5QU3lzdGVtX25wYXBpLmgiCisKK2V4dGVybiBOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CitleHRlcm4gSmF2YVZNKiBnVk07CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkOWE3OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmNwcApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJOYXZpZ2F0aW9uUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgIGdXaW5kb3dJOworCisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSkgeworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHVpbnQxNl90IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXgpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKKyAgICBjb25zdCBpbnQgaW5zZXQgPSBkb0FBID8gLTEgOiAwOworCisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSByZWludGVycHJldF9jYXN0PFBsdWdpbk9iamVjdCo+KGluc3RhbmNlLT5wZGF0YSk7CisgICAgTlBSZWN0IGludmFsOworICAgIGludmFsLmxlZnQgPSBybmQxNihyLmxlZnQsIGluc2V0KTsKKyAgICBpbnZhbC50b3AgPSBybmQxNihyLnRvcCwgaW5zZXQpOworICAgIGludmFsLnJpZ2h0ID0gcm5kMTYoci5yaWdodCwgLWluc2V0KTsKKyAgICBpbnZhbC5ib3R0b20gPSBybmQxNihyLmJvdHRvbSwgLWluc2V0KTsKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgJmludmFsKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitOYXZpZ2F0aW9uUGx1Z2luOjpOYXZpZ2F0aW9uUGx1Z2luKE5QUCBpbnN0KSA6IFN1YlBsdWdpbihpbnN0KSB7CisKKyAgICBtX2hhc0ZvY3VzID0gZmFsc2U7CisgICAgbV9hY3RpdmVOYXYgPSBOVUxMOworCisgICAgbV9wYWludERpc2FibGVkID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludERpc2FibGVkLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnREaXNhYmxlZCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50RGlzYWJsZWQsIDB4RkZGRkZGRkYpOworCisgICAgbV9wYWludEFjdGl2ZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmUsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZSkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50QWN0aXZlLCAweEZGRkZGRjAwKTsKKworICAgIC8vcmVnaXN0ZXIgZm9yIGtleSBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga0tleV9BTlBFdmVudEZsYWc7CisgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0LCBrQWNjZXB0RXZlbnRzX0FOUFNldFZhbHVlLCAmZmxhZ3MpOworICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2VsZWN0aW5nIGlucHV0IGV2ZW50cy4iKTsKKyAgICB9Cit9CisKK05hdmlnYXRpb25QbHVnaW46On5OYXZpZ2F0aW9uUGx1Z2luKCkgeworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludERpc2FibGVkKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRBY3RpdmUpOworfQorCitib29sIE5hdmlnYXRpb25QbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIE5hdmlnYXRpb25QbHVnaW46OmRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7CisKKyAgICBBTlBSZWN0RiBjbGlwUjsKKyAgICBjbGlwUi5sZWZ0ID0gY2xpcC5sZWZ0OworICAgIGNsaXBSLnRvcCA9IGNsaXAudG9wOworICAgIGNsaXBSLnJpZ2h0ID0gY2xpcC5yaWdodDsKKyAgICBjbGlwUi5ib3R0b20gPSBjbGlwLmJvdHRvbTsKKyAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisKKyAgICBkcmF3KGNhbnZhcyk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Cit9CisKK3ZvaWQgTmF2aWdhdGlvblBsdWdpbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisgICAgY29uc3QgaW50IFdtID0gVy8yOworICAgIGNvbnN0IGludCBIbSA9IEgvMjsKKworICAgIC8vIGNvbG9yIHRoZSBwbHVnaW4gY2FudmFzCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgKG1faGFzRm9jdXMpID8gMHhGRkNEQ0RDRCA6IDB4RkY1NDU0NTQpOworCisgICAgLy8gZHJhdyB0aGUgbmF2IHVwIGJveCAoNSBweCBmcm9tIHRoZSB0b3AgZWRnZSkKKyAgICBtX25hdlVwLmxlZnQgPSBXbSAtIDE1OworICAgIG1fbmF2VXAudG9wID0gNTsKKyAgICBtX25hdlVwLnJpZ2h0ID0gbV9uYXZVcC5sZWZ0ICsgMzA7CisgICAgbV9uYXZVcC5ib3R0b20gPSBtX25hdlVwLnRvcCArIDMwOworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fbmF2VXAsIGdldFBhaW50KCZtX25hdlVwKSk7CisKKyAgICAvLyBkcmF3IHRoZSBuYXYgZG93biBib3ggKDUgcHggZnJvbSB0aGUgYm90dG9tIGVkZ2UpCisgICAgbV9uYXZEb3duLmxlZnQgPSBXbSAtIDE1OworICAgIG1fbmF2RG93bi50b3AgPSBIIC0gKDMwICsgNSk7CisgICAgbV9uYXZEb3duLnJpZ2h0ID0gbV9uYXZEb3duLmxlZnQgKyAzMDsKKyAgICBtX25hdkRvd24uYm90dG9tID0gbV9uYXZEb3duLnRvcCArIDMwOworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fbmF2RG93biwgZ2V0UGFpbnQoJm1fbmF2RG93bikpOworCisgICAgLy8gZHJhdyB0aGUgbmF2IGxlZnQgYm94ICg1IHB4IGZyb20gdGhlIGxlZnQgZWRnZSkKKyAgICBtX25hdkxlZnQubGVmdCA9IDU7CisgICAgbV9uYXZMZWZ0LnRvcCA9IEhtIC0gMTU7CisgICAgbV9uYXZMZWZ0LnJpZ2h0ID0gbV9uYXZMZWZ0LmxlZnQgKyAzMDsKKyAgICBtX25hdkxlZnQuYm90dG9tID0gbV9uYXZMZWZ0LnRvcCArIDMwOworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fbmF2TGVmdCwgZ2V0UGFpbnQoJm1fbmF2TGVmdCkpOworCisgICAgLy8gZHJhdyB0aGUgbmF2IHJpZ2h0IGJveCAoNSBweCBmcm9tIHRoZSByaWdodCBlZGdlKQorICAgIG1fbmF2UmlnaHQubGVmdCA9IFcgLSAoMzAgKyA1KTsKKyAgICBtX25hdlJpZ2h0LnRvcCA9IEhtIC0gMTU7CisgICAgbV9uYXZSaWdodC5yaWdodCA9IG1fbmF2UmlnaHQubGVmdCArIDMwOworICAgIG1fbmF2UmlnaHQuYm90dG9tID0gbV9uYXZSaWdodC50b3AgKyAzMDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX25hdlJpZ2h0LCBnZXRQYWludCgmbV9uYXZSaWdodCkpOworCisgICAgLy8gZHJhdyB0aGUgbmF2IGNlbnRlciBib3gKKyAgICBtX25hdkNlbnRlci5sZWZ0ID0gV20gLSAxNTsKKyAgICBtX25hdkNlbnRlci50b3AgPSBIbSAtIDE1OworICAgIG1fbmF2Q2VudGVyLnJpZ2h0ID0gbV9uYXZDZW50ZXIubGVmdCArIDMwOworICAgIG1fbmF2Q2VudGVyLmJvdHRvbSA9IG1fbmF2Q2VudGVyLnRvcCArIDMwOworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fbmF2Q2VudGVyLCBnZXRQYWludCgmbV9uYXZDZW50ZXIpKTsKKworICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBEcmF3aW5nIFBsdWdpbiIsIGluc3QoKSk7Cit9CisKK0FOUFBhaW50KiBOYXZpZ2F0aW9uUGx1Z2luOjpnZXRQYWludChBTlBSZWN0RiogaW5wdXQpIHsKKyAgICByZXR1cm4gKGlucHV0ID09IG1fYWN0aXZlTmF2KSA/IG1fcGFpbnRBY3RpdmUgOiBtX3BhaW50RGlzYWJsZWQ7Cit9CisKK2ludDE2X3QgTmF2aWdhdGlvblBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKKyAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcCwgZXZ0LT5kYXRhLmRyYXcuY2xpcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEubGlmZWN5Y2xlLmFjdGlvbiA9PSBrTG9zZUZvY3VzX0FOUExpZmVjeWNsZUFjdGlvbikgeworICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBMb29zaW5nIEZvY3VzIiwgaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIG1faGFzRm9jdXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnZhbChpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChldnQtPmRhdGEubGlmZWN5Y2xlLmFjdGlvbiA9PSBrR2FpbkZvY3VzX0FOUExpZmVjeWNsZUFjdGlvbikgeworICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBHYWluaW5nIEZvY3VzIiwgaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIG1faGFzRm9jdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga01vdXNlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmtleS5hY3Rpb24gPT0ga0Rvd25fQU5QS2V5QWN0aW9uKSB7CisgICAgICAgICAgICAJYm9vbCByZXN1bHQgPSBoYW5kbGVOYXZpZ2F0aW9uKGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSk7CisgICAgICAgICAgICAJaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK2Jvb2wgTmF2aWdhdGlvblBsdWdpbjo6aGFuZGxlTmF2aWdhdGlvbihBTlBLZXlDb2RlIGtleUNvZGUpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICItLS0tJXAgUmVjZWl2ZWQgS2V5ICVkIiwgaW5zdGFuY2UsIGtleUNvZGUpOworCisgICAgc3dpdGNoIChrZXlDb2RlKSB7CisJCWNhc2Uga0RwYWRVcF9BTlBLZXlDb2RlOgorCQkJbV9hY3RpdmVOYXYgPSAmbV9uYXZVcDsKKwkJCWJyZWFrOworCQljYXNlIGtEcGFkRG93bl9BTlBLZXlDb2RlOgorCQkJbV9hY3RpdmVOYXYgPSAmbV9uYXZEb3duOworCQkJYnJlYWs7CisJCWNhc2Uga0RwYWRMZWZ0X0FOUEtleUNvZGU6CisJCQltX2FjdGl2ZU5hdiA9ICZtX25hdkxlZnQ7CisJCQlicmVhazsKKwkJY2FzZSBrRHBhZFJpZ2h0X0FOUEtleUNvZGU6CisJCQltX2FjdGl2ZU5hdiA9ICZtX25hdlJpZ2h0OworCQkJYnJlYWs7CisJCWNhc2Uga0RwYWRDZW50ZXJfQU5QS2V5Q29kZToKKwkJCW1fYWN0aXZlTmF2ID0gJm1fbmF2Q2VudGVyOworCQkJYnJlYWs7CisJCWNhc2Uga1FfQU5QS2V5Q29kZToKKwkJY2FzZSBrRGVsX0FOUEtleUNvZGU6CisJCQltX2FjdGl2ZU5hdiA9IE5VTEw7CisJCQlyZXR1cm4gZmFsc2U7CisJCWRlZmF1bHQ6CisJCQltX2FjdGl2ZU5hdiA9IE5VTEw7CisJCQlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA0NGJiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIG5hdmlnYXRpb25QbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgbmF2aWdhdGlvblBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBOYXZpZ2F0aW9uUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisJTmF2aWdhdGlvblBsdWdpbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+TmF2aWdhdGlvblBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgYm9vbCAgICAgICAgbV9oYXNGb2N1czsKKworICAgIEFOUFJlY3RGKgltX2FjdGl2ZU5hdjsKKyAgICBBTlBSZWN0RgltX25hdlVwOworICAgIEFOUFJlY3RGCW1fbmF2RG93bjsKKyAgICBBTlBSZWN0RgltX25hdkxlZnQ7CisgICAgQU5QUmVjdEYJbV9uYXZSaWdodDsKKyAgICBBTlBSZWN0RgltX25hdkNlbnRlcjsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnREaXNhYmxlZDsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlOworCisgICAgYm9vbCBoYW5kbGVOYXZpZ2F0aW9uKEFOUEtleUNvZGUga2V5Q29kZSk7CisgICAgQU5QUGFpbnQqIGdldFBhaW50KEFOUFJlY3RGKik7Cit9OworCisjZW5kaWYgLy8gbmF2aWdhdGlvblBsdWdpbl9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU2ODA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGFpbnRQbHVnaW4uaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiAgICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgICBnQ2FudmFzSTsKK2V4dGVybiBBTlBQYWludEludGVyZmFjZVYwICAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICAgZ1BhdGhJOworZXh0ZXJuIEFOUFN1cmZhY2VJbnRlcmZhY2VWMCAgICBnU3VyZmFjZUk7CitleHRlcm4gQU5QU3lzdGVtSW50ZXJmYWNlVjAgICAgIGdTeXN0ZW1JOworZXh0ZXJuIEFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgICBnVHlwZWZhY2VJOworZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYwICAgICBnV2luZG93STsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQYWludFBsdWdpbjo6UGFpbnRQbHVnaW4oTlBQIGluc3QpIDogU3VyZmFjZVN1YlBsdWdpbihpbnN0KSB7CisKKyAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICBtX2lzVG91Y2hDdXJyZW50SW5wdXQgPSB0cnVlOworICAgIG1fYWN0aXZlUGFpbnRDb2xvciA9IHNfcmVkQ29sb3I7CisKKyAgICBtZW1zZXQoJm1fZHJhd2luZ1N1cmZhY2UsIDAsIHNpemVvZihtX2RyYXdpbmdTdXJmYWNlKSk7CisgICAgbWVtc2V0KCZtX2lucHV0VG9nZ2xlLCAgMCwgc2l6ZW9mKG1faW5wdXRUb2dnbGUpKTsKKyAgICBtZW1zZXQoJm1fY29sb3JUb2dnbGUsIDAsIHNpemVvZihtX2NvbG9yVG9nZ2xlKSk7CisgICAgbWVtc2V0KCZtX2Z1bGxTY3JlZW5Ub2dnbGUsIDAsIHNpemVvZihtX2Z1bGxTY3JlZW5Ub2dnbGUpKTsKKyAgICBtZW1zZXQoJm1fY2xlYXJTdXJmYWNlLCAgMCwgc2l6ZW9mKG1fY2xlYXJTdXJmYWNlKSk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBkcmF3aW5nIHN1cmZhY2UKKyAgICBtX3N1cmZhY2UgPSBOVUxMOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcGF0aAorICAgIG1fdG91Y2hQYXRoID0gZ1BhdGhJLm5ld1BhdGgoKTsKKyAgICBpZighbV90b3VjaFBhdGgpCisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0lcCBVbmFibGUgdG8gY3JlYXRlIHRoZSB0b3VjaCBwYXRoIiwgaW5zdCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBwYWludCBjb2xvcnMKKyAgICBtX3BhaW50U3VyZmFjZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRTdXJmYWNlLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRTdXJmYWNlKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRTdXJmYWNlLCAweEZGQzBDMEMwKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKG1fcGFpbnRTdXJmYWNlLCAxOCk7CisKKyAgICBtX3BhaW50QnV0dG9uID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludEJ1dHRvbiwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50QnV0dG9uKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRCdXR0b24sIDB4RkZBOEE4QTgpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdHlwZWZhY2UgKHNldCB0aGUgY29sb3JzKQorICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRTdXJmYWNlLCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga1RvdWNoX0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworUGFpbnRQbHVnaW46On5QYWludFBsdWdpbigpIHsKKyAgICBnUGF0aEkuZGVsZXRlUGF0aChtX3RvdWNoUGF0aCk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50U3VyZmFjZSk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50QnV0dG9uKTsKKworICAgIHNldENvbnRleHQoTlVMTCk7CisgICAgZGVzdHJveVN1cmZhY2UoKTsKK30KKworQU5QQ2FudmFzKiBQYWludFBsdWdpbjo6Z2V0Q2FudmFzKEFOUFJlY3RJKiBkaXJ0eVJlY3QpIHsKKworICAgIEFOUEJpdG1hcCBiaXRtYXA7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmICghbV9zdXJmYWNlIHx8IGdWTS0+R2V0RW52KCh2b2lkKiopICZlbnYsIEpOSV9WRVJTSU9OXzFfNCkgIT0gSk5JX09LIHx8CisgICAgICAgICFnU3VyZmFjZUkubG9jayhlbnYsIG1fc3VyZmFjZSwgJmJpdG1hcCwgZGlydHlSZWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgLy8gY2xpcCB0aGUgY2FudmFzIHRvIHRoZSBkaXJ0eSByZWN0IGIvYyB0aGUgc3VyZmFjZSBpcyBvbmx5IHJlcXVpcmVkIHRvCisgICAgLy8gY29weSBhIG1pbmltdW0gb2YgdGhlIGRpcnR5IHJlY3QgYW5kIG1heSBjb3B5IG1vcmUuIFRoZSBjbGlwcGVkIGNhbnZhcworICAgIC8vIGhvd2V2ZXIgd2lsbCBuZXZlciB3cml0ZSB0byBwaXhlbHMgb3V0c2lkZSBvZiB0aGUgY2xpcHBlZCBhcmVhLgorICAgIGlmIChkaXJ0eVJlY3QpIHsKKyAgICAgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgICAgIGNsaXBSLmxlZnQgPSBkaXJ0eVJlY3QtPmxlZnQ7CisgICAgICAgIGNsaXBSLnRvcCA9IGRpcnR5UmVjdC0+dG9wOworICAgICAgICBjbGlwUi5yaWdodCA9IGRpcnR5UmVjdC0+cmlnaHQ7CisgICAgICAgIGNsaXBSLmJvdHRvbSA9IGRpcnR5UmVjdC0+Ym90dG9tOworICAgICAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisgICAgfQorCisgICAgcmV0dXJuIGNhbnZhczsKK30KKworQU5QQ2FudmFzKiBQYWludFBsdWdpbjo6Z2V0Q2FudmFzKEFOUFJlY3RGKiBkaXJ0eVJlY3QpIHsKKworICAgIEFOUFJlY3RJIG5ld1JlY3Q7CisgICAgbmV3UmVjdC5sZWZ0ID0gKGludCkgZGlydHlSZWN0LT5sZWZ0OworICAgIG5ld1JlY3QudG9wID0gKGludCkgZGlydHlSZWN0LT50b3A7CisgICAgbmV3UmVjdC5yaWdodCA9IChpbnQpIGRpcnR5UmVjdC0+cmlnaHQ7CisgICAgbmV3UmVjdC5ib3R0b20gPSAoaW50KSBkaXJ0eVJlY3QtPmJvdHRvbTsKKworICAgIHJldHVybiBnZXRDYW52YXMoJm5ld1JlY3QpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpyZWxlYXNlQ2FudmFzKEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChtX3N1cmZhY2UgJiYgZ1ZNLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSA9PSBKTklfT0spIHsKKyAgICAgICAgZ1N1cmZhY2VJLnVubG9jayhlbnYsIG1fc3VyZmFjZSk7CisgICAgfQorICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpkcmF3Q2xlYW5QbHVnaW4oQU5QQ2FudmFzKiBjYW52YXMpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworCisgICAgLy8gaWYgbm8gY2FudmFzIGdldCBhIGxvY2tlZCBjYW52YXMKKyAgICBpZiAoIWNhbnZhcykKKyAgICAgICAgY2FudmFzID0gZ2V0Q2FudmFzKCk7CisKKyAgICBpZiAoIWNhbnZhcykKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgZmxvYXQgYnV0dG9uV2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBidXR0b25IZWlnaHQgPSAzMDsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICAvLyBjb2xvciB0aGUgcGx1Z2luIGNhbnZhcworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZDRENEQ0QpOworCisgICAgLy8gZ2V0IGZvbnQgbWV0cmljcworICAgIEFOUEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOworICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MobV9wYWludFN1cmZhY2UsICZmb250TWV0cmljcyk7CisKKyAgICAvLyBkcmF3IHRoZSBpbnB1dCB0b2dnbGUgYnV0dG9uCisgICAgbV9pbnB1dFRvZ2dsZS5sZWZ0ID0gNTsKKyAgICBtX2lucHV0VG9nZ2xlLnRvcCA9IEggLSBidXR0b25IZWlnaHQgLSA1OworICAgIG1faW5wdXRUb2dnbGUucmlnaHQgPSBtX2lucHV0VG9nZ2xlLmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX2lucHV0VG9nZ2xlLmJvdHRvbSA9IG1faW5wdXRUb2dnbGUudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1faW5wdXRUb2dnbGUsIG1fcGFpbnRCdXR0b24pOworICAgIGNvbnN0IGNoYXIqIGlucHV0VGV4dCA9IG1faXNUb3VjaEN1cnJlbnRJbnB1dCA/ICJUb3VjaCIgOiAiTW91c2UiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgaW5wdXRUZXh0LCBzdHJsZW4oaW5wdXRUZXh0KSwgbV9pbnB1dFRvZ2dsZS5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2lucHV0VG9nZ2xlLnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIGRyYXcgdGhlIGNvbG9yIHNlbGVjdG9yIGJ1dHRvbgorICAgIG1fY29sb3JUb2dnbGUubGVmdCA9IChXLzMpIC0gKGJ1dHRvbldpZHRoLzIpOworICAgIG1fY29sb3JUb2dnbGUudG9wID0gSCAtIGJ1dHRvbkhlaWdodCAtIDU7CisgICAgbV9jb2xvclRvZ2dsZS5yaWdodCA9IG1fY29sb3JUb2dnbGUubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fY29sb3JUb2dnbGUuYm90dG9tID0gbV9jb2xvclRvZ2dsZS50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9jb2xvclRvZ2dsZSwgbV9wYWludEJ1dHRvbik7CisgICAgY29uc3QgY2hhciogY29sb3JUZXh0ID0gZ2V0Q29sb3JUZXh0KCk7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBjb2xvclRleHQsIHN0cmxlbihjb2xvclRleHQpLCBtX2NvbG9yVG9nZ2xlLmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fY29sb3JUb2dnbGUudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFN1cmZhY2UpOworCisgICAgLy8gZHJhdyB0aGUgZnVsbC1zY3JlZW4gdG9nZ2xlIGJ1dHRvbgorICAgIG1fZnVsbFNjcmVlblRvZ2dsZS5sZWZ0ID0gKChXKjIpLzMpIC0gKGJ1dHRvbldpZHRoLzIpOworICAgIG1fZnVsbFNjcmVlblRvZ2dsZS50b3AgPSBIIC0gYnV0dG9uSGVpZ2h0IC0gNTsKKyAgICBtX2Z1bGxTY3JlZW5Ub2dnbGUucmlnaHQgPSBtX2Z1bGxTY3JlZW5Ub2dnbGUubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fZnVsbFNjcmVlblRvZ2dsZS5ib3R0b20gPSBtX2Z1bGxTY3JlZW5Ub2dnbGUudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fZnVsbFNjcmVlblRvZ2dsZSwgbV9wYWludEJ1dHRvbik7CisgICAgY29uc3QgY2hhciogZnVsbFNjcmVlblRleHQgPSAiRnVsbCI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBmdWxsU2NyZWVuVGV4dCwgc3RybGVuKGZ1bGxTY3JlZW5UZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2Z1bGxTY3JlZW5Ub2dnbGUubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9mdWxsU2NyZWVuVG9nZ2xlLnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIGRyYXcgdGhlIGNsZWFyIGNhbnZhcyBidXR0b24KKyAgICBtX2NsZWFyU3VyZmFjZS5sZWZ0ID0gVyAtIGJ1dHRvbldpZHRoIC0gNTsKKyAgICBtX2NsZWFyU3VyZmFjZS50b3AgPSBIIC0gYnV0dG9uSGVpZ2h0IC0gNTsKKyAgICBtX2NsZWFyU3VyZmFjZS5yaWdodCA9IG1fY2xlYXJTdXJmYWNlLmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX2NsZWFyU3VyZmFjZS5ib3R0b20gPSBtX2NsZWFyU3VyZmFjZS50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9jbGVhclN1cmZhY2UsIG1fcGFpbnRCdXR0b24pOworICAgIGNvbnN0IGNoYXIqIGNsZWFyVGV4dCA9ICJDbGVhciI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBjbGVhclRleHQsIHN0cmxlbihjbGVhclRleHQpLCBtX2NsZWFyU3VyZmFjZS5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2NsZWFyU3VyZmFjZS50b3AgLSBmb250TWV0cmljcy5mVG9wLCBtX3BhaW50U3VyZmFjZSk7CisKKyAgICAvLyBkcmF3IHRoZSBkcmF3aW5nIHN1cmZhY2UgYm94ICg1IHB4IGZyb20gdGhlIGVkZ2UpCisgICAgbV9kcmF3aW5nU3VyZmFjZS5sZWZ0ID0gNTsKKyAgICBtX2RyYXdpbmdTdXJmYWNlLnRvcCA9IDU7CisgICAgbV9kcmF3aW5nU3VyZmFjZS5yaWdodCA9IFcgLSA1OworICAgIG1fZHJhd2luZ1N1cmZhY2UuYm90dG9tID0gbV9jb2xvclRvZ2dsZS50b3AgLSA1OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fZHJhd2luZ1N1cmZhY2UsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIHJlbGVhc2UgdGhlIGNhbnZhcworICAgIHJlbGVhc2VDYW52YXMoY2FudmFzKTsKK30KKworY29uc3QgY2hhciogUGFpbnRQbHVnaW46OmdldENvbG9yVGV4dCgpIHsKKworICAgIGlmIChtX2FjdGl2ZVBhaW50Q29sb3IgPT0gc19ibHVlQ29sb3IpCisgICAgICAgIHJldHVybiAiQmx1ZSI7CisgICAgZWxzZSBpZiAobV9hY3RpdmVQYWludENvbG9yID09IHNfZ3JlZW5Db2xvcikKKyAgICAgICAgcmV0dXJuICJHcmVlbiI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIlJlZCI7Cit9CisKK2pvYmplY3QgUGFpbnRQbHVnaW46OmdldFN1cmZhY2UoKSB7CisgICAgaWYgKG1fc3VyZmFjZSkgeworICAgICAgICByZXR1cm4gbV9zdXJmYWNlOworICAgIH0KKworICAgIC8vIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGphdmEgY2xhc3MgYW5kIGluc3RhbnRpYXRlIGl0CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChnVk0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLSBnZXRTdXJmYWNlOiBmYWlsZWQgdG8gZ2V0IGVudiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBjbGFzc05hbWUgPSAiY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luLlBhaW50U3VyZmFjZSI7CisgICAgamNsYXNzIHBhaW50Q2xhc3MgPSBnU3lzdGVtSS5sb2FkSmF2YUNsYXNzKGluc3QoKSwgY2xhc3NOYW1lKTsKKworICAgIGlmKCFwYWludENsYXNzKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBsb2FkIGNsYXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3QoKS0+cGRhdGE7CisgICAgY29uc3QgaW50IHBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBwSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKHBhaW50Q2xhc3MsICI8aW5pdD4iLCAiKExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtJSUkpViIpOworICAgIGpvYmplY3QgcGFpbnRTdXJmYWNlID0gZW52LT5OZXdPYmplY3QocGFpbnRDbGFzcywgY29uc3RydWN0b3IsIG1fY29udGV4dCwgKGludClpbnN0KCksIHBXLCBwSCk7CisKKyAgICBpZighcGFpbnRTdXJmYWNlKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBjb25zdHJ1Y3Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1fc3VyZmFjZSA9IGVudi0+TmV3R2xvYmFsUmVmKHBhaW50U3VyZmFjZSk7CisgICAgcmV0dXJuIG1fc3VyZmFjZTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6ZGVzdHJveVN1cmZhY2UoKSB7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChtX3N1cmZhY2UgJiYgZ1ZNLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSA9PSBKTklfT0spIHsKKworICAgICAgICAvLyBkZXRhY2ggdGhlIG5hdGl2ZSBjb2RlIGZyb20gdGhlIG9iamVjdAorICAgICAgICBqY2xhc3MgamF2YUNsYXNzID0gZW52LT5HZXRPYmplY3RDbGFzcyhtX3N1cmZhY2UpOworICAgICAgICBqbWV0aG9kSUQgaW52YWxNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKGphdmFDbGFzcywgImludmFsaWRhdGVOUFAiLCAiKClWIik7CisgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobV9zdXJmYWNlLCBpbnZhbE1ldGhvZCk7CisKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobV9zdXJmYWNlKTsKKyAgICAgICAgbV9zdXJmYWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2ludDE2X3QgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZTogeworICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCkgZXZ0LT5kYXRhLnRvdWNoLng7CisgICAgICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KSBldnQtPmRhdGEudG91Y2gueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1faXNUb3VjaEN1cnJlbnRJbnB1dCkgeworCisgICAgICAgICAgICAgICAgQU5QUmVjdEYqIHJlY3QgPSB2YWxpZFRvdWNoKGV2dC0+ZGF0YS50b3VjaC54LCBldnQtPmRhdGEudG91Y2gueSk7CisgICAgICAgICAgICAgICAgaWYocmVjdCA9PSAmbV9kcmF3aW5nU3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBnUGF0aEkubW92ZVRvKG1fdG91Y2hQYXRoLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnRUb3VjaCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa01vdmVfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiAmJiBtX2lzVG91Y2hBY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBnUGF0aEkubGluZVRvKG1fdG91Y2hQYXRoLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBwYWludFRvdWNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtVcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1faXNUb3VjaEFjdGl2ZSkgeworICAgICAgICAgICAgICAgIGdQYXRoSS5saW5lVG8obV90b3VjaFBhdGgsIHgsIHkpOworICAgICAgICAgICAgICAgIHBhaW50VG91Y2goKTsKKyAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnUGF0aEkucmVzZXQobV90b3VjaFBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChrQ2FuY2VsX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnUGF0aEkucmVzZXQobV90b3VjaFBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChrRG91YmxlVGFwX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBnV2luZG93SS5yZXF1ZXN0Q2VudGVyRml0Wm9vbShpbnN0KCkpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtNb3VzZV9BTlBFdmVudFR5cGU6IHsKKworICAgICAgICAgICAgaWYgKG1faXNUb3VjaEFjdGl2ZSkKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICItLS0tJXAgUmVjZWl2ZWQgdW5pbnRlbmRlZCBtb3VzZSBldmVudCIsIGluc3QoKSk7CisKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBNb3VzZUFjdGlvbiA9PSBldnQtPmRhdGEubW91c2UuYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgQU5QUmVjdEYqIHJlY3QgPSB2YWxpZFRvdWNoKGV2dC0+ZGF0YS5tb3VzZS54LCBldnQtPmRhdGEubW91c2UueSk7CisgICAgICAgICAgICAgICAgaWYgKHJlY3QgPT0gJm1fZHJhd2luZ1N1cmZhY2UpCisgICAgICAgICAgICAgICAgICAgIHBhaW50TW91c2UoZXZ0LT5kYXRhLm1vdXNlLngsIGV2dC0+ZGF0YS5tb3VzZS55KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0ID09ICZtX2lucHV0VG9nZ2xlKQorICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnB1dE1ldGhvZCgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QgPT0gJm1fY29sb3JUb2dnbGUpCisgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVBhaW50Q29sb3IoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0ID09ICZtX2Z1bGxTY3JlZW5Ub2dnbGUpCisgICAgICAgICAgICAgICAgICAgIGdXaW5kb3dJLnJlcXVlc3RGdWxsU2NyZWVuKGluc3QoKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdCA9PSAmbV9jbGVhclN1cmZhY2UpCisgICAgICAgICAgICAgICAgICAgIGRyYXdDbGVhblBsdWdpbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrQ3VzdG9tX0FOUEV2ZW50VHlwZTogeworCisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5vdGhlclswXSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1N1cmZhY2VDcmVhdGVkX0N1c3RvbUV2ZW50OgorICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLSBjdXN0b21FdmVudDogc3VyZmFjZUNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBkcmF3IGNhbGwgaXMgYWRkZWQgdG8gY292ZXIgdXAgYSBwcm9ibGVtIGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luIGFuZCBpcyBub3QgYSByZWNvbW1lbmRlZCB1c2FnZSBwYXR0ZXJuLiBUaGlzIHBsdWdpbgorICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBjb3JyZWN0bHkgbWFrZSBwYXJ0aWFsIHVwZGF0ZXMgdG8gdGhlIGRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCBzdXJmYWNlIGFuZCB0aGlzIHNlY29uZCBjYWxsIGhpZGVzIHRoYXQgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGRyYXdDbGVhblBsdWdpbigpOworICAgICAgICAgICAgICAgICAgICBkcmF3Q2xlYW5QbHVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrU3VyZmFjZUNoYW5nZWRfQ3VzdG9tRXZlbnQ6IHsKKyAgICAgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0gY3VzdG9tRXZlbnQ6IHN1cmZhY2VDaGFuZ2VkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gZXZ0LT5kYXRhLm90aGVyWzFdOworICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gZXZ0LT5kYXRhLm90aGVyWzJdOworCisgICAgICAgICAgICAgICAgICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3QoKS0+cGRhdGE7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0byB0aGUgcGx1Z2luJ3Mgc3VyZmFjZSBkaW1lbnNpb25zCisgICAgICAgICAgICAgICAgICAgIGlmIChwVyAhPSB3aWR0aCB8fCBwSCAhPSBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLS0lcCBJbnZhbGlkIFN1cmZhY2UgRGltZW5zaW9ucyAoJWQsJWQpOiglZCwlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3QoKSwgcFcsIHBILCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1N1cmZhY2VEZXN0cm95ZWRfQ3VzdG9tRXZlbnQ6CisgICAgICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tIGN1c3RvbUV2ZW50OiBzdXJmYWNlRGVzdHJveWVkIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7IC8vIGVuZCBLQ3VzdG9tX0FOUEV2ZW50VHlwZQorICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKworQU5QUmVjdEYqIFBhaW50UGx1Z2luOjp2YWxpZFRvdWNoKGludCB4LCBpbnQgeSkgeworCisgICAgLy9jb252ZXJ0IHRvIGZsb2F0CisgICAgZmxvYXQgZnggPSAoaW50KSB4OworICAgIGZsb2F0IGZ5ID0gKGludCkgeTsKKworICAgIGlmIChmeCA+IG1fZHJhd2luZ1N1cmZhY2UubGVmdCAmJiBmeCA8IG1fZHJhd2luZ1N1cmZhY2UucmlnaHQgJiYgZnkgPiBtX2RyYXdpbmdTdXJmYWNlLnRvcCAmJiBmeSA8IG1fZHJhd2luZ1N1cmZhY2UuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fZHJhd2luZ1N1cmZhY2U7CisgICAgZWxzZSBpZiAoZnggPiBtX2lucHV0VG9nZ2xlLmxlZnQgJiYgZnggPCBtX2lucHV0VG9nZ2xlLnJpZ2h0ICYmIGZ5ID4gbV9pbnB1dFRvZ2dsZS50b3AgJiYgZnkgPCBtX2lucHV0VG9nZ2xlLmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX2lucHV0VG9nZ2xlOworICAgIGVsc2UgaWYgKGZ4ID4gbV9jb2xvclRvZ2dsZS5sZWZ0ICYmIGZ4IDwgbV9jb2xvclRvZ2dsZS5yaWdodCAmJiBmeSA+IG1fY29sb3JUb2dnbGUudG9wICYmIGZ5IDwgbV9jb2xvclRvZ2dsZS5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9jb2xvclRvZ2dsZTsKKyAgICBlbHNlIGlmIChmeCA+IG1fZnVsbFNjcmVlblRvZ2dsZS5sZWZ0ICYmIGZ4IDwgbV9mdWxsU2NyZWVuVG9nZ2xlLnJpZ2h0ICYmIGZ5ID4gbV9mdWxsU2NyZWVuVG9nZ2xlLnRvcCAmJiBmeSA8IG1fZnVsbFNjcmVlblRvZ2dsZS5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9mdWxsU2NyZWVuVG9nZ2xlOworICAgIGVsc2UgaWYgKGZ4ID4gbV9jbGVhclN1cmZhY2UubGVmdCAmJiBmeCA8IG1fY2xlYXJTdXJmYWNlLnJpZ2h0ICYmIGZ5ID4gbV9jbGVhclN1cmZhY2UudG9wICYmIGZ5IDwgbV9jbGVhclN1cmZhY2UuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fY2xlYXJTdXJmYWNlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUGFpbnRQbHVnaW46OnRvZ2dsZUlucHV0TWV0aG9kKCkgeworICAgIG1faXNUb3VjaEN1cnJlbnRJbnB1dCA9ICFtX2lzVG91Y2hDdXJyZW50SW5wdXQ7CisKKyAgICAvLyBsb2NrIG9ubHkgdGhlIGlucHV0IHRvZ2dsZSBhbmQgcmVkcmF3IHRoZSBjYW52YXMKKyAgICBBTlBDYW52YXMqIGxvY2tlZENhbnZhcyA9IGdldENhbnZhcygmbV9pbnB1dFRvZ2dsZSk7CisgICAgZHJhd0NsZWFuUGx1Z2luKGxvY2tlZENhbnZhcyk7Cit9CisKK3ZvaWQgUGFpbnRQbHVnaW46OnRvZ2dsZVBhaW50Q29sb3IoKSB7CisgICAgaWYgKG1fYWN0aXZlUGFpbnRDb2xvciA9PSBzX2JsdWVDb2xvcikKKyAgICAgICAgbV9hY3RpdmVQYWludENvbG9yID0gc19yZWRDb2xvcjsKKyAgICBlbHNlIGlmIChtX2FjdGl2ZVBhaW50Q29sb3IgPT0gc19ncmVlbkNvbG9yKQorICAgICAgICBtX2FjdGl2ZVBhaW50Q29sb3IgPSBzX2JsdWVDb2xvcjsKKyAgICBlbHNlCisgICAgICAgIG1fYWN0aXZlUGFpbnRDb2xvciA9IHNfZ3JlZW5Db2xvcjsKKworICAgIC8vIGxvY2sgb25seSB0aGUgY29sb3IgdG9nZ2xlIGFuZCByZWRyYXcgdGhlIGNhbnZhcworICAgIEFOUENhbnZhcyogbG9ja2VkQ2FudmFzID0gZ2V0Q2FudmFzKCZtX2NvbG9yVG9nZ2xlKTsKKyAgICBkcmF3Q2xlYW5QbHVnaW4obG9ja2VkQ2FudmFzKTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6cGFpbnRNb3VzZShpbnQgeCwgaW50IHkpIHsKKyAgICAvL1RPRE8gZG8gbm90IHBhaW50IG91dHNpZGUgdGhlIGRyYXdpbmcgc3VyZmFjZQorCisgICAgLy9jcmVhdGUgdGhlIHBhaW50IGNvbG9yCisgICAgQU5QUGFpbnQqIGZpbGxQYWludCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKGZpbGxQYWludCwgZ1BhaW50SS5nZXRGbGFncyhmaWxsUGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0U3R5bGUoZmlsbFBhaW50LCBrRmlsbF9BTlBQYWludFN0eWxlKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKGZpbGxQYWludCwgbV9hY3RpdmVQYWludENvbG9yKTsKKworICAgIC8vIGhhbmRsZSB0aGUgc2ltcGxlICJtb3VzZSIgcGFpbnQgKGRyYXcgYSBwb2ludCkKKyAgICBBTlBSZWN0RiBwb2ludDsKKyAgICBwb2ludC5sZWZ0ID0gICAoZmxvYXQpIHgtMzsKKyAgICBwb2ludC50b3AgPSAgICAoZmxvYXQpIHktMzsKKyAgICBwb2ludC5yaWdodCA9ICAoZmxvYXQpIHgrMzsKKyAgICBwb2ludC5ib3R0b20gPSAoZmxvYXQpIHkrMzsKKworICAgIC8vIGdldCBhIGNhbnZhcyB0aGF0IGlzIG9ubHkgbG9ja2VkIGFyb3VuZCB0aGUgcG9pbnQgYW5kIGRyYXcgaXQKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdldENhbnZhcygmcG9pbnQpOworICAgIGdDYW52YXNJLmRyYXdPdmFsKGNhbnZhcywgJnBvaW50LCBmaWxsUGFpbnQpOworCisgICAgLy8gY2xlYW4gdXAKKyAgICByZWxlYXNlQ2FudmFzKGNhbnZhcyk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChmaWxsUGFpbnQpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpwYWludFRvdWNoKCkgeworICAgIC8vVE9ETyBkbyBub3QgcGFpbnQgb3V0c2lkZSB0aGUgZHJhd2luZyBzdXJmYWNlCisKKyAgICAvL2NyZWF0ZSB0aGUgcGFpbnQgY29sb3IKKyAgICBBTlBQYWludCogc3Ryb2tlUGFpbnQgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhzdHJva2VQYWludCwgZ1BhaW50SS5nZXRGbGFncyhzdHJva2VQYWludCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihzdHJva2VQYWludCwgbV9hY3RpdmVQYWludENvbG9yKTsKKyAgICBnUGFpbnRJLnNldFN0eWxlKHN0cm9rZVBhaW50LCBrU3Ryb2tlX0FOUFBhaW50U3R5bGUpOworICAgIGdQYWludEkuc2V0U3Ryb2tlV2lkdGgoc3Ryb2tlUGFpbnQsIDYuMCk7CisgICAgZ1BhaW50SS5zZXRTdHJva2VDYXAoc3Ryb2tlUGFpbnQsIGtSb3VuZF9BTlBQYWludENhcCk7CisgICAgZ1BhaW50SS5zZXRTdHJva2VKb2luKHN0cm9rZVBhaW50LCBrUm91bmRfQU5QUGFpbnRKb2luKTsKKworICAgIC8vIGhhbmRsZSB0aGUgY29tcGxleCAidG91Y2giIHBhaW50IChkcmF3IGEgbGluZSkKKyAgICBBTlBSZWN0RiBib3VuZHM7CisgICAgZ1BhdGhJLmdldEJvdW5kcyhtX3RvdWNoUGF0aCwgJmJvdW5kcyk7CisKKyAgICAvLyBnZXQgYSBjYW52YXMgdGhhdCBpcyBvbmx5IGxvY2tlZCBhcm91bmQgdGhlIHBvaW50IGFuZCBkcmF3IHRoZSBwYXRoCisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnZXRDYW52YXMoJmJvdW5kcyk7CisgICAgZ0NhbnZhc0kuZHJhd1BhdGgoY2FudmFzLCBtX3RvdWNoUGF0aCwgc3Ryb2tlUGFpbnQpOworCisgICAgLy8gY2xlYW4gdXAKKyAgICByZWxlYXNlQ2FudmFzKGNhbnZhcyk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChzdHJva2VQYWludCk7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkZjYyNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgcGFpbnRQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgcGFpbnRQbHVnaW5fX0RFRklORUQKKworY2xhc3MgUGFpbnRQbHVnaW4gOiBwdWJsaWMgU3VyZmFjZVN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgUGFpbnRQbHVnaW4oTlBQIGluc3QpOworICAgIHZpcnR1YWwgflBhaW50UGx1Z2luKCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgZHJhd0NsZWFuUGx1Z2luKEFOUENhbnZhcyogY2FudmFzID0gTlVMTCk7CisgICAgQU5QQ2FudmFzKiAgZ2V0Q2FudmFzKEFOUFJlY3RJKiBkaXJ0eVJlY3QgPSBOVUxMKTsKKyAgICBBTlBDYW52YXMqICBnZXRDYW52YXMoQU5QUmVjdEYqIGRpcnR5UmVjdCk7CisgICAgY29uc3QgY2hhciogZ2V0Q29sb3JUZXh0KCk7CisgICAgdm9pZCAgICAgICAgZGVzdHJveVN1cmZhY2UoKTsKKyAgICB2b2lkICAgICAgICBwYWludE1vdXNlKGludCB4LCBpbnQgeSk7CisgICAgdm9pZCAgICAgICAgcGFpbnRUb3VjaCgpOworICAgIHZvaWQgICAgICAgIHJlbGVhc2VDYW52YXMoQU5QQ2FudmFzKik7CisgICAgdm9pZCAgICAgICAgdG9nZ2xlSW5wdXRNZXRob2QoKTsKKyAgICB2b2lkICAgICAgICB0b2dnbGVQYWludENvbG9yKCk7CisgICAgQU5QUmVjdEYqICAgdmFsaWRUb3VjaChpbnQgeCwgaW50IHkpOworCisgICAgYm9vbCAgICAgICAgbV9pc1RvdWNoQWN0aXZlOworICAgIGJvb2wgICAgICAgIG1faXNUb3VjaEN1cnJlbnRJbnB1dDsKKworICAgIGpvYmplY3QgICAgIG1fc3VyZmFjZTsKKyAgICBBTlBQYXRoKiAgICBtX3RvdWNoUGF0aDsKKworICAgIEFOUFJlY3RGICAgIG1fZHJhd2luZ1N1cmZhY2U7CisgICAgQU5QUmVjdEYgICAgbV9pbnB1dFRvZ2dsZTsKKyAgICBBTlBSZWN0RiAgICBtX2NvbG9yVG9nZ2xlOworICAgIEFOUFJlY3RGICAgIG1fZnVsbFNjcmVlblRvZ2dsZTsKKyAgICBBTlBSZWN0RiAgICBtX2NsZWFyU3VyZmFjZTsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRTdXJmYWNlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRCdXR0b247CisKKyAgICBBTlBDb2xvciAgICBtX2FjdGl2ZVBhaW50Q29sb3I7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfcmVkQ29sb3IgICA9IDB4RkZGRjAwMDA7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfZ3JlZW5Db2xvciA9IDB4RkYwMEZGMDA7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfYmx1ZUNvbG9yICA9IDB4RkYwMDAwRkY7Cit9OworCisjZW5kaWYgLy8gcGFpbnRQbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS92aWRlby9WaWRlb1BsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzYWI3NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlZpZGVvUGx1Z2luLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ucGFwaS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiBOUE5ldHNjYXBlRnVuY3MqICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUEJpdG1hcEludGVyZmFjZVYwICAgIGdCaXRtYXBJOworZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgIGdDYW52YXNJOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUFBhaW50SW50ZXJmYWNlVjAgICAgIGdQYWludEk7CitleHRlcm4gQU5QU3VyZmFjZUludGVyZmFjZVYwICAgZ1N1cmZhY2VJOworZXh0ZXJuIEFOUFN5c3RlbUludGVyZmFjZVYwICAgIGdTeXN0ZW1JOworZXh0ZXJuIEFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgZ1dpbmRvd0k7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVmlkZW9QbHVnaW46OlZpZGVvUGx1Z2luKE5QUCBpbnN0KSA6IFN1cmZhY2VTdWJQbHVnaW4oaW5zdCkgeworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZHJhd2luZyBzdXJmYWNlCisgICAgbV9zdXJmYWNlID0gTlVMTDsKKworICAgIC8vcmVnaXN0ZXIgZm9yIHRvdWNoIGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitWaWRlb1BsdWdpbjo6flZpZGVvUGx1Z2luKCkgeworICAgIHNldENvbnRleHQoTlVMTCk7CisgICAgZGVzdHJveVN1cmZhY2UoKTsKK30KKworam9iamVjdCBWaWRlb1BsdWdpbjo6Z2V0U3VyZmFjZSgpIHsKKworICAgIGlmIChtX3N1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG1fc3VyZmFjZTsKKyAgICB9CisKKyAgICAvLyBsb2FkIHRoZSBhcHByb3ByaWF0ZSBqYXZhIGNsYXNzIGFuZCBpbnN0YW50aWF0ZSBpdAorICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICBpZiAoZ1ZNLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSAhPSBKTklfT0spIHsKKyAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0gZ2V0U3VyZmFjZTogZmFpbGVkIHRvIGdldCBlbnYiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgY2hhciogY2xhc3NOYW1lID0gImNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbi5WaWRlb1N1cmZhY2UiOworICAgIGpjbGFzcyB2aWRlb0NsYXNzID0gZ1N5c3RlbUkubG9hZEphdmFDbGFzcyhpbnN0KCksIGNsYXNzTmFtZSk7CisKKyAgICBpZighdmlkZW9DbGFzcykgeworICAgICAgICBnTG9nSS5sb2coa0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLSBnZXRTdXJmYWNlOiBmYWlsZWQgdG8gbG9hZCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0b3IgPSBlbnYtPkdldE1ldGhvZElEKHZpZGVvQ2xhc3MsICI8aW5pdD4iLCAiKExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDspViIpOworICAgIGpvYmplY3QgdmlkZW9TdXJmYWNlID0gZW52LT5OZXdPYmplY3QodmlkZW9DbGFzcywgY29uc3RydWN0b3IsIG1fY29udGV4dCk7CisKKyAgICBpZighdmlkZW9TdXJmYWNlKSB7CisgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tIGdldFN1cmZhY2U6IGZhaWxlZCB0byBjb25zdHJ1Y3Qgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1fc3VyZmFjZSA9IGVudi0+TmV3R2xvYmFsUmVmKHZpZGVvU3VyZmFjZSk7CisgICAgcmV0dXJuIG1fc3VyZmFjZTsKK30KKwordm9pZCBWaWRlb1BsdWdpbjo6ZGVzdHJveVN1cmZhY2UoKSB7CisgICAgSk5JRW52KiBlbnYgPSBOVUxMOworICAgIGlmIChtX3N1cmZhY2UgJiYgZ1ZNLT5HZXRFbnYoKHZvaWQqKikgJmVudiwgSk5JX1ZFUlNJT05fMV80KSA9PSBKTklfT0spIHsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobV9zdXJmYWNlKTsKKyAgICAgICAgbV9zdXJmYWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2ludDE2X3QgVmlkZW9QbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6IHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtFbnRlckZ1bGxTY3JlZW5fQU5QTGlmZWN5Y2xlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLSAlcCBlbnRlcmluZyBmdWxsc2NyZWVuIiwgaW5zdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrRXhpdEZ1bGxTY3JlZW5fQU5QTGlmZWN5Y2xlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coa0RlYnVnX0FOUExvZ1R5cGUsICIgLS0tLSAlcCBleGl0aW5nIGZ1bGxzY3JlZW4iLCBpbnN0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOyAvLyBlbmQga0xpZmVjeWNsZV9BTlBFdmVudFR5cGUKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgdGhlIHBsdWdpbiBkaWQgbm90IHJlcXVlc3QgZHJhdyBldmVudHMiLCBpbnN0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZ0xvZ0kubG9nKGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCByZXF1ZXN0aW5nIGZ1bGxzY3JlZW4gbW9kZSIsIGluc3QoKSk7CisgICAgICAgICAgICAgICAgZ1dpbmRvd0kucmVxdWVzdEZ1bGxTY3JlZW4oaW5zdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIGtLZXlfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBrZXkgZXZlbnRzIiwgaW5zdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNTM4NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIHZpZGVvUGx1Z2luX19ERUZJTkVECisjZGVmaW5lIHZpZGVvUGx1Z2luX19ERUZJTkVECisKK2NsYXNzIFZpZGVvUGx1Z2luIDogcHVibGljIFN1cmZhY2VTdWJQbHVnaW4geworcHVibGljOgorICAgIFZpZGVvUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5WaWRlb1BsdWdpbigpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0U3VyZmFjZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgZGVzdHJveVN1cmZhY2UoKTsKKworICAgIGpvYmplY3QgICAgIG1fc3VyZmFjZTsKK307CisKKyNlbmRpZiAvLyB2aWRlb1BsdWdpbl9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS1oZHBpL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlLWhkcGkvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDlkNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS1oZHBpL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS1tZHBpL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlLW1kcGkvc2FtcGxlX2Jyb3dzZXJfcGx1Z2luLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40N2M3OWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS1tZHBpL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhkZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgPHN0cmluZyBuYW1lPSJzYW1wbGVfYnJvd3Nlcl9wbHVnaW4iPlNhbXBsZSBCcm93c2VyIFBsdWdpbjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9BbmltYXRpb25TdXJmYWNlLmphdmEgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9BbmltYXRpb25TdXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhZmFiNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL0FuaW1hdGlvblN1cmZhY2UuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEFuaW1hdGlvblN1cmZhY2UgZXh0ZW5kcyBUZXh0VmlldyB7CisKKyAgICBwdWJsaWMgQW5pbWF0aW9uU3VyZmFjZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgTG9nLmUoIkFuaW1TdXJmYWNlIiwgIklOIEFOSU1BVElPTiBTVVJGQUNFIik7CisgICAgICAgIAorICAgICAgICB0aGlzLnNldEJhY2tncm91bmRDb2xvcihDb2xvci5HUkFZKTsKKyAgICAgICAgdGhpcy5zZXRUZXh0Q29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICB0aGlzLnNldFRleHQoIlRoaXMgaXMgYSBmdWxsLXNjcmVlbiBwbHVnaW4iKTsKKworICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBzeXN0ZW0gaXMgYXdhcmUgdGhhdCB3ZSB3aWxsIGJlIGRyYXdpbmcKKyAgICAgICAgdGhpcy5zZXRXaWxsTm90RHJhdyhmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vQmFja2dyb3VuZFN1cmZhY2UuamF2YSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL0JhY2tncm91bmRTdXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOGM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL0JhY2tncm91bmRTdXJmYWNlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW47CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgQmFja2dyb3VuZFN1cmZhY2UgZXh0ZW5kcyBUZXh0VmlldyB7CisKKyAgICBwdWJsaWMgQmFja2dyb3VuZFN1cmZhY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLkJMQUNLKTsKKyAgICAgICAgdGhpcy5zZXRUZXh0Q29sb3IoQ29sb3IuV0hJVEUpOworICAgICAgICB0aGlzLnNldFRleHQoIlRoaXMgaXMgYSBqYXZhIGJhY2tncm91bmQgcGx1Z2luIik7CisKKyAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgc3lzdGVtIGlzIGF3YXJlIHRoYXQgd2Ugd2lsbCBiZSBkcmF3aW5nCisgICAgICAgIHRoaXMuc2V0V2lsbE5vdERyYXcoZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL0JhY2tncm91bmRUZXN0LmphdmEgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9CYWNrZ3JvdW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmIwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9CYWNrZ3JvdW5kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luOworCitwdWJsaWMgY2xhc3MgQmFja2dyb3VuZFRlc3QgeworCisgICAgcHVibGljIEJhY2tncm91bmRUZXN0KCkge30KKyAgICAKKyAgICBwdWJsaWMgaW50IGFkZEludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgcmV0dXJuIHggKyB5OworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1BhaW50U3VyZmFjZS5qYXZhIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vUGFpbnRTdXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MmJjYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1BhaW50U3VyZmFjZS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyLkNhbGxiYWNrOworCitwdWJsaWMgY2xhc3MgUGFpbnRTdXJmYWNlIGV4dGVuZHMgU3VyZmFjZVZpZXcgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy9uZWVkZWQgZm9yIGpuaSBjYWxscworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoInNhbXBsZXBsdWdpbiIpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IG5wcDsKKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZE5QUCA9IHRydWU7CisgICAgcHJpdmF0ZSBPYmplY3QgbnBwTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHB1YmxpYyBQYWludFN1cmZhY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgTlBQLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgdGhpcy5ucHAgPSBOUFA7CisKKyAgICAgICAgdGhpcy5nZXRIb2xkZXIoKS5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuUkdCQV84ODg4KTsKKyAgICAgICAgdGhpcy5nZXRIb2xkZXIoKS5hZGRDYWxsYmFjayhuZXcgQ2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG5wcExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkTlBQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTdXJmYWNlQ2hhbmdlZChucHAsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChucHBMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZE5QUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU3VyZmFjZUNyZWF0ZWQobnBwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobnBwTG9jaykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWROUFApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVN1cmZhY2VEZXN0cm95ZWQobnBwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gc2V0cyB0aGUgcGx1Z2luJ3Mgc3VyZmFjZSB0byBhIGZpeGVkIHNpemUKKyAgICAgICAgdGhpcy5nZXRIb2xkZXIoKS5zZXRGaXhlZFNpemUod2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHZpZXcgc3lzdGVtIGlzIGF3YXJlIHRoYXQgd2Ugd2lsbCBiZSBkcmF3aW5nCisgICAgICAgIHRoaXMuc2V0V2lsbE5vdERyYXcoZmFsc2UpOworICAgIH0KKworICAgIC8vIGNhbGxlZCBieSBKTkkKKyAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZU5QUCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChucHBMb2NrKSB7CisgICAgICAgICAgICB2YWxpZE5QUCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTdXJmYWNlQ3JlYXRlZChpbnQgbnBwKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVN1cmZhY2VDaGFuZ2VkKGludCBucHAsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTdXJmYWNlRGVzdHJveWVkKGludCBucHApOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vU2FtcGxlUGx1Z2luLmphdmEgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9TYW1wbGVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vU2FtcGxlUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKKworcHVibGljIGNsYXNzIFNhbXBsZVBsdWdpbiBleHRlbmRzIFNlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9WaWRlb1N1cmZhY2UuamF2YSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1ZpZGVvU3VyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzgwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9WaWRlb1N1cmZhY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW47CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zYW1wbGVwbHVnaW4uZ3JhcGhpY3MuQ3ViZVJlbmRlcmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3OworCitwdWJsaWMgY2xhc3MgVmlkZW9TdXJmYWNlIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgcHVibGljIFZpZGVvU3VyZmFjZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgTGF5b3V0UGFyYW1zIGZwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuRklMTF9QQVJFTlQsIExheW91dFBhcmFtcy5GSUxMX1BBUkVOVCk7CisgICAgICAgIHRoaXMuc2V0TGF5b3V0UGFyYW1zKGZwKTsKKworLy8gICAgICAgIFZpZGVvVmlldyB2aWRlbyA9IG5ldyBWaWRlb1ZpZXcoY29udGV4dCk7CisvLyAgICAgICAgTGF5b3V0UGFyYW1zIHZwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuRklMTF9QQVJFTlQsIExheW91dFBhcmFtcy5GSUxMX1BBUkVOVCk7CisvLyAgICAgICAgdnAuc2V0TGF5b3V0UGFyYW1zKHZwKTsKKworICAgICAgICBHTFN1cmZhY2VWaWV3IGdsID0gbmV3IEdMU3VyZmFjZVZpZXcoY29udGV4dCk7CisgICAgICAgIExheW91dFBhcmFtcyBncCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLkZJTExfUEFSRU5ULCBMYXlvdXRQYXJhbXMuRklMTF9QQVJFTlQpOworICAgICAgICBnbC5zZXRMYXlvdXRQYXJhbXMoZ3ApOworCisgICAgICAgIHRoaXMuYWRkVmlldyhnbCk7CisvLyAgICAgICAgdGhpcy5hZGRWaWV3KHZpZGVvKTsKKworICAgICAgICAvLyBUZWxsIHRoZSBjdWJlIHJlbmRlcmVyIHRoYXQgd2Ugd2FudCB0byByZW5kZXIgYSB0cmFuc2x1Y2VudCB2ZXJzaW9uCisgICAgICAgIC8vIG9mIHRoZSBjdWJlOgorICAgICAgICBnbC5zZXRSZW5kZXJlcihuZXcgQ3ViZVJlbmRlcmVyKGZhbHNlKSk7CisgICAgICAgIGdsLnNldFdpbmRvd1R5cGUoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9NRURJQV9PVkVSTEFZKTsKKworLy8gICAgICAgIHZpZGVvLnNldFZpZGVvUGF0aCgiL3NkY2FyZC90ZXN0X3ZpZGVvLjNncCIpOworLy8gICAgICAgIHZpZGVvLnNldE1lZGlhQ29udHJvbGxlcihuZXcgTWVkaWFDb250cm9sbGVyKGNvbnRleHQpKTsKKy8vICAgICAgICB2aWRlby5yZXF1ZXN0Rm9jdXMoKTsKKworICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgdmlldyBzeXN0ZW0gaXMgYXdhcmUgdGhhdCB3ZSB3aWxsIGJlIGRyYXdpbmcKKyAgICAgICAgdGhpcy5zZXRXaWxsTm90RHJhdyhmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vZ3JhcGhpY3MvQ3ViZS5qYXZhIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVwbHVnaW4vZ3JhcGhpY3MvQ3ViZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDE0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9ncmFwaGljcy9DdWJlLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbi5ncmFwaGljczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CisKKy8qKgorICogQSB2ZXJ0ZXggc2hhZGVkIGN1YmUuCisgKi8KK2NsYXNzIEN1YmUKK3sKKyAgICBwdWJsaWMgQ3ViZSgpCisgICAgeworICAgICAgICBpbnQgb25lID0gMHgxMDAwMDsKKyAgICAgICAgaW50IHZlcnRpY2VzW10gPSB7CisgICAgICAgICAgICAgICAgLW9uZSwgLW9uZSwgLW9uZSwKKyAgICAgICAgICAgICAgICBvbmUsIC1vbmUsIC1vbmUsCisgICAgICAgICAgICAgICAgb25lLCAgb25lLCAtb25lLAorICAgICAgICAgICAgICAgIC1vbmUsICBvbmUsIC1vbmUsCisgICAgICAgICAgICAgICAgLW9uZSwgLW9uZSwgIG9uZSwKKyAgICAgICAgICAgICAgICBvbmUsIC1vbmUsICBvbmUsCisgICAgICAgICAgICAgICAgb25lLCAgb25lLCAgb25lLAorICAgICAgICAgICAgICAgIC1vbmUsICBvbmUsICBvbmUsCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGNvbG9yc1tdID0geworICAgICAgICAgICAgICAgIDAsICAgIDAsICAgIDAsICBvbmUsCisgICAgICAgICAgICAgICAgb25lLCAgICAwLCAgICAwLCAgb25lLAorICAgICAgICAgICAgICAgIG9uZSwgIG9uZSwgICAgMCwgIG9uZSwKKyAgICAgICAgICAgICAgICAwLCAgb25lLCAgICAwLCAgb25lLAorICAgICAgICAgICAgICAgIDAsICAgIDAsICBvbmUsICBvbmUsCisgICAgICAgICAgICAgICAgb25lLCAgICAwLCAgb25lLCAgb25lLAorICAgICAgICAgICAgICAgIG9uZSwgIG9uZSwgIG9uZSwgIG9uZSwKKyAgICAgICAgICAgICAgICAwLCAgb25lLCAgb25lLCAgb25lLAorICAgICAgICB9OworCisgICAgICAgIGJ5dGUgaW5kaWNlc1tdID0geworICAgICAgICAgICAgICAgIDAsIDQsIDUsICAgIDAsIDUsIDEsCisgICAgICAgICAgICAgICAgMSwgNSwgNiwgICAgMSwgNiwgMiwKKyAgICAgICAgICAgICAgICAyLCA2LCA3LCAgICAyLCA3LCAzLAorICAgICAgICAgICAgICAgIDMsIDcsIDQsICAgIDMsIDQsIDAsCisgICAgICAgICAgICAgICAgNCwgNywgNiwgICAgNCwgNiwgNSwKKyAgICAgICAgICAgICAgICAzLCAwLCAxLCAgICAzLCAxLCAyCisgICAgICAgIH07CisKKyAgICAgICAgLy8gQnVmZmVycyB0byBiZSBwYXNzZWQgdG8gZ2wqUG9pbnRlcigpIGZ1bmN0aW9ucworICAgICAgICAvLyBtdXN0IGJlIGRpcmVjdCwgaS5lLiwgdGhleSBtdXN0IGJlIHBsYWNlZCBvbiB0aGUKKyAgICAgICAgLy8gbmF0aXZlIGhlYXAgd2hlcmUgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGNhbm5vdAorICAgICAgICAvLyBtb3ZlIHRoZW0uCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1ZmZlcnMgd2l0aCBtdWx0aS1ieXRlIGRhdGF0eXBlcyAoZS5nLiwgc2hvcnQsIGludCwgZmxvYXQpCisgICAgICAgIC8vIG11c3QgaGF2ZSB0aGVpciBieXRlIG9yZGVyIHNldCB0byBuYXRpdmUgb3JkZXIKKworICAgICAgICBCeXRlQnVmZmVyIHZiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QodmVydGljZXMubGVuZ3RoKjQpOworICAgICAgICB2YmIub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworICAgICAgICBtVmVydGV4QnVmZmVyID0gdmJiLmFzSW50QnVmZmVyKCk7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHZlcnRpY2VzKTsKKyAgICAgICAgbVZlcnRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKworICAgICAgICBCeXRlQnVmZmVyIGNiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoY29sb3JzLmxlbmd0aCo0KTsKKyAgICAgICAgY2JiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgbUNvbG9yQnVmZmVyID0gY2JiLmFzSW50QnVmZmVyKCk7CisgICAgICAgIG1Db2xvckJ1ZmZlci5wdXQoY29sb3JzKTsKKyAgICAgICAgbUNvbG9yQnVmZmVyLnBvc2l0aW9uKDApOworCisgICAgICAgIG1JbmRleEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoaW5kaWNlcy5sZW5ndGgpOworICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGluZGljZXMpOworICAgICAgICBtSW5kZXhCdWZmZXIucG9zaXRpb24oMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHJhdyhHTDEwIGdsKQorICAgIHsKKyAgICAgICAgZ2wuZ2xGcm9udEZhY2UoZ2wuR0xfQ1cpOworICAgICAgICBnbC5nbFZlcnRleFBvaW50ZXIoMywgZ2wuR0xfRklYRUQsIDAsIG1WZXJ0ZXhCdWZmZXIpOworICAgICAgICBnbC5nbENvbG9yUG9pbnRlcig0LCBnbC5HTF9GSVhFRCwgMCwgbUNvbG9yQnVmZmVyKTsKKyAgICAgICAgZ2wuZ2xEcmF3RWxlbWVudHMoZ2wuR0xfVFJJQU5HTEVTLCAzNiwgZ2wuR0xfVU5TSUdORURfQllURSwgbUluZGV4QnVmZmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEludEJ1ZmZlciAgIG1WZXJ0ZXhCdWZmZXI7CisgICAgcHJpdmF0ZSBJbnRCdWZmZXIgICBtQ29sb3JCdWZmZXI7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyICBtSW5kZXhCdWZmZXI7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9ncmFwaGljcy9DdWJlUmVuZGVyZXIuamF2YSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL2dyYXBoaWNzL0N1YmVSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmFjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9ncmFwaGljcy9DdWJlUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlcGx1Z2luLmdyYXBoaWNzOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7CisKKy8qKgorICogUmVuZGVyIGEgcGFpciBvZiB0dW1ibGluZyBjdWJlcy4KKyAqLworCitwdWJsaWMgY2xhc3MgQ3ViZVJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgcHVibGljIEN1YmVSZW5kZXJlcihib29sZWFuIHVzZVRyYW5zbHVjZW50QmFja2dyb3VuZCkgeworICAgICAgICBtVHJhbnNsdWNlbnRCYWNrZ3JvdW5kID0gdXNlVHJhbnNsdWNlbnRCYWNrZ3JvdW5kOworICAgICAgICBtQ3ViZSA9IG5ldyBDdWJlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworICAgICAgICAvKgorICAgICAgICAgKiBVc3VhbGx5LCB0aGUgZmlyc3QgdGhpbmcgb25lIG1pZ2h0IHdhbnQgdG8gZG8gaXMgdG8gY2xlYXIKKyAgICAgICAgICogdGhlIHNjcmVlbi4gVGhlIG1vc3QgZWZmaWNpZW50IHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIHVzZQorICAgICAgICAgKiBnbENsZWFyKCkuCisgICAgICAgICAqLworCisgICAgICAgIGdsLmdsQ2xlYXIoR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wxMC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBOb3cgd2UncmUgcmVhZHkgdG8gZHJhdyBzb21lIDNEIG9iamVjdHMKKyAgICAgICAgICovCisKKyAgICAgICAgZ2wuZ2xNYXRyaXhNb2RlKEdMMTAuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgZ2wuZ2xUcmFuc2xhdGVmKDAsIDAsIC0zLjBmKTsKKyAgICAgICAgZ2wuZ2xSb3RhdGVmKG1BbmdsZSwgICAgICAgIDAsIDEsIDApOworICAgICAgICBnbC5nbFJvdGF0ZWYobUFuZ2xlKjAuMjVmLCAgMSwgMCwgMCk7CisKKyAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgbUN1YmUuZHJhdyhnbCk7CisKKyAgICAgICAgZ2wuZ2xSb3RhdGVmKG1BbmdsZSoyLjBmLCAwLCAxLCAxKTsKKyAgICAgICAgZ2wuZ2xUcmFuc2xhdGVmKDAuNWYsIDAuNWYsIDAuNWYpOworCisgICAgICAgIG1DdWJlLmRyYXcoZ2wpOworCisgICAgICAgIG1BbmdsZSArPSAxLjJmOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAvKgorICAgICAgICAgICogU2V0IG91ciBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgZG9uZQorICAgICAgICAgICogZWFjaCB0aW1lIHdlIGRyYXcsIGJ1dCB1c3VhbGx5IGEgbmV3IHByb2plY3Rpb24gbmVlZHMgdG8KKyAgICAgICAgICAqIGJlIHNldCB3aGVuIHRoZSB2aWV3cG9ydCBpcyByZXNpemVkLgorICAgICAgICAgICovCisKKyAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSB3aWR0aCAvIGhlaWdodDsKKyAgICAgICAgIGdsLmdsTWF0cml4TW9kZShHTDEwLkdMX1BST0pFQ1RJT04pOworICAgICAgICAgZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgIGdsLmdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgZGVmYXVsdCwgT3BlbkdMIGVuYWJsZXMgZmVhdHVyZXMgdGhhdCBpbXByb3ZlIHF1YWxpdHkKKyAgICAgICAgICogYnV0IHJlZHVjZSBwZXJmb3JtYW5jZS4gT25lIG1pZ2h0IHdhbnQgdG8gdHdlYWsgdGhhdAorICAgICAgICAgKiBlc3BlY2lhbGx5IG9uIHNvZnR3YXJlIHJlbmRlcmVyLgorICAgICAgICAgKi8KKyAgICAgICAgZ2wuZ2xEaXNhYmxlKEdMMTAuR0xfRElUSEVSKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTb21lIG9uZS10aW1lIE9wZW5HTCBpbml0aWFsaXphdGlvbiBjYW4gYmUgbWFkZSBoZXJlCisgICAgICAgICAqIHByb2JhYmx5IGJhc2VkIG9uIGZlYXR1cmVzIG9mIHRoaXMgcGFydGljdWxhciBjb250ZXh0CisgICAgICAgICAqLworICAgICAgICAgZ2wuZ2xIaW50KEdMMTAuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULAorICAgICAgICAgICAgICAgICBHTDEwLkdMX0ZBU1RFU1QpOworCisgICAgICAgICBpZiAobVRyYW5zbHVjZW50QmFja2dyb3VuZCkgeworICAgICAgICAgICAgIGdsLmdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgZ2wuZ2xDbGVhckNvbG9yKDEsMSwxLDEpOworICAgICAgICAgfQorICAgICAgICAgZ2wuZ2xFbmFibGUoR0wxMC5HTF9DVUxMX0ZBQ0UpOworICAgICAgICAgZ2wuZ2xTaGFkZU1vZGVsKEdMMTAuR0xfU01PT1RIKTsKKyAgICAgICAgIGdsLmdsRW5hYmxlKEdMMTAuR0xfREVQVEhfVEVTVCk7CisgICAgfQorICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhbnNsdWNlbnRCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgQ3ViZSBtQ3ViZTsKKyAgICBwcml2YXRlIGZsb2F0IG1BbmdsZTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9BbmRyb2lkLm1rIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YWUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKKworIyBPbmx5IGNvbXBpbGUgc291cmNlIGphdmEgZmlsZXMgaW4gdGhpcyBhcGsuCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBIb25leWNvbWJHYWxsZXJ5CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgVXNlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0byBtYWtlIG91ciB0ZXN0IGFway4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2MTYzYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeSIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorCisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsb2dvPSJAZHJhd2FibGUvbG9nbyIKKyAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0FwcFRoZW1lLkxpZ2h0IgorICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZGVidWdnYWJsZT0idHJ1ZSI+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLk1haW5BY3Rpdml0eSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnkuYWN0aW9uLkRJQUxPRyIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gQ2FtZXJhU2FtcGxlIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQ2FtZXJhU2FtcGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9jYW1lcmFfc2FtcGxlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIiAvPgorICAgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvX2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0MTY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9faW5kZXguaHRtbApAQCAtMCwwICsxLDQyIEBACis8cD5UaGlzIGlzIGEgZGVtbyBhcHBsaWNhdGlvbiBoaWdobGlnaHRpbmcgaG93IHRvIHVzZSBzb21lIG9mIHRoZSBuZXcgQVBJcyBpbgorSG9uZXljb21iLCBpbmNsdWRpbmc6PC9wPgorCis8dWw+CisgIDxsaT48YSBocmVmPSIuLi8uLi8uLi9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2ZyYWdtZW50cy5odG1sIj5GcmFnbWVudHM8L2E+PC9saT4KKyAgPGxpPlRoZSA8YSBocmVmPSIuLi8uLi8uLi9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmh0bWwiPmFjdGlvbiBiYXI8L2E+CisgICAgICBhbmQgY29udGV4dHVhbCBhY3Rpb24gYmFyPC9saT4KKyAgPGxpPkRyYWcgYW5kIGRyb3A8L2xpPgorICA8bGk+VGhlIG5ldyA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjxjb2RlPmFuZHJvaWQuYW5pbWF0aW9uPC9jb2RlPjwvYT4KKyAgICAgIGZyYW1ld29yazwvbGk+CisgIDxsaT5DdXN0b20gbm90aWZpY2F0aW9uczwvbGk+CisgIDxsaT5Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGltcGxlbWVudCA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3Lmh0bWwiPjxjb2RlPlN0YWNrVmlldzwvY29kZT48L2E+CisgICAgICBhbmQgb3RoZXIgYWRhcHRlci1iYXNlZCBhcHAgd2lkZ2V0cywgc2VlIDxhIGhyZWY9Ii4uL1N0YWNrV2lkZ2V0L2luZGV4Lmh0bWwiPlN0YWNrVmlldyBBcHAgV2lkZ2V0PC9hPjwvbGk+Cis8L3VsPgorCis8cD5UaGUgaW1hZ2UgZ2FsbGVyeSBzaG93cyBob3cgYWxsIHRoZXNlIHBpZWNlcyBjYW4gd29yayB0b2dldGhlciBpbiBvbmUgYXBwbGljYXRpb24uPC9wPgorCis8cD5UaGUgYXBwbGljYXRpb24gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBrZXkgY2xhc3Nlczo8cD4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9Db250ZW50RnJhZ21lbnQuaHRtbCI+Q29udGVudEZyYWdtZW50PC9hPgorICAgICAgQSBmcmFnbWVudCByZXNwb25zaWJsZSBmb3IgY29udGFpbmluZyB0aGUgImNvbnRlbnQiIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgIERpc3BsYXlzIGltYWdlcywgcmVjZWl2ZXMgZHJhZy9kcm9wIGV2ZW50cyBmcm9tIG90aGVyIGZyYWdtZW50cywgYW5kIGNhbgorICAgICAgaW52b2tlIHRoZSBjb250ZXh0dWFsIGFjdGlvbiBiYXIgdXNpbmcKKyAgICAgIDxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvQWN0aW9uTW9kZS5odG1sIj5hY3Rpb24gbW9kZXM8L2E+LjwvbGk+CisgIDxsaT48YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvVGl0bGVzRnJhZ21lbnQuaHRtbCI+VGl0bGVzRnJhZ21lbnQ8L2E+CisgICAgICBTaG93cyBhIExpc3RWaWV3IG9mIHBob3RvcyB0byBkaXNwbGF5IGluIHRoZSBDb250ZW50RnJhZ21lbnQuIFBob3RvcyBjYW4KKyAgICAgIGJlIGNob3NlbiBlaXRoZXIgYnkgdGFwcGluZyBvbiB0aGUgbGlzdHZpZXcsIG9yIGRyYWdnaW5nIHRoZW0gZnJvbSB0aGUKKyAgICAgIGxpc3QgdG8gdGhlIGNvbnRlbnQgYXJlYS4gVGhlIGxpc3Qgb2YgcGhvdG9zIGRpc3BsYXllZCBkZXBlbmRzIG9uIHRoZQorICAgICAgY2F0ZWdvcnkgc2VsZWN0ZWQgaW4gdGhlIEFjdGlvbkJhci48L2xpPgorICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L01haW5BY3Rpdml0eS5odG1sIj5NYWluQWN0aXZpdHk8L2E+CisgICAgICBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IG9mIHRoZSBhcHBsaWNhdGlvbi4gTWFpbkFjdGl2aXR5IGlzCisgICAgICByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEFjdGlvbkJhciwgVGl0bGVzRnJhZ21lbnQsIGFuZAorICAgICAgQ29udGVudEZyYWdtZW50LiBNYWluQWN0aXZpdHkgaXMgYWxzbyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZgorICAgICAgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aGVtZSBhbmQgY3VycmVudGx5IHNlbGVjdGVkIHBob3RvIHdoZW4gdGhlCisgICAgICBhY3Rpdml0eSBpcyByZWNyZWF0ZWQsIHN1Y2ggYXMgd2hlbiB0aGUgc2NyZWVuIGlzIHJvdGF0ZWQgb3IgYW4gaW50ZW50IHRvCisgICAgICBhIHNlcGFyYXRlIGFjdGl2aXR5IGlzIGZpcmVkIChzdWNoIGFzIHRoZSBpbmNsdWRlZCBDYW1lcmEgc2FtcGxlKS4KKyAgICAgIE1haW5BY3Rpdml0eSBhbHNvIGNvbnRhaW5zIGNvZGUgZGVtb25zdHJhdGluZyBob3cgdG8gYW5pbWF0ZQorICAgICAgc2hvd2luZy9oaWRpbmcgZnJhZ21lbnRzIChpbiB0aGlzIGNhc2UsIHRoZSBUaXRsZXNGcmFnbWVudCkgYW5kIHRoZQorICAgICAgQWN0aW9uQmFyLCBkZW1vbnN0cmF0aW5nIGhvdyB0byBzbW9vdGhseSB0cmFuc2l0aW9uIGJldHdlZW4gc3RhdGVzCisgICAgICBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvbGk+PC91bD4KKworPGltZyBhbHQ9IlNjcmVlbnNob3QiIHNyYz0iLi4vaW1hZ2VzL2hjZ2FsbGVyeS5wbmciIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX25vdGlmaWNhdGlvbl9pY19leGFtcGxlX2RlZmF1bHQucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZhMDMwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX25vdGlmaWNhdGlvbl9pY19leGFtcGxlX3ByZXNzZWQucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQyMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmFfaG9sb19kYXJrLnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODExODEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmFfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmFfaG9sb19saWdodC5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmFfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2ZGIzMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZV9ob2xvX2RhcmsucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjhlODNmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZV9ob2xvX2xpZ2h0LnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NoYXJlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTMzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV90b2dnbGVfaG9sb19kYXJrLnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3RvZ2dsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjUxYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV90b2dnbGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV90b2dnbGVfaG9sb19saWdodC5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV90b2dnbGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwODMwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3RvZ2dsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdF9ub3RpZnlfZXhhbXBsZS5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdF9ub3RpZnlfZXhhbXBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmYzAzYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0X25vdGlmeV9leGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0YTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvbG9nby5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmMmY3NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9mcmFtZV9kZWZhdWx0LjkucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZnJhbWVfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE3YzljCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZnJhbWVfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9mcmFtZV9wcmVzc2VkLjkucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZnJhbWVfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU3OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZnJhbWVfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9mcmFtZV9zZWxlY3RlZC45LnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtaGRwaS9waWN0dXJlX2ZyYW1lX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDJhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9mcmFtZV9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkMjE2MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX25vdGlmaWNhdGlvbl9pY19leGFtcGxlX2RlZmF1bHQucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDA4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX25vdGlmaWNhdGlvbl9pY19leGFtcGxlX3ByZXNzZWQucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDViYzViCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmFfaG9sb19kYXJrLnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjJkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmFfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmFfaG9sb19saWdodC5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmFfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5M2NhZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZV9ob2xvX2RhcmsucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTZiZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZV9ob2xvX2xpZ2h0LnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NoYXJlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2JhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2dnbGVfaG9sb19kYXJrLnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3RvZ2dsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2NmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2dnbGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2dnbGVfaG9sb19saWdodC5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2dnbGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkNDhmYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3RvZ2dsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdF9ub3RpZnlfZXhhbXBsZS5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdF9ub3RpZnlfZXhhbXBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4MjVhYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0X25vdGlmeV9leGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2MmYzMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvbG9nby5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2NDJlYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvcGljdHVyZV9mcmFtZV9kZWZhdWx0LjkucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL3BpY3R1cmVfZnJhbWVfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTg4Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL3BpY3R1cmVfZnJhbWVfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvcGljdHVyZV9mcmFtZV9wcmVzc2VkLjkucG5nIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL3BpY3R1cmVfZnJhbWVfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI3MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1tZHBpL3BpY3R1cmVfZnJhbWVfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvcGljdHVyZV9mcmFtZV9zZWxlY3RlZC45LnBuZyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbWRwaS9waWN0dXJlX2ZyYW1lX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDJiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW1kcGkvcGljdHVyZV9mcmFtZV9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JpZ19kcm9pZC5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JpZ19kcm9pZC5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNDUwYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvYmlnX2Ryb2lkLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JsdWVfYmFsbG9vbi5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JsdWVfYmFsbG9vbi5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNjU3NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvYmx1ZV9iYWxsb29uLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JsdWVfYmlrZS5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2JsdWVfYmlrZS5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNDgxNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvYmx1ZV9iaWtlLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2Nocm9tZV93aGVlbC5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2Nocm9tZV93aGVlbC5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ODU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvY2hyb21lX3doZWVsLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2N1cGNha2UuSlBHIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9jdXBjYWtlLkpQRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkwMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9jdXBjYWtlLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2RvbnV0LkpQRyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvZG9udXQuSlBHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2RvbnV0LkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2VjbGFpci5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2VjbGFpci5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZTZjYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvZWNsYWlyLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2Zyb3lvLkpQRyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvZnJveW8uSlBHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzVmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2Zyb3lvLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL2dyZWVuX2JhbGxvb24uSlBHIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9ncmVlbl9iYWxsb29uLkpQRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzFlM2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9ncmVlbl9iYWxsb29uLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL25vdGlmaWNhdGlvbl9kZWZhdWx0X2xhcmdlaWNvbi5wbmcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL25vdGlmaWNhdGlvbl9kZWZhdWx0X2xhcmdlaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwYjk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvbm90aWZpY2F0aW9uX2RlZmF1bHRfbGFyZ2VpY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3B1bmtfZHJvaWQuSlBHIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9wdW5rX2Ryb2lkLkpQRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA3NzliCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS1ub2RwaS9wdW5rX2Ryb2lkLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3JhaW5ib3dfYmlrZS5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3JhaW5ib3dfYmlrZS5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZTMzNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvcmFpbmJvd19iaWtlLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3JlZF9iYWxsb29uLkpQRyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvcmVkX2JhbGxvb24uSlBHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNWU5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3JlZF9iYWxsb29uLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3N0YXJnYXplcl9kcm9pZC5KUEcgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlLW5vZHBpL3N0YXJnYXplcl9kcm9pZC5KUEcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzNmIzMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUtbm9kcGkvc3RhcmdhemVyX2Ryb2lkLkpQRwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZS54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMjk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvZHJhd2FibGUvYnRuX25vdGlmaWNhdGlvbl9pY19leGFtcGxlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fbm90aWZpY2F0aW9uX2ljX2V4YW1wbGVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2RyYXdhYmxlL3BpY3R1cmVfZnJhbWUueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS9waWN0dXJlX2ZyYW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNhYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9kcmF3YWJsZS9waWN0dXJlX2ZyYW1lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9waWN0dXJlX2ZyYW1lX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3BpY3R1cmVfZnJhbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcGljdHVyZV9mcmFtZV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0LXBvcnQvbWFpbi54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC1wb3J0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTk5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC1wb3J0L21haW4ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdzIj4KKworICAgIDxmcmFnbWVudCBjbGFzcz0iY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnkuVGl0bGVzRnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdfdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi90aXRsZXNfc2l6ZSIvPgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeS5Db250ZW50RnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC9hY3Rpb25fYmFyX2N1c3RvbS54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC9hY3Rpb25fYmFyX2N1c3RvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxMTFkOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfY3VzdG9tLnhtbApAQCAtMCwwICsxLDI0IEBACis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxUZXh0VmlldworICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij5IZWxsbyBBY3Rpb24gQmFyPC9UZXh0Vmlldz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9sYXlvdXQvY2FtZXJhX3NhbXBsZS54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC9jYW1lcmFfc2FtcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I4ODY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9sYXlvdXQvY2FtZXJhX3NhbXBsZS54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKworCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPGZyYWdtZW50IGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnkuQ2FtZXJhRnJhZ21lbnQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FtZXJhX2ZyYWciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L2NvbnRlbnRfd2VsY29tZS54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC9jb250ZW50X3dlbGNvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTIxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC9jb250ZW50X3dlbGNvbWUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8dmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgY2xhc3M9ImNvbS5leGFtcGxlLmFuZHJvaWQuaGNnYWxsZXJ5LkZpdENlbnRlckZyYW1lTGF5b3V0IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSIyNGRwIgorICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaW1hZ2UiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3BpY3R1cmVfZnJhbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6ZHVwbGljYXRlUGFyZW50U3RhdGU9InRydWUiLz4KKzwvdmlldz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L21haW4ueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4NzkyMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZ3MiPgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeS5UaXRsZXNGcmFnbWVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZ190aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iP2FuZHJvaWQ6YXR0ci9hY3Rpb25CYXJTaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi90aXRsZXNfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeS5Db250ZW50RnJhZ21lbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uLnhtbCBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhNzU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbi54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbmJnIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uX3RpdGxlIgorICAgICAgICAgICAgc3R5bGU9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25fc3VidGl0bGUiCisgICAgICAgICAgICBzdHlsZT0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxIb3Jpem9udGFsbHk9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25vdGlmaWNhdGlvbl90ZXh0IiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25fYnV0dG9uIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J0bl9ub3RpZmljYXRpb25faWNfZXhhbXBsZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbGF5b3V0L3RpdGxlX2xpc3RfaXRlbS54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC90aXRsZV9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYWQ3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL2xheW91dC90aXRsZV9saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSIxMGRwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2FjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiID4KKzwvVGV4dFZpZXc+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL21lbnUvY2FtZXJhX21lbnUueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9tZW51L2NhbWVyYV9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE4NGRkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9tZW51L2NhbWVyYV9tZW51LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3N3aXRjaF9jYW0iIGFuZHJvaWQ6dGl0bGU9IlN3aXRjaCBDYW1lcmEiIC8+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL21lbnUvbWFpbl9tZW51LnhtbCBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbWVudS9tYWluX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjdjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL21lbnUvbWFpbl9tZW51LnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2NhbWVyYSIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQ2FtZXJhIgorICAgICAgICBhbmRyb2lkOmljb249Ij9hdHRyL21lbnVJY29uQ2FtZXJhIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvdG9nZ2xlVGl0bGVzIgorICAgICAgICBhbmRyb2lkOmljb249Ij9hdHRyL21lbnVJY29uVG9nZ2xlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJUb2dnbGUgVGl0bGVzIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tfHdpdGhUZXh0IiAvPgorICAgIDwhLS0gRXhhbXBsZSBvZiBpdGVtcyBpbiB0aGUgb3ZlcmZsb3cgbWVudSAtLT4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3RvZ2dsZVRoZW1lIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJEYXkvTmlnaHQiCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJuZXZlciIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3Nob3dEaWFsb2ciCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IlNob3cgYSBkaWFsb2ciCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJuZXZlciIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3Nob3dTdGFuZGFyZE5vdGlmaWNhdGlvbiIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iU2hvdyBhIGJhc2ljIG5vdGlmaWNhdGlvbiIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249Im5ldmVyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2hvd0N1c3RvbU5vdGlmaWNhdGlvbiIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iU2hvdyBhIGN1c3RvbSBub3RpZmljYXRpb24iCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJuZXZlciIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbWVudS9waG90b19jb250ZXh0X21lbnUueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy9tZW51L3Bob3RvX2NvbnRleHRfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlMjZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvbWVudS9waG90b19jb250ZXh0X21lbnUueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2hhcmUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IlNoYXJlIgorICAgICAgICBhbmRyb2lkOmljb249Ij9hdHRyL21lbnVJY29uU2hhcmUiCisgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJhbHdheXN8d2l0aFRleHQiIC8+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy1wb3J0L2RpbWVucy54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy1wb3J0L2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0MWFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzLXBvcnQvZGltZW5zLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9InRpdGxlc19zaXplIj4yMDBkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzL2F0dHJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRjYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPHJlc291cmNlcz4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQXBwVGhlbWUiPgorICAgICAgICA8YXR0ciBuYW1lPSJsaXN0RHJhZ1NoYWRvd0JhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJtZW51SWNvbkNhbWVyYSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Im1lbnVJY29uVG9nZ2xlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVudUljb25TaGFyZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzL2NvbG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODYzYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8cmVzb3VyY2VzPgorICAgIDxjb2xvciBuYW1lPSJhY3Rpb25iYXJfYmFja2dyb3VuZF9saWdodCI+I2NjZmZmZmZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYWN0aW9uYmFyX2JhY2tncm91bmRfZGFyayI+I2NjMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZHJhZ19hY3RpdmVfY29sb3IiPiM4MGNjY2NjYzwvY29sb3I+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDk2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0idGl0bGVzX3NpemUiPjMwMGRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNiMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPkhvbmV5Y29tYiBHYWxsZXJ5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW1lcmFfc2FtcGxlIj5DYW1lcmEgRXhhbXBsZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2xpcF9sYWJlbCI+Q2xpcCBMYWJlbDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfd2lkZ2V0X25hbWUiPkhvbmV5Y29tYiBFeGFtcGxlIFdpZGdldDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2lkZ2V0X2VtcHR5X3ZpZXdfdGV4dCI+VG91Y2ggdG8gc2hvdyBkYXRhPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Im5vdGlmaWNhdGlvbl90ZXh0Ij5FeGFtcGxlIG5vdGlmaWNhdGlvbiB0ZXh0PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9InBob3RvX3NlbGVjdGlvbl9jYWJfdGl0bGUiPlBob3RvIHNlbGVjdGlvbjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTcwYjYyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9IkFjdGlvbkJhciIgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXIiIC8+CisKKyAgICA8c3R5bGUgbmFtZT0iQWN0aW9uQmFyLkxpZ2h0IiBwYXJlbnQ9IkBzdHlsZS9BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBjb2xvci9hY3Rpb25iYXJfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFjdGlvbkJhci5EYXJrIiBwYXJlbnQ9IkBzdHlsZS9BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBjb2xvci9hY3Rpb25iYXJfYmFja2dyb3VuZF9kYXJrPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQXBwVGhlbWUuTGlnaHQiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5MaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YWN0aW9uQmFyU3R5bGUiPkBzdHlsZS9BY3Rpb25CYXIuTGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyT3ZlcmxheSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERyYWdTaGFkb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZW51SWNvbkNhbWVyYSI+QGRyYXdhYmxlL2ljX21lbnVfY2FtZXJhX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lbnVJY29uVG9nZ2xlIj5AZHJhd2FibGUvaWNfbWVudV90b2dnbGVfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVudUljb25TaGFyZSI+QGRyYXdhYmxlL2ljX21lbnVfc2hhcmVfaG9sb19saWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFwcFRoZW1lLkRhcmsiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YWN0aW9uQmFyU3R5bGUiPkBzdHlsZS9BY3Rpb25CYXIuRGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXJPdmVybGF5Ij50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RHJhZ1NoYWRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVudUljb25DYW1lcmEiPkBkcmF3YWJsZS9pY19tZW51X2NhbWVyYV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lbnVJY29uVG9nZ2xlIj5AZHJhd2FibGUvaWNfbWVudV90b2dnbGVfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZW51SWNvblNoYXJlIj5AZHJhd2FibGUvaWNfbWVudV9zaGFyZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9DYW1lcmFGcmFnbWVudC5qYXZhIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9DYW1lcmFGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzRiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0NhbWVyYUZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuaGNnYWxsZXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLkNhbWVyYUluZm87CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuU2l6ZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIENhbWVyYUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgcHJpdmF0ZSBQcmV2aWV3IG1QcmV2aWV3OworICAgIENhbWVyYSBtQ2FtZXJhOworICAgIGludCBtTnVtYmVyT2ZDYW1lcmFzOworICAgIGludCBtQ2FtZXJhQ3VycmVudGx5TG9ja2VkOworCisgICAgLy8gVGhlIGZpcnN0IHJlYXIgZmFjaW5nIGNhbWVyYQorICAgIGludCBtRGVmYXVsdENhbWVyYUlkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisKKyAgICAgICAgLy8gQ3JlYXRlIGEgUmVsYXRpdmVMYXlvdXQgY29udGFpbmVyIHRoYXQgd2lsbCBob2xkIGEgU3VyZmFjZVZpZXcsCisgICAgICAgIC8vIGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyIGFjdGl2aXR5LgorICAgICAgICBtUHJldmlldyA9IG5ldyBQcmV2aWV3KHRoaXMuZ2V0QWN0aXZpdHkoKSk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbWVyYXMgYXZhaWxhYmxlCisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBDYW1lcmEuZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgY2FtZXJhCisgICAgICAgIENhbWVyYUluZm8gY2FtZXJhSW5mbyA9IG5ldyBDYW1lcmFJbmZvKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBDYW1lcmEuZ2V0Q2FtZXJhSW5mbyhpLCBjYW1lcmFJbmZvKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFJbmZvLmZhY2luZyA9PSBDYW1lcmFJbmZvLkNBTUVSQV9GQUNJTkdfQkFDSykgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0Q2FtZXJhSWQgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEhhc09wdGlvbnNNZW51KG1OdW1iZXJPZkNhbWVyYXMgPiAxKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIC8vIEFkZCBhbiB1cCBhcnJvdyB0byB0aGUgImhvbWUiIGJ1dHRvbiwgaW5kaWNhdGluZyB0aGF0IHRoZSBidXR0b24gd2lsbCBnbyAidXAiCisgICAgICAgIC8vIG9uZSBhY3Rpdml0eSBpbiB0aGUgYXBwJ3MgQWN0aXZpdHkgaGVpcmFyY2h5LgorICAgICAgICAvLyBDYWxscyB0byBnZXRBY3Rpb25CYXIoKSBhcmVuJ3QgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIEFjdGlvbkJhciB3aGVuIGNhbGxlZAorICAgICAgICAvLyBmcm9tIHdpdGhpbiB0aGUgRnJhZ21lbnQncyBvbkNyZWF0ZSBtZXRob2QsIGJlY2F1c2UgdGhlIFdpbmRvdydzIGRlY29yIGhhc24ndCBiZWVuCisgICAgICAgIC8vIGluaXRpYWxpemVkIHlldC4gIEVpdGhlciBjYWxsIGZvciB0aGUgQWN0aW9uQmFyIHJlZmVyZW5jZSBpbiBBY3Rpdml0eS5vbkNyZWF0ZSgpCisgICAgICAgIC8vIChhZnRlciB0aGUgc2V0Q29udGVudFZpZXcoLi4uKSBjYWxsKSwgb3IgaW4gdGhlIEZyYWdtZW50J3Mgb25BY3Rpdml0eUNyZWF0ZWQgbWV0aG9kLgorICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgQWN0aW9uQmFyIGFjdGlvbkJhciA9IGFjdGl2aXR5LmdldEFjdGlvbkJhcigpOworICAgICAgICBhY3Rpb25CYXIuc2V0RGlzcGxheUhvbWVBc1VwRW5hYmxlZCh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBtUHJldmlldzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICAvLyBPcGVuIHRoZSBkZWZhdWx0IGkuZS4gdGhlIGZpcnN0IHJlYXIgZmFjaW5nIGNhbWVyYS4KKyAgICAgICAgbUNhbWVyYSA9IENhbWVyYS5vcGVuKG1EZWZhdWx0Q2FtZXJhSWQpOworICAgICAgICBtQ2FtZXJhQ3VycmVudGx5TG9ja2VkID0gbURlZmF1bHRDYW1lcmFJZDsKKyAgICAgICAgbVByZXZpZXcuc2V0Q2FtZXJhKG1DYW1lcmEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKworICAgICAgICAvLyBCZWNhdXNlIHRoZSBDYW1lcmEgb2JqZWN0IGlzIGEgc2hhcmVkIHJlc291cmNlLCBpdCdzIHZlcnkKKyAgICAgICAgLy8gaW1wb3J0YW50IHRvIHJlbGVhc2UgaXQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgcGF1c2VkLgorICAgICAgICBpZiAobUNhbWVyYSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJldmlldy5zZXRDYW1lcmEobnVsbCk7CisgICAgICAgICAgICBtQ2FtZXJhLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1DYW1lcmEgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBpZiAobU51bWJlck9mQ2FtZXJhcyA+IDEpIHsKKyAgICAgICAgICAgIC8vIEluZmxhdGUgb3VyIG1lbnUgd2hpY2ggY2FuIGdhdGhlciB1c2VyIGlucHV0IGZvciBzd2l0Y2hpbmcgY2FtZXJhCisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5jYW1lcmFfbWVudSwgbWVudSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUsIGluZmxhdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIC8vIEhhbmRsZSBpdGVtIHNlbGVjdGlvbgorICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgY2FzZSBSLmlkLnN3aXRjaF9jYW06CisgICAgICAgICAgICAvLyBSZWxlYXNlIHRoaXMgY2FtZXJhIC0+IG1DYW1lcmFDdXJyZW50bHlMb2NrZWQKKyAgICAgICAgICAgIGlmIChtQ2FtZXJhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgbVByZXZpZXcuc2V0Q2FtZXJhKG51bGwpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIHRoZSBuZXh0IGNhbWVyYSBhbmQgcmVxdWVzdCBQcmV2aWV3IHRvIHJlY29uZmlndXJlCisgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgbUNhbWVyYSA9IENhbWVyYQorICAgICAgICAgICAgICAgICAgICAub3BlbigobUNhbWVyYUN1cnJlbnRseUxvY2tlZCArIDEpICUgbU51bWJlck9mQ2FtZXJhcyk7CisgICAgICAgICAgICBtQ2FtZXJhQ3VycmVudGx5TG9ja2VkID0gKG1DYW1lcmFDdXJyZW50bHlMb2NrZWQgKyAxKQorICAgICAgICAgICAgICAgICAgICAlIG1OdW1iZXJPZkNhbWVyYXM7CisgICAgICAgICAgICBtUHJldmlldy5zd2l0Y2hDYW1lcmEobUNhbWVyYSk7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBwcmV2aWV3CisgICAgICAgICAgICBtQ2FtZXJhLnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgYW5kcm9pZC5SLmlkLmhvbWU6CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLmdldEFjdGl2aXR5KCksIE1haW5BY3Rpdml0eS5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QfEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYSBDYW1lcmEgYW5kIGEgU3VyZmFjZVZpZXcgdGhhdCByZW5kZXJzIGEgY2VudGVyZWQKKyAqIHByZXZpZXcgb2YgdGhlIENhbWVyYSB0byB0aGUgc3VyZmFjZS4gV2UgbmVlZCB0byBjZW50ZXIgdGhlIFN1cmZhY2VWaWV3CisgKiBiZWNhdXNlIG5vdCBhbGwgZGV2aWNlcyBoYXZlIGNhbWVyYXMgdGhhdCBzdXBwb3J0IHByZXZpZXcgc2l6ZXMgYXQgdGhlIHNhbWUKKyAqIGFzcGVjdCByYXRpbyBhcyB0aGUgZGV2aWNlJ3MgZGlzcGxheS4KKyAqLworY2xhc3MgUHJldmlldyBleHRlbmRzIFZpZXdHcm91cCBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJQcmV2aWV3IjsKKworICAgIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKKyAgICBTdXJmYWNlSG9sZGVyIG1Ib2xkZXI7CisgICAgU2l6ZSBtUHJldmlld1NpemU7CisgICAgTGlzdDxTaXplPiBtU3VwcG9ydGVkUHJldmlld1NpemVzOworICAgIENhbWVyYSBtQ2FtZXJhOworCisgICAgUHJldmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgbVN1cmZhY2VWaWV3ID0gbmV3IFN1cmZhY2VWaWV3KGNvbnRleHQpOworICAgICAgICBhZGRWaWV3KG1TdXJmYWNlVmlldyk7CisKKyAgICAgICAgLy8gSW5zdGFsbCBhIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgc28gd2UgZ2V0IG5vdGlmaWVkIHdoZW4gdGhlCisgICAgICAgIC8vIHVuZGVybHlpbmcgc3VyZmFjZSBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgIG1Ib2xkZXIgPSBtU3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCk7CisgICAgICAgIG1Ib2xkZXIuYWRkQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1Ib2xkZXIuc2V0VHlwZShTdXJmYWNlSG9sZGVyLlNVUkZBQ0VfVFlQRV9QVVNIX0JVRkZFUlMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbWVyYShDYW1lcmEgY2FtZXJhKSB7CisgICAgICAgIG1DYW1lcmEgPSBjYW1lcmE7CisgICAgICAgIGlmIChtQ2FtZXJhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKCk7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hDYW1lcmEoQ2FtZXJhIGNhbWVyYSkgeworICAgICAgICBzZXRDYW1lcmEoY2FtZXJhKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbWVyYS5zZXRQcmV2aWV3RGlzcGxheShtSG9sZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJT0V4Y2VwdGlvbiBjYXVzZWQgYnkgc2V0UHJldmlld0Rpc3BsYXkoKSIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhLlBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IGNhbWVyYS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtZXRlcnMuc2V0UHJldmlld1NpemUobVByZXZpZXdTaXplLndpZHRoLCBtUHJldmlld1NpemUuaGVpZ2h0KTsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworCisgICAgICAgIGNhbWVyYS5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIC8vIFdlIHB1cnBvc2VseSBkaXNyZWdhcmQgY2hpbGQgbWVhc3VyZW1lbnRzIGJlY2F1c2UgYWN0IGFzIGEKKyAgICAgICAgLy8gd3JhcHBlciB0byBhIFN1cmZhY2VWaWV3IHRoYXQgY2VudGVycyB0aGUgY2FtZXJhIHByZXZpZXcgaW5zdGVhZAorICAgICAgICAvLyBvZiBzdHJldGNoaW5nIGl0LgorICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSByZXNvbHZlU2l6ZShnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGgoKSwKKyAgICAgICAgICAgICAgICB3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IHJlc29sdmVTaXplKGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIGlmIChtU3VwcG9ydGVkUHJldmlld1NpemVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmV2aWV3U2l6ZSA9IGdldE9wdGltYWxQcmV2aWV3U2l6ZShtU3VwcG9ydGVkUHJldmlld1NpemVzLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaWYgKGNoYW5nZWQgJiYgZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IHIgLSBsOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGIgLSB0OworCisgICAgICAgICAgICBpbnQgcHJldmlld1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBpbnQgcHJldmlld0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIGlmIChtUHJldmlld1NpemUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZXZpZXdXaWR0aCA9IG1QcmV2aWV3U2l6ZS53aWR0aDsKKyAgICAgICAgICAgICAgICBwcmV2aWV3SGVpZ2h0ID0gbVByZXZpZXdTaXplLmhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSBjaGlsZCBTdXJmYWNlVmlldyB3aXRoaW4gdGhlIHBhcmVudC4KKyAgICAgICAgICAgIGlmICh3aWR0aCAqIHByZXZpZXdIZWlnaHQgPiBoZWlnaHQgKiBwcmV2aWV3V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2NhbGVkQ2hpbGRXaWR0aCA9IHByZXZpZXdXaWR0aCAqIGhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgLyBwcmV2aWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dCgod2lkdGggLSBzY2FsZWRDaGlsZFdpZHRoKSAvIDIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggKyBzY2FsZWRDaGlsZFdpZHRoKSAvIDIsIGhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY2FsZWRDaGlsZEhlaWdodCA9IHByZXZpZXdIZWlnaHQgKiB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgLyBwcmV2aWV3V2lkdGg7CisgICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KDAsIChoZWlnaHQgLSBzY2FsZWRDaGlsZEhlaWdodCkgLyAyLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChoZWlnaHQgKyBzY2FsZWRDaGlsZEhlaWdodCkgLyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIC8vIFRoZSBTdXJmYWNlIGhhcyBiZWVuIGNyZWF0ZWQsIGFjcXVpcmUgdGhlIGNhbWVyYSBhbmQgdGVsbCBpdCB3aGVyZQorICAgICAgICAvLyB0byBkcmF3LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1DYW1lcmEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYW1lcmEuc2V0UHJldmlld0Rpc3BsYXkoaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJT0V4Y2VwdGlvbiBjYXVzZWQgYnkgc2V0UHJldmlld0Rpc3BsYXkoKSIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIC8vIFN1cmZhY2Ugd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB3ZSByZXR1cm4sIHNvIHN0b3AgdGhlIHByZXZpZXcuCisgICAgICAgIGlmIChtQ2FtZXJhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYW1lcmEuc3RvcFByZXZpZXcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2l6ZSBnZXRPcHRpbWFsUHJldmlld1NpemUoTGlzdDxTaXplPiBzaXplcywgaW50IHcsIGludCBoKSB7CisgICAgICAgIGZpbmFsIGRvdWJsZSBBU1BFQ1RfVE9MRVJBTkNFID0gMC4xOworICAgICAgICBkb3VibGUgdGFyZ2V0UmF0aW8gPSAoZG91YmxlKSB3IC8gaDsKKyAgICAgICAgaWYgKHNpemVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTaXplIG9wdGltYWxTaXplID0gbnVsbDsKKyAgICAgICAgZG91YmxlIG1pbkRpZmYgPSBEb3VibGUuTUFYX1ZBTFVFOworCisgICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSBoOworCisgICAgICAgIC8vIFRyeSB0byBmaW5kIGFuIHNpemUgbWF0Y2ggYXNwZWN0IHJhdGlvIGFuZCBzaXplCisgICAgICAgIGZvciAoU2l6ZSBzaXplIDogc2l6ZXMpIHsKKyAgICAgICAgICAgIGRvdWJsZSByYXRpbyA9IChkb3VibGUpIHNpemUud2lkdGggLyBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIGlmIChNYXRoLmFicyhyYXRpbyAtIHRhcmdldFJhdGlvKSA+IEFTUEVDVF9UT0xFUkFOQ0UpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2l6ZS5oZWlnaHQgLSB0YXJnZXRIZWlnaHQpIDwgbWluRGlmZikgeworICAgICAgICAgICAgICAgIG9wdGltYWxTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBtaW5EaWZmID0gTWF0aC5hYnMoc2l6ZS5oZWlnaHQgLSB0YXJnZXRIZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2Fubm90IGZpbmQgdGhlIG9uZSBtYXRjaCB0aGUgYXNwZWN0IHJhdGlvLCBpZ25vcmUgdGhlIHJlcXVpcmVtZW50CisgICAgICAgIGlmIChvcHRpbWFsU2l6ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtaW5EaWZmID0gRG91YmxlLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGZvciAoU2l6ZSBzaXplIDogc2l6ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2l6ZS5oZWlnaHQgLSB0YXJnZXRIZWlnaHQpIDwgbWluRGlmZikgeworICAgICAgICAgICAgICAgICAgICBvcHRpbWFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIG1pbkRpZmYgPSBNYXRoLmFicyhzaXplLmhlaWdodCAtIHRhcmdldEhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvcHRpbWFsU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBzaXplIGlzIGtub3duLCBzZXQgdXAgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzIGFuZCBiZWdpbgorICAgICAgICAvLyB0aGUgcHJldmlldy4KKyAgICAgICAgQ2FtZXJhLlBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IG1DYW1lcmEuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBwYXJhbWV0ZXJzLnNldFByZXZpZXdTaXplKG1QcmV2aWV3U2l6ZS53aWR0aCwgbVByZXZpZXdTaXplLmhlaWdodCk7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKworICAgICAgICBtQ2FtZXJhLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIG1DYW1lcmEuc3RhcnRQcmV2aWV3KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0NhbWVyYVNhbXBsZS5qYXZhIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9DYW1lcmFTYW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQzODU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9DYW1lcmFTYW1wbGUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQ2FtZXJhU2FtcGxlIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBpbnQgdGhlbWVJZCA9IHRoaXMuZ2V0SW50ZW50KCkuZ2V0RXh0cmFzKCkuZ2V0SW50KCJ0aGVtZSIpOworICAgICAgICB0aGlzLnNldFRoZW1lKHRoZW1lSWQpOworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jYW1lcmFfc2FtcGxlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvQ29udGVudEZyYWdtZW50LmphdmEgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0NvbnRlbnRGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzMyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0NvbnRlbnRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW07CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5EcmFnRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitwdWJsaWMgY2xhc3MgQ29udGVudEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIHByaXZhdGUgVmlldyBtQ29udGVudFZpZXc7CisKKyAgICAvLyBUaGUgYml0bWFwIGN1cnJlbnRseSB1c2VkIGJ5IEltYWdlVmlldworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXAgPSBudWxsOworCisgICAgLy8gQ3VycmVudCBhY3Rpb24gbW9kZSAoY29udGV4dHVhbCBhY3Rpb24gYmFyLCBhLmsuYS4gQ0FCKQorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQ3VycmVudEFjdGlvbk1vZGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ29udGVudFZpZXcgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRlbnRfd2VsY29tZSwgbnVsbCk7CisgICAgICAgIGZpbmFsIEltYWdlVmlldyBpbWFnZVZpZXcgPSAoSW1hZ2VWaWV3KSBtQ29udGVudFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuaW1hZ2UpOworICAgICAgICBtQ29udGVudFZpZXcuc2V0RHJhd2luZ0NhY2hlRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgbUNvbnRlbnRWaWV3LnNldE9uRHJhZ0xpc3RlbmVyKG5ldyBWaWV3Lk9uRHJhZ0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25EcmFnKFZpZXcgdiwgRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb24oKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19FTlRFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWaWV3LnNldEJhY2tncm91bmRDb2xvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5kcmFnX2FjdGl2ZV9jb2xvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRVhJVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWaWV3LnNldEJhY2tncm91bmRDb2xvcihDb2xvci5UUkFOU1BBUkVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NEcmFnU3RhcnRlZChldmVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEcmFnRXZlbnQuQUNUSU9OX0RST1A6CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzRHJvcChldmVudCwgaW1hZ2VWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBLZWVwIHRoZSBhY3Rpb24gYmFyIHZpc2liaWxpdHkgaW4gc3luYyB3aXRoIHRoZSBzeXN0ZW0gc3RhdHVzIGJhci4gVGhhdCBpcywgd2hlbiBlbnRlcmluZworICAgICAgICAvLyAnbGlnaHRzIG91dCBtb2RlLCcgaGlkZSB0aGUgYWN0aW9uIGJhciwgYW5kIHdoZW4gZXhpdGluZyB0aGlzIG1vZGUsIHNob3cgdGhlIGFjdGlvbiBiYXIuCisKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBtQ29udGVudFZpZXcuc2V0T25TeXN0ZW1VaVZpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBuZXcgVmlldy5PblN5c3RlbVVpVmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN5c3RlbVVpVmlzaWJpbGl0eUNoYW5nZShpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uQmFyIGFjdGlvbkJhciA9IGFjdGl2aXR5LmdldEFjdGlvbkJhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWaWV3LnNldFN5c3RlbVVpVmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlzaWJpbGl0eSA9PSBWaWV3LlNUQVRVU19CQVJfVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25CYXIuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkJhci5oaWRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gU2hvdy9oaWRlIHRoZSBzeXN0ZW0gc3RhdHVzIGJhciB3aGVuIHNpbmdsZS1jbGlja2luZyBhIHBob3RvLiBUaGlzIGlzIGFsc28gY2FsbGVkCisgICAgICAgIC8vICdsaWdodHMgb3V0IG1vZGUuJyBBY3RpdmF0aW5nIGFuZCBkZWFjdGl2YXRpbmcgdGhpcyBtb2RlIGFsc28gaW52b2tlcyB0aGUgbGlzdGVuZXIKKyAgICAgICAgLy8gZGVmaW5lZCBhYm92ZSwgd2hpY2ggd2lsbCBzaG93IG9yIGhpZGUgdGhlIGFjdGlvbiBiYXIgYWNjb3JkaW5nbHkuCisKKyAgICAgICAgbUNvbnRlbnRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRlbnRWaWV3LmdldFN5c3RlbVVpVmlzaWJpbGl0eSgpID09IFZpZXcuU1RBVFVTX0JBUl9WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50Vmlldy5zZXRTeXN0ZW1VaVZpc2liaWxpdHkoVmlldy5TVEFUVVNfQkFSX0hJRERFTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWaWV3LnNldFN5c3RlbVVpVmlzaWJpbGl0eShWaWV3LlNUQVRVU19CQVJfVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBXaGVuIGxvbmctcHJlc3NpbmcgYSBwaG90bywgYWN0aXZhdGUgdGhlIGFjdGlvbiBtb2RlIGZvciBzZWxlY3Rpb24sIHNob3dpbmcgdGhlCisgICAgICAgIC8vIGNvbnRleHR1YWwgYWN0aW9uIGJhciAoQ0FCKS4KKworICAgICAgICBtQ29udGVudFZpZXcuc2V0T25Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25Mb25nQ2xpY2soVmlldyB2aWV3KSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50QWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudEFjdGlvbk1vZGUgPSBnZXRBY3Rpdml0eSgpLnN0YXJ0QWN0aW9uTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50U2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtQ29udGVudFZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBtQ29udGVudFZpZXc7CisgICAgfQorCisgICAgYm9vbGVhbiBwcm9jZXNzRHJhZ1N0YXJ0ZWQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgZHJhZyBhbmQgZHJvcCBiYXNlZCBvbiB0aGUKKyAgICAgICAgLy8gcGxhaW4gdGV4dCBtaW1lIHR5cGUuCisgICAgICAgIENsaXBEZXNjcmlwdGlvbiBjbGlwRGVzYyA9IGV2ZW50LmdldENsaXBEZXNjcmlwdGlvbigpOworICAgICAgICBpZiAoY2xpcERlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNsaXBEZXNjLmhhc01pbWVUeXBlKENsaXBEZXNjcmlwdGlvbi5NSU1FVFlQRV9URVhUX1BMQUlOKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBwcm9jZXNzRHJvcChEcmFnRXZlbnQgZXZlbnQsIEltYWdlVmlldyBpbWFnZVZpZXcpIHsKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSBjbGlwIGRhdGEgd2l0aCBleHBlY3RlZCBmb3JtYXQ6IGNhdGVnb3J5fHxlbnRyeV9pZC4KKyAgICAgICAgLy8gSWdub3JlIGV2ZW50IGlmIGRhdGEgZG9lcyBub3QgY29uZm9ybSB0byB0aGlzIGZvcm1hdC4KKyAgICAgICAgQ2xpcERhdGEgZGF0YSA9IGV2ZW50LmdldENsaXBEYXRhKCk7CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkYXRhLmdldEl0ZW1Db3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIEl0ZW0gaXRlbSA9IGRhdGEuZ2V0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0RGF0YSA9IChTdHJpbmcpIGl0ZW0uZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0RGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHREYXRhLCAifHwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuaXplci5jb3VudFRva2VucygpICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgY2F0ZWdvcnkgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVudHJ5SWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlJZCA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnRBbmRSZWN5Y2xlQml0bWFwKGNhdGVnb3J5LCBlbnRyeUlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGxpc3QgZnJhZ21lbnQgd2l0aCBzZWxlY3RlZCBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgVGl0bGVzRnJhZ21lbnQgdGl0bGVzRnJhZyA9IChUaXRsZXNGcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ190aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRpdGxlc0ZyYWcuc2VsZWN0UG9zaXRpb24oZW50cnlJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVDb250ZW50QW5kUmVjeWNsZUJpdG1hcChpbnQgY2F0ZWdvcnksIGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAobUN1cnJlbnRBY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50QWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYWR2YW5jZWQgY2FsbCBhbmQgc2hvdWxkIGJlIHVzZWQgaWYgeW91CisgICAgICAgICAgICAvLyBhcmUgd29ya2luZyB3aXRoIGEgbG90IG9mIGJpdG1hcHMuIFRoZSBiaXRtYXAgaXMgZGVhZAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcyBjYWxsLgorICAgICAgICAgICAgbUJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgdGhlIGJpdG1hcCB0aGF0IG5lZWRzIHRvIGJlIGRyYXduIGFuZCB1cGRhdGUgdGhlIEltYWdlVmlldworICAgICAgICBtQml0bWFwID0gRGlyZWN0b3J5LmdldENhdGVnb3J5KGNhdGVnb3J5KS5nZXRFbnRyeShwb3NpdGlvbikKKyAgICAgICAgICAgICAgICAuZ2V0Qml0bWFwKGdldFJlc291cmNlcygpKTsKKyAgICAgICAgKChJbWFnZVZpZXcpIGdldFZpZXcoKS5maW5kVmlld0J5SWQoUi5pZC5pbWFnZSkpLnNldEltYWdlQml0bWFwKG1CaXRtYXApOworICAgIH0KKworICAgIHZvaWQgc2hhcmVDdXJyZW50UGhvdG8oKSB7CisgICAgICAgIEZpbGUgZXh0ZXJuYWxDYWNoZURpciA9IGdldEFjdGl2aXR5KCkuZ2V0RXh0ZXJuYWxDYWNoZURpcigpOworICAgICAgICBpZiAoZXh0ZXJuYWxDYWNoZURpciA9PSBudWxsKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChnZXRBY3Rpdml0eSgpLCAiRXJyb3Igd3JpdGluZyB0byBVU0IvZXh0ZXJuYWwgc3RvcmFnZS4iLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXZlbnQgbWVkaWEgc2Nhbm5pbmcgb2YgdGhlIGNhY2hlIGRpcmVjdG9yeS4KKyAgICAgICAgZmluYWwgRmlsZSBub01lZGlhRmlsZSA9IG5ldyBGaWxlKGV4dGVybmFsQ2FjaGVEaXIsICIubm9tZWRpYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbm9NZWRpYUZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgYml0bWFwIHRvIHRlbXBvcmFyeSBzdG9yYWdlIGluIHRoZSBleHRlcm5hbCBzdG9yYWdlIGRpcmVjdG9yeSAoZS5nLiBTRCBjYXJkKS4KKyAgICAgICAgLy8gV2UgcGVyZm9ybSB0aGUgYWN0dWFsIGRpc2sgd3JpdGUgb3BlcmF0aW9ucyBvbiBhIHNlcGFyYXRlIHRocmVhZCB1c2luZyB0aGUKKyAgICAgICAgLy8ge0BsaW5rIEFzeW5jVGFza30gY2xhc3MsIHRodXMgYXZvaWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIHN0YWxsaW5nIHRoZSBtYWluIChVSSkgdGhyZWFkLgorCisgICAgICAgIGZpbmFsIEZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZShleHRlcm5hbENhY2hlRGlyLCAidGVtcGZpbGUuanBnIik7CisKKyAgICAgICAgbmV3IEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCb29sZWFuPigpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ29tcHJlc3MgYW5kIHdyaXRlIHRoZSBiaXRtYXAgdG8gZGlzayBvbiBhIHNlcGFyYXRlIHRocmVhZC4KKyAgICAgICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgd3JpdGUgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gZG9JbkJhY2tncm91bmQoVm9pZC4uLiB2b2lkcykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm8gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1CaXRtYXAuY29tcHJlc3MoQml0bWFwLkNvbXByZXNzRm9ybWF0LkpQRUcsIDYwLCBmbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldEFjdGl2aXR5KCksICJFcnJvciB3cml0aW5nIGJpdG1hcCBkYXRhLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGdldEFjdGl2aXR5KCksICJFcnJvciB3cml0aW5nIHRvIFVTQi9leHRlcm5hbCBzdG9yYWdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBZnRlciBkb0luQmFja2dyb3VuZCBjb21wbGV0ZXMgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgaW4gZmFpbHVyZSksIHdlIGludm9rZSBhbgorICAgICAgICAgICAgICogaW50ZW50IHRvIHNoYXJlIHRoZSBwaG90by4gVGhpcyBjb2RlIGlzIHJ1biBvbiB0aGUgbWFpbiAoVUkpIHRocmVhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCb29sZWFuIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQm9vbGVhbi5UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbnRlbnQgc2hhcmVJbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fU0VORCk7CisgICAgICAgICAgICAgICAgc2hhcmVJbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX1NUUkVBTSwgVXJpLmZyb21GaWxlKHRlbXBGaWxlKSk7CisgICAgICAgICAgICAgICAgc2hhcmVJbnRlbnQuc2V0VHlwZSgiaW1hZ2UvanBlZyIpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoSW50ZW50LmNyZWF0ZUNob29zZXIoc2hhcmVJbnRlbnQsICJTaGFyZSBwaG90byIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5leGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNhbGxiYWNrIGZvciB0aGUgJ3Bob3RvIHNlbGVjdGVkJyB7QGxpbmsgQWN0aW9uTW9kZX0uIEluIHRoaXMgYWN0aW9uIG1vZGUsIHdlIGNhbgorICAgICAqIHByb3ZpZGUgY29udGV4dHVhbCBhY3Rpb25zIGZvciB0aGUgc2VsZWN0ZWQgcGhvdG8uIFdlIGN1cnJlbnRseSBvbmx5IHByb3ZpZGUgdGhlICdzaGFyZScKKyAgICAgKiBhY3Rpb24sIGJ1dCB3ZSBjb3VsZCBhbHNvIGFkZCBjbGlwYm9hcmQgZnVuY3Rpb25zIHN1Y2ggYXMgY3V0L2NvcHkvcGFzdGUgaGVyZSBhcyB3ZWxsLgorICAgICAqLworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ29udGVudFNlbGVjdGlvbkFjdGlvbk1vZGVDYWxsYmFjayA9IG5ldyBBY3Rpb25Nb2RlLkNhbGxiYWNrKCkgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBhY3Rpb25Nb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGFjdGlvbk1vZGUuc2V0VGl0bGUoUi5zdHJpbmcucGhvdG9fc2VsZWN0aW9uX2NhYl90aXRsZSk7CisKKyAgICAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldEFjdGl2aXR5KCkuZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5waG90b19jb250ZXh0X21lbnUsIG1lbnUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgYWN0aW9uTW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgYWN0aW9uTW9kZSwgTWVudUl0ZW0gbWVudUl0ZW0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWVudUl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFIuaWQuc2hhcmU6CisgICAgICAgICAgICAgICAgICAgIHNoYXJlQ3VycmVudFBob3RvKCk7CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIGFjdGlvbk1vZGUpIHsKKyAgICAgICAgICAgIG1Db250ZW50Vmlldy5zZXRTZWxlY3RlZChmYWxzZSk7CisgICAgICAgICAgICBtQ3VycmVudEFjdGlvbk1vZGUgPSBudWxsOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvRGlyZWN0b3J5LmphdmEgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0RpcmVjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDBmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0RpcmVjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuaGNnYWxsZXJ5OworCitwdWJsaWMgY2xhc3MgRGlyZWN0b3J5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3RvcnlDYXRlZ29yeVtdIG1DYXRlZ29yaWVzOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEaXJlY3RvcnkoKSB7CisgICAgICBtQ2F0ZWdvcmllcyA9IG5ldyBEaXJlY3RvcnlDYXRlZ29yeVtdIHsKKyAgICAgICAgICAgICAgICBuZXcgRGlyZWN0b3J5Q2F0ZWdvcnkoIkJhbGxvb25zIiwgbmV3IERpcmVjdG9yeUVudHJ5W10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJSZWQgQmFsbG9vbiIsIFIuZHJhd2FibGUucmVkX2JhbGxvb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJHcmVlbiBCYWxsb29uIiwgUi5kcmF3YWJsZS5ncmVlbl9iYWxsb29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiQmx1ZSBCYWxsb29uIiwgUi5kcmF3YWJsZS5ibHVlX2JhbGxvb24pfSksCisgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUNhdGVnb3J5KCJCaWtlcyIsIG5ldyBEaXJlY3RvcnlFbnRyeVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiT2xkIHNjaG9vbCBodWZmeSIsIFIuZHJhd2FibGUuYmx1ZV9iaWtlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiTmV3IEJpa2VzIiwgUi5kcmF3YWJsZS5yYWluYm93X2Jpa2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJDaHJvbWUgRmFzdCIsIFIuZHJhd2FibGUuY2hyb21lX3doZWVsKX0pLAorICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlDYXRlZ29yeSgiQW5kcm9pZHMiLCBuZXcgRGlyZWN0b3J5RW50cnlbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0b3J5RW50cnkoIlN0ZWFtcHVuayBBbmRyb2lkIiwgUi5kcmF3YWJsZS5wdW5rX2Ryb2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiU3RhcmdhemluZyBBbmRyb2lkIiwgUi5kcmF3YWJsZS5zdGFyZ2F6ZXJfZHJvaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJCaWcgQW5kcm9pZCIsIFIuZHJhd2FibGUuYmlnX2Ryb2lkKSB9KSwKKyAgICAgICAgICAgICAgICBuZXcgRGlyZWN0b3J5Q2F0ZWdvcnkoIlBhc3RyaWVzIiwgbmV3IERpcmVjdG9yeUVudHJ5W10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJDdXBjYWtlIiwgUi5kcmF3YWJsZS5jdXBjYWtlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiRG9udXQiLCBSLmRyYXdhYmxlLmRvbnV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3RvcnlFbnRyeSgiRWNsYWlyIiwgUi5kcmF3YWJsZS5lY2xhaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yeUVudHJ5KCJGcm95byIsIFIuZHJhd2FibGUuZnJveW8pLCB9KSwgfTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENhdGVnb3J5Q291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ2F0ZWdvcmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEaXJlY3RvcnlDYXRlZ29yeSBnZXRDYXRlZ29yeShpbnQgaSkgeworICAgICAgICByZXR1cm4gbUNhdGVnb3JpZXNbaV07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9EaXJlY3RvcnlDYXRlZ29yeS5qYXZhIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9EaXJlY3RvcnlDYXRlZ29yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmY2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0RpcmVjdG9yeUNhdGVnb3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnk7CisKK3B1YmxpYyBjbGFzcyBEaXJlY3RvcnlDYXRlZ29yeSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIERpcmVjdG9yeUVudHJ5W10gZW50cmllczsKKworICAgIHB1YmxpYyBEaXJlY3RvcnlDYXRlZ29yeShTdHJpbmcgbmFtZSwgRGlyZWN0b3J5RW50cnlbXSBlbnRyaWVzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVudHJ5Q291bnQoKSB7CisgICAgICAgIHJldHVybiBlbnRyaWVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGlyZWN0b3J5RW50cnkgZ2V0RW50cnkoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGVudHJpZXNbaV07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9EaXJlY3RvcnlFbnRyeS5qYXZhIGIvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9EaXJlY3RvcnlFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZmQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0RpcmVjdG9yeUVudHJ5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKKworcHVibGljIGNsYXNzIERpcmVjdG9yeUVudHJ5IHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgaW50IHJlc0lEOworCisgICAgcHVibGljIERpcmVjdG9yeUVudHJ5KFN0cmluZyBuYW1lLCBpbnQgcmVzSUQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5yZXNJRCA9IHJlc0lEOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldERyYXdhYmxlKFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlcy5nZXREcmF3YWJsZShyZXNJRCk7CisgICAgfQorCisgICAgcHVibGljIEJpdG1hcCBnZXRCaXRtYXAoUmVzb3VyY2VzIHJlcykgeworICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShyZXMsIHJlc0lEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0ZpdENlbnRlckZyYW1lTGF5b3V0LmphdmEgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L0ZpdENlbnRlckZyYW1lTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyNDdiYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvRml0Q2VudGVyRnJhbWVMYXlvdXQuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKKy8qKgorICogQSBzaW1wbGUgbGF5b3V0IHRoYXQgZml0cyBhbmQgY2VudGVycyBlYWNoIGNoaWxkIHZpZXcsIG1haW50YWluaW5nIGFzcGVjdCByYXRpby4KKyAqLworcHVibGljIGNsYXNzIEZpdENlbnRlckZyYW1lTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwdWJsaWMgRml0Q2VudGVyRnJhbWVMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBGaXRDZW50ZXJGcmFtZUxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgLy8gV2UgcHVycG9zZWx5IGRpc3JlZ2FyZCBjaGlsZCBtZWFzdXJlbWVudHMuCisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IHJlc29sdmVTaXplKGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpLCB3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IHJlc29sdmVTaXplKGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHQoKSwgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICBpbnQgY2hpbGRXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKworICAgICAgICBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGdldENoaWxkQXQoaSkubWVhc3VyZShjaGlsZFdpZHRoU3BlYywgY2hpbGRIZWlnaHRTcGVjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdCgpOworICAgICAgICBmaW5hbCBpbnQgcGFyZW50VG9wID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgcGFyZW50UmlnaHQgPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYiAtIHQgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisKKyAgICAgICAgZmluYWwgaW50IHBhcmVudFdpZHRoID0gcGFyZW50UmlnaHQgLSBwYXJlbnRMZWZ0OworICAgICAgICBmaW5hbCBpbnQgcGFyZW50SGVpZ2h0ID0gcGFyZW50Qm90dG9tIC0gcGFyZW50VG9wOworCisgICAgICAgIGludCB1bnBhZGRlZFdpZHRoLCB1bnBhZGRlZEhlaWdodCwgcGFyZW50VW5wYWRkZWRXaWR0aCwgcGFyZW50VW5wYWRkZWRIZWlnaHQ7CisgICAgICAgIGludCBjaGlsZFBhZGRpbmdMZWZ0LCBjaGlsZFBhZGRpbmdUb3AsIGNoaWxkUGFkZGluZ1JpZ2h0LCBjaGlsZFBhZGRpbmdCb3R0b207CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBHT05FKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpdCBhbmQgY2VudGVyIHRoZSBjaGlsZCB3aXRoaW4gdGhlIHBhcmVudC4gTWFrZSBzdXJlIG5vdCB0byBjb25zaWRlciBwYWRkaW5nCisgICAgICAgICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBjaGlsZCdzIGFzcGVjdCByYXRpby4KKworICAgICAgICAgICAgY2hpbGRQYWRkaW5nTGVmdCA9IGNoaWxkLmdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgICAgICBjaGlsZFBhZGRpbmdUb3AgPSBjaGlsZC5nZXRQYWRkaW5nVG9wKCk7CisgICAgICAgICAgICBjaGlsZFBhZGRpbmdSaWdodCA9IGNoaWxkLmdldFBhZGRpbmdSaWdodCgpOworICAgICAgICAgICAgY2hpbGRQYWRkaW5nQm90dG9tID0gY2hpbGQuZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgICAgICB1bnBhZGRlZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpIC0gY2hpbGRQYWRkaW5nTGVmdCAtIGNoaWxkUGFkZGluZ1JpZ2h0OworICAgICAgICAgICAgdW5wYWRkZWRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpIC0gY2hpbGRQYWRkaW5nVG9wIC0gY2hpbGRQYWRkaW5nQm90dG9tOworCisgICAgICAgICAgICBwYXJlbnRVbnBhZGRlZFdpZHRoID0gcGFyZW50V2lkdGggLSBjaGlsZFBhZGRpbmdMZWZ0IC0gY2hpbGRQYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICBwYXJlbnRVbnBhZGRlZEhlaWdodCA9IHBhcmVudEhlaWdodCAtIGNoaWxkUGFkZGluZ1RvcCAtIGNoaWxkUGFkZGluZ0JvdHRvbTsKKworICAgICAgICAgICAgaWYgKHBhcmVudFVucGFkZGVkV2lkdGggKiB1bnBhZGRlZEhlaWdodCA+IHBhcmVudFVucGFkZGVkSGVpZ2h0ICogdW5wYWRkZWRXaWR0aCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjaGlsZCB2aWV3IHNob3VsZCBiZSBsZWZ0L3JpZ2h0IGxldHRlcmJveGVkLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY2FsZWRDaGlsZFdpZHRoID0gdW5wYWRkZWRXaWR0aCAqIHBhcmVudFVucGFkZGVkSGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAvIHVucGFkZGVkSGVpZ2h0ICsgY2hpbGRQYWRkaW5nTGVmdCArIGNoaWxkUGFkZGluZ1JpZ2h0OworICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExlZnQgKyAocGFyZW50V2lkdGggLSBzY2FsZWRDaGlsZFdpZHRoKSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRSaWdodCAtIChwYXJlbnRXaWR0aCAtIHNjYWxlZENoaWxkV2lkdGgpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJvdHRvbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjaGlsZCB2aWV3IHNob3VsZCBiZSB0b3AvYm90dG9tIGxldHRlcmJveGVkLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY2FsZWRDaGlsZEhlaWdodCA9IHVucGFkZGVkSGVpZ2h0ICogcGFyZW50VW5wYWRkZWRXaWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgLyB1bnBhZGRlZFdpZHRoICsgY2hpbGRQYWRkaW5nVG9wICsgY2hpbGRQYWRkaW5nQm90dG9tOworICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUb3AgKyAocGFyZW50SGVpZ2h0IC0gc2NhbGVkQ2hpbGRIZWlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VG9wICsgKHBhcmVudEhlaWdodCArIHNjYWxlZENoaWxkSGVpZ2h0KSAvIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ib25leWNvbWJHYWxsZXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hjZ2FsbGVyeS9NYWluQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmYWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuaGNnYWxsZXJ5OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBBY3Rpb25CYXIuVGFiTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9ERUZBVUxUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RJQUxPRyA9ICJjb20uZXhhbXBsZS5hbmRyb2lkLmhjZ2FsbGVyeS5hY3Rpb24uRElBTE9HIjsKKworICAgIHByaXZhdGUgVmlldyBtQWN0aW9uQmFyVmlldzsKKyAgICBwcml2YXRlIEFuaW1hdG9yIG1DdXJyZW50VGl0bGVzQW5pbWF0b3I7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVG9nZ2xlTGFiZWxzID0geyJTaG93IFRpdGxlcyIsICJIaWRlIFRpdGxlcyJ9OworICAgIHByaXZhdGUgaW50IG1MYWJlbEluZGV4ID0gMTsKKyAgICBwcml2YXRlIGludCBtVGhlbWVJZCA9IC0xOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGlmKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsICYmIHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoInRoZW1lIiwgLTEpICE9IC0xKSB7CisgICAgICAgICAgICBtVGhlbWVJZCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoInRoZW1lIik7CisgICAgICAgICAgICB0aGlzLnNldFRoZW1lKG1UaGVtZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworCisgICAgICAgIERpcmVjdG9yeS5pbml0aWFsaXplRGlyZWN0b3J5KCk7CisKKyAgICAgICAgQWN0aW9uQmFyIGJhciA9IGdldEFjdGlvbkJhcigpOworCisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRGlyZWN0b3J5LmdldENhdGVnb3J5Q291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICBiYXIuYWRkVGFiKGJhci5uZXdUYWIoKS5zZXRUZXh0KERpcmVjdG9yeS5nZXRDYXRlZ29yeShpKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJMaXN0ZW5lcih0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBtQWN0aW9uQmFyVmlldyA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBSLmxheW91dC5hY3Rpb25fYmFyX2N1c3RvbSwgbnVsbCk7CisKKyAgICAgICAgYmFyLnNldEN1c3RvbVZpZXcobUFjdGlvbkJhclZpZXcpOworICAgICAgICBiYXIuc2V0RGlzcGxheU9wdGlvbnMoQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19DVVNUT00gfCBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTyk7CisgICAgICAgIGJhci5zZXROYXZpZ2F0aW9uTW9kZShBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlMpOworICAgICAgICBiYXIuc2V0RGlzcGxheVNob3dIb21lRW5hYmxlZCh0cnVlKTsKKworICAgICAgICAvLyBJZiBjYXRlZ29yeSBpcyBub3Qgc2F2ZWQgdG8gdGhlIHNhdmVkSW5zdGFuY2VTdGF0ZSwKKyAgICAgICAgLy8gMCBpcyByZXR1cm5lZCBieSBkZWZhdWx0LgorICAgICAgICBpZihzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGNhdGVnb3J5ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgiY2F0ZWdvcnkiKTsKKyAgICAgICAgICAgIGJhci5zZWxlY3RUYWIoYmFyLmdldFRhYkF0KGNhdGVnb3J5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlNlbGVjdGVkKEFjdGlvbkJhci5UYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KSB7CisgICAgICAgIFRpdGxlc0ZyYWdtZW50IHRpdGxlRnJhZyA9IChUaXRsZXNGcmFnbWVudCkgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZmluZEZyYWdtZW50QnlJZChSLmlkLmZyYWdfdGl0bGUpOworICAgICAgICB0aXRsZUZyYWcucG9wdWxhdGVUaXRsZXModGFiLmdldFBvc2l0aW9uKCkpOworCisgICAgICAgIHRpdGxlRnJhZy5zZWxlY3RQb3NpdGlvbigwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlVuc2VsZWN0ZWQoQWN0aW9uQmFyLlRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRhYlJlc2VsZWN0ZWQoQWN0aW9uQmFyLlRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUubWFpbl9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgIGNhc2UgUi5pZC5jYW1lcmE6CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBDYW1lcmFTYW1wbGUuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ0aGVtZSIsIG1UaGVtZUlkKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNhc2UgUi5pZC50b2dnbGVUaXRsZXM6CisgICAgICAgICAgICB0b2dnbGVWaXNpYmxlVGl0bGVzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjYXNlIFIuaWQudG9nZ2xlVGhlbWU6CisgICAgICAgICAgICBpZiAobVRoZW1lSWQgPT0gUi5zdHlsZS5BcHBUaGVtZV9EYXJrKSB7CisgICAgICAgICAgICAgICAgbVRoZW1lSWQgPSBSLnN0eWxlLkFwcFRoZW1lX0xpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGhlbWVJZCA9IFIuc3R5bGUuQXBwVGhlbWVfRGFyazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVjcmVhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNhc2UgUi5pZC5zaG93RGlhbG9nOgorICAgICAgICAgICAgc2hvd0RpYWxvZygiVGhpcyBpcyBpbmRlZWQgYW4gYXdlc29tZSBkaWFsb2cuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjYXNlIFIuaWQuc2hvd1N0YW5kYXJkTm90aWZpY2F0aW9uOgorICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjYXNlIFIuaWQuc2hvd0N1c3RvbU5vdGlmaWNhdGlvbjoKKyAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24odHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvZ2dsZVZpc2libGVUaXRsZXMoKSB7CisgICAgICAgIC8vIFVzZSB0aGVzZSBmb3IgY3VzdG9tIGFuaW1hdGlvbnMuCisgICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEZyYWdtZW50TWFuYWdlcigpOworICAgICAgICBmaW5hbCBUaXRsZXNGcmFnbWVudCBmID0gKFRpdGxlc0ZyYWdtZW50KSBmbQorICAgICAgICAgICAgICAgIC5maW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ190aXRsZSk7CisgICAgICAgIGZpbmFsIFZpZXcgdGl0bGVzVmlldyA9IGYuZ2V0VmlldygpOworICAgICAgICBtTGFiZWxJbmRleCA9IDEgLSBtTGFiZWxJbmRleDsKKworICAgICAgICAvLyBEZXRlcm1pbmUgaWYgd2UncmUgaW4gcG9ydHJhaXQsIGFuZCB3aGV0aGVyIHdlJ3JlIHNob3dpbmcgb3IgaGlkaW5nIHRoZSB0aXRsZXMKKyAgICAgICAgLy8gd2l0aCB0aGlzIHRvZ2dsZS4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BvcnRyYWl0ID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLm9yaWVudGF0aW9uID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9QT1JUUkFJVDsKKworICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZFNob3cgPSBmLmlzSGlkZGVuKCkgfHwgbUN1cnJlbnRUaXRsZXNBbmltYXRvciAhPSBudWxsOworCisgICAgICAgIC8vIENhbmNlbCB0aGUgY3VycmVudCB0aXRsZXMgYW5pbWF0aW9uIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgaWYgKG1DdXJyZW50VGl0bGVzQW5pbWF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIG1DdXJyZW50VGl0bGVzQW5pbWF0b3IuY2FuY2VsKCk7CisKKyAgICAgICAgLy8gQmVnaW4gc2V0dGluZyB1cCB0aGUgb2JqZWN0IGFuaW1hdG9yLiBXZSdsbCBhbmltYXRlIHRoZSBib3R0b20gb3IgcmlnaHQgZWRnZSBvZiB0aGUKKyAgICAgICAgLy8gdGl0bGVzIHZpZXcsIGFzIHdlbGwgYXMgaXRzIGFscGhhIGZvciBhIGZhZGUgZWZmZWN0LgorICAgICAgICBPYmplY3RBbmltYXRvciBvYmplY3RBbmltYXRvciA9IE9iamVjdEFuaW1hdG9yLm9mUHJvcGVydHlWYWx1ZXNIb2xkZXIoCisgICAgICAgICAgICAgICAgdGl0bGVzVmlldywKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9ydHJhaXQgPyAiYm90dG9tIiA6ICJyaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRTaG93ID8gZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4udGl0bGVzX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCksCisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdCgiYWxwaGEiLCBzaG91bGRTaG93ID8gMSA6IDApCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXQgZWFjaCBzdGVwIG9mIHRoZSBhbmltYXRpb24sIHdlJ2xsIHBlcmZvcm0gbGF5b3V0IGJ5IGNhbGxpbmcgc2V0TGF5b3V0UGFyYW1zLgorICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdGl0bGVzVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgb2JqZWN0QW5pbWF0b3IuYWRkVXBkYXRlTGlzdGVuZXIobmV3IFZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKFZhbHVlQW5pbWF0b3IgdmFsdWVBbmltYXRvcikgeworICAgICAgICAgICAgICAgIC8vICoqKiBXQVJOSU5HICoqKjogdHJpZ2dlcmluZyBsYXlvdXQgYXQgZWFjaCBhbmltYXRpb24gZnJhbWUgaGlnaGx5IGltcGFjdHMKKyAgICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBzbyB5b3Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBmb3Igc2ltcGxlIGxheW91dHMuIE1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBsYXlvdXRzIGNhbiBiZSBiZXR0ZXIgc2VydmVkIHdpdGggaW5kaXZpZHVhbCBhbmltYXRpb25zIG9uIGNoaWxkIHZpZXdzIHRvCisgICAgICAgICAgICAgICAgLy8gYXZvaWQgdGhlIHBlcmZvcm1hbmNlIHBlbmFsdHkgb2YgbGF5b3V0LgorICAgICAgICAgICAgICAgIGlmIChpc1BvcnRyYWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxwLmhlaWdodCA9IChJbnRlZ2VyKSB2YWx1ZUFuaW1hdG9yLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBscC53aWR0aCA9IChJbnRlZ2VyKSB2YWx1ZUFuaW1hdG9yLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGl0bGVzVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAoc2hvdWxkU2hvdykgeworICAgICAgICAgICAgZm0uYmVnaW5UcmFuc2FjdGlvbigpLnNob3coZikuY29tbWl0KCk7CisgICAgICAgICAgICBvYmplY3RBbmltYXRvci5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaXRsZXNBbmltYXRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9iamVjdEFuaW1hdG9yLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNhbmNlbGVkOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIub25BbmltYXRpb25DYW5jZWwoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FuY2VsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGl0bGVzQW5pbWF0b3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmbS5iZWdpblRyYW5zYWN0aW9uKCkuaGlkZShmKS5jb21taXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24uCisgICAgICAgIG9iamVjdEFuaW1hdG9yLnN0YXJ0KCk7CisgICAgICAgIG1DdXJyZW50VGl0bGVzQW5pbWF0b3IgPSBvYmplY3RBbmltYXRvcjsKKworICAgICAgICBpbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKworICAgICAgICAvLyBNYW51YWxseSB0cmlnZ2VyIG9uTmV3SW50ZW50IHRvIGNoZWNrIGZvciBBQ1RJT05fRElBTE9HLgorICAgICAgICBvbk5ld0ludGVudChnZXRJbnRlbnQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoQUNUSU9OX0RJQUxPRy5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgc2hvd0RpYWxvZyhpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSW50ZW50LkVYVFJBX1RFWFQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2hvd0RpYWxvZyhTdHJpbmcgdGV4dCkgeworICAgICAgICAvLyBEaWFsb2dGcmFnbWVudC5zaG93KCkgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIHRoZSBmcmFnbWVudAorICAgICAgICAvLyBpbiBhIHRyYW5zYWN0aW9uLiAgV2UgYWxzbyB3YW50IHRvIHJlbW92ZSBhbnkgY3VycmVudGx5IHNob3dpbmcKKyAgICAgICAgLy8gZGlhbG9nLCBzbyBtYWtlIG91ciBvd24gdHJhbnNhY3Rpb24gYW5kIHRha2UgY2FyZSBvZiB0aGF0IGhlcmUuCisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5iZWdpblRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeURpYWxvZ0ZyYWdtZW50Lm5ld0luc3RhbmNlKHRleHQpOworCisgICAgICAgIC8vIFNob3cgdGhlIGRpYWxvZy4KKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhmdCwgImRpYWxvZyIpOworICAgIH0KKworICAgIHZvaWQgc2hvd05vdGlmaWNhdGlvbihib29sZWFuIGN1c3RvbSkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIE5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICBOb3RpZmljYXRpb24uQnVpbGRlciBidWlsZGVyID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKHRoaXMpCisgICAgICAgICAgICAgICAgLnNldFNtYWxsSWNvbihSLmRyYXdhYmxlLmljX3N0YXRfbm90aWZ5X2V4YW1wbGUpCisgICAgICAgICAgICAgICAgLnNldEF1dG9DYW5jZWwodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0VGlja2VyKGdldFN0cmluZyhSLnN0cmluZy5ub3RpZmljYXRpb25fdGV4dCkpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnRJbnRlbnQoZ2V0RGlhbG9nUGVuZGluZ0ludGVudCgiVGFwcGVkIHRoZSBub3RpZmljYXRpb24gZW50cnkuIikpOworCisgICAgICAgIGlmIChjdXN0b20pIHsKKyAgICAgICAgICAgIC8vIFNldHMgYSBjdXN0b20gY29udGVudCB2aWV3IGZvciB0aGUgbm90aWZpY2F0aW9uLCBpbmNsdWRpbmcgYW4gaW1hZ2UgYnV0dG9uLgorICAgICAgICAgICAgUmVtb3RlVmlld3MgbGF5b3V0ID0gbmV3IFJlbW90ZVZpZXdzKGdldFBhY2thZ2VOYW1lKCksIFIubGF5b3V0Lm5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICBsYXlvdXQuc2V0VGV4dFZpZXdUZXh0KFIuaWQubm90aWZpY2F0aW9uX3RpdGxlLCBnZXRTdHJpbmcoUi5zdHJpbmcuYXBwX25hbWUpKTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPbkNsaWNrUGVuZGluZ0ludGVudChSLmlkLm5vdGlmaWNhdGlvbl9idXR0b24sCisgICAgICAgICAgICAgICAgICAgIGdldERpYWxvZ1BlbmRpbmdJbnRlbnQoIlRhcHBlZCB0aGUgJ2RpYWxvZycgYnV0dG9uIGluIHRoZSBub3RpZmljYXRpb24uIikpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDb250ZW50KGxheW91dCk7CisKKyAgICAgICAgICAgIC8vIE5vdGlmaWNhdGlvbnMgaW4gQW5kcm9pZCAzLjAgbm93IGhhdmUgYSBzdGFuZGFyZCBtZWNoYW5pc20gZm9yIGRpc3BsYXlpbmcgbGFyZ2UKKyAgICAgICAgICAgIC8vIGJpdG1hcHMgc3VjaCBhcyBjb250YWN0IGF2YXRhcnMuIEhlcmUsIHdlIGxvYWQgYW4gZXhhbXBsZSBpbWFnZSBhbmQgcmVzaXplIGl0IHRvIHRoZQorICAgICAgICAgICAgLy8gYXBwcm9wcmlhdGUgc2l6ZSBmb3IgbGFyZ2UgYml0bWFwcyBpbiBub3RpZmljYXRpb25zLgorICAgICAgICAgICAgQml0bWFwIGxhcmdlSWNvblRlbXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywKKyAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5ub3RpZmljYXRpb25fZGVmYXVsdF9sYXJnZWljb24pOworICAgICAgICAgICAgQml0bWFwIGxhcmdlSWNvbiA9IEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoCisgICAgICAgICAgICAgICAgICAgIGxhcmdlSWNvblRlbXAsCisgICAgICAgICAgICAgICAgICAgIHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoYW5kcm9pZC5SLmRpbWVuLm5vdGlmaWNhdGlvbl9sYXJnZV9pY29uX3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShhbmRyb2lkLlIuZGltZW4ubm90aWZpY2F0aW9uX2xhcmdlX2ljb25faGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgbGFyZ2VJY29uVGVtcC5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGFyZ2VJY29uKGxhcmdlSWNvbik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgLnNldE51bWJlcig3KSAvLyBBbiBleGFtcGxlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZShnZXRTdHJpbmcoUi5zdHJpbmcuYXBwX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLm5vdGlmaWNhdGlvbl90ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShOT1RJRklDQVRJT05fREVGQVVMVCwgYnVpbGRlci5nZXROb3RpZmljYXRpb24oKSk7CisgICAgfQorCisgICAgUGVuZGluZ0ludGVudCBnZXREaWFsb2dQZW5kaW5nSW50ZW50KFN0cmluZyBkaWFsb2dUZXh0KSB7CisgICAgICAgIHJldHVybiBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgZGlhbG9nVGV4dC5oYXNoQ29kZSgpLCAvLyBPdGhlcndpc2UgcHJldmlvdXMgUGVuZGluZ0ludGVudHMgd2l0aCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdENvZGUgbWF5IGJlIG92ZXJ3cml0dGVuLgorICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoQUNUSU9OX0RJQUxPRykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfVEVYVCwgZGlhbG9nVGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyksCisgICAgICAgICAgICAgICAgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIG1lbnUuZ2V0SXRlbSgxKS5zZXRUaXRsZShtVG9nZ2xlTGFiZWxzW21MYWJlbEluZGV4XSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUgKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgQWN0aW9uQmFyIGJhciA9IGdldEFjdGlvbkJhcigpOworICAgICAgICBpbnQgY2F0ZWdvcnkgPSBiYXIuZ2V0U2VsZWN0ZWRUYWIoKS5nZXRQb3NpdGlvbigpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoImNhdGVnb3J5IiwgY2F0ZWdvcnkpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoInRoZW1lIiwgbVRoZW1lSWQpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeURpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTXlEaWFsb2dGcmFnbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIE15RGlhbG9nRnJhZ21lbnQgZnJhZyA9IG5ldyBNeURpYWxvZ0ZyYWdtZW50KCk7CisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0U3RyaW5nKCJ0ZXh0IiwgdGl0bGUpOworICAgICAgICAgICAgZnJhZy5zZXRBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gZnJhZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0QXJndW1lbnRzKCkuZ2V0U3RyaW5nKCJ0ZXh0Iik7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihnZXRBY3Rpdml0eSgpKQorICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUoIkEgRGlhbG9nIG9mIEF3ZXNvbWUiKQorICAgICAgICAgICAgICAgICAgICAuc2V0TWVzc2FnZSh0ZXh0KQorICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oYW5kcm9pZC5SLnN0cmluZy5vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L1RpdGxlc0ZyYWdtZW50LmphdmEgYi9zYW1wbGVzL0hvbmV5Y29tYkdhbGxlcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaGNnYWxsZXJ5L1RpdGxlc0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhN2I2OAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvSG9uZXljb21iR2FsbGVyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9oY2dhbGxlcnkvVGl0bGVzRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5oY2dhbGxlcnk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUxvbmdDbGlja0xpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgVGl0bGVzRnJhZ21lbnQgZXh0ZW5kcyBMaXN0RnJhZ21lbnQgeworICAgIHByaXZhdGUgaW50IG1DYXRlZ29yeSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbUN1clBvc2l0aW9uID0gMDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvL0N1cnJlbnQgcG9zaXRpb24gc2hvdWxkIHN1cnZpdmUgc2NyZWVuIHJvdGF0aW9ucy4KKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2F0ZWdvcnkgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJjYXRlZ29yeSIpOworICAgICAgICAgICAgbUN1clBvc2l0aW9uID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgibGlzdFBvc2l0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBwb3B1bGF0ZVRpdGxlcyhtQ2F0ZWdvcnkpOworICAgICAgICBMaXN0VmlldyBsdiA9IGdldExpc3RWaWV3KCk7CisgICAgICAgIGx2LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKKyAgICAgICAgbHYuc2V0Q2FjaGVDb2xvckhpbnQoQ29sb3IuVFJBTlNQQVJFTlQpOworICAgICAgICBsdi5zZXRPbkl0ZW1Mb25nQ2xpY2tMaXN0ZW5lcihuZXcgT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soQWRhcHRlclZpZXc8Pz4gYXYsIFZpZXcgdiwgaW50IHBvcywgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9IChTdHJpbmcpICgoVGV4dFZpZXcpIHYpLmdldFRleHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB1cCBjbGlwIGRhdGEgd2l0aCB0aGUgY2F0ZWdvcnl8fGVudHJ5X2lkIGZvcm1hdC4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dERhdGEgPSBTdHJpbmcuZm9ybWF0KCIlZHx8JWQiLCBtQ2F0ZWdvcnksIHBvcyk7CisgICAgICAgICAgICAgICAgQ2xpcERhdGEgZGF0YSA9IENsaXBEYXRhLm5ld1BsYWluVGV4dCh0aXRsZSwgdGV4dERhdGEpOworICAgICAgICAgICAgICAgIHYuc3RhcnREcmFnKGRhdGEsIG5ldyBNeURyYWdTaGFkb3dCdWlsZGVyKHYpLCBudWxsLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2VsZWN0UG9zaXRpb24obUN1clBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE15RHJhZ1NoYWRvd0J1aWxkZXIgZXh0ZW5kcyBWaWV3LkRyYWdTaGFkb3dCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtU2hhZG93OworCisgICAgICAgIHB1YmxpYyBNeURyYWdTaGFkb3dCdWlsZGVyKFZpZXcgdikgeworICAgICAgICAgICAgc3VwZXIodik7CisKKyAgICAgICAgICAgIGZpbmFsIFR5cGVkQXJyYXkgYSA9IHYuZ2V0Q29udGV4dCgpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoUi5zdHlsZWFibGUuQXBwVGhlbWUpOworICAgICAgICAgICAgbVNoYWRvdyA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuQXBwVGhlbWVfbGlzdERyYWdTaGFkb3dCYWNrZ3JvdW5kKTsKKyAgICAgICAgICAgIG1TaGFkb3cuc2V0Q2FsbGJhY2sodik7CisgICAgICAgICAgICBtU2hhZG93LnNldEJvdW5kcygwLCAwLCB2LmdldFdpZHRoKCksIHYuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EcmF3U2hhZG93KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhd1NoYWRvdyhjYW52YXMpOworICAgICAgICAgICAgbVNoYWRvdy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBnZXRWaWV3KCkuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVUaXRsZXMoaW50IGNhdGVnb3J5KSB7CisgICAgICAgIERpcmVjdG9yeUNhdGVnb3J5IGNhdCA9IERpcmVjdG9yeS5nZXRDYXRlZ29yeShjYXRlZ29yeSk7CisgICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tjYXQuZ2V0RW50cnlDb3VudCgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXQuZ2V0RW50cnlDb3VudCgpOyBpKyspCisgICAgICAgICAgICBpdGVtc1tpXSA9IGNhdC5nZXRFbnRyeShpKS5nZXROYW1lKCk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPihnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIFIubGF5b3V0LnRpdGxlX2xpc3RfaXRlbSwgaXRlbXMpKTsKKyAgICAgICAgbUNhdGVnb3J5ID0gY2F0ZWdvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIHVwZGF0ZUltYWdlKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlSW1hZ2UoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIENvbnRlbnRGcmFnbWVudCBmcmFnID0gKENvbnRlbnRGcmFnbWVudCkgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZmluZEZyYWdtZW50QnlJZChSLmlkLmZyYWdfY29udGVudCk7CisgICAgICAgIGZyYWcudXBkYXRlQ29udGVudEFuZFJlY3ljbGVCaXRtYXAobUNhdGVnb3J5LCBwb3NpdGlvbik7CisgICAgICAgIG1DdXJQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBMaXN0VmlldyBsdiA9IGdldExpc3RWaWV3KCk7CisgICAgICAgIGx2LnNldEl0ZW1DaGVja2VkKHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgdXBkYXRlSW1hZ2UocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUgKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJsaXN0UG9zaXRpb24iLCBtQ3VyUG9zaXRpb24pOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoImNhdGVnb3J5IiwgbUNhdGVnb3J5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0pldEJveS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9KZXRCb3kvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkMGQ0MTczLi4yMTc2Njk2IDEwMDc1NQotLS0gYS9zYW1wbGVzL0pldEJveS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvSmV0Qm95L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIxLDcgKzIxLDggQEAKIAlwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLmpldGJveSIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKIAlhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAuMCI+CiAKLQk8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIj48L3VzZXMtc2RrPgorCTx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiIAorCSAgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxMSIvPgogCiAJPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iCiAJCWFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCmRpZmYgLS1naXQgYS9zYW1wbGVzL0x1bmFyTGFuZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0x1bmFyTGFuZGVyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMzAxMjkxYS4uM2VmNGEyZiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9MdW5hckxhbmRlci9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvTHVuYXJMYW5kZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNyArMjEsMTAgQEAKICAgICAgdG8gY29tZSBmcm9tIGEgZG9tYWluIHRoYXQgeW91IG93biBvciBoYXZlIGNvbnRyb2wgb3Zlci4gLS0+CiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQubHVuYXJsYW5kZXIiPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfbHVuYXJfbGFuZGVyIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKworICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjExIi8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDppY29uPSJAZHJhd2FibGUvYXBwX2x1bmFyX2xhbmRlciIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSI+ICAgCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ikx1bmFyTGFuZGVyIiBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggODNlNTczMi4uZWFkNzgyOSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIyLDE1ICsyMiwxOCBAQAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQiID4KIAotICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjQiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2FwcF9ub3RlcyIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIgPgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgID4KICAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iTm90ZVBhZFByb3ZpZGVyIgotICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmV4YW1wbGUubm90ZXBhZC5wcm92aWRlci5Ob3RlUGFkIiAvPgorICAgICAgICAgICAgYW5kcm9pZDphdXRob3JpdGllcz0iY29tLmdvb2dsZS5wcm92aWRlci5Ob3RlUGFkIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGdyYW50LXVyaS1wZXJtaXNzaW9uIGFuZHJvaWQ6cGF0aFBhdHRlcm49Ii4qIiAvPgorICAgICAgICA8L3Byb3ZpZGVyPgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVzTGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGl0bGVfbm90ZXNfbGlzdCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVzTGlzdCIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90aXRsZV9ub3Rlc19saXN0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KQEAgLTUwLDIyICs1MywyNyBAQAogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik5vdGVFZGl0b3IiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb24iPgorICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sby5MaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InNlbnNvciIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ia2V5Ym9hcmRIaWRkZW58b3JpZW50YXRpb24iCisgICAgICAgID4KICAgICAgICAgICAgIDwhLS0gVGhpcyBmaWx0ZXIgc2F5cyB0aGF0IHdlIGNhbiB2aWV3IG9yIGVkaXQgdGhlIGRhdGEgb2YKICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgbm90ZSAtLT4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcmVzb2x2ZV9lZGl0Ij4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5FRElUIiAvPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5ub3Rlcy5hY3Rpb24uRURJVF9OT1RFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5ub3RlcGFkLmFjdGlvbi5FRElUX05PVEUiIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KICAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOm1pbWVUeXBlPSJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS92bmQuZ29vZ2xlLm5vdGUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAKICAgICAgICAgICAgIDwhLS0gVGhpcyBmaWx0ZXIgc2F5cyB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuZXcgbm90ZSBpbnNpZGUKLSAgICAgICAgICAgICAgICAgb2YgYSBkaXJlY3Rvcnkgb2Ygbm90ZXMuIC0tPgorICAgICAgICAgICAgICAgICBvZiBhIGRpcmVjdG9yeSBvZiBub3Rlcy4gIFRoZSBJTlNFUlQgYWN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAgICAgICAgICAgZW1wdHkgbm90ZTsgdGhlIFBBU1RFIGFjdGlvbiBpbml0aWFsaXplcyBhIG5ldyBub3RlIGZyb20KKyAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBU1RFIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CiAgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDptaW1lVHlwZT0idm5kLmFuZHJvaWQuY3Vyc29yLmRpci92bmQuZ29vZ2xlLm5vdGUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CkBAIC03NCw4ICs4Miw4IEBACiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iVGl0bGVFZGl0b3IiCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3RpdGxlX2VkaXRfdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5EaWFsb2ciCiAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2VkaXQiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvLkRpYWxvZyIKICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVWaXNpYmxlIj4KICAgICAgICAgICAgIDwhLS0gVGhpcyBhY3Rpdml0eSBpbXBsZW1lbnRzIGFuIGFsdGVybmF0aXZlIGFjdGlvbiB0aGF0IGNhbiBiZQogICAgICAgICAgICAgICAgICBwZXJmb3JtZWQgb24gbm90ZXM6IGVkaXRpbmcgdGhlaXIgdGl0bGUuICBJdCBjYW4gYmUgdXNlZCBhcwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGlzY2FyZC5wbmcgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kaXNjYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4M2Y2MS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kaXNjYXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9kaXNjYXJkLnBuZyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvZHJhd2FibGUvaWNfbWVudV9kaXNjYXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNzZiNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL2RyYXdhYmxlL2ljX21lbnVfZGlzY2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3RlX2VkaXRvci54bWwKaW5kZXggZjE0MmM3MS4uNTUyZTEwNSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvbm90ZV9lZGl0b3IueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L25vdGVfZWRpdG9yLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDEyICsxNiwxMyBAQAogPHZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZUVkaXRvciRMaW5lZEVkaXRUZXh0IgogICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90ZSIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQiCiAgICAgYW5kcm9pZDpwYWRkaW5nPSI1ZHAiCiAgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wIgogICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCi0gICAgYW5kcm9pZDpjYXBpdGFsaXplPSJzZW50ZW5jZXMiIC8+CisgICAgYW5kcm9pZDpjYXBpdGFsaXplPSJzZW50ZW5jZXMiCisvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvbm90ZXNsaXN0X2l0ZW0ueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvbm90ZXNsaXN0X2l0ZW0ueG1sCmluZGV4IGIxNjc3MzQuLmNhZmE5YjEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L25vdGVzbGlzdF9pdGVtLnhtbAorKysgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC9ub3Rlc2xpc3RfaXRlbS54bWwKQEAgLTEsNSArMSw1IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw3ICsxNiw3IEBACiAKIDxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L3RpdGxlX2VkaXRvci54bWwgYi9zYW1wbGVzL05vdGVQYWQvcmVzL2xheW91dC90aXRsZV9lZGl0b3IueG1sCmluZGV4IDM1OTNlYzYuLmJiZjM4ZmMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbGF5b3V0L3RpdGxlX2VkaXRvci54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9sYXlvdXQvdGl0bGVfZWRpdG9yLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI0LDcgKzI0LDggQEAKICAgIAkJCQkJICAKICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIgCiAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiIAotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE1ZHAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAJYW5kcm9pZDplbXM9IjI1IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCkBAIC0zNiw2ICszNyw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX29rIiAvPgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX29rIgorICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tPayIgLz4KICAgIAkJCiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9lZGl0b3Jfb3B0aW9uc19tZW51LnhtbCBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9lZGl0b3Jfb3B0aW9uc19tZW51LnhtbAppbmRleCBiMmQxNGFjLi4zMDYxMzlhIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvZWRpdG9yX29wdGlvbnNfbWVudS54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9tZW51L2VkaXRvcl9vcHRpb25zX21lbnUueG1sCkBAIC0zLDE4ICszLDEzIEBACiAgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X3NhdmUiCiAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zYXZlIgogICAgICAgICAgIGFuZHJvaWQ6YWxwaGFiZXRpY1Nob3J0Y3V0PSdzJwotICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9zYXZlIiAvPgotICAgIDxncm91cCBhbmRyb2lkOmlkPSJAK2lkL21lbnVfZ3JvdXBfZWRpdCI+Ci0gICAgICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9yZXZlcnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfcmV2ZXJ0IgotICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lbnVfcmV2ZXJ0IiAvPgotICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfZGVsZXRlIgotICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2RlbGV0ZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X2RlbGV0ZSIgLz4KLSAgICA8L2dyb3VwPgotICAgIDxncm91cCBhbmRyb2lkOmlkPSJAK2lkL21lbnVfZ3JvdXBfaW5zZXJ0Ij4KLSAgICAgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X2Rpc2NhcmQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfZGlzY2FyZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X2Rpc2NhcmQiIC8+Ci0gICAgPC9ncm91cD4KKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lbnVfc2F2ZSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tfHdpdGhUZXh0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9yZXZlcnQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9yZXZlcnQiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X3JldmVydCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfZGVsZXRlIgorICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfZGVsZXRlIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9kZWxldGUiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbXx3aXRoVGV4dCIgLz4KIDwvbWVudT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9jb250ZXh0X21lbnUueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9tZW51L2xpc3RfY29udGV4dF9tZW51LnhtbAppbmRleCBhY2M4ZWRkLi43MTUwOWM2IDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9jb250ZXh0X21lbnUueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9saXN0X2NvbnRleHRfbWVudS54bWwKQEAgLTIsNiArMiw4IEBACiA8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29udGV4dF9vcGVuIgogICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9vcGVuIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29udGV4dF9jb3B5IgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9jb3B5IiAvPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvY29udGV4dF9kZWxldGUiCiAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X2RlbGV0ZSIgLz4KIDwvbWVudT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9vcHRpb25zX21lbnUueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy9tZW51L2xpc3Rfb3B0aW9uc19tZW51LnhtbAppbmRleCA5NzU0NTU0Li5hNjBlNmE0IDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvcmVzL21lbnUvbGlzdF9vcHRpb25zX21lbnUueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9yZXMvbWVudS9saXN0X29wdGlvbnNfbWVudS54bWwKQEAgLTMsNiArMywxMyBAQAogICAgIDwhLS0gIFRoaXMgaXMgb3VyIG9uZSBzdGFuZGFyZCBhcHBsaWNhdGlvbiBhY3Rpb24gKGNyZWF0aW5nIGEgbmV3IG5vdGUpLiAtLT4KICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfYWRkIgogICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfY29tcG9zZSIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL21lbnVfYWRkIgogICAgICAgICAgIGFuZHJvaWQ6YWxwaGFiZXRpY1Nob3J0Y3V0PSdhJwotICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9hZGQiIC8+CisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIgLz4KKyAgICA8IS0tICBJZiB0aGVyZSBpcyBjdXJyZW50bHkgZGF0YSBpbiB0aGUgY2xpcGJvYXJkLCB0aGlzIGFkZHMgYSBQQVNURSBtZW51IGl0ZW0gdG8gdGhlIG1lbnUKKyAgICAgICAgICBzbyB0aGF0IHRoZSB1c2VyIGNhbiBwYXN0ZSBpbiB0aGUgZGF0YS4uIC0tPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvbWVudV9wYXN0ZSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X2NvbXBvc2UiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X3Bhc3RlIgorICAgICAgICAgIGFuZHJvaWQ6YWxwaGFiZXRpY1Nob3J0Y3V0PSdwJyAvPgogPC9tZW51PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggNDEwMDY1Mi4uMjZkMjNkMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE3LDI1ICsxNywyNiBAQAogPHJlc291cmNlcz4KICAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5Ob3RlUGFkPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsaXZlX2ZvbGRlcl9uYW1lIj5Ob3Rlczwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9lZGl0X3RpdGxlIj5Ob3RlIHRpdGxlOjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfY3JlYXRlIj5DcmVhdGUgbm90ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfZWRpdCI+RWRpdDogXCIlMSRzXCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2NyZWF0ZSI+TmV3IG5vdGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlX2VkaXQiPkVkaXQ6ICUxJHM8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRpdGxlX25vdGVzX2xpc3QiPk5vdGVzPC9zdHJpbmc+Ci0gICAgCi0gICAgPHN0cmluZyBuYW1lPSJtZW51X2FkZCI+QWRkIG5vdGU8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibWVudV9hZGQiPk5ldyBub3RlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJtZW51X3NhdmUiPlNhdmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1lbnVfZGVsZXRlIj5EZWxldGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1lbnVfb3BlbiI+T3Blbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9yZXZlcnQiPlJldmVydCBjaGFuZ2VzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtZW51X2Rpc2NhcmQiPkRpc2NhcmQ8L3N0cmluZz4KLSAgICAKLSAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9vayI+T0s8L3N0cmluZz4gIAorICAgIDxzdHJpbmcgbmFtZT0ibWVudV9jb3B5Ij5Db3B5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZW51X3Bhc3RlIj5QYXN0ZTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJidXR0b25fb2siPk9LPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXh0X3RpdGxlIj5UaXRsZTo8L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0icmVzb2x2ZV9lZGl0Ij5FZGl0IG5vdGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc29sdmVfdGl0bGUiPkVkaXQgdGl0bGU8L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0iZXJyb3JfdGl0bGUiPkVycm9yPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlcnJvcl9tZXNzYWdlIj5FcnJvciBsb2FkaW5nIG5vdGU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vdGhpbmdfdG9fc2F2ZSI+VGhlcmUgaXMgbm90aGluZyB0byBzYXZlPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEKaW5kZXggNjZmNGNlNi4uNTlkNmYxMiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZUVkaXRvci5qYXZhCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQpAQCAtMTcsNyArMTcsMTAgQEAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM0LDM4ICszNyw0MSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQuTm90ZUNvbHVtbnM7CiAKIC8qKgotICogQSBnZW5lcmljIGFjdGl2aXR5IGZvciBlZGl0aW5nIGEgbm90ZSBpbiBhIGRhdGFiYXNlLiAgVGhpcyBjYW4gYmUgdXNlZAotICogZWl0aGVyIHRvIHNpbXBseSB2aWV3IGEgbm90ZSB7QGxpbmsgSW50ZW50I0FDVElPTl9WSUVXfSwgdmlldyBhbmQgZWRpdCBhIG5vdGUKLSAqIHtAbGluayBJbnRlbnQjQUNUSU9OX0VESVR9LCBvciBjcmVhdGUgYSBuZXcgbm90ZSB7QGxpbmsgSW50ZW50I0FDVElPTl9JTlNFUlR9LiAgCisgKiBUaGlzIEFjdGl2aXR5IGhhbmRsZXMgImVkaXRpbmciIGEgbm90ZSwgd2hlcmUgZWRpdGluZyBpcyByZXNwb25kaW5nIHRvCisgKiB7QGxpbmsgSW50ZW50I0FDVElPTl9WSUVXfSAocmVxdWVzdCB0byB2aWV3IGRhdGEpLCBlZGl0IGEgbm90ZQorICoge0BsaW5rIEludGVudCNBQ1RJT05fRURJVH0sIGNyZWF0ZSBhIG5vdGUge0BsaW5rIEludGVudCNBQ1RJT05fSU5TRVJUfSwgb3IKKyAqIGNyZWF0ZSBhIG5ldyBub3RlIGZyb20gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB7QGxpbmsgSW50ZW50I0FDVElPTl9QQVNURX0uCisgKgorICogTk9URTogTm90aWNlIHRoYXQgdGhlIHByb3ZpZGVyIG9wZXJhdGlvbnMgaW4gdGhpcyBBY3Rpdml0eSBhcmUgdGFraW5nIHBsYWNlIG9uIHRoZSBVSSB0aHJlYWQuCisgKiBUaGlzIGlzIG5vdCBhIGdvb2QgcHJhY3RpY2UuIEl0IGlzIG9ubHkgZG9uZSBoZXJlIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4gQSByZWFsCisgKiBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyfQorICogb3Ige0BsaW5rIGFuZHJvaWQub3MuQXN5bmNUYXNrfSBvYmplY3QgdG8gcGVyZm9ybSBvcGVyYXRpb25zIGFzeW5jaHJvbm91c2x5IG9uIGEgc2VwYXJhdGUgdGhyZWFkLgogICovCiBwdWJsaWMgY2xhc3MgTm90ZUVkaXRvciBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvLyBGb3IgbG9nZ2luZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOb3RlRWRpdG9yIjsKIAotICAgIC8qKgotICAgICAqIFN0YW5kYXJkIHByb2plY3Rpb24gZm9yIHRoZSBpbnRlcmVzdGluZyBjb2x1bW5zIG9mIGEgbm9ybWFsIG5vdGUuCisgICAgLyoKKyAgICAgKiBDcmVhdGVzIGEgcHJvamVjdGlvbiB0aGF0IHJldHVybnMgdGhlIG5vdGUgSUQgYW5kIHRoZSBub3RlIGNvbnRlbnRzLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBOb3RlQ29sdW1ucy5fSUQsIC8vIDAKLSAgICAgICAgTm90ZUNvbHVtbnMuTk9URSwgLy8gMQotICAgICAgICBOb3RlQ29sdW1ucy5USVRMRSwgLy8gMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPQorICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFCiAgICAgfTsKLSAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBub3RlIGNvbHVtbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSU5ERVhfTk9URSA9IDE7Ci0gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgdGl0bGUgY29sdW1uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JTkRFWF9USVRMRSA9IDI7Ci0gICAgCi0gICAgLy8gVGhpcyBpcyBvdXIgc3RhdGUgZGF0YSB0aGF0IGlzIHN0b3JlZCB3aGVuIGZyZWV6aW5nLgorCisgICAgLy8gQSBsYWJlbCBmb3IgdGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBhY3Rpdml0eQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9DT05URU5UID0gIm9yaWdDb250ZW50IjsKIAotICAgIC8vIFRoZSBkaWZmZXJlbnQgZGlzdGluY3Qgc3RhdGVzIHRoZSBhY3Rpdml0eSBjYW4gYmUgcnVuIGluLgorICAgIC8vIFRoaXMgQWN0aXZpdHkgY2FuIGJlIHN0YXJ0ZWQgYnkgbW9yZSB0aGFuIG9uZSBhY3Rpb24uIEVhY2ggYWN0aW9uIGlzIHJlcHJlc2VudGVkCisgICAgLy8gYXMgYSAic3RhdGUiIGNvbnN0YW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VESVQgPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTlNFUlQgPSAxOwogCisgICAgLy8gR2xvYmFsIG11dGFibGUgdmFyaWFibGVzCiAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwogICAgIHByaXZhdGUgVXJpIG1Vcmk7CiAgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKQEAgLTczLDEzMyArNzksMjQwIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbU9yaWdpbmFsQ29udGVudDsKIAogICAgIC8qKgotICAgICAqIEEgY3VzdG9tIEVkaXRUZXh0IHRoYXQgZHJhd3MgbGluZXMgYmV0d2VlbiBlYWNoIGxpbmUgb2YgdGV4dCB0aGF0IGlzIGRpc3BsYXllZC4KKyAgICAgKiBEZWZpbmVzIGEgY3VzdG9tIEVkaXRUZXh0IFZpZXcgdGhhdCBkcmF3cyBsaW5lcyBiZXR3ZWVuIGVhY2ggbGluZSBvZiB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZWRFZGl0VGV4dCBleHRlbmRzIEVkaXRUZXh0IHsKICAgICAgICAgcHJpdmF0ZSBSZWN0IG1SZWN0OwogICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKIAotICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgY29uc3RydWN0b3IgZm9yIExheW91dEluZmxhdGVyCisgICAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSBMYXlvdXRJbmZsYXRlcgogICAgICAgICBwdWJsaWMgTGluZWRFZGl0VGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBSZWN0IGFuZCBhIFBhaW50IG9iamVjdCwgYW5kIHNldHMgdGhlIHN0eWxlIGFuZCBjb2xvciBvZiB0aGUgUGFpbnQgb2JqZWN0LgogICAgICAgICAgICAgbVJlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKICAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweDgwMDAwMEZGKTsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgdG8gZHJhdyB0aGUgTGluZWRFZGl0VGV4dCBvYmplY3QKKyAgICAgICAgICogQHBhcmFtIGNhbnZhcyBUaGUgY2FudmFzIG9uIHdoaWNoIHRoZSBiYWNrZ3JvdW5kIGlzIGRyYXduLgorICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisKKyAgICAgICAgICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0ZXh0IGluIHRoZSBWaWV3LgogICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0TGluZUNvdW50KCk7CisKKyAgICAgICAgICAgIC8vIEdldHMgdGhlIGdsb2JhbCBSZWN0IGFuZCBQYWludCBvYmplY3RzCiAgICAgICAgICAgICBSZWN0IHIgPSBtUmVjdDsKICAgICAgICAgICAgIFBhaW50IHBhaW50ID0gbVBhaW50OwogCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRHJhd3Mgb25lIGxpbmUgaW4gdGhlIHJlY3RhbmdsZSBmb3IgZXZlcnkgbGluZSBvZiB0ZXh0IGluIHRoZSBFZGl0VGV4dAorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKworICAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGJhc2VsaW5lIGNvb3JkaW5hdGVzIGZvciB0aGUgY3VycmVudCBsaW5lIG9mIHRleHQKICAgICAgICAgICAgICAgICBpbnQgYmFzZWxpbmUgPSBnZXRMaW5lQm91bmRzKGksIHIpOwogCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBEcmF3cyBhIGxpbmUgaW4gdGhlIGJhY2tncm91bmQgZnJvbSB0aGUgbGVmdCBvZiB0aGUgcmVjdGFuZ2xlIHRvIHRoZSByaWdodCwKKyAgICAgICAgICAgICAgICAgKiBhdCBhIHZlcnRpY2FsIHBvc2l0aW9uIG9uZSBkaXAgYmVsb3cgdGhlIGJhc2VsaW5lLCB1c2luZyB0aGUgInBhaW50IiBvYmplY3QKKyAgICAgICAgICAgICAgICAgKiBmb3IgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoci5sZWZ0LCBiYXNlbGluZSArIDEsIHIucmlnaHQsIGJhc2VsaW5lICsgMSwgcGFpbnQpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBGaW5pc2hlcyB1cCBieSBjYWxsaW5nIHRoZSBwYXJlbnQgbWV0aG9kCiAgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBBbmRyb2lkIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGZpcnN0IHN0YXJ0ZWQuIEZyb20gdGhlIGluY29taW5nCisgICAgICogSW50ZW50LCBpdCBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBlZGl0aW5nIGlzIGRlc2lyZWQsIGFuZCB0aGVuIGRvZXMgaXQuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZXMgYW4gSW50ZW50IHRvIHVzZSB3aGVuIHRoZSBBY3Rpdml0eSBvYmplY3QncyByZXN1bHQgaXMgc2VudCBiYWNrIHRvIHRoZQorICAgICAgICAgKiBjYWxsZXIuCisgICAgICAgICAqLwogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CiAKLSAgICAgICAgLy8gRG8gc29tZSBzZXR1cCBiYXNlZCBvbiB0aGUgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4KKyAgICAgICAgLyoKKyAgICAgICAgICogIFNldHMgdXAgZm9yIHRoZSBlZGl0LCBiYXNlZCBvbiB0aGUgYWN0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGluY29taW5nIEludGVudC4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gR2V0cyB0aGUgYWN0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGlzIEFjdGl2aXR5CiAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgLy8gRm9yIGFuIGVkaXQgYWN0aW9uOgogICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9FRElULmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgdG8gZWRpdDogc2V0IHRoYXQgc3RhdGUsIGFuZCB0aGUgZGF0YSBiZWluZyBlZGl0ZWQuCisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIEFjdGl2aXR5IHN0YXRlIHRvIEVESVQsIGFuZCBnZXRzIHRoZSBVUkkgZm9yIHRoZSBkYXRhIHRvIGJlIGVkaXRlZC4KICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VESVQ7CiAgICAgICAgICAgICBtVXJpID0gaW50ZW50LmdldERhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0lOU0VSVC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdGVkIHRvIGluc2VydDogc2V0IHRoYXQgc3RhdGUsIGFuZCBjcmVhdGUgYSBuZXcgZW50cnkKLSAgICAgICAgICAgIC8vIGluIHRoZSBjb250YWluZXIuCisKKyAgICAgICAgICAgIC8vIEZvciBhbiBpbnNlcnQgb3IgcGFzdGUgYWN0aW9uOgorICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fSU5TRVJULmVxdWFscyhhY3Rpb24pCisgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9QQVNURS5lcXVhbHMoYWN0aW9uKSkgeworCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBBY3Rpdml0eSBzdGF0ZSB0byBJTlNFUlQsIGdldHMgdGhlIGdlbmVyYWwgbm90ZSBVUkksIGFuZCBpbnNlcnRzIGFuCisgICAgICAgICAgICAvLyBlbXB0eSByZWNvcmQgaW4gdGhlIHByb3ZpZGVyCiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTlNFUlQ7CiAgICAgICAgICAgICBtVXJpID0gZ2V0Q29udGVudFJlc29sdmVyKCkuaW5zZXJ0KGludGVudC5nZXREYXRhKCksIG51bGwpOwogCi0gICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIHVuYWJsZSB0byBjcmVhdGUgYSBuZXcgbm90ZSwgdGhlbiBqdXN0IGZpbmlzaAotICAgICAgICAgICAgLy8gdGhpcyBhY3Rpdml0eS4gIEEgUkVTVUxUX0NBTkNFTEVEIHdpbGwgYmUgc2VudCBiYWNrIHRvIHRoZQotICAgICAgICAgICAgLy8gb3JpZ2luYWwgYWN0aXZpdHkgaWYgdGhleSByZXF1ZXN0ZWQgYSByZXN1bHQuCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlIGF0dGVtcHQgdG8gaW5zZXJ0IHRoZSBuZXcgbm90ZSBmYWlscywgc2h1dHMgZG93biB0aGlzIEFjdGl2aXR5LiBUaGUKKyAgICAgICAgICAgICAqIG9yaWdpbmF0aW5nIEFjdGl2aXR5IHJlY2VpdmVzIGJhY2sgUkVTVUxUX0NBTkNFTEVEIGlmIGl0IHJlcXVlc3RlZCBhIHJlc3VsdC4KKyAgICAgICAgICAgICAqIExvZ3MgdGhhdCB0aGUgaW5zZXJ0IGZhaWxlZC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKG1VcmkgPT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy8gV3JpdGVzIHRoZSBsb2cgaWRlbnRpZmllciwgYSBtZXNzYWdlLCBhbmQgdGhlIFVSSSB0aGF0IGZhaWxlZC4KICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gaW5zZXJ0IG5ldyBub3RlIGludG8gIiArIGdldEludGVudCgpLmdldERhdGEoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDbG9zZXMgdGhlIGFjdGl2aXR5LgogICAgICAgICAgICAgICAgIGZpbmlzaCgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gVGhlIG5ldyBlbnRyeSB3YXMgY3JlYXRlZCwgc28gYXNzdW1lIGFsbCB3aWxsIGVuZCB3ZWxsIGFuZAorICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5ldyBlbnRyeSB3YXMgY3JlYXRlZCwgdGhpcyBzZXRzIHRoZSByZXN1bHQgdG8gYmUgcmV0dXJuZWQKICAgICAgICAgICAgIC8vIHNldCB0aGUgcmVzdWx0IHRvIGJlIHJldHVybmVkLgogICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSywgKG5ldyBJbnRlbnQoKSkuc2V0QWN0aW9uKG1VcmkudG9TdHJpbmcoKSkpOwogCisgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gd2FzIG90aGVyIHRoYW4gRURJVCBvciBJTlNFUlQ6CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXaG9vcHMsIHVua25vd24gYWN0aW9uISAgQmFpbC4KKworICAgICAgICAgICAgLy8gTG9ncyBhbiBlcnJvciB0aGF0IHRoZSBhY3Rpb24gd2FzIG5vdCB1bmRlcnN0b29kLCBmaW5pc2hlcyB0aGUgQWN0aXZpdHksIGFuZAorICAgICAgICAgICAgLy8gcmV0dXJucyBSRVNVTFRfQ0FOQ0VMRUQgdG8gYW4gb3JpZ2luYXRpbmcgQWN0aXZpdHkuCiAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIGFjdGlvbiwgZXhpdGluZyIpOwogICAgICAgICAgICAgZmluaXNoKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBTZXQgdGhlIGxheW91dCBmb3IgdGhpcyBhY3Rpdml0eS4gIFlvdSBjYW4gZmluZCBpdCBpbiByZXMvbGF5b3V0L25vdGVfZWRpdG9yLnhtbAorICAgICAgICAvKgorICAgICAgICAgKiBVc2luZyB0aGUgVVJJIHBhc3NlZCBpbiB3aXRoIHRoZSB0cmlnZ2VyaW5nIEludGVudCwgZ2V0cyB0aGUgbm90ZSBvciBub3RlcyBpbgorICAgICAgICAgKiB0aGUgcHJvdmlkZXIuCisgICAgICAgICAqIE5vdGU6IFRoaXMgaXMgYmVpbmcgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLiBJdCB3aWxsIGJsb2NrIHRoZSB0aHJlYWQgdW50aWwgdGhlIHF1ZXJ5CisgICAgICAgICAqIGNvbXBsZXRlcy4gSW4gYSBzYW1wbGUgYXBwLCBnb2luZyBhZ2FpbnN0IGEgc2ltcGxlIHByb3ZpZGVyIGJhc2VkIG9uIGEgbG9jYWwgZGF0YWJhc2UsCisgICAgICAgICAqIHRoZSBibG9jayB3aWxsIGJlIG1vbWVudGFyeSwgYnV0IGluIGEgcmVhbCBhcHAgeW91IHNob3VsZCB1c2UKKyAgICAgICAgICogYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyIG9yIGFuZHJvaWQub3MuQXN5bmNUYXNrLgorICAgICAgICAgKi8KKyAgICAgICAgbUN1cnNvciA9IG1hbmFnZWRRdWVyeSgKKyAgICAgICAgICAgIG1VcmksICAgICAgICAgLy8gVGhlIFVSSSB0aGF0IGdldHMgbXVsdGlwbGUgbm90ZXMgZnJvbSB0aGUgcHJvdmlkZXIuCisgICAgICAgICAgICBQUk9KRUNUSU9OLCAgIC8vIEEgcHJvamVjdGlvbiB0aGF0IHJldHVybnMgdGhlIG5vdGUgSUQgYW5kIG5vdGUgY29udGVudCBmb3IgZWFjaCBub3RlLgorICAgICAgICAgICAgbnVsbCwgICAgICAgICAvLyBObyAid2hlcmUiIGNsYXVzZSBzZWxlY3Rpb24gY3JpdGVyaWEuCisgICAgICAgICAgICBudWxsLCAgICAgICAgIC8vIE5vICJ3aGVyZSIgY2xhdXNlIHNlbGVjdGlvbiB2YWx1ZXMuCisgICAgICAgICAgICBudWxsICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIChtb2RpZmljYXRpb24gZGF0ZSwgZGVzY2VuZGluZykKKyAgICAgICAgKTsKKworICAgICAgICAvLyBGb3IgYSBwYXN0ZSwgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgZnJvbSBjbGlwYm9hcmQuCisgICAgICAgIC8vIChNdXN0IGJlIGRvbmUgYWZ0ZXIgbUN1cnNvciBpcyBpbml0aWFsaXplZC4pCisgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BBU1RFLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAvLyBEb2VzIHRoZSBwYXN0ZQorICAgICAgICAgICAgcGVyZm9ybVBhc3RlKCk7CisgICAgICAgICAgICAvLyBTd2l0Y2hlcyB0aGUgc3RhdGUgdG8gRURJVCBzbyB0aGUgdGl0bGUgY2FuIGJlIG1vZGlmaWVkLgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfRURJVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIGxheW91dCBmb3IgdGhpcyBBY3Rpdml0eS4gU2VlIHJlcy9sYXlvdXQvbm90ZV9lZGl0b3IueG1sCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm5vdGVfZWRpdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSB0ZXh0IHZpZXcgZm9yIG91ciBub3RlLCBpZGVudGlmaWVkIGJ5IGl0cyBJRCBpbiB0aGUgWE1MIGZpbGUuCisKKyAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgRWRpdFRleHQgaW4gdGhlIHRoZSBsYXlvdXQuCiAgICAgICAgIG1UZXh0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5ub3RlKTsKIAotICAgICAgICAvLyBHZXQgdGhlIG5vdGUhCi0gICAgICAgIG1DdXJzb3IgPSBtYW5hZ2VkUXVlcnkobVVyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gSWYgYW4gaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSBoYWQgcHJldmlvdXNseSBzdG9wcGVkLCB3ZSBjYW4KLSAgICAgICAgLy8gZ2V0IHRoZSBvcmlnaW5hbCB0ZXh0IGl0IHN0YXJ0ZWQgd2l0aC4KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyBBY3Rpdml0eSBoYWQgc3RvcHBlZCBwcmV2aW91c2x5LCBpdHMgc3RhdGUgd2FzIHdyaXR0ZW4gdGhlIE9SSUdJTkFMX0NPTlRFTlQKKyAgICAgICAgICogbG9jYXRpb24gaW4gdGhlIHNhdmVkIEluc3RhbmNlIHN0YXRlLiBUaGlzIGdldHMgdGhlIHN0YXRlLgorICAgICAgICAgKi8KICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtT3JpZ2luYWxDb250ZW50ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFN0cmluZyhPUklHSU5BTF9DT05URU5UKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBBY3Rpdml0eSBpcyBhYm91dCB0byBjb21lIHRvIHRoZSBmb3JlZ3JvdW5kLiBUaGlzIGhhcHBlbnMKKyAgICAgKiB3aGVuIHRoZSBBY3Rpdml0eSBjb21lcyB0byB0aGUgdG9wIG9mIHRoZSB0YXNrIHN0YWNrLCBPUiB3aGVuIGl0IGlzIGZpcnN0IHN0YXJ0aW5nLgorICAgICAqCisgICAgICogTW92ZXMgdG8gdGhlIGZpcnN0IG5vdGUgaW4gdGhlIGxpc3QsIHNldHMgYW4gYXBwcm9wcmlhdGUgdGl0bGUgZm9yIHRoZSBhY3Rpb24gY2hvc2VuIGJ5CisgICAgICogdGhlIHVzZXIsIHB1dHMgdGhlIG5vdGUgY29udGVudHMgaW50byB0aGUgVGV4dFZpZXcsIGFuZCBzYXZlcyB0aGUgb3JpZ2luYWwgdGV4dCBhcyBhCisgICAgICogYmFja3VwLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgdHJvdWJsZSByZXRyaWV2aW5nIHRoZSBkYXRhLCBpdCBpcyBub3cKLSAgICAgICAgLy8gdGltZSB0byBnZXQgYXQgdGhlIHN0dWZmLgorCisgICAgICAgIC8qCisgICAgICAgICAqIG1DdXJzb3IgaXMgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uQ3JlYXRlKCkgYWx3YXlzIHByZWNlZGVzIG9uUmVzdW1lIGZvciBhbnkgcnVubmluZworICAgICAgICAgKiBwcm9jZXNzLiBUaGlzIHRlc3RzIHRoYXQgaXQncyBub3QgbnVsbCwgc2luY2UgaXQgc2hvdWxkIGFsd2F5cyBjb250YWluIGRhdGEuCisgICAgICAgICAqLwogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBSZXF1ZXJ5IGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgd2hpbGUgcGF1c2VkIChzdWNoIGFzIHRoZSB0aXRsZSkKICAgICAgICAgICAgIG1DdXJzb3IucmVxdWVyeSgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBhdCB0aGUgb25lIGFuZCBvbmx5IHJvdyBpbiB0aGUgY3Vyc29yLgorCisgICAgICAgICAgICAvKiBNb3ZlcyB0byB0aGUgZmlyc3QgcmVjb3JkLiBBbHdheXMgY2FsbCBtb3ZlVG9GaXJzdCgpIGJlZm9yZSBhY2Nlc3NpbmcgZGF0YSBpbgorICAgICAgICAgICAgICogYSBDdXJzb3IgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGUgc2VtYW50aWNzIG9mIHVzaW5nIGEgQ3Vyc29yIGFyZSB0aGF0IHdoZW4gaXQgaXMKKyAgICAgICAgICAgICAqIGNyZWF0ZWQsIGl0cyBpbnRlcm5hbCBpbmRleCBpcyBwb2ludGluZyB0byBhICJwbGFjZSIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgICogcmVjb3JkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAKLSAgICAgICAgICAgIC8vIE1vZGlmeSBvdXIgb3ZlcmFsbCB0aXRsZSBkZXBlbmRpbmcgb24gdGhlIG1vZGUgd2UgYXJlIHJ1bm5pbmcgaW4uCisgICAgICAgICAgICAvLyBNb2RpZmllcyB0aGUgd2luZG93IHRpdGxlIGZvciB0aGUgQWN0aXZpdHkgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IEFjdGl2aXR5IHN0YXRlLgogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7CiAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0aXRsZSBvZiB0aGUgQWN0aXZpdHkgdG8gaW5jbHVkZSB0aGUgbm90ZSB0aXRsZQotICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IG1DdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9JTkRFWF9USVRMRSk7CisgICAgICAgICAgICAgICAgaW50IGNvbFRpdGxlSW5kZXggPSBtQ3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpOworICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IG1DdXJzb3IuZ2V0U3RyaW5nKGNvbFRpdGxlSW5kZXgpOwogICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IFN0cmluZy5mb3JtYXQocmVzLmdldFN0cmluZyhSLnN0cmluZy50aXRsZV9lZGl0KSwgdGl0bGUpOwogICAgICAgICAgICAgICAgIHNldFRpdGxlKHRleHQpOworICAgICAgICAgICAgLy8gU2V0cyB0aGUgdGl0bGUgdG8gImNyZWF0ZSIgZm9yIGluc2VydHMKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCkgewogICAgICAgICAgICAgICAgIHNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcudGl0bGVfY3JlYXRlKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBtYXkgYmUgcmVzdW1lZCBhZnRlciBwcmV2aW91c2x5IGJlaW5nCi0gICAgICAgICAgICAvLyBwYXVzZWQvc3RvcHBlZC4gIFdlIHdhbnQgdG8gcHV0IHRoZSBuZXcgdGV4dCBpbiB0aGUgdGV4dCB2aWV3LAotICAgICAgICAgICAgLy8gYnV0IGxlYXZlIHRoZSB1c2VyIHdoZXJlIHRoZXkgd2VyZSAocmV0YWluIHRoZSBjdXJzb3IgcG9zaXRpb24KLSAgICAgICAgICAgIC8vIGV0YykuICBUaGlzIHZlcnNpb24gb2Ygc2V0VGV4dCBkb2VzIHRoYXQgZm9yIHVzLgotICAgICAgICAgICAgU3RyaW5nIG5vdGUgPSBtQ3Vyc29yLmdldFN0cmluZyhDT0xVTU5fSU5ERVhfTk9URSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogb25SZXN1bWUoKSBtYXkgaGF2ZSBiZWVuIGNhbGxlZCBhZnRlciB0aGUgQWN0aXZpdHkgbG9zdCBmb2N1cyAod2FzIHBhdXNlZCkuCisgICAgICAgICAgICAgKiBUaGUgdXNlciB3YXMgZWl0aGVyIGVkaXRpbmcgb3IgY3JlYXRpbmcgYSBub3RlIHdoZW4gdGhlIEFjdGl2aXR5IHBhdXNlZC4KKyAgICAgICAgICAgICAqIFRoZSBBY3Rpdml0eSBzaG91bGQgcmUtZGlzcGxheSB0aGUgdGV4dCB0aGF0IGhhZCBiZWVuIHJldHJpZXZlZCBwcmV2aW91c2x5LCBidXQKKyAgICAgICAgICAgICAqIGl0IHNob3VsZCBub3QgbW92ZSB0aGUgY3Vyc29yLiBUaGlzIGhlbHBzIHRoZSB1c2VyIHRvIGNvbnRpbnVlIGVkaXRpbmcgb3IgZW50ZXJpbmcuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLy8gR2V0cyB0aGUgbm90ZSB0ZXh0IGZyb20gdGhlIEN1cnNvciBhbmQgcHV0cyBpdCBpbiB0aGUgVGV4dFZpZXcsIGJ1dCBkb2Vzbid0IGNoYW5nZQorICAgICAgICAgICAgLy8gdGhlIHRleHQgY3Vyc29yJ3MgcG9zaXRpb24uCisgICAgICAgICAgICBpbnQgY29sTm90ZUluZGV4ID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpOworICAgICAgICAgICAgU3RyaW5nIG5vdGUgPSBtQ3Vyc29yLmdldFN0cmluZyhjb2xOb3RlSW5kZXgpOwogICAgICAgICAgICAgbVRleHQuc2V0VGV4dEtlZXBTdGF0ZShub3RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UgaGFkbid0IHByZXZpb3VzbHkgcmV0cmlldmVkIHRoZSBvcmlnaW5hbCB0ZXh0LCBkbyBzbwotICAgICAgICAgICAgLy8gbm93LiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmV2ZXJ0IHRoZWlyIGNoYW5nZXMuCisKKyAgICAgICAgICAgIC8vIFN0b3JlcyB0aGUgb3JpZ2luYWwgbm90ZSB0ZXh0LCB0byBhbGxvdyB0aGUgdXNlciB0byByZXZlcnQgY2hhbmdlcy4KICAgICAgICAgICAgIGlmIChtT3JpZ2luYWxDb250ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtT3JpZ2luYWxDb250ZW50ID0gbm90ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBTb21ldGhpbmcgaXMgd3JvbmcuIFRoZSBDdXJzb3Igc2hvdWxkIGFsd2F5cyBjb250YWluIGRhdGEuIFJlcG9ydCBhbiBlcnJvciBpbiB0aGUKKyAgICAgICAgICogbm90ZS4KKyAgICAgICAgICovCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmVycm9yX3RpdGxlKSk7CiAgICAgICAgICAgICBtVGV4dC5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuZXJyb3JfbWVzc2FnZSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gQWN0aXZpdHkgbG9zZXMgZm9jdXMgZHVyaW5nIGl0cyBub3JtYWwgb3BlcmF0aW9uLCBhbmQgaXMgdGhlbgorICAgICAqIGxhdGVyIG9uIGtpbGxlZC4gVGhlIEFjdGl2aXR5IGhhcyBhIGNoYW5jZSB0byBzYXZlIGl0cyBzdGF0ZSBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIHJlc3RvcmUKKyAgICAgKiBpdC4KKyAgICAgKgorICAgICAqIE5vdGljZSB0aGF0IHRoaXMgbWV0aG9kIGlzbid0IGEgbm9ybWFsIHBhcnQgb2YgdGhlIEFjdGl2aXR5IGxpZmVjeWNsZS4gSXQgd29uJ3QgYmUgY2FsbGVkCisgICAgICogaWYgdGhlIHVzZXIgc2ltcGx5IG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIEFjdGl2aXR5LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIC8vIFNhdmUgYXdheSB0aGUgb3JpZ2luYWwgdGV4dCwgc28gd2Ugc3RpbGwgaGF2ZSBpdCBpZiB0aGUgYWN0aXZpdHkKQEAgLTIwNyw3NCArMzIwLDEyMiBAQAogICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmcoT1JJR0lOQUxfQ09OVEVOVCwgbU9yaWdpbmFsQ29udGVudCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIEFjdGl2aXR5IGxvc2VzIGZvY3VzLgorICAgICAqCisgICAgICogRm9yIEFjdGl2aXR5IG9iamVjdHMgdGhhdCBlZGl0IGluZm9ybWF0aW9uLCBvblBhdXNlKCkgbWF5IGJlIHRoZSBvbmUgcGxhY2Ugd2hlcmUgY2hhbmdlcyBhcmUKKyAgICAgKiBzYXZlZC4gVGhlIEFuZHJvaWQgYXBwbGljYXRpb24gbW9kZWwgaXMgcHJlZGljYXRlZCBvbiB0aGUgaWRlYSB0aGF0ICJzYXZlIiBhbmQgImV4aXQiIGFyZW4ndAorICAgICAqIHJlcXVpcmVkIGFjdGlvbnMuIFdoZW4gdXNlcnMgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFjdGl2aXR5LCB0aGV5IHNob3VsZG4ndCBoYXZlIHRvIGdvIGJhY2sKKyAgICAgKiB0byBpdCB0byBjb21wbGV0ZSB0aGVpciB3b3JrLiBUaGUgYWN0IG9mIGdvaW5nIGF3YXkgc2hvdWxkIHNhdmUgZXZlcnl0aGluZyBhbmQgbGVhdmUgdGhlCisgICAgICogQWN0aXZpdHkgaW4gYSBzdGF0ZSB3aGVyZSBBbmRyb2lkIGNhbiBkZXN0cm95IGl0IGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIElmIHRoZSB1c2VyIGhhc24ndCBkb25lIGFueXRoaW5nLCB0aGVuIHRoaXMgZGVsZXRlcyBvciBjbGVhcnMgb3V0IHRoZSBub3RlLCBvdGhlcndpc2UgaXQKKyAgICAgKiB3cml0ZXMgdGhlIHVzZXIncyB3b3JrIHRvIHRoZSBwcm92aWRlci4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewogICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIC8vIFRoZSB1c2VyIGlzIGdvaW5nIHNvbWV3aGVyZSwgc28gbWFrZSBzdXJlIGNoYW5nZXMgYXJlIHNhdmVkCiAKLSAgICAgICAgU3RyaW5nIHRleHQgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFRlc3RzIHRvIHNlZSB0aGF0IHRoZSBxdWVyeSBvcGVyYXRpb24gZGlkbid0IGZhaWwgKHNlZSBvbkNyZWF0ZSgpKS4gVGhlIEN1cnNvciBvYmplY3QKKyAgICAgICAgICogd2lsbCBleGlzdCwgZXZlbiBpZiBubyByZWNvcmRzIHdlcmUgcmV0dXJuZWQsIHVubGVzcyB0aGUgcXVlcnkgZmFpbGVkIGJlY2F1c2Ugb2Ygc29tZQorICAgICAgICAgKiBleGNlcHRpb24gb3IgZXJyb3IuCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CiAKLSAgICAgICAgLy8gSWYgdGhpcyBhY3Rpdml0eSBpcyBmaW5pc2hlZCwgYW5kIHRoZXJlIGlzIG5vIHRleHQsIHRoZW4gd2UKLSAgICAgICAgLy8gc2ltcGx5IGRlbGV0ZSB0aGUgbm90ZSBlbnRyeS4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIHRoaXMgYm90aCBmb3IgZWRpdGluZyBhbmQgaW5zZXJ0aW5nLi4uICBpdAotICAgICAgICAvLyB3b3VsZCBiZSByZWFzb25hYmxlIHRvIG9ubHkgZG8gaXQgd2hlbiBpbnNlcnRpbmcuCi0gICAgICAgIGlmIChpc0ZpbmlzaGluZygpICYmIChsZW5ndGggPT0gMCkgJiYgbUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKLSAgICAgICAgICAgIGRlbGV0ZU5vdGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhdmVOb3RlKCk7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbm90ZSB0ZXh0LgorICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlIEFjdGl2aXR5IGlzIGluIHRoZSBtaWRzdCBvZiBmaW5pc2hpbmcgYW5kIHRoZXJlIGlzIG5vIHRleHQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAqIG5vdGUsIHJldHVybnMgYSByZXN1bHQgb2YgQ0FOQ0VMRUQgdG8gdGhlIGNhbGxlciwgYW5kIGRlbGV0ZXMgdGhlIG5vdGUuIFRoaXMgaXMgZG9uZQorICAgICAgICAgICAgICogZXZlbiBpZiB0aGUgbm90ZSB3YXMgYmVpbmcgZWRpdGVkLCB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IHRoZSB1c2VyIHdhbnRlZCB0bworICAgICAgICAgICAgICogImNsZWFyIG91dCIgKGRlbGV0ZSkgdGhlIG5vdGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpc0ZpbmlzaGluZygpICYmIChsZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICBkZWxldGVOb3RlKCk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFdyaXRlcyB0aGUgZWRpdHMgdG8gdGhlIHByb3ZpZGVyLiBUaGUgbm90ZSBoYXMgYmVlbiBlZGl0ZWQgaWYgYW4gZXhpc3Rpbmcgbm90ZSB3YXMKKyAgICAgICAgICAgICAgICAgKiByZXRyaWV2ZWQgaW50byB0aGUgZWRpdG9yICpvciogaWYgYSBuZXcgbm90ZSB3YXMgaW5zZXJ0ZWQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKKyAgICAgICAgICAgICAgICAgKiBvbkNyZWF0ZSgpIGluc2VydGVkIGEgbmV3IGVtcHR5IG5vdGUgaW50byB0aGUgcHJvdmlkZXIsIGFuZCBpdCBpcyB0aGlzIG5ldyBub3RlCisgICAgICAgICAgICAgICAgICogdGhhdCBpcyBiZWluZyBlZGl0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG1hcCB0byBjb250YWluIHRoZSBuZXcgdmFsdWVzIGZvciB0aGUgY29sdW1ucworICAgICAgICAgICAgICAgIHVwZGF0ZU5vdGUodGV4dCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTlNFUlQpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVOb3RlKHRleHQsIHRleHQpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VESVQ7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBkZXZpY2UncyBNZW51IGJ1dHRvbiB0aGUgZmlyc3QgdGltZSBmb3IKKyAgICAgKiB0aGlzIEFjdGl2aXR5LiBBbmRyb2lkIHBhc3NlcyBpbiBhIE1lbnUgb2JqZWN0IHRoYXQgaXMgcG9wdWxhdGVkIHdpdGggaXRlbXMuCisgICAgICoKKyAgICAgKiBCdWlsZHMgdGhlIG1lbnVzIGZvciBlZGl0aW5nIGFuZCBpbnNlcnRpbmcsIGFuZCBhZGRzIGluIGFsdGVybmF0aXZlIGFjdGlvbnMgdGhhdAorICAgICAqIHJlZ2lzdGVyZWQgdGhlbXNlbHZlcyB0byBoYW5kbGUgdGhlIE1JTUUgdHlwZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSBBIE1lbnUgb2JqZWN0IHRvIHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgdG8gZGlzcGxheSB0aGUgbWVudS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewogICAgICAgICAvLyBJbmZsYXRlIG1lbnUgZnJvbSBYTUwgcmVzb3VyY2UKICAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CiAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51LmVkaXRvcl9vcHRpb25zX21lbnUsIG1lbnUpOwogCi0gICAgICAgIC8vIEFwcGVuZCB0byB0aGUKLSAgICAgICAgLy8gbWVudSBpdGVtcyBmb3IgYW55IG90aGVyIGFjdGl2aXRpZXMgdGhhdCBjYW4gZG8gc3R1ZmYgd2l0aCBpdAotICAgICAgICAvLyBhcyB3ZWxsLiAgVGhpcyBkb2VzIGEgcXVlcnkgb24gdGhlIHN5c3RlbSBmb3IgYW55IGFjdGl2aXRpZXMgdGhhdAotICAgICAgICAvLyBpbXBsZW1lbnQgdGhlIEFMVEVSTkFUSVZFX0FDVElPTiBmb3Igb3VyIGRhdGEsIGFkZGluZyBhIG1lbnUgaXRlbQotICAgICAgICAvLyBmb3IgZWFjaCBvbmUgdGhhdCBpcyBmb3VuZC4KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobnVsbCwgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKTsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7Ci0gICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucyhNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAwLCAwLAotICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE5vdGVFZGl0b3IuY2xhc3MpLCBudWxsLCBpbnRlbnQsIDAsIG51bGwpOworICAgICAgICAvLyBPbmx5IGFkZCBleHRyYSBtZW51IGl0ZW1zIGZvciBhIHNhdmVkIG5vdGUgCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfRURJVCkgeworICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZQorICAgICAgICAgICAgLy8gbWVudSBpdGVtcyBmb3IgYW55IG90aGVyIGFjdGl2aXRpZXMgdGhhdCBjYW4gZG8gc3R1ZmYgd2l0aCBpdAorICAgICAgICAgICAgLy8gYXMgd2VsbC4gIFRoaXMgZG9lcyBhIHF1ZXJ5IG9uIHRoZSBzeXN0ZW0gZm9yIGFueSBhY3Rpdml0aWVzIHRoYXQKKyAgICAgICAgICAgIC8vIGltcGxlbWVudCB0aGUgQUxURVJOQVRJVkVfQUNUSU9OIGZvciBvdXIgZGF0YSwgYWRkaW5nIGEgbWVudSBpdGVtCisgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgdGhhdCBpcyBmb3VuZC4KKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG51bGwsIG1VcmkpOworICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7CisgICAgICAgICAgICBtZW51LmFkZEludGVudE9wdGlvbnMoTWVudS5DQVRFR09SWV9BTFRFUk5BVElWRSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUodGhpcywgTm90ZUVkaXRvci5jbGFzcyksIG51bGwsIGludGVudCwgMCwgbnVsbCk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKICAgICB9Ci0gICAgCi0gICAgCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7Ci0gICAgICAgICAgICBtZW51LnNldEdyb3VwVmlzaWJsZShSLmlkLm1lbnVfZ3JvdXBfZWRpdCwgdHJ1ZSk7Ci0gICAgICAgICAgICBtZW51LnNldEdyb3VwVmlzaWJsZShSLmlkLm1lbnVfZ3JvdXBfaW5zZXJ0LCBmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIG5vdGUgaGFzIGNoYW5nZWQgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSByZXZlcnQgb3B0aW9uCi0gICAgICAgICAgICBTdHJpbmcgc2F2ZWROb3RlID0gbUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX05PVEUpOwotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnROb3RlID0gbVRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoc2F2ZWROb3RlLmVxdWFscyhjdXJyZW50Tm90ZSkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQubWVudV9yZXZlcnQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQubWVudV9yZXZlcnQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGlmIG5vdGUgaGFzIGNoYW5nZWQgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSByZXZlcnQgb3B0aW9uCisgICAgICAgIGludCBjb2xOb3RlSW5kZXggPSBtQ3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSk7CisgICAgICAgIFN0cmluZyBzYXZlZE5vdGUgPSBtQ3Vyc29yLmdldFN0cmluZyhjb2xOb3RlSW5kZXgpOworICAgICAgICBTdHJpbmcgY3VycmVudE5vdGUgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHNhdmVkTm90ZS5lcXVhbHMoY3VycmVudE5vdGUpKSB7CisgICAgICAgICAgICBtZW51LmZpbmRJdGVtKFIuaWQubWVudV9yZXZlcnQpLnNldFZpc2libGUoZmFsc2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVudS5zZXRHcm91cFZpc2libGUoUi5pZC5tZW51X2dyb3VwX2VkaXQsIGZhbHNlKTsKLSAgICAgICAgICAgIG1lbnUuc2V0R3JvdXBWaXNpYmxlKFIuaWQubWVudV9ncm91cF9pbnNlcnQsIHRydWUpOworICAgICAgICAgICAgbWVudS5maW5kSXRlbShSLmlkLm1lbnVfcmV2ZXJ0KS5zZXRWaXNpYmxlKHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZC4gQW5kcm9pZCBwYXNzZXMgaW4gdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICogVGhlIHN3aXRjaCBzdGF0ZW1lbnQgaW4gdGhpcyBtZXRob2QgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCB0byBwZXJmb3JtIHRoZSBhY3Rpb24gdGhlCisgICAgICogdXNlciBjaG9zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBNZW51SXRlbQorICAgICAqIEByZXR1cm4gVHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpdGVtIHdhcyBwcm9jZXNzZWQsIGFuZCBubyBmdXJ0aGVyIHdvcmsgaXMgbmVjZXNzYXJ5LiBGYWxzZQorICAgICAqIHRvIHByb2NlZWQgdG8gZnVydGhlciBwcm9jZXNzaW5nIGFzIGluZGljYXRlZCBpbiB0aGUgTWVudUl0ZW0gb2JqZWN0LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CiAgICAgICAgIC8vIEhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmxlIG1lbnUgYWN0aW9ucy4KICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CiAgICAgICAgIGNhc2UgUi5pZC5tZW51X3NhdmU6Ci0gICAgICAgICAgICBzYXZlTm90ZSgpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHVwZGF0ZU5vdGUodGV4dCwgbnVsbCk7CiAgICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFIuaWQubWVudV9kZWxldGU6CkBAIC0yODIsNjIgKzQ0MywxNDYgQEAKICAgICAgICAgICAgIGZpbmlzaCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUi5pZC5tZW51X3JldmVydDoKLSAgICAgICAgY2FzZSBSLmlkLm1lbnVfZGlzY2FyZDoKICAgICAgICAgICAgIGNhbmNlbE5vdGUoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7Ci0gICAgICAgIAogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2F2ZU5vdGUoKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVpciBjdXJyZW50Ci0gICAgICAgIC8vIGNoYW5nZXMgYXJlIHNhZmVseSBzYXZlZCBhd2F5IGluIHRoZSBwcm92aWRlci4gIFdlIGRvbid0IG5lZWQKLSAgICAgICAgLy8gdG8gZG8gdGhpcyBpZiBvbmx5IGVkaXRpbmcuCi0gICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCBvdXQgdXBkYXRlcyBpbnRvIHRoZSBwcm92aWRlci4KLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKIAotICAgICAgICAgICAgLy8gQnVtcCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gbm93LgotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisvL0JFR0lOX0lOQ0xVREUocGFzdGUpCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHRoYXQgcmVwbGFjZXMgdGhlIG5vdGUncyBkYXRhIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKIAotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IG5vdGUsIHRoZW4gd2Ugd2FudCB0byBhbHNvIGNyZWF0ZQotICAgICAgICAgICAgLy8gYW4gaW5pdGlhbCB0aXRsZSBmb3IgaXQuCi0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCkgewotICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5ub3RoaW5nX3RvX3NhdmUsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIEdldHMgYSBoYW5kbGUgdG8gdGhlIENsaXBib2FyZCBNYW5hZ2VyCisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpCisgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAvLyBHZXRzIGEgY29udGVudCByZXNvbHZlciBpbnN0YW5jZQorICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBjbGlwYm9hcmQgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0PW51bGw7CisgICAgICAgICAgICBTdHJpbmcgdGl0bGU9bnVsbDsKKworICAgICAgICAgICAgLy8gR2V0cyB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBjbGlwYm9hcmQgZGF0YQorICAgICAgICAgICAgQ2xpcERhdGEuSXRlbSBpdGVtID0gY2xpcC5nZXRJdGVtQXQoMCk7CisKKyAgICAgICAgICAgIC8vIFRyaWVzIHRvIGdldCB0aGUgaXRlbSdzIGNvbnRlbnRzIGFzIGEgVVJJIHBvaW50aW5nIHRvIGEgbm90ZQorICAgICAgICAgICAgVXJpIHVyaSA9IGl0ZW0uZ2V0VXJpKCk7CisKKyAgICAgICAgICAgIC8vIFRlc3RzIHRvIHNlZSB0aGF0IHRoZSBpdGVtIGFjdHVhbGx5IGlzIGFuIFVSSSwgYW5kIHRoYXQgdGhlIFVSSQorICAgICAgICAgICAgLy8gaXMgYSBjb250ZW50IFVSSSBwb2ludGluZyB0byBhIHByb3ZpZGVyIHdob3NlIE1JTUUgdHlwZSBpcyB0aGUgc2FtZQorICAgICAgICAgICAgLy8gYXMgdGhlIE1JTUUgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIE5vdGUgcGFkIHByb3ZpZGVyLgorICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JVEVNX1RZUEUuZXF1YWxzKGNyLmdldFR5cGUodXJpKSkpIHsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBjbGlwYm9hcmQgaG9sZHMgYSByZWZlcmVuY2UgdG8gZGF0YSB3aXRoIGEgbm90ZSBNSU1FIHR5cGUuIFRoaXMgY29waWVzIGl0LgorICAgICAgICAgICAgICAgIEN1cnNvciBvcmlnID0gY3IucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICB1cmksICAgICAgICAgICAgLy8gVVJJIGZvciB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPSkVDVElPTiwgICAgIC8vIEdldCB0aGUgY29sdW1ucyByZWZlcnJlZCB0byBpbiB0aGUgcHJvamVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgIC8vIE5vIHNlbGVjdGlvbiB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAvLyBObyBzZWxlY3Rpb24gdmFyaWFibGVzLCBzbyBubyBjcml0ZXJpYSBhcmUgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIEN1cnNvciBpcyBub3QgbnVsbCwgYW5kIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByZWNvcmQKKyAgICAgICAgICAgICAgICAvLyAobW92ZVRvRmlyc3QoKSByZXR1cm5zIHRydWUpLCB0aGVuIHRoaXMgZ2V0cyB0aGUgbm90ZSBkYXRhIGZyb20gaXQuCisgICAgICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3JpZy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sTm90ZUluZGV4ID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbFRpdGxlSW5kZXggPSBtQ3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG9yaWcuZ2V0U3RyaW5nKGNvbE5vdGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IG9yaWcuZ2V0U3RyaW5nKGNvbFRpdGxlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2VzIHRoZSBjdXJzb3IuCisgICAgICAgICAgICAgICAgICAgIG9yaWcuY2xvc2UoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gdGV4dC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMzAsIGxlbmd0aCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB3YXNuJ3QgYSByZWZlcmVuY2UgdG8gYSBub3RlLCB0aGVuCisgICAgICAgICAgICAvLyB0aGlzIGNvbnZlcnRzIHdoYXRldmVyIGl0IGlzIHRvIHRleHQuCisgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGl0ZW0uY29lcmNlVG9UZXh0KHRoaXMpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgbm90ZSB3aXRoIHRoZSByZXRyaWV2ZWQgdGl0bGUgYW5kIHRleHQuCisgICAgICAgICAgICB1cGRhdGVOb3RlKHRleHQsIHRpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUocGFzdGUpCisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBub3RlIGNvbnRlbnRzIHdpdGggdGhlIHRleHQgYW5kIHRpdGxlIHByb3ZpZGVkIGFzIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IG5vdGUgY29udGVudHMgdG8gdXNlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgbmV3IG5vdGUgdGl0bGUgdG8gdXNlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZU5vdGUoU3RyaW5nIHRleHQsIFN0cmluZyB0aXRsZSkgeworCisgICAgICAgIC8vIFNldHMgdXAgYSBtYXAgdG8gY29udGFpbiB2YWx1ZXMgdG8gYmUgdXBkYXRlZCBpbiB0aGUgcHJvdmlkZXIuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKKyAgICAgICAgLy8gSWYgdGhlIGFjdGlvbiBpcyB0byBpbnNlcnQgYSBuZXcgbm90ZSwgdGhpcyBjcmVhdGVzIGFuIGluaXRpYWwgdGl0bGUgZm9yIGl0LgorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCkgeworCisgICAgICAgICAgICAvLyBJZiBubyB0aXRsZSB3YXMgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQsIGNyZWF0ZSBvbmUgZnJvbSB0aGUgbm90ZSB0ZXh0LgorICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwpIHsKKyAgCisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBub3RlJ3MgbGVuZ3RoCisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSB0aXRsZSBieSBnZXR0aW5nIGEgc3Vic3RyaW5nIG9mIHRoZSB0ZXh0IHRoYXQgaXMgMzEgY2hhcmFjdGVycyBsb25nCisgICAgICAgICAgICAgICAgLy8gb3IgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBub3RlIHBsdXMgb25lLCB3aGljaGV2ZXIgaXMgc21hbGxlci4KKyAgICAgICAgICAgICAgICB0aXRsZSA9IHRleHQuc3Vic3RyaW5nKDAsIE1hdGgubWluKDMwLCBsZW5ndGgpKTsKKyAgCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdGluZyBsZW5ndGggaXMgbW9yZSB0aGFuIDMwIGNoYXJhY3RlcnMsIGNob3BzIG9mZiBhbnkKKyAgICAgICAgICAgICAgICAvLyB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMzApIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RTcGFjZSA9IHRpdGxlLmxhc3RJbmRleE9mKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U3BhY2UgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuVElUTEUsIHRpdGxlKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV3JpdGUgb3VyIHRleHQgYmFjayBpbnRvIHRoZSBwcm92aWRlci4KLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuTk9URSwgdGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIENvbW1pdCBhbGwgb2Ygb3VyIGNoYW5nZXMgdG8gcGVyc2lzdGVudCBzdG9yYWdlLiBXaGVuIHRoZSB1cGRhdGUgY29tcGxldGVzCi0gICAgICAgICAgICAvLyB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIG5vdGlmeSB0aGUgY3Vyc29yIG9mIHRoZSBjaGFuZ2UsIHdoaWNoIHdpbGwKLSAgICAgICAgICAgIC8vIGNhdXNlIHRoZSBVSSB0byBiZSB1cGRhdGVkLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUobVVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlcyBtYXAsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aXRsZQorICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCB0aXRsZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlcyBtYXAsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aXRsZQorICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCB0aXRsZSk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIHB1dHMgdGhlIGRlc2lyZWQgbm90ZXMgdGV4dCBpbnRvIHRoZSBtYXAuCisgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCB0ZXh0KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGVzIHRoZSBwcm92aWRlciB3aXRoIHRoZSBuZXcgdmFsdWVzIGluIHRoZSBtYXAuIFRoZSBMaXN0VmlldyBpcyB1cGRhdGVkCisgICAgICAgICAqIGF1dG9tYXRpY2FsbHkuIFRoZSBwcm92aWRlciBzZXRzIHRoaXMgdXAgYnkgc2V0dGluZyB0aGUgbm90aWZpY2F0aW9uIFVSSSBmb3IKKyAgICAgICAgICogcXVlcnkgQ3Vyc29yIG9iamVjdHMgdG8gdGhlIGluY29taW5nIFVSSS4gVGhlIGNvbnRlbnQgcmVzb2x2ZXIgaXMgdGh1cworICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIHdoZW4gdGhlIEN1cnNvciBmb3IgdGhlIFVSSSBjaGFuZ2VzLCBhbmQgdGhlIFVJIGlzCisgICAgICAgICAqIHVwZGF0ZWQuCisgICAgICAgICAqIE5vdGU6IFRoaXMgaXMgYmVpbmcgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLiBJdCB3aWxsIGJsb2NrIHRoZSB0aHJlYWQgdW50aWwgdGhlCisgICAgICAgICAqIHVwZGF0ZSBjb21wbGV0ZXMuIEluIGEgc2FtcGxlIGFwcCwgZ29pbmcgYWdhaW5zdCBhIHNpbXBsZSBwcm92aWRlciBiYXNlZCBvbiBhCisgICAgICAgICAqIGxvY2FsIGRhdGFiYXNlLCB0aGUgYmxvY2sgd2lsbCBiZSBtb21lbnRhcnksIGJ1dCBpbiBhIHJlYWwgYXBwIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAqIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlciBvciBhbmRyb2lkLm9zLkFzeW5jVGFzay4KKyAgICAgICAgICovCisgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICBtVXJpLCAgICAvLyBUaGUgVVJJIGZvciB0aGUgcmVjb3JkIHRvIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICB2YWx1ZXMsICAvLyBUaGUgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgbmV3IHZhbHVlcyB0byBhcHBseSB0byB0aGVtLgorICAgICAgICAgICAgICAgIG51bGwsICAgIC8vIE5vIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgdXNlZCwgc28gbm8gd2hlcmUgY29sdW1ucyBhcmUgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIG51bGwgICAgIC8vIE5vIHdoZXJlIGNvbHVtbnMgYXJlIHVzZWQsIHNvIG5vIHdoZXJlIGFyZ3VtZW50cyBhcmUgbmVjZXNzYXJ5LgorICAgICAgICAgICAgKTsKKworCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGFrZSBjYXJlIG9mIGNhbmNlbGluZyB3b3JrIG9uIGEgbm90ZS4gIERlbGV0ZXMgdGhlIG5vdGUgaWYgd2UKLSAgICAgKiBoYWQgY3JlYXRlZCBpdCwgb3RoZXJ3aXNlIHJldmVydHMgdG8gdGhlIG9yaWdpbmFsIHRleHQuCisgICAgICogVGhpcyBoZWxwZXIgbWV0aG9kIGNhbmNlbHMgdGhlIHdvcmsgZG9uZSBvbiBhIG5vdGUuICBJdCBkZWxldGVzIHRoZSBub3RlIGlmIGl0IHdhcworICAgICAqIG5ld2x5IGNyZWF0ZWQsIG9yIHJldmVydHMgdG8gdGhlIG9yaWdpbmFsIHRleHQgb2YgdGhlIG5vdGUgaQogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgdm9pZCBjYW5jZWxOb3RlKCkgewogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CkBAIC0zNDYsNyArNTkxLDcgQEAKICAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgbUN1cnNvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuTk9URSwgbU9yaWdpbmFsQ29udGVudCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsIG1PcmlnaW5hbENvbnRlbnQpOwogICAgICAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnVwZGF0ZShtVXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5TRVJUKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaW5zZXJ0ZWQgYW4gZW1wdHkgbm90ZSwgbWFrZSBzdXJlIHRvIGRlbGV0ZSBpdApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZC5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZC5qYXZhCmluZGV4IDA5MDg3ZGIuLjYyNGJlOTAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWQuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkLmphdmEKQEAgLTIwLDI1ICsyMCw5MiBAQAogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnM7CiAKIC8qKgotICogQ29udmVuaWVuY2UgZGVmaW5pdGlvbnMgZm9yIE5vdGVQYWRQcm92aWRlcgorICogRGVmaW5lcyBhIGNvbnRyYWN0IGJldHdlZW4gdGhlIE5vdGUgUGFkIGNvbnRlbnQgcHJvdmlkZXIgYW5kIGl0cyBjbGllbnRzLiBBIGNvbnRyYWN0IGRlZmluZXMgdGhlCisgKiBpbmZvcm1hdGlvbiB0aGF0IGEgY2xpZW50IG5lZWRzIHRvIGFjY2VzcyB0aGUgcHJvdmlkZXIgYXMgb25lIG9yIG1vcmUgZGF0YSB0YWJsZXMuIEEgY29udHJhY3QKKyAqIGlzIGEgcHVibGljLCBub24tZXh0ZW5kYWJsZSAoZmluYWwpIGNsYXNzIHRoYXQgY29udGFpbnMgY29uc3RhbnRzIGRlZmluaW5nIGNvbHVtbiBuYW1lcyBhbmQKKyAqIFVSSXMuIEEgd2VsbC13cml0dGVuIGNsaWVudCBkZXBlbmRzIG9ubHkgb24gdGhlIGNvbnN0YW50cyBpbiB0aGUgY29udHJhY3QuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBOb3RlUGFkIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiY29tLmV4YW1wbGUubm90ZXBhZC5wcm92aWRlci5Ob3RlUGFkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiY29tLmdvb2dsZS5wcm92aWRlci5Ob3RlUGFkIjsKIAogICAgIC8vIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICAgIHByaXZhdGUgTm90ZVBhZCgpIHt9Ci0gICAgCisgICAgcHJpdmF0ZSBOb3RlUGFkKCkgeworICAgIH0KKwogICAgIC8qKgotICAgICAqIE5vdGVzIHRhYmxlCisgICAgICogTm90ZXMgdGFibGUgY29udHJhY3QKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5vdGVDb2x1bW5zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTm90ZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKICAgICAgICAgLy8gVGhpcyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0gICAgICAgIHByaXZhdGUgTm90ZUNvbHVtbnMoKSB7fQorICAgICAgICBwcml2YXRlIE5vdGVzKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRhYmxlIG5hbWUgb2ZmZXJlZCBieSB0aGlzIHByb3ZpZGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIm5vdGVzIjsKKworICAgICAgICAvKgorICAgICAgICAgKiBVUkkgZGVmaW5pdGlvbnMKKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzY2hlbWUgcGFydCBmb3IgdGhpcyBwcm92aWRlcidzIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJjb250ZW50Oi8vIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGF0aCBwYXJ0cyBmb3IgdGhlIFVSSXMKKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdGggcGFydCBmb3IgdGhlIE5vdGVzIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTk9URVMgPSAiL25vdGVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGF0aCBwYXJ0IGZvciB0aGUgTm90ZSBJRCBVUkkKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX05PVEVfSUQgPSAiL25vdGVzLyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDAtcmVsYXRpdmUgcG9zaXRpb24gb2YgYSBub3RlIElEIHNlZ21lbnQgaW4gdGhlIHBhdGggcGFydCBvZiBhIG5vdGUgSUQgVVJJCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RFX0lEX1BBVEhfUE9TSVRJT04gPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXRoIHBhcnQgZm9yIHRoZSBMaXZlIEZvbGRlciBVUkkKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xJVkVfRk9MREVSID0gIi9saXZlX2ZvbGRlcnMvbm90ZXMiOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvbm90ZXMiKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSAgVXJpLnBhcnNlKFNDSEVNRSArIEFVVEhPUklUWSArIFBBVEhfTk9URVMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudCBVUkkgYmFzZSBmb3IgYSBzaW5nbGUgbm90ZS4gQ2FsbGVycyBtdXN0CisgICAgICAgICAqIGFwcGVuZCBhIG51bWVyaWMgbm90ZSBpZCB0byB0aGlzIFVyaSB0byByZXRyaWV2ZSBhIG5vdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfSURfVVJJX0JBU0UKKyAgICAgICAgICAgID0gVXJpLnBhcnNlKFNDSEVNRSArIEFVVEhPUklUWSArIFBBVEhfTk9URV9JRCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50IFVSSSBtYXRjaCBwYXR0ZXJuIGZvciBhIHNpbmdsZSBub3RlLCBzcGVjaWZpZWQgYnkgaXRzIElELiBVc2UgdGhpcyB0byBtYXRjaAorICAgICAgICAgKiBpbmNvbWluZyBVUklzIG9yIHRvIGNvbnN0cnVjdCBhbiBJbnRlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0lEX1VSSV9QQVRURVJOCisgICAgICAgICAgICA9IFVyaS5wYXJzZShTQ0hFTUUgKyBBVVRIT1JJVFkgKyBQQVRIX05PVEVfSUQgKyAiLyMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQgVXJpIHBhdHRlcm4gZm9yIGEgbm90ZXMgbGlzdGluZyBmb3IgbGl2ZSBmb2xkZXJzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBMSVZFX0ZPTERFUl9VUkkKKyAgICAgICAgICAgID0gVXJpLnBhcnNlKFNDSEVNRSArIEFVVEhPUklUWSArIFBBVEhfTElWRV9GT0xERVIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1JTUUgdHlwZSBkZWZpbml0aW9ucworICAgICAgICAgKi8KIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2Ygbm90ZXMuCkBAIC00Niw3ICsxMTMsOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci92bmQuZ29vZ2xlLm5vdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSBub3RlLgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZQorICAgICAgICAgKiBub3RlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vdm5kLmdvb2dsZS5ub3RlIjsKIApAQCAtNTUsMjggKzEyMywzMiBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1JUX09SREVSID0gIm1vZGlmaWVkIERFU0MiOwogCisgICAgICAgIC8qCisgICAgICAgICAqIENvbHVtbiBkZWZpbml0aW9ucworICAgICAgICAgKi8KKwogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpdGxlIG9mIHRoZSBub3RlCisgICAgICAgICAqIENvbHVtbiBuYW1lIGZvciB0aGUgdGl0bGUgb2YgdGhlIG5vdGUKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUVfVElUTEUgPSAidGl0bGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbm90ZSBpdHNlbGYKKyAgICAgICAgICogQ29sdW1uIG5hbWUgb2YgdGhlIG5vdGUgY29udGVudAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URSA9ICJub3RlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUVfTk9URSA9ICJub3RlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpbWVzdGFtcCBmb3Igd2hlbiB0aGUgbm90ZSB3YXMgY3JlYXRlZAorICAgICAgICAgKiBDb2x1bW4gbmFtZSBmb3IgdGhlIGNyZWF0aW9uIHRpbWVzdGFtcAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nIGZyb20gU3lzdGVtLmN1cmVudFRpbWVNaWxsaXMoKSk8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEX0RBVEUgPSAiY3JlYXRlZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FX0NSRUFURV9EQVRFID0gImNyZWF0ZWQiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZXN0YW1wIGZvciB3aGVuIHRoZSBub3RlIHdhcyBsYXN0IG1vZGlmaWVkCisgICAgICAgICAqIENvbHVtbiBuYW1lIGZvciB0aGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nIGZyb20gU3lzdGVtLmN1cmVudFRpbWVNaWxsaXMoKSk8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9EQVRFID0gIm1vZGlmaWVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUgPSAibW9kaWZpZWQiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlci5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEKaW5kZXggNWMzNDljNS4uMTgzOTY0NSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyLmphdmEKQEAgLTE2LDEzICsxNiwxNiBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZDsKIAotaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC5Ob3RlUGFkLk5vdGVDb2x1bW5zOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC5Ob3RlUGFkOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKQEAgLTMwLDIzNiArMzMsNzIwIEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVRdWVyeUJ1aWxkZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5MaXZlRm9sZGVyczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogLyoqCiAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gYSBkYXRhYmFzZSBvZiBub3Rlcy4gRWFjaCBub3RlIGhhcyBhIHRpdGxlLCB0aGUgbm90ZQogICogaXRzZWxmLCBhIGNyZWF0aW9uIGRhdGUgYW5kIGEgbW9kaWZpZWQgZGF0YS4KICAqLwotcHVibGljIGNsYXNzIE5vdGVQYWRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7Ci0KK3B1YmxpYyBjbGFzcyBOb3RlUGFkUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBQaXBlRGF0YVdyaXRlcjxDdXJzb3I+IHsKKyAgICAvLyBVc2VkIGZvciBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGVQYWRQcm92aWRlciI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfTkFNRSA9ICJub3RlcGFkLmRiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEVTX1RBQkxFX05BTUUgPSAibm90ZXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc05vdGVzUHJvamVjdGlvbk1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9URVMgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RFX0lEID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElWRV9GT0xERVJfTk9URVMgPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpTWF0Y2hlciBzVXJpTWF0Y2hlcjsKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YWJhc2UgdGhhdCB0aGUgcHJvdmlkZXIgdXNlcyBhcyBpdHMgdW5kZXJseWluZyBkYXRhIHN0b3JlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX05BTUUgPSAibm90ZV9wYWQuZGIiOwogCiAgICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBoZWxwcyBvcGVuLCBjcmVhdGUsIGFuZCB1cGdyYWRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAqIFRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTiA9IDI7CiAKLSAgICAgICAgRGF0YWJhc2VIZWxwZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBEQVRBQkFTRV9OQU1FLCBudWxsLCBEQVRBQkFTRV9WRVJTSU9OKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIEEgcHJvamVjdGlvbiBtYXAgdXNlZCB0byBzZWxlY3QgY29sdW1ucyBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNOb3Rlc1Byb2plY3Rpb25NYXA7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7Ci0gICAgICAgICAgICBkYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIE5PVEVTX1RBQkxFX05BTUUgKyAiICgiCi0gICAgICAgICAgICAgICAgICAgICsgTm90ZUNvbHVtbnMuX0lEICsgIiBJTlRFR0VSIFBSSU1BUlkgS0VZLCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3RlQ29sdW1ucy5USVRMRSArICIgVEVYVCwiCi0gICAgICAgICAgICAgICAgICAgICsgTm90ZUNvbHVtbnMuTk9URSArICIgVEVYVCwiCi0gICAgICAgICAgICAgICAgICAgICsgTm90ZUNvbHVtbnMuQ1JFQVRFRF9EQVRFICsgIiBJTlRFR0VSLCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFICsgIiBJTlRFR0VSIgotICAgICAgICAgICAgICAgICAgICArICIpOyIpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQSBwcm9qZWN0aW9uIG1hcCB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwOwogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVXBncmFkaW5nIGRhdGFiYXNlIGZyb20gdmVyc2lvbiAiICsgb2xkVmVyc2lvbiArICIgdG8gIgotICAgICAgICAgICAgICAgICAgICArIG5ld1ZlcnNpb24gKyAiLCB3aGljaCB3aWxsIGRlc3Ryb3kgYWxsIG9sZCBkYXRhIik7Ci0gICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyBub3RlcyIpOwotICAgICAgICAgICAgb25DcmVhdGUoZGIpOwotICAgICAgICB9Ci0gICAgfQorICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHByb2plY3Rpb24gZm9yIHRoZSBpbnRlcmVzdGluZyBjb2x1bW5zIG9mIGEgbm9ybWFsIG5vdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVBRF9OT1RFX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsICAgICAgICAgICAgICAgLy8gUHJvamVjdGlvbiBwb3NpdGlvbiAwLCB0aGUgbm90ZSdzIGlkCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsICAvLyBQcm9qZWN0aW9uIHBvc2l0aW9uIDEsIHRoZSBub3RlJ3MgY29udGVudAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgLy8gUHJvamVjdGlvbiBwb3NpdGlvbiAyLCB0aGUgbm90ZSdzIHRpdGxlCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9OT1RFX05PVEVfSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX05PVEVfVElUTEVfSU5ERVggPSAyOwogCisgICAgLyoKKyAgICAgKiBDb25zdGFudHMgdXNlZCBieSB0aGUgVXJpIG1hdGNoZXIgdG8gY2hvb3NlIGFuIGFjdGlvbiBiYXNlZCBvbiB0aGUgcGF0dGVybgorICAgICAqIG9mIHRoZSBpbmNvbWluZyBVUkkKKyAgICAgKi8KKyAgICAvLyBUaGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlIE5vdGVzIFVSSSBwYXR0ZXJuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEVTID0gMTsKKworICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgTm90ZSBJRCBVUkkgcGF0dGVybgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RFX0lEID0gMjsKKworICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgTGl2ZSBGb2xkZXIgVVJJIHBhdHRlcm4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElWRV9GT0xERVJfTk9URVMgPSAzOworCisgICAgLyoqCisgICAgICogQSBVcmlNYXRjaGVyIGluc3RhbmNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpTWF0Y2hlciBzVXJpTWF0Y2hlcjsKKworICAgIC8vIEhhbmRsZSB0byBhIG5ldyBEYXRhYmFzZUhlbHBlci4KICAgICBwcml2YXRlIERhdGFiYXNlSGVscGVyIG1PcGVuSGVscGVyOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7Ci0gICAgICAgIG1PcGVuSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGdldENvbnRleHQoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworCisgICAgLyoqCisgICAgICogQSBibG9jayB0aGF0IGluc3RhbnRpYXRlcyBhbmQgc2V0cyBzdGF0aWMgb2JqZWN0cworICAgICAqLworICAgIHN0YXRpYyB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIFVSSSBtYXRjaGVyCisgICAgICAgICAqLworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2UKKyAgICAgICAgc1VyaU1hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcihVcmlNYXRjaGVyLk5PX01BVENIKTsKKworICAgICAgICAvLyBBZGQgYSBwYXR0ZXJuIHRoYXQgcm91dGVzIFVSSXMgdGVybWluYXRlZCB3aXRoICJub3RlcyIgdG8gYSBOT1RFUyBvcGVyYXRpb24KKyAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMiLCBOT1RFUyk7CisKKyAgICAgICAgLy8gQWRkIGEgcGF0dGVybiB0aGF0IHJvdXRlcyBVUklzIHRlcm1pbmF0ZWQgd2l0aCAibm90ZXMiIHBsdXMgYW4gaW50ZWdlcgorICAgICAgICAvLyB0byBhIG5vdGUgSUQgb3BlcmF0aW9uCisgICAgICAgIHNVcmlNYXRjaGVyLmFkZFVSSShOb3RlUGFkLkFVVEhPUklUWSwgIm5vdGVzLyMiLCBOT1RFX0lEKTsKKworICAgICAgICAvLyBBZGQgYSBwYXR0ZXJuIHRoYXQgcm91dGVzIFVSSXMgdGVybWluYXRlZCB3aXRoIGxpdmVfZm9sZGVycy9ub3RlcyB0byBhCisgICAgICAgIC8vIGxpdmUgZm9sZGVyIG9wZXJhdGlvbgorICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJsaXZlX2ZvbGRlcnMvbm90ZXMiLCBMSVZFX0ZPTERFUl9OT1RFUyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBwcm9qZWN0aW9uIG1hcCB0aGF0IHJldHVybnMgYWxsIGNvbHVtbnMKKyAgICAgICAgICovCisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIG1hcCBpbnN0YW5jZS4gVGhlIG1hcCByZXR1cm5zIGEgY29sdW1uIG5hbWUKKyAgICAgICAgLy8gZ2l2ZW4gYSBzdHJpbmcuIFRoZSB0d28gYXJlIHVzdWFsbHkgZXF1YWwuCisgICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICAvLyBNYXBzIHRoZSBzdHJpbmcgIl9JRCIgdG8gdGhlIGNvbHVtbiBuYW1lICJfSUQiCisgICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVQYWQuTm90ZXMuX0lELCBOb3RlUGFkLk5vdGVzLl9JRCk7CisKKyAgICAgICAgLy8gTWFwcyAidGl0bGUiIHRvICJ0aXRsZSIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSk7CisKKyAgICAgICAgLy8gTWFwcyAibm90ZSIgdG8gIm5vdGUiCisgICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFKTsKKworICAgICAgICAvLyBNYXBzICJjcmVhdGVkIiB0byAiY3JlYXRlZCIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9DUkVBVEVfREFURSwKKyAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFKTsKKworICAgICAgICAvLyBNYXBzICJtb2RpZmllZCIgdG8gIm1vZGlmaWVkIgorICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dCgKKyAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFLAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZXMgYW4gaW5pdGlhbGl6ZXMgYSBwcm9qZWN0aW9uIG1hcCBmb3IgaGFuZGxpbmcgTGl2ZSBGb2xkZXJzCisgICAgICAgICAqLworCisgICAgICAgIC8vIENyZWF0ZXMgYSBuZXcgcHJvamVjdGlvbiBtYXAgaW5zdGFuY2UKKyAgICAgICAgc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgLy8gTWFwcyAiX0lEIiB0byAiX0lEIEFTIF9JRCIgZm9yIGEgbGl2ZSBmb2xkZXIKKyAgICAgICAgc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwLnB1dChMaXZlRm9sZGVycy5fSUQsIE5vdGVQYWQuTm90ZXMuX0lEICsgIiBBUyAiICsgTGl2ZUZvbGRlcnMuX0lEKTsKKworICAgICAgICAvLyBNYXBzICJOQU1FIiB0byAidGl0bGUgQVMgTkFNRSIKKyAgICAgICAgc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwLnB1dChMaXZlRm9sZGVycy5OQU1FLCBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiBBUyAiICsKKyAgICAgICAgICAgIExpdmVGb2xkZXJzLk5BTUUpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKLSAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgU1FMaXRlUXVlcnlCdWlsZGVyIHFiID0gbmV3IFNRTGl0ZVF1ZXJ5QnVpbGRlcigpOwotICAgICAgICBxYi5zZXRUYWJsZXMoTk9URVNfVEFCTEVfTkFNRSk7CisgICAgLyoqCisgICAgKgorICAgICogVGhpcyBjbGFzcyBoZWxwcyBvcGVuLCBjcmVhdGUsIGFuZCB1cGdyYWRlIHRoZSBkYXRhYmFzZSBmaWxlLiBTZXQgdG8gcGFja2FnZSB2aXNpYmlsaXR5CisgICAgKiBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAqLworICAgc3RhdGljIGNsYXNzIERhdGFiYXNlSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CiAKKyAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICAgICAvLyBjYWxscyB0aGUgc3VwZXIgY29uc3RydWN0b3IsIHJlcXVlc3RpbmcgdGhlIGRlZmF1bHQgY3Vyc29yIGZhY3RvcnkuCisgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOworICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqCisgICAgICAgICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB3aXRoIHRhYmxlIG5hbWUgYW5kIGNvbHVtbiBuYW1lcyB0YWtlbiBmcm9tIHRoZQorICAgICAgICAqIE5vdGVQYWQgY2xhc3MuCisgICAgICAgICovCisgICAgICAgQE92ZXJyaWRlCisgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgZGIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUgKyAiICgiCisgICAgICAgICAgICAgICAgICAgKyBOb3RlUGFkLk5vdGVzLl9JRCArICIgSU5URUdFUiBQUklNQVJZIEtFWSwiCisgICAgICAgICAgICAgICAgICAgKyBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiBURVhULCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSArICIgVEVYVCwiCisgICAgICAgICAgICAgICAgICAgKyBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFICsgIiBJTlRFR0VSLCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUgKyAiIElOVEVHRVIiCisgICAgICAgICAgICAgICAgICAgKyAiKTsiKTsKKyAgICAgICB9CisKKyAgICAgICAvKioKKyAgICAgICAgKgorICAgICAgICAqIERlbW9uc3RyYXRlcyB0aGF0IHRoZSBwcm92aWRlciBtdXN0IGNvbnNpZGVyIHdoYXQgaGFwcGVucyB3aGVuIHRoZQorICAgICAgICAqIHVuZGVybHlpbmcgZGF0YXN0b3JlIGlzIGNoYW5nZWQuIEluIHRoaXMgc2FtcGxlLCB0aGUgZGF0YWJhc2UgaXMgdXBncmFkZWQgdGhlIGRhdGFiYXNlCisgICAgICAgICogYnkgZGVzdHJveWluZyB0aGUgZXhpc3RpbmcgZGF0YS4KKyAgICAgICAgKiBBIHJlYWwgYXBwbGljYXRpb24gc2hvdWxkIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGluIHBsYWNlLgorICAgICAgICAqLworICAgICAgIEBPdmVycmlkZQorICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7CisKKyAgICAgICAgICAgLy8gTG9ncyB0aGF0IHRoZSBkYXRhYmFzZSBpcyBiZWluZyB1cGdyYWRlZAorICAgICAgICAgICBMb2cudyhUQUcsICJVcGdyYWRpbmcgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKyBvbGRWZXJzaW9uICsgIiB0byAiCisgICAgICAgICAgICAgICAgICAgKyBuZXdWZXJzaW9uICsgIiwgd2hpY2ggd2lsbCBkZXN0cm95IGFsbCBvbGQgZGF0YSIpOworCisgICAgICAgICAgIC8vIEtpbGxzIHRoZSB0YWJsZSBhbmQgZXhpc3RpbmcgZGF0YQorICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyBub3RlcyIpOworCisgICAgICAgICAgIC8vIFJlY3JlYXRlcyB0aGUgZGF0YWJhc2Ugd2l0aCBhIG5ldyB2ZXJzaW9uCisgICAgICAgICAgIG9uQ3JlYXRlKGRiKTsKKyAgICAgICB9CisgICB9CisKKyAgIC8qKgorICAgICoKKyAgICAqIEluaXRpYWxpemVzIHRoZSBwcm92aWRlciBieSBjcmVhdGluZyBhIG5ldyBEYXRhYmFzZUhlbHBlci4gb25DcmVhdGUoKSBpcyBjYWxsZWQKKyAgICAqIGF1dG9tYXRpY2FsbHkgd2hlbiBBbmRyb2lkIGNyZWF0ZXMgdGhlIHByb3ZpZGVyIGluIHJlc3BvbnNlIHRvIGEgcmVzb2x2ZXIgcmVxdWVzdCBmcm9tIGEKKyAgICAqIGNsaWVudC4KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKworICAgICAgIC8vIENyZWF0ZXMgYSBuZXcgaGVscGVyIG9iamVjdC4gTm90ZSB0aGF0IHRoZSBkYXRhYmFzZSBpdHNlbGYgaXNuJ3Qgb3BlbmVkIHVudGlsCisgICAgICAgLy8gc29tZXRoaW5nIHRyaWVzIHRvIGFjY2VzcyBpdCwgYW5kIGl0J3Mgb25seSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKyAgICAgICBtT3BlbkhlbHBlciA9IG5ldyBEYXRhYmFzZUhlbHBlcihnZXRDb250ZXh0KCkpOworCisgICAgICAgLy8gQXNzdW1lcyB0aGF0IGFueSBmYWlsdXJlcyB3aWxsIGJlIHJlcG9ydGVkIGJ5IGEgdGhyb3duIGV4Y2VwdGlvbi4KKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKworICAgLyoqCisgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjcXVlcnkoVXJpLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKX0uCisgICAgKiBRdWVyaWVzIHRoZSBkYXRhYmFzZSBhbmQgcmV0dXJucyBhIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgICoKKyAgICAqIEByZXR1cm4gQSBjdXJzb3IgY29udGFpbmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuIFRoZSBjdXJzb3IgZXhpc3RzIGJ1dCBpcyBlbXB0eSBpZgorICAgICogdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cyBvciBhbiBleGNlcHRpb24gb2NjdXJzLgorICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuIGlzIGludmFsaWQuCisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisKKyAgICAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHF1ZXJ5IGJ1aWxkZXIgYW5kIHNldHMgaXRzIHRhYmxlIG5hbWUKKyAgICAgICBTUUxpdGVRdWVyeUJ1aWxkZXIgcWIgPSBuZXcgU1FMaXRlUXVlcnlCdWlsZGVyKCk7CisgICAgICAgcWIuc2V0VGFibGVzKE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSk7CisKKyAgICAgICAvKioKKyAgICAgICAgKiBDaG9vc2UgdGhlIHByb2plY3Rpb24gYW5kIGFkanVzdCB0aGUgIndoZXJlIiBjbGF1c2UgYmFzZWQgb24gVVJJIHBhdHRlcm4tbWF0Y2hpbmcuCisgICAgICAgICovCisgICAgICAgc3dpdGNoIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7CisgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgaXMgZm9yIG5vdGVzLCBjaG9vc2VzIHRoZSBOb3RlcyBwcm9qZWN0aW9uCisgICAgICAgICAgIGNhc2UgTk9URVM6CisgICAgICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNOb3Rlc1Byb2plY3Rpb25NYXApOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgLyogSWYgdGhlIGluY29taW5nIFVSSSBpcyBmb3IgYSBzaW5nbGUgbm90ZSBpZGVudGlmaWVkIGJ5IGl0cyBJRCwgY2hvb3NlcyB0aGUKKyAgICAgICAgICAgICogbm90ZSBJRCBwcm9qZWN0aW9uLCBhbmQgYXBwZW5kcyAiX0lEID0gPG5vdGVJRD4iIHRvIHRoZSB3aGVyZSBjbGF1c2UsIHNvIHRoYXQKKyAgICAgICAgICAgICogaXQgc2VsZWN0cyB0aGF0IHNpbmdsZSBub3RlCisgICAgICAgICAgICAqLworICAgICAgICAgICBjYXNlIE5PVEVfSUQ6CisgICAgICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNOb3Rlc1Byb2plY3Rpb25NYXApOworICAgICAgICAgICAgICAgcWIuYXBwZW5kV2hlcmUoCisgICAgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQgKyAgICAvLyB0aGUgbmFtZSBvZiB0aGUgSUQgY29sdW1uCisgICAgICAgICAgICAgICAgICAgIj0iICsKKyAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIG5vdGUgSUQgaXRzZWxmIGluIHRoZSBpbmNvbWluZyBVUkkKKyAgICAgICAgICAgICAgICAgICB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KE5vdGVQYWQuTm90ZXMuTk9URV9JRF9QQVRIX1BPU0lUSU9OKSk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExJVkVfRk9MREVSX05PVEVTOgorICAgICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBpcyBmcm9tIGEgbGl2ZSBmb2xkZXIsIGNob29zZXMgdGhlIGxpdmUgZm9sZGVyIHByb2plY3Rpb24uCisgICAgICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgLy8gSWYgdGhlIFVSSSBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUga25vd24gcGF0dGVybnMsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgIH0KKworCisgICAgICAgU3RyaW5nIG9yZGVyQnk7CisgICAgICAgLy8gSWYgbm8gc29ydCBvcmRlciBpcyBzcGVjaWZpZWQsIHVzZXMgdGhlIGRlZmF1bHQKKyAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc29ydE9yZGVyKSkgeworICAgICAgICAgICBvcmRlckJ5ID0gTm90ZVBhZC5Ob3Rlcy5ERUZBVUxUX1NPUlRfT1JERVI7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2VzIHRoZSBpbmNvbWluZyBzb3J0IG9yZGVyCisgICAgICAgICAgIG9yZGVyQnkgPSBzb3J0T3JkZXI7CisgICAgICAgfQorCisgICAgICAgLy8gT3BlbnMgdGhlIGRhdGFiYXNlIG9iamVjdCBpbiAicmVhZCIgbW9kZSwgc2luY2Ugbm8gd3JpdGVzIG5lZWQgdG8gYmUgZG9uZS4KKyAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKworICAgICAgIC8qCisgICAgICAgICogUGVyZm9ybXMgdGhlIHF1ZXJ5LiBJZiBubyBwcm9ibGVtcyBvY2N1ciB0cnlpbmcgdG8gcmVhZCB0aGUgZGF0YWJhc2UsIHRoZW4gYSBDdXJzb3IKKyAgICAgICAgKiBvYmplY3QgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgdGhlIGN1cnNvciB2YXJpYWJsZSBjb250YWlucyBudWxsLiBJZiBubyByZWNvcmRzIHdlcmUKKyAgICAgICAgKiBzZWxlY3RlZCwgdGhlbiB0aGUgQ3Vyc29yIG9iamVjdCBpcyBlbXB0eSwgYW5kIEN1cnNvci5nZXRDb3VudCgpIHJldHVybnMgMC4KKyAgICAgICAgKi8KKyAgICAgICBDdXJzb3IgYyA9IHFiLnF1ZXJ5KAorICAgICAgICAgICBkYiwgICAgICAgICAgICAvLyBUaGUgZGF0YWJhc2UgdG8gcXVlcnkKKyAgICAgICAgICAgcHJvamVjdGlvbiwgICAgLy8gVGhlIGNvbHVtbnMgdG8gcmV0dXJuIGZyb20gdGhlIHF1ZXJ5CisgICAgICAgICAgIHNlbGVjdGlvbiwgICAgIC8vIFRoZSBjb2x1bW5zIGZvciB0aGUgd2hlcmUgY2xhdXNlCisgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIC8vIFRoZSB2YWx1ZXMgZm9yIHRoZSB3aGVyZSBjbGF1c2UKKyAgICAgICAgICAgbnVsbCwgICAgICAgICAgLy8gZG9uJ3QgZ3JvdXAgdGhlIHJvd3MKKyAgICAgICAgICAgbnVsbCwgICAgICAgICAgLy8gZG9uJ3QgZmlsdGVyIGJ5IHJvdyBncm91cHMKKyAgICAgICAgICAgb3JkZXJCeSAgICAgICAgLy8gVGhlIHNvcnQgb3JkZXIKKyAgICAgICApOworCisgICAgICAgLy8gVGVsbHMgdGhlIEN1cnNvciB3aGF0IFVSSSB0byB3YXRjaCwgc28gaXQga25vd3Mgd2hlbiBpdHMgc291cmNlIGRhdGEgY2hhbmdlcworICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uVXJpKGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwgdXJpKTsKKyAgICAgICByZXR1cm4gYzsKKyAgIH0KKworICAgLyoqCisgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGNhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI2dldFR5cGUoVXJpKX0uCisgICAgKiBSZXR1cm5zIHRoZSBNSU1FIGRhdGEgdHlwZSBvZiB0aGUgVVJJIGdpdmVuIGFzIGEgcGFyYW1ldGVyLgorICAgICoKKyAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB3aG9zZSBNSU1FIHR5cGUgaXMgZGVzaXJlZC4KKyAgICAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBvZiB0aGUgVVJJLgorICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuIGlzIGludmFsaWQuCisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmkpIHsKKworICAgICAgIC8qKgorICAgICAgICAqIENob29zZXMgdGhlIE1JTUUgdHlwZSBiYXNlZCBvbiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4KKyAgICAgICAgKi8KKyAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKworICAgICAgICAgICAvLyBJZiB0aGUgcGF0dGVybiBpcyBmb3Igbm90ZXMgb3IgbGl2ZSBmb2xkZXJzLCByZXR1cm5zIHRoZSBnZW5lcmFsIGNvbnRlbnQgdHlwZS4KKyAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgY2FzZSBMSVZFX0ZPTERFUl9OT1RFUzoKKyAgICAgICAgICAgICAgIHJldHVybiBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVFlQRTsKKworICAgICAgICAgICAvLyBJZiB0aGUgcGF0dGVybiBpcyBmb3Igbm90ZSBJRHMsIHJldHVybnMgdGhlIG5vdGUgSUQgY29udGVudCB0eXBlLgorICAgICAgICAgICBjYXNlIE5PVEVfSUQ6CisgICAgICAgICAgICAgICByZXR1cm4gTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lURU1fVFlQRTsKKworICAgICAgICAgICAvLyBJZiB0aGUgVVJJIHBhdHRlcm4gZG9lc24ndCBtYXRjaCBhbnkgcGVybWl0dGVkIHBhdHRlcm5zLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgfQorICAgIH0KKworLy9CRUdJTl9JTkNMVURFKHN0cmVhbSkKKyAgICAvKioKKyAgICAgKiBUaGlzIGRlc2NyaWJlcyB0aGUgTUlNRSB0eXBlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgZm9yIG9wZW5pbmcgYSBub3RlCisgICAgICogVVJJIGFzIGEgc3RyZWFtLgorICAgICAqLworICAgIHN0YXRpYyBDbGlwRGVzY3JpcHRpb24gTk9URV9TVFJFQU1fVFlQRVMgPSBuZXcgQ2xpcERlc2NyaXB0aW9uKG51bGwsCisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDbGlwRGVzY3JpcHRpb24uTUlNRVRZUEVfVEVYVF9QTEFJTiB9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGVzIG9mIGF2YWlsYWJsZSBkYXRhIHN0cmVhbXMuICBVUklzIHRvIHNwZWNpZmljIG5vdGVzIGFyZSBzdXBwb3J0ZWQuCisgICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb252ZXJ0IHN1Y2ggYSBub3RlIHRvIGEgcGxhaW4gdGV4dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gYW5hbHl6ZQorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgTUlNRSB0eXBlIHRvIGNoZWNrIGZvci4gVGhpcyBtZXRob2Qgb25seSByZXR1cm5zIGEgZGF0YSBzdHJlYW0KKyAgICAgKiB0eXBlIGZvciBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggdGhlIGZpbHRlci4gQ3VycmVudGx5LCBvbmx5IHRleHQvcGxhaW4gTUlNRSB0eXBlcyBtYXRjaC4KKyAgICAgKiBAcmV0dXJuIGEgZGF0YSBzdHJlYW0gTUlNRSB0eXBlLiBDdXJyZW50bHksIG9ubHkgdGV4dC9wbGFuIGlzIHJldHVybmVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBVUkkgcGF0dGVybiBkb2Vzbid0IG1hdGNoIGFueSBzdXBwb3J0ZWQgcGF0dGVybnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICAvKioKKyAgICAgICAgICogIENob29zZXMgdGhlIGRhdGEgc3RyZWFtIHR5cGUgYmFzZWQgb24gdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuLgorICAgICAgICAgKi8KICAgICAgICAgc3dpdGNoIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7Ci0gICAgICAgIGNhc2UgTk9URVM6Ci0gICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNOb3Rlc1Byb2plY3Rpb25NYXApOwotICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBOT1RFX0lEOgotICAgICAgICAgICAgcWIuc2V0UHJvamVjdGlvbk1hcChzTm90ZXNQcm9qZWN0aW9uTWFwKTsKLSAgICAgICAgICAgIHFiLmFwcGVuZFdoZXJlKE5vdGVDb2x1bW5zLl9JRCArICI9IiArIHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMSkpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBJZiB0aGUgcGF0dGVybiBpcyBmb3Igbm90ZXMgb3IgbGl2ZSBmb2xkZXJzLCByZXR1cm4gbnVsbC4gRGF0YSBzdHJlYW1zIGFyZSBub3QKKyAgICAgICAgICAgIC8vIHN1cHBvcnRlZCBmb3IgdGhpcyB0eXBlIG9mIFVSSS4KKyAgICAgICAgICAgIGNhc2UgTk9URVM6CisgICAgICAgICAgICBjYXNlIExJVkVfRk9MREVSX05PVEVTOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogCi0gICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6Ci0gICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlIElEcyBhbmQgdGhlIE1JTUUgZmlsdGVyIGlzIHRleHQvcGxhaW4sIHRoZW4gcmV0dXJuCisgICAgICAgICAgICAvLyB0ZXh0L3BsYWluCisgICAgICAgICAgICBjYXNlIE5PVEVfSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVEVfU1RSRUFNX1RZUEVTLmZpbHRlck1pbWVUeXBlcyhtaW1lVHlwZUZpbHRlcik7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgbm8gc29ydCBvcmRlciBpcyBzcGVjaWZpZWQgdXNlIHRoZSBkZWZhdWx0Ci0gICAgICAgIFN0cmluZyBvcmRlckJ5OwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc29ydE9yZGVyKSkgewotICAgICAgICAgICAgb3JkZXJCeSA9IE5vdGVDb2x1bW5zLkRFRkFVTFRfU09SVF9PUkRFUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9yZGVyQnkgPSBzb3J0T3JkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGRhdGFiYXNlIGFuZCBydW4gdGhlIHF1ZXJ5Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOwotICAgICAgICBDdXJzb3IgYyA9IHFiLnF1ZXJ5KGRiLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwsIG51bGwsIG9yZGVyQnkpOwotCi0gICAgICAgIC8vIFRlbGwgdGhlIGN1cnNvciB3aGF0IHVyaSB0byB3YXRjaCwgc28gaXQga25vd3Mgd2hlbiBpdHMgc291cmNlIGRhdGEgY2hhbmdlcwotICAgICAgICBjLnNldE5vdGlmaWNhdGlvblVyaShnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksIHVyaSk7Ci0gICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBVUkkgcGF0dGVybiBkb2Vzbid0IG1hdGNoIGFueSBwZXJtaXR0ZWQgcGF0dGVybnMsIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgfQogICAgIH0KIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmVhbSBvZiBkYXRhIGZvciBlYWNoIHN1cHBvcnRlZCBzdHJlYW0gdHlwZS4gVGhpcyBtZXRob2QgZG9lcyBhIHF1ZXJ5IG9uIHRoZQorICAgICAqIGluY29taW5nIFVSSSwgdGhlbiB1c2VzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIjb3BlblBpcGVIZWxwZXIoVXJpLCBTdHJpbmcsIEJ1bmRsZSwgT2JqZWN0LAorICAgICAqIFBpcGVEYXRhV3JpdGVyKX0gdG8gc3RhcnQgYW5vdGhlciB0aHJlYWQgaW4gd2hpY2ggdG8gY29udmVydCB0aGUgZGF0YSBpbnRvIGEgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHBhdHRlcm4gdGhhdCBwb2ludHMgdG8gdGhlIGRhdGEgc3RyZWFtCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIEEgU3RyaW5nIGNvbnRhaW5pbmcgYSBNSU1FIHR5cGUuIFRoaXMgbWV0aG9kIHRyaWVzIHRvIGdldCBhIHN0cmVhbSBvZgorICAgICAqIGRhdGEgd2l0aCB0aGlzIE1JTUUgdHlwZS4KKyAgICAgKiBAcGFyYW0gb3B0cyBBZGRpdGlvbmFsIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gIENhbiBiZSBpbnRlcnByZXRlZCBhcworICAgICAqIGRlc2lyZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBBc3NldEZpbGVEZXNjcmlwdG9yIEEgaGFuZGxlIHRvIHRoZSBmaWxlLgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmNvbWluZyBVUkkuCisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmkpIHsKLSAgICAgICAgc3dpdGNoIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpKSB7Ci0gICAgICAgIGNhc2UgTk9URVM6Ci0gICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6Ci0gICAgICAgICAgICByZXR1cm4gTm90ZUNvbHVtbnMuQ09OVEVOVF9UWVBFOworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgY2FzZSBOT1RFX0lEOgotICAgICAgICAgICAgcmV0dXJuIE5vdGVDb2x1bW5zLkNPTlRFTlRfSVRFTV9UWVBFOworICAgICAgICAvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSBNSU1FIHR5cGUgZmlsdGVyIG1hdGNoZXMgYSBzdXBwb3J0ZWQgTUlNRSB0eXBlLgorICAgICAgICBTdHJpbmdbXSBtaW1lVHlwZXMgPSBnZXRTdHJlYW1UeXBlcyh1cmksIG1pbWVUeXBlRmlsdGVyKTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgIC8vIElmIHRoZSBNSU1FIHR5cGUgaXMgc3VwcG9ydGVkCisgICAgICAgIGlmIChtaW1lVHlwZXMgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZXMgdGhlIG5vdGUgZm9yIHRoaXMgVVJJLiBVc2VzIHRoZSBxdWVyeSBtZXRob2QgZGVmaW5lZCBmb3IgdGhpcyBwcm92aWRlciwKKyAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBkYXRhYmFzZSBxdWVyeSBtZXRob2QuCisgICAgICAgICAgICBDdXJzb3IgYyA9IHF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICB1cmksICAgICAgICAgICAgICAgICAgICAvLyBUaGUgVVJJIG9mIGEgbm90ZQorICAgICAgICAgICAgICAgICAgICBSRUFEX05PVEVfUFJPSkVDVElPTiwgICAvLyBHZXRzIGEgcHJvamVjdGlvbiBjb250YWluaW5nIHRoZSBub3RlJ3MgSUQsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29udGVudHMKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgLy8gTm8gV0hFUkUgY2xhdXNlLCBnZXQgYWxsIG1hdGNoaW5nIHJlY29yZHMKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUgaXMgbm8gV0hFUkUgY2xhdXNlLCBubyBzZWxlY3Rpb24gY3JpdGVyaWEKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgKG1vZGlmaWNhdGlvbiBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjZW5kaW5nCisgICAgICAgICAgICApOworCisKKyAgICAgICAgICAgIC8vIElmIHRoZSBxdWVyeSBmYWlscyBvciB0aGUgY3Vyc29yIGlzIGVtcHR5LCBzdG9wCisgICAgICAgICAgICBpZiAoYyA9PSBudWxsIHx8ICFjLm1vdmVUb0ZpcnN0KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgZW1wdHksIHNpbXBseSBjbG9zZSB0aGUgY3Vyc29yIGFuZCByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIG51bGwsIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIlVuYWJsZSB0byBxdWVyeSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RhcnQgYSBuZXcgdGhyZWFkIHRoYXQgcGlwZXMgdGhlIHN0cmVhbSBkYXRhIGJhY2sgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgb3BlblBpcGVIZWxwZXIodXJpLCBtaW1lVHlwZXNbMF0sIG9wdHMsIGMsIHRoaXMpLCAwLAorICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yLlVOS05PV05fTEVOR1RIKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBNSU1FIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJuIGEgcmVhZC1vbmx5IGhhbmRsZSB0byB0aGUgZmlsZS4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlRmlsdGVyLCBvcHRzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlcn0KKyAgICAgKiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgd29yayBvZiBjb252ZXJ0aW5nIHRoZSBkYXRhIGluIG9uZSBvZiBjdXJzb3JzIHRvIGEKKyAgICAgKiBzdHJlYW0gb2YgZGF0YSBmb3IgdGhlIGNsaWVudCB0byByZWFkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YVRvUGlwZShQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRwdXQsIFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRzLCBDdXJzb3IgYykgeworICAgICAgICAvLyBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IGNvbnZlcnNpb24tdG8tdGV4dCBmcm9tIGEgc2luZ2xlIG5vdGUgZW50cnksCisgICAgICAgIC8vIHNvIG5vIG5lZWQgZm9yIGN1cnNvciBkYXRhIHR5cGUgY2hlY2tpbmcgaGVyZS4KKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0LmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICBQcmludFdyaXRlciBwdyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvdXQsICJVVEYtOCIpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oYy5nZXRTdHJpbmcoUkVBRF9OT1RFX1RJVExFX0lOREVYKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oYy5nZXRTdHJpbmcoUkVBRF9OT1RFX05PVEVfSU5ERVgpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJPb29wcyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKHB3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvL0VORF9JTkNMVURFKHN0cmVhbSkKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNpbnNlcnQoVXJpLCBDb250ZW50VmFsdWVzKX0uCisgICAgICogSW5zZXJ0cyBhIG5ldyByb3cgaW50byB0aGUgZGF0YWJhc2UuIFRoaXMgbWV0aG9kIHNldHMgdXAgZGVmYXVsdCB2YWx1ZXMgZm9yIGFueQorICAgICAqIGNvbHVtbnMgdGhhdCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBpbmNvbWluZyBtYXAuCisgICAgICogSWYgcm93cyB3ZXJlIGluc2VydGVkLCB0aGVuIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBAcmV0dXJuIFRoZSByb3cgSUQgb2YgdGhlIGluc2VydGVkIHJvdy4KKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpZiB0aGUgaW5zZXJ0aW9uIGZhaWxzLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcykgewotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVxdWVzdGVkIHVyaQorCisgICAgICAgIC8vIFZhbGlkYXRlcyB0aGUgaW5jb21pbmcgVVJJLiBPbmx5IHRoZSBmdWxsIHByb3ZpZGVyIFVSSSBpcyBhbGxvd2VkIGZvciBpbnNlcnRzLgogICAgICAgICBpZiAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSAhPSBOT1RFUykgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBBIG1hcCB0byBob2xkIHRoZSBuZXcgcmVjb3JkJ3MgdmFsdWVzLgogICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlczsKKworICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgdmFsdWVzIG1hcCBpcyBub3QgbnVsbCwgdXNlcyBpdCBmb3IgdGhlIG5ldyB2YWx1ZXMuCiAgICAgICAgIGlmIChpbml0aWFsVmFsdWVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKGluaXRpYWxWYWx1ZXMpOworCiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyB2YWx1ZSBtYXAKICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGluIG1pbGxpc2Vjb25kcwogICAgICAgICBMb25nIG5vdyA9IExvbmcudmFsdWVPZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpZWxkcyBhcmUgYWxsIHNldAotICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVDb2x1bW5zLkNSRUFURURfREFURSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuQ1JFQVRFRF9EQVRFLCBub3cpOworICAgICAgICAvLyBJZiB0aGUgdmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW4gdGhlIGNyZWF0aW9uIGRhdGUsIHNldHMgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9DUkVBVEVfREFURSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9DUkVBVEVfREFURSwgbm93KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZUNvbHVtbnMuTU9ESUZJRURfREFURSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuTU9ESUZJRURfREFURSwgbm93KTsKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluIHRoZSBtb2RpZmljYXRpb24gZGF0ZSwgc2V0cyB0aGUgdmFsdWUgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gdGltZS4KKyAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFLCBub3cpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlQ29sdW1ucy5USVRMRSkgPT0gZmFsc2UpIHsKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluIGEgdGl0bGUsIHNldHMgdGhlIHZhbHVlIHRvIHRoZSBkZWZhdWx0IHRpdGxlLgorICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBSZXNvdXJjZXMgciA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZUNvbHVtbnMuVElUTEUsIHIuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHJpbmcudW50aXRsZWQpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgci5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0cmluZy51bnRpdGxlZCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlQ29sdW1ucy5OT1RFKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlQ29sdW1ucy5OT1RFLCAiIik7CisgICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgbWFwIGRvZXNuJ3QgY29udGFpbiBub3RlIHRleHQsIHNldHMgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpID09IGZhbHNlKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIiIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gT3BlbnMgdGhlIGRhdGFiYXNlIG9iamVjdCBpbiAid3JpdGUiIG1vZGUuCiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwotICAgICAgICBsb25nIHJvd0lkID0gZGIuaW5zZXJ0KE5PVEVTX1RBQkxFX05BTUUsIE5vdGVDb2x1bW5zLk5PVEUsIHZhbHVlcyk7CisKKyAgICAgICAgLy8gUGVyZm9ybXMgdGhlIGluc2VydCBhbmQgcmV0dXJucyB0aGUgSUQgb2YgdGhlIG5ldyBub3RlLgorICAgICAgICBsb25nIHJvd0lkID0gZGIuaW5zZXJ0KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgICAgICAgLy8gVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLgorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCAgLy8gQSBoYWNrLCBTUUxpdGUgc2V0cyB0aGlzIGNvbHVtbiB2YWx1ZSB0byBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgaXMgZW1wdHkuCisgICAgICAgICAgICB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1hcCBvZiBjb2x1bW4gbmFtZXMsIGFuZCB0aGUgdmFsdWVzIHRvIGluc2VydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgY29sdW1ucy4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBJZiB0aGUgaW5zZXJ0IHN1Y2NlZWRlZCwgdGhlIHJvdyBJRCBleGlzdHMuCiAgICAgICAgIGlmIChyb3dJZCA+IDApIHsKLSAgICAgICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoTm90ZUNvbHVtbnMuQ09OVEVOVF9VUkksIHJvd0lkKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBVUkkgd2l0aCB0aGUgbm90ZSBJRCBwYXR0ZXJuIGFuZCB0aGUgbmV3IHJvdyBJRCBhcHBlbmRlZCB0byBpdC4KKyAgICAgICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lEX1VSSV9CQVNFLCByb3dJZCk7CisKKyAgICAgICAgICAgIC8vIE5vdGlmaWVzIG9ic2VydmVycyByZWdpc3RlcmVkIGFnYWluc3QgdGhpcyBwcm92aWRlciB0aGF0IHRoZSBkYXRhIGNoYW5nZWQuCiAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKG5vdGVVcmksIG51bGwpOwogICAgICAgICAgICAgcmV0dXJuIG5vdGVVcmk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBJZiB0aGUgaW5zZXJ0IGRpZG4ndCBzdWNjZWVkLCB0aGVuIHRoZSByb3dJRCBpcyA8PSAwLiBUaHJvd3MgYW4gZXhjZXB0aW9uLgogICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5zZXJ0IHJvdyBpbnRvICIgKyB1cmkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNkZWxldGUoVXJpLCBTdHJpbmcsIFN0cmluZ1tdKX0uCisgICAgICogRGVsZXRlcyByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlLiBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlIG5vdGUgSUQgVVJJIHBhdHRlcm4sCisgICAgICogdGhpcyBtZXRob2QgZGVsZXRlcyB0aGUgb25lIHJlY29yZCBzcGVjaWZpZWQgYnkgdGhlIElEIGluIHRoZSBVUkkuIE90aGVyd2lzZSwgaXQgZGVsZXRlcyBhCisgICAgICogYSBzZXQgb2YgcmVjb3Jkcy4gVGhlIHJlY29yZCBvciByZWNvcmRzIG11c3QgYWxzbyBtYXRjaCB0aGUgaW5wdXQgc2VsZWN0aW9uIGNyaXRlcmlhCisgICAgICogc3BlY2lmaWVkIGJ5IHdoZXJlIGFuZCB3aGVyZUFyZ3MuCisgICAgICoKKyAgICAgKiBJZiByb3dzIHdlcmUgZGVsZXRlZCwgdGhlbiBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UuCisgICAgICogQHJldHVybiBJZiBhICJ3aGVyZSIgY2xhdXNlIGlzIHVzZWQsIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlCisgICAgICogMCBpcyByZXR1cm5lZC4gVG8gZGVsZXRlIGFsbCByb3dzIGFuZCBnZXQgYSByb3cgY291bnQsIHVzZSAiMSIgYXMgdGhlIHdoZXJlIGNsYXVzZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgd2hlcmUsIFN0cmluZ1tdIHdoZXJlQXJncykgeworCisgICAgICAgIC8vIE9wZW5zIHRoZSBkYXRhYmFzZSBvYmplY3QgaW4gIndyaXRlIiBtb2RlLgogICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgU3RyaW5nIGZpbmFsV2hlcmU7CisKICAgICAgICAgaW50IGNvdW50OworCisgICAgICAgIC8vIERvZXMgdGhlIGRlbGV0ZSBiYXNlZCBvbiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4uCiAgICAgICAgIHN3aXRjaCAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSkgewotICAgICAgICBjYXNlIE5PVEVTOgotICAgICAgICAgICAgY291bnQgPSBkYi5kZWxldGUoTk9URVNfVEFCTEVfTkFNRSwgd2hlcmUsIHdoZXJlQXJncyk7Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICBTdHJpbmcgbm90ZUlkID0gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKTsKLSAgICAgICAgICAgIGNvdW50ID0gZGIuZGVsZXRlKE5PVEVTX1RBQkxFX05BTUUsIE5vdGVDb2x1bW5zLl9JRCArICI9IiArIG5vdGVJZAotICAgICAgICAgICAgICAgICAgICArICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmUpID8gIiBBTkQgKCIgKyB3aGVyZSArICcpJyA6ICIiKSwgd2hlcmVBcmdzKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2VuZXJhbCBwYXR0ZXJuIGZvciBub3RlcywgZG9lcyBhIGRlbGV0ZQorICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGluY29taW5nICJ3aGVyZSIgY29sdW1ucyBhbmQgYXJndW1lbnRzLgorICAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZSgKKyAgICAgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgLy8gVGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgd2hlcmUsICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGluY29taW5nIHdoZXJlIGNsYXVzZSBjb2x1bW4gbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgd2hlcmVBcmdzICAgICAgICAgICAgICAgICAgLy8gVGhlIGluY29taW5nIHdoZXJlIGNsYXVzZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgYSBzaW5nbGUgbm90ZSBJRCwgZG9lcyB0aGUgZGVsZXRlIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICAgIC8vIGluY29taW5nIGRhdGEsIGJ1dCBtb2RpZmllcyB0aGUgd2hlcmUgY2xhdXNlIHRvIHJlc3RyaWN0IGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHBhcnRpY3VsYXIgbm90ZSBJRC4KKyAgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFN0YXJ0cyBhIGZpbmFsIFdIRVJFIGNsYXVzZSBieSByZXN0cmljdGluZyBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBkZXNpcmVkIG5vdGUgSUQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZmluYWxXaGVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIElEIGNvbHVtbiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAiID0gIiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCBmb3IgZXF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5nZXRQYXRoU2VnbWVudHMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5jb21pbmcgbm90ZSBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldChOb3RlUGFkLk5vdGVzLk5PVEVfSURfUEFUSF9QT1NJVElPTikKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGFkZGl0aW9uYWwgc2VsZWN0aW9uIGNyaXRlcmlhLCBhcHBlbmQgdGhlbSB0byB0aGUgZmluYWwKKyAgICAgICAgICAgICAgICAvLyBXSEVSRSBjbGF1c2UKKyAgICAgICAgICAgICAgICBpZiAod2hlcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbFdoZXJlID0gZmluYWxXaGVyZSArICIgQU5EICIgKyB3aGVyZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBQZXJmb3JtcyB0aGUgZGVsZXRlLgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsICAvLyBUaGUgZGF0YWJhc2UgdGFibGUgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgZmluYWxXaGVyZSwgICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsIFdIRVJFIGNsYXVzZQorICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3MgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgd2hlcmUgY2xhdXNlIHZhbHVlcy4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgcGF0dGVybiBpcyBpbnZhbGlkLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKICAgICAgICAgfQogCisgICAgICAgIC8qR2V0cyBhIGhhbmRsZSB0byB0aGUgY29udGVudCByZXNvbHZlciBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuZCBub3RpZmllcyBpdAorICAgICAgICAgKiB0aGF0IHRoZSBpbmNvbWluZyBVUkkgY2hhbmdlZC4gVGhlIG9iamVjdCBwYXNzZXMgdGhpcyBhbG9uZyB0byB0aGUgcmVzb2x2ZXIgZnJhbWV3b3JrLAorICAgICAgICAgKiBhbmQgb2JzZXJ2ZXJzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIHRoZW1zZWx2ZXMgZm9yIHRoZSBwcm92aWRlciBhcmUgbm90aWZpZWQuCisgICAgICAgICAqLwogICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKHVyaSwgbnVsbCk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZC4KICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciN1cGRhdGUoVXJpLENvbnRlbnRWYWx1ZXMsU3RyaW5nLFN0cmluZ1tdKX0KKyAgICAgKiBVcGRhdGVzIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlLiBUaGUgY29sdW1uIG5hbWVzIHNwZWNpZmllZCBieSB0aGUga2V5cyBpbiB0aGUgdmFsdWVzIG1hcAorICAgICAqIGFyZSB1cGRhdGVkIHdpdGggbmV3IGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZXMgaW4gdGhlIG1hcC4gSWYgdGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZQorICAgICAqIG5vdGUgSUQgVVJJIHBhdHRlcm4sIHRoZW4gdGhlIG1ldGhvZCB1cGRhdGVzIHRoZSBvbmUgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgSUQgaW4gdGhlIFVSSTsKKyAgICAgKiBvdGhlcndpc2UsIGl0IHVwZGF0ZXMgYSBzZXQgb2YgcmVjb3Jkcy4gVGhlIHJlY29yZCBvciByZWNvcmRzIG11c3QgbWF0Y2ggdGhlIGlucHV0CisgICAgICogc2VsZWN0aW9uIGNyaXRlcmlhIHNwZWNpZmllZCBieSB3aGVyZSBhbmQgd2hlcmVBcmdzLgorICAgICAqIElmIHJvd3Mgd2VyZSB1cGRhdGVkLCB0aGVuIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBwYXR0ZXJuIHRvIG1hdGNoIGFuZCB1cGRhdGUuCisgICAgICogQHBhcmFtIHZhbHVlcyBBIG1hcCBvZiBjb2x1bW4gbmFtZXMgKGtleXMpIGFuZCBuZXcgdmFsdWVzICh2YWx1ZXMpLgorICAgICAqIEBwYXJhbSB3aGVyZSBBbiBTUUwgIldIRVJFIiBjbGF1c2UgdGhhdCBzZWxlY3RzIHJlY29yZHMgYmFzZWQgb24gdGhlaXIgY29sdW1uIHZhbHVlcy4gSWYgdGhpcworICAgICAqIGlzIG51bGwsIHRoZW4gYWxsIHJlY29yZHMgdGhhdCBtYXRjaCB0aGUgVVJJIHBhdHRlcm4gYXJlIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSB3aGVyZUFyZ3MgQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGNyaXRlcmlhLiBJZiB0aGUgIndoZXJlIiBwYXJhbSBjb250YWlucyB2YWx1ZQorICAgICAqIHBsYWNlaG9sZGVycyAoIj8iKSwgdGhlbiBlYWNoIHBsYWNlaG9sZGVyIGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlCisgICAgICogYXJyYXkuCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvd3MgdXBkYXRlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHdoZXJlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKKworICAgICAgICAvLyBPcGVucyB0aGUgZGF0YWJhc2Ugb2JqZWN0IGluICJ3cml0ZSIgbW9kZS4KICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgU3RyaW5nIGZpbmFsV2hlcmU7CisKKyAgICAgICAgLy8gRG9lcyB0aGUgdXBkYXRlIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybgogICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKE5PVEVTX1RBQkxFX05BTUUsIHZhbHVlcywgd2hlcmUsIHdoZXJlQXJncyk7Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICBTdHJpbmcgbm90ZUlkID0gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKTsKLSAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKE5PVEVTX1RBQkxFX05BTUUsIHZhbHVlcywgTm90ZUNvbHVtbnMuX0lEICsgIj0iICsgbm90ZUlkCi0gICAgICAgICAgICAgICAgICAgICsgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZSkgPyAiIEFORCAoIiArIHdoZXJlICsgJyknIDogIiIpLCB3aGVyZUFyZ3MpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgdGhlIGdlbmVyYWwgbm90ZXMgcGF0dGVybiwgZG9lcyB0aGUgdXBkYXRlIGJhc2VkIG9uCisgICAgICAgICAgICAvLyB0aGUgaW5jb21pbmcgZGF0YS4KKyAgICAgICAgICAgIGNhc2UgTk9URVM6CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOworICAgICAgICAgICAgICAgIC8vIERvZXMgdGhlIHVwZGF0ZSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBjb3VudCA9IGRiLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAvLyBUaGUgZGF0YWJhc2UgdGFibGUgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCAgICAgICAgICAgICAgICAgICAvLyBBIG1hcCBvZiBjb2x1bW4gbmFtZXMgYW5kIG5ldyB2YWx1ZXMgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgICB3aGVyZSwgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3aGVyZSBjbGF1c2UgY29sdW1uIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3MgICAgICAgICAgICAgICAgIC8vIFRoZSB3aGVyZSBjbGF1c2UgY29sdW1uIHZhbHVlcyB0byBzZWxlY3Qgb24uCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBtYXRjaGVzIGEgc2luZ2xlIG5vdGUgSUQsIGRvZXMgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5jb21pbmcKKyAgICAgICAgICAgIC8vIGRhdGEsIGJ1dCBtb2RpZmllcyB0aGUgd2hlcmUgY2xhdXNlIHRvIHJlc3RyaWN0IGl0IHRvIHRoZSBwYXJ0aWN1bGFyIG5vdGUgSUQuCisgICAgICAgICAgICBjYXNlIE5PVEVfSUQ6CisgICAgICAgICAgICAgICAgLy8gRnJvbSB0aGUgaW5jb21pbmcgVVJJLCBnZXQgdGhlIG5vdGUgSUQKKyAgICAgICAgICAgICAgICBTdHJpbmcgbm90ZUlkID0gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldChOb3RlUGFkLk5vdGVzLk5PVEVfSURfUEFUSF9QT1NJVElPTik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFN0YXJ0cyBjcmVhdGluZyB0aGUgZmluYWwgV0hFUkUgY2xhdXNlIGJ5IHJlc3RyaWN0aW5nIGl0IHRvIHRoZSBpbmNvbWluZworICAgICAgICAgICAgICAgICAqIG5vdGUgSUQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZmluYWxXaGVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIElEIGNvbHVtbiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAiID0gIiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCBmb3IgZXF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5nZXRQYXRoU2VnbWVudHMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5jb21pbmcgbm90ZSBJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldChOb3RlUGFkLk5vdGVzLk5PVEVfSURfUEFUSF9QT1NJVElPTikKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIGFkZGl0aW9uYWwgc2VsZWN0aW9uIGNyaXRlcmlhLCBhcHBlbmQgdGhlbSB0byB0aGUgZmluYWwgV0hFUkUKKyAgICAgICAgICAgICAgICAvLyBjbGF1c2UKKyAgICAgICAgICAgICAgICBpZiAod2hlcmUgIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsV2hlcmUgPSBmaW5hbFdoZXJlICsgIiBBTkQgIiArIHdoZXJlOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgdXBkYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsICAgICAgICAgICAgICAgICAgIC8vIEEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgbmV3IHZhbHVlcyB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsV2hlcmUsICAgICAgICAgICAgICAgLy8gVGhlIGZpbmFsIFdIRVJFIGNsYXVzZSB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZWhvbGRlcnMgZm9yIHdoZXJlQXJncworICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3MgICAgICAgICAgICAgICAgIC8vIFRoZSB3aGVyZSBjbGF1c2UgY29sdW1uIHZhbHVlcyB0byBzZWxlY3Qgb24sIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCBpZiB0aGUgdmFsdWVzIGFyZSBpbiB0aGUgd2hlcmUgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBwYXR0ZXJuIGlzIGludmFsaWQsIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gVVJJICIgKyB1cmkpOwogICAgICAgICB9CiAKKyAgICAgICAgLypHZXRzIGEgaGFuZGxlIHRvIHRoZSBjb250ZW50IHJlc29sdmVyIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgY29udGV4dCwgYW5kIG5vdGlmaWVzIGl0CisgICAgICAgICAqIHRoYXQgdGhlIGluY29taW5nIFVSSSBjaGFuZ2VkLiBUaGUgb2JqZWN0IHBhc3NlcyB0aGlzIGFsb25nIHRvIHRoZSByZXNvbHZlciBmcmFtZXdvcmssCisgICAgICAgICAqIGFuZCBvYnNlcnZlcnMgdGhhdCBoYXZlIHJlZ2lzdGVyZWQgdGhlbXNlbHZlcyBmb3IgdGhlIHByb3ZpZGVyIGFyZSBub3RpZmllZC4KKyAgICAgICAgICovCiAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2UodXJpLCBudWxsKTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1VyaU1hdGNoZXIgPSBuZXcgVXJpTWF0Y2hlcihVcmlNYXRjaGVyLk5PX01BVENIKTsKLSAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMiLCBOT1RFUyk7Ci0gICAgICAgIHNVcmlNYXRjaGVyLmFkZFVSSShOb3RlUGFkLkFVVEhPUklUWSwgIm5vdGVzLyMiLCBOT1RFX0lEKTsKLSAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibGl2ZV9mb2xkZXJzL25vdGVzIiwgTElWRV9GT0xERVJfTk9URVMpOwotCi0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZUNvbHVtbnMuX0lELCBOb3RlQ29sdW1ucy5fSUQpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlQ29sdW1ucy5USVRMRSwgTm90ZUNvbHVtbnMuVElUTEUpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlQ29sdW1ucy5OT1RFLCBOb3RlQ29sdW1ucy5OT1RFKTsKLSAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZUNvbHVtbnMuQ1JFQVRFRF9EQVRFLCBOb3RlQ29sdW1ucy5DUkVBVEVEX0RBVEUpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFLCBOb3RlQ29sdW1ucy5NT0RJRklFRF9EQVRFKTsKLQotICAgICAgICAvLyBTdXBwb3J0IGZvciBMaXZlIEZvbGRlcnMuCi0gICAgICAgIHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLl9JRCwgTm90ZUNvbHVtbnMuX0lEICsgIiBBUyAiICsKLSAgICAgICAgICAgICAgICBMaXZlRm9sZGVycy5fSUQpOwotICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLk5BTUUsIE5vdGVDb2x1bW5zLlRJVExFICsgIiBBUyAiICsKLSAgICAgICAgICAgICAgICBMaXZlRm9sZGVycy5OQU1FKTsKLSAgICAgICAgLy8gQWRkIG1vcmUgY29sdW1ucyBoZXJlIGZvciBtb3JlIHJvYnVzdCBMaXZlIEZvbGRlcnMuCisgICAgLyoqCisgICAgICogQSB0ZXN0IHBhY2thZ2UgY2FuIGNhbGwgdGhpcyB0byBnZXQgYSBoYW5kbGUgdG8gdGhlIGRhdGFiYXNlIHVuZGVybHlpbmcgTm90ZVBhZFByb3ZpZGVyLAorICAgICAqIHNvIGl0IGNhbiBpbnNlcnQgdGVzdCBkYXRhIGludG8gdGhlIGRhdGFiYXNlLiBUaGUgdGVzdCBjYXNlIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIGluc3RhbnRpYXRpbmcgdGhlIHByb3ZpZGVyIGluIGEgdGVzdCBjb250ZXh0OyB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSBkb2VzCisgICAgICogdGhpcyBkdXJpbmcgdGhlIGNhbGwgdG8gc2V0VXAoKQorICAgICAqCisgICAgICogQHJldHVybiBhIGhhbmRsZSB0byB0aGUgZGF0YWJhc2UgaGVscGVyIG9iamVjdCBmb3IgdGhlIHByb3ZpZGVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBEYXRhYmFzZUhlbHBlciBnZXRPcGVuSGVscGVyRm9yVGVzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGVuSGVscGVyOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGlzdC5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEKaW5kZXggZWM4MDkwMi4uN2U5MWY2NCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEKQEAgLTE2LDkgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKQEAgLTM0LDYwICszOSwxMjMgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOwogCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQuTm90ZUNvbHVtbnM7Ci0KIC8qKgogICogRGlzcGxheXMgYSBsaXN0IG9mIG5vdGVzLiBXaWxsIGRpc3BsYXkgbm90ZXMgZnJvbSB0aGUge0BsaW5rIFVyaX0KLSAqIHByb3ZpZGVkIGluIHRoZSBpbnRlbnQgaWYgdGhlcmUgaXMgb25lLCBvdGhlcndpc2UgZGVmYXVsdHMgdG8gZGlzcGxheWluZyB0aGUKLSAqIGNvbnRlbnRzIG9mIHRoZSB7QGxpbmsgTm90ZVByb3ZpZGVyfQorICogcHJvdmlkZWQgaW4gdGhlIGluY29taW5nIEludGVudCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSBpdCBkZWZhdWx0cyB0byBkaXNwbGF5aW5nIHRoZQorICogY29udGVudHMgb2YgdGhlIHtAbGluayBOb3RlUGFkUHJvdmlkZXJ9LgorICoKKyAqIE5PVEU6IE5vdGljZSB0aGF0IHRoZSBwcm92aWRlciBvcGVyYXRpb25zIGluIHRoaXMgQWN0aXZpdHkgYXJlIHRha2luZyBwbGFjZSBvbiB0aGUgVUkgdGhyZWFkLgorICogVGhpcyBpcyBub3QgYSBnb29kIHByYWN0aWNlLiBJdCBpcyBvbmx5IGRvbmUgaGVyZSB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuIEEgcmVhbAorICogYXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Bc3luY1F1ZXJ5SGFuZGxlcn0gb3IKKyAqIHtAbGluayBhbmRyb2lkLm9zLkFzeW5jVGFza30gb2JqZWN0IHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBhc3luY2hyb25vdXNseSBvbiBhIHNlcGFyYXRlIHRocmVhZC4KICAqLwogcHVibGljIGNsYXNzIE5vdGVzTGlzdCBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICAvLyBGb3IgbG9nZ2luZyBhbmQgZGVidWdnaW5nCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOb3Rlc0xpc3QiOwogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbHVtbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4gZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgKiBUaGUgY29sdW1ucyBuZWVkZWQgYnkgdGhlIGN1cnNvciBhZGFwdGVyCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIE5vdGVDb2x1bW5zLl9JRCwgLy8gMAotICAgICAgICBOb3RlQ29sdW1ucy5USVRMRSwgLy8gMQorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIC8vIDEKICAgICB9OwogCiAgICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgdGl0bGUgY29sdW1uICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JTkRFWF9USVRMRSA9IDE7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBvbkNyZWF0ZSBpcyBjYWxsZWQgd2hlbiBBbmRyb2lkIHN0YXJ0cyB0aGlzIEFjdGl2aXR5IGZyb20gc2NyYXRjaC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKKyAgICAgICAgLy8gVGhlIHVzZXIgZG9lcyBub3QgbmVlZCB0byBob2xkIGRvd24gdGhlIGtleSB0byB1c2UgbWVudSBzaG9ydGN1dHMuCiAgICAgICAgIHNldERlZmF1bHRLZXlNb2RlKERFRkFVTFRfS0VZU19TSE9SVENVVCk7CiAKLSAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgZ2l2ZW4gaW4gdGhlIGludGVudCAoYmVjYXVzZSB3ZSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgLy8gYXMgYSBNQUlOIGFjdGl2aXR5KSwgdGhlbiB1c2Ugb3VyIGRlZmF1bHQgY29udGVudCBwcm92aWRlci4KKyAgICAgICAgLyogSWYgbm8gZGF0YSBpcyBnaXZlbiBpbiB0aGUgSW50ZW50IHRoYXQgc3RhcnRlZCB0aGlzIEFjdGl2aXR5LCB0aGVuIHRoaXMgQWN0aXZpdHkKKyAgICAgICAgICogd2FzIHN0YXJ0ZWQgd2hlbiB0aGUgaW50ZW50IGZpbHRlciBtYXRjaGVkIGEgTUFJTiBhY3Rpb24uIFdlIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQKKyAgICAgICAgICogcHJvdmlkZXIgVVJJLgorICAgICAgICAgKi8KKyAgICAgICAgLy8gR2V0cyB0aGUgaW50ZW50IHRoYXQgc3RhcnRlZCB0aGlzIEFjdGl2aXR5LgogICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEludGVudCwgc2V0cyB0aGUgZGF0YSB0byB0aGUgZGVmYXVsdCBVUkksIHdoaWNoCisgICAgICAgIC8vIGFjY2Vzc2VzIGEgbGlzdCBvZiBub3Rlcy4KICAgICAgICAgaWYgKGludGVudC5nZXREYXRhKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnNldERhdGEoTm90ZUNvbHVtbnMuQ09OVEVOVF9VUkkpOworICAgICAgICAgICAgaW50ZW50LnNldERhdGEoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJbmZvcm0gdGhlIGxpc3Qgd2UgcHJvdmlkZSBjb250ZXh0IG1lbnVzIGZvciBpdGVtcworICAgICAgICAvKgorICAgICAgICAgKiBTZXRzIHRoZSBjYWxsYmFjayBmb3IgY29udGV4dCBtZW51IGFjdGl2YXRpb24gZm9yIHRoZSBMaXN0Vmlldy4gVGhlIGxpc3RlbmVyIGlzIHNldAorICAgICAgICAgKiB0byBiZSB0aGlzIEFjdGl2aXR5LiBUaGUgZWZmZWN0IGlzIHRoYXQgY29udGV4dCBtZW51cyBhcmUgZW5hYmxlZCBmb3IgaXRlbXMgaW4gdGhlCisgICAgICAgICAqIExpc3RWaWV3LCBhbmQgdGhlIGNvbnRleHQgbWVudSBpcyBoYW5kbGVkIGJ5IGEgbWV0aG9kIGluIE5vdGVzTGlzdC4KKyAgICAgICAgICovCiAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgLy8gUGVyZm9ybSBhIG1hbmFnZWQgcXVlcnkuIFRoZSBBY3Rpdml0eSB3aWxsIGhhbmRsZSBjbG9zaW5nIGFuZCByZXF1ZXJ5aW5nIHRoZSBjdXJzb3IKLSAgICAgICAgLy8gd2hlbiBuZWVkZWQuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtYW5hZ2VkUXVlcnkoZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGVDb2x1bW5zLkRFRkFVTFRfU09SVF9PUkRFUik7CiAKLSAgICAgICAgLy8gVXNlZCB0byBtYXAgbm90ZXMgZW50cmllcyBmcm9tIHRoZSBkYXRhYmFzZSB0byB2aWV3cwotICAgICAgICBTaW1wbGVDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLCBSLmxheW91dC5ub3Rlc2xpc3RfaXRlbSwgY3Vyc29yLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE5vdGVDb2x1bW5zLlRJVExFIH0sIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSB9KTsKKyAgICAgICAgLyogUGVyZm9ybXMgYSBtYW5hZ2VkIHF1ZXJ5LiBUaGUgQWN0aXZpdHkgaGFuZGxlcyBjbG9zaW5nIGFuZCByZXF1ZXJ5aW5nIHRoZSBjdXJzb3IKKyAgICAgICAgICogd2hlbiBuZWVkZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFBsZWFzZSBzZWUgdGhlIGludHJvZHVjdG9yeSBub3RlIGFib3V0IHBlcmZvcm1pbmcgcHJvdmlkZXIgb3BlcmF0aW9ucyBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1hbmFnZWRRdWVyeSgKKyAgICAgICAgICAgIGdldEludGVudCgpLmdldERhdGEoKSwgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgY29udGVudCBVUkkgZm9yIHRoZSBwcm92aWRlci4KKyAgICAgICAgICAgIFBST0pFQ1RJT04sICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5vdGUgSUQgYW5kIHRpdGxlIGZvciBlYWNoIG5vdGUuCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gd2hlcmUgY2xhdXNlLCByZXR1cm4gYWxsIHJlY29yZHMuCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gd2hlcmUgY2xhdXNlLCB0aGVyZWZvcmUgbm8gd2hlcmUgY29sdW1uIHZhbHVlcy4KKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuREVGQVVMVF9TT1JUX09SREVSICAvLyBVc2UgdGhlIGRlZmF1bHQgc29ydCBvcmRlci4KKyAgICAgICAgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBhcnJheXMgY3JlYXRlIGEgIm1hcCIgYmV0d2VlbiBjb2x1bW5zIGluIHRoZSBjdXJzb3IgYW5kIHZpZXcgSURzCisgICAgICAgICAqIGZvciBpdGVtcyBpbiB0aGUgTGlzdFZpZXcuIEVhY2ggZWxlbWVudCBpbiB0aGUgZGF0YUNvbHVtbnMgYXJyYXkgcmVwcmVzZW50cworICAgICAgICAgKiBhIGNvbHVtbiBuYW1lOyBlYWNoIGVsZW1lbnQgaW4gdGhlIHZpZXdJRCBhcnJheSByZXByZXNlbnRzIHRoZSBJRCBvZiBhIFZpZXcuCisgICAgICAgICAqIFRoZSBTaW1wbGVDdXJzb3JBZGFwdGVyIG1hcHMgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIGVhY2ggY29sdW1uCisgICAgICAgICAqIHZhbHVlIHdpbGwgYXBwZWFyIGluIHRoZSBMaXN0Vmlldy4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gVGhlIG5hbWVzIG9mIHRoZSBjdXJzb3IgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSB2aWV3LCBpbml0aWFsaXplZCB0byB0aGUgdGl0bGUgY29sdW1uCisgICAgICAgIFN0cmluZ1tdIGRhdGFDb2x1bW5zID0geyBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFIH0gOworCisgICAgICAgIC8vIFRoZSB2aWV3IElEcyB0aGF0IHdpbGwgZGlzcGxheSB0aGUgY3Vyc29yIGNvbHVtbnMsIGluaXRpYWxpemVkIHRvIHRoZSBUZXh0VmlldyBpbgorICAgICAgICAvLyBub3Rlc2xpc3RfaXRlbS54bWwKKyAgICAgICAgaW50W10gdmlld0lEcyA9IHsgYW5kcm9pZC5SLmlkLnRleHQxIH07CisKKyAgICAgICAgLy8gQ3JlYXRlcyB0aGUgYmFja2luZyBhZGFwdGVyIGZvciB0aGUgTGlzdFZpZXcuCisgICAgICAgIFNpbXBsZUN1cnNvckFkYXB0ZXIgYWRhcHRlcgorICAgICAgICAgICAgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcigKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIENvbnRleHQgZm9yIHRoZSBMaXN0VmlldworICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm5vdGVzbGlzdF9pdGVtLCAgICAgICAgICAvLyBQb2ludHMgdG8gdGhlIFhNTCBmb3IgYSBsaXN0IGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnNvciB0byBnZXQgaXRlbXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgIGRhdGFDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgIHZpZXdJRHMKKyAgICAgICAgICAgICAgKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBMaXN0VmlldydzIGFkYXB0ZXIgdG8gYmUgdGhlIGN1cnNvciBhZGFwdGVyIHRoYXQgd2FzIGp1c3QgY3JlYXRlZC4KICAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBkZXZpY2UncyBNZW51IGJ1dHRvbiB0aGUgZmlyc3QgdGltZSBmb3IKKyAgICAgKiB0aGlzIEFjdGl2aXR5LiBBbmRyb2lkIHBhc3NlcyBpbiBhIE1lbnUgb2JqZWN0IHRoYXQgaXMgcG9wdWxhdGVkIHdpdGggaXRlbXMuCisgICAgICoKKyAgICAgKiBTZXRzIHVwIGEgbWVudSB0aGF0IHByb3ZpZGVzIHRoZSBJbnNlcnQgb3B0aW9uIHBsdXMgYSBsaXN0IG9mIGFsdGVybmF0aXZlIGFjdGlvbnMgZm9yCisgICAgICogdGhpcyBBY3Rpdml0eS4gT3RoZXIgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBoYW5kbGUgbm90ZXMgY2FuICJyZWdpc3RlciIgdGhlbXNlbHZlcyBpbgorICAgICAqIEFuZHJvaWQgYnkgcHJvdmlkaW5nIGFuIGludGVudCBmaWx0ZXIgdGhhdCBpbmNsdWRlcyB0aGUgY2F0ZWdvcnkgQUxURVJOQVRJVkUgYW5kIHRoZQorICAgICAqIG1pbWVUWXBlIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFLiBJZiB0aGV5IGRvIHRoaXMsIHRoZSBjb2RlIGluIG9uQ3JlYXRlT3B0aW9uc01lbnUoKQorICAgICAqIHdpbGwgYWRkIHRoZSBBY3Rpdml0eSB0aGF0IGNvbnRhaW5zIHRoZSBpbnRlbnQgZmlsdGVyIHRvIGl0cyBsaXN0IG9mIG9wdGlvbnMuIEluIGVmZmVjdCwKKyAgICAgKiB0aGUgbWVudSB3aWxsIG9mZmVyIHRoZSB1c2VyIG90aGVyIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBoYW5kbGUgbm90ZXMuCisgICAgICogQHBhcmFtIG1lbnUgQSBNZW51IG9iamVjdCwgdG8gd2hpY2ggbWVudSBpdGVtcyBzaG91bGQgYmUgYWRkZWQuCisgICAgICogQHJldHVybiBUcnVlLCBhbHdheXMuIFRoZSBtZW51IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKICAgICAgICAgLy8gSW5mbGF0ZSBtZW51IGZyb20gWE1MIHJlc291cmNlCiAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOwogICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5saXN0X29wdGlvbnNfbWVudSwgbWVudSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIEdlbmVyYXRlIGFueSBhZGRpdGlvbmFsIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZQogICAgICAgICAvLyBvdmVyYWxsIGxpc3QuICBJbiBhIG5vcm1hbCBpbnN0YWxsLCB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbAogICAgICAgICAvLyBhY3Rpb25zIGZvdW5kIGhlcmUsIGJ1dCB0aGlzIGFsbG93cyBvdGhlciBhcHBsaWNhdGlvbnMgdG8gZXh0ZW5kCkBAIC0xMDEsMjggKzE2OSwxNjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgc3VwZXIub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisKKyAgICAgICAgLy8gVGhlIHBhc3RlIG1lbnUgaXRlbSBpcyBlbmFibGVkIGlmIHRoZXJlIGlzIGRhdGEgb24gdGhlIGNsaXBib2FyZC4KKyAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcikKKyAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworCisKKyAgICAgICAgTWVudUl0ZW0gbVBhc3RlSXRlbSA9IG1lbnUuZmluZEl0ZW0oUi5pZC5tZW51X3Bhc3RlKTsKKworICAgICAgICAvLyBJZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIGFuIGl0ZW0sIGVuYWJsZXMgdGhlIFBhc3RlIG9wdGlvbiBvbiB0aGUgbWVudS4KKyAgICAgICAgaWYgKGNsaXBib2FyZC5oYXNQcmltYXJ5Q2xpcCgpKSB7CisgICAgICAgICAgICBtUGFzdGVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2xpcGJvYXJkIGlzIGVtcHR5LCBkaXNhYmxlcyB0aGUgbWVudSdzIFBhc3RlIG9wdGlvbi4KKyAgICAgICAgICAgIG1QYXN0ZUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygbm90ZXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZC4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXZlSXRlbXMgPSBnZXRMaXN0QWRhcHRlcigpLmdldENvdW50KCkgPiAwOworCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm90ZXMgaW4gdGhlIGxpc3QgKHdoaWNoIGltcGxpZXMgdGhhdCBvbmUgb2YKKyAgICAgICAgLy8gdGhlbSBpcyBzZWxlY3RlZCksIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgYWN0aW9ucyB0aGF0CisgICAgICAgIC8vIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgVGhpcyB3aWxsIGJlIGEgY29tYmluYXRpb24KKyAgICAgICAgLy8gb2Ygb3VyIG93biBzcGVjaWZpYyBhY3Rpb25zIGFsb25nIHdpdGggYW55IGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUKKyAgICAgICAgLy8gZm91bmQuCisgICAgICAgIGlmIChoYXZlSXRlbXMpIHsKKworICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgICAgICAgIFVyaSB1cmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChnZXRJbnRlbnQoKS5nZXREYXRhKCksIGdldFNlbGVjdGVkSXRlbUlkKCkpOworCisgICAgICAgICAgICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIEludGVudHMgd2l0aCBvbmUgZWxlbWVudC4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2VuZCBhbiBJbnRlbnQKKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBtZW51IGl0ZW0uCisgICAgICAgICAgICBJbnRlbnRbXSBzcGVjaWZpY3MgPSBuZXcgSW50ZW50WzFdOworCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBJbnRlbnQgaW4gdGhlIGFycmF5IHRvIGJlIGFuIEVESVQgYWN0aW9uIG9uIHRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIG5vdGUuCisgICAgICAgICAgICBzcGVjaWZpY3NbMF0gPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fRURJVCwgdXJpKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhbiBhcnJheSBvZiBtZW51IGl0ZW1zIHdpdGggb25lIGVsZW1lbnQuIFRoaXMgd2lsbCBjb250YWluIHRoZSBFRElUIG9wdGlvbi4KKyAgICAgICAgICAgIE1lbnVJdGVtW10gaXRlbXMgPSBuZXcgTWVudUl0ZW1bMV07CisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYW4gSW50ZW50IHdpdGggbm8gc3BlY2lmaWMgYWN0aW9uLCB1c2luZyB0aGUgVVJJIG9mIHRoZSBzZWxlY3RlZCBub3RlLgorICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobnVsbCwgdXJpKTsKKworICAgICAgICAgICAgLyogQWRkcyB0aGUgY2F0ZWdvcnkgQUxURVJOQVRJVkUgdG8gdGhlIEludGVudCwgd2l0aCB0aGUgbm90ZSBJRCBVUkkgYXMgaXRzCisgICAgICAgICAgICAgKiBkYXRhLiBUaGlzIHByZXBhcmVzIHRoZSBJbnRlbnQgYXMgYSBwbGFjZSB0byBncm91cCBhbHRlcm5hdGl2ZSBvcHRpb25zIGluIHRoZQorICAgICAgICAgICAgICogbWVudS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBZGQgYWx0ZXJuYXRpdmVzIHRvIHRoZSBtZW51CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucygKKyAgICAgICAgICAgICAgICBNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAgLy8gQWRkIHRoZSBJbnRlbnRzIGFzIG9wdGlvbnMgaW4gdGhlIGFsdGVybmF0aXZlcyBncm91cC4KKyAgICAgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgICAgLy8gQSB1bmlxdWUgaXRlbSBJRCBpcyBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIFRoZSBhbHRlcm5hdGl2ZXMgZG9uJ3QgbmVlZCB0byBiZSBpbiBvcmRlci4KKyAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGxlcidzIG5hbWUgaXMgbm90IGV4Y2x1ZGVkIGZyb20gdGhlIGdyb3VwLgorICAgICAgICAgICAgICAgIHNwZWNpZmljcywgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzcGVjaWZpYyBvcHRpb25zIG11c3QgYXBwZWFyIGZpcnN0LgorICAgICAgICAgICAgICAgIGludGVudCwgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBJbnRlbnQgb2JqZWN0cyBtYXAgdG8gdGhlIG9wdGlvbnMgaW4gc3BlY2lmaWNzLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBObyBmbGFncyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtZW51IGl0ZW1zIGdlbmVyYXRlZCBmcm9tIHRoZSBzcGVjaWZpY3MtdG8tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVudHMgbWFwcGluZworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgRWRpdCBtZW51IGl0ZW0gZXhpc3RzLCBhZGRzIHNob3J0Y3V0cyBmb3IgaXQuCisgICAgICAgICAgICAgICAgaWYgKGl0ZW1zWzBdICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBFZGl0IG1lbnUgaXRlbSBzaG9ydGN1dCB0byBudW1lcmljICIxIiwgbGV0dGVyICJlIgorICAgICAgICAgICAgICAgICAgICBpdGVtc1swXS5zZXRTaG9ydGN1dCgnMScsICdlJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcmVtb3ZlcyBhbnkgZXhpc3RpbmcgYWx0ZXJuYXRpdmUgYWN0aW9ucyBmcm9tIHRoZSBtZW51CisgICAgICAgICAgICAgICAgbWVudS5yZW1vdmVHcm91cChNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBEaXNwbGF5cyB0aGUgbWVudQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBtZW51LCBidXQgbm8gaXRlbQorICAgICAqIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLiBJZiB0aGUgb3B0aW9uIHdhcyBJTlNFUlQsIHRoZW4gYSBuZXcgSW50ZW50IGlzIHNlbnQgb3V0IHdpdGggYWN0aW9uCisgICAgICogQUNUSU9OX0lOU0VSVC4gVGhlIGRhdGEgZnJvbSB0aGUgaW5jb21pbmcgSW50ZW50IGlzIHB1dCBpbnRvIHRoZSBuZXcgSW50ZW50LiBJbiBlZmZlY3QsCisgICAgICogdGhpcyB0cmlnZ2VycyB0aGUgTm90ZUVkaXRvciBhY3Rpdml0eSBpbiB0aGUgTm90ZVBhZCBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBpdGVtIHdhcyBub3QgSU5TRVJULCB0aGVuIG1vc3QgbGlrZWx5IGl0IHdhcyBhbiBhbHRlcm5hdGl2ZSBvcHRpb24gZnJvbSBhbm90aGVyCisgICAgICogYXBwbGljYXRpb24uIFRoZSBwYXJlbnQgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBpdGVtLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIKKyAgICAgKiBAcmV0dXJuIFRydWUsIGlmIHRoZSBJTlNFUlQgbWVudSBpdGVtIHdhcyBzZWxlY3RlZDsgb3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKKyAgICAgKiB0aGUgcGFyZW50IG1ldGhvZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgewogICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKICAgICAgICAgY2FzZSBSLmlkLm1lbnVfYWRkOgotICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHRvIGluc2VydCBhIG5ldyBpdGVtCi0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9JTlNFUlQsIGdldEludGVudCgpLmdldERhdGEoKSkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMYXVuY2hlcyBhIG5ldyBBY3Rpdml0eSB1c2luZyBhbiBJbnRlbnQuIFRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGUgQWN0aXZpdHkKKyAgICAgICAgICAgKiBoYXMgdG8gaGF2ZSBhY3Rpb24gQUNUSU9OX0lOU0VSVC4gTm8gY2F0ZWdvcnkgaXMgc2V0LCBzbyBERUZBVUxUIGlzIGFzc3VtZWQuCisgICAgICAgICAgICogSW4gZWZmZWN0LCB0aGlzIHN0YXJ0cyB0aGUgTm90ZUVkaXRvciBBY3Rpdml0eSBpbiBOb3RlUGFkLgorICAgICAgICAgICAqLworICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9JTlNFUlQsIGdldEludGVudCgpLmdldERhdGEoKSkpOworICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBSLmlkLm1lbnVfcGFzdGU6CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMYXVuY2hlcyBhIG5ldyBBY3Rpdml0eSB1c2luZyBhbiBJbnRlbnQuIFRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGUgQWN0aXZpdHkKKyAgICAgICAgICAgKiBoYXMgdG8gaGF2ZSBhY3Rpb24gQUNUSU9OX1BBU1RFLiBObyBjYXRlZ29yeSBpcyBzZXQsIHNvIERFRkFVTFQgaXMgYXNzdW1lZC4KKyAgICAgICAgICAgKiBJbiBlZmZlY3QsIHRoaXMgc3RhcnRzIHRoZSBOb3RlRWRpdG9yIEFjdGl2aXR5IGluIE5vdGVQYWQuCisgICAgICAgICAgICovCisgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fUEFTVEUsIGdldEludGVudCgpLmdldERhdGEoKSkpOworICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNvbnRleHQtY2xpY2tzIGEgbm90ZSBpbiB0aGUgbGlzdC4gTm90ZXNMaXN0IHJlZ2lzdGVycworICAgICAqIGl0c2VsZiBhcyB0aGUgaGFuZGxlciBmb3IgY29udGV4dCBtZW51cyBpbiBpdHMgTGlzdFZpZXcgKHRoaXMgaXMgZG9uZSBpbiBvbkNyZWF0ZSgpKS4KKyAgICAgKgorICAgICAqIFRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb25zIGFyZSBDT1BZIGFuZCBERUxFVEUuCisgICAgICoKKyAgICAgKiBDb250ZXh0LWNsaWNrIGlzIGVxdWl2YWxlbnQgdG8gbG9uZy1wcmVzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IEEgQ29udGV4TWVudSBvYmplY3QgdG8gd2hpY2ggaXRlbXMgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IGZvciB3aGljaCB0aGUgY29udGV4dCBtZW51IGlzIGJlaW5nIGNvbnN0cnVjdGVkLgorICAgICAqIEBwYXJhbSBtZW51SW5mbyBEYXRhIGFzc29jaWF0ZWQgd2l0aCB2aWV3LgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHZpZXcsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworCisgICAgICAgIC8vIFRoZSBkYXRhIGZyb20gdGhlIG1lbnUgaXRlbS4KICAgICAgICAgQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbyBpbmZvOworCisgICAgICAgIC8vIFRyaWVzIHRvIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIExpc3RWaWV3IHRoYXQgd2FzIGxvbmctcHJlc3NlZC4KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOworICAgICAgICAgICAgLy8gQ2FzdHMgdGhlIGluY29taW5nIGRhdGEgb2JqZWN0IGludG8gdGhlIHR5cGUgZm9yIEFkYXB0ZXJWaWV3IG9iamVjdHMuCisgICAgICAgICAgICBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIG1lbnUgb2JqZWN0IGNhbid0IGJlIGNhc3QsIGxvZ3MgYW4gZXJyb3IuCiAgICAgICAgICAgICBMb2cuZShUQUcsICJiYWQgbWVudUluZm8iLCBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtIGF0IHRoZSBzZWxlY3RlZCBwb3NpdGlvbi4gZ2V0SXRlbSgpIHJldHVybnMKKyAgICAgICAgICogd2hhdGV2ZXIgdGhlIGJhY2tpbmcgYWRhcHRlciBvZiB0aGUgTGlzdFZpZXcgaGFzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbS4gSW4gTm90ZXNMaXN0LAorICAgICAgICAgKiB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIGFsbCBvZiB0aGUgZGF0YSBmb3IgYSBub3RlIHdpdGggaXRzIGxpc3QgaXRlbS4gQXMgYSByZXN1bHQsCisgICAgICAgICAqIGdldEl0ZW0oKSByZXR1cm5zIHRoYXQgZGF0YSBhcyBhIEN1cnNvci4KKyAgICAgICAgICovCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSAoQ3Vyc29yKSBnZXRMaXN0QWRhcHRlcigpLmdldEl0ZW0oaW5mby5wb3NpdGlvbik7CisKKyAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBlbXB0eSwgdGhlbiBmb3Igc29tZSByZWFzb24gdGhlIGFkYXB0ZXIgY2FuJ3QgZ2V0IHRoZSBkYXRhIGZyb20gdGhlCisgICAgICAgIC8vIHByb3ZpZGVyLCBzbyByZXR1cm5zIG51bGwgdG8gdGhlIGNhbGxlci4KICAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24gdGhlIHJlcXVlc3RlZCBpdGVtIGlzbid0IGF2YWlsYWJsZSwgZG8gbm90aGluZwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTMxLDEwICszMzEsMTAgQEAKICAgICAgICAgLy8gSW5mbGF0ZSBtZW51IGZyb20gWE1MIHJlc291cmNlCiAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOwogICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5saXN0X2NvbnRleHRfbWVudSwgbWVudSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdGhlIGNvbnRleHQgbWVudSBoZWFkZXIKKworICAgICAgICAvLyBTZXRzIHRoZSBtZW51IGhlYWRlciB0byBiZSB0aGUgdGl0bGUgb2YgdGhlIHNlbGVjdGVkIG5vdGUuCiAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY3Vyc29yLmdldFN0cmluZyhDT0xVTU5fSU5ERVhfVElUTEUpKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZQogICAgICAgICAvLyBtZW51IGl0ZW1zIGZvciBhbnkgb3RoZXIgYWN0aXZpdGllcyB0aGF0IGNhbiBkbyBzdHVmZiB3aXRoIGl0CiAgICAgICAgIC8vIGFzIHdlbGwuICBUaGlzIGRvZXMgYSBxdWVyeSBvbiB0aGUgc3lzdGVtIGZvciBhbnkgYWN0aXZpdGllcyB0aGF0CkBAIC0xNDYsNDUgKzM0NiwxMjIgQEAKICAgICAgICAgbWVudS5hZGRJbnRlbnRPcHRpb25zKE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsIDAsIDAsCiAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUodGhpcywgTm90ZXNMaXN0LmNsYXNzKSwgbnVsbCwgaW50ZW50LCAwLCBudWxsKTsKICAgICB9Ci0gICAgICAgIAorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGNvbnRleHQgbWVudQorICAgICAqIChzZWUgb25DcmVhdGVDb250ZXh0TWVudSgpKS4gVGhlIG9ubHkgbWVudSBpdGVtcyB0aGF0IGFyZSBhY3R1YWxseSBoYW5kbGVkIGFyZSBERUxFVEUgYW5kCisgICAgICogQ09QWS4gQW55dGhpbmcgZWxzZSBpcyBhbiBhbHRlcm5hdGl2ZSBvcHRpb24sIGZvciB3aGljaCBkZWZhdWx0IGhhbmRsaW5nIHNob3VsZCBiZSBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIHNlbGVjdGVkIG1lbnUgaXRlbQorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVudSBpdGVtIHdhcyBERUxFVEUsIGFuZCBubyBkZWZhdWx0IHByb2Nlc3NpbmcgaXMgbmVlZCwgb3RoZXJ3aXNlIGZhbHNlLAorICAgICAqIHdoaWNoIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGhhbmRsaW5nIG9mIHRoZSBpdGVtLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgLy8gVGhlIGRhdGEgZnJvbSB0aGUgbWVudSBpdGVtLgogICAgICAgICBBZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvIGluZm87CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgZXh0cmEgaW5mbyBmcm9tIHRoZSBtZW51IGl0ZW0uIFdoZW4gYW4gbm90ZSBpbiB0aGUgTm90ZXMgbGlzdCBpcyBsb25nLXByZXNzZWQsIGEKKyAgICAgICAgICogY29udGV4dCBtZW51IGFwcGVhcnMuIFRoZSBtZW51IGl0ZW1zIGZvciB0aGUgbWVudSBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZGF0YQorICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5vdGUgdGhhdCB3YXMgbG9uZy1wcmVzc2VkLiBUaGUgZGF0YSBjb21lcyBmcm9tIHRoZSBwcm92aWRlciB0aGF0CisgICAgICAgICAqIGJhY2tzIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbm90ZSdzIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb250ZXh0IG1lbnUgY3JlYXRpb24gcm91dGluZSBpbiBhIENvbnRleHRNZW51SW5mbworICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gb25lIG9mIHRoZSBjb250ZXh0IG1lbnUgaXRlbXMgaXMgY2xpY2tlZCwgdGhlIHNhbWUgZGF0YSBpcyBwYXNzZWQsIGFsb25nIHdpdGggdGhlCisgICAgICAgICAqIG5vdGUgSUQsIHRvIG9uQ29udGV4dEl0ZW1TZWxlY3RlZCgpIHZpYSB0aGUgaXRlbSBwYXJhbWV0ZXIuCisgICAgICAgICAqLwogICAgICAgICB0cnkgewotICAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgaXRlbS5nZXRNZW51SW5mbygpOworICAgICAgICAgICAgLy8gQ2FzdHMgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSBpdGVtIGludG8gdGhlIHR5cGUgZm9yIEFkYXB0ZXJWaWV3IG9iamVjdHMuCisgICAgICAgICAgICBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pIGl0ZW0uZ2V0TWVudUluZm8oKTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBjYW4ndCBiZSBjYXN0LCBsb2dzIGFuIGVycm9yCiAgICAgICAgICAgICBMb2cuZShUQUcsICJiYWQgbWVudUluZm8iLCBlKTsKKworICAgICAgICAgICAgLy8gVHJpZ2dlcnMgZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBtZW51IGl0ZW0uCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIC8vIEFwcGVuZHMgdGhlIHNlbGVjdGVkIG5vdGUncyBJRCB0byB0aGUgVVJJIHNlbnQgd2l0aCB0aGUgaW5jb21pbmcgSW50ZW50LgogICAgICAgICBVcmkgbm90ZVVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgaW5mby5pZCk7CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgbWVudSBpdGVtJ3MgSUQgYW5kIGNvbXBhcmVzIGl0IHRvIGtub3duIGFjdGlvbnMuCisgICAgICAgICAqLwogICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKICAgICAgICAgY2FzZSBSLmlkLmNvbnRleHRfb3BlbjoKICAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byB2aWV3L2VkaXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtCiAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBub3RlVXJpKSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vQkVHSU5fSU5DTFVERShjb3B5KQorICAgICAgICBjYXNlIFIuaWQuY29udGV4dF9jb3B5OgorICAgICAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgY2xpcGJvYXJkIHNlcnZpY2UuCisgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKQorICAgICAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworICAKKyAgICAgICAgICAgIC8vIENvcGllcyB0aGUgbm90ZXMgVVJJIHRvIHRoZSBjbGlwYm9hcmQuIEluIGVmZmVjdCwgdGhpcyBjb3BpZXMgdGhlIG5vdGUgaXRzZWxmCisgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3VXJpKCAgIC8vIG5ldyBjbGlwYm9hcmQgaXRlbSBob2xkaW5nIGEgVVJJCisgICAgICAgICAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLCAgICAgICAgICAgICAgIC8vIHJlc29sdmVyIHRvIHJldHJpZXZlIFVSSSBpbmZvCisgICAgICAgICAgICAgICAgICAgICJOb3RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhYmVsIGZvciB0aGUgY2xpcAorICAgICAgICAgICAgICAgICAgICBub3RlVXJpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgVVJJCisgICAgICAgICAgICApOworICAKKyAgICAgICAgICAgIC8vIFJldHVybnMgdG8gdGhlIGNhbGxlciBhbmQgc2tpcHMgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisvL0VORF9JTkNMVURFKGNvcHkpCiAgICAgICAgIGNhc2UgUi5pZC5jb250ZXh0X2RlbGV0ZToKLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgbm90ZSB0aGF0IHRoZSBjb250ZXh0IG1lbnUgaXMgZm9yCi0gICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS5kZWxldGUobm90ZVVyaSwgbnVsbCwgbnVsbCk7CisgIAorICAgICAgICAgICAgLy8gRGVsZXRlcyB0aGUgbm90ZSBmcm9tIHRoZSBwcm92aWRlciBieSBwYXNzaW5nIGluIGEgVVJJIGluIG5vdGUgSUQgZm9ybWF0LgorICAgICAgICAgICAgLy8gUGxlYXNlIHNlZSB0aGUgaW50cm9kdWN0b3J5IG5vdGUgYWJvdXQgcGVyZm9ybWluZyBwcm92aWRlciBvcGVyYXRpb25zIG9uIHRoZQorICAgICAgICAgICAgLy8gVUkgdGhyZWFkLgorICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKAorICAgICAgICAgICAgICAgIG5vdGVVcmksICAvLyBUaGUgVVJJIG9mIHRoZSBwcm92aWRlcgorICAgICAgICAgICAgICAgIG51bGwsICAgICAvLyBObyB3aGVyZSBjbGF1c2UgaXMgbmVlZGVkLCBzaW5jZSBvbmx5IGEgc2luZ2xlIG5vdGUgSUQgaXMgYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkIGluLgorICAgICAgICAgICAgICAgIG51bGwgICAgICAvLyBObyB3aGVyZSBjbGF1c2UgaXMgdXNlZCwgc28gbm8gd2hlcmUgYXJndW1lbnRzIGFyZSBuZWVkZWQuCisgICAgICAgICAgICApOworICAKKyAgICAgICAgICAgIC8vIFJldHVybnMgdG8gdGhlIGNhbGxlciBhbmQgc2tpcHMgZnVydGhlciBwcm9jZXNzaW5nLgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgbm90ZSBpbiB0aGUgZGlzcGxheWVkIGxpc3QuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGluY29taW5nIGFjdGlvbnMgb2YgZWl0aGVyIFBJQ0sgKGdldCBkYXRhIGZyb20gdGhlIHByb3ZpZGVyKSBvcgorICAgICAqIEdFVF9DT05URU5UIChnZXQgb3IgY3JlYXRlIGRhdGEpLiBJZiB0aGUgaW5jb21pbmcgYWN0aW9uIGlzIEVESVQsIHRoaXMgbWV0aG9kIHNlbmRzIGEKKyAgICAgKiBuZXcgSW50ZW50IHRvIHN0YXJ0IE5vdGVFZGl0b3IuCisgICAgICogQHBhcmFtIGwgVGhlIExpc3RWaWV3IHRoYXQgY29udGFpbnMgdGhlIGNsaWNrZWQgaXRlbQorICAgICAqIEBwYXJhbSB2IFRoZSBWaWV3IG9mIHRoZSBpbmRpdmlkdWFsIGl0ZW0KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHYgaW4gdGhlIGRpc3BsYXllZCBsaXN0CisgICAgICogQHBhcmFtIGlkIFRoZSByb3cgSUQgb2YgdGhlIGNsaWNrZWQgaXRlbQorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICBVcmkgbm90ZVVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgaWQpOwotICAgICAgICAKKworICAgICAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IFVSSSBmcm9tIHRoZSBpbmNvbWluZyBVUkkgYW5kIHRoZSByb3cgSUQKKyAgICAgICAgVXJpIHVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgaWQpOworCisgICAgICAgIC8vIEdldHMgdGhlIGFjdGlvbiBmcm9tIHRoZSBpbmNvbWluZyBJbnRlbnQKICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGdldEludGVudCgpLmdldEFjdGlvbigpOworCisgICAgICAgIC8vIEhhbmRsZXMgcmVxdWVzdHMgZm9yIG5vdGUgZGF0YQogICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QSUNLLmVxdWFscyhhY3Rpb24pIHx8IEludGVudC5BQ1RJT05fR0VUX0NPTlRFTlQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjYWxsZXIgaXMgd2FpdGluZyBmb3IgdXMgdG8gcmV0dXJuIGEgbm90ZSBzZWxlY3RlZCBieQotICAgICAgICAgICAgLy8gdGhlIHVzZXIuICBUaGUgaGF2ZSBjbGlja2VkIG9uIG9uZSwgc28gcmV0dXJuIGl0IG5vdy4KLSAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0ssIG5ldyBJbnRlbnQoKS5zZXREYXRhKG5vdGVVcmkpKTsKKworICAgICAgICAgICAgLy8gU2V0cyB0aGUgcmVzdWx0IHRvIHJldHVybiB0byB0aGUgY29tcG9uZW50IHRoYXQgY2FsbGVkIHRoaXMgQWN0aXZpdHkuIFRoZQorICAgICAgICAgICAgLy8gcmVzdWx0IGNvbnRhaW5zIHRoZSBuZXcgVVJJCisgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LLCBuZXcgSW50ZW50KCkuc2V0RGF0YSh1cmkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byB2aWV3L2VkaXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBub3RlVXJpKSk7CisKKyAgICAgICAgICAgIC8vIFNlbmRzIG91dCBhbiBJbnRlbnQgdG8gc3RhcnQgYW4gQWN0aXZpdHkgdGhhdCBjYW4gaGFuZGxlIEFDVElPTl9FRElULiBUaGUKKyAgICAgICAgICAgIC8vIEludGVudCdzIGRhdGEgaXMgdGhlIG5vdGUgSUQgVVJJLiBUaGUgZWZmZWN0IGlzIHRvIGNhbGwgTm90ZUVkaXQuCisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCB1cmkpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGl2ZUZvbGRlci5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXZlRm9sZGVyLmphdmEKaW5kZXggMDBlYjMxNC4uMjRhZmFhMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXZlRm9sZGVyLmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXZlRm9sZGVyLmphdmEKQEAgLTE2LDUwICsxNiw5OCBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZDsKIAoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC5Ob3RlUGFkOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudC5TaG9ydGN1dEljb25SZXNvdXJjZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkxpdmVGb2xkZXJzOwogCisvKioKKyAqIFRoaXMgQWN0aXZpdHkgY3JlYXRlcyBhIGxpdmUgZm9sZGVyIEludGVudCBhbmQKKyAqIHNlbmRzIGl0IGJhY2sgdG8gSE9NRS4gRnJvbSB0aGUgZGF0YSBpbiB0aGUgSW50ZW50LCBIT01FIGNyZWF0ZXMgYSBsaXZlIGZvbGRlciBhbmQgZGlzcGxheXMKKyAqIGl0cyBpY29uIGluIHRoZSBIb21lIHZpZXcuCisgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgaWNvbiwgSG9tZSB1c2VzIHRoZSBkYXRhIGl0IGdvdCBmcm9tIHRoZSBJbnRlbnQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24KKyAqIGZyb20gYSBjb250ZW50IHByb3ZpZGVyIGFuZCBkaXNwbGF5IGl0IGluIGEgVmlldy4KKyAqCisgKiBUaGUgaW50ZW50IGZpbHRlciBmb3IgdGhpcyBBY3Rpdml0eSBpcyBzZXQgdG8gQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUiwgd2hpY2gKKyAqIEhPTUUgc2VuZHMgaW4gcmVzcG9uc2UgdG8gYSBsb25nIHByZXNzIGFuZCBzZWxlY3Rpb24gb2YgTGl2ZSBGb2xkZXIuCisgKi8KIHB1YmxpYyBjbGFzcyBOb3Rlc0xpdmVGb2xkZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKICAgICAvKioKLSAgICAgKiBUaGUgVVJJIGZvciB0aGUgTm90ZXMgTGl2ZSBGb2xkZXIgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBBbGwgb2YgdGhlIHdvcmsgaXMgZG9uZSBpbiBvbkNyZWF0ZSgpLiBUaGUgQWN0aXZpdHkgZG9lc24ndCBhY3R1YWxseSBkaXNwbGF5IGEgVUkuCisgICAgICogSW5zdGVhZCwgaXQgc2V0cyB1cCBhbiBJbnRlbnQgYW5kIHJldHVybnMgaXQgdG8gaXRzIGNhbGxlciAodGhlIEhPTUUgYWN0aXZpdHkpLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIgotICAgICAgICAgICAgKyBOb3RlUGFkLkFVVEhPUklUWSArICIvbGl2ZV9mb2xkZXJzL25vdGVzIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBOT1RFX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIKLSAgICAgICAgICAgICsgTm90ZVBhZC5BVVRIT1JJVFkgKyAiL25vdGVzLyMiKTsKLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICAvKgorICAgICAgICAgKiBHZXRzIHRoZSBpbmNvbWluZyBJbnRlbnQgYW5kIGl0cyBhY3Rpb24uIElmIHRoZSBpbmNvbWluZyBJbnRlbnQgd2FzCisgICAgICAgICAqIEFDVElPTl9DUkVBVEVfTElWRV9GT0xERVIsIHRoZW4gY3JlYXRlIGFuIG91dGdvaW5nIEludGVudCB3aXRoIHRoZQorICAgICAgICAgKiBuZWNlc3NhcnkgZGF0YSBhbmQgc2VuZCBiYWNrIE9LLiBPdGhlcndpc2UsIHNlbmQgYmFjayBDQU5DRUwuCisgICAgICAgICAqLwogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CiAKICAgICAgICAgaWYgKExpdmVGb2xkZXJzLkFDVElPTl9DUkVBVEVfTElWRV9GT0xERVIuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBsaXZlIGZvbGRlciBpbnRlbnQuCisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBuZXcgSW50ZW50LgogICAgICAgICAgICAgZmluYWwgSW50ZW50IGxpdmVGb2xkZXJJbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQuc2V0RGF0YShDT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIGdldFN0cmluZyhSLnN0cmluZy5saXZlX2ZvbGRlcl9uYW1lKSk7Ci0gICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX0lDT04sCi0gICAgICAgICAgICAgICAgICAgIEludGVudC5TaG9ydGN1dEljb25SZXNvdXJjZS5mcm9tQ29udGV4dCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUubGl2ZV9mb2xkZXJfbm90ZXMpKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfRElTUExBWV9NT0RFLAotICAgICAgICAgICAgICAgICAgICBMaXZlRm9sZGVycy5ESVNQTEFZX01PREVfTElTVCk7Ci0gICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX0JBU0VfSU5URU5ULAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fRURJVCwgTk9URV9VUkkpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIHN0YXRlbWVudHMgcHV0IGRhdGEgaW50byB0aGUgb3V0Z29pbmcgSW50ZW50LiBQbGVhc2Ugc2VlCisgICAgICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5MaXZlRm9sZGVycyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGVzZQorICAgICAgICAgICAgICogZGF0YSB2YWx1ZXMuIEZyb20gdGhpcyBkYXRhLCBIT01FIHNldHMgdXAgYSBsaXZlIGZvbGRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLy8gU2V0cyB0aGUgVVJJIHBhdHRlcm4gZm9yIHRoZSBjb250ZW50IHByb3ZpZGVyIGJhY2tpbmcgdGhlIGZvbGRlci4KKyAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQuc2V0RGF0YShOb3RlUGFkLk5vdGVzLkxJVkVfRk9MREVSX1VSSSk7CiAKLSAgICAgICAgICAgIC8vIFRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpdml0eSBzaG91bGQgYmUgYSBsaXZlIGZvbGRlciBpbnRlbnQuCisgICAgICAgICAgICAvLyBBZGRzIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGxpdmUgZm9sZGVyIGFzIGFuIEV4dHJhIHN0cmluZy4KKyAgICAgICAgICAgIFN0cmluZyBmb2xkZXJuYW1lID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmxpdmVfZm9sZGVyX25hbWUpOworICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9OQU1FLCBmb2xkZXJuYW1lKTsKKworICAgICAgICAgICAgLy8gQWRkcyB0aGUgZGlzcGxheSBpY29uIG9mIHRoZSBsaXZlIGZvbGRlciBhcyBhbiBFeHRyYSByZXNvdXJjZS4KKyAgICAgICAgICAgIFNob3J0Y3V0SWNvblJlc291cmNlIGZvbGRlcmljb24gPQorICAgICAgICAgICAgICAgIEludGVudC5TaG9ydGN1dEljb25SZXNvdXJjZS5mcm9tQ29udGV4dCh0aGlzLCBSLmRyYXdhYmxlLmxpdmVfZm9sZGVyX25vdGVzKTsKKyAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfSUNPTiwgZm9sZGVyaWNvbik7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgZGlzcGxheSBtb2RlIG9mIHRoZSBsaXZlIGZvbGRlciBhcyBhbiBpbnRlZ2VyLiBUaGUgc3BlY2lmaWVkCisgICAgICAgICAgICAvLyBtb2RlIGNhdXNlcyB0aGUgbGl2ZSBmb2xkZXIgdG8gZGlzcGxheSBhcyBhIGxpc3QuCisgICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgICAgICBMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9ESVNQTEFZX01PREUsCisgICAgICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLkRJU1BMQVlfTU9ERV9MSVNUKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFkZHMgYSBiYXNlIGFjdGlvbiBmb3IgaXRlbXMgaW4gdGhlIGxpdmUgZm9sZGVyIGxpc3QsIGFzIGFuIEludGVudC4gV2hlbiB0aGUKKyAgICAgICAgICAgICAqIHVzZXIgY2xpY2tzIGFuIGluZGl2aWR1YWwgbm90ZSBpbiB0aGUgbGlzdCwgdGhlIGxpdmUgZm9sZGVyIGZpcmVzIHRoaXMgSW50ZW50LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEl0cyBhY3Rpb24gaXMgQUNUSU9OX0VESVQsIHNvIGl0IHRyaWdnZXJzIHRoZSBOb3RlIEVkaXRvciBhY3Rpdml0eS4gSXRzCisgICAgICAgICAgICAgKiBkYXRhIGlzIHRoZSBVUkkgcGF0dGVybiBmb3IgYSBzaW5nbGUgbm90ZSBpZGVudGlmaWVkIGJ5IGl0cyBJRC4gVGhlIGxpdmUgZm9sZGVyCisgICAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIElEIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBpdGVtIHRvIHRoZSBVUkkgcGF0dGVybi4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBBcyBhIHJlc3VsdCwgTm90ZSBFZGl0b3IgaXMgdHJpZ2dlcmVkIGFuZCBnZXRzIGEgc2luZ2xlIG5vdGUgdG8gcmV0cmlldmUgYnkgSUQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEludGVudCByZXR1cm5JbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fRURJVCwgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lEX1VSSV9QQVRURVJOKTsKKyAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfQkFTRV9JTlRFTlQsIHJldHVybkludGVudCk7CisKKyAgICAgICAgICAgIC8qIENyZWF0ZXMgYW4gQWN0aXZpdHlSZXN1bHQgb2JqZWN0IHRvIHByb3BhZ2F0ZSBiYWNrIHRvIEhPTUUuIFNldCBpdHMgcmVzdWx0IGluZGljYXRvcgorICAgICAgICAgICAgICogdG8gT0ssIGFuZCBzZXRzIHRoZSByZXR1cm5lZCBJbnRlbnQgdG8gdGhlIGxpdmUgZm9sZGVyIEludGVudCB0aGF0IHdhcyBqdXN0CisgICAgICAgICAgICAgKiBjb25zdHJ1Y3RlZC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSywgbGl2ZUZvbGRlckludGVudCk7CisKICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGFjdGlvbiB3YXMgbm90IEFDVElPTl9DUkVBVEVfTElWRV9GT0xERVIsIGNyZWF0ZXMgYW4KKyAgICAgICAgICAgIC8vIEFjdGl2aXR5UmVzdWx0IHdpdGggdGhlIGluZGljYXRvciBzZXQgdG8gQ0FOQ0VMRUQsIGJ1dCBkbyBub3QgcmV0dXJuIGFuIEludGVudAogICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBDbG9zZXMgdGhlIEFjdGl2aXR5LiBUaGUgQWN0aXZpdHlPYmplY3QgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgICAgIGZpbmlzaCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL1RpdGxlRWRpdG9yLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9UaXRsZUVkaXRvci5qYXZhCmluZGV4IGZlMjMyZWQuLjVhYmU5N2IgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL1RpdGxlRWRpdG9yLmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvVGl0bGVFZGl0b3IuamF2YQpAQCAtMjIsOTQgKzIyLDE0NiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiAKLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZC5Ob3RlQ29sdW1uczsKLQogLyoqCi0gKiBBbiBhY3Rpdml0eSB0aGF0IHdpbGwgZWRpdCB0aGUgdGl0bGUgb2YgYSBub3RlLiBEaXNwbGF5cyBhIGZsb2F0aW5nCi0gKiB3aW5kb3cgd2l0aCBhIHRleHQgZmllbGQuCisgKiBUaGlzIEFjdGl2aXR5IGFsbG93cyB0aGUgdXNlciB0byBlZGl0IGEgbm90ZSdzIHRpdGxlLiBJdCBkaXNwbGF5cyBhIGZsb2F0aW5nIHdpbmRvdworICogY29udGFpbmluZyBhbiBFZGl0VGV4dC4KKyAqCisgKiBOT1RFOiBOb3RpY2UgdGhhdCB0aGUgcHJvdmlkZXIgb3BlcmF0aW9ucyBpbiB0aGlzIEFjdGl2aXR5IGFyZSB0YWtpbmcgcGxhY2Ugb24gdGhlIFVJIHRocmVhZC4KKyAqIFRoaXMgaXMgbm90IGEgZ29vZCBwcmFjdGljZS4gSXQgaXMgb25seSBkb25lIGhlcmUgdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiBBIHJlYWwKKyAqIGFwcGxpY2F0aW9uIHNob3VsZCB1c2UgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXJ9CisgKiBvciB7QGxpbmsgYW5kcm9pZC5vcy5Bc3luY1Rhc2t9IG9iamVjdCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgYXN5bmNocm9ub3VzbHkgb24gYSBzZXBhcmF0ZSB0aHJlYWQuCiAgKi8KLXB1YmxpYyBjbGFzcyBUaXRsZUVkaXRvciBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworcHVibGljIGNsYXNzIFRpdGxlRWRpdG9yIGV4dGVuZHMgQWN0aXZpdHkgewogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBhIHNwZWNpYWwgaW50ZW50IGFjdGlvbiB0aGF0IG1lYW5zICJlZGl0IHRoZSB0aXRsZSBvZiBhIG5vdGUiLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfVElUTEVfQUNUSU9OID0gImNvbS5hbmRyb2lkLm5vdGVwYWQuYWN0aW9uLkVESVRfVElUTEUiOwogCi0gICAgLyoqCi0gICAgICogQW4gYXJyYXkgb2YgdGhlIGNvbHVtbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4uCi0gICAgICovCisgICAgLy8gQ3JlYXRlcyBhIHByb2plY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBub3RlIElEIGFuZCB0aGUgbm90ZSBjb250ZW50cy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgTm90ZUNvbHVtbnMuX0lELCAvLyAwCi0gICAgICAgIE5vdGVDb2x1bW5zLlRJVExFLCAvLyAxCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgLy8gMAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgLy8gMQogICAgIH07Ci0gICAgLyoqIEluZGV4IG9mIHRoZSB0aXRsZSBjb2x1bW4gKi8KKworICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGl0bGUgY29sdW1uIGluIGEgQ3Vyc29yIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlci4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lOREVYX1RJVExFID0gMTsKIAotICAgIC8qKgotICAgICAqIEN1cnNvciB3aGljaCB3aWxsIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBub3RlIHdob3NlIHRpdGxlIHdlIGFyZSBlZGl0aW5nLgotICAgICAqLworICAgIC8vIEEgQ3Vyc29yIG9iamVjdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVzdWx0cyBvZiBxdWVyeWluZyB0aGUgcHJvdmlkZXIgZm9yIGEgbm90ZS4KICAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwogCi0gICAgLyoqCi0gICAgICogVGhlIEVkaXRUZXh0IGZpZWxkIGZyb20gb3VyIFVJLiBLZWVwIHRyYWNrIG9mIHRoaXMgc28gd2UgY2FuIGV4dHJhY3QgdGhlCi0gICAgICogdGV4dCB3aGVuIHdlIGFyZSBmaW5pc2hlZC4KLSAgICAgKi8KKyAgICAvLyBBbiBFZGl0VGV4dCBvYmplY3QgZm9yIHByZXNlcnZpbmcgdGhlIGVkaXRlZCB0aXRsZS4KICAgICBwcml2YXRlIEVkaXRUZXh0IG1UZXh0OwogCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRlbnQgVVJJIHRvIHRoZSBub3RlIHRoYXQncyBiZWluZyBlZGl0ZWQuCi0gICAgICovCisgICAgLy8gQSBVUkkgb2JqZWN0IGZvciB0aGUgbm90ZSB3aG9zZSB0aXRsZSBpcyBiZWluZyBlZGl0ZWQuCiAgICAgcHJpdmF0ZSBVcmkgbVVyaTsKIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBBbmRyb2lkIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGZpcnN0IHN0YXJ0ZWQuIEZyb20gdGhlIGluY29taW5nCisgICAgICogSW50ZW50LCBpdCBkZXRlcm1pbmVzIHdoYXQga2luZCBvZiBlZGl0aW5nIGlzIGRlc2lyZWQsIGFuZCB0aGVuIGRvZXMgaXQuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIC8vIFNldCB0aGUgVmlldyBmb3IgdGhpcyBBY3Rpdml0eSBvYmplY3QncyBVSS4KICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQudGl0bGVfZWRpdG9yKTsKIAotICAgICAgICAvLyBHZXQgdGhlIHVyaSBvZiB0aGUgbm90ZSB3aG9zZSB0aXRsZSB3ZSB3YW50IHRvIGVkaXQKKyAgICAgICAgLy8gR2V0IHRoZSBJbnRlbnQgdGhhdCBhY3RpdmF0ZWQgdGhpcyBBY3Rpdml0eSwgYW5kIGZyb20gaXQgZ2V0IHRoZSBVUkkgb2YgdGhlIG5vdGUgd2hvc2UKKyAgICAgICAgLy8gdGl0bGUgd2UgbmVlZCB0byBlZGl0LgogICAgICAgICBtVXJpID0gZ2V0SW50ZW50KCkuZ2V0RGF0YSgpOwogCi0gICAgICAgIC8vIEdldCBhIGN1cnNvciB0byBhY2Nlc3MgdGhlIG5vdGUKLSAgICAgICAgbUN1cnNvciA9IG1hbmFnZWRRdWVyeShtVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXNpbmcgdGhlIFVSSSBwYXNzZWQgaW4gd2l0aCB0aGUgdHJpZ2dlcmluZyBJbnRlbnQsIGdldHMgdGhlIG5vdGUuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGU6IFRoaXMgaXMgYmVpbmcgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLiBJdCB3aWxsIGJsb2NrIHRoZSB0aHJlYWQgdW50aWwgdGhlIHF1ZXJ5CisgICAgICAgICAqIGNvbXBsZXRlcy4gSW4gYSBzYW1wbGUgYXBwLCBnb2luZyBhZ2FpbnN0IGEgc2ltcGxlIHByb3ZpZGVyIGJhc2VkIG9uIGEgbG9jYWwgZGF0YWJhc2UsCisgICAgICAgICAqIHRoZSBibG9jayB3aWxsIGJlIG1vbWVudGFyeSwgYnV0IGluIGEgcmVhbCBhcHAgeW91IHNob3VsZCB1c2UKKyAgICAgICAgICogYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyIG9yIGFuZHJvaWQub3MuQXN5bmNUYXNrLgorICAgICAgICAgKi8KIAotICAgICAgICAvLyBTZXQgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIHRoZSB0ZXh0IGZpZWxkIGFuZCBidXR0b24KKyAgICAgICAgbUN1cnNvciA9IG1hbmFnZWRRdWVyeSgKKyAgICAgICAgICAgIG1VcmksICAgICAgICAvLyBUaGUgVVJJIGZvciB0aGUgbm90ZSB0aGF0IGlzIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgICAgICAgIFBST0pFQ1RJT04sICAvLyBUaGUgY29sdW1ucyB0byByZXRyaWV2ZQorICAgICAgICAgICAgbnVsbCwgICAgICAgIC8vIE5vIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgdXNlZCwgc28gbm8gd2hlcmUgY29sdW1ucyBhcmUgbmVlZGVkLgorICAgICAgICAgICAgbnVsbCwgICAgICAgIC8vIE5vIHdoZXJlIGNvbHVtbnMgYXJlIHVzZWQsIHNvIG5vIHdoZXJlIHZhbHVlcyBhcmUgbmVlZGVkLgorICAgICAgICAgICAgbnVsbCAgICAgICAgIC8vIE5vIHNvcnQgb3JkZXIgaXMgbmVlZGVkLgorICAgICAgICApOworCisgICAgICAgIC8vIEdldHMgdGhlIFZpZXcgSUQgZm9yIHRoZSBFZGl0VGV4dCBib3gKICAgICAgICAgbVRleHQgPSAoRWRpdFRleHQpIHRoaXMuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOwotICAgICAgICBtVGV4dC5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIAotICAgICAgICBCdXR0b24gYiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLm9rKTsKLSAgICAgICAgYi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGFib3V0IHRvIGNvbWUgdG8gdGhlIGZvcmVncm91bmQuIFRoaXMgaGFwcGVucworICAgICAqIHdoZW4gdGhlIEFjdGl2aXR5IGNvbWVzIHRvIHRoZSB0b3Agb2YgdGhlIHRhc2sgc3RhY2ssIE9SIHdoZW4gaXQgaXMgZmlyc3Qgc3RhcnRpbmcuCisgICAgICoKKyAgICAgKiBEaXNwbGF5cyB0aGUgY3VycmVudCB0aXRsZSBmb3IgdGhlIHNlbGVjdGVkIG5vdGUuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CiAgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CiAKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGV4dCB3aXRoIHRoZSB0aXRsZSBjb2x1bW4gZnJvbSB0aGUgY3Vyc29yCisgICAgICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHF1ZXJ5IG1hZGUgaW4gb25DcmVhdGUoKSBhY3R1YWxseSB3b3JrZWQuIElmIGl0IHdvcmtlZCwgdGhlbiB0aGUKKyAgICAgICAgLy8gQ3Vyc29yIG9iamVjdCBpcyBub3QgbnVsbC4gSWYgaXQgaXMgKmVtcHR5KiwgdGhlbiBtQ3Vyc29yLmdldENvdW50KCkgPT0gMC4KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBUaGUgQ3Vyc29yIHdhcyBqdXN0IHJldHJpZXZlZCwgc28gaXRzIGluZGV4IGlzIHNldCB0byBvbmUgcmVjb3JkICpiZWZvcmUqIHRoZSBmaXJzdAorICAgICAgICAgICAgLy8gcmVjb3JkIHJldHJpZXZlZC4gVGhpcyBtb3ZlcyBpdCB0byB0aGUgZmlyc3QgcmVjb3JkLgogICAgICAgICAgICAgbUN1cnNvci5tb3ZlVG9GaXJzdCgpOworCisgICAgICAgICAgICAvLyBEaXNwbGF5cyB0aGUgY3VycmVudCB0aXRsZSB0ZXh0IGluIHRoZSBFZGl0VGV4dCBvYmplY3QuCiAgICAgICAgICAgICBtVGV4dC5zZXRUZXh0KG1DdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9JTkRFWF9USVRMRSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIEFjdGl2aXR5IGxvc2VzIGZvY3VzLgorICAgICAqCisgICAgICogRm9yIEFjdGl2aXR5IG9iamVjdHMgdGhhdCBlZGl0IGluZm9ybWF0aW9uLCBvblBhdXNlKCkgbWF5IGJlIHRoZSBvbmUgcGxhY2Ugd2hlcmUgY2hhbmdlcyBhcmUKKyAgICAgKiBzYXZlZC4gVGhlIEFuZHJvaWQgYXBwbGljYXRpb24gbW9kZWwgaXMgcHJlZGljYXRlZCBvbiB0aGUgaWRlYSB0aGF0ICJzYXZlIiBhbmQgImV4aXQiIGFyZW4ndAorICAgICAqIHJlcXVpcmVkIGFjdGlvbnMuIFdoZW4gdXNlcnMgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFjdGl2aXR5LCB0aGV5IHNob3VsZG4ndCBoYXZlIHRvIGdvIGJhY2sKKyAgICAgKiB0byBpdCB0byBjb21wbGV0ZSB0aGVpciB3b3JrLiBUaGUgYWN0IG9mIGdvaW5nIGF3YXkgc2hvdWxkIHNhdmUgZXZlcnl0aGluZyBhbmQgbGVhdmUgdGhlCisgICAgICogQWN0aXZpdHkgaW4gYSBzdGF0ZSB3aGVyZSBBbmRyb2lkIGNhbiBkZXN0cm95IGl0IGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIFVwZGF0ZXMgdGhlIG5vdGUgd2l0aCB0aGUgdGV4dCBjdXJyZW50bHkgaW4gdGhlIHRleHQgYm94LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CiAgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKIAorICAgICAgICAvLyBWZXJpZmllcyB0aGF0IHRoZSBxdWVyeSBtYWRlIGluIG9uQ3JlYXRlKCkgYWN0dWFsbHkgd29ya2VkLiBJZiBpdCB3b3JrZWQsIHRoZW4gdGhlCisgICAgICAgIC8vIEN1cnNvciBvYmplY3QgaXMgbm90IG51bGwuIElmIGl0IGlzICplbXB0eSosIHRoZW4gbUN1cnNvci5nZXRDb3VudCgpID09IDAuCisKICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHRpdGxlIGJhY2sgdG8gdGhlIG5vdGUgCisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYSB2YWx1ZXMgbWFwIGZvciB1cGRhdGluZyB0aGUgcHJvdmlkZXIuCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVDb2x1bW5zLlRJVExFLCBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUobVVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKKworICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlcyBtYXAsIHNldHMgdGhlIHRpdGxlIHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJveC4KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgbVRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlcyB0aGUgcHJvdmlkZXIgd2l0aCB0aGUgbm90ZSdzIG5ldyB0aXRsZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGJlaW5nIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gSXQgd2lsbCBibG9jayB0aGUgdGhyZWFkIHVudGlsIHRoZQorICAgICAgICAgICAgICogdXBkYXRlIGNvbXBsZXRlcy4gSW4gYSBzYW1wbGUgYXBwLCBnb2luZyBhZ2FpbnN0IGEgc2ltcGxlIHByb3ZpZGVyIGJhc2VkIG9uIGEKKyAgICAgICAgICAgICAqIGxvY2FsIGRhdGFiYXNlLCB0aGUgYmxvY2sgd2lsbCBiZSBtb21lbnRhcnksIGJ1dCBpbiBhIHJlYWwgYXBwIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgb3IgYW5kcm9pZC5vcy5Bc3luY1Rhc2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICBtVXJpLCAgICAvLyBUaGUgVVJJIGZvciB0aGUgbm90ZSB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgdmFsdWVzLCAgLy8gVGhlIHZhbHVlcyBtYXAgY29udGFpbmluZyB0aGUgY29sdW1ucyB0byB1cGRhdGUgYW5kIHRoZSB2YWx1ZXMgdG8gdXNlLgorICAgICAgICAgICAgICAgIG51bGwsICAgIC8vIE5vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyB1c2VkLCBzbyBubyAid2hlcmUiIGNvbHVtbnMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBudWxsICAgICAvLyBObyAid2hlcmUiIGNvbHVtbnMgYXJlIHVzZWQsIHNvIG5vICJ3aGVyZSIgdmFsdWVzIGFyZSBuZWVkZWQuCisgICAgICAgICAgICApOworCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAvLyBXaGVuIHRoZSB1c2VyIGNsaWNrcywganVzdCBmaW5pc2ggdGhpcyBhY3Rpdml0eS4KLSAgICAgICAgLy8gb25QYXVzZSB3aWxsIGJlIGNhbGxlZCwgYW5kIHdlIHNhdmUgb3VyIGRhdGEgdGhlcmUuCisgICAgcHVibGljIHZvaWQgb25DbGlja09rKFZpZXcgdikgewogICAgICAgICBmaW5pc2goKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvQW5kcm9pZC5tayBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VmYWZjLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE5vdGVQYWRUZXN0cwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9IE5vdGVQYWQKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGFmZDUwMmIuLmI2YjYxMDEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xLDMyICsxLDQ5IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLQorICAgIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIAotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAKLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAKLSAgICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZC50ZXN0cyI+Ci0gICAgCi0gICAgPCEtLSBXZSBhZGQgYW4gYXBwbGljYXRpb24gdGFnIGhlcmUganVzdCBzbyB0aGF0IHdlIGNhbiBpbmRpY2F0ZSB0aGF0Ci0gICAgICAgICB0aGlzIHBhY2thZ2UgbmVlZHMgdG8gbGluayBhZ2FpbnN0IHRoZSBhbmRyb2lkLnRlc3QgbGlicmFyeSwKLSAgICAgICAgIHdoaWNoIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIHRlc3QgY2FzZXMuIC0tPiAgICAKKzwhLS0KKyAgICBUbyBydW4gdGhpcyB0ZXN0IHBhY2thZ2UsIGluc3RhbGwgaXQgYW5kIHRoZSBOb3Rlc0xpc3QgYXBwbGljYXRpb24gdG8gYSBkZXZpY2Ugb3IgZW11bGF0b3IgYW5kCisgICAgdGhlbiBydW4KKyAgICBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKy0tPgorPCEtLQorICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHBhY2thZ2UgSUQgb2YgdGhlIGNvZGUuIFRoZSBjb2RlIHBhY2thZ2UgSUQKKyAgICAnY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkJyBhbGxvd3MgdGhlIHRlc3QgY29kZSB0byB1c2UgZGVjbGFyYXRpb25zIGZyb20gdGhlIGFwcGxpY2F0aW9uCisgICAgdW5kZXIgdGVzdCwgd2hpbGUgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlkZW50aWZpZXMgdGhpcyBhcyBhIHNlcGFyYXRlIHRlc3QgcGFja2FnZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQudGVzdHMiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorICAgIDwhLS0KKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBwYWNrYWdlIG11c3QgYmUgbGlua2VkIGFnYWluc3QgdGhlIGxpYnJhcnkKKyAgICAgICAgYW5kcm9pZC50ZXN0LnJ1bm5lciwgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIG5vcm1hbCBsaW5rIHBhdGguIFRoZSBsaWJyYXJ5IGNvbnRhaW5zCisgICAgICAgIGNvZGUgZm9yIHRlc3QgY2FzZXMuCisgICAgLS0+CiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgotCi0gIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkIgotICAgICAgYW5kcm9pZDpsYWJlbD0iTm90ZVBhZCBzYW1wbGUgdGVzdHMiPgotICA8L2luc3RydW1lbnRhdGlvbj4gIAotICAKKyAgICA8IS0tCisgICAgICAgIFRoZSBpbnN0cnVtZW50YXRpb24gZWxlbWVudCB0ZWxscyBBbmRyb2lkIHRvIHVzZSBpbnN0cnVtZW50YXRpb24gdG8gcnVuIHRoaXMgcGFja2FnZS4KKyAgICAgICAgVGhlIHRhcmdldCBBbmRyb2lkIHBhY2thZ2UgJ2NvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZCcgaXMgbG9hZGVkIGFsb25nIHdpdGggdGhlCisgICAgICAgIHRlc3QgcGFja2FnZSAnY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLnRlc3RzJy4gQW5kcm9pZCB0aGVuIHN0YXJ0cyB0aGUgY2xhc3MKKyAgICAgICAgJ2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyJywgd2hpY2ggbG9hZHMgdGhlIHRlc3QgY2FzZSBjbGFzc2VzIGluIHRoZSBwYWNrYWdlLgorICAgIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdHMgZm9yIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZCIvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjEwIj48L3VzZXMtc2RrPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzM5ZGUuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10ZXN0ZWQucHJvamVjdC5kaXI9Li4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRBY3Rpdml0eVRlc3QuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRBY3Rpdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTY2ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZEFjdGl2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQubm90ZXBhZDsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZXNMaXN0OworCisvKioKKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBtYWluIGxhdW5jaGVyIGFjdGl2aXR5IG9wZW5zIHVwIHByb3Blcmx5LCB3aGljaCB3aWxsIGJlCisgKiB2ZXJpZmllZCBieSB7QGxpbmsgI3Rlc3RBY3Rpdml0eVRlc3RDYXNlU2V0VXBQcm9wZXJseX0uCisgKi8KK3B1YmxpYyBjbGFzcyBOb3RlUGFkQWN0aXZpdHlUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8Tm90ZXNMaXN0PiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gZm9yIHRoZSB7QGxpbmsgTm90ZXNMaXN0fSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTm90ZVBhZEFjdGl2aXR5VGVzdCgpIHsKKyAgICAgICAgc3VwZXIoTm90ZXNMaXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0IGNhbiBiZSBsYXVuY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdHlUZXN0Q2FzZVNldFVwUHJvcGVybHkoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoImFjdGl2aXR5IHNob3VsZCBiZSBsYXVuY2hlZCBzdWNjZXNzZnVsbHkiLCBnZXRBY3Rpdml0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXJUZXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ODM0NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworCisvKgorICovCisvKioKKyAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBOb3RlIFBhZCBzYW1wbGUgYXBwbGljYXRpb24uCisgKgorICogVG8gbGVhcm4gaG93IHRvIHJ1biBhbiBlbnRpcmUgdGVzdCBwYWNrYWdlIG9yIG9uZSBvZiBpdHMgY2xhc3NlcywgcGxlYXNlIHNlZQorICogIlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQiIG9yICJUZXN0aW5nIGluIE90aGVyIElERXMiIGluIHRoZSBEZXZlbG9wZXIgR3VpZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBOb3RlUGFkUHJvdmlkZXJUZXN0IGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZTI8Tm90ZVBhZFByb3ZpZGVyPiB7CisKKyAgICAvLyBBIFVSSSB0aGF0IHRoZSBwcm92aWRlciBkb2VzIG5vdCBvZmZlciwgZm9yIHRlc3RpbmcgZXJyb3IgaGFuZGxpbmcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJpIElOVkFMSURfVVJJID0KKyAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgImludmFsaWQiKTsKKworICAgIC8vIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2NrZWQgY29udGVudCByZXNvbHZlciBmb3IgdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3QuCisgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1Nb2NrUmVzb2x2ZXI7CisKKyAgICAvLyBDb250YWlucyBhbiBTUUxpdGUgZGF0YWJhc2UsIHVzZWQgYXMgdGVzdCBkYXRhCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGI7CisKKyAgICAvLyBDb250YWlucyB0aGUgdGVzdCBkYXRhLCBhcyBhbiBhcnJheSBvZiBOb3RlSW5mbyBpbnN0YW5jZXMuCisgICAgcHJpdmF0ZSBmaW5hbCBOb3RlSW5mb1tdIFRFU1RfTk9URVMgPSB7CisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTAiLCAiVGhpcyBpcyBub3RlIDAiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlMSIsICJUaGlzIGlzIG5vdGUgMSIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGUyIiwgIlRoaXMgaXMgbm90ZSAyIiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTMiLCAiVGhpcyBpcyBub3RlIDMiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlNCIsICJUaGlzIGlzIG5vdGUgNCIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU1IiwgIlRoaXMgaXMgbm90ZSA1IiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTYiLCAiVGhpcyBpcyBub3RlIDYiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlNyIsICJUaGlzIGlzIG5vdGUgNyIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU4IiwgIlRoaXMgaXMgbm90ZSA4IiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTkiLCAiVGhpcyBpcyBub3RlIDkiKSB9OworCisgICAgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgZGF5IChtaWxsaXNlY29uZHMgKiBzZWNvbmRzICogbWludXRlcyAqIGhvdXJzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT05FX0RBWV9NSUxMSVMgPSAxMDAwICogNjAgKiA2MCAqIDI0OworCisgICAgLy8gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBvbmUgd2VlaworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT05FX1dFRUtfTUlMTElTID0gT05FX0RBWV9NSUxMSVMgKiA3OworCisgICAgLy8gQ3JlYXRlcyBhIGNhbGVuZGFyIG9iamVjdCBlcXVhbCB0byBKYW51YXJ5IDEsIDIwMTAgYXQgMTIgbWlkbmlnaHQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBURVNUX0NBTEVOREFSID0KKyAgICAgICAgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKDIwMTAsIENhbGVuZGFyLkpBTlVBUlksIDEsIDAsIDAsIDApOworCisgICAgLy8gU3RvcmVzIGEgdGltZXN0YW1wIHZhbHVlLCBzZXQgdG8gYW4gYXJiaXRyYXJ5IHN0YXJ0aW5nIHBvaW50CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBTVEFSVF9EQVRFID0gVEVTVF9DQUxFTkRBUi5nZXRUaW1lSW5NaWxsaXMoKTsKKworICAgIC8vIFNldHMgYSBNSU1FIHR5cGUgZmlsdGVyLCB1c2VkIHRvIHRlc3QgcHJvdmlkZXIgbWV0aG9kcyB0aGF0IHJldHVybiBtb3JlIHRoYW4gb25lIE1JTUUgdHlwZQorICAgIC8vIGZvciBhIHBhcnRpY3VsYXIgbm90ZS4gVGhlIGZpbHRlciB3aWxsIHJldHJpZXZlIGFueSBNSU1FIHR5cGVzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQgVVJJLgorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNSU1FX1RZUEVTX0FMTCA9ICIqLyoiOworCisgICAgLy8gU2V0cyBhIE1JTUUgdHlwZSBmaWx0ZXIsIHVzZWQgdG8gdGVzdCBwcm92aWRlciBtZXRob2RzIHRoYXQgcmV0dXJuIG1vcmUgdGhhbiBvbmUgTUlNRSB0eXBlCisgICAgLy8gZm9yIGEgcGFydGljdWxhciBub3RlLiBUaGUgZmlsdGVyIGlzIG5vbnNlbnNlLCBzbyBpdCB3aWxsIG5vdCByZXRyaWV2ZSBhbnkgTUlNRSB0eXBlcy4KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlNRV9UWVBFU19OT05FID0gInF3ZXIvcXdlciI7CisKKyAgICAvLyBTZXRzIGEgTUlNRSB0eXBlIGZpbHRlciBmb3IgcGxhaW4gdGV4dCwgdXNlZCB0byB0aGUgcHJvdmlkZXIncyBtZXRob2RzIHRoYXQgb25seSBoYW5kbGUKKyAgICAvLyBwbGFpbiB0ZXh0CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9URVhUID0gInRleHQvcGxhaW4iOworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHRlc3QgY2FzZSBjbGFzcy4KKyAgICAgKiBDYWxscyB0aGUgc3VwZXIgY29uc3RydWN0b3Igd2l0aCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdCBhbmQgdGhlCisgICAgICogYXV0aG9yaXR5IG5hbWUgb2YgdGhlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBOb3RlUGFkUHJvdmlkZXJUZXN0KCkgeworICAgICAgICBzdXBlcihOb3RlUGFkUHJvdmlkZXIuY2xhc3MsIE5vdGVQYWQuQVVUSE9SSVRZKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgdXAgdGhlIHRlc3QgZW52aXJvbm1lbnQgYmVmb3JlIGVhY2ggdGVzdCBtZXRob2QuIENyZWF0ZXMgYSBtb2NrIGNvbnRlbnQgcmVzb2x2ZXIsCisgICAgICogZ2V0cyB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdCwgYW5kIGNyZWF0ZXMgYSBuZXcgZGF0YWJhc2UgZm9yIHRoZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBDYWxscyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSByZXNvbHZlciBmb3IgdGhpcyB0ZXN0LgorICAgICAgICBtTW9ja1Jlc29sdmVyID0gZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgYSBoYW5kbGUgdG8gdGhlIGRhdGFiYXNlIHVuZGVybHlpbmcgdGhlIHByb3ZpZGVyLiBHZXRzIHRoZSBwcm92aWRlciBpbnN0YW5jZQorICAgICAgICAgKiBjcmVhdGVkIGluIHN1cGVyLnNldFVwKCksIGdldHMgdGhlIERhdGFiYXNlT3BlbkhlbHBlciBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgZ2V0cworICAgICAgICAgKiBhIGRhdGFiYXNlIG9iamVjdCBmcm9tIHRoZSBoZWxwZXIuCisgICAgICAgICAqLworICAgICAgICBtRGIgPSBnZXRQcm92aWRlcigpLmdldE9wZW5IZWxwZXJGb3JUZXN0KCkuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QgbWV0aG9kLCB0byBjbGVhbiB1cCB0aGUgY3VycmVudCBmaXh0dXJlLiBTaW5jZQorICAgICAqICB0aGlzIHNhbXBsZSB0ZXN0IGNhc2UgcnVucyBpbiBhbiBpc29sYXRlZCBjb250ZXh0LCBubyBjbGVhbnVwIGlzIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0cyB1cCB0ZXN0IGRhdGEuCisgICAgICogVGhlIHRlc3QgZGF0YSBpcyBpbiBhbiBTUUwgZGF0YWJhc2UuIEl0IGlzIGNyZWF0ZWQgaW4gc2V0VXAoKSB3aXRob3V0IGFueSBkYXRhLAorICAgICAqIGFuZCBwb3B1bGF0ZWQgaW4gaW5zZXJ0RGF0YSBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydERhdGEoKSB7CisgICAgICAgIC8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbnRlbnRWYWx1ZXMgbWFwIHR5cGUgZXhwZWN0ZWQgYnkgZGF0YWJhc2UgaW5zZXJ0aW9ucworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgLy8gU2V0cyB1cCB0ZXN0IGRhdGEKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IFRFU1RfTk9URVMubGVuZ3RoOyBpbmRleCsrKSB7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgY3JlYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBkYXRlIGZvciB0aGUgbm90ZQorICAgICAgICAgICAgVEVTVF9OT1RFU1tpbmRleF0uc2V0Q3JlYXRpb25EYXRlKFNUQVJUX0RBVEUgKyAoaW5kZXggKiBPTkVfREFZX01JTExJUykpOworICAgICAgICAgICAgVEVTVF9OT1RFU1tpbmRleF0uc2V0TW9kaWZpY2F0aW9uRGF0ZShTVEFSVF9EQVRFICsgKGluZGV4ICogT05FX1dFRUtfTUlMTElTKSk7CisKKyAgICAgICAgICAgIC8vIEFkZHMgYSByZWNvcmQgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAgICAgbURiLmluc2VydE9yVGhyb3coCisgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgICAgICAgICAgICAvLyB0aGUgdGFibGUgbmFtZSBmb3IgdGhlIGluc2VydAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsICAgICAgLy8gY29sdW1uIHNldCB0byBudWxsIGlmIGVtcHR5IHZhbHVlcyBtYXAKKyAgICAgICAgICAgICAgICBURVNUX05PVEVTW2luZGV4XS5nZXRDb250ZW50VmFsdWVzKCkgIC8vIHRoZSB2YWx1ZXMgbWFwIHRvIGluc2VydAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgdGhlIHByb3ZpZGVyJ3MgcHVibGljbHkgYXZhaWxhYmxlIFVSSXMuIElmIHRoZSBVUkkgaXMgbm90IG9uZSB0aGF0IHRoZSBwcm92aWRlcgorICAgICAqIHVuZGVyc3RhbmRzLCB0aGUgcHJvdmlkZXIgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgYWxzbyB0ZXN0cyB0aGUgcHJvdmlkZXIncyBnZXRUeXBlKCkKKyAgICAgKiBtZXRob2QgZm9yIGVhY2ggVVJJLCB3aGljaCBzaG91bGQgcmV0dXJuIHRoZSBNSU1FIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBVUkkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFVyaUFuZEdldFR5cGUoKSB7CisgICAgICAgIC8vIFRlc3RzIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSBub3RlcyB0YWJsZSBVUkkuCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0VHlwZShOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFLCBtaW1lVHlwZSk7CisKKyAgICAgICAgLy8gVGVzdHMgdGhlIE1JTUUgdHlwZSBmb3IgdGhlIGxpdmUgZm9sZGVyIFVSSS4KKyAgICAgICAgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFR5cGUoTm90ZVBhZC5Ob3Rlcy5MSVZFX0ZPTERFUl9VUkkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1RZUEUsIG1pbWVUeXBlKTsKKworICAgICAgICAvLyBDcmVhdGVzIGEgVVJJIHdpdGggYSBwYXR0ZXJuIGZvciBub3RlIGlkcy4gVGhlIGlkIGRvZXNuJ3QgaGF2ZSB0byBleGlzdC4KKyAgICAgICAgVXJpIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgbm90ZSBJRCBVUkkgTUlNRSB0eXBlLgorICAgICAgICBtaW1lVHlwZSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0VHlwZShub3RlSWRVcmkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lURU1fVFlQRSwgbWltZVR5cGUpOworCisgICAgICAgIC8vIFRlc3RzIGFuIGludmFsaWQgVVJJLiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCisgICAgICAgIG1pbWVUeXBlID0gbU1vY2tSZXNvbHZlci5nZXRUeXBlKElOVkFMSURfVVJJKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIHN0cmVhbSBNSU1FIHR5cGVzIHJldHVybmVkIGJ5IGdldFN0cmVhbVR5cGVzKCkuIElmIHRoZSBwcm92aWRlciBzdXBwb3J0cworICAgICAqIHN0cmVhbSBkYXRhIGZvciB0aGUgVVJJLCB0aGUgTUlNRSB0eXBlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm92aWRlciByZXR1cm5zIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN0cmVhbVR5cGVzKCkgeworCisgICAgICAgIC8vIFRlc3RzIHRoZSBub3RlcyB0YWJsZSBVUkkuIFRoaXMgc2hvdWxkIHJldHVybiBudWxsLCBzaW5jZSB0aGUgY29udGVudCBwcm92aWRlciBkb2VzCisgICAgICAgIC8vIG5vdCBwcm92aWRlIGEgc3RyZWFtIE1JTUUgdHlwZSBmb3IgbXVsdGlwbGUgbm90ZXMuCisgICAgICAgIGFzc2VydE51bGwobU1vY2tSZXNvbHZlci5nZXRTdHJlYW1UeXBlcyhOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCBNSU1FX1RZUEVTX0FMTCkpOworCisgICAgICAgIC8vIFRlc3RzIHRoZSBsaXZlIGZvbGRlcnMgVVJJLiBUaGlzIHNob3VsZCByZXR1cm4gbnVsbCwgc2luY2UgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3QKKyAgICAgICAgLy8gcHJvdmlkZSBhIHN0cmVhbSBNSU1FIHR5cGUgZm9yIG11bHRpcGxlIG5vdGVzLgorICAgICAgICBhc3NlcnROdWxsKG1Nb2NrUmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXMoTm90ZVBhZC5Ob3Rlcy5MSVZFX0ZPTERFUl9VUkksIE1JTUVfVFlQRVNfQUxMKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdHMgdGhlIG5vdGUgaWQgVVJJIGZvciBhIHNpbmdsZSBub3RlLCB1c2luZyBfSUQgdmFsdWUgIjEiIHdoaWNoIGlzIGEgdmFsaWQgSUQuIFVzZXMgYQorICAgICAgICAgKiB2YWxpZCBNSU1FIHR5cGUgZmlsdGVyIHRoYXQgd2lsbCByZXR1cm4gYWxsIHRoZSBzdXBwb3J0ZWQgTUlNRSB0eXBlcyBmb3IgYSBjb250ZW50IFVSSS4KKyAgICAgICAgICogVGhlIHJlc3VsdCBzaG91bGQgYmUgInRleHQvcGxhaW4iLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBDb25zdHJ1Y3RzIHRoZSBub3RlIGlkIFVSSQorICAgICAgICBVcmkgdGVzdFVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgIjEiKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBNSU1FIHR5cGVzIGZvciB0aGUgVVJJLCB3aXRoIHRoZSBmaWx0ZXIgdGhhdCBzZWxlY3RzIGFsbCBNSU1FIHR5cGVzLgorICAgICAgICBTdHJpbmcgbWltZVR5cGVbXSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXModGVzdFVyaSwgTUlNRV9UWVBFU19BTEwpOworCisgICAgICAgIC8vIFRlc3RzIHRoYXQgdGhlIHJlc3VsdCBpcyBub3QgbnVsbCBhbmQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHZhbHVlLiBBbHNvIHRlc3RzIHRoYXQKKyAgICAgICAgLy8gb25seSBvbmUgTUlNRSB0eXBlIGlzIHJldHVybmVkLgorICAgICAgICBhc3NlcnROb3ROdWxsKG1pbWVUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbWVUeXBlWzBdLCJ0ZXh0L3BsYWluIik7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW1lVHlwZS5sZW5ndGgsMSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdHMgd2l0aCB0aGUgc2FtZSBVUkkgYnV0IHdpdGggYSBmaWx0ZXIgdGhhdCBzaG91bGQgbm90IHJldHVybiBhbnkgVVJJcy4KKyAgICAgICAgICovCisgICAgICAgIG1pbWVUeXBlID0gbU1vY2tSZXNvbHZlci5nZXRTdHJlYW1UeXBlcyh0ZXN0VXJpLCBNSU1FX1RZUEVTX05PTkUpOworICAgICAgICBhc3NlcnROdWxsKG1pbWVUeXBlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUZXN0cyB3aXRoIGEgVVJJIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIHN0cmVhbSBNSU1FIHR5cGVzLCBidXQgd2l0aCBhCisgICAgICAgICAqIGZpbHRlciB0aGF0IHJldHVybnMgYWxsIHR5cGVzLiBUaGUgcmVzdWx0IHNob3VsZCBzdGlsbCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFN0cmVhbVR5cGVzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIE1JTUVfVFlQRVNfQUxMKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtaW1lVHlwZSk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIHB1YmxpYyBBUEkgZm9yIG9wZW5pbmcgYSByZWFkLW9ubHkgcGlwZSBvZiBkYXRhIGZvciBhIG5vdGUgSUQgVVJJCisgICAgICogYW5kIE1JTUUgdHlwZSBmaWx0ZXIgbWF0Y2hpbmcgInRleHQvcGxhaW4iLgorICAgICAqIFRoaXMgbWV0aG9kIHRocm93cyBhIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzbid0IGZvciBhIG5vdGUgSUQgb3IgdGhlIE1JTUUgdHlwZQorICAgICAqIGZpbHRlciBpc24ndCAidGV4dC9wbGFpbiIuIEl0IHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiBpdCBjYW4ndCBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlblR5cGVkQXNzZXRGaWxlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEEgVVJJIHRvIGNvbnRhaW4gYSBub3RlIElEIGNvbnRlbnQgVVJJLgorICAgICAgICBVcmkgdGVzdE5vdGVJZFVyaTsKKworICAgICAgICAvLyBBIGhhbmRsZSBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBvcGVuVHlwZWRBc3NldEZpbGUoKS4KKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciB0ZXN0QXNzZXREZXNjcmlwdG9yOworCisgICAgICAgIC8vIEluc2VydHMgZGF0YSBpbnRvIHRoZSBwcm92aWRlciwgc28gdGhhdCB0aGUgbm90ZSBJRCBVUkkgd2lsbCBiZSByZWNvZ25pemVkLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gQ29uc3RydWN0cyBhIFVSSSB3aXRoIGEgbm90ZSBJRCBvZiAxLiBUaGlzIG1hdGNoZXMgdGhlIG5vdGUgSUQgVVJJIHBhdHRlcm4gdGhhdAorICAgICAgICAvLyBvcGVuVHlwZWRBc3NldEZpbGUgY2FuIGhhbmRsZS4KKyAgICAgICAgdGVzdE5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgICAgLy8gT3BlbnMgdGhlIHBpcGUuIFRoZSBvcHRzIGFyZ3VtZW50IGlzIGZvciBwYXNzaW5nIG9wdGlvbnMgZnJvbSBhIGNhbGxlciB0byB0aGUgcHJvdmlkZXIsCisgICAgICAgIC8vIGJ1dCB0aGUgTm90ZVBhZFByb3ZpZGVyIGRvZXMgbm90IHVzZSBpdC4KKyAgICAgICAgdGVzdEFzc2V0RGVzY3JpcHRvciA9IG1Nb2NrUmVzb2x2ZXIub3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICB0ZXN0Tm90ZUlkVXJpLCAgICAgICAgIC8vIHRoZSBVUkkgZm9yIGEgc2luZ2xlIG5vdGUuIFRoZSBwaXBlIHBvaW50cyB0byB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlJ3MgZGF0YQorICAgICAgICAgICAgICAgIE1JTUVfVFlQRV9URVhULCAgICAgICAgLy8gYSBNSU1FIHR5cGUgb2YgInRleHQvcGxhaW4iCisgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAvLyB0aGUgIm9wdHMiIGFyZ3VtZW50CisgICAgICAgICk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgcGFyY2VsIGZpbGUgaGFuZGxlIGZyb20gdGhlIGFzc2V0IGZpbGUgaGFuZGxlLgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciB0ZXN0UGFyY2VsRGVzY3JpcHRvciA9IHRlc3RBc3NldERlc2NyaXB0b3IuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBmaWxlIGhhbmRsZSBmcm9tIHRoZSBhc3NldCBmaWxlIGhhbmRsZS4KKyAgICAgICAgRmlsZURlc2NyaXB0b3IgdGVzdERlc2NyaXB0b3IgPSB0ZXN0QXNzZXREZXNjcmlwdG9yLmdldEZpbGVEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgYXNzZXQgZmlsZSBoYW5kbGUgaXMgbm90IG51bGwuCisgICAgICAgIGFzc2VydE5vdE51bGwodGVzdEFzc2V0RGVzY3JpcHRvcik7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgcGFyY2VsIGZpbGUgaGFuZGxlIGlzIG5vdCBudWxsLgorICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RQYXJjZWxEZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBUZXN0cyB0aGF0IHRoZSBmaWxlIGhhbmRsZSBpcyBub3QgbnVsbC4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RGVzY3JpcHRvcik7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgZmlsZSBoYW5kbGUgaXMgdmFsaWQuCisgICAgICAgIGFzc2VydFRydWUodGVzdERlc2NyaXB0b3IudmFsaWQoKSk7CisKKyAgICAgICAgLy8gQ2xvc2VzIHRoZSBmaWxlIGhhbmRsZXMuCisgICAgICAgIHRlc3RQYXJjZWxEZXNjcmlwdG9yLmNsb3NlKCk7CisgICAgICAgIHRlc3RBc3NldERlc2NyaXB0b3IuY2xvc2UoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGFuZ2VzIHRoZSBVUkkgdG8gYSBub3RlcyBVUkkgZm9yIG11bHRpcGxlIG5vdGVzLCBhbmQgcmUtdGVzdC4gVGhpcyBzaG91bGQgZmFpbCwgc2luY2UKKyAgICAgICAgICogdGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyB0eXBlIG9mIFVSSS4gQSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uIGlzIGV4cGVjdGVkLAorICAgICAgICAgKiBzbyBjYWxsIGZhaWwoKSBpZiBpdCBkb2VzICpub3QqIG9jY3VyLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RBc3NldERlc2NyaXB0b3IgPSBtTW9ja1Jlc29sdmVyLm9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgICAgIE1JTUVfVFlQRV9URVhULAorICAgICAgICAgICAgICAgICAgICBudWxsCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY29udGludWUKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoYW5nZXMgYmFjayB0byB0aGUgbm90ZSBJRCBVUkksIGJ1dCBjaGFuZ2VzIHRoZSBNSU1FIHR5cGUgZmlsdGVyIHRvIG9uZSB0aGF0IGlzIG5vdAorICAgICAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGlzIHNob3VsZCBhbHNvIGZhaWwsIHNpbmNlIHRoZSBwcm92aWRlciB3aWxsIG9ubHkgb3BlbiBhCisgICAgICAgICAqIHBpcGUgZm9yIE1JTUUgdHlwZSAidGV4dC9wbGFpbiIuIEEgRmlsZU5vdEZvdW5kIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCwgc28gY2FsbHMKKyAgICAgICAgICogZmFpbCgpIGlmIGl0IGRvZXMgKm5vdCogb2NjdXIuCisgICAgICAgICAqLworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0QXNzZXREZXNjcmlwdG9yID0gbU1vY2tSZXNvbHZlci5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICB0ZXN0Tm90ZUlkVXJpLAorICAgICAgICAgICAgICAgICAgICBNSU1FX1RZUEVTX05PTkUsCisgICAgICAgICAgICAgICAgICAgIG51bGwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjb250aW51ZQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIG1ldGhvZCBmb3IgYWN0dWFsbHkgcmV0dXJuaW5nIHdyaXRpbmcgZGF0YSBpbnRvIGEgcGlwZS4gVGhlIG1ldGhvZCBpcworICAgICAqIHdyaXRlRGF0YVRvUGlwZSwgYnV0IHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgZGlyZWN0bHkuIEluc3RlYWQsIGEgY2FsbGVyIGludm9rZXMKKyAgICAgKiBvcGVuVHlwZWRBc3NldEZpbGUoKS4gVGhhdCBtZXRob2QgdXNlcyBDb250ZW50UHJvdmlkZXIub3BlblBpcGVIZWxwZXIoKSwgd2hpY2ggaGFzIGFzIG9uZSBvZgorICAgICAqIGl0cyBhcmd1bWVudHMgYSBDb250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXIgb2JqZWN0IHRoYXQgbXVzdCBhY3R1YWxseSBwdXQgdGhlIGRhdGEgaW50bworICAgICAqIHRoZSBwaXBlLiBQaXBlRGF0YVdyaXRlciBpcyBhbiBpbnRlcmZhY2UsIG5vdCBhIGNsYXNzLCBzbyBpdCBtdXN0IGJlIGltcGxlbWVudGVkLgorICAgICAqCisgICAgICogVGhlIE5vdGVQYWRQcm92aWRlciBjbGFzcyBpdHNlbGYgaW1wbGVtZW50cyB0aGUgIkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciwgd2hpY2ggbWVhbnMKKyAgICAgKiB0aGF0IGl0IHN1cHBsaWVzIHRoZSBpbnRlcmZhY2UncyBvbmx5IG1ldGhvZCwgd3JpdGVEYXRhVG9QaXBlKCkuIEluIGVmZmVjdCwgYSBjYWxsIHRvCisgICAgICogb3BlblR5cGVkQXNzZXRGaWxlKCkgY2FsbHMgd3JpdGVEYXRhVG9QaXBlKCkuCisgICAgICoKKyAgICAgKiAgVGhlIHRlc3Qgb2Ygd3JpdGVEYXRhVG9QaXBlKCkgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciB0ZXN0cyBvZiBvcGVuVHlwZWRBc3NldEZpbGUoKSBmb3IgdGhlCisgICAgICogIHNha2Ugb2YgY2xhcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVEYXRhVG9QaXBlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQSBzdHJpbmcgYXJyYXkgdG8gaG9sZCB0aGUgaW5jb21pbmcgZGF0YQorICAgICAgICBTdHJpbmdbXSBpbnB1dERhdGEgPSB7IiIsIiIsIiJ9OworCisgICAgICAgIC8vIEEgVVJJIGZvciBhIG5vdGUgSUQuCisgICAgICAgIFVyaSBub3RlSWRVcmk7CisKKyAgICAgICAgLy8gQSBDdXJzb3IgdG8gY29udGFpbiB0aGUgcmV0cmlldmVkIG5vdGUuCisgICAgICAgIEN1cnNvciBub3RlSWRDdXJzb3I7CisKKyAgICAgICAgLy8gQW4gQXNzZXRGaWxlRGVzY3JpcHRvciBmb3IgdGhlIHBpcGUuCisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3Igbm90ZUlkQXNzZXREZXNjcmlwdG9yOworCisgICAgICAgIC8vIFRoZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgQXNzZXRGaWxlRGVzY3JpcHRvcgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBub3RlSWRQYXJjZWxEZXNjcmlwdG9yOworCisgICAgICAgIC8vIEluc2VydHMgdGVzdCBkYXRhIGludG8gdGhlIHByb3ZpZGVyLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlcyBub3RlIElEIFVSSSBmb3IgYSBub3RlIHRoYXQgc2hvdWxkIG5vdyBiZSBpbiB0aGUgcHJvdmlkZXIuCisgICAgICAgIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgIC8vIFRoZSBiYXNlIHBhdHRlcm4gZm9yIGEgbm90ZSBJRCBVUkkKKyAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVUkkgdG8gcG9pbnQgdG8gcmVjb3JkIElEIDEgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBHZXRzIGEgQ3Vyc29yIGZvciB0aGUgbm90ZS4KKyAgICAgICAgbm90ZUlkQ3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgICBub3RlSWRVcmksICAvLyB0aGUgVVJJIGZvciB0aGUgbm90ZSBJRCB3ZSB3YW50IHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgcmV0cmlldmUgYWxsIHRoZSBjb2x1bW5zCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gV0hFUkUgY2xhdXNlCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy8gbm8gV0hFUkUgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgbnVsbCAgICAgICAgLy8gZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ2hlY2tzIHRoYXQgdGhlIGNhbGwgd29ya2VkLgorICAgICAgICAvLyBhKSBDaGVja3MgdGhhdCB0aGUgY3Vyc29yIGlzIG5vdCBudWxsCisgICAgICAgIC8vIGIpIENoZWNrcyB0aGF0IGl0IGNvbnRhaW5zIGEgc2luZ2xlIHJlY29yZAorICAgICAgICBhc3NlcnROb3ROdWxsKG5vdGVJZEN1cnNvcik7CisgICAgICAgIGFzc2VydEVxdWFscygxLG5vdGVJZEN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBPcGVucyB0aGUgcGlwZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGF0YS4KKyAgICAgICAgbm90ZUlkQXNzZXREZXNjcmlwdG9yID0gbU1vY2tSZXNvbHZlci5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIG5vdGVJZFVyaSwgICAgICAgIC8vIHRoZSBVUkkgb2YgdGhlIG5vdGUgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICBNSU1FX1RZUEVfVEVYVCwgICAvLyB0aGUgInRleHQvcGxhaW4iIE1JTUUgdHlwZQorICAgICAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgIC8vIG5vIG90aGVyIG9wdGlvbnMKKyAgICAgICAgKTsKKworICAgICAgICAvLyBDaGVja3MgdGhhdCB0aGUgY2FsbCB3b3JrZWQuCisgICAgICAgIC8vIGEpIGNoZWNrcyB0aGF0IHRoZSBBc3NldEZpbGVEZXNjcmlwdG9yIGlzIG5vdCBudWxsCisgICAgICAgIC8vIGIpIGdldHMgaXRzIFBhcmNlbEZpbGVEZXNjcmlwdG9yCisgICAgICAgIC8vIGMpIGNoZWNrcyB0aGF0IHRoZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBpcyBub3QgbnVsbAorICAgICAgICBhc3NlcnROb3ROdWxsKG5vdGVJZEFzc2V0RGVzY3JpcHRvcik7CisgICAgICAgIG5vdGVJZFBhcmNlbERlc2NyaXB0b3IgPSBub3RlSWRBc3NldERlc2NyaXB0b3IuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChub3RlSWRQYXJjZWxEZXNjcmlwdG9yKTsKKworICAgICAgICAvLyBHZXRzIGEgRmlsZSBSZWFkZXIgdGhhdCBjYW4gcmVhZCB0aGUgcGlwZS4KKyAgICAgICAgRmlsZVJlYWRlciBmSW4gPSBuZXcgRmlsZVJlYWRlcihub3RlSWRQYXJjZWxEZXNjcmlwdG9yLmdldEZpbGVEZXNjcmlwdG9yKCkpOworCisgICAgICAgIC8vIEdldHMgYSBidWZmZXJlZCByZWFkZXIgd3JhcHBlciBmb3IgdGhlIEZpbGUgUmVhZGVyLiBUaGlzIGFsbG93cyByZWFkaW5nIGxpbmUgYnkgbGluZS4KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYkluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZJbik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHBpcGUgc2hvdWxkIGNvbnRhaW4gdGhyZWUgbGluZXM6IFRoZSBub3RlJ3MgdGl0bGUsIGFuIGVtcHR5IGxpbmUsIGFuZCB0aGUgbm90ZSdzCisgICAgICAgICAqIGNvbnRlbnRzLiBUaGUgZm9sbG93aW5nIGNvZGUgcmVhZHMgYW5kIHN0b3JlcyB0aGVzZSB0aHJlZSBsaW5lcy4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpbnB1dERhdGEubGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlucHV0RGF0YVtpbmRleF0gPSBiSW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIHByb3ZpZGVyICh3cml0dGVuIGZyb20gVEVTVF9OT1RFU1swXSkgaGFzIHRoZSBzYW1lCisgICAgICAgIC8vIG5vdGUgdGl0bGUgYXMgdGhlIGZpcnN0IGxpbmUgcmV0cmlldmVkIGZyb20gdGhlIHBpcGUuCisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05PVEVTWzBdLnRpdGxlLCBpbnB1dERhdGFbMF0pOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBwcm92aWRlciAod3JpdHRlbiBmcm9tIFRFU1RfTk9URVNbMF0pIGhhcyB0aGUgc2FtZQorICAgICAgICAvLyBub3RlIGNvbnRlbnRzIGFzIHRoZSB0aGlyZCBsaW5lIHJldHJpZXZlZCBmcm9tIHRoZSBwaXBlLgorICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OT1RFU1swXS5ub3RlLCBpbnB1dERhdGFbMl0pOworICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgdGhlIHByb3ZpZGVyJ3MgcHVibGljIEFQSSBmb3IgcXVlcnlpbmcgZGF0YSBpbiB0aGUgdGFibGUsIHVzaW5nIHRoZSBVUkkgZm9yCisgICAgICogYSBkYXRhc2V0IG9mIHJlY29yZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJpZXNPbk5vdGVzVXJpKCkgeworICAgICAgICAvLyBEZWZpbmVzIGEgcHJvamVjdGlvbiBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0dXJuIGZvciBhIHF1ZXJ5CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIFRFU1RfUFJPSkVDVElPTiA9IHsKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFCisgICAgICAgIH07CisKKyAgICAgICAgLy8gRGVmaW5lcyBhIHNlbGVjdGlvbiBjb2x1bW4gZm9yIHRoZSBxdWVyeS4gV2hlbiB0aGUgc2VsZWN0aW9uIGNvbHVtbnMgYXJlIHBhc3NlZAorICAgICAgICAvLyB0byB0aGUgcXVlcnksIHRoZSBzZWxlY3Rpb24gYXJndW1lbnRzIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycy4KKyAgICAgICAgZmluYWwgU3RyaW5nIFRJVExFX1NFTEVDVElPTiA9IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiID0gIiArICI/IjsKKworICAgICAgICAvLyBEZWZpbmVzIHRoZSBzZWxlY3Rpb24gY29sdW1ucyBmb3IgYSBxdWVyeS4KKyAgICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0KKyAgICAgICAgICAgIFRJVExFX1NFTEVDVElPTiArICIgT1IgIiArIFRJVExFX1NFTEVDVElPTiArICIgT1IgIiArIFRJVExFX1NFTEVDVElPTjsKKworICAgICAgICAgLy8gRGVmaW5lcyB0aGUgYXJndW1lbnRzIGZvciB0aGUgc2VsZWN0aW9uIGNvbHVtbnMuCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIFNFTEVDVElPTl9BUkdTID0geyAiTm90ZTAiLCAiTm90ZTEiLCAiTm90ZTUiIH07CisKKyAgICAgICAgIC8vIERlZmluZXMgYSBxdWVyeSBzb3J0IG9yZGVyCisgICAgICAgIGZpbmFsIFN0cmluZyBTT1JUX09SREVSID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgQVNDIjsKKworICAgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDEuCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyByZWNvcmRzIGluIHRoZSB0YWJsZSwgdGhlIHJldHVybmVkIGN1cnNvciBmcm9tIGEgcXVlcnkgc2hvdWxkIGJlIGVtcHR5LgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgZ2V0IGFsbCBjb2x1bW5zCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhLCBnZXQgYWxsIHJlY29yZHMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZWxlY3Rpb24gYXJndW1lbnRzCisgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHJldHVybmVkIGN1cnNvciBjb250YWlucyBubyByZWNvcmRzCisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgIC8vIFF1ZXJ5IHN1YnRlc3QgMi4KKyAgICAgICAgIC8vIElmIHRoZSB0YWJsZSBjb250YWlucyByZWNvcmRzLCB0aGUgcmV0dXJuZWQgY3Vyc29yIGZyb20gYSBxdWVyeSBzaG91bGQgY29udGFpbiByZWNvcmRzLgorCisgICAgICAgIC8vIEluc2VydHMgdGhlIHRlc3QgZGF0YSBpbnRvIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UKKyAgICAgICAgaW5zZXJ0RGF0YSgpOworCisgICAgICAgIC8vIEdldHMgYWxsIHRoZSBjb2x1bW5zIGZvciBhbGwgdGhlIHJvd3MgaW4gdGhlIHRhYmxlCisgICAgICAgIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAgLy8gdGhlIFVSSSBmb3IgdGhlIG1haW4gZGF0YSB0YWJsZQorICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIGdldCBhbGwgY29sdW1ucworICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgZ2V0IGFsbCByZWNvcmRzCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGFyZ3VtZW50cworICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHNvcnQgb3JkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHJldHVybmVkIGN1cnNvciBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgLy8gdGVzdCBkYXRhIGFycmF5LgorICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9OT1RFUy5sZW5ndGgsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDMuCisgICAgICAgIC8vIEEgcXVlcnkgdGhhdCB1c2VzIGEgcHJvamVjdGlvbiBzaG91bGQgcmV0dXJuIGEgY3Vyc29yIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMKKyAgICAgICAgLy8gYXMgdGhlIHByb2plY3Rpb24sIHdpdGggdGhlIHNhbWUgbmFtZXMsIGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAgICBDdXJzb3IgcHJvamVjdGlvbkN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICAgIFRFU1RfUFJPSkVDVElPTiwgICAgICAgICAgICAvLyBnZXQgdGhlIHRpdGxlLCBub3RlLCBhbmQgbW9kIGRhdGUgY29sdW1ucworICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNvbHVtbnMsIGdldCBhbGwgdGhlIHJlY29yZHMKKyAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYQorICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgdGhlIHNvcnQgb3JkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBjdXJzb3IgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIHByb2plY3Rpb24KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPSkVDVElPTi5sZW5ndGgsIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uQ291bnQoKSk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgY3Vyc29yIGFuZCBpbiB0aGUgcHJvamVjdGlvbiBhcmUgdGhlIHNhbWUuCisgICAgICAgIC8vIFRoaXMgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBuYW1lcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMF0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMV0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BST0pFQ1RJT05bMl0sIHByb2plY3Rpb25DdXJzb3IuZ2V0Q29sdW1uTmFtZSgyKSk7CisKKyAgICAgICAgLy8gUXVlcnkgc3VidGVzdCA0CisgICAgICAgIC8vIEEgcXVlcnkgdGhhdCB1c2VzIHNlbGVjdGlvbiBjcml0ZXJpYSBzaG91bGQgcmV0dXJuIG9ubHkgdGhvc2Ugcm93cyB0aGF0IG1hdGNoIHRoZQorICAgICAgICAvLyBjcml0ZXJpYS4gVXNlIGEgcHJvamVjdGlvbiBzbyB0aGF0IGl0J3MgZWFzeSB0byBnZXQgdGhlIGRhdGEgaW4gYSBwYXJ0aWN1bGFyIGNvbHVtbi4KKyAgICAgICAgcHJvamVjdGlvbkN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICBURVNUX1BST0pFQ1RJT04sICAgICAgICAgICAvLyBnZXQgdGhlIHRpdGxlLCBub3RlLCBhbmQgbW9kIGRhdGUgY29sdW1ucworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2VsZWN0IG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgIC8vIHNlbGVjdCB0aXRsZXMgIk5vdGUwIiwgIk5vdGUxIiwgb3IgIk5vdGU1IgorICAgICAgICAgICAgU09SVF9PUkRFUiAgICAgICAgICAgICAgICAgLy8gc29ydCBhc2NlbmRpbmcgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyB0aGUgbnVtYmVyIG9mIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNFTEVDVElPTl9BUkdTLmxlbmd0aCwgcHJvamVjdGlvbkN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIHdoaWxlIChwcm9qZWN0aW9uQ3Vyc29yLm1vdmVUb05leHQoKSkgeworCisgICAgICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIHNlbGVjdGlvbiBhcmd1bWVudCBhdCB0aGUgY3VycmVudCBpbmRleCBtYXRjaGVzIHRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgLy8gdGhlIHRpdGxlIGNvbHVtbiAoY29sdW1uIDApIGluIHRoZSBjdXJyZW50IHJlY29yZCBvZiB0aGUgY3Vyc29yCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRUNUSU9OX0FSR1NbaW5kZXhdLCBwcm9qZWN0aW9uQ3Vyc29yLmdldFN0cmluZygwKSk7CisKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGluZGV4IHBvaW50ZXIgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygc2VsZWN0aW9uIGFyZ3VtZW50cywgc28KKyAgICAgICAgLy8gdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0ZXN0ZWQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQuCisgICAgICAgIGFzc2VydEVxdWFscyhTRUxFQ1RJT05fQVJHUy5sZW5ndGgsIGluZGV4KTsKKworICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgcXVlcmllcyBhZ2FpbnN0IHRoZSBwcm92aWRlciwgdXNpbmcgdGhlIG5vdGUgaWQgVVJJLiBUaGlzIFVSSSBlbmNvZGVzIGEgc2luZ2xlCisgICAgICogcmVjb3JkIElELiBUaGUgcHJvdmlkZXIgc2hvdWxkIG9ubHkgcmV0dXJuIDAgb3IgMSByZWNvcmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJpZXNPbk5vdGVJZFVyaSgpIHsKKyAgICAgIC8vIERlZmluZXMgdGhlIHNlbGVjdGlvbiBjb2x1bW4gZm9yIGEgcXVlcnkuIFRoZSAiPyIgaXMgcmVwbGFjZWQgYnkgZW50cmllcyBpbiB0aGUKKyAgICAgIC8vIHNlbGVjdGlvbiBhcmd1bWVudCBhcnJheQorICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAvLyBEZWZpbmVzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHNlbGVjdGlvbiBjb2x1bW4uCisgICAgICBmaW5hbCBTdHJpbmdbXSBTRUxFQ1RJT05fQVJHUyA9IHsgIk5vdGUxIiB9OworCisgICAgICAvLyBBIHNvcnQgb3JkZXIgZm9yIHRoZSBxdWVyeS4KKyAgICAgIGZpbmFsIFN0cmluZyBTT1JUX09SREVSID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgQVNDIjsKKworICAgICAgLy8gQ3JlYXRlcyBhIHByb2plY3Rpb24gaW5jbHVkZXMgdGhlIG5vdGUgaWQgY29sdW1uLCBzbyB0aGF0IG5vdGUgaWQgY2FuIGJlIHJldHJpZXZlZC4KKyAgICAgIGZpbmFsIFN0cmluZ1tdIE5PVEVfSURfUFJPSkVDVElPTiA9IHsKKyAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5fSUQsICAgICAgICAgICAgICAgICAvLyBUaGUgTm90ZXMgY2xhc3MgZXh0ZW5kcyBCYXNlQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpbmNsdWRlcyBfSUQgYXMgdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQncyBpZCBpbiB0aGUgZGF0YSBtb2RlbAorICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFfTsgIC8vIFRoZSBub3RlJ3MgdGl0bGUKKworICAgICAgLy8gUXVlcnkgc3VidGVzdCAxLgorICAgICAgLy8gVGVzdHMgdGhhdCBhIHF1ZXJ5IGFnYWluc3QgYW4gZW1wdHkgdGFibGUgcmV0dXJucyBudWxsLgorCisgICAgICAvLyBDb25zdHJ1Y3RzIGEgVVJJIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZXIncyBub3RlcyBpZCBVUkkgcGF0dGVybiwgdXNpbmcgYW4gYXJiaXRyYXJ5CisgICAgICAvLyB2YWx1ZSBvZiAxIGFzIHRoZSBub3RlIElELgorICAgICAgVXJpIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgMSk7CisKKyAgICAgIC8vIFF1ZXJpZXMgdGhlIHRhYmxlIHdpdGggdGhlIG5vdGVzIElEIFVSSS4gVGhpcyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGN1cnNvci4KKyAgICAgIEN1cnNvciBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgIG5vdGVJZFVyaSwgLy8gVVJJIHBvaW50aW5nIHRvIGEgc2luZ2xlIHJlY29yZAorICAgICAgICAgIG51bGwsICAgICAgLy8gbm8gcHJvamVjdGlvbiwgZ2V0IGFsbCB0aGUgY29sdW1ucyBmb3IgZWFjaCByZWNvcmQKKyAgICAgICAgICBudWxsLCAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgZ2V0IGFsbCB0aGUgcmVjb3JkcyBpbiB0aGUgdGFibGUKKyAgICAgICAgICBudWxsLCAgICAgIC8vIG5vIG5lZWQgZm9yIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICBudWxsICAgICAgIC8vIGRlZmF1bHQgc29ydCwgYnkgYXNjZW5kaW5nIHRpdGxlCisgICAgICApOworCisgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGN1cnNvciBpcyBudWxsLgorICAgICAgYXNzZXJ0RXF1YWxzKDAsY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDIuCisgICAgICAvLyBUZXN0cyB0aGF0IGEgcXVlcnkgYWdhaW5zdCBhIHRhYmxlIGNvbnRhaW5pbmcgcmVjb3JkcyByZXR1cm5zIGEgc2luZ2xlIHJlY29yZCB3aG9zZSBJRAorICAgICAgLy8gaXMgdGhlIG9uZSByZXF1ZXN0ZWQgaW4gdGhlIFVSSSBwcm92aWRlZC4KKworICAgICAgLy8gSW5zZXJ0cyB0aGUgdGVzdCBkYXRhIGludG8gdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyBkYXRhIHNvdXJjZS4KKyAgICAgIGluc2VydERhdGEoKTsKKworICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgdXNpbmcgdGhlIFVSSSBmb3IgdGhlIGZ1bGwgdGFibGUuCisgICAgICBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBiYXNlIFVSSSBmb3IgdGhlIHRhYmxlCisgICAgICAgICAgTk9URV9JRF9QUk9KRUNUSU9OLCAgICAgICAgLy8gcmV0dXJucyB0aGUgSUQgYW5kIHRpdGxlIGNvbHVtbnMgb2Ygcm93cworICAgICAgICAgIFNFTEVDVElPTl9DT0xVTU5TLCAgICAgICAgIC8vIHNlbGVjdCBiYXNlZCBvbiB0aGUgdGl0bGUgY29sdW1uCisgICAgICAgICAgU0VMRUNUSU9OX0FSR1MsICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlIG9mICJOb3RlMSIKKyAgICAgICAgICBTT1JUX09SREVSICAgICAgICAgICAgICAgICAvLyBzb3J0IG9yZGVyIHJldHVybmVkIGlzIGJ5IHRpdGxlLCBhc2NlbmRpbmcKKyAgICAgICk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGNvbnRhaW5zIG9ubHkgb25lIHJvdy4KKyAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgIC8vIE1vdmVzIHRvIHRoZSBjdXJzb3IncyBmaXJzdCByb3csIGFuZCBhc3NlcnRzIHRoYXQgdGhpcyBkaWQgbm90IGZhaWwuCisgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKworICAgICAgLy8gU2F2ZXMgdGhlIHJlY29yZCdzIG5vdGUgSUQuCisgICAgICBpbnQgaW5wdXROb3RlSWQgPSBjdXJzb3IuZ2V0SW50KDApOworCisgICAgICAvLyBCdWlsZHMgYSBVUkkgYmFzZWQgb24gdGhlIHByb3ZpZGVyJ3MgY29udGVudCBJRCBVUkkgYmFzZSBhbmQgdGhlIHNhdmVkIG5vdGUgSUQuCisgICAgICBub3RlSWRVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX0JBU0UsIGlucHV0Tm90ZUlkKTsKKworICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgdXNpbmcgdGhlIGNvbnRlbnQgSUQgVVJJLCB3aGljaCByZXR1cm5zIGEgc2luZ2xlIHJlY29yZCB3aXRoIHRoZQorICAgICAgLy8gc3BlY2lmaWVkIG5vdGUgSUQsIG1hdGNoaW5nIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgcHJvdmlkZWQuCisgICAgICBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KG5vdGVJZFVyaSwgLy8gdGhlIFVSSSBmb3IgYSBzaW5nbGUgbm90ZQorICAgICAgICAgIE5PVEVfSURfUFJPSkVDVElPTiwgICAgICAgICAgICAgICAgIC8vIHNhbWUgcHJvamVjdGlvbiwgZ2V0IElEIGFuZCB0aXRsZSBjb2x1bW5zCisgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24sIGJhc2VkIG9uIHRpdGxlIGNvbHVtbgorICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgc2VsZWN0aW9uIGFyZ3VtZW50cywgdGl0bGUgPSAiTm90ZTEiCisgICAgICAgICAgU09SVF9PUkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzb3J0IG9yZGVyIHJldHVybmVkLCBieSB0aXRsZSwgYXNjZW5kaW5nCisgICAgICApOworCisgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGN1cnNvciBjb250YWlucyBvbmx5IG9uZSByb3cuCisgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAvLyBNb3ZlcyB0byB0aGUgY3Vyc29yJ3MgZmlyc3Qgcm93LCBhbmQgYXNzZXJ0cyB0aGF0IHRoaXMgZGlkIG5vdCBmYWlsLgorICAgICAgYXNzZXJ0VHJ1ZShjdXJzb3IubW92ZVRvRmlyc3QoKSk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgbm90ZSBJRCBwYXNzZWQgdG8gdGhlIHByb3ZpZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBub3RlIElEIHJldHVybmVkLgorICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0Tm90ZUlkLCBjdXJzb3IuZ2V0SW50KDApKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBUZXN0cyBpbnNlcnRzIGludG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydHMoKSB7CisgICAgICAgIC8vIENyZWF0ZXMgYSBuZXcgbm90ZSBpbnN0YW5jZSB3aXRoIElEIG9mIDMwLgorICAgICAgICBOb3RlSW5mbyBub3RlID0gbmV3IE5vdGVJbmZvKAorICAgICAgICAgICAgIk5vdGUzMCIsIC8vIHRoZSBub3RlJ3MgdGl0bGUKKyAgICAgICAgICAgICJUZXN0IGluc2VydGluZyBhIG5vdGUiIC8vIHRoZSBub3RlJ3MgY29udGVudAorICAgICAgICApOworCisgICAgICAgIC8vIFNldHMgdGhlIG5vdGUncyBjcmVhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzCisgICAgICAgIG5vdGUuc2V0Q3JlYXRpb25EYXRlKFNUQVJUX0RBVEUgKyAoMTAgKiBPTkVfREFZX01JTExJUykpOworICAgICAgICBub3RlLnNldE1vZGlmaWNhdGlvbkRhdGUoU1RBUlRfREFURSArICgyICogT05FX1dFRUtfTUlMTElTKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHN1YnRlc3QgMS4KKyAgICAgICAgLy8gSW5zZXJ0cyBhIHJvdyB1c2luZyB0aGUgbmV3IG5vdGUgaW5zdGFuY2UuCisgICAgICAgIC8vIE5vIGFzc2VydGlvbiB3aWxsIGJlIGRvbmUuIFRoZSBpbnNlcnQoKSBtZXRob2QgZWl0aGVyIHdvcmtzIG9yIHRocm93cyBhbiBFeGNlcHRpb24KKyAgICAgICAgVXJpIHJvd1VyaSA9IG1Nb2NrUmVzb2x2ZXIuaW5zZXJ0KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBtYWluIHRhYmxlIFVSSQorICAgICAgICAgICAgbm90ZS5nZXRDb250ZW50VmFsdWVzKCkgICAgIC8vIHRoZSBtYXAgb2YgdmFsdWVzIHRvIGluc2VydCBhcyBhIG5ldyByZWNvcmQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBQYXJzZXMgdGhlIHJldHVybmVkIFVSSSB0byBnZXQgdGhlIG5vdGUgSUQgb2YgdGhlIG5ldyBub3RlLiBUaGUgSUQgaXMgdXNlZCBpbiBzdWJ0ZXN0IDIuCisgICAgICAgIGxvbmcgbm90ZUlkID0gQ29udGVudFVyaXMucGFyc2VJZChyb3dVcmkpOworCisgICAgICAgIC8vIERvZXMgYSBmdWxsIHF1ZXJ5IG9uIHRoZSB0YWJsZS4gU2luY2UgaW5zZXJ0RGF0YSgpIGhhc24ndCB5ZXQgYmVlbiBjYWxsZWQsIHRoZQorICAgICAgICAvLyB0YWJsZSBzaG91bGQgb25seSBjb250YWluIHRoZSByZWNvcmQganVzdCBpbnNlcnRlZC4KKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgbWFpbiB0YWJsZSBVUkkKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIHJldHVybiBhbGwgdGhlIGNvbHVtbnMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBjcml0ZXJpYSwgcmV0dXJuIGFsbCB0aGUgcm93cyBpbiB0aGUgbW9kZWwKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGVyZSBzaG91bGQgYmUgb25seSAxIHJlY29yZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAvLyBNb3ZlcyB0byB0aGUgZmlyc3QgKGFuZCBvbmx5KSByZWNvcmQgaW4gdGhlIGN1cnNvciBhbmQgYXNzZXJ0cyB0aGF0IHRoaXMgd29ya2VkLgorICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKworICAgICAgICAvLyBTaW5jZSBubyBwcm9qZWN0aW9uIHdhcyB1c2VkLCBnZXQgdGhlIGNvbHVtbiBpbmRleGVzIG9mIHRoZSByZXR1cm5lZCBjb2x1bW5zCisgICAgICAgIGludCB0aXRsZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpOworICAgICAgICBpbnQgbm90ZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSk7CisgICAgICAgIGludCBjcmRhdGVJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFKTsKKyAgICAgICAgaW50IG1vZGRhdGVJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFKTsKKworICAgICAgICAvLyBUZXN0cyBlYWNoIGNvbHVtbiBpbiB0aGUgcmV0dXJuZWQgY3Vyc29yIGFnYWluc3QgdGhlIGRhdGEgdGhhdCB3YXMgaW5zZXJ0ZWQsIGNvbXBhcmluZworICAgICAgICAvLyB0aGUgZmllbGQgaW4gdGhlIE5vdGVJbmZvIG9iamVjdCB0byB0aGUgZGF0YSBhdCB0aGUgY29sdW1uIGluZGV4IGluIHRoZSBjdXJzb3IuCisgICAgICAgIGFzc2VydEVxdWFscyhub3RlLnRpdGxlLCBjdXJzb3IuZ2V0U3RyaW5nKHRpdGxlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUubm90ZSwgY3Vyc29yLmdldFN0cmluZyhub3RlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUuY3JlYXRlRGF0ZSwgY3Vyc29yLmdldExvbmcoY3JkYXRlSW5kZXgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUubW9kRGF0ZSwgY3Vyc29yLmdldExvbmcobW9kZGF0ZUluZGV4KSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHN1YnRlc3QgMi4KKyAgICAgICAgLy8gVGVzdHMgdGhhdCB3ZSBjYW4ndCBpbnNlcnQgYSByZWNvcmQgd2hvc2UgaWQgdmFsdWUgYWxyZWFkeSBleGlzdHMuCisKKyAgICAgICAgLy8gRGVmaW5lcyBhIENvbnRlbnRWYWx1ZXMgb2JqZWN0IHNvIHRoYXQgdGhlIHRlc3QgY2FuIGFkZCBhIG5vdGUgSUQgdG8gaXQuCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbm90ZS5nZXRDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgLy8gQWRkcyB0aGUgbm90ZSBJRCByZXRyaWV2ZWQgaW4gc3VidGVzdCAxIHRvIHRoZSBDb250ZW50VmFsdWVzIG9iamVjdC4KKyAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLl9JRCwgKGludCkgbm90ZUlkKTsKKworICAgICAgICAvLyBUcmllcyB0byBpbnNlcnQgdGhpcyByZWNvcmQgaW50byB0aGUgdGFibGUuIFRoaXMgc2hvdWxkIGZhaWwgYW5kIGRyb3AgaW50byB0aGUKKyAgICAgICAgLy8gY2F0Y2ggYmxvY2suIElmIGl0IHN1Y2NlZWRzLCBpc3N1ZSBhIGZhaWx1cmUgbWVzc2FnZS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJvd1VyaSA9IG1Nb2NrUmVzb2x2ZXIuaW5zZXJ0KE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBpbnNlcnQgZmFpbHVyZSBmb3IgZXhpc3RpbmcgcmVjb3JkIGJ1dCBpbnNlcnQgc3VjY2VlZGVkLiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIHN1Y2NlZWRlZCwgc28gZG8gbm90aGluZy4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGVzdHMgZGVsZXRpb25zIGZyb20gdGhlIGRhdGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZXMoKSB7CisgICAgICAgIC8vIFN1YnRlc3QgMS4KKyAgICAgICAgLy8gVHJpZXMgdG8gZGVsZXRlIGEgcmVjb3JkIGZyb20gYSBkYXRhIG1vZGVsIHRoYXQgaXMgZW1wdHkuCisKKyAgICAgICAgLy8gU2V0cyB0aGUgc2VsZWN0aW9uIGNvbHVtbiB0byAidGl0bGUiCisgICAgICAgIGZpbmFsIFN0cmluZyBTRUxFQ1RJT05fQ09MVU1OUyA9IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiID0gIiArICI/IjsKKworICAgICAgICAvLyBTZXRzIHRoZSBzZWxlY3Rpb24gYXJndW1lbnQgIk5vdGUwIgorICAgICAgICBmaW5hbCBTdHJpbmdbXSBTRUxFQ1RJT05fQVJHUyA9IHsgIk5vdGUwIiB9OworCisgICAgICAgIC8vIFRyaWVzIHRvIGRlbGV0ZSByb3dzIG1hdGNoaW5nIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZnJvbSB0aGUgZGF0YSBtb2RlbC4KKyAgICAgICAgaW50IHJvd3NEZWxldGVkID0gbU1vY2tSZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgYmFzZSBVUkkgb2YgdGhlIHRhYmxlCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAvLyBzZWxlY3QgYmFzZWQgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgU0VMRUNUSU9OX0FSR1MgICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlID0gIk5vdGUwIgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBkZWxldGlvbiBkaWQgbm90IHdvcmsuIFRoZSBudW1iZXIgb2YgZGVsZXRlZCByb3dzIHNob3VsZCBiZSB6ZXJvLgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcm93c0RlbGV0ZWQpOworCisgICAgICAgIC8vIFN1YnRlc3QgMi4KKyAgICAgICAgLy8gVHJpZXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIHJlY29yZC4gUmVwZWF0cyB0aGUgcHJldmlvdXMgc3VidGVzdCwgYnV0IGluc2VydHMgZGF0YSBmaXJzdC4KKworICAgICAgICAvLyBJbnNlcnRzIGRhdGEgaW50byB0aGUgbW9kZWwuCisgICAgICAgIGluc2VydERhdGEoKTsKKworICAgICAgICAvLyBVc2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgdG8gdHJ5IHRvIGRlbGV0ZSB0aGUgcm93IHdpdGggdGl0bGUgIk5vdGUwIgorICAgICAgICByb3dzRGVsZXRlZCA9IG1Nb2NrUmVzb2x2ZXIuZGVsZXRlKAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgLy8gdGhlIGJhc2UgVVJJIG9mIHRoZSB0YWJsZQorICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24gY29sdW1uLCAidGl0bGUiCisgICAgICAgICAgICBTRUxFQ1RJT05fQVJHUyAgICAgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiBhcmd1bWVudHMsIHRpdGxlID0gIk5vdGUwIgorICAgICAgICApOworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZGVsZXRlZCByb3dzIHNob3VsZCBiZSAxLgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcm93c0RlbGV0ZWQpOworCisgICAgICAgIC8vIFRlc3RzIHRoYXQgdGhlIHJlY29yZCBubyBsb25nZXIgZXhpc3RzLiBUcmllcyB0byBnZXQgaXQgZnJvbSB0aGUgdGFibGUsIGFuZAorICAgICAgICAvLyBhc3NlcnRzIHRoYXQgbm90aGluZyB3YXMgcmV0dXJuZWQuCisKKyAgICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgd2l0aCB0aGUgc2FtZSBzZWxlY3Rpb24gY29sdW1uIGFuZCBhcmd1bWVudCB1c2VkIHRvIGRlbGV0ZSB0aGUgcm93LgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBiYXNlIFVSSSBvZiB0aGUgdGFibGUKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb2plY3Rpb24sIHJldHVybiBhbGwgY29sdW1ucworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2VsZWN0IGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIFNFTEVDVElPTl9BUkdTLCAgICAgICAgICAgIC8vIHNlbGVjdCB0aXRsZSA9ICJOb3RlMCIKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBjdXJzb3IgaXMgZW1wdHkgc2luY2UgdGhlIHJlY29yZCBoYWQgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0cyB1cGRhdGVzIHRvIHRoZSBkYXRhIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVzKCkgeworICAgICAgICAvLyBTZWxlY3Rpb24gY29sdW1uIGZvciBpZGVudGlmeWluZyBhIHJlY29yZCBpbiB0aGUgZGF0YSBtb2RlbC4KKyAgICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAgIC8vIFNlbGVjdGlvbiBhcmd1bWVudCBmb3IgdGhlIHNlbGVjdGlvbiBjb2x1bW4uCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSB7ICJOb3RlMSIgfTsKKworICAgICAgICAvLyBEZWZpbmVzIGEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgdmFsdWVzCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICAvLyBTdWJ0ZXN0IDEuCisgICAgICAgIC8vIFRyaWVzIHRvIHVwZGF0ZSBhIHJlY29yZCBpbiBhbiBlbXB0eSB0YWJsZS4KKworICAgICAgICAvLyBTZXRzIHVwIHRoZSB1cGRhdGUgYnkgcHV0dGluZyB0aGUgIm5vdGUiIGNvbHVtbiBhbmQgYSB2YWx1ZSBpbnRvIHRoZSB2YWx1ZXMgbWFwLgorICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIlRlc3RpbmcgYW4gdXBkYXRlIHdpdGggdGhpcyBzdHJpbmciKTsKKworICAgICAgICAvLyBUcmllcyB0byB1cGRhdGUgdGhlIHRhYmxlCisgICAgICAgIGludCByb3dzVXBkYXRlZCA9IG1Nb2NrUmVzb2x2ZXIudXBkYXRlKAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBVUkkgb2YgdGhlIGRhdGEgdGFibGUKKyAgICAgICAgICAgIHZhbHVlcywgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hcCBvZiB0aGUgdXBkYXRlcyB0byBkbyAoY29sdW1uIHRpdGxlIGFuZCB2YWx1ZSkKKyAgICAgICAgICAgIFNFTEVDVElPTl9DT0xVTU5TLCAgICAgICAgICAgLy8gc2VsZWN0IGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgICAgICAgICAgICAgICAvLyBzZWxlY3QgInRpdGxlID0gTm90ZTEiCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IG5vIHJvd3Mgd2VyZSB1cGRhdGVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcm93c1VwZGF0ZWQpOworCisgICAgICAgIC8vIFN1YnRlc3QgMi4KKyAgICAgICAgLy8gQnVpbGRzIHRoZSB0YWJsZSwgYW5kIHRoZW4gdHJpZXMgdGhlIHVwZGF0ZSBhZ2FpbiB1c2luZyB0aGUgc2FtZSBhcmd1bWVudHMuCisKKyAgICAgICAgLy8gSW5zZXJ0cyBkYXRhIGludG8gdGhlIG1vZGVsLgorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gIERvZXMgdGhlIHVwZGF0ZSBhZ2FpbiwgdXNpbmcgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGluIHN1YnRlc3QgMS4KKyAgICAgICAgcm93c1VwZGF0ZWQgPSBtTW9ja1Jlc29sdmVyLnVwZGF0ZSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAgLy8gVGhlIFVSSSBvZiB0aGUgZGF0YSB0YWJsZQorICAgICAgICAgICAgdmFsdWVzLCAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBtYXAgb2YgdXBkYXRlcworICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24sIGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgICAgICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24gYXJndW1lbnQsIHRvIHNlbGVjdCAidGl0bGUgPSBOb3RlMSIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgb25seSBvbmUgcm93IHdhcyB1cGRhdGVkLiBUaGUgc2VsZWN0aW9uIGNyaXRlcmlhIGV2YWx1YXRlZCB0bworICAgICAgICAvLyAidGl0bGUgPSBOb3RlMSIsIGFuZCB0aGUgdGVzdCBkYXRhIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIHJvdyB0aGF0IG1hdGNoZXMgdGhhdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJvd3NVcGRhdGVkKTsKKworICAgIH0KKworICAgIC8vIEEgdXRpbGl0eSBmb3IgY29udmVydGluZyBub3RlIGRhdGEgdG8gYSBDb250ZW50VmFsdWVzIG1hcC4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RlSW5mbyB7CisgICAgICAgIFN0cmluZyB0aXRsZTsKKyAgICAgICAgU3RyaW5nIG5vdGU7CisgICAgICAgIGxvbmcgY3JlYXRlRGF0ZTsKKyAgICAgICAgbG9uZyBtb2REYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGNsYXNzIGhlbHBzIGNyZWF0ZSBhIG5vdGUgYW5kCisgICAgICAgICAqIHJldHVybiBpdHMgdmFsdWVzIGluIGEgQ29udGVudFZhbHVlcyBtYXAgZXhwZWN0ZWQgYnkgZGF0YSBtb2RlbCBtZXRob2RzLgorICAgICAgICAgKiBUaGUgbm90ZSdzIGlkIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIGluc2VydGVkIGludG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm90ZUluZm8oU3RyaW5nIHQsIFN0cmluZyBuKSB7CisgICAgICAgICAgICB0aXRsZSA9IHQ7CisgICAgICAgICAgICBub3RlID0gbjsKKyAgICAgICAgICAgIGNyZWF0ZURhdGUgPSAwOworICAgICAgICAgICAgbW9kRGF0ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXRzIHRoZSBjcmVhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUobG9uZyBjKSB7CisgICAgICAgICAgICBjcmVhdGVEYXRlID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25EYXRlKGxvbmcgbSkgeworICAgICAgICAgICAgbW9kRGF0ZSA9IG07CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm5zIGEgQ29udGVudFZhbHVlcyBpbnN0YW5jZSAoYSBtYXApIGZvciB0aGlzIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgICAgICAgICogaW5zZXJ0aW5nIGEgTm90ZUluZm8gaW50byBhIGRhdGFiYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0Q29udGVudFZhbHVlcygpIHsKKyAgICAgICAgICAgIC8vIEdldHMgYSBuZXcgQ29udGVudFZhbHVlcyBvYmplY3QKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgICAgIC8vIEFkZHMgbWFwIGVudHJpZXMgZm9yIHRoZSB1c2VyLWNvbnRyb2xsZWQgZmllbGRzIGluIHRoZSBtYXAKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIHRpdGxlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgbm90ZSk7CisgICAgICAgICAgICB2LnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLCBjcmVhdGVEYXRlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsIG1vZERhdGUpOworICAgICAgICAgICAgcmV0dXJuIHY7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRUZXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY3MWQyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci0KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZXNMaXN0OwotCi0vKioKLSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBtYWluIGxhdW5jaGVyIGFjdGl2aXR5IG9wZW5zIHVwIHByb3Blcmx5LCB3aGljaCB3aWxsIGJlCi0gKiB2ZXJpZmllZCBieSB7QGxpbmsgI3Rlc3RBY3Rpdml0eVRlc3RDYXNlU2V0VXBQcm9wZXJseX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RlUGFkVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPE5vdGVzTGlzdD4gewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IGZvciB0aGUge0BsaW5rIE5vdGVzTGlzdH0gYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHVibGljIE5vdGVQYWRUZXN0KCkgewotICAgICAgICBzdXBlcihOb3Rlc0xpc3QuY2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgY2FuIGJlIGxhdW5jaGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY3Rpdml0eVRlc3RDYXNlU2V0VXBQcm9wZXJseSgpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiYWN0aXZpdHkgc2hvdWxkIGJlIGxhdW5jaGVkIHN1Y2Nlc3NmdWxseSIsIGdldEFjdGl2aXR5KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0FuZHJvaWQubWsgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvQW5kcm9pZC5tayBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5OTc1MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJzQmFsbHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFlMmZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmJhbGxzIj4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxMSIgLz4KKyAgICA8YXBwbGljYXRpb24gCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlJzQmFsbHMiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkJhbGxzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL19pbmRleC5odG1sIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvX2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MDQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL19pbmRleC5odG1sCkBAIC0wLDAgKzEgQEAKKzxwPkEgYnJ1dGUgZm9yY2UgcGh5c2ljcyBzaW11bGF0aW9uIHRoYXQgcmVuZGVycyBtYW55IGJhbGxzIG9udG8gdGhlIHNjcmVlbiBhbmQgbW92ZXMgdGhlbSBhY2NvcmRpbmcgdG8gdXNlciB0b3VjaCBhbmQgZ3Jhdml0eS48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvcmVzL2RyYXdhYmxlL2ZsYXJlcy5wbmcgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9yZXMvZHJhd2FibGUvZmxhcmVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVjOTcwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvcmVzL2RyYXdhYmxlL2ZsYXJlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvYmFsbHMvQmFsbHMuamF2YSBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL0JhbGxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiOTAwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL0JhbGxzLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMuYmFsbHM7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEJhbGxzIGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBTZW5zb3JFdmVudExpc3RlbmVyIHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBCYWxsc1ZpZXcgbVZpZXc7CisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIG1TZW5zb3JNYW5hZ2VyOworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5kKCJycyIsICJzZW5zb3I6ICIgKyBldmVudC5zZW5zb3IgKyAiLCB4OiAiICsgZXZlbnQudmFsdWVzWzBdICsgIiwgeTogIiArIGV2ZW50LnZhbHVlc1sxXSArICIsIHo6ICIgKyBldmVudC52YWx1ZXNbMl0pOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5zZW5zb3IuZ2V0VHlwZSgpID09IFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIpIHsKKyAgICAgICAgICAgICAgICBpZihtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldEFjY2VsKGV2ZW50LnZhbHVlc1swXSwgZXZlbnQudmFsdWVzWzFdLCBldmVudC52YWx1ZXNbMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICBtU2Vuc29yTWFuYWdlciA9IChTZW5zb3JNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKFNFTlNPUl9TRVJWSUNFKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBCYWxsc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgbVNlbnNvck1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCk7CisKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKyAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdCgwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIG1TZW5zb3JNYW5hZ2VyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9CYWxsc1JTLmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9CYWxsc1JTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhYjliOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL0JhbGxzUlMuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5iYWxsczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIEJhbGxzUlMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA5MDA7CisKKyAgICBwdWJsaWMgQmFsbHNSUygpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19iYWxscyBtU2NyaXB0OworICAgIHByaXZhdGUgU2NyaXB0Q19iYWxsX3BoeXNpY3MgbVBoeXNpY3NTY3JpcHQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGTGluZXM7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGUG9pbnRzOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFY7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9Qb2ludCBtUG9pbnRzOworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfVnBDb25zdHMgbVZwQ29uc3RzOworCisgICAgdm9pZCB1cGRhdGVQcm9qZWN0aW9uTWF0cmljZXMoKSB7CisgICAgICAgIG1WcENvbnN0cyA9IG5ldyBTY3JpcHRGaWVsZF9WcENvbnN0cyhtUlMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX0dSQVBISUNTX0NPTlNUQU5UUyk7CisgICAgICAgIFNjcmlwdEZpZWxkX1ZwQ29uc3RzLkl0ZW0gaSA9IG5ldyBTY3JpcHRGaWVsZF9WcENvbnN0cy5JdGVtKCk7CisgICAgICAgIE1hdHJpeDRmIG12cCA9IG5ldyBNYXRyaXg0ZigpOworICAgICAgICBtdnAubG9hZE9ydGhvKDAsIG1SUy5nZXRXaWR0aCgpLCBtUlMuZ2V0SGVpZ2h0KCksIDAsIC0xLCAxKTsKKyAgICAgICAgaS5NVlAgPSBtdnA7CisgICAgICAgIG1WcENvbnN0cy5zZXQoaSwgMCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2dyYW1WZXJ0ZXgoKSB7CisgICAgICAgIHVwZGF0ZVByb2plY3Rpb25NYXRyaWNlcygpOworCisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBzYiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgU3RyaW5nIHQgPSAgInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIgKworICAgICAgICAgICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHZlYzQgcG9zID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHBvcy54eSA9IEFUVFJJQl9wb3NpdGlvbjtcbiIgKworICAgICAgICAgICAgICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBwb3M7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgdmFyQ29sb3IgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX3NpemU7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIn1cbiI7CisgICAgICAgIHNiLnNldFNoYWRlcih0KTsKKyAgICAgICAgc2IuYWRkQ29uc3RhbnQobVZwQ29uc3RzLmdldFR5cGUoKSk7CisgICAgICAgIHNiLmFkZElucHV0KG1Qb2ludHMuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgUHJvZ3JhbVZlcnRleCBwdnMgPSBzYi5jcmVhdGUoKTsKKyAgICAgICAgcHZzLmJpbmRDb25zdGFudHMobVZwQ29uc3RzLmdldEFsbG9jYXRpb24oKSwgMCk7CisgICAgICAgIG1SUy5iaW5kUHJvZ3JhbVZlcnRleChwdnMpOworICAgIH0KKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBsb2FkVGV4dHVyZShpbnQgaWQpIHsKKyAgICAgICAgZmluYWwgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0KKyAgICAgICAgICAgIEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlKG1SUywgbVJlcywKKyAgICAgICAgICAgICAgICBpZCwgQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sLk1JUE1BUF9OT05FLAorICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVEVYVFVSRSk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9ORShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5PTkUsIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlciBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KHRydWUpOworICAgICAgICBwZmIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZS5NT0RVTEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIHBmYi5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIG1QRlBvaW50cyA9IHBmYi5jcmVhdGUoKTsKKworICAgICAgICBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgbVBGTGluZXMgPSBwZmIuY3JlYXRlKCk7CisKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJMb2FkIHRleHR1cmUiKTsKKyAgICAgICAgbVBGUG9pbnRzLmJpbmRUZXh0dXJlKGxvYWRUZXh0dXJlKFIuZHJhd2FibGUuZmxhcmVzKSwgMCk7CisKKyAgICAgICAgbVBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChtUlMsIFBBUlRfQ09VTlQsIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKG1Qb2ludHMuZ2V0QWxsb2NhdGlvbigpKTsKKyAgICAgICAgc21iLmFkZEluZGV4U2V0VHlwZShNZXNoLlByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc21QID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgIG1QaHlzaWNzU2NyaXB0ID0gbmV3IFNjcmlwdENfYmFsbF9waHlzaWNzKG1SUywgbVJlcywgUi5yYXcuYmFsbF9waHlzaWNzKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfYmFsbHMobVJTLCBtUmVzLCBSLnJhdy5iYWxscyk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtUCk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BoeXNpY3Nfc2NyaXB0KG1QaHlzaWNzU2NyaXB0KTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KG1Qb2ludHMpOworICAgICAgICBtU2NyaXB0LmJpbmRfYmFsbHMxKG5ldyBTY3JpcHRGaWVsZF9CYWxsKG1SUywgUEFSVF9DT1VOVCwgQWxsb2NhdGlvbi5VU0FHRV9TQ1JJUFQpKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2JhbGxzMihuZXcgU2NyaXB0RmllbGRfQmFsbChtUlMsIFBBUlRfQ09VTlQsIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKSk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGTGluZXMobVBGTGluZXMpOworICAgICAgICBtU2NyaXB0LnNldF9nUEZQb2ludHMobVBGUG9pbnRzKTsKKyAgICAgICAgY3JlYXRlUHJvZ3JhbVZlcnRleCgpOworCisgICAgICAgIG1SUy5iaW5kUHJvZ3JhbVN0b3JlKEJMRU5EX0FERF9ERVBUSF9OT05FKG1SUykpOworCisgICAgICAgIG1QaHlzaWNzU2NyaXB0LnNldF9nTWluUG9zKG5ldyBGbG9hdDIoNSwgNSkpOworICAgICAgICBtUGh5c2ljc1NjcmlwdC5zZXRfZ01heFBvcyhuZXcgRmxvYXQyKHdpZHRoIC0gNSwgaGVpZ2h0IC0gNSkpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2luaXRQYXJ0cyh3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgICAgIG1QaHlzaWNzU2NyaXB0Lmludm9rZV90b3VjaCh4LCB5LCBwcmVzc3VyZSwgaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2VsKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVBoeXNpY3NTY3JpcHQuc2V0X2dHcmF2aXR5VmVjdG9yKG5ldyBGbG9hdDIoeCwgeSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvYmFsbHMvQmFsbHNWaWV3LmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9CYWxsc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IzNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvYmFsbHMvQmFsbHNWaWV3LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMuYmFsbHM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgQmFsbHNWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgQmFsbHNWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBCYWxsc1JTIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IEJhbGxzUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyLnVwZGF0ZVByb2plY3Rpb25NYXRyaWNlcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHRHTCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgZXYuZ2V0UG9pbnRlcklkKDApKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50ZXIgZ29pbmcgdXAsIHdlIGNhbiBnZXQgdGhlIGluZGV4IGxpa2UgdGhpcworICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgcG9pbnRlcklkKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBldi5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBpbnQgcGNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgcD0wOyBwIDwgcGNvdW50OyBwKyspIHsKKyAgICAgICAgICAgIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRYKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFkocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UHJlc3N1cmUocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldEhpc3RvcmljYWxYKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsWShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFByZXNzdXJlKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZXRBY2NlbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGlmIChtUmVuZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyLnNldEFjY2VsKHgsIC15KTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9iYWxsX3BoeXNpY3MucnMgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9iYWxsX3BoeXNpY3MucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2YWIxZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL2JhbGxfcGh5c2ljcy5ycwpAQCAtMCwwICsxLDE0NiBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5leGFtcGxlLmFuZHJvaWQucnMuYmFsbHMpCisKKyNpbmNsdWRlICJiYWxscy5yc2giCisKK2Zsb2F0MiBnR3Jhdml0eVZlY3RvciA9IHswLmYsIDkuOGZ9OworCitmbG9hdDIgZ01pblBvcyA9IHswLmYsIDAuZn07CitmbG9hdDIgZ01heFBvcyA9IHsxMjgwLmYsIDcwMC5mfTsKKworc3RhdGljIGZsb2F0MiB0b3VjaFBvc1sxMF07CitzdGF0aWMgZmxvYXQgdG91Y2hQcmVzc3VyZVsxMF07CisKK3ZvaWQgdG91Y2goZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgIGlmIChpZCA+PSAxMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdG91Y2hQb3NbaWRdLnggPSB4OworICAgIHRvdWNoUG9zW2lkXS55ID0geTsKKyAgICB0b3VjaFByZXNzdXJlW2lkXSA9IHByZXNzdXJlOworfQorCit2b2lkIHJvb3QoY29uc3QgQmFsbF90ICpiYWxsSW4sIEJhbGxfdCAqYmFsbE91dCwgY29uc3QgQmFsbENvbnRyb2xfdCAqY3RsLCB1aW50MzJfdCB4KSB7CisgICAgZmxvYXQyIGZ2ID0gezAsIDB9OworICAgIGZsb2F0MiBwb3MgPSBiYWxsSW4tPnBvc2l0aW9uOworCisgICAgaW50IGFyY0lEID0gLTE7CisgICAgZmxvYXQgYXJjSW52U3RyID0gMTAwMDAwOworCisgICAgY29uc3QgQmFsbF90ICogYlB0ciA9IHJzR2V0RWxlbWVudEF0KGN0bC0+YWluLCAwKTsKKyAgICBmb3IgKHVpbnQzMl90IHhpbiA9IDA7IHhpbiA8IGN0bC0+ZGltWDsgeGluKyspIHsKKyAgICAgICAgZmxvYXQyIHZlYyA9IGJQdHJbeGluXS5wb3NpdGlvbiAtIHBvczsKKyAgICAgICAgZmxvYXQyIHZlYzIgPSB2ZWMgKiB2ZWM7CisgICAgICAgIGZsb2F0IGxlbjIgPSB2ZWMyLnggKyB2ZWMyLnk7CisKKyAgICAgICAgaWYgKGxlbjIgPCAxMDAwMCkgeworICAgICAgICAgICAgLy9mbG9hdCBtaW5EaXN0ID0gYmFsbEluLT5zaXplICsgYlB0clt4aW5dLnNpemU7CisgICAgICAgICAgICBmbG9hdCBmb3JjZVNjYWxlID0gYmFsbEluLT5zaXplICogYlB0clt4aW5dLnNpemU7CisgICAgICAgICAgICBmb3JjZVNjYWxlICo9IGZvcmNlU2NhbGU7CisKKyAgICAgICAgICAgIGlmIChsZW4yID4gMTYgLyogKG1pbkRpc3QqbWluRGlzdCkqLykgIHsKKyAgICAgICAgICAgICAgICAvLyBSZXB1bHNpb24KKyAgICAgICAgICAgICAgICBmbG9hdCBsZW4gPSBzcXJ0KGxlbjIpOworICAgICAgICAgICAgICAgIGZ2IC09ICh2ZWMgLyAobGVuICogbGVuICogbGVuKSkgKiAyMDAwMC5mICogZm9yY2VTY2FsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbjIgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh4aW4gPT0geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmFsbE91dC0+ZGVsdGEgPSAwLmY7CisgICAgICAgICAgICAgICAgICAgIGJhbGxPdXQtPnBvc2l0aW9uID0gYmFsbEluLT5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhpbiA+IHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGxPdXQtPnBvc2l0aW9uLnggKz0gMS5mOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFsbE91dC0+cG9zaXRpb24ueCAtPSAxLmY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9iYWxsT3V0LT5jb2xvci5yZ2IgPSAxLmY7CisgICAgICAgICAgICAgICAgICAgIC8vYmFsbE91dC0+YXJjSUQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgLy9iYWxsT3V0LT5hcmNTdHIgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIENvbGxpc2lvbgorICAgICAgICAgICAgICAgIGZsb2F0MiBheGlzID0gbm9ybWFsaXplKHZlYyk7CisgICAgICAgICAgICAgICAgZmxvYXQgZTEgPSBkb3QoYXhpcywgYmFsbEluLT5kZWx0YSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZTIgPSBkb3QoYXhpcywgYlB0clt4aW5dLmRlbHRhKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBlID0gKGUxIC0gZTIpICogMC40NWY7CisgICAgICAgICAgICAgICAgaWYgKGUxID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmdiAtPSBheGlzICogZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmdiArPSBheGlzICogZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdiAvPSBiYWxsSW4tPnNpemUgKiBiYWxsSW4tPnNpemUgKiBiYWxsSW4tPnNpemU7CisgICAgZnYgLT0gZ0dyYXZpdHlWZWN0b3IgKiA0LmY7CisgICAgZnYgKj0gY3RsLT5kdDsKKworICAgIGZvciAoaW50IGk9MDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgaWYgKHRvdWNoUHJlc3N1cmVbaV0gPiAwLjFmKSB7CisgICAgICAgICAgICBmbG9hdDIgdmVjID0gdG91Y2hQb3NbaV0gLSBiYWxsSW4tPnBvc2l0aW9uOworICAgICAgICAgICAgZmxvYXQyIHZlYzIgPSB2ZWMgKiB2ZWM7CisgICAgICAgICAgICBmbG9hdCBsZW4yID0gbWF4KDIuZiwgdmVjMi54ICsgdmVjMi55KTsKKyAgICAgICAgICAgIGZ2IC09ICh2ZWMgLyBsZW4yKSAqIHRvdWNoUHJlc3N1cmVbaV0gKiAzMDAuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJhbGxPdXQtPmRlbHRhID0gKGJhbGxJbi0+ZGVsdGEgKiAoMS5mIC0gMC4wMDRmKSkgKyBmdjsKKyAgICBiYWxsT3V0LT5wb3NpdGlvbiA9IGJhbGxJbi0+cG9zaXRpb24gKyAoYmFsbE91dC0+ZGVsdGEgKiBjdGwtPmR0KTsKKworICAgIGNvbnN0IGZsb2F0IHdhbGxGb3JjZSA9IDQwMC5mOworICAgIGlmIChiYWxsT3V0LT5wb3NpdGlvbi54ID4gKGdNYXhQb3MueCAtIDIwLmYpKSB7CisgICAgICAgIGZsb2F0IGQgPSBnTWF4UG9zLnggLSBiYWxsT3V0LT5wb3NpdGlvbi54OworICAgICAgICBpZiAoZCA8IDAuZikgeworICAgICAgICAgICAgaWYgKGJhbGxPdXQtPmRlbHRhLnggPiAwKSB7CisgICAgICAgICAgICAgICAgYmFsbE91dC0+ZGVsdGEueCAqPSAtMC43OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFsbE91dC0+cG9zaXRpb24ueCA9IGdNYXhQb3MueDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhbGxPdXQtPmRlbHRhLnggLT0gbWluKHdhbGxGb3JjZSAvIChkICogZCksIDEwLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJhbGxPdXQtPnBvc2l0aW9uLnggPCAoZ01pblBvcy54ICsgMjAuZikpIHsKKyAgICAgICAgZmxvYXQgZCA9IGJhbGxPdXQtPnBvc2l0aW9uLnggLSBnTWluUG9zLng7CisgICAgICAgIGlmIChkIDwgMC5mKSB7CisgICAgICAgICAgICBpZiAoYmFsbE91dC0+ZGVsdGEueCA8IDApIHsKKyAgICAgICAgICAgICAgICBiYWxsT3V0LT5kZWx0YS54ICo9IC0wLjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYWxsT3V0LT5wb3NpdGlvbi54ID0gZ01pblBvcy54ICsgMS5mOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFsbE91dC0+ZGVsdGEueCArPSBtaW4od2FsbEZvcmNlIC8gKGQgKiBkKSwgMTAuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFsbE91dC0+cG9zaXRpb24ueSA+IChnTWF4UG9zLnkgLSAyMC5mKSkgeworICAgICAgICBmbG9hdCBkID0gZ01heFBvcy55IC0gYmFsbE91dC0+cG9zaXRpb24ueTsKKyAgICAgICAgaWYgKGQgPCAwLmYpIHsKKyAgICAgICAgICAgIGlmIChiYWxsT3V0LT5kZWx0YS55ID4gMCkgeworICAgICAgICAgICAgICAgIGJhbGxPdXQtPmRlbHRhLnkgKj0gLTAuNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhbGxPdXQtPnBvc2l0aW9uLnkgPSBnTWF4UG9zLnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYWxsT3V0LT5kZWx0YS55IC09IG1pbih3YWxsRm9yY2UgLyAoZCAqIGQpLCAxMC5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiYWxsT3V0LT5wb3NpdGlvbi55IDwgKGdNaW5Qb3MueSArIDIwLmYpKSB7CisgICAgICAgIGZsb2F0IGQgPSBiYWxsT3V0LT5wb3NpdGlvbi55IC0gZ01pblBvcy55OworICAgICAgICBpZiAoZCA8IDAuZikgeworICAgICAgICAgICAgaWYgKGJhbGxPdXQtPmRlbHRhLnkgPCAwKSB7CisgICAgICAgICAgICAgICAgYmFsbE91dC0+ZGVsdGEueSAqPSAtMC43OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFsbE91dC0+cG9zaXRpb24ueSA9IGdNaW5Qb3MueSArIDEuZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhbGxPdXQtPmRlbHRhLnkgKz0gbWluKHdhbGxGb3JjZSAvIChkICogZCAqIGQpLCAxMC5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJhbGxPdXQtPnNpemUgPSBiYWxsSW4tPnNpemU7CisKKyAgICAvL3JzRGVidWcoInBoeXNpY3MgcG9zIG91dCIsIGJhbGxPdXQtPnBvc2l0aW9uKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvYmFsbHMvYmFsbHMucnMgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9iYWxscy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiODA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvYmFsbHMvYmFsbHMucnMKQEAgLTAsMCArMSw4NSBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5leGFtcGxlLmFuZHJvaWQucnMuYmFsbHMpCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCisjaW5jbHVkZSAiYmFsbHMucnNoIgorCisjcHJhZ21hIHN0YXRlVmVydGV4KHBhcmVudCkKKyNwcmFnbWEgc3RhdGVTdG9yZShwYXJlbnQpCisKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGUG9pbnRzOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZMaW5lczsKK3JzX21lc2ggcGFydE1lc2g7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBvaW50IHsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgZmxvYXQgc2l6ZTsKK30gUG9pbnRfdDsKK1BvaW50X3QgKnBvaW50OworCit0eXBlZGVmIHN0cnVjdCBWcENvbnN0cyB7CisgICAgcnNfbWF0cml4NHg0IE1WUDsKK30gVnBDb25zdHNfdDsKK1ZwQ29uc3RzX3QgKnZwQ29uc3RhbnRzOworCityc19zY3JpcHQgcGh5c2ljc19zY3JpcHQ7CisKK0JhbGxfdCAqYmFsbHMxOworQmFsbF90ICpiYWxsczI7CisKK3N0YXRpYyBpbnQgZnJhbWUgPSAwOworCit2b2lkIGluaXRQYXJ0cyhpbnQgdywgaW50IGgpCit7CisgICAgdWludDMyX3QgZGltWCA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKGJhbGxzMSkpOworCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGRpbVg7IGN0KyspIHsKKyAgICAgICAgYmFsbHMxW2N0XS5wb3NpdGlvbi54ID0gcnNSYW5kKDAuZiwgKGZsb2F0KXcpOworICAgICAgICBiYWxsczFbY3RdLnBvc2l0aW9uLnkgPSByc1JhbmQoMC5mLCAoZmxvYXQpaCk7CisgICAgICAgIGJhbGxzMVtjdF0uZGVsdGEueCA9IDAuZjsKKyAgICAgICAgYmFsbHMxW2N0XS5kZWx0YS55ID0gMC5mOworICAgICAgICBiYWxsczFbY3RdLnNpemUgPSAxLmY7CisKKyAgICAgICAgZmxvYXQgciA9IHJzUmFuZCgxMDAuZik7CisgICAgICAgIGlmIChyID4gOTAuZikgeworICAgICAgICAgICAgYmFsbHMxW2N0XS5zaXplICs9IHBvdygxMC5mLCByc1JhbmQoMC5mLCAyLmYpKSAqIDAuMDc7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCitpbnQgcm9vdCgpIHsKKyAgICByc2dDbGVhckNvbG9yKDAuZiwgMC5mLCAwLmYsIDEuZik7CisKKyAgICBCYWxsQ29udHJvbF90IGJjOworICAgIEJhbGxfdCAqYm91dDsKKworICAgIGlmIChmcmFtZSAmIDEpIHsKKyAgICAgICAgcnNTZXRPYmplY3QoJmJjLmFpbiwgcnNHZXRBbGxvY2F0aW9uKGJhbGxzMikpOworICAgICAgICByc1NldE9iamVjdCgmYmMuYW91dCwgcnNHZXRBbGxvY2F0aW9uKGJhbGxzMSkpOworICAgICAgICBib3V0ID0gYmFsbHMyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzU2V0T2JqZWN0KCZiYy5haW4sIHJzR2V0QWxsb2NhdGlvbihiYWxsczEpKTsKKyAgICAgICAgcnNTZXRPYmplY3QoJmJjLmFvdXQsIHJzR2V0QWxsb2NhdGlvbihiYWxsczIpKTsKKyAgICAgICAgYm91dCA9IGJhbGxzMTsKKyAgICB9CisKKyAgICBiYy5kaW1YID0gcnNBbGxvY2F0aW9uR2V0RGltWChiYy5haW4pOworICAgIGJjLmR0ID0gMS5mIC8gMzAuZjsKKworICAgIHJzRm9yRWFjaChwaHlzaWNzX3NjcmlwdCwgYmMuYWluLCBiYy5hb3V0LCAmYmMpOworCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGJjLmRpbVg7IGN0KyspIHsKKyAgICAgICAgcG9pbnRbY3RdLnBvc2l0aW9uID0gYm91dFtjdF0ucG9zaXRpb247CisgICAgICAgIHBvaW50W2N0XS5zaXplID0gNi5mIC8qKyBib3V0W2N0XS5jb2xvci5nICogNi5mKi8gKiBib3V0W2N0XS5zaXplOworICAgIH0KKworICAgIGZyYW1lKys7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZQb2ludHMpOworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByc0NsZWFyT2JqZWN0KCZiYy5haW4pOworICAgIHJzQ2xlYXJPYmplY3QoJmJjLmFvdXQpOworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9iYWxscy5yc2ggYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9iYWxscy9iYWxscy5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4ODZmOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL2JhbGxzLnJzaApAQCAtMCwwICsxLDE4IEBACisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIEJhbGwgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgLy9mbG9hdDMgY29sb3I7CisgICAgZmxvYXQgc2l6ZTsKKyAgICAvL2ludCBhcmNJRDsKKyAgICAvL2Zsb2F0IGFyY1N0cjsKK30gQmFsbF90OworQmFsbF90ICpiYWxsczsKKworCit0eXBlZGVmIHN0cnVjdCBCYWxsQ29udHJvbCB7CisgICAgdWludDMyX3QgZGltWDsKKyAgICByc19hbGxvY2F0aW9uIGFpbjsKKyAgICByc19hbGxvY2F0aW9uIGFvdXQ7CisgICAgZmxvYXQgZHQ7Cit9IEJhbGxDb250cm9sX3Q7CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9BbmRyb2lkLm1rIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk5NGJhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUnNGb3VudGFpbgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0ZvdW50YWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzI1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQucnMuZm91bnRhaW4iPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIiAvPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJSc0ZvdW50YWluIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJGb3VudGFpbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9faW5kZXguaHRtbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0ZvdW50YWluL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzI0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9faW5kZXguaHRtbApAQCAtMCwwICsxLDUgQEAKKzxwPkFuIGV4YW1wbGUgdGhhdCByZW5kZXJzIG1hbnkgZG90cyBvbiB0aGUgc2NyZWVuIHRoYXQgZm9sbG93IGEgdXNlcidzIHRvdWNoLiBUaGUgZG90cyBmYWxsIAordG8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGZpbmdlci48L3A+CisKKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0ZvdW50YWluL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9Gb3VudGFpbi5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvZm91bnRhaW4vRm91bnRhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I0ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvZm91bnRhaW4vRm91bnRhaW4uamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmZvdW50YWluOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBGb3VudGFpbiBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworCisgICAgcHJpdmF0ZSBGb3VudGFpblZpZXcgbVZpZXc7CisKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQorCisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBGb3VudGFpblZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgTG9nLmUoInJzIiwgIm9uUmVzdW1lIik7CisKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIExvZy5lKCJycyIsICJvblBhdXNlIik7CisKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKworCisKKyAgICAgICAgLy9SdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOworICAgIH0KKworCisgICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmIChMT0dfRU5BQkxFRCkgeworICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmNmI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0ZvdW50YWluL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmZvdW50YWluOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBGb3VudGFpblJTIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUX0NPVU5UID0gNTAwMDA7CisKKyAgICBwdWJsaWMgRm91bnRhaW5SUygpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19mb3VudGFpbiBtU2NyaXB0OworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIgcGZiID0gbmV3IFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlcihycyk7CisgICAgICAgIHBmYi5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIHJzLmJpbmRQcm9ncmFtRnJhZ21lbnQocGZiLmNyZWF0ZSgpKTsKKworICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsvLworIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX0dSQVBISUNTX1ZFUlRFWCk7CisKKyAgICAgICAgTWVzaC5BbGxvY2F0aW9uQnVpbGRlciBzbWIgPSBuZXcgTWVzaC5BbGxvY2F0aW9uQnVpbGRlcihtUlMpOworICAgICAgICBzbWIuYWRkVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpKTsKKyAgICAgICAgc21iLmFkZEluZGV4U2V0VHlwZShNZXNoLlByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIE1lc2ggc20gPSBzbWIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2ZvdW50YWluKG1SUywgbVJlcywgUi5yYXcuZm91bnRhaW4pOworICAgICAgICBtU2NyaXB0LnNldF9wYXJ0TWVzaChzbSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9wb2ludChwb2ludHMpOworICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorCisgICAgYm9vbGVhbiBob2xkaW5nQ29sb3JbXSA9IG5ldyBib29sZWFuWzEwXTsKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICAgICAgaWYgKGlkID49IGhvbGRpbmdDb2xvci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmF0ZSA9IChpbnQpKHByZXNzdXJlICogcHJlc3N1cmUgKiA1MDAuZik7CisgICAgICAgIGlmIChyYXRlID4gNTAwKSB7CisgICAgICAgICAgICByYXRlID0gNTAwOworICAgICAgICB9CisgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfYWRkUGFydGljbGVzKHJhdGUsIHgsIHksIGlkLCAhaG9sZGluZ0NvbG9yW2lkXSk7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzNiM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvRm91bnRhaW4vc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMuZm91bnRhaW47CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgRm91bnRhaW5WaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgRm91bnRhaW5WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBGb3VudGFpblJTIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IEZvdW50YWluUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZiAobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0R0woKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbk1hc2tlZCgpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgeworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIGV2LmdldFBvaW50ZXJJZCgwKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0ID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAvLyBvbmx5IG9uZSBwb2ludGVyIGdvaW5nIHVwLCB3ZSBjYW4gZ2V0IHRoZSBpbmRleCBsaWtlIHRoaXMKKyAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChwb2ludGVySW5kZXgpOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKDAsIDAsIDAsIHBvaW50ZXJJZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gZXYuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgaW50IHBjb3VudCA9IGV2LmdldFBvaW50ZXJDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHA9MDsgcCA8IHBjb3VudDsgcCsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQocCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0WChwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRZKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFByZXNzdXJlKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRIaXN0b3JpY2FsWChwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFkocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxQcmVzc3VyZShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9mb3VudGFpbi5ycyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0ZvdW50YWluL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2ZvdW50YWluL2ZvdW50YWluLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Yjg0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9Gb3VudGFpbi9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9mb3VudGFpbi9mb3VudGFpbi5ycwpAQCAtMCwwICsxLDY5IEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5mb3VudGFpbikKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3JzX21lc2ggcGFydE1lc2g7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBvaW50IHsKKyAgICBmbG9hdDIgZGVsdGE7CisgICAgZmxvYXQyIHBvc2l0aW9uOworICAgIHVjaGFyNCBjb2xvcjsKK30gUG9pbnRfdDsKK1BvaW50X3QgKnBvaW50OworCitpbnQgcm9vdCgpIHsKKyAgICBmbG9hdCBkdCA9IG1pbihyc0dldER0KCksIDAuMWYpOworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgZmxvYXQgZHkyID0gZHQgKiAoMTAuZik7CisgICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IHNpemU7IGN0KyspIHsKKyAgICAgICAgcC0+ZGVsdGEueSArPSBkeTI7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGZsb2F0NCBwYXJ0Q29sb3JbMTBdOwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGludCBpbmRleCwgYm9vbCBuZXdDb2xvcikKK3sKKyAgICBpZiAobmV3Q29sb3IpIHsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnkgPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueiA9IHJzUmFuZCgxLjBmKTsKKyAgICB9CisgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAyZjsKKyAgICBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgdWNoYXI0IGMgPSByc1BhY2tDb2xvclRvODg4OChwYXJ0Q29sb3JbaW5kZXhdKTsKKworICAgIFBvaW50X3QgKiBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICBmbG9hdDIgcCA9IHt4LCB5fTsKKyAgICB3aGlsZSAocmF0ZS0tKSB7CisgICAgICAgIGZsb2F0IGFuZ2xlID0gcnNSYW5kKDMuMTRmICogMi5mKTsKKyAgICAgICAgZmxvYXQgbGVuID0gcnNSYW5kKHJNYXgpOworICAgICAgICBucC0+ZGVsdGEueCA9IGxlbiAqIHNpbihhbmdsZSk7CisgICAgICAgIG5wLT5kZWx0YS55ID0gbGVuICogY29zKGFuZ2xlKTsKKyAgICAgICAgbnAtPnBvc2l0aW9uID0gcDsKKyAgICAgICAgbnAtPmNvbG9yID0gYzsKKyAgICAgICAgbmV3UGFydCsrOworICAgICAgICBucCsrOworICAgICAgICBpZiAobmV3UGFydCA+PSBzaXplKSB7CisgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKKyAgICAgICAgICAgIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvQW5kcm9pZC5tayBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvQ29tcHV0ZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmM5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJzSGVsbG9Db21wdXRlCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2JhZjBkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5oZWxsb2NvbXB1dGUiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPiAgICAKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxMSIgLz4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iUnNIZWxsb0NvbXB1dGUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJIZWxsb0NvbXB1dGUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL19pbmRleC5odG1sIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmQ5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvX2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyIEBACis8cD5BIFJlbmRlcnNjcmlwdCBjb21wdXRlIHNhbXBsZSB0aGF0IGZpbHRlcnMgYSBiaXRtYXAuIE5vIFJlbmRlcnNjcmlwdCBncmFwaGljcyBBUElzIGFyZSB1c2VkCitpbiB0aGlzIHNhbXBsZS48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3Jlcy9kcmF3YWJsZS9kYXRhLmpwZyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvQ29tcHV0ZS9yZXMvZHJhd2FibGUvZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODdiMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvQ29tcHV0ZS9yZXMvZHJhd2FibGUvZGF0YS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvcmVzL2xheW91dC9tYWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdkZTQzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3Jlcy9sYXlvdXQvbWFpbi54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGlzcGxheWluIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5b3V0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvaGVsbG9jb21wdXRlL0hlbGxvQ29tcHV0ZS5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvY29tcHV0ZS9IZWxsb0NvbXB1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE3MjczCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvY29tcHV0ZS9IZWxsb0NvbXB1dGUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmhlbGxvY29tcHV0ZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK3B1YmxpYyBjbGFzcyBIZWxsb0NvbXB1dGUgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcEluOworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBPdXQ7CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdCBtUlM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1JbkFsbG9jYXRpb247CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1PdXRBbGxvY2F0aW9uOworICAgIHByaXZhdGUgU2NyaXB0Q19tb25vIG1TY3JpcHQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworCisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAobUJpdG1hcEluLmdldFdpZHRoKCksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcEluLmdldENvbmZpZygpKTsKKworICAgICAgICBJbWFnZVZpZXcgaW4gPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5aW4pOworICAgICAgICBpbi5zZXRJbWFnZUJpdG1hcChtQml0bWFwSW4pOworCisgICAgICAgIEltYWdlVmlldyBvdXQgPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5kaXNwbGF5b3V0KTsKKyAgICAgICAgb3V0LnNldEltYWdlQml0bWFwKG1CaXRtYXBPdXQpOworCisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKKyAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSh0aGlzKTsKKworICAgICAgICBtSW5BbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgbUJpdG1hcEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uTWlwbWFwQ29udHJvbC5NSVBNQVBfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCk7CisgICAgICAgIG1PdXRBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JbkFsbG9jYXRpb24uZ2V0VHlwZSgpKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfbW9ubyhtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy5tb25vKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nSW4obUluQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dPdXQobU91dEFsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LnNldF9nU2NyaXB0KG1TY3JpcHQpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbU91dEFsbG9jYXRpb24uY29weVRvKG1CaXRtYXBPdXQpOworICAgIH0KKworICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CisgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgIHJldHVybiBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGdldFJlc291cmNlcygpLCByZXNvdXJjZSwgb3B0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvY29tcHV0ZS9tb25vLnJzIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvY29tcHV0ZS9tb25vLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzliOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb0NvbXB1dGUvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvaGVsbG9jb21wdXRlL21vbm8ucnMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgdmVyc2lvbigxKQorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmhlbGxvY29tcHV0ZSkKKworcnNfYWxsb2NhdGlvbiBnSW47Cityc19hbGxvY2F0aW9uIGdPdXQ7Cityc19zY3JpcHQgZ1NjcmlwdDsKKworY29uc3Qgc3RhdGljIGZsb2F0MyBnTW9ub011bHQgPSB7MC4yOTlmLCAwLjU4N2YsIDAuMTE0Zn07CisKK3ZvaWQgcm9vdChjb25zdCB1Y2hhcjQgKnZfaW4sIHVjaGFyNCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKyAgICBmbG9hdDQgZjQgPSByc1VucGFja0NvbG9yODg4OCgqdl9pbik7CisKKyAgICBmbG9hdDMgbW9ubyA9IGRvdChmNC5yZ2IsIGdNb25vTXVsdCk7CisgICAgKnZfb3V0ID0gcnNQYWNrQ29sb3JUbzg4ODgobW9ubyk7Cit9CisKK3ZvaWQgZmlsdGVyKCkgeworICAgIHJzRm9yRWFjaChnU2NyaXB0LCBnSW4sIGdPdXQsIDApOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL0FuZHJvaWQubWsgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxOTRlZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvV29ybGQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUnNIZWxsb1dvcmxkCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzdkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQucnMuaGVsbG93b3JsZCI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlJzSGVsbG9Xb3JsZCIKKyAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJIZWxsb1dvcmxkIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNIZWxsb1dvcmxkIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL19pbmRleC5odG1sIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9faW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FiNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9faW5kZXguaHRtbApAQCAtMCwwICsxIEBACis8cD5BIFJlbmRlcnNjcmlwdCBncmFwaGljcyBhcHBsaWNhdGlvbiB0aGF0IGRyYXdzIHRoZSB0ZXh0ICJIZWxsbywgV29ybGQhIiB3aGVyZSB0aGUgdXNlciB0b3VjaGVzLjwvcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZC5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE2OTdiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLy8gUmVuZGVyc2NyaXB0IGFjdGl2aXR5CitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIC8vIEN1c3RvbSB2aWV3IHRvIHVzZSB3aXRoIFJlbmRlclNjcmlwdAorICAgIHByaXZhdGUgSGVsbG9Xb3JsZFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IEhlbGxvV29ybGRWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYW4gYXBwIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYW4gYXBwIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSUy5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTY0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFJTLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5oZWxsb3dvcmxkOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworLy8gVGhpcyBpcyB0aGUgcmVuZGVyZXIgZm9yIHRoZSBIZWxsb1dvcmxkVmlldworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSUyB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19oZWxsb3dvcmxkIG1TY3JpcHQ7CisKKyAgICBwdWJsaWMgSGVsbG9Xb3JsZFJTKCkgeworICAgIH0KKworICAgIC8vIFRoaXMgcHJvdmlkZXMgdXMgd2l0aCB0aGUgcmVuZGVyc2NyaXB0IGNvbnRleHQgYW5kIHJlc291cmNlcyB0aGF0CisgICAgLy8gYWxsb3cgdXMgdG8gY3JlYXRlIHRoZSBzY3JpcHQgdGhhdCBkb2VzIHJlbmRlcmluZworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RvdWNoWCh4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RvdWNoWSh5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfaGVsbG93b3JsZChtUlMsIG1SZXMsIFIucmF3LmhlbGxvd29ybGQpOworICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGRWaWV3LmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTdlYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9oZWxsb3dvcmxkL0hlbGxvV29ybGRWaWV3LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5oZWxsb3dvcmxkOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGRWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisgICAgLy8gUmVuZGVyc2NpcHQgY29udGV4dAorICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIC8vIFNjcmlwdCB0aGF0IGRvZXMgdGhlIHJlbmRlcmluZworICAgIHByaXZhdGUgSGVsbG9Xb3JsZFJTIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgSGVsbG9Xb3JsZFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBlbnN1cmVSZW5kZXJTY3JpcHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlUmVuZGVyU2NyaXB0KCkgeworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcmVuZGVyc2NyaXB0IHdpdGggZGVzaXJlZCBzdXJmYWNlIGNoYXJhY3RlcmlzdGljcy4KKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwganVzdCB1c2UgdGhlIGRlZmF1bHRzCisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc2NyaXB0IHRoYXQgZG9lcyB0aGUgcmVuZGVyaW5nCisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IEhlbGxvV29ybGRSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKyAgICAgICAgZW5zdXJlUmVuZGVyU2NyaXB0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgc3lzdGVtIGV2ZW50IGFuZCBjbGVhbiB1cAorICAgICAgICBtUmVuZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdEdMKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgLy8gUGFzcyB0b3VjaCBldmVudHMgZnJvbSB0aGUgc3lzdGVtIHRvIHRoZSByZW5kZXJpbmcgc2NyaXB0CisgICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbkRvd24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvd29ybGQvaGVsbG93b3JsZC5ycyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvV29ybGQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvaGVsbG93b3JsZC9oZWxsb3dvcmxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTk0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9IZWxsb1dvcmxkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2hlbGxvd29ybGQvaGVsbG93b3JsZC5ycwpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKy8vIFRlbGwgd2hpY2ggamF2YSBwYWNrYWdlIG5hbWUgdGhlIHJlZmxlY3RlZCBmaWxlcyBzaG91bGQgYmVsb25nIHRvCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5leGFtcGxlLmFuZHJvaWQucnMuaGVsbG93b3JsZCkKKworLy8gQnVpbHQtaW4gaGVhZGVyIHdpdGggZ3JhcGhpY3MgQVBJJ3MKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKKy8vIGdUb3VjaFggYW5kIGdUb3VjaFkgYXJlIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgcmVmbGVjdGVkIGZvciB1c2UKKy8vIGJ5IHRoZSBqYXZhIEFQSS4gV2UgY2FuIHVzZSB0aGVtIHRvIG5vdGlmeSB0aGUgc2NyaXB0IG9mIHRvdWNoIGV2ZW50cy4KK2ludCBnVG91Y2hYOworaW50IGdUb3VjaFk7CisKKy8vIFRoaXMgaXMgaW52b2tlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHNjcmlwdCBpcyBjcmVhdGVkCit2b2lkIGluaXQoKSB7CisgICAgZ1RvdWNoWCA9IDUwLjBmOworICAgIGdUb3VjaFkgPSA1MC4wZjsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICAvLyBDbGVhciB0aGUgYmFja2dyb3VuZCBjb2xvcgorICAgIHJzZ0NsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgLy8gVGVsbCB0aGUgcnVudGltZSB3aGF0IHRoZSBmb250IGNvbG9yIHNob3VsZCBiZQorICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICAvLyBJbnRyb3VkdWNlIG91cnNlbHZlcyB0byB0aGUgd29ybGQgYnkgZHJhd2luZyBhIGdyZWV0aW5nCisgICAgLy8gYXQgdGhlIHBvc2l0aW9uIHVzZXIgdG91Y2hlZCBvbiB0aGUgc2NyZWVuCisgICAgcnNnRHJhd1RleHQoIkhlbGxvIFdvcmxkISIsIGdUb3VjaFgsIGdUb3VjaFkpOworCisgICAgLy8gUmV0dXJuIHZhbHVlIHRlbGxzIFJTIHJvdWdobHkgaG93IG9mdGVuIHRvIHJlZHJhdworICAgIC8vIGluIHRoaXMgY2FzZSAyMCBtcworICAgIHJldHVybiAyMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL0FuZHJvaWQubWsgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGVmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBSc01pc2NTYW1wbGVzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhMzk3NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5taXNjc2FtcGxlcyI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlJzTWlzY1NhbXBsZXMiCisgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNMaXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNMaXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc1JlbmRlclN0YXRlcyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlJzU3RhdGVzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9faW5kZXguaHRtbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9faW5kZXguaHRtbApAQCAtMCwwICsxIEBACis8cD5BIHNldCBvZiBzYW1wbGVzIHRoYXQgZGVtb25zdHJhdGUgaG93IHRvIHVzZSB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBSZW5kZXJzY3JpcHQgQVBJcy48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2NoZWNrZXIucG5nIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2NoZWNrZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzFlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvZHJhd2FibGUvY2hlY2tlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2N1YmVtYXBfdGVzdC5wbmcgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvZHJhd2FibGUvY3ViZW1hcF90ZXN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYzNWQwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2N1YmVtYXBfdGVzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzQ3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDM3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QxNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwOGYzYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9tdWx0aXRleGYuZ2xzbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvbXVsdGl0ZXhmLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MmE0NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvbXVsdGl0ZXhmLmdsc2wKQEAgLTAsMCArMSwxMyBAQAordmFyeWluZyB2ZWMyIHZhclRleDA7CisKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzIgdDAgPSB2YXJUZXgwLnh5OworICAgbG93cCB2ZWM0IGNvbDAgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhOworICAgbG93cCB2ZWM0IGNvbDEgPSB0ZXh0dXJlMkQoVU5JX1RleDEsIHQwKjQuMCkucmdiYTsKKyAgIGxvd3AgdmVjNCBjb2wyID0gdGV4dHVyZTJEKFVOSV9UZXgyLCB0MCkucmdiYTsKKyAgIGNvbDAueHl6ID0gY29sMC54eXoqY29sMS54eXoqMS41OworICAgY29sMC54eXogPSBtaXgoY29sMC54eXosIGNvbDIueHl6LCBjb2wyLncpOworICAgY29sMC53ID0gMC41OworICAgZ2xfRnJhZ0NvbG9yID0gY29sMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXIyZi5nbHNsIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXIyZi5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzA1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcjJmLmdsc2wKQEAgLTAsMCArMSwyOSBAQAordmFyeWluZyB2ZWMzIHZhcldvcmxkUG9zOwordmFyeWluZyB2ZWMzIHZhcldvcmxkTm9ybWFsOwordmFyeWluZyB2ZWMyIHZhclRleDA7CisKK3ZvaWQgbWFpbigpIHsKKworICAgdmVjMyBWID0gbm9ybWFsaXplKC12YXJXb3JsZFBvcy54eXopOworICAgdmVjMyB3b3JsZE5vcm0gPSBub3JtYWxpemUodmFyV29ybGROb3JtYWwpOworCisgICB2ZWMzIGxpZ2h0MFZlYyA9IG5vcm1hbGl6ZShVTklfbGlnaHQwX1Bvc2lzaW9uLnh5eiAtIHZhcldvcmxkUG9zKTsKKyAgIHZlYzMgbGlnaHQwUiA9IC1yZWZsZWN0KGxpZ2h0MFZlYywgd29ybGROb3JtKTsKKyAgIGZsb2F0IGxpZ2h0MF9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQwVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MF9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQwU3BlYyA9IGNsYW1wKGRvdChsaWdodDBSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBmbG9hdCBsaWdodDBfU3BlY3VsYXIgPSBwb3cobGlnaHQwU3BlYywgVU5JX2xpZ2h0MF9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQwX1NwZWN1bGFyOworCisgICB2ZWMzIGxpZ2h0MVZlYyA9IG5vcm1hbGl6ZShVTklfbGlnaHQxX1Bvc2lzaW9uLnh5eiAtIHZhcldvcmxkUG9zKTsKKyAgIHZlYzMgbGlnaHQxUiA9IHJlZmxlY3QobGlnaHQxVmVjLCB3b3JsZE5vcm0pOworICAgZmxvYXQgbGlnaHQxX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDFWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHQxX0RpZmZ1c2U7CisgICBmbG9hdCBsaWdodDFTcGVjID0gY2xhbXAoZG90KGxpZ2h0MVIsIFYpLCAwLjAwMSwgMS4wKTsKKyAgIGZsb2F0IGxpZ2h0MV9TcGVjdWxhciA9IHBvdyhsaWdodDFTcGVjLCBVTklfbGlnaHQxX0Nvc2luZVBvd2VyKSAqIFVOSV9saWdodDFfU3BlY3VsYXI7CisKKyAgIHZlYzIgdDAgPSB2YXJUZXgwLnh5OworICAgbG93cCB2ZWM0IGNvbCA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7CisgICBjb2wueHl6ID0gY29sLnh5eiAqIChsaWdodDBfRGlmZnVzZSAqIFVOSV9saWdodDBfRGlmZnVzZUNvbG9yLnh5eiArIGxpZ2h0MV9EaWZmdXNlICogVU5JX2xpZ2h0MV9EaWZmdXNlQ29sb3IueHl6KTsKKyAgIGNvbC54eXogKz0gbGlnaHQwX1NwZWN1bGFyICogVU5JX2xpZ2h0MF9TcGVjdWxhckNvbG9yLnh5ejsKKyAgIGNvbC54eXogKz0gbGlnaHQxX1NwZWN1bGFyICogVU5JX2xpZ2h0MV9TcGVjdWxhckNvbG9yLnh5ejsKKyAgIGdsX0ZyYWdDb2xvciA9IGNvbDsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXIybW92ZXYuZ2xzbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyMm1vdmV2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjODA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyMm1vdmV2Lmdsc2wKQEAgLTAsMCArMSwyMSBAQAordmFyeWluZyB2ZWMzIHZhcldvcmxkUG9zOwordmFyeWluZyB2ZWMzIHZhcldvcmxkTm9ybWFsOwordmFyeWluZyB2ZWMyIHZhclRleDA7CisKKy8vIFRoaXMgaXMgd2hlcmUgYWN0dWFsIHNoYWRlciBjb2RlIGJlZ2lucwordm9pZCBtYWluKCkgeworICAgdmVjNCBvYmpQb3MgPSBBVFRSSUJfcG9zaXRpb247CisgICB2ZWMzIG9sZFBvcyA9IG9ialBvcy54eXo7CisgICBvYmpQb3MueHl6ICs9IDAuMSpzaW4ob2JqUG9zLnh5eioyLjAgKyBVTklfdGltZSk7CisgICBvYmpQb3MueHl6ICs9IDAuMDUqc2luKG9ialBvcy54eXoqNC4wICsgVU5JX3RpbWUqMC41KTsKKyAgIG9ialBvcy54eXogKz0gMC4wMipzaW4ob2JqUG9zLnh5eio3LjAgKyBVTklfdGltZSowLjc1KTsKKyAgIHZlYzQgd29ybGRQb3MgPSBVTklfbW9kZWwgKiBvYmpQb3M7CisgICBnbF9Qb3NpdGlvbiA9IFVOSV9wcm9qICogd29ybGRQb3M7CisKKyAgIG1hdDMgbW9kZWwzID0gbWF0MyhVTklfbW9kZWxbMF0ueHl6LCBVTklfbW9kZWxbMV0ueHl6LCBVTklfbW9kZWxbMl0ueHl6KTsKKyAgIHZlYzMgd29ybGROb3JtID0gbW9kZWwzICogKEFUVFJJQl9ub3JtYWwgKyBvbGRQb3MgLSBvYmpQb3MueHl6KTsKKworICAgdmFyV29ybGRQb3MgPSB3b3JsZFBvcy54eXo7CisgICB2YXJXb3JsZE5vcm1hbCA9IHdvcmxkTm9ybTsKKyAgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcjJ2Lmdsc2wgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcjJ2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4ODVhMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyMnYuZ2xzbApAQCAtMCwwICsxLDE3IEBACit2YXJ5aW5nIHZlYzMgdmFyV29ybGRQb3M7Cit2YXJ5aW5nIHZlYzMgdmFyV29ybGROb3JtYWw7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKworLy8gVGhpcyBpcyB3aGVyZSBhY3R1YWwgc2hhZGVyIGNvZGUgYmVnaW5zCit2b2lkIG1haW4oKSB7CisgICB2ZWM0IG9ialBvcyA9IEFUVFJJQl9wb3NpdGlvbjsKKyAgIHZlYzQgd29ybGRQb3MgPSBVTklfbW9kZWwgKiBvYmpQb3M7CisgICBnbF9Qb3NpdGlvbiA9IFVOSV9wcm9qICogd29ybGRQb3M7CisKKyAgIG1hdDMgbW9kZWwzID0gbWF0MyhVTklfbW9kZWxbMF0ueHl6LCBVTklfbW9kZWxbMV0ueHl6LCBVTklfbW9kZWxbMl0ueHl6KTsKKyAgIHZlYzMgd29ybGROb3JtID0gbW9kZWwzICogQVRUUklCX25vcm1hbDsKKworICAgdmFyV29ybGRQb3MgPSB3b3JsZFBvcy54eXo7CisgICB2YXJXb3JsZE5vcm1hbCA9IHdvcmxkTm9ybTsKKyAgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmFycmF5Zi5nbHNsIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJhcnJheWYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlY2FkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJhcnJheWYuZ2xzbApAQCAtMCwwICsxLDE2IEBACisKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDBfRGlmZnVzZTsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQxX1NwZWN1bGFyOwordmFyeWluZyB2ZWMyIHZhclRleDA7CisKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzIgdDAgPSB2YXJUZXgwLnh5OworICAgbG93cCB2ZWM0IGNvbCA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7CisgICBjb2wueHl6ID0gY29sLnh5eiAqIChsaWdodDBfRGlmZnVzZSAqIFVOSV9saWdodF9EaWZmdXNlQ29sb3JbMF0ueHl6ICsgbGlnaHQxX0RpZmZ1c2UgKiBVTklfbGlnaHRfRGlmZnVzZUNvbG9yWzFdLnh5eik7CisgICBjb2wueHl6ICs9IGxpZ2h0MF9TcGVjdWxhciAqIFVOSV9saWdodF9TcGVjdWxhckNvbG9yWzBdLnh5ejsKKyAgIGNvbC54eXogKz0gbGlnaHQxX1NwZWN1bGFyICogVU5JX2xpZ2h0X1NwZWN1bGFyQ29sb3JbMV0ueHl6OworICAgZ2xfRnJhZ0NvbG9yID0gY29sOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmFycmF5di5nbHNsIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJhcnJheXYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEzMTBhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJhcnJheXYuZ2xzbApAQCAtMCwwICsxLDMyIEBACit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDFfU3BlY3VsYXI7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKworLy8gVGhpcyBpcyB3aGVyZSBhY3R1YWwgc2hhZGVyIGNvZGUgYmVnaW5zCit2b2lkIG1haW4oKSB7CisgICB2ZWM0IHdvcmxkUG9zID0gVU5JX21vZGVsWzBdICogQVRUUklCX3Bvc2l0aW9uOworICAgd29ybGRQb3MgPSBVTklfbW9kZWxbMV0gKiB3b3JsZFBvczsKKyAgIGdsX1Bvc2l0aW9uID0gVU5JX3Byb2ogKiB3b3JsZFBvczsKKworICAgbWF0NCBtb2RlbDAgPSBVTklfbW9kZWxbMF07CisgICBtYXQzIG1vZGVsMyA9IG1hdDMobW9kZWwwWzBdLnh5eiwgbW9kZWwwWzFdLnh5eiwgbW9kZWwwWzJdLnh5eik7CisgICB2ZWMzIHdvcmxkTm9ybSA9IG1vZGVsMyAqIEFUVFJJQl9ub3JtYWw7CisgICB2ZWMzIFYgPSBub3JtYWxpemUoLXdvcmxkUG9zLnh5eik7CisKKyAgIHZlYzMgbGlnaHQwVmVjID0gbm9ybWFsaXplKFVOSV9saWdodF9Qb3Npc2lvblswXS54eXogLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDBSID0gLXJlZmxlY3QobGlnaHQwVmVjLCB3b3JsZE5vcm0pOworICAgbGlnaHQwX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDBWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHRfRGlmZnVzZVswXTsKKyAgIGZsb2F0IGxpZ2h0MFNwZWMgPSBjbGFtcChkb3QobGlnaHQwUiwgViksIDAuMDAxLCAxLjApOworICAgbGlnaHQwX1NwZWN1bGFyID0gcG93KGxpZ2h0MFNwZWMsIFVOSV9saWdodF9Db3NpbmVQb3dlclswXSkgKiBVTklfbGlnaHRfU3BlY3VsYXJbMF07CisKKyAgIHZlYzMgbGlnaHQxVmVjID0gbm9ybWFsaXplKFVOSV9saWdodF9Qb3Npc2lvblsxXS54eXogLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDFSID0gcmVmbGVjdChsaWdodDFWZWMsIHdvcmxkTm9ybSk7CisgICBsaWdodDFfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MVZlYyksIDAuMCwgMS4wKSAqIFVOSV9saWdodF9EaWZmdXNlWzFdOworICAgZmxvYXQgbGlnaHQxU3BlYyA9IGNsYW1wKGRvdChsaWdodDFSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDFfU3BlY3VsYXIgPSBwb3cobGlnaHQxU3BlYywgVU5JX2xpZ2h0X0Nvc2luZVBvd2VyWzFdKSAqIFVOSV9saWdodF9TcGVjdWxhclsxXTsKKworICAgZ2xfUG9pbnRTaXplID0gMS4wOworICAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyY3ViZWYuZ2xzbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyY3ViZWYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTY5NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJjdWJlZi5nbHNsCkBAIC0wLDAgKzEsOCBAQAorCit2YXJ5aW5nIHZlYzMgd29ybGROb3JtYWw7CisKK3ZvaWQgbWFpbigpIHsKKyAgIGxvd3AgdmVjNCBjb2wgPSB0ZXh0dXJlQ3ViZShVTklfVGV4MCwgd29ybGROb3JtYWwpOworICAgZ2xfRnJhZ0NvbG9yID0gY29sOworfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmN1YmV2Lmdsc2wgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmN1YmV2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmNWNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVyY3ViZXYuZ2xzbApAQCAtMCwwICsxLDEwIEBACit2YXJ5aW5nIHZlYzMgd29ybGROb3JtYWw7CisKKy8vIFRoaXMgaXMgd2hlcmUgYWN0dWFsIHNoYWRlciBjb2RlIGJlZ2lucwordm9pZCBtYWluKCkgeworICAgdmVjNCB3b3JsZFBvcyA9IFVOSV9tb2RlbCAqIEFUVFJJQl9wb3NpdGlvbjsKKyAgIGdsX1Bvc2l0aW9uID0gVU5JX3Byb2ogKiB3b3JsZFBvczsKKworICAgbWF0MyBtb2RlbDMgPSBtYXQzKFVOSV9tb2RlbFswXS54eXosIFVOSV9tb2RlbFsxXS54eXosIFVOSV9tb2RlbFsyXS54eXopOworICAgd29ybGROb3JtYWwgPSBtb2RlbDMgKiBBVFRSSUJfbm9ybWFsOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZlMjAzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wKQEAgLTAsMCArMSwxNiBAQAorCit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQwX1NwZWN1bGFyOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCit2b2lkIG1haW4oKSB7CisgICB2ZWMyIHQwID0gdmFyVGV4MC54eTsKKyAgIGxvd3AgdmVjNCBjb2wgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhOworICAgY29sLnh5eiA9IGNvbC54eXogKiAobGlnaHQwX0RpZmZ1c2UgKiBVTklfbGlnaHQwX0RpZmZ1c2VDb2xvci54eXogKyBsaWdodDFfRGlmZnVzZSAqIFVOSV9saWdodDFfRGlmZnVzZUNvbG9yLnh5eik7CisgICBjb2wueHl6ICs9IGxpZ2h0MF9TcGVjdWxhciAqIFVOSV9saWdodDBfU3BlY3VsYXJDb2xvci54eXo7CisgICBjb2wueHl6ICs9IGxpZ2h0MV9TcGVjdWxhciAqIFVOSV9saWdodDFfU3BlY3VsYXJDb2xvci54eXo7CisgICBnbF9GcmFnQ29sb3IgPSBjb2w7Cit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMDFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsCkBAIC0wLDAgKzEsMzAgQEAKK3ZhcnlpbmcgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKK3ZhcnlpbmcgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCisvLyBUaGlzIGlzIHdoZXJlIGFjdHVhbCBzaGFkZXIgY29kZSBiZWdpbnMKK3ZvaWQgbWFpbigpIHsKKyAgIHZlYzQgd29ybGRQb3MgPSBVTklfbW9kZWwgKiBBVFRSSUJfcG9zaXRpb247CisgICBnbF9Qb3NpdGlvbiA9IFVOSV9wcm9qICogd29ybGRQb3M7CisKKyAgIG1hdDMgbW9kZWwzID0gbWF0MyhVTklfbW9kZWxbMF0ueHl6LCBVTklfbW9kZWxbMV0ueHl6LCBVTklfbW9kZWxbMl0ueHl6KTsKKyAgIHZlYzMgd29ybGROb3JtID0gbW9kZWwzICogQVRUUklCX25vcm1hbDsKKyAgIHZlYzMgViA9IG5vcm1hbGl6ZSgtd29ybGRQb3MueHl6KTsKKworICAgdmVjMyBsaWdodDBWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MF9Qb3Npc2lvbi54eXogLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDBSID0gLXJlZmxlY3QobGlnaHQwVmVjLCB3b3JsZE5vcm0pOworICAgbGlnaHQwX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDBWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHQwX0RpZmZ1c2U7CisgICBmbG9hdCBsaWdodDBTcGVjID0gY2xhbXAoZG90KGxpZ2h0MFIsIFYpLCAwLjAwMSwgMS4wKTsKKyAgIGxpZ2h0MF9TcGVjdWxhciA9IHBvdyhsaWdodDBTcGVjLCBVTklfbGlnaHQwX0Nvc2luZVBvd2VyKSAqIFVOSV9saWdodDBfU3BlY3VsYXI7CisKKyAgIHZlYzMgbGlnaHQxVmVjID0gbm9ybWFsaXplKFVOSV9saWdodDFfUG9zaXNpb24ueHl6IC0gd29ybGRQb3MueHl6KTsKKyAgIHZlYzMgbGlnaHQxUiA9IHJlZmxlY3QobGlnaHQxVmVjLCB3b3JsZE5vcm0pOworICAgbGlnaHQxX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDFWZWMpLCAwLjAsIDEuMCkgKiBVTklfbGlnaHQxX0RpZmZ1c2U7CisgICBmbG9hdCBsaWdodDFTcGVjID0gY2xhbXAoZG90KGxpZ2h0MVIsIFYpLCAwLjAwMSwgMS4wKTsKKyAgIGxpZ2h0MV9TcGVjdWxhciA9IHBvdyhsaWdodDFTcGVjLCBVTklfbGlnaHQxX0Nvc2luZVBvd2VyKSAqIFVOSV9saWdodDFfU3BlY3VsYXI7CisKKyAgIGdsX1BvaW50U2l6ZSA9IDEuMDsKKyAgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3Jlcy9yYXcvdG9ydXMuYTNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjJiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc0xpc3QuamF2YSBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL1JzTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGUzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc0xpc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLm1pc2NzYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBSc0xpc3QgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzTGlzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNMaXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3LnBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL1JzTGlzdFJTLmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLm1pc2NzYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSc0xpc3RSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAiQWZnaGFuaXN0YW4iLCAiQWxiYW5pYSIsICJBbGdlcmlhIiwgIkFtZXJpY2FuIFNhbW9hIiwgIkFuZG9ycmEiLAorICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgIkJhaHJhaW4iLCAiQmFuZ2xhZGVzaCIsICJCYXJiYWRvcyIsICJCZWxhcnVzIiwgIkJlbGdpdW0iLAorICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLCAiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyIsICJCcnVuZWkiLCAiQnVsZ2FyaWEiLAorICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICJDaHJpc3RtYXMgSXNsYW5kIiwgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzIiwgIkNvbG9tYmlhIiwgIkNvbW9yb3MiLCAiQ29uZ28iLAorICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICJFYXN0IFRpbW9yIiwgIkVjdWFkb3IiLCAiRWd5cHQiLCAiRWwgU2FsdmFkb3IiLCAiRXF1YXRvcmlhbCBHdWluZWEiLCAiRXJpdHJlYSIsCisgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMiLCAiR2Fib24iLCAiR2VvcmdpYSIsICJHZXJtYW55IiwgIkdoYW5hIiwgIkdpYnJhbHRhciIsCisgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgIkljZWxhbmQiLCAiSW5kaWEiLCAiSW5kb25lc2lhIiwgIklyYW4iLCAiSXJhcSIsICJJcmVsYW5kIiwgIklzcmFlbCIsICJJdGFseSIsICJKYW1haWNhIiwKKyAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAiTWFjYXUiLCAiTWFkYWdhc2NhciIsICJNYWxhd2kiLCAiTWFsYXlzaWEiLCAiTWFsZGl2ZXMiLCAiTWFsaSIsICJNYWx0YSIsICJNYXJzaGFsbCBJc2xhbmRzIiwKKyAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAiTmF1cnUiLCAiTmVwYWwiLCAiTmV0aGVybGFuZHMiLCAiTmV0aGVybGFuZHMgQW50aWxsZXMiLCAiTmV3IENhbGVkb25pYSIsICJOZXcgWmVhbGFuZCIsCisgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAiUGhpbGlwcGluZXMiLCAiUGl0Y2Fpcm4gSXNsYW5kcyIsICJQb2xhbmQiLCAiUG9ydHVnYWwiLCAiUHVlcnRvIFJpY28iLCAiUWF0YXIiLAorICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsICJTYW1vYSIsICJTYW4gTWFyaW5vIiwgIlNhdWRpIEFyYWJpYSIsICJTZW5lZ2FsIiwKKyAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAiU3BhaW4iLCAiU3JpIExhbmthIiwgIlN1ZGFuIiwgIlN1cmluYW1lIiwgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLCAiU3dhemlsYW5kIiwgIlN3ZWRlbiIsCisgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgIlR1cmttZW5pc3RhbiIsICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCAiVHV2YWx1IiwgIlZpcmdpbiBJc2xhbmRzIiwgIlVnYW5kYSIsCisgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICJWYW51YXR1IiwgIlZhdGljYW4gQ2l0eSIsICJWZW5lenVlbGEiLCAiVmlldG5hbSIsICJXYWxsaXMgYW5kIEZ1dHVuYSIsICJXZXN0ZXJuIFNhaGFyYSIsCisgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBwdWJsaWMgUnNMaXN0UlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKworICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtTGlzdEFsbG9jczsKKworICAgIHByaXZhdGUgU2NyaXB0Q19yc2xpc3QgbVNjcmlwdDsKKworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKDAuMGYpOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Nb3ZlKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpbnQgZHkgPSBtTGFzdFkgLSB5OworCisgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3JzbGlzdChtUlMsIG1SZXMsIFIucmF3LnJzbGlzdCk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgREFUQV9MSVNULmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREFUQV9MSVNULmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbGlzdEVsZW0gPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0oKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnRleHQgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBEQVRBX0xJU1RbaV0sIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgICAgIG1MaXN0QWxsb2NzLnNldChsaXN0RWxlbSwgaSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nTGlzdChtTGlzdEFsbG9jcyk7CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xEX0lUQUxJQywgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL1JzTGlzdFZpZXcuamF2YSBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZlNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMubWlzY3NhbXBsZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzTGlzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSc0xpc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgZW5zdXJlUmVuZGVyU2NyaXB0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSc0xpc3RSUyBtUmVuZGVyOworCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJlbmRlclNjcmlwdCgpIHsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNMaXN0UlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIGVuc3VyZVJlbmRlclNjcmlwdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBtUmVuZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdEdMKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFjdCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbk1vdmUoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGVhNzZlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnJzLm1pc2NzYW1wbGVzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlcyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJzUmVuZGVyU3RhdGVzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcucmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcucGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzE5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQucnMubWlzY3NhbXBsZXM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0uVGV4dHVyZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlc1JTIHsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisKKyAgICBwdWJsaWMgUnNSZW5kZXJTdGF0ZXNSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtV2lkdGggPSBtUlMuZ2V0V2lkdGgoKTsKKyAgICAgICAgbUhlaWdodCA9IG1SUy5nZXRIZWlnaHQoKTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIG1PcHRpb25zQVJHQi5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICBtTW9kZSA9IDA7CisgICAgICAgIG1NYXhNb2RlcyA9IDA7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKCkgeworICAgICAgICBtV2lkdGggPSBtUlMuZ2V0V2lkdGgoKTsKKyAgICAgICAgbUhlaWdodCA9IG1SUy5nZXRIZWlnaHQoKTsKKworICAgICAgICBNYXRyaXg0ZiBwcm9qID0gbmV3IE1hdHJpeDRmKCk7CisgICAgICAgIHByb2oubG9hZE9ydGhvV2luZG93KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIG1QVkEuc2V0UHJvamVjdGlvbihwcm9qKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgcHJpdmF0ZSBTYW1wbGVyIG1MaW5lYXJDbGFtcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbUxpbmVhcldyYXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1NaXBMaW5lYXJXcmFwOworICAgIHByaXZhdGUgU2FtcGxlciBtTmVhcmVzdENsYW1wOworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyQW5pc284OworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyQW5pc28xNTsKKworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFscGhhOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFkZDsKKworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRUZXh0dXJlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDb2xvcjsKKworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXhGaXhlZEZ1bmN0aW9uLkNvbnN0YW50cyBtUFZBOworCisgICAgLy8gQ3VzdG9tIHNoYWRlcnMKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXhDdXN0b207CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudEN1c3RvbTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50TXVsdGl0ZXg7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJDb25zdGFudHNfcyBtVlNDb25zdDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50czJfcyBtVlNDb25zdDI7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9GcmFnZW50U2hhZGVyQ29uc3RhbnRzX3MgbUZTQ29uc3Q7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9GcmFnZW50U2hhZGVyQ29uc3RhbnRzMl9zIG1GU0NvbnN0MjsKKworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleEN1c3RvbTI7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudEN1c3RvbTI7CisKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXhDdWJlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDdWJlOworCisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsQmFjazsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxGcm9udDsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxOb25lOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUb3J1czsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleE9wYXF1ZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleFRyYW5zcGFyZW50OworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4Q2hlY2tlcjsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleEN1YmU7CisKKyAgICBwcml2YXRlIE1lc2ggbU1ieU5NZXNoOworICAgIHByaXZhdGUgTWVzaCBtVG9ydXM7CisKKyAgICBGb250IG1Gb250U2FuczsKKyAgICBGb250IG1Gb250U2VyaWY7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZDsKKyAgICBGb250IG1Gb250U2VyaWZJdGFsaWM7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZEl0YWxpYzsKKyAgICBGb250IG1Gb250TW9ubzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19yc3JlbmRlcnN0YXRlcyBtU2NyaXB0OworCisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgbU9wdGlvbnNBUkdCID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworCisgICAgaW50IG1Nb2RlOworICAgIGludCBtTWF4TW9kZXM7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1Nb2RlICsrOworICAgICAgICBtTW9kZSA9IG1Nb2RlICUgbU1heE1vZGVzOworICAgICAgICBtU2NyaXB0LnNldF9nRGlzcGxheU1vZGUobU1vZGUpOworICAgIH0KKworICAgIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9ORShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgTWVzaCBnZXRNYnlOTWVzaChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBpbnQgd1Jlc29sdXRpb24sIGludCBoUmVzb2x1dGlvbikgeworCisgICAgICAgIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0bWIgPSBuZXcgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuVEVYVFVSRV8wKTsKKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8PSBoUmVzb2x1dGlvbjsgeSsrKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBub3JtYWxpemVkWSA9IChmbG9hdCl5IC8gaFJlc29sdXRpb247CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB5T2Zmc2V0ID0gKG5vcm1hbGl6ZWRZIC0gMC41ZikgKiBoZWlnaHQ7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8PSB3UmVzb2x1dGlvbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFggPSAoZmxvYXQpeCAvIHdSZXNvbHV0aW9uOworICAgICAgICAgICAgICAgIGZsb2F0IHhPZmZzZXQgPSAobm9ybWFsaXplZFggLSAwLjVmKSAqIHdpZHRoOworICAgICAgICAgICAgICAgIHRtYi5zZXRUZXh0dXJlKG5vcm1hbGl6ZWRYLCBub3JtYWxpemVkWSk7CisgICAgICAgICAgICAgICAgdG1iLmFkZFZlcnRleCh4T2Zmc2V0LCB5T2Zmc2V0KTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhSZXNvbHV0aW9uOyB5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJZID0geSAqICh3UmVzb2x1dGlvbiArIDEpOworICAgICAgICAgICAgZmluYWwgaW50IGJlbG93WSA9ICh5ICsgMSkgKiAod1Jlc29sdXRpb24gKyAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgICAgIGludCBjdXJWID0gY3VyWSArIHg7CisgICAgICAgICAgICAgICAgaW50IGJlbG93ViA9IGJlbG93WSArIHg7CisgICAgICAgICAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKGN1clYsIGJlbG93ViwgY3VyViArIDEpOworICAgICAgICAgICAgICAgIHRtYi5hZGRUcmlhbmdsZShiZWxvd1YsIGJlbG93ViArIDEsIGN1clYgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0bWIuY3JlYXRlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVN0b3JlKCkgeworICAgICAgICAvLyBVc2Ugc3RvY2sgdGhlIHN0b2NrIHByb2dyYW0gc3RvcmUgb2JqZWN0CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX1RFU1QobVJTKTsKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kTm9uZSA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX05PTkUobVJTKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gcHJvZ3JhbSBzdG9yZQorICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrRW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZEFscGhhID0gYnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBtUHJvZ1N0b3JlQmxlbmRBZGQgPSBCTEVORF9BRERfREVQVEhfTk9ORShtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aChtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmROb25lKG1Qcm9nU3RvcmVCbGVuZE5vbmUpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBbHBoYShtUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZEFkZChtUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbUZyYWdtZW50KCkgeworCisgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlciB0ZXhCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlcihtUlMpOworICAgICAgICB0ZXhCdWlsZGVyLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRUZXh0dXJlID0gdGV4QnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgbVByb2dGcmFnbWVudFRleHR1cmUuYmluZFNhbXBsZXIobUxpbmVhckNsYW1wLCAwKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIgY29sQnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgY29sQnVpbGRlci5zZXRWYXJ5aW5nQ29sb3IoZmFsc2UpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q29sb3IgPSBjb2xCdWlsZGVyLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDb2xvcihtUHJvZ0ZyYWdtZW50Q29sb3IpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50VGV4dHVyZShtUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtVmVydGV4KCkgeworICAgICAgICBQcm9ncmFtVmVydGV4Rml4ZWRGdW5jdGlvbi5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4Rml4ZWRGdW5jdGlvbi5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1Qcm9nVmVydGV4ID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleEZpeGVkRnVuY3Rpb24uQ29uc3RhbnRzKG1SUyk7CisgICAgICAgICgoUHJvZ3JhbVZlcnRleEZpeGVkRnVuY3Rpb24pbVByb2dWZXJ0ZXgpLmJpbmRDb25zdGFudHMobVBWQSk7CisgICAgICAgIE1hdHJpeDRmIHByb2ogPSBuZXcgTWF0cml4NGYoKTsKKyAgICAgICAgcHJvai5sb2FkT3J0aG9XaW5kb3cobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgbVBWQS5zZXRQcm9qZWN0aW9uKHByb2opOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4KG1Qcm9nVmVydGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEN1c3RvbVNoYWRlcnMoKSB7CisgICAgICAgIG1WU0NvbnN0ID0gbmV3IFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisgICAgICAgIG1WU0NvbnN0MiA9IG5ldyBTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJDb25zdGFudHMyX3MobVJTLCAxKTsKKyAgICAgICAgbUZTQ29uc3QgPSBuZXcgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisgICAgICAgIG1GU0NvbnN0MiA9IG5ldyBTY3JpcHRGaWVsZF9GcmFnZW50U2hhZGVyQ29uc3RhbnRzMl9zKG1SUywgMSk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dWU0NvbnN0YW50cyhtVlNDb25zdCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nVlNDb25zdGFudHMyKG1WU0NvbnN0Mik7CisgICAgICAgIG1TY3JpcHQuYmluZF9nRlNDb25zdGFudHMobUZTQ29uc3QpOworICAgICAgICBtU2NyaXB0LmJpbmRfZ0ZTQ29uc3RhbnRzMihtRlNDb25zdDIpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNoYWRlciBidWlsZGVyCisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmJDdXN0b20gPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcHZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJ2KTsKKyAgICAgICAgLy8gVXNlIGEgc2NyaXB0IGZpZWxkIHRvIHNwY2lmeSB0aGUgaW5wdXQgbGF5b3V0CisgICAgICAgIHB2YkN1c3RvbS5hZGRJbnB1dChTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJJbnB1dHNfcy5jcmVhdGVFbGVtZW50KG1SUykpOworICAgICAgICAvLyBEZWZpbmUgdGhlIGNvbnN0YW50IGlucHV0IGxheW91dAorICAgICAgICBwdmJDdXN0b20uYWRkQ29uc3RhbnQobVZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIG1Qcm9nVmVydGV4Q3VzdG9tID0gcHZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbS5iaW5kQ29uc3RhbnRzKG1WU0NvbnN0LmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJmKTsKKyAgICAgICAgLy9UZWxsIHRoZSBidWlsZGVyIGhvdyBtYW55IHRleHR1cmVzIHdlIGhhdmUKKyAgICAgICAgcGZiQ3VzdG9tLmFkZFRleHR1cmUoUHJvZ3JhbS5UZXh0dXJlVHlwZS5URVhUVVJFXzJEKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcGZiQ3VzdG9tLmFkZENvbnN0YW50KG1GU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tLmJpbmRDb25zdGFudHMobUZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLCAwKTsKKworICAgICAgICBwdmJDdXN0b20gPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIHB2YkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcuc2hhZGVyYXJyYXl2KTsKKyAgICAgICAgcHZiQ3VzdG9tLmFkZElucHV0KFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlcklucHV0c19zLmNyZWF0ZUVsZW1lbnQobVJTKSk7CisgICAgICAgIHB2YkN1c3RvbS5hZGRDb25zdGFudChtVlNDb25zdDIuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIG1Qcm9nVmVydGV4Q3VzdG9tMiA9IHB2YkN1c3RvbS5jcmVhdGUoKTsKKyAgICAgICAgbVByb2dWZXJ0ZXhDdXN0b20yLmJpbmRDb25zdGFudHMobVZTQ29uc3QyLmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIHBmYkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcuc2hhZGVyYXJyYXlmKTsKKyAgICAgICAgcGZiQ3VzdG9tLmFkZFRleHR1cmUoUHJvZ3JhbS5UZXh0dXJlVHlwZS5URVhUVVJFXzJEKTsKKyAgICAgICAgcGZiQ3VzdG9tLmFkZENvbnN0YW50KG1GU0NvbnN0Mi5nZXRBbGxvY2F0aW9uKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgbVByb2dGcmFnbWVudEN1c3RvbTIgPSBwZmJDdXN0b20uY3JlYXRlKCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRDdXN0b20yLmJpbmRDb25zdGFudHMobUZTQ29uc3QyLmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgLy8gQ3ViZW1hcCB0ZXN0IHNoYWRlcnMKKyAgICAgICAgcHZiQ3VzdG9tID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBwdmJDdXN0b20uc2V0U2hhZGVyKG1SZXMsIFIucmF3LnNoYWRlcmN1YmV2KTsKKyAgICAgICAgcHZiQ3VzdG9tLmFkZElucHV0KFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlcklucHV0c19zLmNyZWF0ZUVsZW1lbnQobVJTKSk7CisgICAgICAgIHB2YkN1c3RvbS5hZGRDb25zdGFudChtVlNDb25zdC5nZXRBbGxvY2F0aW9uKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgbVByb2dWZXJ0ZXhDdWJlID0gcHZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICBtUHJvZ1ZlcnRleEN1YmUuYmluZENvbnN0YW50cyhtVlNDb25zdC5nZXRBbGxvY2F0aW9uKCksIDApOworCisgICAgICAgIHBmYkN1c3RvbSA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBwZmJDdXN0b20uc2V0U2hhZGVyKG1SZXMsIFIucmF3LnNoYWRlcmN1YmVmKTsKKyAgICAgICAgcGZiQ3VzdG9tLmFkZFRleHR1cmUoUHJvZ3JhbS5UZXh0dXJlVHlwZS5URVhUVVJFX0NVQkUpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q3ViZSA9IHBmYkN1c3RvbS5jcmVhdGUoKTsKKworICAgICAgICBwZmJDdXN0b20gPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5tdWx0aXRleGYpOworICAgICAgICBmb3IgKGludCB0ZXhDb3VudCA9IDA7IHRleENvdW50IDwgMzsgdGV4Q291bnQgKyspIHsKKyAgICAgICAgICAgIHBmYkN1c3RvbS5hZGRUZXh0dXJlKFByb2dyYW0uVGV4dHVyZVR5cGUuVEVYVFVSRV8yRCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb2dGcmFnbWVudE11bHRpdGV4ID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4Q3VzdG9tKG1Qcm9nVmVydGV4Q3VzdG9tKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudEN1c3RvbShtUHJvZ0ZyYWdtZW50Q3VzdG9tKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXhDdXN0b20yKG1Qcm9nVmVydGV4Q3VzdG9tMik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDdXN0b20yKG1Qcm9nRnJhZ21lbnRDdXN0b20yKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXhDdWJlKG1Qcm9nVmVydGV4Q3ViZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDdWJlKG1Qcm9nRnJhZ21lbnRDdWJlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudE11bHRpdGV4KG1Qcm9nRnJhZ21lbnRNdWx0aXRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlUkdCKGludCBpZCkgeworICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2UobVJTLCBtUmVzLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uTWlwbWFwQ29udHJvbC5NSVBNQVBfT05fU1lOQ19UT19URVhUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbi5VU0FHRV9HUkFQSElDU19URVhUVVJFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbG9hZFRleHR1cmVBUkdCKGludCBpZCkgeworICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobVJlcywgaWQsIG1PcHRpb25zQVJHQik7CisgICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXAobVJTLCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uTWlwbWFwQ29udHJvbC5NSVBNQVBfT05fU1lOQ19UT19URVhUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVEVYVFVSRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZXMoKSB7CisgICAgICAgIG1UZXhUb3J1cyA9IGxvYWRUZXh0dXJlUkdCKFIuZHJhd2FibGUudG9ydXNtYXApOworICAgICAgICBtVGV4T3BhcXVlID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbVRleFRyYW5zcGFyZW50ID0gbG9hZFRleHR1cmVBUkdCKFIuZHJhd2FibGUubGVhZik7CisgICAgICAgIG1UZXhDaGVja2VyID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS5jaGVja2VyKTsKKyAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKG1SZXMsIFIuZHJhd2FibGUuY3ViZW1hcF90ZXN0KTsKKyAgICAgICAgbVRleEN1YmUgPSBBbGxvY2F0aW9uLmNyZWF0ZUN1YmVtYXBGcm9tQml0bWFwKG1SUywgYik7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRvcnVzKG1UZXhUb3J1cyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhPcGFxdWUobVRleE9wYXF1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhUcmFuc3BhcmVudChtVGV4VHJhbnNwYXJlbnQpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4Q2hlY2tlcihtVGV4Q2hlY2tlcik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhDdWJlKG1UZXhDdWJlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEZvbnRzKCkgeworICAgICAgICAvLyBTYW5zIGZvbnQgYnkgZmFtaWx5IG5hbWUKKyAgICAgICAgbUZvbnRTYW5zID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAic2Fucy1zZXJpZiIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKyAgICAgICAgbUZvbnRTZXJpZiA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udHMgYnkgZmFtaWx5IGFuZCBzdHlsZQorICAgICAgICBtRm9udFNlcmlmQm9sZCA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xELCA4KTsKKyAgICAgICAgbUZvbnRTZXJpZkl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5JVEFMSUMsIDgpOworICAgICAgICBtRm9udFNlcmlmQm9sZEl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xEX0lUQUxJQywgOCk7CisgICAgICAgIG1Gb250TW9ubyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIm1vbm8iLCBGb250LlN0eWxlLk5PUk1BTCwgOCk7CisKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsICJTdHJpbmcgZnJvbSBhbGxvY2F0aW9uIiwgQWxsb2NhdGlvbi5VU0FHRV9TQ1JJUFQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2FucyhtRm9udFNhbnMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmKG1Gb250U2VyaWYpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZChtRm9udFNlcmlmQm9sZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWZJdGFsaWMobUZvbnRTZXJpZkl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWZCb2xkSXRhbGljKG1Gb250U2VyaWZCb2xkSXRhbGljKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRNb25vKG1Gb250TW9ubyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXh0QWxsb2MobVRleHRBbGxvYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRNZXNoKCkgeworICAgICAgICBtTWJ5Tk1lc2ggPSBnZXRNYnlOTWVzaCgyNTYsIDI1NiwgMTAsIDEwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01ieU5NZXNoKG1NYnlOTWVzaCk7CisKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbVJlc291cmNlKG1SUywgbVJlcywgUi5yYXcudG9ydXMpOworICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KDApOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRFbnRyeVR5cGUoKSAhPSBGaWxlQTNELkVudHJ5VHlwZS5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ub3J1cyA9IChNZXNoKWVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ1RvcnVzTWVzaChtVG9ydXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRTYW1wbGVycygpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW5pZmljYXRpb24oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWduaWZpY2F0aW9uKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5XUkFQKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5XUkFQKTsKKyAgICAgICAgbUxpbmVhcldyYXAgPSBicy5jcmVhdGUoKTsKKworICAgICAgICBtTGluZWFyQ2xhbXAgPSBTYW1wbGVyLkNMQU1QX0xJTkVBUihtUlMpOworICAgICAgICBtTmVhcmVzdENsYW1wID0gU2FtcGxlci5DTEFNUF9ORUFSRVNUKG1SUyk7CisgICAgICAgIG1NaXBMaW5lYXJXcmFwID0gU2FtcGxlci5XUkFQX0xJTkVBUl9NSVBfTElORUFSKG1SUyk7CisKKyAgICAgICAgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbmlmaWNhdGlvbihTYW1wbGVyLlZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnbmlmaWNhdGlvbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldEFuaXNvdHJvcHkoOC4wZik7CisgICAgICAgIG1NaXBMaW5lYXJBbmlzbzggPSBicy5jcmVhdGUoKTsKKyAgICAgICAgYnMuc2V0QW5pc290cm9weSgxNS4wZik7CisgICAgICAgIG1NaXBMaW5lYXJBbmlzbzE1ID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0xpbmVhckNsYW1wKG1MaW5lYXJDbGFtcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJXcmFwKG1MaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01pcExpbmVhcldyYXAobU1pcExpbmVhcldyYXApOworICAgICAgICBtU2NyaXB0LnNldF9nTWlwTGluZWFyQW5pc284KG1NaXBMaW5lYXJBbmlzbzgpOworICAgICAgICBtU2NyaXB0LnNldF9nTWlwTGluZWFyQW5pc28xNShtTWlwTGluZWFyQW5pc28xNSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dOZWFyZXN0Q2xhbXAobU5lYXJlc3RDbGFtcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtUmFzdGVyKCkgeworICAgICAgICBtQ3VsbEJhY2sgPSBQcm9ncmFtUmFzdGVyLkNVTExfQkFDSyhtUlMpOworICAgICAgICBtQ3VsbEZyb250ID0gUHJvZ3JhbVJhc3Rlci5DVUxMX0ZST05UKG1SUyk7CisgICAgICAgIG1DdWxsTm9uZSA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9OT05FKG1SUyk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0N1bGxCYWNrKG1DdWxsQmFjayk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsRnJvbnQobUN1bGxGcm9udCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsTm9uZShtQ3VsbE5vbmUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3JzcmVuZGVyc3RhdGVzKG1SUywgbVJlcywgUi5yYXcucnNyZW5kZXJzdGF0ZXMpOworCisgICAgICAgIG1NYXhNb2RlcyA9IG1TY3JpcHQuZ2V0X2dNYXhNb2RlcygpOworCisgICAgICAgIGluaXRTYW1wbGVycygpOworICAgICAgICBpbml0UHJvZ3JhbVN0b3JlKCk7CisgICAgICAgIGluaXRQcm9ncmFtRnJhZ21lbnQoKTsKKyAgICAgICAgaW5pdFByb2dyYW1WZXJ0ZXgoKTsKKyAgICAgICAgaW5pdEZvbnRzKCk7CisgICAgICAgIGxvYWRJbWFnZXMoKTsKKyAgICAgICAgaW5pdE1lc2goKTsKKyAgICAgICAgaW5pdFByb2dyYW1SYXN0ZXIoKTsKKyAgICAgICAgaW5pdEN1c3RvbVNoYWRlcnMoKTsKKworICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNWaWV3LmphdmEgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTVlMzhmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNWaWV3LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ycy5taXNjc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CisKK3B1YmxpYyBjbGFzcyBSc1JlbmRlclN0YXRlc1ZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSc1JlbmRlclN0YXRlc1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBlbnN1cmVSZW5kZXJTY3JpcHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJzUmVuZGVyU3RhdGVzUlMgbVJlbmRlcjsKKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSZW5kZXJTY3JpcHQoKSB7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICBzYy5zZXREZXB0aCgxNiwgMjQpOworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0R0woc2MpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSc1JlbmRlclN0YXRlc1JTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworICAgICAgICBlbnN1cmVSZW5kZXJTY3JpcHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgbVJlbmRlci5zdXJmYWNlQ2hhbmdlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBtUmVuZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdEdMKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL3JzbGlzdC5ycyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL3JzbGlzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJkYWUyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvcnNsaXN0LnJzCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uZXhhbXBsZS5hbmRyb2lkLnJzLm1pc2NzYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCit2b2lkIGluaXQoKSB7CisgICAgZ0RZID0gMC4wZjsKK30KKworaW50IHRleHRQb3MgPSAwOworCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYzsKKyAgICByc1NldE9iamVjdCgmbGlzdEFsbG9jLCByc0dldEFsbG9jYXRpb24oZ0xpc3QpKTsKKyAgICBpbnQgYWxsb2NTaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChsaXN0QWxsb2MpOworCisgICAgaW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gcnNnR2V0SGVpZ2h0KCk7CisKKyAgICBpbnQgaXRlbUhlaWdodCA9IDgwOworICAgIGludCBjdXJyZW50WVBvcyA9IGl0ZW1IZWlnaHQgKyB0ZXh0UG9zOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYgKGN1cnJlbnRZUG9zIC0gaXRlbUhlaWdodCA+IGhlaWdodCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudFlQb3MgPiAwKSB7CisgICAgICAgICAgICByc2dEcmF3UmVjdCgwLCBjdXJyZW50WVBvcyAtIDEsIHdpZHRoLCBjdXJyZW50WVBvcywgMCk7CisgICAgICAgICAgICByc2dEcmF3VGV4dChnTGlzdFtpXS50ZXh0LCAzMCwgY3VycmVudFlQb3MgLSAzMik7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFlQb3MgKz0gaXRlbUhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL3JzcmVuZGVyc3RhdGVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZWM4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9NaXNjU2FtcGxlcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ycy9taXNjc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpAQCAtMCwwICsxLDY4MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5leGFtcGxlLmFuZHJvaWQucnMubWlzY3NhbXBsZXMpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisjaW5jbHVkZSAic2hhZGVyX2RlZi5yc2giCisKK2NvbnN0IGludCBnTWF4TW9kZXMgPSAxMTsKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1Byb2dWZXJ0ZXg7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRDb2xvcjsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudFRleHR1cmU7CisKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBbHBoYTsKK3JzX3Byb2dyYW1fc3RvcmUgZ1Byb2dTdG9yZUJsZW5kQWRkOworCityc19hbGxvY2F0aW9uIGdUZXhPcGFxdWU7Cityc19hbGxvY2F0aW9uIGdUZXhUb3J1czsKK3JzX2FsbG9jYXRpb24gZ1RleFRyYW5zcGFyZW50OworcnNfYWxsb2NhdGlvbiBnVGV4Q2hlY2tlcjsKK3JzX2FsbG9jYXRpb24gZ1RleEN1YmU7CisKK3JzX21lc2ggZ01ieU5NZXNoOworcnNfbWVzaCBnVG9ydXNNZXNoOworCityc19mb250IGdGb250U2FuczsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZjsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGQ7Cityc19mb250IGdGb250U2VyaWZJdGFsaWM7Cityc19mb250IGdGb250U2VyaWZCb2xkSXRhbGljOworcnNfZm9udCBnRm9udE1vbm87Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKK2ludCBnRGlzcGxheU1vZGU7CisKK3JzX3NhbXBsZXIgZ0xpbmVhckNsYW1wOworcnNfc2FtcGxlciBnTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ01pcExpbmVhcldyYXA7Cityc19zYW1wbGVyIGdNaXBMaW5lYXJBbmlzbzg7Cityc19zYW1wbGVyIGdNaXBMaW5lYXJBbmlzbzE1OworcnNfc2FtcGxlciBnTmVhcmVzdENsYW1wOworCityc19wcm9ncmFtX3Jhc3RlciBnQ3VsbEJhY2s7Cityc19wcm9ncmFtX3Jhc3RlciBnQ3VsbEZyb250OworcnNfcHJvZ3JhbV9yYXN0ZXIgZ0N1bGxOb25lOworCisvLyBDdXN0b20gdmVydGV4IHNoYWRlciBjb21wdW5lbnRzCitWZXJ0ZXhTaGFkZXJDb25zdGFudHMgKmdWU0NvbnN0YW50czsKK1ZlcnRleFNoYWRlckNvbnN0YW50czIgKmdWU0NvbnN0YW50czI7CitGcmFnZW50U2hhZGVyQ29uc3RhbnRzICpnRlNDb25zdGFudHM7CitGcmFnZW50U2hhZGVyQ29uc3RhbnRzMiAqZ0ZTQ29uc3RhbnRzMjsKKy8vIEV4cG9ydCB0aGVzZSBvdXQgdG8gZWFzaWx5IHNldCB0aGUgaW5wdXRzIHRvIHNoYWRlcgorVmVydGV4U2hhZGVySW5wdXRzICpnVlNJbnB1dHM7CisvLyBDdXN0b20gc2hhZGVycyB3ZSB1c2UgZm9yIGxpZ2h0aW5nCityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleEN1c3RvbTsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudEN1c3RvbTsKK3JzX3Byb2dyYW1fdmVydGV4IGdQcm9nVmVydGV4Q3VzdG9tMjsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudEN1c3RvbTI7Cityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleEN1YmU7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRDdWJlOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50TXVsdGl0ZXg7CisKK2Zsb2F0IGdEdCA9IDA7CisKK3ZvaWQgaW5pdCgpIHsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheUZvbnRTYW1wbGVzKCkgeworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBpbnQgeVBvcyA9IDEwMDsKKyAgICByc2dCaW5kRm9udChnRm9udFNhbnMpOworICAgIHJzZ0RyYXdUZXh0KCJTYW5zIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuOWYsIDAuNWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWYpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjdmLCAwLjdmLCAwLjdmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmQm9sZCk7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIEJvbGQgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC41ZiwgMC41ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkl0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIEl0YWxpYyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmQm9sZEl0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIEJvbGQgSXRhbGljIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiTW9ub3NwYWNlIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gNTA7CisKKyAgICAvLyBOb3cgdXNlIHRleHQgbWV0cmljcyB0byBjZW50ZXIgdGhlIHRleHQKKyAgICB1aW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKKyAgICB1aW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworCisgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOTVmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmQm9sZEl0YWxpYyk7CisKKyAgICByc2dNZWFzdXJlVGV4dChnVGV4dEFsbG9jLCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICBpbnQgY2VudGVyZWRQb3MgPSB3aWR0aCAvIDIgLSAocmlnaHQgLSBsZWZ0KSAvIDI7CisgICAgcnNnRHJhd1RleHQoZ1RleHRBbGxvYywgY2VudGVyZWRQb3MsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisKKyAgICBjb25zdCBjaGFyKiB0ZXh0ID0gIkNlbnRlcmVkIFRleHQgU2FtcGxlIjsKKyAgICByc2dNZWFzdXJlVGV4dCh0ZXh0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICBjZW50ZXJlZFBvcyA9IHdpZHRoIC8gMiAtIChyaWdodCAtIGxlZnQpIC8gMjsKKyAgICByc2dEcmF3VGV4dCh0ZXh0LCBjZW50ZXJlZFBvcywgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKworICAgIHJzZ0JpbmRGb250KGdGb250U2Fucyk7CisgICAgdGV4dCA9ICJNb3JlIENlbnRlcmVkIFRleHQgU2FtcGxlcyI7CisgICAgcnNnTWVhc3VyZVRleHQodGV4dCwgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgY2VudGVyZWRQb3MgPSB3aWR0aCAvIDIgLSAocmlnaHQgLSBsZWZ0KSAvIDI7CisgICAgcnNnRHJhd1RleHQodGV4dCwgY2VudGVyZWRQb3MsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisKKyAgICAvLyBOb3cgZHJhdyBib3R0b20gYW5kIHRvcCByaWdodCBhbGlnbmVkIHRleHQKKyAgICB0ZXh0ID0gIlRvcC1yaWdodCBhbGlnbmVkIHRleHQiOworICAgIHJzZ01lYXN1cmVUZXh0KHRleHQsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIHJzZ0RyYXdUZXh0KHRleHQsIHdpZHRoIC0gcmlnaHQsIHRvcCk7CisKKyAgICB0ZXh0ID0gIlRvcC1sZWZ0IjsKKyAgICByc2dNZWFzdXJlVGV4dCh0ZXh0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICByc2dEcmF3VGV4dCh0ZXh0LCAtbGVmdCwgdG9wKTsKKworICAgIHRleHQgPSAiQm90dG9tLXJpZ2h0IGFsaWduZWQgdGV4dCI7CisgICAgcnNnTWVhc3VyZVRleHQodGV4dCwgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgcnNnRHJhd1RleHQodGV4dCwgd2lkdGggLSByaWdodCwgaGVpZ2h0ICsgYm90dG9tKTsKKworfQorCitzdGF0aWMgdm9pZCBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCkgeworICAgIC8vIERlZmF1bHQgdmVydGV4IHNhaGRlcgorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkT3J0aG8oJnByb2osIDAsIHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpLCAwLCAtNTAwLCA1MDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICBmbG9hdCBzdGFydFggPSAwLCBzdGFydFkgPSAwOworICAgIGZsb2F0IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIHN0YXJ0WCA9IDIwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDEyODsgaGVpZ2h0ID0gMTI4OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleFRyYW5zcGFyZW50KTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAyMDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgLy8gRnJhZ21lbnQgcHJvZ3JhbSB3aXRoIHNpbXBsZSBjb2xvcgorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC45LCAwLjMsIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoMjAwLCAzMDAsIDM1MCwgNDUwLCAwKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMC4zLCAwLjksIDAuMywgMSk7CisgICAgcnNnRHJhd1JlY3QoNTAsIDQwMCwgNDAwLCA2MDAsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIlRleHR1cmUgc2hhZGVyIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEtYmxlbmRlZCB0ZXh0dXJlIHNoYWRlciIsIDEwLCAyODApOworICAgIHJzZ0RyYXdUZXh0KCJGbGF0IGNvbG9yIHNoYWRlciIsIDEwMCwgNDUwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpIHsKKyAgICBpbnQgaTsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDb2xvcik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMWYqaVBsdXNPbmUsIDAuMmYqaVBsdXNPbmUsIDAuM2YqaVBsdXNPbmUsIDEpOworICAgICAgICBmbG9hdCB5UG9zID0gMTUwICogKGZsb2F0KWk7CisgICAgICAgIHJzZ0RyYXdSZWN0KDAsIHlQb3MsIDIwMCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMC4xZippUGx1c09uZSwgMC41KTsKKyAgICAgICAgZmxvYXQgeVBvcyA9IDE1MCAqIChmbG9hdClpOworICAgICAgICByc2dEcmF3UmVjdCgxNTAsIHlQb3MsIDM1MCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBZGQpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuM2YqaVBsdXNPbmUsIDAuMWYqaVBsdXNPbmUsIDAuMmYqaVBsdXNPbmUsIDAuNSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMzAwLCB5UG9zLCA1MDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk5vIEJsZW5kaW5nIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEgQmxlbmRpbmciLCAxNjAsIDE1MCk7CisgICAgcnNnRHJhd1RleHQoIkFkZGl0aXZlIEJsZW5kaW5nIiwgMzIwLCAyNTApOworCit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlNZXNoU2FtcGxlcygpIHsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbWF0cml4LCAxMjgsIDEyOCwgMCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4T3BhcXVlKTsKKworICAgIHJzZ0RyYXdNZXNoKGdNYnlOTWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiVXNlciBnZW4gMTAgYnkgMTAgZ3JpZCBtZXNoIiwgMTAsIDI1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKSB7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgLy8gTGluZWFyIGNsYW1wCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDMwMCwgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIC8vIExpbmVhciBXcmFwCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJXcmFwKTsKKyAgICBzdGFydFggPSAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBOZWFyZXN0CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdOZWFyZXN0Q2xhbXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMzAwOyBzdGFydFkgPSAzMDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuNSwgMS41LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuNSwgMCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgY2xhbXAiLCAxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgd3JhcCIsIDEwLCA1OTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IG5lYXJlc3QgY2xhbXAiLCAzMTAsIDI5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbWlwbGluZWFyIHdyYXAiLCAzMTAsIDU5MCk7Cit9CisKK3N0YXRpYyBmbG9hdCBnVG9ydXNSb3RhdGlvbiA9IDA7CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlDdWxsaW5nU2FtcGxlcygpIHsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYgKGdUb3J1c1JvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdUb3J1c1JvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIC0yLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworICAgIC8vIFVzZSBmcm9udCBmYWNlIGN1bGxpbmcKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEZyb250KTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbWF0cml4LCAyLjBmLCAwLjBmLCAtMTAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworICAgIC8vIFVzZSBiYWNrIGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsQmFjayk7CisgICAgcnNnRHJhd01lc2goZ1RvcnVzTWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRGlzcGxheWluZyBtZXNoIGZyb250L2JhY2sgZmFjZSBjdWxsaW5nIiwgMTAsIHJzZ0dldEhlaWdodCgpIC0gMTApOworfQorCitzdGF0aWMgZmxvYXQgZ0xpZ2h0MFJvdGF0aW9uID0gMDsKK3N0YXRpYyBmbG9hdCBnTGlnaHQxUm90YXRpb24gPSAwOworCitzdGF0aWMgdm9pZCBzZXR1cEN1c3RvbVNoYWRlckxpZ2h0cygpIHsKKyAgICBmbG9hdDQgbGlnaHQwUG9zID0gey01LjBmLCA1LjBmLCAtMTAuMGYsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDFQb3MgPSB7Mi4wZiwgNS4wZiwgMTUuMGYsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDBEaWZmQ29sID0gezAuOWYsIDAuN2YsIDAuN2YsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDBTcGVjQ29sID0gezAuOWYsIDAuNmYsIDAuNmYsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDFEaWZmQ29sID0gezAuNWYsIDAuNWYsIDAuOWYsIDEuMGZ9OworICAgIGZsb2F0NCBsaWdodDFTcGVjQ29sID0gezAuNWYsIDAuNWYsIDAuOWYsIDEuMGZ9OworCisgICAgZ0xpZ2h0MFJvdGF0aW9uICs9IDUwLjBmICogZ0R0OworICAgIGlmIChnTGlnaHQwUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MFJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDUwLjBmICogZ0R0OworICAgIGlmIChnTGlnaHQxUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbDBNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsME1hdCwgZ0xpZ2h0MFJvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBsaWdodDBQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsME1hdCwgbGlnaHQwUG9zKTsKKyAgICByc19tYXRyaXg0eDQgbDFNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsMU1hdCwgZ0xpZ2h0MVJvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBsaWdodDFQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsMU1hdCwgbGlnaHQxUG9zKTsKKworICAgIC8vIFNldCBsaWdodCAwIHByb3BlcnRpZXMKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbiA9IGxpZ2h0MFBvczsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9EaWZmdXNlID0gMS4wZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhciA9IDAuNWY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfQ29zaW5lUG93ZXIgPSAxMC4wZjsKKyAgICAvLyBTZXQgbGlnaHQgMSBwcm9wZXJ0aWVzCisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24gPSBsaWdodDFQb3M7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfRGlmZnVzZSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfU3BlY3VsYXIgPSAwLjdmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX0Nvc2luZVBvd2VyID0gMjUuMGY7CisgICAgcnNnQWxsb2NhdGlvblN5bmNBbGwocnNHZXRBbGxvY2F0aW9uKGdWU0NvbnN0YW50cykpOworCisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfUG9zaXNpb25bMF0gPSBsaWdodDBQb3M7CisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfRGlmZnVzZVswXSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfU3BlY3VsYXJbMF0gPSAwLjVmOworICAgIGdWU0NvbnN0YW50czItPmxpZ2h0X0Nvc2luZVBvd2VyWzBdID0gMTAuMGY7CisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfUG9zaXNpb25bMV0gPSBsaWdodDFQb3M7CisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfRGlmZnVzZVsxXSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzMi0+bGlnaHRfU3BlY3VsYXJbMV0gPSAwLjdmOworICAgIGdWU0NvbnN0YW50czItPmxpZ2h0X0Nvc2luZVBvd2VyWzFdID0gMjUuMGY7CisgICAgcnNnQWxsb2NhdGlvblN5bmNBbGwocnNHZXRBbGxvY2F0aW9uKGdWU0NvbnN0YW50czIpKTsKKworICAgIC8vIFVwZGF0ZSBmcmFnbWV0biBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gU2V0IGxpZ2h0IDAgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZUNvbG9yID0gbGlnaHQwRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhckNvbG9yID0gbGlnaHQwU3BlY0NvbDsKKyAgICAvLyBTZXQgbGlnaHQgMSBjb2xvcnMKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlQ29sb3IgPSBsaWdodDFEaWZmQ29sOworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyQ29sb3IgPSBsaWdodDFTcGVjQ29sOworICAgIHJzZ0FsbG9jYXRpb25TeW5jQWxsKHJzR2V0QWxsb2NhdGlvbihnRlNDb25zdGFudHMpKTsKKworICAgIGdGU0NvbnN0YW50czItPmxpZ2h0X0RpZmZ1c2VDb2xvclswXSA9IGxpZ2h0MERpZmZDb2w7CisgICAgZ0ZTQ29uc3RhbnRzMi0+bGlnaHRfU3BlY3VsYXJDb2xvclswXSA9IGxpZ2h0MFNwZWNDb2w7CisgICAgLy8gU2V0IGxpZ2h0IDEgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzMi0+bGlnaHRfRGlmZnVzZUNvbG9yWzFdID0gbGlnaHQxRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMyLT5saWdodF9TcGVjdWxhckNvbG9yWzFdID0gbGlnaHQxU3BlY0NvbDsKKyAgICByc2dBbGxvY2F0aW9uU3luY0FsbChyc0dldEFsbG9jYXRpb24oZ0ZTQ29uc3RhbnRzMikpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5Q3VzdG9tU2hhZGVyU2FtcGxlcygpIHsKKworICAgIC8vIFVwZGF0ZSB2ZXJ0ZXggc2hhZGVyIGNvbnN0YW50cworICAgIC8vIExvYWQgbW9kZWwgbWF0cml4CisgICAgLy8gQXBsbHkgYSByb3RhdGlvbiB0byBvdXIgbWVzaAorICAgIGdUb3J1c1JvdGF0aW9uICs9IDUwLjBmICogZ0R0OworICAgIGlmIChnVG9ydXNSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnVG9ydXNSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzLT5tb2RlbCwgZ1RvcnVzUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXgKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmZ1ZTQ29uc3RhbnRzLT5wcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleEN1c3RvbSk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1c3RvbSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudEN1c3RvbSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50Q3VzdG9tLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJDdXN0b20gc2hhZGVyIHNhbXBsZSIsIDEwLCByc2dHZXRIZWlnaHQoKSAtIDEwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMyKCkgeworCisgICAgLy8gVXBkYXRlIHZlcnRleCBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gTG9hZCBtb2RlbCBtYXRyaXgKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYgKGdUb3J1c1JvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdUb3J1c1JvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWwgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmZ1ZTQ29uc3RhbnRzMi0+bW9kZWxbMV0sIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJmdWU0NvbnN0YW50czItPm1vZGVsWzBdKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzMi0+bW9kZWxbMF0sIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzMi0+bW9kZWxbMF0sIGdUb3J1c1JvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJmdWU0NvbnN0YW50czItPnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgc2V0dXBDdXN0b21TaGFkZXJMaWdodHMoKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4Q3VzdG9tMik7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1c3RvbTIpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRDdXN0b20yLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRDdXN0b20yLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJDdXN0b20gc2hhZGVyIHNhbXBsZSB3aXRoIGFycmF5IHVuaWZvcm1zIiwgMTAsIHJzZ0dldEhlaWdodCgpIC0gMTApOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5Q3ViZW1hcFNoYWRlclNhbXBsZSgpIHsKKyAgICAvLyBVcGRhdGUgdmVydGV4IHNoYWRlciBjb25zdGFudHMKKyAgICAvLyBMb2FkIG1vZGVsIG1hdHJpeAorICAgIC8vIEFwbGx5IGEgcm90YXRpb24gdG8gb3VyIG1lc2gKKyAgICBnVG9ydXNSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZiAoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzLT5tb2RlbCwgZ1RvcnVzUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXgKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmZ1ZTQ29uc3RhbnRzLT5wcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ0FsbG9jYXRpb25TeW5jQWxsKHJzR2V0QWxsb2NhdGlvbihnRlNDb25zdGFudHMpKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4Q3ViZSk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1YmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRDdWJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRDdWJlLCAwLCBnVGV4Q3ViZSk7CisKKyAgICAvLyBVc2UgYmFjayBmYWNlIGN1bGxpbmcKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEJhY2spOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIkN1YmVtYXAgc2hhZGVyIHNhbXBsZSIsIDEwLCByc2dHZXRIZWlnaHQoKSAtIDEwKTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheU11bHRpdGV4dHVyZVNhbXBsZSgpIHsKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDEsIGdMaW5lYXJXcmFwKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDIsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAwLCBnVGV4Q2hlY2tlcik7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAxLCBnVGV4VG9ydXMpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMiwgZ1RleFRyYW5zcGFyZW50KTsKKworICAgIGZsb2F0IHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDA7CisgICAgZmxvYXQgd2lkdGggPSAyNTYsIGhlaWdodCA9IDI1NjsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIkN1c3RvbSBzaGFkZXIgd2l0aCBtdWx0aXRleHR1cmluZyIsIDEwLCAyODApOworfQorCitzdGF0aWMgZmxvYXQgZ0FuaXNvVGltZSA9IDAuMGY7CitzdGF0aWMgdWludCBhbmlzb01vZGUgPSAwOworc3RhdGljIHZvaWQgZGlzcGxheUFuaXNvU2FtcGxlKCkgeworCisgICAgZ0FuaXNvVGltZSArPSBnRHQ7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgLTgwLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxOb25lKTsKKworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4Q2hlY2tlcik7CisKKyAgICBpZiAoZ0FuaXNvVGltZSA+PSA1LjBmKSB7CisgICAgICAgIGdBbmlzb1RpbWUgPSAwLjBmOworICAgICAgICBhbmlzb01vZGUgKys7CisgICAgICAgIGFuaXNvTW9kZSA9IGFuaXNvTW9kZSAlIDM7CisgICAgfQorCisgICAgaWYgKGFuaXNvTW9kZSA9PSAwKSB7CisgICAgICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyQW5pc284KTsKKyAgICB9IGVsc2UgaWYgKGFuaXNvTW9kZSA9PSAxKSB7CisgICAgICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyQW5pc28xNSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdNaXBMaW5lYXJXcmFwKTsKKyAgICB9CisKKyAgICBmbG9hdCBzdGFydFggPSAtMTU7CisgICAgZmxvYXQgc3RhcnRZID0gLTE1OworICAgIGZsb2F0IHdpZHRoID0gMzA7CisgICAgZmxvYXQgaGVpZ2h0ID0gMzA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxMCwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEJhY2spOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgaWYgKGFuaXNvTW9kZSA9PSAwKSB7CisgICAgICAgIHJzZ0RyYXdUZXh0KCJBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgOCIsIDEwLCA0MCk7CisgICAgfSBlbHNlIGlmIChhbmlzb01vZGUgPT0gMSkgeworICAgICAgICByc2dEcmF3VGV4dCgiQW5pc290cm9waWMgZmlsdGVyaW5nIDE1IiwgMTAsIDQwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByc2dEcmF3VGV4dCgiTWlwbGluZWFyIGZpbHRlcmluZyIsIDEwLCA0MCk7CisgICAgfQorfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdEdCA9IHJzR2V0RHQoKTsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHN3aXRjaCAoZ0Rpc3BsYXlNb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBkaXNwbGF5Rm9udFNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBkaXNwbGF5U2hhZGVyU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGRpc3BsYXlCbGVuZGluZ1NhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBkaXNwbGF5TWVzaFNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBkaXNwbGF5VGV4dHVyZVNhbXBsZXJzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgZGlzcGxheUN1bGxpbmdTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBkaXNwbGF5TXVsdGl0ZXh0dXJlU2FtcGxlKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgZGlzcGxheUFuaXNvU2FtcGxlKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgOToKKyAgICAgICAgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIGRpc3BsYXlDdWJlbWFwU2hhZGVyU2FtcGxlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL3NoYWRlcl9kZWYucnNoIGIvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvc2hhZGVyX2RlZi5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjZjM2MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L01pc2NTYW1wbGVzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL21pc2NzYW1wbGVzL3NoYWRlcl9kZWYucnNoCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uZXhhbXBsZS5hbmRyb2lkLnJzLm1pc2NzYW1wbGVzKQorCit0eXBlZGVmIHN0cnVjdCBWZXJ0ZXhTaGFkZXJDb25zdGFudHNfcyB7CisgICAgcnNfbWF0cml4NHg0IG1vZGVsOworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0NCBsaWdodDBfUG9zaXNpb247CisgICAgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7CisgICAgZmxvYXQgbGlnaHQwX1NwZWN1bGFyOworICAgIGZsb2F0IGxpZ2h0MF9Db3NpbmVQb3dlcjsKKworICAgIGZsb2F0NCBsaWdodDFfUG9zaXNpb247CisgICAgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7CisgICAgZmxvYXQgbGlnaHQxX1NwZWN1bGFyOworICAgIGZsb2F0IGxpZ2h0MV9Db3NpbmVQb3dlcjsKK30gVmVydGV4U2hhZGVyQ29uc3RhbnRzOworCit0eXBlZGVmIHN0cnVjdCBWZXJ0ZXhTaGFkZXJDb25zdGFudHMyX3MgeworICAgIHJzX21hdHJpeDR4NCBtb2RlbFsyXTsKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICBmbG9hdDQgbGlnaHRfUG9zaXNpb25bMl07CisgICAgZmxvYXQgbGlnaHRfRGlmZnVzZVsyXTsKKyAgICBmbG9hdCBsaWdodF9TcGVjdWxhclsyXTsKKyAgICBmbG9hdCBsaWdodF9Db3NpbmVQb3dlclsyXTsKK30gVmVydGV4U2hhZGVyQ29uc3RhbnRzMjsKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVyQ29uc3RhbnRzM19zIHsKKyAgICByc19tYXRyaXg0eDQgbW9kZWw7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgdGltZTsKK30gVmVydGV4U2hhZGVyQ29uc3RhbnRzMzsKKworCit0eXBlZGVmIHN0cnVjdCBGcmFnZW50U2hhZGVyQ29uc3RhbnRzX3MgeworICAgIGZsb2F0NCBsaWdodDBfRGlmZnVzZUNvbG9yOworICAgIGZsb2F0NCBsaWdodDBfU3BlY3VsYXJDb2xvcjsKKworICAgIGZsb2F0NCBsaWdodDFfRGlmZnVzZUNvbG9yOworICAgIGZsb2F0NCBsaWdodDFfU3BlY3VsYXJDb2xvcjsKK30gRnJhZ2VudFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhZ2VudFNoYWRlckNvbnN0YW50czJfcyB7CisgICAgZmxvYXQ0IGxpZ2h0X0RpZmZ1c2VDb2xvclsyXTsKKyAgICBmbG9hdDQgbGlnaHRfU3BlY3VsYXJDb2xvclsyXTsKK30gRnJhZ2VudFNoYWRlckNvbnN0YW50czI7CisKK3R5cGVkZWYgc3RydWN0IEZyYWdlbnRTaGFkZXJDb25zdGFudHMzX3MgeworICAgIGZsb2F0NCBsaWdodDBfRGlmZnVzZUNvbG9yOworICAgIGZsb2F0NCBsaWdodDBfU3BlY3VsYXJDb2xvcjsKKyAgICBmbG9hdDQgbGlnaHQwX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDBfQ29zaW5lUG93ZXI7CisKKyAgICBmbG9hdDQgbGlnaHQxX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDQgbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisgICAgZmxvYXQ0IGxpZ2h0MV9Qb3Npc2lvbjsKKyAgICBmbG9hdCBsaWdodDFfRGlmZnVzZTsKKyAgICBmbG9hdCBsaWdodDFfU3BlY3VsYXI7CisgICAgZmxvYXQgbGlnaHQxX0Nvc2luZVBvd2VyOworfSBGcmFnZW50U2hhZGVyQ29uc3RhbnRzMzsKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVySW5wdXRzX3MgeworICAgIGZsb2F0NCBwb3NpdGlvbjsKKyAgICBmbG9hdDMgbm9ybWFsOworICAgIGZsb2F0MiB0ZXh0dXJlMDsKK30gVmVydGV4U2hhZGVySW5wdXRzOworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1JlbmRlclNjcmlwdC9faW5kZXguaHRtbCBiL3NhbXBsZXMvUmVuZGVyU2NyaXB0L19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1JlbmRlclNjcmlwdC9faW5kZXguaHRtbApAQCAtMCwwICsxIEBACis8cD5BIHNldCBvZiBzYW1wbGVzIHRoYXQgZGVtb25zdHJhdGUgaG93IHRvIHVzZSB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBSZW5kZXJzY3JpcHQgQVBJcy48L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL0NvbnN0YW50cy5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL0NvbnN0YW50cy5qYXZhCmluZGV4IGYyMzNhNWQuLjQ5ZjkyYmYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9Db25zdGFudHMuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQ29uc3RhbnRzLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYzsKIAogcHVibGljIGNsYXNzIENvbnN0YW50cyB7CkBAIC0yNiw3ICsyNSw1IEBACiAgICAgLyoqCiAgICAgICogQXV0aHRva2VuIHR5cGUgc3RyaW5nLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhUT0tFTl9UWVBFID0KLSAgICAgICAgImNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYyI7Ci0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIVE9LRU5fVFlQRSA9ICJjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMiOwogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdGlvblNlcnZpY2UuamF2YQppbmRleCBiOGE5MDNkLi4yYzE2M2JlIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdGlvblNlcnZpY2UuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdGlvblNlcnZpY2UuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmF1dGhlbnRpY2F0b3I7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwpAQCAtMjYsNyArMjUsOSBAQAogICogYW5kIHJldHVybnMgaXRzIElCaW5kZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvblNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQXV0aGVudGljYXRpb25TZXJ2aWNlIjsKKwogICAgIHByaXZhdGUgQXV0aGVudGljYXRvciBtQXV0aGVudGljYXRvcjsKIAogICAgIEBPdmVycmlkZQpAQCAtNDcsOSArNDgsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgTG9nLnYoVEFHLAotICAgICAgICAgICAgICAgICJnZXRCaW5kZXIoKS4uLiAgcmV0dXJuaW5nIHRoZSBBY2NvdW50QXV0aGVudGljYXRvciBiaW5kZXIgZm9yIGludGVudCAiCi0gICAgICAgICAgICAgICAgICAgICsgaW50ZW50KTsKKyAgICAgICAgICAgIExvZy52KFRBRywgImdldEJpbmRlcigpLi4uICByZXR1cm5pbmcgdGhlIEFjY291bnRBdXRoZW50aWNhdG9yIGJpbmRlciBmb3IgaW50ZW50ICIKKyAgICAgICAgICAgICAgICArIGludGVudCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1BdXRoZW50aWNhdG9yLmdldElCaW5kZXIoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yLmphdmEKaW5kZXggMjk2MTNhOS4uMGM3OWM1ZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3IuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmF1dGhlbnRpY2F0b3I7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFic3RyYWN0QWNjb3VudEF1dGhlbnRpY2F0b3I7CkBAIC0zMyw2ICszMiw3IEBACiAgKiBhdXRoZW50aWNhdGluZyBhY2NvdW50cyBpbiB0aGUgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jIGRvbWFpbi4KICAqLwogY2xhc3MgQXV0aGVudGljYXRvciBleHRlbmRzIEFic3RyYWN0QWNjb3VudEF1dGhlbnRpY2F0b3IgeworCiAgICAgLy8gQXV0aGVudGljYXRpb24gU2VydmljZSBjb250ZXh0CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCkBAIC00MSwzNCArNDEsMjUgQEAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGFkZEFjY291bnQoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgU3RyaW5nW10gcmVxdWlyZWRGZWF0dXJlcywKLSAgICAgICAgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICBwdWJsaWMgQnVuZGxlIGFkZEFjY291bnQoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlLAorICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgU3RyaW5nW10gcmVxdWlyZWRGZWF0dXJlcywgQnVuZGxlIG9wdGlvbnMpIHsKKwogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgQXV0aGVudGljYXRvckFjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwKLSAgICAgICAgICAgIGF1dGhUb2tlblR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwKLSAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwgYXV0aFRva2VuVHlwZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLCByZXNwb25zZSk7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEFjY291bnRNYW5hZ2VyLktFWV9JTlRFTlQsIGludGVudCk7CiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgY29uZmlybUNyZWRlbnRpYWxzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIEFjY291bnQgYWNjb3VudCwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICBwdWJsaWMgQnVuZGxlIGNvbmZpcm1DcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB7CisKICAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmNvbnRhaW5zS2V5KEFjY291bnRNYW5hZ2VyLktFWV9QQVNTV09SRCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX1BBU1NXT1JEKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmVyaWZpZWQgPQotICAgICAgICAgICAgICAgIG9ubGluZUNvbmZpcm1QYXNzd29yZChhY2NvdW50Lm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9IG9wdGlvbnMuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9QQVNTV09SRCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmaWVkID0gb25saW5lQ29uZmlybVBhc3N3b3JkKGFjY291bnQubmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgIHJlc3VsdC5wdXRCb29sZWFuKEFjY291bnRNYW5hZ2VyLktFWV9CT09MRUFOX1JFU1VMVCwgdmVyaWZpZWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTc2LDQ1ICs2NywzNSBAQAogICAgICAgICAvLyBMYXVuY2ggQXV0aGVudGljYXRvckFjdGl2aXR5IHRvIGNvbmZpcm0gY3JlZGVudGlhbHMKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fVVNFUk5BTUUsIGFjY291bnQubmFtZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQ09ORklSTUNSRURFTlRJQUxTLCB0cnVlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX0FVVEhFTlRJQ0FUT1JfUkVTUE9OU0UsCi0gICAgICAgICAgICByZXNwb25zZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQ09ORklSTV9DUkVERU5USUFMUywgdHJ1ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLCByZXNwb25zZSk7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEFjY291bnRNYW5hZ2VyLktFWV9JTlRFTlQsIGludGVudCk7CiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgZWRpdFByb3BlcnRpZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgU3RyaW5nIGFjY291bnRUeXBlKSB7CisgICAgcHVibGljIEJ1bmRsZSBlZGl0UHJvcGVydGllcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgYWNjb3VudFR5cGUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgZ2V0QXV0aFRva2VuKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIEJ1bmRsZSBsb2dpbk9wdGlvbnMpIHsKKyAgICBwdWJsaWMgQnVuZGxlIGdldEF1dGhUb2tlbihBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgbG9naW5PcHRpb25zKSB7CisKICAgICAgICAgaWYgKCFhdXRoVG9rZW5UeXBlLmVxdWFscyhDb25zdGFudHMuQVVUSFRPS0VOX1RZUEUpKSB7CiAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfRVJST1JfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBhdXRoVG9rZW5UeXBlIik7CisgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9FUlJPUl9NRVNTQUdFLCAiaW52YWxpZCBhdXRoVG9rZW5UeXBlIik7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFtID0gQWNjb3VudE1hbmFnZXIuZ2V0KG1Db250ZXh0KTsKICAgICAgICAgZmluYWwgU3RyaW5nIHBhc3N3b3JkID0gYW0uZ2V0UGFzc3dvcmQoYWNjb3VudCk7CiAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmaWVkID0KLSAgICAgICAgICAgICAgICBvbmxpbmVDb25maXJtUGFzc3dvcmQoYWNjb3VudC5uYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmaWVkID0gb25saW5lQ29uZmlybVBhc3N3b3JkKGFjY291bnQubmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgaWYgKHZlcmlmaWVkKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUsIGFjY291bnQubmFtZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOwogICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FVVEhUT0tFTiwgcGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CkBAIC0xMjMsMzMgKzEwNCwyNSBAQAogICAgICAgICAvLyBBY3Rpdml0eSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgcGFzc3dvcmQuCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0FVVEhUT0tFTl9UWVBFLAotICAgICAgICAgICAgYXV0aFRva2VuVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLAotICAgICAgICAgICAgcmVzcG9uc2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0FVVEhUT0tFTl9UWVBFLCBhdXRoVG9rZW5UeXBlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX0FVVEhFTlRJQ0FUT1JfUkVTUE9OU0UsIHJlc3BvbnNlKTsKICAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoQWNjb3VudE1hbmFnZXIuS0VZX0lOVEVOVCwgaW50ZW50KTsKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVG9rZW5MYWJlbChTdHJpbmcgYXV0aFRva2VuVHlwZSkgewotICAgICAgICBpZiAoYXV0aFRva2VuVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFKSkgeworICAgICAgICBpZiAoQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFLmVxdWFscyhhdXRoVG9rZW5UeXBlKSkgewogICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5sYWJlbCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7Ci0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBoYXNGZWF0dXJlcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgcHVibGljIEJ1bmRsZSBoYXNGZWF0dXJlcyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisKICAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgcmVzdWx0LnB1dEJvb2xlYW4oQWNjb3VudE1hbmFnZXIuS0VZX0JPT0xFQU5fUkVTVUxULCBmYWxzZSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xNTksMjQgKzEzMiwyMCBAQAogICAgICAqIFZhbGlkYXRlcyB1c2VyJ3MgcGFzc3dvcmQgb24gdGhlIHNlcnZlcgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBvbmxpbmVDb25maXJtUGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlsaXRpZXMuYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCwKLSAgICAgICAgICAgIG51bGwvKiBIYW5kbGVyICovLCBudWxsLyogQ29udGV4dCAqLyk7CisgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbGl0aWVzCisgICAgICAgICAgICAuYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCwgbnVsbC8qIEhhbmRsZXIgKi8sIG51bGwvKiBDb250ZXh0ICovKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB1cGRhdGVDcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgbG9naW5PcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSB1cGRhdGVDcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgbG9naW5PcHRpb25zKSB7CisKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fVVNFUk5BTUUsIGFjY291bnQubmFtZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsCi0gICAgICAgICAgICBhdXRoVG9rZW5UeXBlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9DT05GSVJNQ1JFREVOVElBTFMsIGZhbHNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwgYXV0aFRva2VuVHlwZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQ09ORklSTV9DUkVERU5USUFMUywgZmFsc2UpOwogICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5ULCBpbnRlbnQpOwogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHkuamF2YQppbmRleCA3NzllODk0Li40ZTFlZTJhIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHkuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHkuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmF1dGhlbnRpY2F0b3I7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CkBAIC00MiwxNiArNDEsMjggQEAKICAqIEFjdGl2aXR5IHdoaWNoIGRpc3BsYXlzIGxvZ2luIHNjcmVlbiB0byB0aGUgdXNlci4KICAqLwogcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0b3JBY3Rpdml0eSBleHRlbmRzIEFjY291bnRBdXRoZW50aWNhdG9yQWN0aXZpdHkgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NPTkZJUk1DUkVERU5USUFMUyA9ICJjb25maXJtQ3JlZGVudGlhbHMiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZmxhZyB0byBjb25maXJtIGNyZWRlbnRpYWxzLiAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DT05GSVJNX0NSRURFTlRJQUxTID0gImNvbmZpcm1DcmVkZW50aWFscyI7CisKKyAgICAvKiogVGhlIEludGVudCBleHRyYSB0byBzdG9yZSBwYXNzd29yZC4gKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEFTU1dPUkQgPSAicGFzc3dvcmQiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgdXNlcm5hbWUuICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VTRVJOQU1FID0gInVzZXJuYW1lIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGV4dHJhIHRvIHN0b3JlIGF1dGh0b2tlbiB0eXBlLiAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BVVRIVE9LRU5fVFlQRSA9ICJhdXRodG9rZW5UeXBlIjsKIAorICAgIC8qKiBUaGUgdGFnIHVzZWQgdG8gbG9nIHRvIGFkYiBjb25zb2xlLiAqKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1dGhlbnRpY2F0b3JBY3Rpdml0eSI7CiAKICAgICBwcml2YXRlIEFjY291bnRNYW5hZ2VyIG1BY2NvdW50TWFuYWdlcjsKKwogICAgIHByaXZhdGUgVGhyZWFkIG1BdXRoVGhyZWFkOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUF1dGh0b2tlbjsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1BdXRodG9rZW5UeXBlOwogCiAgICAgLyoqCkBAIC02MiwxNCArNzMsMTggQEAKIAogICAgIC8qKiBmb3IgcG9zdGluZyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyBiYWNrIHRvIFVJIHRocmVhZCAqLwogICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKICAgICBwcml2YXRlIFRleHRWaWV3IG1NZXNzYWdlOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhc3N3b3JkOworCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtUGFzc3dvcmRFZGl0OwogCiAgICAgLyoqIFdhcyB0aGUgb3JpZ2luYWwgY2FsbGVyIGFza2luZyBmb3IgYW4gZW50aXJlbHkgbmV3IGFjY291bnQ/ICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVJlcXVlc3ROZXdBY2NvdW50ID0gZmFsc2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtVXNlcm5hbWU7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1Vc2VybmFtZUVkaXQ7CiAKICAgICAvKioKQEAgLTc3LDYgKzkyLDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisKICAgICAgICAgTG9nLmkoVEFHLCAib25DcmVhdGUoIiArIGljaWNsZSArICIpIik7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CiAgICAgICAgIG1BY2NvdW50TWFuYWdlciA9IEFjY291bnRNYW5hZ2VyLmdldCh0aGlzKTsKQEAgLTg1LDE5ICsxMDEsMTUgQEAKICAgICAgICAgbVVzZXJuYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBBUkFNX1VTRVJOQU1FKTsKICAgICAgICAgbUF1dGh0b2tlblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUEFSQU1fQVVUSFRPS0VOX1RZUEUpOwogICAgICAgICBtUmVxdWVzdE5ld0FjY291bnQgPSBtVXNlcm5hbWUgPT0gbnVsbDsKLSAgICAgICAgbUNvbmZpcm1DcmVkZW50aWFscyA9Ci0gICAgICAgICAgICBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBBUkFNX0NPTkZJUk1DUkVERU5USUFMUywgZmFsc2UpOwotCisgICAgICAgIG1Db25maXJtQ3JlZGVudGlhbHMgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBBUkFNX0NPTkZJUk1fQ1JFREVOVElBTFMsIGZhbHNlKTsKICAgICAgICAgTG9nLmkoVEFHLCAiICAgIHJlcXVlc3QgbmV3OiAiICsgbVJlcXVlc3ROZXdBY2NvdW50KTsKICAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubG9naW5fYWN0aXZpdHkpOwogICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlRHJhd2FibGVSZXNvdXJjZShXaW5kb3cuRkVBVFVSRV9MRUZUX0lDT04sCiAgICAgICAgICAgICBhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KTsKLQogICAgICAgICBtTWVzc2FnZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubWVzc2FnZSk7CiAgICAgICAgIG1Vc2VybmFtZUVkaXQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnVzZXJuYW1lX2VkaXQpOwogICAgICAgICBtUGFzc3dvcmRFZGl0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9lZGl0KTsKLQogICAgICAgICBtVXNlcm5hbWVFZGl0LnNldFRleHQobVVzZXJuYW1lKTsKICAgICAgICAgbU1lc3NhZ2Uuc2V0VGV4dChnZXRNZXNzYWdlKCkpOwogICAgIH0KQEAgLTE1Miw3ICsxNjQsNyBAQAogICAgICAqIAogICAgICAqIEBwYXJhbSB0aGUgY29uZmlybUNyZWRlbnRpYWxzIHJlc3VsdC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hDb25maXJtQ3JlZGVudGlhbHMoYm9vbGVhbiByZXN1bHQpIHsKKyAgICBwcml2YXRlIHZvaWQgZmluaXNoQ29uZmlybUNyZWRlbnRpYWxzKGJvb2xlYW4gcmVzdWx0KSB7CiAgICAgICAgIExvZy5pKFRBRywgImZpbmlzaENvbmZpcm1DcmVkZW50aWFscygpIik7CiAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IG5ldyBBY2NvdW50KG1Vc2VybmFtZSwgQ29uc3RhbnRzLkFDQ09VTlRfVFlQRSk7CiAgICAgICAgIG1BY2NvdW50TWFuYWdlci5zZXRQYXNzd29yZChhY2NvdW50LCBtUGFzc3dvcmQpOwpAQCAtMTY0LDcgKzE3Niw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogCiAgICAgICogQ2FsbGVkIHdoZW4gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGZvciBhdXRoZW50aWNhdGlvbgogICAgICAqIHJlcXVlc3QuIFNlZSBvbkF1dGhlbnRpY2F0aW9uUmVzdWx0KCkuIFNldHMgdGhlCiAgICAgICogQWNjb3VudEF1dGhlbnRpY2F0b3JSZXN1bHQgd2hpY2ggaXMgc2VudCBiYWNrIHRvIHRoZSBjYWxsZXIuIEFsc28gc2V0cwpAQCAtMTcyLDI2ICsxODMsMjIgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlIGNvbmZpcm1DcmVkZW50aWFscyByZXN1bHQuCiAgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaExvZ2luKCkgewogCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoTG9naW4oKSB7CiAgICAgICAgIExvZy5pKFRBRywgImZpbmlzaExvZ2luKCkiKTsKICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gbmV3IEFjY291bnQobVVzZXJuYW1lLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKLQogICAgICAgICBpZiAobVJlcXVlc3ROZXdBY2NvdW50KSB7CiAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuYWRkQWNjb3VudEV4cGxpY2l0bHkoYWNjb3VudCwgbVBhc3N3b3JkLCBudWxsKTsKICAgICAgICAgICAgIC8vIFNldCBjb250YWN0cyBzeW5jIGZvciB0aGlzIGFjY291bnQuCi0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudCwKLSAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgdHJ1ZSk7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudCwgQ29udGFjdHNDb250cmFjdC5BVVRIT1JJVFksIHRydWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLnNldFBhc3N3b3JkKGFjY291bnQsIG1QYXNzd29yZCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgbUF1dGh0b2tlbiA9IG1QYXNzd29yZDsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX05BTUUsIG1Vc2VybmFtZSk7Ci0gICAgICAgIGludGVudAotICAgICAgICAgICAgLnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOwotICAgICAgICBpZiAobUF1dGh0b2tlblR5cGUgIT0gbnVsbAotICAgICAgICAgICAgJiYgbUF1dGh0b2tlblR5cGUuZXF1YWxzKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRSkpIHsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX1RZUEUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOworICAgICAgICBpZiAobUF1dGh0b2tlblR5cGUgIT0gbnVsbCAmJiBtQXV0aHRva2VuVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFKSkgewogICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BVVRIVE9LRU4sIG1BdXRodG9rZW4pOwogICAgICAgICB9CiAgICAgICAgIHNldEFjY291bnRBdXRoZW50aWNhdG9yUmVzdWx0KGludGVudC5nZXRFeHRyYXMoKSk7CkBAIC0yMDIsNyArMjA5LDcgQEAKICAgICAvKioKICAgICAgKiBIaWRlcyB0aGUgcHJvZ3Jlc3MgVUkgZm9yIGEgbGVuZ3RoeSBvcGVyYXRpb24uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGlkZVByb2dyZXNzKCkgeworICAgIHByaXZhdGUgdm9pZCBoaWRlUHJvZ3Jlc3MoKSB7CiAgICAgICAgIGRpc21pc3NEaWFsb2coMCk7CiAgICAgfQogCkBAIC0yMTAsNiArMjE3LDcgQEAKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyBjb21wbGV0ZXMgKHNlZSBhdHRlbXB0TG9naW4oKSkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25BdXRoZW50aWNhdGlvblJlc3VsdChib29sZWFuIHJlc3VsdCkgeworCiAgICAgICAgIExvZy5pKFRBRywgIm9uQXV0aGVudGljYXRpb25SZXN1bHQoIiArIHJlc3VsdCArICIpIik7CiAgICAgICAgIC8vIEhpZGUgdGhlIHByb2dyZXNzIGRpYWxvZwogICAgICAgICBoaWRlUHJvZ3Jlc3MoKTsKQEAgLTIyMywxNCArMjMxLDEyIEBACiAgICAgICAgICAgICBMb2cuZShUQUcsICJvbkF1dGhlbnRpY2F0aW9uUmVzdWx0OiBmYWlsZWQgdG8gYXV0aGVudGljYXRlIik7CiAgICAgICAgICAgICBpZiAobVJlcXVlc3ROZXdBY2NvdW50KSB7CiAgICAgICAgICAgICAgICAgLy8gIlBsZWFzZSBlbnRlciBhIHZhbGlkIHVzZXJuYW1lL3Bhc3N3b3JkLgotICAgICAgICAgICAgICAgIG1NZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIC5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbG9naW5mYWlsX3RleHRfYm90aCkpOworICAgICAgICAgICAgICAgIG1NZXNzYWdlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9sb2dpbmZhaWxfdGV4dF9ib3RoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYXNzd29yZC4iIChVc2VkIHdoZW4gdGhlCiAgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBpcyBhbHJlYWR5IGluIHRoZSBkYXRhYmFzZSBidXQgdGhlIHBhc3N3b3JkCiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCB3b3JrLikKLSAgICAgICAgICAgICAgICBtTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X2xvZ2luZmFpbF90ZXh0X3B3b25seSkpOworICAgICAgICAgICAgICAgIG1NZXNzYWdlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9sb2dpbmZhaWxfdGV4dF9wd29ubHkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI0Myw4ICsyNDksNyBAQAogICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVVzZXJuYW1lKSkgewogICAgICAgICAgICAgLy8gSWYgbm8gdXNlcm5hbWUsIHRoZW4gd2UgYXNrIHRoZSB1c2VyIHRvIGxvZyBpbiB1c2luZyBhbgogICAgICAgICAgICAgLy8gYXBwcm9wcmlhdGUgc2VydmljZS4KLSAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBtc2cgPQotICAgICAgICAgICAgICAgIGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbmV3YWNjb3VudF90ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBtc2cgPSBnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X25ld2FjY291bnRfdGV4dCk7CiAgICAgICAgICAgICByZXR1cm4gbXNnOwogICAgICAgICB9CiAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtUGFzc3dvcmQpKSB7CkBAIC0yNTcsNyArMjYyLDcgQEAKICAgICAvKioKICAgICAgKiBTaG93cyB0aGUgcHJvZ3Jlc3MgVUkgZm9yIGEgbGVuZ3RoeSBvcGVyYXRpb24uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd1Byb2dyZXNzKCkgeworICAgIHByaXZhdGUgdm9pZCBzaG93UHJvZ3Jlc3MoKSB7CiAgICAgICAgIHNob3dEaWFsb2coMCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L05ldHdvcmtVdGlsaXRpZXMuamF2YQppbmRleCA5ZDJiNjY2Li43ODI0YTRkIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L05ldHdvcmtVdGlsaXRpZXMuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L05ldHdvcmtVdGlsaXRpZXMuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmNsaWVudDsKIAogaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKQEAgLTUyLDIxICs1MSwzNiBAQAogLyoqCiAgKiBQcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyLgogICovCi1wdWJsaWMgY2xhc3MgTmV0d29ya1V0aWxpdGllcyB7CitmaW5hbCBwdWJsaWMgY2xhc3MgTmV0d29ya1V0aWxpdGllcyB7CisKKyAgICAvKiogVGhlIHRhZyB1c2VkIHRvIGxvZyB0byBhZGIgY29uc29sZS4gKiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrVXRpbGl0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisKKyAgICAvKiogVGhlIEludGVudCBleHRyYSB0byBzdG9yZSBwYXNzd29yZC4gKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEFTU1dPUkQgPSAicGFzc3dvcmQiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgdXNlcm5hbWUuICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VTRVJOQU1FID0gInVzZXJuYW1lIjsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VQREFURUQgPSAidGltZXN0YW1wIjsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQUdFTlQgPSAiQXV0aGVudGljYXRpb25TZXJ2aWNlLzEuMCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHSVNUUkFUSU9OX1RJTUVPVVQgPSAzMCAqIDEwMDA7IC8vIG1zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9VUkwgPQotICAgICAgICAiaHR0cHM6Ly9zYW1wbGVzeW5jYWRhcHRlci5hcHBzcG90LmNvbSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyA9IDMwICogMTAwMDsgLy8gbXMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVVJMID0gImh0dHBzOi8vc2FtcGxlc3luY2FkYXB0ZXIuYXBwc3BvdC5jb20iOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9VUkkgPSBCQVNFX1VSTCArICIvYXV0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVUQ0hfRlJJRU5EX1VQREFURVNfVVJJID0KLSAgICAgICAgQkFTRV9VUkwgKyAiL2ZldGNoX2ZyaWVuZF91cGRhdGVzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFVENIX0ZSSUVORF9VUERBVEVTX1VSSSA9IEJBU0VfVVJMICsgIi9mZXRjaF9mcmllbmRfdXBkYXRlcyI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRVRDSF9TVEFUVVNfVVJJID0gQkFTRV9VUkwgKyAiL2ZldGNoX3N0YXR1cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBIdHRwQ2xpZW50IG1IdHRwQ2xpZW50OwogCisgICAgcHJpdmF0ZSBOZXR3b3JrVXRpbGl0aWVzKCkgeworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgdGhlIGh0dHBDbGllbnQgdG8gY29ubmVjdCB0byB0aGUgVVJMIHByb3ZpZGVkLgogICAgICAqLwpAQCAtNzQsMTAgKzg4LDkgQEAKICAgICAgICAgaWYgKG1IdHRwQ2xpZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIG1IdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KCk7CiAgICAgICAgICAgICBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcyA9IG1IdHRwQ2xpZW50LmdldFBhcmFtcygpOwotICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLAotICAgICAgICAgICAgICAgIFJFR0lTVFJBVElPTl9USU1FT1VUKTsKLSAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldFNvVGltZW91dChwYXJhbXMsIFJFR0lTVFJBVElPTl9USU1FT1VUKTsKLSAgICAgICAgICAgIENvbm5NYW5hZ2VyUGFyYW1zLnNldFRpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVCk7CisgICAgICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRDb25uZWN0aW9uVGltZW91dChwYXJhbXMsIFJFR0lTVFJBVElPTl9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldFNvVGltZW91dChwYXJhbXMsIFJFR0lTVFJBVElPTl9USU1FT1VUX01TKTsKKyAgICAgICAgICAgIENvbm5NYW5hZ2VyUGFyYW1zLnNldFRpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0LDcgKzEwNyw2IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfTsKQEAgLTExMywxMCArMTI1LDEwIEBACiAgICAgICogQHJldHVybiBib29sZWFuIFRoZSBib29sZWFuIHJlc3VsdCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHVzZXIgd2FzCiAgICAgICogICAgICAgICBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLAotICAgICAgICBIYW5kbGVyIGhhbmRsZXIsIGZpbmFsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcDsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLCBIYW5kbGVyIGhhbmRsZXIsCisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCkgewogCisgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwOwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDxOYW1lVmFsdWVQYWlyPigpOwogICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fVVNFUk5BTUUsIHVzZXJuYW1lKSk7CiAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9QQVNTV09SRCwgcGFzc3dvcmQpKTsKQEAgLTEzMSw3ICsxNDMsNiBAQAogICAgICAgICBwb3N0LmFkZEhlYWRlcihlbnRpdHkuZ2V0Q29udGVudFR5cGUoKSk7CiAgICAgICAgIHBvc3Quc2V0RW50aXR5KGVudGl0eSk7CiAgICAgICAgIG1heWJlQ3JlYXRlSHR0cENsaWVudCgpOwotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXNwID0gbUh0dHBDbGllbnQuZXhlY3V0ZShwb3N0KTsKICAgICAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgewpAQCAtMTg5LDggKzIwMCw5IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNhbGxlciBBY3Rpdml0eSdzIGNvbnRleHQKICAgICAgKiBAcmV0dXJuIFRocmVhZCBUaGUgdGhyZWFkIG9uIHdoaWNoIHRoZSBuZXR3b3JrIG1PcGVyYXRpb25zIGFyZSBleGVjdXRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRocmVhZCBhdHRlbXB0QXV0aChmaW5hbCBTdHJpbmcgdXNlcm5hbWUsCi0gICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCwgZmluYWwgSGFuZGxlciBoYW5kbGVyLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICBwdWJsaWMgc3RhdGljIFRocmVhZCBhdHRlbXB0QXV0aChmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKwogICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUodXNlcm5hbWUsIHBhc3N3b3JkLCBoYW5kbGVyLCBjb250ZXh0KTsKQEAgLTIwOCwzMiArMjIwLDI3IEBACiAgICAgICogQHBhcmFtIGxhc3RVcGRhdGVkIFRoZSBsYXN0IHRpbWUgdGhhdCBzeW5jIHdhcyBwZXJmb3JtZWQKICAgICAgKiBAcmV0dXJuIGxpc3QgVGhlIGxpc3Qgb2YgdXBkYXRlcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXI+IGZldGNoRnJpZW5kVXBkYXRlcyhBY2NvdW50IGFjY291bnQsCi0gICAgICAgIFN0cmluZyBhdXRodG9rZW4sIERhdGUgbGFzdFVwZGF0ZWQpIHRocm93cyBKU09ORXhjZXB0aW9uLAotICAgICAgICBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8VXNlcj4gZmV0Y2hGcmllbmRVcGRhdGVzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGh0b2tlbiwgRGF0ZSBsYXN0VXBkYXRlZCkKKyAgICAgICAgdGhyb3dzIEpTT05FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRpb25FeGNlcHRpb24geworCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxVc2VyPiBmcmllbmRMaXN0ID0gbmV3IEFycmF5TGlzdDxVc2VyPigpOwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDxOYW1lVmFsdWVQYWlyPigpOwogICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fVVNFUk5BTUUsIGFjY291bnQubmFtZSkpOwogICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fUEFTU1dPUkQsIGF1dGh0b2tlbikpOwogICAgICAgICBpZiAobGFzdFVwZGF0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tIik7CisgICAgICAgICAgICBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tIik7CiAgICAgICAgICAgICBmb3JtYXR0ZXIuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpKTsKLSAgICAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9VUERBVEVELCBmb3JtYXR0ZXIKLSAgICAgICAgICAgICAgICAuZm9ybWF0KGxhc3RVcGRhdGVkKSkpOworICAgICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VQREFURUQsIGZvcm1hdHRlci5mb3JtYXQobGFzdFVwZGF0ZWQpKSk7CiAgICAgICAgIH0KICAgICAgICAgTG9nLmkoVEFHLCBwYXJhbXMudG9TdHJpbmcoKSk7Ci0KICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSBudWxsOwogICAgICAgICBlbnRpdHkgPSBuZXcgVXJsRW5jb2RlZEZvcm1FbnRpdHkocGFyYW1zKTsKICAgICAgICAgZmluYWwgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdChGRVRDSF9GUklFTkRfVVBEQVRFU19VUkkpOwogICAgICAgICBwb3N0LmFkZEhlYWRlcihlbnRpdHkuZ2V0Q29udGVudFR5cGUoKSk7CiAgICAgICAgIHBvc3Quc2V0RW50aXR5KGVudGl0eSk7CiAgICAgICAgIG1heWJlQ3JlYXRlSHR0cENsaWVudCgpOwotCiAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwID0gbUh0dHBDbGllbnQuZXhlY3V0ZShwb3N0KTsKICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gRW50aXR5VXRpbHMudG9TdHJpbmcocmVzcC5nZXRFbnRpdHkoKSk7Ci0KICAgICAgICAgaWYgKHJlc3AuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKSB7CiAgICAgICAgICAgICAvLyBTdWNjZXNmdWxseSBjb25uZWN0ZWQgdG8gdGhlIHNhbXBsZXN5bmNhZGFwdGVyIHNlcnZlciBhbmQKICAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0ZWQuCkBAIC0yNDUsMTIgKzI1MiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHJlc3AuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX1VOQVVUSE9SSVpFRCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiBpbiBmZXRjaGluZyByZW1vdGUgY29udGFjdHMiKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJBdXRoZW50aWNhdGlvbiBleGNlcHRpb24gaW4gZmV0Y2hpbmcgcmVtb3RlIGNvbnRhY3RzIik7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNlcnZlciBlcnJvciBpbiBmZXRjaGluZyByZW1vdGUgY29udGFjdHM6ICIKLSAgICAgICAgICAgICAgICAgICAgKyByZXNwLmdldFN0YXR1c0xpbmUoKSk7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VydmVyIGVycm9yIGluIGZldGNoaW5nIHJlbW90ZSBjb250YWN0czogIiArIHJlc3AuZ2V0U3RhdHVzTGluZSgpKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjY1LDI0ICsyNzAsMjEgQEAKICAgICAgKiAgICAgICAgYWNjb3VudAogICAgICAqIEByZXR1cm4gbGlzdCBUaGUgbGlzdCBvZiBzdGF0dXMgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxVc2VyLlN0YXR1cz4gZmV0Y2hGcmllbmRTdGF0dXNlcyhBY2NvdW50IGFjY291bnQsCi0gICAgICAgIFN0cmluZyBhdXRodG9rZW4pIHRocm93cyBKU09ORXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8VXNlci5TdGF0dXM+IGZldGNoRnJpZW5kU3RhdHVzZXMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aHRva2VuKQorICAgICAgICB0aHJvd3MgSlNPTkV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFVzZXIuU3RhdHVzPiBzdGF0dXNMaXN0ID0gbmV3IEFycmF5TGlzdDxVc2VyLlN0YXR1cz4oKTsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4oKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1BBU1NXT1JELCBhdXRodG9rZW4pKTsKLQogICAgICAgICBIdHRwRW50aXR5IGVudGl0eSA9IG51bGw7CiAgICAgICAgIGVudGl0eSA9IG5ldyBVcmxFbmNvZGVkRm9ybUVudGl0eShwYXJhbXMpOwogICAgICAgICBmaW5hbCBIdHRwUG9zdCBwb3N0ID0gbmV3IEh0dHBQb3N0KEZFVENIX1NUQVRVU19VUkkpOwogICAgICAgICBwb3N0LmFkZEhlYWRlcihlbnRpdHkuZ2V0Q29udGVudFR5cGUoKSk7CiAgICAgICAgIHBvc3Quc2V0RW50aXR5KGVudGl0eSk7CiAgICAgICAgIG1heWJlQ3JlYXRlSHR0cENsaWVudCgpOwotCiAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwID0gbUh0dHBDbGllbnQuZXhlY3V0ZShwb3N0KTsKICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gRW50aXR5VXRpbHMudG9TdHJpbmcocmVzcC5nZXRFbnRpdHkoKSk7Ci0KICAgICAgICAgaWYgKHJlc3AuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKSB7CiAgICAgICAgICAgICAvLyBTdWNjZXNmdWxseSBjb25uZWN0ZWQgdG8gdGhlIHNhbXBsZXN5bmNhZGFwdGVyIHNlcnZlciBhbmQKICAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0ZWQuCkBAIC0yOTMsOCArMjk1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19VTkFVVEhPUklaRUQpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBleGNlcHRpb24gaW4gZmV0Y2hpbmcgZnJpZW5kIHN0YXR1cyBsaXN0Iik7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXV0aGVudGljYXRpb24gZXhjZXB0aW9uIGluIGZldGNoaW5nIGZyaWVuZCBzdGF0dXMgbGlzdCIpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTZXJ2ZXIgZXJyb3IgaW4gZmV0Y2hpbmcgZnJpZW5kIHN0YXR1cyBsaXN0Iik7CkBAIC0zMDMsNSArMzA0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzTGlzdDsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyLmphdmEKaW5kZXggNmNlOWIzZi4uMjE3YTM4MyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5jbGllbnQ7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMjMsMTYgKzIyLDI0IEBACiAvKioKICAqIFJlcHJlc2VudHMgYSBzYW1wbGUgU3luY0FkYXB0ZXIgdXNlcgogICovCi1wdWJsaWMgY2xhc3MgVXNlciB7CitmaW5hbCBwdWJsaWMgY2xhc3MgVXNlciB7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVXNlck5hbWU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmlyc3ROYW1lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUxhc3ROYW1lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNlbGxQaG9uZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1PZmZpY2VQaG9uZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Ib21lUGhvbmU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRW1haWw7CisKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbURlbGV0ZWQ7CisKICAgICBwcml2YXRlIGZpbmFsIGludCBtVXNlcklkOwogCiAgICAgcHVibGljIGludCBnZXRVc2VySWQoKSB7CkBAIC03MSw5ICs3OCw5IEBACiAgICAgICAgIHJldHVybiBtRGVsZXRlZDsKICAgICB9CiAKLSAgICBwdWJsaWMgVXNlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIGxhc3ROYW1lLAotICAgICAgICBTdHJpbmcgY2VsbFBob25lLCBTdHJpbmcgb2ZmaWNlUGhvbmUsIFN0cmluZyBob21lUGhvbmUsIFN0cmluZyBlbWFpbCwKLSAgICAgICAgQm9vbGVhbiBkZWxldGVkLCBJbnRlZ2VyIHVzZXJJZCkgeworICAgIHByaXZhdGUgVXNlcihTdHJpbmcgbmFtZSwgU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIGxhc3ROYW1lLCBTdHJpbmcgY2VsbFBob25lLAorICAgICAgICBTdHJpbmcgb2ZmaWNlUGhvbmUsIFN0cmluZyBob21lUGhvbmUsIFN0cmluZyBlbWFpbCwgQm9vbGVhbiBkZWxldGVkLCBJbnRlZ2VyIHVzZXJJZCkgeworCiAgICAgICAgIG1Vc2VyTmFtZSA9IG5hbWU7CiAgICAgICAgIG1GaXJzdE5hbWUgPSBmaXJzdE5hbWU7CiAgICAgICAgIG1MYXN0TmFtZSA9IGxhc3ROYW1lOwpAQCAtOTIsMzQgKzk5LDMzIEBACiAgICAgICogQHJldHVybiB1c2VyIFRoZSBuZXcgaW5zdGFuY2Ugb2YgVm9pcGVyIHVzZXIgY3JlYXRlZCBmcm9tIHRoZSBKU09OIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBVc2VyIHZhbHVlT2YoSlNPTk9iamVjdCB1c2VyKSB7CisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VyTmFtZSA9IHVzZXIuZ2V0U3RyaW5nKCJ1Iik7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3ROYW1lID0gdXNlci5oYXMoImYiKSA/IHVzZXIuZ2V0U3RyaW5nKCJmIikgOiBudWxsOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3ROYW1lID0gdXNlci5oYXMoImwiKSA/IHVzZXIuZ2V0U3RyaW5nKCJsIikgOiBudWxsOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNlbGxQaG9uZSA9IHVzZXIuaGFzKCJtIikgPyB1c2VyLmdldFN0cmluZygibSIpIDogbnVsbDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvZmZpY2VQaG9uZSA9Ci0gICAgICAgICAgICAgICAgdXNlci5oYXMoIm8iKSA/IHVzZXIuZ2V0U3RyaW5nKCJvIikgOiBudWxsOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9mZmljZVBob25lID0gdXNlci5oYXMoIm8iKSA/IHVzZXIuZ2V0U3RyaW5nKCJvIikgOiBudWxsOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhvbWVQaG9uZSA9IHVzZXIuaGFzKCJoIikgPyB1c2VyLmdldFN0cmluZygiaCIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbWFpbCA9IHVzZXIuaGFzKCJlIikgPyB1c2VyLmdldFN0cmluZygiZSIpIDogbnVsbDsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVsZXRlZCA9Ci0gICAgICAgICAgICAgICAgdXNlci5oYXMoImQiKSA/IHVzZXIuZ2V0Qm9vbGVhbigiZCIpIDogZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbGV0ZWQgPSB1c2VyLmhhcygiZCIpID8gdXNlci5nZXRCb29sZWFuKCJkIikgOiBmYWxzZTsKICAgICAgICAgICAgIGZpbmFsIGludCB1c2VySWQgPSB1c2VyLmdldEludCgiaSIpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJOYW1lLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCBjZWxsUGhvbmUsCi0gICAgICAgICAgICAgICAgb2ZmaWNlUGhvbmUsIGhvbWVQaG9uZSwgZW1haWwsIGRlbGV0ZWQsIHVzZXJJZCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVzZXIodXNlck5hbWUsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIGNlbGxQaG9uZSwgb2ZmaWNlUGhvbmUsIGhvbWVQaG9uZSwKKyAgICAgICAgICAgICAgICBlbWFpbCwgZGVsZXRlZCwgdXNlcklkKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBMb2cuaSgiVXNlciIsICJFcnJvciBwYXJzaW5nIEpTT04gdXNlciBvYmplY3QiICsgZXgudG9TdHJpbmcoKSk7Ci0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKLQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlcHJlc2VudHMgdGhlIFVzZXIncyBzdGF0dXMgbWVzc2FnZXMKICAgICAgKiAKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXR1cyB7CisgICAgZmluYWwgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0dXMgeworCiAgICAgICAgIHByaXZhdGUgZmluYWwgSW50ZWdlciBtVXNlcklkOworCiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdGF0dXM7CiAKICAgICAgICAgcHVibGljIGludCBnZXRVc2VySWQoKSB7CkBAIC0xNDYsNSArMTUyLDQgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9CYXRjaE9wZXJhdGlvbi5qYXZhCmluZGV4IDUwOWQxNTEuLjBiZTNkYWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9CYXRjaE9wZXJhdGlvbi5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9CYXRjaE9wZXJhdGlvbi5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMucGxhdGZvcm07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwpAQCAtMjksMTIgKzI4LDE0IEBACiAvKioKICAqIFRoaXMgY2xhc3MgaGFuZGxlcyBleGVjdXRpb24gb2YgYmF0Y2ggbU9wZXJhdGlvbnMgb24gQ29udGFjdHMgcHJvdmlkZXIuCiAgKi8KLXB1YmxpYyBjbGFzcyBCYXRjaE9wZXJhdGlvbiB7CitmaW5hbCBwdWJsaWMgY2xhc3MgQmF0Y2hPcGVyYXRpb24geworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIkJhdGNoT3BlcmF0aW9uIjsKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKwogICAgIC8vIExpc3QgZm9yIHN0b3JpbmcgdGhlIGJhdGNoIG1PcGVyYXRpb25zCi0gICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gbU9wZXJhdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBtT3BlcmF0aW9uczsKIAogICAgIHB1YmxpYyBCYXRjaE9wZXJhdGlvbihDb250ZXh0IGNvbnRleHQsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewogICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKQEAgLTUwLDYgKzUxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCiAgICAgICAgIGlmIChtT3BlcmF0aW9ucy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC02Myw1ICs2NSw0IEBACiAgICAgICAgIH0KICAgICAgICAgbU9wZXJhdGlvbnMuY2xlYXIoKTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0NvbnRhY3RNYW5hZ2VyLmphdmEKaW5kZXggNGY3MWJlMC4uMjE4YjE2NSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0NvbnRhY3RNYW5hZ2VyLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0NvbnRhY3RNYW5hZ2VyLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5wbGF0Zm9ybTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CkBAIC00MSwxMCArNDAsMTIgQEAKICAqIENsYXNzIGZvciBtYW5hZ2luZyBjb250YWN0cyBzeW5jIHJlbGF0ZWQgbU9wZXJhdGlvbnMKICAqLwogcHVibGljIGNsYXNzIENvbnRhY3RNYW5hZ2VyIHsKKwogICAgIC8qKgogICAgICAqIEN1c3RvbSBJTSBwcm90b2NvbCB1c2VkIHdoZW4gc3RvcmluZyBzdGF0dXMgbWVzc2FnZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lNX1BST1RPQ09MID0gIlNhbXBsZVN5bmNBZGFwdGVyIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGFjdE1hbmFnZXIiOwogCiAgICAgLyoqCkBAIC01NCwxMyArNTUsMTIgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgdXNlcm5hbWUgZm9yIHRoZSBhY2NvdW50CiAgICAgICogQHBhcmFtIHVzZXJzIFRoZSBsaXN0IG9mIHVzZXJzCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzeW5jQ29udGFjdHMoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBTdHJpbmcgYWNjb3VudCwgTGlzdDxVc2VyPiB1c2VycykgeworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3luY0NvbnRhY3RzKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjY291bnQsIExpc3Q8VXNlcj4gdXNlcnMpIHsKKwogICAgICAgICBsb25nIHVzZXJJZDsKICAgICAgICAgbG9uZyByYXdDb250YWN0SWQgPSAwOwogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBmaW5hbCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOworICAgICAgICBmaW5hbCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbiA9IG5ldyBCYXRjaE9wZXJhdGlvbihjb250ZXh0LCByZXNvbHZlcik7CiAgICAgICAgIExvZy5kKFRBRywgIkluIFN5bmNDb250YWN0cyIpOwogICAgICAgICBmb3IgKGZpbmFsIFVzZXIgdXNlciA6IHVzZXJzKSB7CiAgICAgICAgICAgICB1c2VySWQgPSB1c2VyLmdldFVzZXJJZCgpOwpAQCAtNjksOCArNjksNyBAQAogICAgICAgICAgICAgaWYgKHJhd0NvbnRhY3RJZCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF1c2VyLmlzRGVsZXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb250YWN0Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhY3QoY29udGV4dCwgcmVzb2x2ZXIsIGFjY291bnQsIHVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICByYXdDb250YWN0SWQsIGJhdGNoT3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFjdChjb250ZXh0LCByZXNvbHZlciwgYWNjb3VudCwgdXNlciwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGNvbnRhY3QKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ29udGFjdChjb250ZXh0LCByYXdDb250YWN0SWQsIGJhdGNoT3BlcmF0aW9uKTsKQEAgLTk4LDE3ICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBhY2NvdW50TmFtZSB0aGUgdXNlcm5hbWUgb2YgdGhlIGxvZ2dlZCBpbiB1c2VyCiAgICAgICogQHBhcmFtIHN0YXR1c2VzIHRoZSBsaXN0IG9mIHN0YXR1c2VzIHRvIHN0b3JlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0YXR1c2VzKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHVzZXJuYW1lLAotICAgICAgICBMaXN0PFVzZXIuU3RhdHVzPiBsaXN0KSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0YXR1c2VzKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHVzZXJuYW1lLCBMaXN0PFVzZXIuU3RhdHVzPiBsaXN0KSB7CisKICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBmaW5hbCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOworICAgICAgICBmaW5hbCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbiA9IG5ldyBCYXRjaE9wZXJhdGlvbihjb250ZXh0LCByZXNvbHZlcik7CiAgICAgICAgIGZvciAoZmluYWwgVXNlci5TdGF0dXMgc3RhdHVzIDogbGlzdCkgewogICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgdXNlcidzIHNhbXBsZSBTeW5jQWRhcHRlciBkYXRhIHJvdwogICAgICAgICAgICAgZmluYWwgbG9uZyB1c2VySWQgPSBzdGF0dXMuZ2V0VXNlcklkKCk7CiAgICAgICAgICAgICBmaW5hbCBsb25nIHByb2ZpbGVJZCA9IGxvb2t1cFByb2ZpbGUocmVzb2x2ZXIsIHVzZXJJZCk7Ci0KICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgYWN0aXZpdHkgaW50byB0aGUgc3RyZWFtCiAgICAgICAgICAgICBpZiAocHJvZmlsZUlkID4gMCkgewogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoU3RhdHVzVXBkYXRlcy5EQVRBX0lELCBwcm9maWxlSWQpOwpAQCAtMTE3LDE1ICsxMTQsMTEgQEAKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuQ1VTVE9NX1BST1RPQ09MLCBDVVNUT01fSU1fUFJPVE9DT0wpOwogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoU3RhdHVzVXBkYXRlcy5JTV9BQ0NPVU5ULCB1c2VybmFtZSk7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLklNX0hBTkRMRSwgc3RhdHVzLmdldFVzZXJJZCgpKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuU1RBVFVTX1JFU19QQUNLQUdFLCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuU1RBVFVTX1JFU19QQUNLQUdFLCBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoU3RhdHVzVXBkYXRlcy5TVEFUVVNfSUNPTiwgUi5kcmF3YWJsZS5pY29uKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuU1RBVFVTX0xBQkVMLCBSLnN0cmluZy5sYWJlbCk7Ci0KLSAgICAgICAgICAgICAgICBiYXRjaE9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAuYWRkKENvbnRhY3RPcGVyYXRpb25zLm5ld0luc2VydENwbygKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1VwZGF0ZXMuQ09OVEVOVF9VUkksIHRydWUpLndpdGhWYWx1ZXModmFsdWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGJhdGNoT3BlcmF0aW9uLmFkZChDb250YWN0T3BlcmF0aW9ucy5uZXdJbnNlcnRDcG8oU3RhdHVzVXBkYXRlcy5DT05URU5UX1VSSSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLndpdGhWYWx1ZXModmFsdWVzKS5idWlsZCgpKTsKICAgICAgICAgICAgICAgICAvLyBBIHN5bmMgYWRhcHRlciBzaG91bGQgYmF0Y2ggb3BlcmF0aW9ucyBvbiBtdWx0aXBsZSBjb250YWN0cywKICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGl0IHdpbGwgbWFrZSBhIGRyYW1hdGljIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UuCiAgICAgICAgICAgICAgICAgaWYgKGJhdGNoT3BlcmF0aW9uLnNpemUoKSA+PSA1MCkgewpAQCAtMTQzLDE2ICsxMzYsMTYgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudE5hbWUgdGhlIGFjY291bnQgdGhlIGNvbnRhY3QgYmVsb25ncyB0bwogICAgICAqIEBwYXJhbSB1c2VyIHRoZSBzYW1wbGUgU3luY0FkYXB0ZXIgVXNlciBvYmplY3QKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYWNjb3VudE5hbWUsCi0gICAgICAgIFVzZXIgdXNlciwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYWNjb3VudE5hbWUsIFVzZXIgdXNlciwKKyAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICAvLyBQdXQgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3RzIHByb3ZpZGVyCiAgICAgICAgIGZpbmFsIENvbnRhY3RPcGVyYXRpb25zIGNvbnRhY3RPcCA9Ci0gICAgICAgICAgICBDb250YWN0T3BlcmF0aW9ucy5jcmVhdGVOZXdDb250YWN0KGNvbnRleHQsIHVzZXIuZ2V0VXNlcklkKCksCi0gICAgICAgICAgICAgICAgYWNjb3VudE5hbWUsIGJhdGNoT3BlcmF0aW9uKTsKLSAgICAgICAgY29udGFjdE9wLmFkZE5hbWUodXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpKS5hZGRFbWFpbCgKLSAgICAgICAgICAgIHVzZXIuZ2V0RW1haWwoKSkuYWRkUGhvbmUodXNlci5nZXRDZWxsUGhvbmUoKSwgUGhvbmUuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAuYWRkUGhvbmUodXNlci5nZXRIb21lUGhvbmUoKSwgUGhvbmUuVFlQRV9PVEhFUikuYWRkUHJvZmlsZUFjdGlvbigKLSAgICAgICAgICAgICAgICB1c2VyLmdldFVzZXJJZCgpKTsKKyAgICAgICAgICAgIENvbnRhY3RPcGVyYXRpb25zLmNyZWF0ZU5ld0NvbnRhY3QoY29udGV4dCwgdXNlci5nZXRVc2VySWQoKSwgYWNjb3VudE5hbWUsCisgICAgICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24pOworICAgICAgICBjb250YWN0T3AuYWRkTmFtZSh1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCkpLmFkZEVtYWlsKHVzZXIuZ2V0RW1haWwoKSkKKyAgICAgICAgICAgIC5hZGRQaG9uZSh1c2VyLmdldENlbGxQaG9uZSgpLCBQaG9uZS5UWVBFX01PQklMRSkuYWRkUGhvbmUodXNlci5nZXRIb21lUGhvbmUoKSwKKyAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX09USEVSKS5hZGRQcm9maWxlQWN0aW9uKHVzZXIuZ2V0VXNlcklkKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1LDc2ICsxNTgsNTcgQEAKICAgICAgKiBAcGFyYW0gcmF3Q29udGFjdElkIHRoZSB1bmlxdWUgSWQgZm9yIHRoaXMgcmF3Q29udGFjdCBpbiBjb250YWN0cwogICAgICAqICAgICAgICBwcm92aWRlcgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ29udGFjdChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGFjY291bnROYW1lLCBVc2VyIHVzZXIsCi0gICAgICAgIGxvbmcgcmF3Q29udGFjdElkLCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbikgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ29udGFjdChDb250ZXh0IGNvbnRleHQsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwKKyAgICAgICAgU3RyaW5nIGFjY291bnROYW1lLCBVc2VyIHVzZXIsIGxvbmcgcmF3Q29udGFjdElkLCBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbikgeworCiAgICAgICAgIFVyaSB1cmk7CiAgICAgICAgIFN0cmluZyBjZWxsUGhvbmUgPSBudWxsOwogICAgICAgICBTdHJpbmcgb3RoZXJQaG9uZSA9IG51bGw7CiAgICAgICAgIFN0cmluZyBlbWFpbCA9IG51bGw7Ci0KICAgICAgICAgZmluYWwgQ3Vyc29yIGMgPQotICAgICAgICAgICAgcmVzb2x2ZXIucXVlcnkoRGF0YS5DT05URU5UX1VSSSwgRGF0YVF1ZXJ5LlBST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgRGF0YVF1ZXJ5LlNFTEVDVElPTiwKKyAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIERhdGFRdWVyeS5QUk9KRUNUSU9OLCBEYXRhUXVlcnkuU0VMRUNUSU9OLAogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YocmF3Q29udGFjdElkKX0sIG51bGwpOwogICAgICAgICBmaW5hbCBDb250YWN0T3BlcmF0aW9ucyBjb250YWN0T3AgPQotICAgICAgICAgICAgQ29udGFjdE9wZXJhdGlvbnMudXBkYXRlRXhpc3RpbmdDb250YWN0KGNvbnRleHQsIHJhd0NvbnRhY3RJZCwKLSAgICAgICAgICAgICAgICBiYXRjaE9wZXJhdGlvbik7Ci0KKyAgICAgICAgICAgIENvbnRhY3RPcGVyYXRpb25zLnVwZGF0ZUV4aXN0aW5nQ29udGFjdChjb250ZXh0LCByYXdDb250YWN0SWQsIGJhdGNoT3BlcmF0aW9uKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBjLmdldExvbmcoRGF0YVF1ZXJ5LkNPTFVNTl9JRCk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9NSU1FVFlQRSk7CiAgICAgICAgICAgICAgICAgdXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgaWQpOwotCiAgICAgICAgICAgICAgICAgaWYgKG1pbWVUeXBlLmVxdWFscyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3ROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fRkFNSUxZX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3ROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fR0lWRU5fTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcC51cGRhdGVOYW1lKHVyaSwgZmlyc3ROYW1lLCBsYXN0TmFtZSwgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0TmFtZSgpLCB1c2VyLmdldExhc3ROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3ROYW1lID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9GQU1JTFlfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdE5hbWUgPSBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX0dJVkVOX05BTUUpOworICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlTmFtZSh1cmksIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWVUeXBlLmVxdWFscyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBjLmdldEludChEYXRhUXVlcnkuQ09MVU1OX1BIT05FX1RZUEUpOwotCiAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfTU9CSUxFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsUGhvbmUgPSBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX1BIT05FX05VTUJFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlUGhvbmUoY2VsbFBob25lLCB1c2VyLmdldENlbGxQaG9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlUGhvbmUoY2VsbFBob25lLCB1c2VyLmdldENlbGxQaG9uZSgpLCB1cmkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9PVEhFUikgewogICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJQaG9uZSA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fUEhPTkVfTlVNQkVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcC51cGRhdGVQaG9uZShvdGhlclBob25lLCB1c2VyLmdldEhvbWVQaG9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlUGhvbmUob3RoZXJQaG9uZSwgdXNlci5nZXRIb21lUGhvbmUoKSwgdXJpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKERhdGEuTUlNRVRZUEUuZXF1YWxzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRGF0YS5NSU1FVFlQRS5lcXVhbHMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGVtYWlsID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9FTUFJTF9BRERSRVNTKTsKICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZUVtYWlsKHVzZXIuZ2V0RW1haWwoKSwgZW1haWwsIHVyaSk7Ci0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IC8vIHdoaWxlCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBjLmNsb3NlKCk7CiAgICAgICAgIH0KLQogICAgICAgICAvLyBBZGQgdGhlIGNlbGwgcGhvbmUsIGlmIHByZXNlbnQgYW5kIG5vdCB1cGRhdGVkIGFib3ZlCiAgICAgICAgIGlmIChjZWxsUGhvbmUgPT0gbnVsbCkgewogICAgICAgICAgICAgY29udGFjdE9wLmFkZFBob25lKHVzZXIuZ2V0Q2VsbFBob25lKCksIFBob25lLlRZUEVfTU9CSUxFKTsKICAgICAgICAgfQotCiAgICAgICAgIC8vIEFkZCB0aGUgb3RoZXIgcGhvbmUsIGlmIHByZXNlbnQgYW5kIG5vdCB1cGRhdGVkIGFib3ZlCiAgICAgICAgIGlmIChvdGhlclBob25lID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbnRhY3RPcC5hZGRQaG9uZSh1c2VyLmdldEhvbWVQaG9uZSgpLCBQaG9uZS5UWVBFX09USEVSKTsKICAgICAgICAgfQotCiAgICAgICAgIC8vIEFkZCB0aGUgZW1haWwgYWRkcmVzcywgaWYgcHJlc2VudCBhbmQgbm90IHVwZGF0ZWQgYWJvdmUKICAgICAgICAgaWYgKGVtYWlsID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbnRhY3RPcC5hZGRFbWFpbCh1c2VyLmdldEVtYWlsKCkpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKioKQEAgLTI0Niw5ICsyMjAsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlQ29udGFjdChDb250ZXh0IGNvbnRleHQsIGxvbmcgcmF3Q29udGFjdElkLAogICAgICAgICBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbikgeworCiAgICAgICAgIGJhdGNoT3BlcmF0aW9uLmFkZChDb250YWN0T3BlcmF0aW9ucy5uZXdEZWxldGVDcG8oCi0gICAgICAgICAgICBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChSYXdDb250YWN0cy5DT05URU5UX1VSSSwgcmF3Q29udGFjdElkKSwKLSAgICAgICAgICAgIHRydWUpLmJ1aWxkKCkpOworICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIHJhd0NvbnRhY3RJZCksIHRydWUpLmJ1aWxkKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjYwLDExICsyMzQsMTEgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBSYXdDb250YWN0IGlkLCBvciAwIGlmIG5vdCBmb3VuZAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbG9va3VwUmF3Q29udGFjdChDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIGxvbmcgdXNlcklkKSB7CisKICAgICAgICAgbG9uZyBhdXRob3JJZCA9IDA7CiAgICAgICAgIGZpbmFsIEN1cnNvciBjID0KLSAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBVc2VySWRRdWVyeS5QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIFVzZXJJZFF1ZXJ5LlNFTEVDVElPTiwgbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZih1c2VySWQpfSwKLSAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBVc2VySWRRdWVyeS5QUk9KRUNUSU9OLCBVc2VySWRRdWVyeS5TRUxFQ1RJT04sCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZih1c2VySWQpfSwgbnVsbCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgYXV0aG9ySWQgPSBjLmdldExvbmcoVXNlcklkUXVlcnkuQ09MVU1OX0lEKTsKQEAgLTI4NiwxMSArMjYwLDExIEBACiAgICAgICogQHJldHVybiB0aGUgcHJvZmlsZSBEYXRhIHJvdyBpZCwgb3IgMCBpZiBub3QgZm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGxvb2t1cFByb2ZpbGUoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBsb25nIHVzZXJJZCkgeworCiAgICAgICAgIGxvbmcgcHJvZmlsZUlkID0gMDsKICAgICAgICAgZmluYWwgQ3Vyc29yIGMgPQotICAgICAgICAgICAgcmVzb2x2ZXIucXVlcnkoRGF0YS5DT05URU5UX1VSSSwgUHJvZmlsZVF1ZXJ5LlBST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgUHJvZmlsZVF1ZXJ5LlNFTEVDVElPTiwgbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZih1c2VySWQpfSwKLSAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIFByb2ZpbGVRdWVyeS5QUk9KRUNUSU9OLCBQcm9maWxlUXVlcnkuU0VMRUNUSU9OLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sIG51bGwpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICBwcm9maWxlSWQgPSBjLmdldExvbmcoUHJvZmlsZVF1ZXJ5LkNPTFVNTl9JRCk7CkBAIC0zMDcsMjIgKzI4MSwzMCBAQAogICAgICAqIENvbnN0YW50cyBmb3IgYSBxdWVyeSB0byBmaW5kIGEgY29udGFjdCBnaXZlbiBhIHNhbXBsZSBTeW5jQWRhcHRlciB1c2VyCiAgICAgICogSUQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUHJvZmlsZVF1ZXJ5IHsKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9maWxlUXVlcnkgeworCisgICAgICAgIHByaXZhdGUgUHJvZmlsZVF1ZXJ5KCkgeworICAgICAgICB9CisKICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHtEYXRhLl9JRH07CiAKICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX0lEID0gMDsKIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT04gPQotICAgICAgICAgICAgRGF0YS5NSU1FVFlQRSArICI9JyIgKyBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuTUlNRV9QUk9GSUxFCi0gICAgICAgICAgICAgICAgKyAiJyBBTkQgIiArIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5EQVRBX1BJRCArICI9PyI7CisgICAgICAgICAgICBEYXRhLk1JTUVUWVBFICsgIj0nIiArIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5NSU1FX1BST0ZJTEUgKyAiJyBBTkQgIgorICAgICAgICAgICAgICAgICsgU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLkRBVEFfUElEICsgIj0/IjsKICAgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIGEgcXVlcnkgdG8gZmluZCBhIGNvbnRhY3QgZ2l2ZW4gYSBzYW1wbGUgU3luY0FkYXB0ZXIgdXNlcgogICAgICAqIElELgogICAgICAqLwotICAgIHByaXZhdGUgaW50ZXJmYWNlIFVzZXJJZFF1ZXJ5IHsKLSAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQUk9KRUNUSU9OID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7UmF3Q29udGFjdHMuX0lEfTsKKyAgICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjbGFzcyBVc2VySWRRdWVyeSB7CisKKyAgICAgICAgcHJpdmF0ZSBVc2VySWRRdWVyeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7UmF3Q29udGFjdHMuX0lEfTsKIAogICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT0xVTU5fSUQgPSAwOwogCkBAIC0zMzQsMjEgKzMxNiwzNCBAQAogICAgIC8qKgogICAgICAqIENvbnN0YW50cyBmb3IgYSBxdWVyeSB0byBnZXQgY29udGFjdCBkYXRhIGZvciBhIGdpdmVuIHJhd0NvbnRhY3RJZAogICAgICAqLwotICAgIHByaXZhdGUgaW50ZXJmYWNlIERhdGFRdWVyeSB7CisgICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGF0YVF1ZXJ5IHsKKworICAgICAgICBwcml2YXRlIERhdGFRdWVyeSgpIHsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nW10ge0RhdGEuX0lELCBEYXRhLk1JTUVUWVBFLCBEYXRhLkRBVEExLCBEYXRhLkRBVEEyLAotICAgICAgICAgICAgICAgIERhdGEuREFUQTMsfTsKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7RGF0YS5fSUQsIERhdGEuTUlNRVRZUEUsIERhdGEuREFUQTEsIERhdGEuREFUQTIsIERhdGEuREFUQTMsfTsKIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQgPSAwOworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NSU1FVFlQRSA9IDE7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RBVEExID0gMjsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREFUQTIgPSAzOworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9EQVRBMyA9IDQ7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1BIT05FX05VTUJFUiA9IENPTFVNTl9EQVRBMTsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUEhPTkVfVFlQRSA9IENPTFVNTl9EQVRBMjsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fRU1BSUxfQUREUkVTUyA9IENPTFVNTl9EQVRBMTsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fRU1BSUxfVFlQRSA9IENPTFVNTl9EQVRBMjsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fR0lWRU5fTkFNRSA9IENPTFVNTl9EQVRBMjsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fRkFNSUxZX05BTUUgPSBDT0xVTU5fREFUQTM7CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0gRGF0YS5SQVdfQ09OVEFDVF9JRCArICI9PyI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0T3BlcmF0aW9ucy5qYXZhCmluZGV4IDllNDdmNzAuLmRiMDFmNDggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0T3BlcmF0aW9ucy5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0T3BlcmF0aW9ucy5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMucGxhdGZvcm07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwpAQCAtMzgsMTIgKzM3LDE5IEBACiBwdWJsaWMgY2xhc3MgQ29udGFjdE9wZXJhdGlvbnMgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50VmFsdWVzIG1WYWx1ZXM7CisKICAgICBwcml2YXRlIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5CdWlsZGVyIG1CdWlsZGVyOworCiAgICAgcHJpdmF0ZSBmaW5hbCBCYXRjaE9wZXJhdGlvbiBtQmF0Y2hPcGVyYXRpb247CisKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbVlpZWxkOworCiAgICAgcHJpdmF0ZSBsb25nIG1SYXdDb250YWN0SWQ7CisKICAgICBwcml2YXRlIGludCBtQmFja1JlZmVyZW5jZTsKKwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNOZXdDb250YWN0OwogCiAgICAgLyoqCkBAIC01NSwxMCArNjEsMTAgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudE5hbWUgdGhlIHVzZXJuYW1lIG9mIHRoZSBjdXJyZW50IGxvZ2luCiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29udGFjdE9wZXJhdGlvbnMgY3JlYXRlTmV3Q29udGFjdChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgIGludCB1c2VySWQsIFN0cmluZyBhY2NvdW50TmFtZSwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250YWN0T3BlcmF0aW9ucyhjb250ZXh0LCB1c2VySWQsIGFjY291bnROYW1lLAotICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24pOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGFjdE9wZXJhdGlvbnMgY3JlYXRlTmV3Q29udGFjdChDb250ZXh0IGNvbnRleHQsIGludCB1c2VySWQsCisgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKworICAgICAgICByZXR1cm4gbmV3IENvbnRhY3RPcGVyYXRpb25zKGNvbnRleHQsIHVzZXJJZCwgYWNjb3VudE5hbWUsIGJhdGNoT3BlcmF0aW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY5LDggKzc1LDkgQEAKICAgICAgKiBAcGFyYW0gcmF3Q29udGFjdElkIHRoZSB1bmlxdWUgSWQgb2YgdGhlIGV4aXN0aW5nIHJhd0NvbnRhY3QKICAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIENvbnRhY3RPcGVyYXRpb25zCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVFeGlzdGluZ0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIENvbnRhY3RPcGVyYXRpb25zIHVwZGF0ZUV4aXN0aW5nQ29udGFjdChDb250ZXh0IGNvbnRleHQsIGxvbmcgcmF3Q29udGFjdElkLAorICAgICAgICBCYXRjaE9wZXJhdGlvbiBiYXRjaE9wZXJhdGlvbikgeworCiAgICAgICAgIHJldHVybiBuZXcgQ29udGFjdE9wZXJhdGlvbnMoY29udGV4dCwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgfQogCkBAIC04MywxOSArOTAsMTggQEAKIAogICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyhDb250ZXh0IGNvbnRleHQsIGludCB1c2VySWQsIFN0cmluZyBhY2NvdW50TmFtZSwKICAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICB0aGlzKGNvbnRleHQsIGJhdGNoT3BlcmF0aW9uKTsKICAgICAgICAgbUJhY2tSZWZlcmVuY2UgPSBtQmF0Y2hPcGVyYXRpb24uc2l6ZSgpOwogICAgICAgICBtSXNOZXdDb250YWN0ID0gdHJ1ZTsKICAgICAgICAgbVZhbHVlcy5wdXQoUmF3Q29udGFjdHMuU09VUkNFX0lELCB1c2VySWQpOwogICAgICAgICBtVmFsdWVzLnB1dChSYXdDb250YWN0cy5BQ0NPVU5UX1RZUEUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOwogICAgICAgICBtVmFsdWVzLnB1dChSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUsIGFjY291bnROYW1lKTsKLSAgICAgICAgbUJ1aWxkZXIgPQotICAgICAgICAgICAgbmV3SW5zZXJ0Q3BvKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCB0cnVlKS53aXRoVmFsdWVzKG1WYWx1ZXMpOworICAgICAgICBtQnVpbGRlciA9IG5ld0luc2VydENwbyhSYXdDb250YWN0cy5DT05URU5UX1VSSSwgdHJ1ZSkud2l0aFZhbHVlcyhtVmFsdWVzKTsKICAgICAgICAgbUJhdGNoT3BlcmF0aW9uLmFkZChtQnVpbGRlci5idWlsZCgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwKLSAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKICAgICAgICAgdGhpcyhjb250ZXh0LCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgIG1Jc05ld0NvbnRhY3QgPSBmYWxzZTsKICAgICAgICAgbVJhd0NvbnRhY3RJZCA9IHJhd0NvbnRhY3RJZDsKQEAgLTEwOSwxNiArMTE1LDE1IEBACiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwogICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyBhZGROYW1lKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCiAgICAgICAgIG1WYWx1ZXMuY2xlYXIoKTsKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShmaXJzdE5hbWUpKSB7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCBmaXJzdE5hbWUpOwotICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuTUlNRVRZUEUsCi0gICAgICAgICAgICAgICAgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOworICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhc3ROYW1lKSkgewogICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIGxhc3ROYW1lKTsKLSAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLAotICAgICAgICAgICAgICAgIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKKyAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1WYWx1ZXMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgYWRkSW5zZXJ0T3AoKTsKQEAgLTE4OCw4ICsxOTMsNyBAQAogICAgICAqIEBwYXJhbSB1cmkgVXJpIGZvciB0aGUgZXhpc3RpbmcgcmF3IGNvbnRhY3QgdG8gYmUgdXBkYXRlZAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlRW1haWwoU3RyaW5nIGVtYWlsLCBTdHJpbmcgZXhpc3RpbmdFbWFpbCwKLSAgICAgICAgVXJpIHVyaSkgeworICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVFbWFpbChTdHJpbmcgZW1haWwsIFN0cmluZyBleGlzdGluZ0VtYWlsLCBVcmkgdXJpKSB7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhleGlzdGluZ0VtYWlsLCBlbWFpbCkpIHsKICAgICAgICAgICAgIG1WYWx1ZXMuY2xlYXIoKTsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KEVtYWlsLkRBVEEsIGVtYWlsKTsKQEAgLTIwNywxMCArMjExLDExIEBACiAgICAgICogQHBhcmFtIHVyaSBVcmkgZm9yIHRoZSBleGlzdGluZyByYXcgY29udGFjdCB0byBiZSB1cGRhdGVkCiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwotICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVOYW1lKFVyaSB1cmksIFN0cmluZyBleGlzdGluZ0ZpcnN0TmFtZSwKLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nTGFzdE5hbWUsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgewotICAgICAgICBMb2cuaSgiQ29udGFjdE9wZXJhdGlvbnMiLCAiZWY9IiArIGV4aXN0aW5nRmlyc3ROYW1lICsgImVsPSIKLSAgICAgICAgICAgICsgZXhpc3RpbmdMYXN0TmFtZSArICJmPSIgKyBmaXJzdE5hbWUgKyAibD0iICsgbGFzdE5hbWUpOworICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVOYW1lKFVyaSB1cmksIFN0cmluZyBleGlzdGluZ0ZpcnN0TmFtZSwgU3RyaW5nIGV4aXN0aW5nTGFzdE5hbWUsCisgICAgICAgIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworCisgICAgICAgIExvZy5pKCJDb250YWN0T3BlcmF0aW9ucyIsICJlZj0iICsgZXhpc3RpbmdGaXJzdE5hbWUgKyAiZWw9IiArIGV4aXN0aW5nTGFzdE5hbWUgKyAiZj0iCisgICAgICAgICAgICArIGZpcnN0TmFtZSArICJsPSIgKyBsYXN0TmFtZSk7CiAgICAgICAgIG1WYWx1ZXMuY2xlYXIoKTsKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKGV4aXN0aW5nRmlyc3ROYW1lLCBmaXJzdE5hbWUpKSB7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCBmaXJzdE5hbWUpOwpAQCAtMjMyLDggKzIzNyw3IEBACiAgICAgICogQHBhcmFtIHVyaSBVcmkgZm9yIHRoZSBleGlzdGluZyByYXcgY29udGFjdCB0byBiZSB1cGRhdGVkCiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwotICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVQaG9uZShTdHJpbmcgZXhpc3RpbmdOdW1iZXIsIFN0cmluZyBwaG9uZSwKLSAgICAgICAgVXJpIHVyaSkgeworICAgIHB1YmxpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVQaG9uZShTdHJpbmcgZXhpc3RpbmdOdW1iZXIsIFN0cmluZyBwaG9uZSwgVXJpIHVyaSkgewogICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMocGhvbmUsIGV4aXN0aW5nTnVtYmVyKSkgewogICAgICAgICAgICAgbVZhbHVlcy5jbGVhcigpOwogICAgICAgICAgICAgbVZhbHVlcy5wdXQoUGhvbmUuTlVNQkVSLCBwaG9uZSk7CkBAIC0yNjAsMTYgKzI2NCwxNCBAQAogICAgICAqIEFkZHMgYW4gaW5zZXJ0IG9wZXJhdGlvbiBpbnRvIHRoZSBiYXRjaAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhZGRJbnNlcnRPcCgpIHsKKwogICAgICAgICBpZiAoIW1Jc05ld0NvbnRhY3QpIHsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KFBob25lLlJBV19DT05UQUNUX0lELCBtUmF3Q29udGFjdElkKTsKICAgICAgICAgfQotICAgICAgICBtQnVpbGRlciA9Ci0gICAgICAgICAgICBuZXdJbnNlcnRDcG8oYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcihEYXRhLkNPTlRFTlRfVVJJKSwKLSAgICAgICAgICAgICAgICBtWWllbGQpOworICAgICAgICBtQnVpbGRlciA9IG5ld0luc2VydENwbyhhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKERhdGEuQ09OVEVOVF9VUkkpLCBtWWllbGQpOwogICAgICAgICBtQnVpbGRlci53aXRoVmFsdWVzKG1WYWx1ZXMpOwogICAgICAgICBpZiAobUlzTmV3Q29udGFjdCkgewotICAgICAgICAgICAgbUJ1aWxkZXIKLSAgICAgICAgICAgICAgICAud2l0aFZhbHVlQmFja1JlZmVyZW5jZShEYXRhLlJBV19DT05UQUNUX0lELCBtQmFja1JlZmVyZW5jZSk7CisgICAgICAgICAgICBtQnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKERhdGEuUkFXX0NPTlRBQ1RfSUQsIG1CYWNrUmVmZXJlbmNlKTsKICAgICAgICAgfQogICAgICAgICBtWWllbGQgPSBmYWxzZTsKICAgICAgICAgbUJhdGNoT3BlcmF0aW9uLmFkZChtQnVpbGRlci5idWlsZCgpKTsKQEAgLTI4NCwyOCArMjg2LDIzIEBACiAgICAgICAgIG1CYXRjaE9wZXJhdGlvbi5hZGQobUJ1aWxkZXIuYnVpbGQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdJbnNlcnRDcG8oVXJpIHVyaSwKLSAgICAgICAgYm9vbGVhbiB5aWVsZCkgewotICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydCgKLSAgICAgICAgICAgIGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIodXJpKSkud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CisgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdJbnNlcnRDcG8oVXJpIHVyaSwgYm9vbGVhbiB5aWVsZCkgeworICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpCisgICAgICAgICAgICAud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdVcGRhdGVDcG8oVXJpIHVyaSwKLSAgICAgICAgYm9vbGVhbiB5aWVsZCkgewotICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld1VwZGF0ZSgKLSAgICAgICAgICAgIGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIodXJpKSkud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CisgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdVcGRhdGVDcG8oVXJpIHVyaSwgYm9vbGVhbiB5aWVsZCkgeworICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld1VwZGF0ZShhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpCisgICAgICAgICAgICAud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdEZWxldGVDcG8oVXJpIHVyaSwKLSAgICAgICAgYm9vbGVhbiB5aWVsZCkgewotICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0RlbGV0ZSgKLSAgICAgICAgICAgIGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIodXJpKSkud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7Ci0KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5CdWlsZGVyIG5ld0RlbGV0ZUNwbyhVcmkgdXJpLCBib29sZWFuIHlpZWxkKSB7CisgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3RGVsZXRlKGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIodXJpKSkKKyAgICAgICAgICAgIC53aXRoWWllbGRBbGxvd2VkKHlpZWxkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBVcmkgYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcihVcmkgdXJpKSB7Ci0gICAgICAgIHJldHVybiB1cmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoCi0gICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNBTExFUl9JU19TWU5DQURBUFRFUiwgInRydWUiKS5idWlsZCgpOworICAgICAgICByZXR1cm4gdXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKENvbnRhY3RzQ29udHJhY3QuQ0FMTEVSX0lTX1NZTkNBREFQVEVSLCAidHJ1ZSIpCisgICAgICAgICAgICAuYnVpbGQoKTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9TYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9TYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuamF2YQppbmRleCBiYzAyMzI1Li43YjYwZDViIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL1NhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5qYXZhCkBAIC0yMCw3ICsyMCwxMSBAQAogLyoKICAqIFRoZSBzdGFuZGFyZCBjb2x1bW5zIHJlcHJlc2VudGluZyBjb250YWN0J3MgaW5mbyBmcm9tIHNvY2lhbCBhcHBzLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucyB7CitwdWJsaWMgZmluYWwgY2xhc3MgU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zIHsKKworICAgIHByaXZhdGUgU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zKCkgeworICAgIH0KKwogICAgIC8qKgogICAgICAqIE1JTUUtdHlwZSB1c2VkIHdoZW4gc3RvcmluZyBhIHByb2ZpbGUge0BsaW5rIERhdGF9IGVudHJ5LgogICAgICAqLwpAQCAtMjgsNyArMzIsOCBAQAogICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vdm5kLnNhbXBsZXN5bmNhZGFwdGVyLnByb2ZpbGUiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QSUQgPSBEYXRhLkRBVEExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU1VNTUFSWSA9IERhdGEuREFUQTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9ERVRBSUwgPSBEYXRhLkRBVEEzOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9TVU1NQVJZID0gRGF0YS5EQVRBMjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfREVUQUlMID0gRGF0YS5EQVRBMzsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3N5bmNhZGFwdGVyL1N5bmNBZGFwdGVyLmphdmEKaW5kZXggMDc1MjVhYS4uMjA2MTg5YSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3N5bmNhZGFwdGVyL1N5bmNBZGFwdGVyLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3N5bmNhZGFwdGVyL1N5bmNBZGFwdGVyLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5zeW5jYWRhcHRlcjsKIAogaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKQEAgLTQ2LDkgKzQ1LDExIEBACiAgKiBwbGF0Zm9ybSBDb250YWN0T3BlcmF0aW9ucyBwcm92aWRlci4KICAqLwogcHVibGljIGNsYXNzIFN5bmNBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RUaHJlYWRlZFN5bmNBZGFwdGVyIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3luY0FkYXB0ZXIiOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50TWFuYWdlciBtQWNjb3VudE1hbmFnZXI7CisKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIERhdGUgbUxhc3RVcGRhdGVkOwpAQCAtNjIsMTggKzYzLDE3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25QZXJmb3JtU3luYyhBY2NvdW50IGFjY291bnQsIEJ1bmRsZSBleHRyYXMsIFN0cmluZyBhdXRob3JpdHksCiAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0KSB7CisKICAgICAgICAgTGlzdDxVc2VyPiB1c2VyczsKICAgICAgICAgTGlzdDxTdGF0dXM+IHN0YXR1c2VzOwogICAgICAgICBTdHJpbmcgYXV0aHRva2VuID0gbnVsbDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgLy8gdXNlIHRoZSBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCB0aGUgY3JlZGVudGlhbHMKLSAgICAgICAgICAgICBhdXRodG9rZW4gPQotICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5ibG9ja2luZ0dldEF1dGhUb2tlbihhY2NvdW50LAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVVUSFRPS0VOX1RZUEUsIHRydWUgLyogbm90aWZ5QXV0aEZhaWx1cmUgKi8pOwotICAgICAgICAgICAgIC8vIGZldGNoIHVwZGF0ZXMgZnJvbSB0aGUgc2FtcGxlIHNlcnZpY2Ugb3ZlciB0aGUgY2xvdWQKLSAgICAgICAgICAgICB1c2VycyA9Ci0gICAgICAgICAgICAgICAgTmV0d29ya1V0aWxpdGllcy5mZXRjaEZyaWVuZFVwZGF0ZXMoYWNjb3VudCwgYXV0aHRva2VuLAotICAgICAgICAgICAgICAgICAgICBtTGFzdFVwZGF0ZWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdXNlIHRoZSBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCB0aGUgY3JlZGVudGlhbHMKKyAgICAgICAgICAgIGF1dGh0b2tlbiA9CisgICAgICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC5ibG9ja2luZ0dldEF1dGhUb2tlbihhY2NvdW50LCBDb25zdGFudHMuQVVUSFRPS0VOX1RZUEUsIHRydWUgLyogbm90aWZ5QXV0aEZhaWx1cmUgKi8pOworICAgICAgICAgICAgLy8gZmV0Y2ggdXBkYXRlcyBmcm9tIHRoZSBzYW1wbGUgc2VydmljZSBvdmVyIHRoZSBjbG91ZAorICAgICAgICAgICAgdXNlcnMgPSBOZXR3b3JrVXRpbGl0aWVzLmZldGNoRnJpZW5kVXBkYXRlcyhhY2NvdW50LCBhdXRodG9rZW4sIG1MYXN0VXBkYXRlZCk7CiAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGxhc3Qgc3luY2VkIGRhdGUuCiAgICAgICAgICAgICBtTGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgLy8gdXBkYXRlIHBsYXRmb3JtIGNvbnRhY3RzLgpAQCAtOTEsOCArOTEsNyBAQAogICAgICAgICAgICAgTG9nLmUoVEFHLCAiSU9FeGNlcHRpb24iLCBlKTsKICAgICAgICAgICAgIHN5bmNSZXN1bHQuc3RhdHMubnVtSW9FeGNlcHRpb25zKys7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5pbnZhbGlkYXRlQXV0aFRva2VuKENvbnN0YW50cy5BQ0NPVU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgYXV0aHRva2VuKTsKKyAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5pbnZhbGlkYXRlQXV0aFRva2VuKENvbnN0YW50cy5BQ0NPVU5UX1RZUEUsIGF1dGh0b2tlbik7CiAgICAgICAgICAgICBzeW5jUmVzdWx0LnN0YXRzLm51bUF1dGhFeGNlcHRpb25zKys7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiIsIGUpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jU2VydmljZS5qYXZhCmluZGV4IDI1NmY5MWQuLjU3Yjc3NDcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jU2VydmljZS5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jU2VydmljZS5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuc3luY2FkYXB0ZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwpAQCAtMjYsMTIgKzI1LDExIEBACiAgKiBJQmluZGVyLgogICovCiBwdWJsaWMgY2xhc3MgU3luY1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzU3luY0FkYXB0ZXJMb2NrID0gbmV3IE9iamVjdCgpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3luY0FkYXB0ZXIgc1N5bmNBZGFwdGVyID0gbnVsbDsKIAotICAgIC8qCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNTeW5jQWRhcHRlckxvY2spIHsKQEAgLTQxLDkgKzM5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIHJldHVybiBzU3luY0FkYXB0ZXIuZ2V0U3luY0FkYXB0ZXJCaW5kZXIoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9BbGxUZXN0cy5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL0FsbFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZjAwNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuVGVzdFN1aXRlQnVpbGRlcjsKKworLyoqCisgKiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyBhbGwgdGVzdHMgZm9yIFNhbXBsZVN5bmNBZGFwdGVyLgorICoKKyAqLworcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGVCdWlsZGVyKEFsbFRlc3RzLmNsYXNzKS5pbmNsdWRlQWxsUGFja2FnZXNVbmRlckhlcmUoKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3QuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q2ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmF1dGhlbnRpY2F0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGlzIGlzIGEgc2VyaWVzIG9mIHVuaXQgdGVzdHMgZm9yIHRoZSB7QGxpbmsgQXV0aGVudGljYXRvckFjdGl2aXR5fSBjbGFzcy4KKyAqLworQFNtYWxsVGVzdAorcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3RzIGV4dGVuZHMKKyAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxBdXRoZW50aWNhdG9yQWN0aXZpdHk+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9XQUlUID0gMTAwMDA7CisKKyAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIEF1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3RzKCkgeworCisgICAgICAgIHN1cGVyKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbW9uIHNldHVwIGNvZGUgZm9yIGFsbCB0ZXN0cy4gU2V0cyB1cCBhIGRlZmF1bHQgbGF1bmNoIGludGVudCwgd2hpY2gKKyAgICAgKiBzb21lIHRlc3RzIHdpbGwgdXNlIChvdGhlcnMgd2lsbCBvdmVycmlkZSkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gdGhpcy5nZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbUNvbnRleHQgPSBtSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlybSB0aGF0IExvZ2luIGlzIHByZXNlbnRlZC4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2luT2ZmZXJlZCgpIHsKKworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlNb25pdG9yIG1vbml0b3IgPQorICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5hZGRNb25pdG9yKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcy5nZXROYW1lKCksIG51bGwsIGZhbHNlKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc3RhcnRBY3Rpdml0eVN5bmMoaW50ZW50KTsKKyAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JNb25pdG9yV2l0aFRpbWVvdXQobW9uaXRvciwgQUNUSVZJVFlfV0FJVCk7CisgICAgICAgIFZpZXcgbG9naW5idXR0b24gPSBhY3Rpdml0eS5maW5kVmlld0J5SWQoUi5pZC5va19idXR0b24pOworICAgICAgICBpbnQgZXhwZWN0ZWQgPSBWaWV3LlZJU0lCTEU7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbG9naW5idXR0b24uZ2V0VmlzaWJpbGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXJUZXN0LmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2MjM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlclRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5jbGllbnQ7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuY2xpZW50LlVzZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OworCitwdWJsaWMgY2xhc3MgVXNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVzZXIgdXNlciA9CisgICAgICAgICAgICBuZXcgVXNlcigibWpvc2hpIiwgIk1lZ2hhIiwgIkpvc2hpIiwgIjEtNjUwLTMzNS01NjgxIiwgIjEtNjUwLTExMS01NjgxIiwKKyAgICAgICAgICAgICAgICAiMS02NTAtMjIyLTU2ODEiLCAidGVzdEBnb29nbGUuY29tIiwgZmFsc2UsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1lZ2hhIiwgdXNlci5nZXRGaXJzdE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSm9zaGkiLCB1c2VyLmdldExhc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1qb3NoaSIsIHVzZXIuZ2V0VXNlck5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyLmdldFVzZXJJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTY1MC0zMzUtNTY4MSIsIHVzZXIuZ2V0Q2VsbFBob25lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHVzZXIuaXNEZWxldGVkKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKU09OT2JqZWN0IGpzb25PYmogPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICBqc29uT2JqLnB1dCgidSIsICJtam9zaGkiKTsKKyAgICAgICAganNvbk9iai5wdXQoImYiLCAiTWVnaGEiKTsKKyAgICAgICAganNvbk9iai5wdXQoImwiLCAiSm9zaGkiKTsKKyAgICAgICAganNvbk9iai5wdXQoImkiLCAxKTsKKyAgICAgICAgVXNlciB1c2VyID0gVXNlci52YWx1ZU9mKGpzb25PYmopOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1lZ2hhIiwgdXNlci5nZXRGaXJzdE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSm9zaGkiLCB1c2VyLmdldExhc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1qb3NoaSIsIHVzZXIuZ2V0VXNlck5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyLmdldFVzZXJJZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggN2VmMDMxZC4uNWQ4MzVlZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsMTQgKzIxLDE0IEBACiAgICAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjIiCiAgICAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjIuMCI+CiAKLSAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI0IiAvPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX2RpY3Rpb25hcnkiPgogCiAgICAgICAgIDwhLS0gVGhlIGRlZmF1bHQgYWN0aXZpdHkgb2YgdGhlIGFwcDsgZGlzcGxheXMgc2VhcmNoIHJlc3VsdHMuIC0tPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuU2VhcmNoYWJsZURpY3Rpb25hcnkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVG9wIj4KIAogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtNDgsOCArNDgsNyBAQAogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDwhLS0gRGlzcGxheXMgdGhlIGRlZmluaXRpb24gb2YgYSB3b3JkLiAtLT4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLldvcmRBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5Xb3JkQWN0aXZpdHkiIC8+CiAKICAgICAgICAgPCEtLSBQcm92aWRlcyBzZWFyY2ggc3VnZ2VzdGlvbnMgZm9yIHdvcmRzIGFuZCB0aGVpciBkZWZpbml0aW9ucy4gLS0+CiAgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9Ii5EaWN0aW9uYXJ5UHJvdmlkZXIiCmRpZmYgLS1naXQgYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L19pbmRleC5odG1sIGIvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9faW5kZXguaHRtbAppbmRleCBjZTNlYzU0Li4xZTkyOWJlIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L19pbmRleC5odG1sCisrKyBiL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvX2luZGV4Lmh0bWwKQEAgLTE5LDYgKzE5LDE0IEBACiBiaW5kIGRhdGEgZnJvbSBhIEN1cnNvciB0byBhIExpc3RWaWV3LjwvbGk+CiA8L3VsPgogCis8cD48Yj5SZXZpc2lvbnM6PC9iPjwvcD4KKzx1bD4KKyAgPGxpPlVwZGF0ZWQgZm9yIEFuZHJvaWQgMy4wIHRvIHVzZSB0aGUgPGEgaHJlZj0iLi4vLi4vLi4vZ3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5odG1sIj5BY3Rpb24KK0JhcjwvYT4gYW5kIHRoZSA8Y29kZT48YQoraHJlZj0iLi4vLi4vLi4vcmVmZXJlbmNlL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuaHRtbCI+U2VhcmNoVmlldzwvYT48L2NvZGU+IHdpZGdldCBhcyBhbiBhY3Rpb24gaXRlbS4KKyhBdmFpbGFibGUgaW4gdGhlIDxlbT5TYW1wbGVzIGZvciBTREsgQVBJIDExPC9lbT4uKTwvbGk+Cis8L3VsPgorCiA8cD5TZWUgYWxzbzo8L3A+CiA8dWw+CiAgIDxsaT48YSBocmVmPSIuLi8uLi8uLi9ndWlkZS90b3BpY3Mvc2VhcmNoL2luZGV4Lmh0bWwiPlNlYXJjaCBEZXZlbG9wZXIgR3VpZGU8L2E+PC9saT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvcmVzL21lbnUvb3B0aW9uc19tZW51LnhtbCBiL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvcmVzL21lbnUvb3B0aW9uc19tZW51LnhtbAppbmRleCAyYWE3Y2YyLi5jMzVjN2Q0IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L3Jlcy9tZW51L29wdGlvbnNfbWVudS54bWwKKysrIGIvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9yZXMvbWVudS9vcHRpb25zX21lbnUueG1sCkBAIC0yMCw1ICsyMCw3IEBACiA8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgogICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoIgogICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVudV9zZWFyY2giCi0gICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zZWFyY2giIC8+CisgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbSIKKyAgICAgICAgICBhbmRyb2lkOmFjdGlvblZpZXdDbGFzcz0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldyIgLz4KIDwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBlZTYyOGNlLi5lN2FhN2MxIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0zNCw3ICszNCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJzZXR0aW5nc19kZXNjcmlwdGlvbiI+RGVmaW5pdGlvbnMgb2Ygd29yZHM8L3N0cmluZz4KIAogICAgIDwhLS0gR2VuZXJhbCBpbnN0cnVjdGlvbnMgaW4gdGhlIG1haW4gYWN0aXZpdHkuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2VhcmNoX2luc3RydWN0aW9ucyI+UHJlc3MgdGhlIHNlYXJjaCBrZXkgdG8gbG9vayB1cCBhIHdvcmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlYXJjaF9pbnN0cnVjdGlvbnMiPlVzZSB0aGUgc2VhcmNoIGJveCBpbiB0aGUgQWN0aW9uIEJhciB0byBsb29rIHVwIGEgd29yZDwvc3RyaW5nPgogCiAgICAgPCEtLSBTaG93biBhYm92ZSBzZWFyY2ggcmVzdWx0cyB3aGVuIHdlIHJlY2VpdmUgYSBzZWFyY2ggcmVxdWVzdC4gLS0+CiAgICAgPHBsdXJhbHMgbmFtZT0ic2VhcmNoX3Jlc3VsdHMiPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zZWFyY2hhYmxlZGljdC9TZWFyY2hhYmxlRGljdGlvbmFyeS5qYXZhIGIvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zZWFyY2hhYmxlZGljdC9TZWFyY2hhYmxlRGljdGlvbmFyeS5qYXZhCmluZGV4IGVmOTM4ZjguLmE4M2ViY2UgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2VhcmNoYWJsZWRpY3QvU2VhcmNoYWJsZURpY3Rpb25hcnkuamF2YQorKysgYi9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NlYXJjaGFibGVkaWN0L1NlYXJjaGFibGVEaWN0aW9uYXJ5LmphdmEKQEAgLTE3LDcgKzE3LDkgQEAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zZWFyY2hhYmxlZGljdDsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwpAQCAtMjgsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOwpAQCAtNTAsOCArNTMsMTkgQEAKICAgICAgICAgbVRleHRWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKICAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0KTsKIAotICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGhhbmRsZUludGVudChnZXRJbnRlbnQoKSk7CisgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25OZXdJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICAvLyBCZWNhdXNlIHRoaXMgYWN0aXZpdHkgaGFzIHNldCBsYXVuY2hNb2RlPSJzaW5nbGVUb3AiLCB0aGUgc3lzdGVtIGNhbGxzIHRoaXMgbWV0aG9kCisgICAgICAgIC8vIHRvIGRlbGl2ZXIgdGhlIGludGVudCBpZiB0aGlzIGFjdHZpdHkgaXMgY3VycmVudGx5IHRoZSBmb3JlZ3JvdW5kIGFjdGl2aXR5IHdoZW4KKyAgICAgICAgLy8gaW52b2tlZCBhZ2FpbiAod2hlbiB0aGUgdXNlciBleGVjdXRlcyBhIHNlYXJjaCBmcm9tIHRoaXMgYWN0aXZpdHksIHdlIGRvbid0IGNyZWF0ZQorICAgICAgICAvLyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGFjdGl2aXR5LCBzbyB0aGUgc3lzdGVtIGRlbGl2ZXJzIHRoZSBzZWFyY2ggaW50ZW50IGhlcmUpCisgICAgICAgIGhhbmRsZUludGVudChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVJbnRlbnQoSW50ZW50IGludGVudCkgewogICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9WSUVXLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CiAgICAgICAgICAgICAvLyBoYW5kbGVzIGEgY2xpY2sgb24gYSBzZWFyY2ggc3VnZ2VzdGlvbjsgbGF1bmNoZXMgYWN0aXZpdHkgdG8gc2hvdyB3b3JkCiAgICAgICAgICAgICBJbnRlbnQgd29yZEludGVudCA9IG5ldyBJbnRlbnQodGhpcywgV29yZEFjdGl2aXR5LmNsYXNzKTsKQEAgLTExNSw2ICsxMjksMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewogICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUub3B0aW9uc19tZW51LCBtZW51KTsKKworICAgICAgICBTZWFyY2hNYW5hZ2VyIHNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgU2VhcmNoVmlldyBzZWFyY2hWaWV3ID0gKFNlYXJjaFZpZXcpIG1lbnUuZmluZEl0ZW0oUi5pZC5zZWFyY2gpLmdldEFjdGlvblZpZXcoKTsKKyAgICAgICAgc2VhcmNoVmlldy5zZXRTZWFyY2hhYmxlSW5mbyhzZWFyY2hNYW5hZ2VyLmdldFNlYXJjaGFibGVJbmZvKGdldENvbXBvbmVudE5hbWUoKSkpOworICAgICAgICBzZWFyY2hWaWV3LnNldEljb25pZmllZEJ5RGVmYXVsdChmYWxzZSk7CisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NlYXJjaGFibGVkaWN0L1dvcmRBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zZWFyY2hhYmxlZGljdC9Xb3JkQWN0aXZpdHkuamF2YQppbmRleCAwMGRjMjcwLi5kNTZhMTQ1IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NlYXJjaGFibGVkaWN0L1dvcmRBY3Rpdml0eS5qYXZhCisrKyBiL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2VhcmNoYWJsZWRpY3QvV29yZEFjdGl2aXR5LmphdmEKQEAgLTE3LDEyICsxNywxNyBAQAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNlYXJjaGFibGVkaWN0OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogLyoqCkBAIC0zNSw2ICs0MCw5IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LndvcmQpOwogCisgICAgICAgIEFjdGlvbkJhciBhY3Rpb25CYXIgPSBnZXRBY3Rpb25CYXIoKTsKKyAgICAgICAgYWN0aW9uQmFyLnNldERpc3BsYXlIb21lQXNVcEVuYWJsZWQodHJ1ZSk7CisKICAgICAgICAgVXJpIHVyaSA9IGdldEludGVudCgpLmdldERhdGEoKTsKICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1hbmFnZWRRdWVyeSh1cmksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogCkBAIC01OCw2ICs2NiwxMiBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CiAgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOwogICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5vcHRpb25zX21lbnUsIG1lbnUpOworCisgICAgICAgIFNlYXJjaE1hbmFnZXIgc2VhcmNoTWFuYWdlciA9IChTZWFyY2hNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VBUkNIX1NFUlZJQ0UpOworICAgICAgICBTZWFyY2hWaWV3IHNlYXJjaFZpZXcgPSAoU2VhcmNoVmlldykgbWVudS5maW5kSXRlbShSLmlkLnNlYXJjaCkuZ2V0QWN0aW9uVmlldygpOworICAgICAgICBzZWFyY2hWaWV3LnNldFNlYXJjaGFibGVJbmZvKHNlYXJjaE1hbmFnZXIuZ2V0U2VhcmNoYWJsZUluZm8oZ2V0Q29tcG9uZW50TmFtZSgpKSk7CisgICAgICAgIHNlYXJjaFZpZXcuc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGZhbHNlKTsKKyAgICAgICAgCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNjcsNiArODEsMTEgQEAKICAgICAgICAgICAgIGNhc2UgUi5pZC5zZWFyY2g6CiAgICAgICAgICAgICAgICAgb25TZWFyY2hSZXF1ZXN0ZWQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgYW5kcm9pZC5SLmlkLmhvbWU6CisgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU2VhcmNoYWJsZURpY3Rpb25hcnkuY2xhc3MpOworICAgICAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UT1ApOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NrZWxldG9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL1NrZWxldG9uQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjBiNGVmMi4uYWY1YTY5NCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ta2VsZXRvbkFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NhbXBsZXMvU2tlbGV0b25BcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNyArMjUsOCBAQAogICAgICB0byBjb21lIGZyb20gYSBkb21haW4gdGhhdCB5b3Ugb3duIG9yIGhhdmUgY29udHJvbCBvdmVyLiAtLT4KIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5za2VsZXRvbmFwcCI+Ci0KKyAgICAKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIxMSIvPgogICAgIDwhLS0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFuIGFwcGxpY2F0aW9uLi4uICBUaGUgJ2xhYmVsJyBpcyB0aGUgbmFtZQogICAgICAgICAgdG8gZGlzcGxheSB0byB0aGUgdXNlciBmb3IgdGhlIG92ZXJhbGwgYXBwbGljYXRpb24sIGFuZCBwcm92aWRlcwogICAgICAgICAgYSBkZWZhdWx0IGxhYmVsIGZvciBhbGwgZm9sbG93aW5nIGNvbXBvbmVudHMuICBUaGUgc3ludGF4IGhlcmUgaXMgYQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TcGlubmVyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL1NwaW5uZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3MTlhMDIyLi41MDBjODY0IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NwaW5uZXIvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zYW1wbGVzL1NwaW5uZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMzAsNyArMzAsOCBAQAogICAgIDwhLS0KICAgICAgICAgUmVxdWlyZXMgYSBtaW5pbXVtIHBsYXRmb3JtIHZlcnNpb24gb2YgQW5kcm9pZC0zIChTREsgMS41KSB0byBydW4KICAgICAtLT4KLSAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIi8+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMTEiLz4KIAogICAgIDwhLS0KICAgICAgICAgU2V0cyB0aGUgYXBwbGljYXRpb24ncyB1c2VyLXJlYWRhYmxlIGxhYmVsCmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L0FuZHJvaWQubWsgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2YTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCisjIE9ubHkgY29tcGlsZSBzb3VyY2UgamF2YSBmaWxlcyBpbiB0aGlzIGFway4KK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFN0YWNrV2lkZ2V0CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgVXNlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0byBtYWtlIG91ciB0ZXN0IGFway4KK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU3RhY2tXaWRnZXQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmVjMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhpcyBBbmRyb2lkIGFwcGxpY2F0aW9uLiAgVGhlIG5hbWVzcGFjZQorICAgICBhdHRyaWJ1dGUgYnJpbmdzIGluIHRoZSBBbmRyb2lkIHBsYXRmb3JtIG5hbWVzcGFjZSwgYW5kIHRoZSBwYWNrYWdlCisgICAgIHN1cHBsaWVzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFdoZW4gd3JpdGluZyB5b3VyCisgICAgIG93biBhcHBsaWNhdGlvbiwgdGhlIHBhY2thZ2UgbmFtZSBtdXN0IGJlIGNoYW5nZWQgZnJvbSAiY29tLmV4YW1wbGUuKiIKKyAgICAgdG8gY29tZSBmcm9tIGEgZG9tYWluIHRoYXQgeW91IG93biBvciBoYXZlIGNvbnRyb2wgb3Zlci4gLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5zdGFja3dpZGdldCI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMTEiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiLz4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iU3RhY2tXaWRnZXQiPgorICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJTdGFja1dpZGdldFByb3ZpZGVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX1VQREFURSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxtZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5wcm92aWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3N0YWNrd2lkZ2V0aW5mbyIgLz4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9IlN0YWNrV2lkZ2V0U2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkJJTkRfUkVNT1RFVklFV1MiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L19pbmRleC5odG1sIGIvc2FtcGxlcy9TdGFja1dpZGdldC9faW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9faW5kZXguaHRtbApAQCAtMCwwICsxLDMxIEBACis8cD4KKyAgICBUaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gY29uc3RydWN0IGEgc2ltcGxlIGNvbGxlY3Rpb24gd2lkZ2V0LiBUaGlzIHBhcnRpY3VsYXIgZXhhbXBsZSBzaG93cyBob3cKKyAgICB0byBjcmVhdGUgYSB3aWRnZXQgY29udGFpbmluZyBhIDxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL3dpZGdldC9TdGFja1ZpZXcuaHRtbCI+PGNvZGU+U3RhY2tWaWV3PC9jb2RlPjwvYT4KKyAgICA7IGhvd2V2ZXIsIG9ubHkgbWluaW1hbCBjaGFuZ2VzIGFyZSByZXF1aXJlZCB0byBpbmNsdWRlCisgICAgYSA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvTGlzdFZpZXcuaHRtbCI+PGNvZGU+TGlzdFZpZXc8L2NvZGU+PC9hPiwKKyAgICA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuaHRtbCI+PGNvZGU+R3JpZFZpZXc8L2NvZGU+PC9hPiBvcgorICAgIDxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuaHRtbCI+PGNvZGU+QWRhcHRlclZpZXdGbGlwcGVyPC9jb2RlPjwvYT4gaW5zdGVhZC4KKzwvcD4KKzxwPgorICAgIFRoZSBzYW1wbGUgZGVtb25zdHJhdGVzIHRoZSBmb2xsb3dpbmc6Cis8L3A+CisgICAgPHVsPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBUaGUgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIHdpcmluZyBhIDxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuaHRtbCI+PGNvZGU+UmVtb3RlVmlld3NTZXJ2aWNlPC9jb2RlPjwvYT4KKyAgICAgICAgICAgIGFuZCA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLlJlbW90ZVZpZXdzRmFjdG9yeS5odG1sIj48Y29kZT5SZW1vdGVWaWV3c0ZhY3Rvcnk8L2NvZGU+PC9hPiB3aGljaAorICAgICAgICAgICAgc2VydmUgdGhlIGZ1bmN0aW9uIG9mIGFuIGFkYXB0ZXIgZm9yIHRoZSB3aWRnZXQgY29sbGVjdGlvbi4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgVGhlIHBhdHRlcm4gZm9yIHNldHRpbmcgYW4gaW50ZW50IHRlbXBsYXRlIGFuZCBmaWxsLWluIGludGVudHMgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIHByb3ZpZGUgY2hpbGRyZW4gb2YgdGhlIGNvbGxlY3Rpb24gd2l0aCBjbGljayBiZWhhdmlvdXIuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIEhvdyB0byBtYWtlIGEgd2lkZ2V0IHdpdGggYSA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3Lmh0bWwiPjxjb2RlPlN0YWNrVmlldzwvY29kZT48L2E+CisgICAgICAgICAgICAob3IgPGEgaHJlZj0iLi4vLi4vLi4vcmVmZXJlbmNlL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5odG1sIj48Y29kZT5BZGFwdGVyVmlld0ZsaXBwZXI8L2NvZGU+PC9hPikgYXV0by1hZHZhbmNlLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBIb3cgdG8gc2V0IGEgd2lkZ2V0IHByZXZpZXcgaW1hZ2UuCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKzxpbWcgYWx0PSJUaGUgd2lkZ2V0LiIKKyAgICAgc3JjPSIuLi9pbWFnZXMvU3RhY2tXaWRnZXQucG5nIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NGM0YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9pY29uLnBuZyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5NTU4NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9pY29uLnBuZyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YzY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbm9kcGkvcHJldmlldy5wbmcgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy9kcmF3YWJsZS1ub2RwaS9wcmV2aWV3LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY4M2EwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbm9kcGkvcHJldmlldy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbm9kcGkvd2lkZ2V0X2l0ZW1fYmFja2dyb3VuZC54bWwgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy9kcmF3YWJsZS1ub2RwaS93aWRnZXRfaXRlbV9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGIzODQzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvZHJhd2FibGUtbm9kcGkvd2lkZ2V0X2l0ZW1fYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+CisgICAgPGdyYWRpZW50IGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmNjY2NjY2IiBhbmRyb2lkOmVuZENvbG9yPSIjZmYzMzMzMzMiIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy9sYXlvdXQvd2lkZ2V0X2l0ZW0ueG1sIGIvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvbGF5b3V0L3dpZGdldF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWUzMWFiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvbGF5b3V0L3dpZGdldF9pdGVtLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3dpZGdldF9pdGVtIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMjBkcCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEyMGRwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3dpZGdldF9pdGVtX2JhY2tncm91bmQiCisgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZmZmZmYiCisgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNDRzcCIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2xheW91dC93aWRnZXRfbGF5b3V0LnhtbCBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL2xheW91dC93aWRnZXRfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY5ZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9yZXMvbGF5b3V0L3dpZGdldF9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxTdGFja1ZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX3ZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpsb29wVmlld3M9InRydWUiIC8+CisgICAgPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbXB0eV92aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3dpZGdldF9pdGVtX2JhY2tncm91bmQiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZmZmZmIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtcHR5X3ZpZXdfdGV4dCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIgLz4KKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiMmY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImVtcHR5X3ZpZXdfdGV4dCI+VGhpcyBpcyB0aGUgZW1wdHkgdmlldzwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy94bWwvc3RhY2t3aWRnZXRpbmZvLnhtbCBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvcmVzL3htbC9zdGFja3dpZGdldGluZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjYzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L3Jlcy94bWwvc3RhY2t3aWRnZXRpbmZvLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFwcHdpZGdldC1wcm92aWRlcgorICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIGFuZHJvaWQ6bWluV2lkdGg9IjE1MGRpcCIKKyAgYW5kcm9pZDptaW5IZWlnaHQ9IjE1MGRpcCIKKyAgYW5kcm9pZDp1cGRhdGVQZXJpb2RNaWxsaXM9IjM2MDAwMDAiCisgIGFuZHJvaWQ6cHJldmlld0ltYWdlPSJAZHJhd2FibGUvcHJldmlldyIKKyAgYW5kcm9pZDppbml0aWFsTGF5b3V0PSJAbGF5b3V0L3dpZGdldF9sYXlvdXQiCisgIGFuZHJvaWQ6YXV0b0FkdmFuY2VWaWV3SWQ9IkBpZC9zdGFja192aWV3Ij4KKzwvYXBwd2lkZ2V0LXByb3ZpZGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvU3RhY2tXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc3RhY2t3aWRnZXQvU3RhY2tXaWRnZXRQcm92aWRlci5qYXZhIGIvc2FtcGxlcy9TdGFja1dpZGdldC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zdGFja3dpZGdldC9TdGFja1dpZGdldFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1M2MyMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc3RhY2t3aWRnZXQvU3RhY2tXaWRnZXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc3RhY2t3aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK3B1YmxpYyBjbGFzcyBTdGFja1dpZGdldFByb3ZpZGVyIGV4dGVuZHMgQXBwV2lkZ2V0UHJvdmlkZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPQVNUX0FDVElPTiA9ICJjb20uZXhhbXBsZS5hbmRyb2lkLnN0YWNrd2lkZ2V0LlRPQVNUX0FDVElPTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTSA9ICJjb20uZXhhbXBsZS5hbmRyb2lkLnN0YWNrd2lkZ2V0LkVYVFJBX0lURU0iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZWxldGVkKENvbnRleHQgY29udGV4dCwgaW50W10gYXBwV2lkZ2V0SWRzKSB7CisgICAgICAgIHN1cGVyLm9uRGVsZXRlZChjb250ZXh0LCBhcHBXaWRnZXRJZHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzYWJsZWQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyLm9uRGlzYWJsZWQoY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FbmFibGVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlci5vbkVuYWJsZWQoY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBBcHBXaWRnZXRNYW5hZ2VyIG1nciA9IEFwcFdpZGdldE1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRPQVNUX0FDVElPTikpIHsKKyAgICAgICAgICAgIGludCBhcHBXaWRnZXRJZCA9IGludGVudC5nZXRJbnRFeHRyYShBcHBXaWRnZXRNYW5hZ2VyLkVYVFJBX0FQUFdJREdFVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgQXBwV2lkZ2V0TWFuYWdlci5JTlZBTElEX0FQUFdJREdFVF9JRCk7CisgICAgICAgICAgICBpbnQgdmlld0luZGV4ID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX0lURU0sIDApOworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoY29udGV4dCwgIlRvdWNoZWQgdmlldyAiICsgdmlld0luZGV4LCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5vblJlY2VpdmUoY29udGV4dCwgaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZShDb250ZXh0IGNvbnRleHQsIEFwcFdpZGdldE1hbmFnZXIgYXBwV2lkZ2V0TWFuYWdlciwgaW50W10gYXBwV2lkZ2V0SWRzKSB7CisgICAgICAgIC8vIHVwZGF0ZSBlYWNoIG9mIHRoZSB3aWRnZXRzIHdpdGggdGhlIHJlbW90ZSBhZGFwdGVyCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBwV2lkZ2V0SWRzLmxlbmd0aDsgKytpKSB7CisKKyAgICAgICAgICAgIC8vIEhlcmUgd2Ugc2V0dXAgdGhlIGludGVudCB3aGljaCBwb2ludHMgdG8gdGhlIFN0YWNrVmlld1NlcnZpY2Ugd2hpY2ggd2lsbAorICAgICAgICAgICAgLy8gcHJvdmlkZSB0aGUgdmlld3MgZm9yIHRoaXMgY29sbGVjdGlvbi4KKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGNvbnRleHQsIFN0YWNrV2lkZ2V0U2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsIGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAvLyBXaGVuIGludGVudHMgYXJlIGNvbXBhcmVkLCB0aGUgZXh0cmFzIGFyZSBpZ25vcmVkLCBzbyB3ZSBuZWVkIHRvIGVtYmVkIHRoZSBleHRyYXMKKyAgICAgICAgICAgIC8vIGludG8gdGhlIGRhdGEgc28gdGhhdCB0aGUgZXh0cmFzIHdpbGwgbm90IGJlIGlnbm9yZWQuCisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoaW50ZW50LnRvVXJpKEludGVudC5VUklfSU5URU5UX1NDSEVNRSkpKTsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHJ2ID0gbmV3IFJlbW90ZVZpZXdzKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgUi5sYXlvdXQud2lkZ2V0X2xheW91dCk7CisgICAgICAgICAgICBydi5zZXRSZW1vdGVBZGFwdGVyKGFwcFdpZGdldElkc1tpXSwgUi5pZC5zdGFja192aWV3LCBpbnRlbnQpOworCisgICAgICAgICAgICAvLyBUaGUgZW1wdHkgdmlldyBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgY29sbGVjdGlvbiBoYXMgbm8gaXRlbXMuIEl0IHNob3VsZCBiZSBhIHNpYmxpbmcKKyAgICAgICAgICAgIC8vIG9mIHRoZSBjb2xsZWN0aW9uIHZpZXcuCisgICAgICAgICAgICBydi5zZXRFbXB0eVZpZXcoUi5pZC5zdGFja192aWV3LCBSLmlkLmVtcHR5X3ZpZXcpOworCisgICAgICAgICAgICAvLyBIZXJlIHdlIHNldHVwIHRoZSBhIHBlbmRpbmcgaW50ZW50IHRlbXBsYXRlLiBJbmRpdmlkdWFscyBpdGVtcyBvZiBhIGNvbGxlY3Rpb24KKyAgICAgICAgICAgIC8vIGNhbm5vdCBzZXR1cCB0aGVpciBvd24gcGVuZGluZyBpbnRlbnRzLCBpbnN0ZWFkLCB0aGUgY29sbGVjdGlvbiBhcyBhIHdob2xlIGNhbgorICAgICAgICAgICAgLy8gc2V0dXAgYSBwZW5kaW5nIGludGVudCB0ZW1wbGF0ZSwgYW5kIHRoZSBpbmRpdmlkdWFsIGl0ZW1zIGNhbiBzZXQgYSBmaWxsSW5JbnRlbnQKKyAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSB1bmlxdWUgYmVmb3JlIG9uIGFuIGl0ZW0gdG8gaXRlbSBiYXNpcy4KKyAgICAgICAgICAgIEludGVudCB0b2FzdEludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgU3RhY2tXaWRnZXRQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICB0b2FzdEludGVudC5zZXRBY3Rpb24oU3RhY2tXaWRnZXRQcm92aWRlci5UT0FTVF9BQ1RJT04pOworICAgICAgICAgICAgdG9hc3RJbnRlbnQucHV0RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsIGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoaW50ZW50LnRvVXJpKEludGVudC5VUklfSU5URU5UX1NDSEVNRSkpKTsKKyAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgdG9hc3RQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoY29udGV4dCwgMCwgdG9hc3RJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19VUERBVEVfQ1VSUkVOVCk7CisgICAgICAgICAgICBydi5zZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUoUi5pZC5zdGFja192aWV3LCB0b2FzdFBlbmRpbmdJbnRlbnQpOworCisgICAgICAgICAgICBhcHBXaWRnZXRNYW5hZ2VyLnVwZGF0ZUFwcFdpZGdldChhcHBXaWRnZXRJZHNbaV0sIHJ2KTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5vblVwZGF0ZShjb250ZXh0LCBhcHBXaWRnZXRNYW5hZ2VyLCBhcHBXaWRnZXRJZHMpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3N0YWNrd2lkZ2V0L1N0YWNrV2lkZ2V0U2VydmljZS5qYXZhIGIvc2FtcGxlcy9TdGFja1dpZGdldC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zdGFja3dpZGdldC9TdGFja1dpZGdldFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTNiMGVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9TdGFja1dpZGdldC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zdGFja3dpZGdldC9TdGFja1dpZGdldFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zdGFja3dpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NTZXJ2aWNlOworCitwdWJsaWMgY2xhc3MgU3RhY2tXaWRnZXRTZXJ2aWNlIGV4dGVuZHMgUmVtb3RlVmlld3NTZXJ2aWNlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5IG9uR2V0Vmlld0ZhY3RvcnkoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbmV3IFN0YWNrUmVtb3RlVmlld3NGYWN0b3J5KHRoaXMuZ2V0QXBwbGljYXRpb25Db250ZXh0KCksIGludGVudCk7CisgICAgfQorfQorCitjbGFzcyBTdGFja1JlbW90ZVZpZXdzRmFjdG9yeSBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtQ291bnQgPSAxMDsKKyAgICBwcml2YXRlIExpc3Q8V2lkZ2V0SXRlbT4gbVdpZGdldEl0ZW1zID0gbmV3IEFycmF5TGlzdDxXaWRnZXRJdGVtPigpOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGludCBtQXBwV2lkZ2V0SWQ7CisKKyAgICBwdWJsaWMgU3RhY2tSZW1vdGVWaWV3c0ZhY3RvcnkoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUFwcFdpZGdldElkID0gaW50ZW50LmdldEludEV4dHJhKEFwcFdpZGdldE1hbmFnZXIuRVhUUkFfQVBQV0lER0VUX0lELAorICAgICAgICAgICAgICAgIEFwcFdpZGdldE1hbmFnZXIuSU5WQUxJRF9BUFBXSURHRVRfSUQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBJbiBvbkNyZWF0ZSgpIHlvdSBzZXR1cCBhbnkgY29ubmVjdGlvbnMgLyBjdXJzb3JzIHRvIHlvdXIgZGF0YSBzb3VyY2UuIEhlYXZ5IGxpZnRpbmcsCisgICAgICAgIC8vIGZvciBleGFtcGxlIGRvd25sb2FkaW5nIG9yIGNyZWF0aW5nIGNvbnRlbnQgZXRjLCBzaG91bGQgYmUgZGVmZXJyZWQgdG8gb25EYXRhU2V0Q2hhbmdlZCgpCisgICAgICAgIC8vIG9yIGdldFZpZXdBdCgpLiBUYWtpbmcgbW9yZSB0aGFuIDIwIHNlY29uZHMgaW4gdGhpcyBjYWxsIHdpbGwgcmVzdWx0IGluIGFuIEFOUi4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVdpZGdldEl0ZW1zLmFkZChuZXcgV2lkZ2V0SXRlbShpICsgIiEiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzbGVlcCBmb3IgMyBzZWNvbmRzIGhlcmUgdG8gc2hvdyBob3cgdGhlIGVtcHR5IHZpZXcgYXBwZWFycyBpbiB0aGUgaW50ZXJpbS4KKyAgICAgICAgLy8gVGhlIGVtcHR5IHZpZXcgaXMgc2V0IGluIHRoZSBTdGFja1dpZGdldFByb3ZpZGVyIGFuZCBzaG91bGQgYmUgYSBzaWJsaW5nIG9mIHRoZQorICAgICAgICAvLyBjb2xsZWN0aW9uIHZpZXcuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIEluIG9uRGVzdHJveSgpIHlvdSBzaG91bGQgdGVhciBkb3duIGFueXRoaW5nIHRoYXQgd2FzIHNldHVwIGZvciB5b3VyIGRhdGEgc291cmNlLAorICAgICAgICAvLyBlZy4gY3Vyc29ycywgY29ubmVjdGlvbnMsIGV0Yy4KKyAgICAgICAgbVdpZGdldEl0ZW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbikgeworICAgICAgICAvLyBwb3NpdGlvbiB3aWxsIGFsd2F5cyByYW5nZSBmcm9tIDAgdG8gZ2V0Q291bnQoKSAtIDEuCisKKyAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgcmVtb3RlIHZpZXdzIGl0ZW0gYmFzZWQgb24gb3VyIHdpZGdldCBpdGVtIHhtbCBmaWxlLCBhbmQgc2V0IHRoZQorICAgICAgICAvLyB0ZXh0IGJhc2VkIG9uIHRoZSBwb3NpdGlvbi4KKyAgICAgICAgUmVtb3RlVmlld3MgcnYgPSBuZXcgUmVtb3RlVmlld3MobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgUi5sYXlvdXQud2lkZ2V0X2l0ZW0pOworICAgICAgICBydi5zZXRUZXh0Vmlld1RleHQoUi5pZC53aWRnZXRfaXRlbSwgbVdpZGdldEl0ZW1zLmdldChwb3NpdGlvbikudGV4dCk7CisKKyAgICAgICAgLy8gTmV4dCwgd2Ugc2V0IGEgZmlsbC1pbnRlbnQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbGwtaW4gdGhlIHBlbmRpbmcgaW50ZW50IHRlbXBsYXRlCisgICAgICAgIC8vIHdoaWNoIGlzIHNldCBvbiB0aGUgY29sbGVjdGlvbiB2aWV3IGluIFN0YWNrV2lkZ2V0UHJvdmlkZXIuCisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGV4dHJhcy5wdXRJbnQoU3RhY2tXaWRnZXRQcm92aWRlci5FWFRSQV9JVEVNLCBwb3NpdGlvbik7CisgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGZpbGxJbkludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKKyAgICAgICAgcnYuc2V0T25DbGlja0ZpbGxJbkludGVudChSLmlkLndpZGdldF9pdGVtLCBmaWxsSW5JbnRlbnQpOworCisgICAgICAgIC8vIFlvdSBjYW4gZG8gaGVhdmluZyBsaWZ0aW5nIGluIGhlcmUsIHN5bmNocm9ub3VzbHkuIEZvciBleGFtcGxlLCBpZiB5b3UgbmVlZCB0bworICAgICAgICAvLyBwcm9jZXNzIGFuIGltYWdlLCBmZXRjaCBzb21ldGhpbmcgZnJvbSB0aGUgbmV0d29yaywgZXRjLiwgaXQgaXMgb2sgdG8gZG8gaXQgaGVyZSwKKyAgICAgICAgLy8gc3luY2hyb25vdXNseS4gQSBsb2FkaW5nIHZpZXcgd2lsbCBzaG93IHVwIGluIGxpZXUgb2YgdGhlIGFjdHVhbCBjb250ZW50cyBpbiB0aGUKKyAgICAgICAgLy8gaW50ZXJpbS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyB2aWV3ICIgKyBwb3NpdGlvbik7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIHZpZXdzIG9iamVjdC4KKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpIHsKKyAgICAgICAgLy8gWW91IGNhbiBjcmVhdGUgYSBjdXN0b20gbG9hZGluZyB2aWV3IChmb3IgaW5zdGFuY2Ugd2hlbiBnZXRWaWV3QXQoKSBpcyBzbG93LikgSWYgeW91CisgICAgICAgIC8vIHJldHVybiBudWxsIGhlcmUsIHlvdSB3aWxsIGdldCB0aGUgZGVmYXVsdCBsb2FkaW5nIHZpZXcuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAvLyBUaGlzIGlzIHRyaWdnZXJlZCB3aGVuIHlvdSBjYWxsIEFwcFdpZGdldE1hbmFnZXIgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkCisgICAgICAgIC8vIG9uIHRoZSBjb2xsZWN0aW9uIHZpZXcgY29ycmVzcG9uZGluZyB0byB0aGlzIGZhY3RvcnkuIFlvdSBjYW4gZG8gaGVhdmluZyBsaWZ0aW5nIGluCisgICAgICAgIC8vIGhlcmUsIHN5bmNocm9ub3VzbHkuIEZvciBleGFtcGxlLCBpZiB5b3UgbmVlZCB0byBwcm9jZXNzIGFuIGltYWdlLCBmZXRjaCBzb21ldGhpbmcKKyAgICAgICAgLy8gZnJvbSB0aGUgbmV0d29yaywgZXRjLiwgaXQgaXMgb2sgdG8gZG8gaXQgaGVyZSwgc3luY2hyb25vdXNseS4gVGhlIHdpZGdldCB3aWxsIHJlbWFpbgorICAgICAgICAvLyBpbiBpdHMgY3VycmVudCBzdGF0ZSB3aGlsZSB3b3JrIGlzIGJlaW5nIGRvbmUgaGVyZSwgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgLy8gbG9ja2luZyB1cCB0aGUgd2lkZ2V0LgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1N0YWNrV2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3N0YWNrd2lkZ2V0L1dpZGdldEl0ZW0uamF2YSBiL3NhbXBsZXMvU3RhY2tXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc3RhY2t3aWRnZXQvV2lkZ2V0SXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODIyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1N0YWNrV2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3N0YWNrd2lkZ2V0L1dpZGdldEl0ZW0uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnN0YWNrd2lkZ2V0OworCitwdWJsaWMgY2xhc3MgV2lkZ2V0SXRlbSB7CisgICAgcHVibGljIFN0cmluZyB0ZXh0OworCisgICAgcHVibGljIFdpZGdldEl0ZW0oU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9BZGJUZXN0L0FuZHJvaWQubWsgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiOWZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL0FkYlRlc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQWRiVGVzdAorCitMT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvQWRiVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9VU0IvQWRiVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTBjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNCBAQAorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5hZGIiPgorCisgICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudXNiLmhvc3QiIC8+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTIiIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkFkYlRlc3RBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iQURCIFRlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisKKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnVzYi5hY3Rpb24uVVNCX0RFVklDRV9BVFRBQ0hFRCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudXNiLmFjdGlvbi5VU0JfREVWSUNFX0FUVEFDSEVEIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvZGV2aWNlX2ZpbHRlciIgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvQWRiVGVzdC9SRUFETUUudHh0IGIvc2FtcGxlcy9VU0IvQWRiVGVzdC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDljYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L1JFQURNRS50eHQKQEAgLTAsMCArMSwxMSBAQAorQWRiVGVzdCBpcyBhIHNhbXBsZSBwcm9ncmFtIHRoYXQgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgYWRiIFVTQiBwcm90b2NvbC4KK0N1cnJlbnRseSBpdCBvbmx5IGltcGxlbWVudHMgdGhlICJhZGIgbG9nY2F0IiBjb21tYW5kIGFuZCBkaXNwbGF5cyB0aGUgbG9nCitvdXRwdXQgaW4gYSB0ZXh0IHZpZXcgYW5kIG9ubHkgYWxsb3dzIGNvbm5lY3RpbmcgdG8gb25lIGRldmljZSBhdCBhIHRpbWUuCitIb3dldmVyIHRoZSBzdXBwb3J0IGNsYXNzZXMgYXJlIHN0cnVjdHVyZWQgaW4gYSB3YXkgdGhhdCB3b3VsZCBhbGxvdworY29ubmVjdGluZyB0byBtdWx0aXBsZSBkZXZpY2VzIGFuZCBydW5uaW5nIG11bHRpcGxlIGFkYiBjb21tYW5kcyBzaW11bHRhbmVvdXNseS4KKworVGhpcyBwcm9ncmFtIHNlcnZlcyBhcyBhbiBleGFtcGxlIG9mIHRoZSBmb2xsb3dpbmcgVVNCIGhvc3QgZmVhdHVyZXM6CisKKy0gTWF0Y2hpbmcgZGV2aWNlcyBiYXNlZCBvbiBpbnRlcmZhY2UgY2xhc3MsIHN1YmNsYXNzIGFuZCBwcm90b2NvbCAoc2VlIGRldmljZV9maWx0ZXIueG1sKQorCistIEFzeW5jaHJvbm91cyBJTyBvbiBidWxrIGVuZHBvaW50cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvVVNCL0FkYlRlc3QvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGVlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L19pbmRleC5odG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxwPkFkYlRlc3QgaXMgYSBzYW1wbGUgcHJvZ3JhbSB0aGF0IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgdGhlIDxjb2RlPmFkYjwvY29kZT4gVVNCIHByb3RvY29sLgorQ3VycmVudGx5IGl0IG9ubHkgaW1wbGVtZW50cyB0aGUgPGNvZGU+YWRiIGxvZ2NhdDwvY29kZT4gY29tbWFuZCBhbmQgZGlzcGxheXMgdGhlIGxvZworb3V0cHV0IGluIGEgdGV4dCB2aWV3IGFuZCBvbmx5IGFsbG93cyBjb25uZWN0aW5nIHRvIG9uZSBkZXZpY2UgYXQgYSB0aW1lLgorSG93ZXZlciwgdGhlIHN1cHBvcnQgY2xhc3NlcyBhcmUgc3RydWN0dXJlZCBpbiBhIHdheSB0aGF0IHdvdWxkIGFsbG93Citjb25uZWN0aW5nIHRvIG11bHRpcGxlIGRldmljZXMgYW5kIHJ1bm5pbmcgbXVsdGlwbGUgPGNvZGU+YWRiPC9jb2RlPiBjb21tYW5kcyBzaW11bHRhbmVvdXNseS48L3A+CisKKzxwPlRoaXMgcHJvZ3JhbSBzZXJ2ZXMgYXMgYW4gZXhhbXBsZSBvZiB0aGUgZm9sbG93aW5nIFVTQiBob3N0IGZlYXR1cmVzOjwvcD4KKworPHVsPiAKKzxsaT5NYXRjaGluZyBkZXZpY2VzIGJhc2VkIG9uIGludGVyZmFjZSBjbGFzcywgc3ViY2xhc3MgYW5kIHByb3RvY29sIChzZWUgPGNvZGU+ZGV2aWNlX2ZpbHRlci54bWw8L2NvZGU+KTwvbGk+CisKKzxsaT5Bc3luY2hyb25vdXMgSU8gb24gYnVsayBlbmRwb2ludHM8L2xpPgorPC91bD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9BZGJUZXN0L2RlZmF1bHQucHJvcGVydGllcyBiL3NhbXBsZXMvVVNCL0FkYlRlc3QvZGVmYXVsdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzI1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L2RlZmF1bHQucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACisjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBBbmRyb2lkIFRvb2xzLgorIyBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSAtLSBZT1VSIENIQU5HRVMgV0lMTCBCRSBFUkFTRUQhCisjCisjIFRoaXMgZmlsZSBtdXN0IGJlIGNoZWNrZWQgaW4gVmVyc2lvbiBDb250cm9sIFN5c3RlbXMuCisjCisjIFRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIEFudCBidWlsZCBzeXN0ZW0gdXNlLAorIyAiYnVpbGQucHJvcGVydGllcyIsIGFuZCBvdmVycmlkZSB2YWx1ZXMgdG8gYWRhcHQgdGhlIHNjcmlwdCB0byB5b3VyCisjIHByb2plY3Qgc3RydWN0dXJlLgorCisjIFByb2plY3QgdGFyZ2V0LgordGFyZ2V0PWFuZHJvaWQtMTIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvVVNCL0FkYlRlc3QvcmVzL2xheW91dC9hZGIueG1sIGIvc2FtcGxlcy9VU0IvQWRiVGVzdC9yZXMvbGF5b3V0L2FkYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5OTRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL0FkYlRlc3QvcmVzL2xheW91dC9hZGIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9nIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyNWRwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI2ZmZmZmZmZmIgorICAgICAgICAvPgorCis8L0xpbmVhckxheW91dD4KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9BZGJUZXN0L3Jlcy94bWwvZGV2aWNlX2ZpbHRlci54bWwgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L3Jlcy94bWwvZGV2aWNlX2ZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL0FkYlRlc3QvcmVzL3htbC9kZXZpY2VfZmlsdGVyLnhtbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8dXNiLWRldmljZSBjbGFzcz0iMjU1IiBzdWJjbGFzcz0iNjYiIHByb3RvY29sPSIxIiAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9BZGJUZXN0L3NyYy9jb20vYW5kcm9pZC9hZGIvQWRiRGV2aWNlLmphdmEgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L3NyYy9jb20vYW5kcm9pZC9hZGIvQWRiRGV2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5M2NlNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL0FkYlRlc3Qvc3JjL2NvbS9hbmRyb2lkL2FkYi9BZGJEZXZpY2UuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYWRiOworCitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiRW5kcG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYlJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFVTQiBkZXZpY2UgdGhhdCBzdXBwb3J0cyB0aGUgYWRiIHByb3RvY29sLiAqLworcHVibGljIGNsYXNzIEFkYkRldmljZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEFkYlRlc3RBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBmaW5hbCBVc2JEZXZpY2VDb25uZWN0aW9uIG1EZXZpY2VDb25uZWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgVXNiRW5kcG9pbnQgbUVuZHBvaW50T3V0OworICAgIHByaXZhdGUgZmluYWwgVXNiRW5kcG9pbnQgbUVuZHBvaW50SW47CisKKyAgICBwcml2YXRlIFN0cmluZyBtU2VyaWFsOworCisgICAgLy8gcG9vbCBvZiByZXF1ZXN0cyBmb3IgdGhlIE9VVCBlbmRwb2ludAorICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxVc2JSZXF1ZXN0PiBtT3V0UmVxdWVzdFBvb2wgPSBuZXcgTGlua2VkTGlzdDxVc2JSZXF1ZXN0PigpOworICAgIC8vIHBvb2wgb2YgcmVxdWVzdHMgZm9yIHRoZSBJTiBlbmRwb2ludAorICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxVc2JSZXF1ZXN0PiBtSW5SZXF1ZXN0UG9vbCA9IG5ldyBMaW5rZWRMaXN0PFVzYlJlcXVlc3Q+KCk7CisgICAgLy8gbGlzdCBvZiBjdXJyZW50bHkgb3BlbmVkIHNvY2tldHMKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PEFkYlNvY2tldD4gbVNvY2tldHMgPSBuZXcgU3BhcnNlQXJyYXk8QWRiU29ja2V0PigpOworICAgIHByaXZhdGUgaW50IG1OZXh0U29ja2V0SWQgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBXYWl0ZXJUaHJlYWQgbVdhaXRlclRocmVhZCA9IG5ldyBXYWl0ZXJUaHJlYWQoKTsKKworICAgIHB1YmxpYyBBZGJEZXZpY2UoQWRiVGVzdEFjdGl2aXR5IGFjdGl2aXR5LCBVc2JEZXZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24sCisgICAgICAgICAgICBVc2JJbnRlcmZhY2UgaW50ZikgeworICAgICAgICBtQWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgbURldmljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICBtU2VyaWFsID0gY29ubmVjdGlvbi5nZXRTZXJpYWwoKTsKKworICAgICAgICBVc2JFbmRwb2ludCBlcE91dCA9IG51bGw7CisgICAgICAgIFVzYkVuZHBvaW50IGVwSW4gPSBudWxsOworICAgICAgICAvLyBsb29rIGZvciBvdXIgYnVsayBlbmRwb2ludHMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRmLmdldEVuZHBvaW50Q291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICBVc2JFbmRwb2ludCBlcCA9IGludGYuZ2V0RW5kcG9pbnQoaSk7CisgICAgICAgICAgICBpZiAoZXAuZ2V0VHlwZSgpID09IFVzYkNvbnN0YW50cy5VU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisgICAgICAgICAgICAgICAgaWYgKGVwLmdldERpcmVjdGlvbigpID09IFVzYkNvbnN0YW50cy5VU0JfRElSX09VVCkgeworICAgICAgICAgICAgICAgICAgICBlcE91dCA9IGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVwSW4gPSBlcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVwT3V0ID09IG51bGwgfHwgZXBJbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub3QgYWxsIGVuZHBvaW50cyBmb3VuZCIpOworICAgICAgICB9CisgICAgICAgIG1FbmRwb2ludE91dCA9IGVwT3V0OworICAgICAgICBtRW5kcG9pbnRJbiA9IGVwSW47CisgICAgfQorCisgICAgLy8gcmV0dXJuIGRldmljZSBzZXJpYWwgbnVtYmVyCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJpYWwoKSB7CisgICAgICAgIHJldHVybiBtU2VyaWFsOworICAgIH0KKworICAgIC8vIGdldCBhbiBPVVQgcmVxdWVzdCBmcm9tIG91ciBwb29sCisgICAgcHVibGljIFVzYlJlcXVlc3QgZ2V0T3V0UmVxdWVzdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1PdXRSZXF1ZXN0UG9vbCkgeworICAgICAgICAgICAgaWYgKG1PdXRSZXF1ZXN0UG9vbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBVc2JSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgVXNiUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuaW5pdGlhbGl6ZShtRGV2aWNlQ29ubmVjdGlvbiwgbUVuZHBvaW50T3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRSZXF1ZXN0UG9vbC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmV0dXJuIGFuIE9VVCByZXF1ZXN0IHRvIHRoZSBwb29sCisgICAgcHVibGljIHZvaWQgcmVsZWFzZU91dFJlcXVlc3QoVXNiUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobU91dFJlcXVlc3RQb29sKSB7CisgICAgICAgICAgICBtT3V0UmVxdWVzdFBvb2wuYWRkKHJlcXVlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IGFuIElOIHJlcXVlc3QgZnJvbSB0aGUgcG9vbAorICAgIHB1YmxpYyBVc2JSZXF1ZXN0IGdldEluUmVxdWVzdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1JblJlcXVlc3RQb29sKSB7CisgICAgICAgICAgICBpZiAobUluUmVxdWVzdFBvb2wuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgVXNiUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFVzYlJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmluaXRpYWxpemUobURldmljZUNvbm5lY3Rpb24sIG1FbmRwb2ludEluKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JblJlcXVlc3RQb29sLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbVdhaXRlclRocmVhZC5zdGFydCgpOworICAgICAgICBjb25uZWN0KCk7CisgICAgfQorCisgICAgcHVibGljIEFkYlNvY2tldCBvcGVuU29ja2V0KFN0cmluZyBkZXN0aW5hdGlvbikgeworICAgICAgICBBZGJTb2NrZXQgc29ja2V0OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Tb2NrZXRzKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBtTmV4dFNvY2tldElkKys7CisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgQWRiU29ja2V0KHRoaXMsIGlkKTsKKyAgICAgICAgICAgIG1Tb2NrZXRzLnB1dChpZCwgc29ja2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29ja2V0Lm9wZW4oZGVzdGluYXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gc29ja2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFkYlNvY2tldCBnZXRTb2NrZXQoaW50IGlkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVNvY2tldHMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU29ja2V0cy5nZXQoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc29ja2V0Q2xvc2VkKEFkYlNvY2tldCBzb2NrZXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU29ja2V0cykgeworICAgICAgICAgICAgbVNvY2tldHMucmVtb3ZlKHNvY2tldC5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNlbmQgYSBjb25uZWN0IGNvbW1hbmQKKyAgICBwcml2YXRlIHZvaWQgY29ubmVjdCgpIHsKKyAgICAgICAgQWRiTWVzc2FnZSBtZXNzYWdlID0gbmV3IEFkYk1lc3NhZ2UoKTsKKyAgICAgICAgbWVzc2FnZS5zZXQoQWRiTWVzc2FnZS5BX0NOWE4sIEFkYk1lc3NhZ2UuQV9WRVJTSU9OLCBBZGJNZXNzYWdlLk1BWF9QQVlMT0FELCAiaG9zdDo6XDAiKTsKKyAgICAgICAgbWVzc2FnZS53cml0ZSh0aGlzKTsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgY29ubmVjdCByZXNwb25zZQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb25uZWN0KEFkYk1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBpZiAobWVzc2FnZS5nZXREYXRhU3RyaW5nKCkuc3RhcnRzV2l0aCgiZGV2aWNlOiIpKSB7CisgICAgICAgICAgICBsb2coImNvbm5lY3RlZCIpOworICAgICAgICAgICAgbUFjdGl2aXR5LmRldmljZU9ubGluZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRlclRocmVhZCkgeworICAgICAgICAgICAgbVdhaXRlclRocmVhZC5tU3RvcCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkaXNwYXRjaCBhIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlCisgICAgdm9pZCBkaXNwYXRjaE1lc3NhZ2UoQWRiTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIGludCBjb21tYW5kID0gbWVzc2FnZS5nZXRDb21tYW5kKCk7CisgICAgICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgICAgICAgY2FzZSBBZGJNZXNzYWdlLkFfU1lOQzoKKyAgICAgICAgICAgICAgICBsb2coImdvdCBBX1NZTkMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWRiTWVzc2FnZS5BX0NOWE46CisgICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWRiTWVzc2FnZS5BX09QRU46CisgICAgICAgICAgICBjYXNlIEFkYk1lc3NhZ2UuQV9PS0FZOgorICAgICAgICAgICAgY2FzZSBBZGJNZXNzYWdlLkFfQ0xTRToKKyAgICAgICAgICAgIGNhc2UgQWRiTWVzc2FnZS5BX1dSVEU6CisgICAgICAgICAgICAgICAgQWRiU29ja2V0IHNvY2tldCA9IGdldFNvY2tldChtZXNzYWdlLmdldEFyZzEoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRVJST1Igc29ja2V0IG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIG1BY3Rpdml0eS5sb2cocyk7CisgICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFdhaXRlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1TdG9wOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0IG91dCB3aXRoIGEgY29tbWFuZCByZWFkCisgICAgICAgICAgICBBZGJNZXNzYWdlIGN1cnJlbnRDb21tYW5kID0gbmV3IEFkYk1lc3NhZ2UoKTsKKyAgICAgICAgICAgIEFkYk1lc3NhZ2UgY3VycmVudERhdGEgPSBudWxsOworICAgICAgICAgICAgLy8gRklYTUUgZXJyb3IgY2hlY2tpbmcKKyAgICAgICAgICAgIGN1cnJlbnRDb21tYW5kLnJlYWRDb21tYW5kKGdldEluUmVxdWVzdCgpKTsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVXNiUmVxdWVzdCByZXF1ZXN0ID0gbURldmljZUNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFkYk1lc3NhZ2UgbWVzc2FnZSA9IChBZGJNZXNzYWdlKXJlcXVlc3QuZ2V0Q2xpZW50RGF0YSgpOworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q2xpZW50RGF0YShudWxsKTsKKyAgICAgICAgICAgICAgICBBZGJNZXNzYWdlIG1lc3NhZ2VUb0Rpc3BhdGNoID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IGN1cnJlbnRDb21tYW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkYXRhTGVuZ3RoID0gbWVzc2FnZS5nZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZGF0YSBpZiBsZW5ndGggPiAwCisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZWFkRGF0YShnZXRJblJlcXVlc3QoKSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGF0YSA9IG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVG9EaXNwYXRjaCA9IG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbW1hbmQgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZSA9PSBjdXJyZW50RGF0YSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVG9EaXNwYXRjaCA9IG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVRvRGlzcGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBhbm90aGVyIHJlYWQgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbW1hbmQgPSBuZXcgQWRiTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29tbWFuZC5yZWFkQ29tbWFuZChnZXRJblJlcXVlc3QoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBkaXNwYXRjaCB0aGUgY3VycmVudCBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoTWVzc2FnZShtZXNzYWdlVG9EaXNwYXRjaCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcHV0IHJlcXVlc3QgYmFjayBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwb29sCisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0RW5kcG9pbnQoKSA9PSBtRW5kcG9pbnRPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU91dFJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtSW5SZXF1ZXN0UG9vbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUluUmVxdWVzdFBvb2wuYWRkKHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvQWRiVGVzdC9zcmMvY29tL2FuZHJvaWQvYWRiL0FkYk1lc3NhZ2UuamF2YSBiL3NhbXBsZXMvVVNCL0FkYlRlc3Qvc3JjL2NvbS9hbmRyb2lkL2FkYi9BZGJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiYjEzNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL0FkYlRlc3Qvc3JjL2NvbS9hbmRyb2lkL2FkYi9BZGJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmFkYjsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYlJlcXVlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKKworLyogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYW5kIGFkYiBjb21tYW5kIHBhY2tldCAqLworcHVibGljIGNsYXNzIEFkYk1lc3NhZ2UgeworCisgICAgLy8gY29tbWFuZCBuYW1lcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfU1lOQyA9IDB4NDM0ZTU5NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQV9DTlhOID0gMHg0ZTU4NGU0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBX09QRU4gPSAweDRlNDU1MDRmOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfT0tBWSA9IDB4NTk0MTRiNGY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQV9DTFNFID0gMHg0NTUzNGM0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBX1dSVEUgPSAweDQ1NTQ1MjU3OworCisgICAgLy8gQURCIHByb3RvY29sIHZlcnNpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBX1ZFUlNJT04gPSAweDAxMDAwMDAwOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BBWUxPQUQgPSA0MDk2OworCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIG1NZXNzYWdlQnVmZmVyOworICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBtRGF0YUJ1ZmZlcjsKKworICAgIHB1YmxpYyBBZGJNZXNzYWdlKCkgeworICAgICAgICBtTWVzc2FnZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMjQpOworICAgICAgICBtRGF0YUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoTUFYX1BBWUxPQUQpOworICAgICAgICBtTWVzc2FnZUJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgICAgIG1EYXRhQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICB9CisKKyAgICAvLyBzZXRzIHRoZSBmaWVsZHMgaW4gdGhlIGNvbW1hbmQgaGVhZGVyCisgICAgcHVibGljIHZvaWQgc2V0KGludCBjb21tYW5kLCBpbnQgYXJnMCwgaW50IGFyZzEsIGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIG1NZXNzYWdlQnVmZmVyLnB1dEludCgwLCBjb21tYW5kKTsKKyAgICAgICAgbU1lc3NhZ2VCdWZmZXIucHV0SW50KDQsIGFyZzApOworICAgICAgICBtTWVzc2FnZUJ1ZmZlci5wdXRJbnQoOCwgYXJnMSk7CisgICAgICAgIG1NZXNzYWdlQnVmZmVyLnB1dEludCgxMiwgKGRhdGEgPT0gbnVsbCA/IDAgOiBkYXRhLmxlbmd0aCkpOworICAgICAgICBtTWVzc2FnZUJ1ZmZlci5wdXRJbnQoMTYsIChkYXRhID09IG51bGwgPyAwIDogY2hlY2tzdW0oZGF0YSkpKTsKKyAgICAgICAgbU1lc3NhZ2VCdWZmZXIucHV0SW50KDIwLCBjb21tYW5kIF4gMHhGRkZGRkZGRik7CisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhQnVmZmVyLnB1dChkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGNvbW1hbmQsIGludCBhcmcwLCBpbnQgYXJnMSkgeworICAgICAgICBzZXQoY29tbWFuZCwgYXJnMCwgYXJnMSwgKGJ5dGVbXSludWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0KGludCBjb21tYW5kLCBpbnQgYXJnMCwgaW50IGFyZzEsIFN0cmluZyBkYXRhKSB7CisgICAgICAgIC8vIGFkZCB0cmFpbGluZyB6ZXJvCisgICAgICAgIGRhdGEgKz0gIlwwIjsKKyAgICAgICAgc2V0KGNvbW1hbmQsIGFyZzAsIGFyZzEsIGRhdGEuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0aGUgY29tbWFuZCdzIG1lc3NhZ2UgSUQKKyAgICBwdWJsaWMgaW50IGdldENvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiBtTWVzc2FnZUJ1ZmZlci5nZXRJbnQoMCk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBjb21tYW5kJ3MgZmlyc3QgYXJndW1lbnQKKyAgICBwdWJsaWMgaW50IGdldEFyZzAoKSB7CisgICAgICAgIHJldHVybiBtTWVzc2FnZUJ1ZmZlci5nZXRJbnQoNCk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBjb21tYW5kJ3Mgc2Vjb25kIGFyZ3VtZW50CisgICAgcHVibGljIGludCBnZXRBcmcxKCkgeworICAgICAgICByZXR1cm4gbU1lc3NhZ2VCdWZmZXIuZ2V0SW50KDgpOworICAgIH0KKworICAgIC8vIHJldHVybnMgY29tbWFuZCdzIGRhdGEgYnVmZmVyCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhQnVmZmVyOworICAgIH0KKworICAgIC8vIHJldHVybnMgY29tbWFuZCdzIGRhdGEgbGVuZ3RoCisgICAgcHVibGljIGludCBnZXREYXRhTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gbU1lc3NhZ2VCdWZmZXIuZ2V0SW50KDEyKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIGNvbW1hbmQncyBkYXRhIGFzIGEgc3RyaW5nCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhU3RyaW5nKCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gZ2V0RGF0YUxlbmd0aCgpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBudWxsOworICAgICAgICAvLyB0cmltIHRyYWlsaW5nIHplcm8KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobURhdGFCdWZmZXIuYXJyYXkoKSwgMCwgbGVuZ3RoIC0gMSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShBZGJEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoZGV2aWNlKSB7CisgICAgICAgICAgICBVc2JSZXF1ZXN0IHJlcXVlc3QgPSBkZXZpY2UuZ2V0T3V0UmVxdWVzdCgpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRDbGllbnREYXRhKHRoaXMpOworICAgICAgICAgICAgaWYgKHJlcXVlc3QucXVldWUobU1lc3NhZ2VCdWZmZXIsIDI0KSkgeworICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBnZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IGRldmljZS5nZXRPdXRSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q2xpZW50RGF0YSh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucXVldWUobURhdGFCdWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnJlbGVhc2VPdXRSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UucmVsZWFzZU91dFJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVhZENvbW1hbmQoVXNiUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJlcXVlc3Quc2V0Q2xpZW50RGF0YSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QucXVldWUobU1lc3NhZ2VCdWZmZXIsIDI0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkRGF0YShVc2JSZXF1ZXN0IHJlcXVlc3QsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcmVxdWVzdC5zZXRDbGllbnREYXRhKHRoaXMpOworICAgICAgICByZXR1cm4gcmVxdWVzdC5xdWV1ZShtRGF0YUJ1ZmZlciwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFN0cmluZyhCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBieXRlc1tpXSA9IGJ1ZmZlci5nZXQob2Zmc2V0KyspOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgY29tbWFuZE5hbWUgPSBleHRyYWN0U3RyaW5nKG1NZXNzYWdlQnVmZmVyLCAwLCA0KTsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSBnZXREYXRhTGVuZ3RoKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAiQWRiIE1lc3NhZ2U6ICIgKyBjb21tYW5kTmFtZSArICIgYXJnMDogIiArIGdldEFyZzAoKSArCisgICAgICAgICAgICAgIiBhcmcxOiAiICsgZ2V0QXJnMSgpICsgIiBkYXRhTGVuZ3RoOiAiICsgZGF0YUxlbmd0aDsKKyAgICAgICAgaWYgKGRhdGFMZW5ndGggPiAwKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gKCIgZGF0YTogXCIiICsgZ2V0RGF0YVN0cmluZygpICsgIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tzdW0oYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHggPSBkYXRhW2ldOworICAgICAgICAgICAgLy8gZGFuZywgbm8gdW5zaWduZWQgaW50cyBpbiBqYXZhCisgICAgICAgICAgICBpZiAoeCA8IDApIHggKz0gMjU2OworICAgICAgICAgICAgcmVzdWx0ICs9IHg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvQWRiVGVzdC9zcmMvY29tL2FuZHJvaWQvYWRiL0FkYlNvY2tldC5qYXZhIGIvc2FtcGxlcy9VU0IvQWRiVGVzdC9zcmMvY29tL2FuZHJvaWQvYWRiL0FkYlNvY2tldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjU5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L3NyYy9jb20vYW5kcm9pZC9hZGIvQWRiU29ja2V0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYWRiOworCisvKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWRiIHNvY2tldC4gIGFkYiBzdXBwb3J0cyBtdWx0aXBsZSBpbmRlcGVuZGVudAorICogc29ja2V0IGNvbm5lY3Rpb25zIHRvIGEgc2luZ2xlIGRldmljZS4gIFR5cGljYWxseSBhIHNvY2tldCBpcyBjcmVhdGVkCisgKiBmb3IgZWFjaCBhZGIgY29tbWFuZCB0aGF0IGlzIGV4ZWN1dGVkLgorICovCitwdWJsaWMgY2xhc3MgQWRiU29ja2V0IHsKKworICAgIHByaXZhdGUgZmluYWwgQWRiRGV2aWNlIG1EZXZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUlkOworICAgIHByaXZhdGUgaW50IG1QZWVySWQ7CisKKyAgICBwdWJsaWMgQWRiU29ja2V0KEFkYkRldmljZSBkZXZpY2UsIGludCBpZCkgeworICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9wZW4oU3RyaW5nIGRlc3RpbmF0aW9uKSB7CisgICAgICAgIEFkYk1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBBZGJNZXNzYWdlKCk7CisgICAgICAgIG1lc3NhZ2Uuc2V0KEFkYk1lc3NhZ2UuQV9PUEVOLCBtSWQsIDAsIGRlc3RpbmF0aW9uKTsKKyAgICAgICAgaWYgKCEgbWVzc2FnZS53cml0ZShtRGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShBZGJNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLmdldENvbW1hbmQoKSkgeworICAgICAgICAgICAgY2FzZSBBZGJNZXNzYWdlLkFfT0tBWToKKyAgICAgICAgICAgICAgICBtUGVlcklkID0gbWVzc2FnZS5nZXRBcmcwKCk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWRiTWVzc2FnZS5BX1dSVEU6CisgICAgICAgICAgICAgICAgbURldmljZS5sb2cobWVzc2FnZS5nZXREYXRhU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNlbmRSZWFkeSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRSZWFkeSgpIHsKKyAgICAgICAgQWRiTWVzc2FnZSBtZXNzYWdlID0gbmV3IEFkYk1lc3NhZ2UoKTsKKyAgICAgICAgbWVzc2FnZS5zZXQoQWRiTWVzc2FnZS5BX09LQVksIG1JZCwgbVBlZXJJZCk7CisgICAgICAgIG1lc3NhZ2Uud3JpdGUobURldmljZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvQWRiVGVzdC9zcmMvY29tL2FuZHJvaWQvYWRiL0FkYlRlc3RBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9VU0IvQWRiVGVzdC9zcmMvY29tL2FuZHJvaWQvYWRiL0FkYlRlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTE5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9BZGJUZXN0L3NyYy9jb20vYW5kcm9pZC9hZGIvQWRiVGVzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmFkYjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyogTWFpbiBhY3Rpdml0eSBmb3IgdGhlIGFkYiB0ZXN0IHByb2dyYW0gKi8KK3B1YmxpYyBjbGFzcyBBZGJUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFkYlRlc3RBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1Mb2c7CisgICAgcHJpdmF0ZSBVc2JNYW5hZ2VyIG1NYW5hZ2VyOworICAgIHByaXZhdGUgVXNiRGV2aWNlIG1EZXZpY2U7CisgICAgcHJpdmF0ZSBVc2JEZXZpY2VDb25uZWN0aW9uIG1EZXZpY2VDb25uZWN0aW9uOworICAgIHByaXZhdGUgVXNiSW50ZXJmYWNlIG1JbnRlcmZhY2U7CisgICAgcHJpdmF0ZSBBZGJEZXZpY2UgbUFkYkRldmljZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0xPRyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfREVWSUNFX09OTElORSA9IDI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuYWRiKTsKKyAgICAgICAgbUxvZyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5sb2cpOworCisgICAgICAgIG1NYW5hZ2VyID0gKFVzYk1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlVTQl9TRVJWSUNFKTsKKworICAgICAgICAvLyBjaGVjayBmb3IgZXhpc3RpbmcgZGV2aWNlcworICAgICAgICBmb3IgKFVzYkRldmljZSBkZXZpY2UgOiAgbU1hbmFnZXIuZ2V0RGV2aWNlTGlzdCgpLnZhbHVlcygpKSB7CisgICAgICAgICAgICBVc2JJbnRlcmZhY2UgaW50ZiA9IGZpbmRBZGJJbnRlcmZhY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzZXRBZGJJbnRlcmZhY2UoZGV2aWNlLCBpbnRmKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbGlzdGVuIGZvciBuZXcgZGV2aWNlcworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfQVRUQUNIRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfREVUQUNIRUQpOworICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1Vc2JSZWNlaXZlciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHVucmVnaXN0ZXJSZWNlaXZlcihtVXNiUmVjZWl2ZXIpOworICAgICAgICBzZXRBZGJJbnRlcmZhY2UobnVsbCwgbnVsbCk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBNZXNzYWdlIG0gPSBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTUVTU0FHRV9MT0cpOworICAgICAgICBtLm9iaiA9IHM7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRMb2coU3RyaW5nIHRleHQpIHsKKyAgICAgICAgUmVjdCByID0gbmV3IFJlY3QoKTsKKyAgICAgICAgbUxvZy5nZXREcmF3aW5nUmVjdChyKTsKKyAgICAgICAgaW50IG1heExpbmVzID0gci5oZWlnaHQoKSAvIG1Mb2cuZ2V0TGluZUhlaWdodCgpIC0gMTsKKyAgICAgICAgdGV4dCA9IG1Mb2cuZ2V0VGV4dCgpICsgIlxuIiArIHRleHQ7CisKKyAgICAgICAgLy8gc2VlIGhvdyBtYW55IGxpbmVzIHdlIGhhdmUKKyAgICAgICAgaW50IGluZGV4ID0gdGV4dC5sYXN0SW5kZXhPZignXG4nKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiBjb3VudCA8PSBtYXhMaW5lcykgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGluZGV4ID0gdGV4dC5sYXN0SW5kZXhPZignXG4nLCBpbmRleCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJ1bmNhdGUgdG8gbWF4TGluZXMKKyAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgbUxvZy5zZXRUZXh0KHRleHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRldmljZU9ubGluZShBZGJEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIE1lc3NhZ2UgbSA9IE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBNRVNTQUdFX0RFVklDRV9PTkxJTkUpOworICAgICAgICBtLm9iaiA9IGRldmljZTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURldmljZU9ubGluZShBZGJEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGxvZygiZGV2aWNlIG9ubGluZTogIiArIGRldmljZS5nZXRTZXJpYWwoKSk7CisgICAgICAgIGRldmljZS5vcGVuU29ja2V0KCJzaGVsbDpleGVjIGxvZ2NhdCIpOworICAgIH0KKworICAgIC8vIFNldHMgdGhlIGN1cnJlbnQgVVNCIGRldmljZSBhbmQgaW50ZXJmYWNlCisgICAgcHJpdmF0ZSBib29sZWFuIHNldEFkYkludGVyZmFjZShVc2JEZXZpY2UgZGV2aWNlLCBVc2JJbnRlcmZhY2UgaW50ZikgeworICAgICAgICBpZiAobURldmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EZXZpY2VDb25uZWN0aW9uLnJlbGVhc2VJbnRlcmZhY2UobUludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgbUludGVyZmFjZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGV2aWNlQ29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgICAgICAgbURldmljZSA9IG51bGw7CisgICAgICAgICAgICBtRGV2aWNlQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgaW50ZiAhPSBudWxsKSB7CisgICAgICAgICAgICBVc2JEZXZpY2VDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBtTWFuYWdlci5vcGVuRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJvcGVuIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNsYWltSW50ZXJmYWNlKGludGYsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coImNsYWltIGludGVyZmFjZSBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlID0gaW50ZjsKKyAgICAgICAgICAgICAgICAgICAgbUFkYkRldmljZSA9IG5ldyBBZGJEZXZpY2UodGhpcywgbURldmljZUNvbm5lY3Rpb24sIGludGYpOworICAgICAgICAgICAgICAgICAgICBsb2coImNhbGwgc3RhcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYkRldmljZS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coImNsYWltIGludGVyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EZXZpY2VDb25uZWN0aW9uID09IG51bGwgJiYgbUFkYkRldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRiRGV2aWNlLnN0b3AoKTsKKyAgICAgICAgICAgIG1BZGJEZXZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZWFyY2hlcyBmb3IgYW4gYWRiIGludGVyZmFjZSBvbiB0aGUgZ2l2ZW4gVVNCIGRldmljZQorICAgIHN0YXRpYyBwcml2YXRlIFVzYkludGVyZmFjZSBmaW5kQWRiSW50ZXJmYWNlKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZmluZEFkYkludGVyZmFjZSAiICsgZGV2aWNlKTsKKyAgICAgICAgaW50IGNvdW50ID0gZGV2aWNlLmdldEludGVyZmFjZUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgVXNiSW50ZXJmYWNlIGludGYgPSBkZXZpY2UuZ2V0SW50ZXJmYWNlKGkpOworICAgICAgICAgICAgaWYgKGludGYuZ2V0SW50ZXJmYWNlQ2xhc3MoKSA9PSAyNTUgJiYgaW50Zi5nZXRJbnRlcmZhY2VTdWJjbGFzcygpID09IDY2ICYmCisgICAgICAgICAgICAgICAgICAgIGludGYuZ2V0SW50ZXJmYWNlUHJvdG9jb2woKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQnJvYWRjYXN0UmVjZWl2ZXIgbVVzYlJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworCisgICAgICAgICAgICBpZiAoVXNiTWFuYWdlci5BQ1RJT05fVVNCX0RFVklDRV9BVFRBQ0hFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIFVzYkRldmljZSBkZXZpY2UgPSAoVXNiRGV2aWNlKWludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgIFVzYkludGVyZmFjZSBpbnRmID0gZmluZEFkYkludGVyZmFjZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChpbnRmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBhZGIgaW50ZXJmYWNlICIgKyBpbnRmKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRiSW50ZXJmYWNlKGRldmljZSwgaW50Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0RFVEFDSEVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gZGV2aWNlLmdldERldmljZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobURldmljZSAhPSBudWxsICYmIG1EZXZpY2UuZXF1YWxzKGRldmljZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiYWRiIGludGVyZmFjZSByZW1vdmVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldEFkYkludGVyZmFjZShudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9MT0c6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZExvZygoU3RyaW5nKW1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfREVWSUNFX09OTElORToKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGV2aWNlT25saW5lKChBZGJEZXZpY2UpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KKworCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9BbmRyb2lkLm1rIGIvc2FtcGxlcy9VU0IvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUzZTdkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9VU0IvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9BbmRyb2lkLm1rIGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhYmIwYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNaXNzaWxlTGF1bmNoZXIKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI1IEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1pc3NpbGVsYXVuY2hlciI+CisKKyAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS51c2IuaG9zdCIgLz4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIxMiIgLz4KKworICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWlzc2lsZUxhdW5jaGVyQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJNaXNzaWxlIExhdW5jaGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibm9zZW5zb3IiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisKKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnVzYi5hY3Rpb24uVVNCX0RFVklDRV9BVFRBQ0hFRCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKworICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudXNiLmFjdGlvbi5VU0JfREVWSUNFX0FUVEFDSEVEIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cmVzb3VyY2U9IkB4bWwvZGV2aWNlX2ZpbHRlciIgLz4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9SRUFETUUudHh0IGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYmFhZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTMgQEAKK01pc3NpbGVMYXVuY2hlciBpcyBhIHNpbXBsZSBwcm9ncmFtIHRoYXQgY29udHJvbHMgRHJlYW0gQ2hlZWt5IFVTQiBtaXNzaWxlIGxhdW5jaGVycy4KK1lvdSBjb250cm9sIHRoZSBsZWZ0L3JpZ2h0L3VwL2Rvd24gb3JpZW50YXRpb24gb2YgdGhlIGxhdW5jaGVyIHVzaW5nIHRoZSBhY2NlbGVyb21ldGVyLgorVGlsdCB0aGUgdGFibGV0IHRvIGNoYW5nZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBsYXVuY2hlci4KK1ByZXNzaW5nIHRoZSAiRmlyZSIgYnV0dG9uIHdpbGwgZmlyZSBvbmUgbWlzc2lsZS4KKworVGhpcyBwcm9ncmFtIHNlcnZlcyBhcyBhbiBleGFtcGxlIG9mIHRoZSBmb2xsb3dpbmcgVVNCIGhvc3QgZmVhdHVyZXM6CisKKy0gZmlsdGVyaW5nIGZvciBtdWx0aXBsZSBkZXZpY2VzIGJhc2VkIG9uIHZlbmRvciBhbmQgcHJvZHVjdCBJRHMgKHNlZSBkZXZpY2VfZmlsdGVyLnhtbCkKKworLSBTZW5kaW5nIGNvbnRyb2wgcmVxdWVzdHMgb24gZW5kcG9pbnQgemVybyB0aGF0IGNvbnRhaW4gZGF0YQorCistIFJlY2VpdmluZyBwYWNrZXRzIG9uIGFuIGludGVycnVwdCBlbmRwb2ludCB1c2luZyBhIHRocmVhZCB0aGF0IGNhbGxzCisgIFVzYlJlcXVlc3QucXVldWUgYW5kIFVzYkRldmljZUNvbm5lY3Rpb24ucmVxdWVzdFdhaXQoKQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL19pbmRleC5odG1sIGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTVjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvX2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPHA+TWlzc2lsZUxhdW5jaGVyIGlzIGEgc2ltcGxlIHByb2dyYW0gdGhhdCBjb250cm9scyBEcmVhbSBDaGVla3kgVVNCIG1pc3NpbGUgbGF1bmNoZXJzLgorWW91IGNvbnRyb2wgdGhlIGxlZnQvcmlnaHQvdXAvZG93biBvcmllbnRhdGlvbiBvZiB0aGUgbGF1bmNoZXIgdXNpbmcgdGhlIGFjY2VsZXJvbWV0ZXIuCitUaWx0IHRoZSB0YWJsZXQgdG8gY2hhbmdlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGxhdW5jaGVyLiBQcmVzc2luZyB0aGUgPHN0cm9uZz5GaXJlPC9zdHJvbmc+IGJ1dHRvbiB3aWxsIGZpcmUgb25lIG1pc3NpbGUuPC9wPgorCis8cD5UaGlzIHByb2dyYW0gc2VydmVzIGFzIGFuIGV4YW1wbGUgb2YgdGhlIGZvbGxvd2luZyBVU0IgaG9zdCBmZWF0dXJlczo8L3A+Cis8dWw+Cis8bGk+ZmlsdGVyaW5nIGZvciBtdWx0aXBsZSBkZXZpY2VzIGJhc2VkIG9uIHZlbmRvciBhbmQgcHJvZHVjdCBJRHMgKHNlZSA8Y29kZT5kZXZpY2VfZmlsdGVyLnhtbDwvY29kZT4pPC9saT4KKzxsaT5TZW5kaW5nIGNvbnRyb2wgcmVxdWVzdHMgb24gZW5kcG9pbnQgemVybyB0aGF0IGNvbnRhaW4gZGF0YTwvbGk+Cis8bGk+UmVjZWl2aW5nIHBhY2tldHMgb24gYW4gaW50ZXJydXB0IGVuZHBvaW50IHVzaW5nIGEgdGhyZWFkIHRoYXQgY2FsbHMKKyAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYlJlcXVlc3QjcXVldWUgcXVldWUoKX0gYW5kIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2VDb25uZWN0aW9uI3JlcXVlc3RXYWl0IHJlcXVlc3RXYWl0KCl9LjwvbGk+Cis8L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL2RlZmF1bHQucHJvcGVydGllcyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9kZWZhdWx0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMjUyMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9kZWZhdWx0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgQW5kcm9pZCBUb29scy4KKyMgRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUgLS0gWU9VUiBDSEFOR0VTIFdJTEwgQkUgRVJBU0VEIQorIworIyBUaGlzIGZpbGUgbXVzdCBiZSBjaGVja2VkIGluIFZlcnNpb24gQ29udHJvbCBTeXN0ZW1zLgorIworIyBUbyBjdXN0b21pemUgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBBbnQgYnVpbGQgc3lzdGVtIHVzZSwKKyMgImJ1aWxkLnByb3BlcnRpZXMiLCBhbmQgb3ZlcnJpZGUgdmFsdWVzIHRvIGFkYXB0IHRoZSBzY3JpcHQgdG8geW91cgorIyBwcm9qZWN0IHN0cnVjdHVyZS4KKworIyBQcm9qZWN0IHRhcmdldC4KK3RhcmdldD1hbmRyb2lkLTEyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvcmVzL2xheW91dC9sYXVuY2hlci54bWwgYi9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvcmVzL2xheW91dC9sYXVuY2hlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0ODhmNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9yZXMvbGF5b3V0L2xhdW5jaGVyLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgID4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmlyZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMjVkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjM2c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZmlyZSI+CisgICAgICAgIDwvQnV0dG9uPgorCisKKzwvTGluZWFyTGF5b3V0PgorCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3Zjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZpcmUiPkZpcmUhPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvcmVzL3htbC9kZXZpY2VfZmlsdGVyLnhtbCBiL3NhbXBsZXMvVVNCL01pc3NpbGVMYXVuY2hlci9yZXMveG1sL2RldmljZV9maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWE3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvcmVzL3htbC9kZXZpY2VfZmlsdGVyLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8IS0tIHZlbmRvciBhbmQgcHJvZHVjdCBJRCBmb3IgRHJlYW0gQ2hlZWt5IFVTQiBNaXNzbGUgTGF1bmNoZXIgLS0+CisgICAgPHVzYi1kZXZpY2UgdmVuZG9yLWlkPSIyNjg5IiBwcm9kdWN0LWlkPSIxNzkzIiAvPgorICAgIDwhLS0gdmVuZG9yIGFuZCBwcm9kdWN0IElEIGZvciBEcmVhbSBDaGVla3kgV2lyZWxlc3MgVVNCIE1pc3NsZSBMYXVuY2hlciAtLT4KKyAgICA8dXNiLWRldmljZSB2ZW5kb3ItaWQ9IjI2ODkiIHByb2R1Y3QtaWQ9IjY1MjgxIiAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1VTQi9NaXNzaWxlTGF1bmNoZXIvc3JjL2NvbS9hbmRyb2lkL21pc3NpbGVsYXVuY2hlci9NaXNzaWxlTGF1bmNoZXJBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL3NyYy9jb20vYW5kcm9pZC9taXNzaWxlbGF1bmNoZXIvTWlzc2lsZUxhdW5jaGVyQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWUxOTFjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9VU0IvTWlzc2lsZUxhdW5jaGVyL3NyYy9jb20vYW5kcm9pZC9taXNzaWxlbGF1bmNoZXIvTWlzc2lsZUxhdW5jaGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWlzc2lsZWxhdW5jaGVyOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkNvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiRGV2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JFbmRwb2ludDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworCitwdWJsaWMgY2xhc3MgTWlzc2lsZUxhdW5jaGVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQorICAgICAgICBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyLCBSdW5uYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1pc3NpbGVMYXVuY2hlckFjdGl2aXR5IjsKKworICAgIHByaXZhdGUgQnV0dG9uIG1GaXJlOworICAgIHByaXZhdGUgVXNiTWFuYWdlciBtVXNiTWFuYWdlcjsKKyAgICBwcml2YXRlIFVzYkRldmljZSBtRGV2aWNlOworICAgIHByaXZhdGUgVXNiRGV2aWNlQ29ubmVjdGlvbiBtQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIFVzYkVuZHBvaW50IG1FbmRwb2ludEludHI7CisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIG1TZW5zb3JNYW5hZ2VyOworICAgIHByaXZhdGUgU2Vuc29yIG1HcmF2aXR5U2Vuc29yOworCisgICAgLy8gVVNCIGNvbnRyb2wgY29tbWFuZHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9VUCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfRE9XTiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfUklHSFQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0xFRlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0ZJUkUgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9TVE9QID0gMzI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfU1RBVFVTID0gNjQ7CisKKyAgICAvLyBjb25zdGFudHMgZm9yIGFjY2VsZXJvbWV0ZXIgb3JpZW50YXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElMVF9MRUZUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElMVF9SSUdIVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTFRfVVAgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSUxUX0RPV04gPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBUSFJFU0hPTEQgPSA1LjA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGF1bmNoZXIpOworICAgICAgICBtRmlyZSA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuZmlyZSk7CisgICAgICAgIG1GaXJlLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBtVXNiTWFuYWdlciA9IChVc2JNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5VU0JfU0VSVklDRSk7CisKKyAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VOU09SX1NFUlZJQ0UpOworICAgICAgICBtR3Jhdml0eVNlbnNvciA9IG1TZW5zb3JNYW5hZ2VyLmdldERlZmF1bHRTZW5zb3IoU2Vuc29yLlRZUEVfR1JBVklUWSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtU2Vuc29yTWFuYWdlci51bnJlZ2lzdGVyTGlzdGVuZXIobUdyYXZpdHlMaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1TZW5zb3JNYW5hZ2VyLnJlZ2lzdGVyTGlzdGVuZXIobUdyYXZpdHlMaXN0ZW5lciwgbUdyYXZpdHlTZW5zb3IsCisgICAgICAgICAgICAgICAgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfTk9STUFMKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIExvZy5kKFRBRywgImludGVudDogIiArIGludGVudCk7CisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IChVc2JEZXZpY2UpaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSk7CisgICAgICAgIGlmIChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0FUVEFDSEVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICBzZXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0RFVEFDSEVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICBpZiAobURldmljZSAhPSBudWxsICYmIG1EZXZpY2UuZXF1YWxzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2UobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZXZpY2UoVXNiRGV2aWNlIGRldmljZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXZpY2UgIiArIGRldmljZSk7CisgICAgICAgIGlmIChkZXZpY2UuZ2V0SW50ZXJmYWNlQ291bnQoKSAhPSAxKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZCBub3QgZmluZCBpbnRlcmZhY2UiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBVc2JJbnRlcmZhY2UgaW50ZiA9IGRldmljZS5nZXRJbnRlcmZhY2UoMCk7CisgICAgICAgIC8vIGRldmljZSBzaG91bGQgaGF2ZSBvbmUgZW5kcG9pbnQKKyAgICAgICAgaWYgKGludGYuZ2V0RW5kcG9pbnRDb3VudCgpICE9IDEpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCBmaW5kIGVuZHBvaW50Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gZW5kcG9pbnQgc2hvdWxkIGJlIG9mIHR5cGUgaW50ZXJydXB0CisgICAgICAgIFVzYkVuZHBvaW50IGVwID0gaW50Zi5nZXRFbmRwb2ludCgwKTsKKyAgICAgICAgaWYgKGVwLmdldFR5cGUoKSAhPSBVc2JDb25zdGFudHMuVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJlbmRwb2ludCBpcyBub3QgaW50ZXJydXB0IHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworICAgICAgICBtRW5kcG9pbnRJbnRyID0gZXA7CisgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgVXNiRGV2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbVVzYk1hbmFnZXIub3BlbkRldmljZShkZXZpY2UpOworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCAmJiBjb25uZWN0aW9uLmNsYWltSW50ZXJmYWNlKGludGYsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib3BlbiBTVUNDRVNTIik7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW4gRkFJTCIpOworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZENvbW1hbmQoaW50IGNvbnRyb2wpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBDT01NQU5EX1NUQVRVUykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmRNb3ZlICIgKyBjb250cm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIG1lc3NhZ2UgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlWzBdID0gKGJ5dGUpY29udHJvbDsKKyAgICAgICAgICAgICAgICAvLyBTZW5kIGNvbW1hbmQgdmlhIGEgY29udHJvbCByZXF1ZXN0IG9uIGVuZHBvaW50IHplcm8KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5jb250cm9sVHJhbnNmZXIoMHgyMSwgMHg5LCAweDIwMCwgMCwgbWVzc2FnZSwgbWVzc2FnZS5sZW5ndGgsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgaWYgKHYgPT0gbUZpcmUpIHsKKyAgICAgICAgICAgIHNlbmRDb21tYW5kKENPTU1BTkRfRklSRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtTGFzdFZhbHVlID0gMDsKKworICAgIFNlbnNvckV2ZW50TGlzdGVuZXIgbUdyYXZpdHlMaXN0ZW5lciA9IG5ldyBTZW5zb3JFdmVudExpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlbnNvckNoYW5nZWQoU2Vuc29yRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAgICAgLy8gY29tcHV0ZSBjdXJyZW50IHRpbHQKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IDA7CisgICAgICAgICAgICBpZiAoZXZlbnQudmFsdWVzWzBdIDwgLVRIUkVTSE9MRCkgeworICAgICAgICAgICAgICAgIHZhbHVlICs9IFRJTFRfTEVGVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudmFsdWVzWzBdID4gVEhSRVNIT0xEKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gVElMVF9SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChldmVudC52YWx1ZXNbMV0gPCAtVEhSRVNIT0xEKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gVElMVF9VUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudmFsdWVzWzFdID4gVEhSRVNIT0xEKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gVElMVF9ET1dOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbUxhc3RWYWx1ZSkgeworICAgICAgICAgICAgICAgIG1MYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAvLyBzZW5kIG1vdGlvbiBjb21tYW5kIGlmIHRoZSB0aWx0IGNoYW5nZWQKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVElMVF9MRUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoQ09NTUFORF9MRUZUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRJTFRfUklHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kKENPTU1BTkRfUklHSFQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVElMVF9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kKENPTU1BTkRfVVApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVElMVF9ET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoQ09NTUFORF9ET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoQ09NTUFORF9TVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSk7CisgICAgICAgIFVzYlJlcXVlc3QgcmVxdWVzdCA9IG5ldyBVc2JSZXF1ZXN0KCk7CisgICAgICAgIHJlcXVlc3QuaW5pdGlhbGl6ZShtQ29ubmVjdGlvbiwgbUVuZHBvaW50SW50cik7CisgICAgICAgIGJ5dGUgc3RhdHVzID0gLTE7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyBxdWV1ZSBhIHJlcXVlc3Qgb24gdGhlIGludGVycnVwdCBlbmRwb2ludAorICAgICAgICAgICAgcmVxdWVzdC5xdWV1ZShidWZmZXIsIDEpOworICAgICAgICAgICAgLy8gc2VuZCBwb2xsIHN0YXR1cyBjb21tYW5kCisgICAgICAgICAgICBzZW5kQ29tbWFuZChDT01NQU5EX1NUQVRVUyk7CisgICAgICAgICAgICAvLyB3YWl0IGZvciBzdGF0dXMgZXZlbnQKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbi5yZXF1ZXN0V2FpdCgpID09IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBieXRlIG5ld1N0YXR1cyA9IGJ1ZmZlci5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ290IHN0YXR1cyAiICsgbmV3U3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3U3RhdHVzOworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIENPTU1BTkRfRklSRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBmaXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kKENPTU1BTkRfU1RPUCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAicmVxdWVzdFdhaXQgZmFpbGVkLCBleGl0aW5nIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9VU0IvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1VTQi9faW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIwMTFkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9VU0IvX2luZGV4Lmh0bWwKQEAgLTAsMCArMSBAQAorPHA+QSBzZXQgb2Ygc2FtcGxlcyB0aGF0IGRlbW9uc3RyYXRlIGhvdyB0byB1c2UgdmFyaW91cyBmZWF0dXJlcyBvZiB0aGUgVVNCIEFQSXMuPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvQW5kcm9pZC5tayBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQyMzNmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKKyMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gV2VhdGhlckxpc3RXaWRnZXQKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyBVc2UgdGhlIGZvbGxvd2luZyBpbmNsdWRlIHRvIG1ha2Ugb3VyIHRlc3QgYXBrLgoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYjIzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBEZWNsYXJlIHRoZSBjb250ZW50cyBvZiB0aGlzIEFuZHJvaWQgYXBwbGljYXRpb24uICBUaGUgbmFtZXNwYWNlCisgICAgIGF0dHJpYnV0ZSBicmluZ3MgaW4gdGhlIEFuZHJvaWQgcGxhdGZvcm0gbmFtZXNwYWNlLCBhbmQgdGhlIHBhY2thZ2UKKyAgICAgc3VwcGxpZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgV2hlbiB3cml0aW5nIHlvdXIKKyAgICAgb3duIGFwcGxpY2F0aW9uLCB0aGUgcGFja2FnZSBuYW1lIG11c3QgYmUgY2hhbmdlZCBmcm9tICJjb20uZXhhbXBsZS4qIgorICAgICB0byBjb21lIGZyb20gYSBkb21haW4gdGhhdCB5b3Ugb3duIG9yIGhhdmUgY29udHJvbCBvdmVyLiAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC53ZWF0aGVybGlzdHdpZGdldCI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IldlYXRoZXIgV2lkZ2V0IFNhbXBsZSI+CisgICAgICAgIDwhLS0gVGhlIHdpZGdldCBwcm92aWRlciAtLT4KKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iV2VhdGhlcldpZGdldFByb3ZpZGVyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX1VQREFURSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDwhLS0gVGhpcyBzcGVjaWZpZXMgdGhlIHdpZGdldCBwcm92aWRlciBpbmZvIC0tPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwd2lkZ2V0LnByb3ZpZGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL3dpZGdldGluZm8iIC8+CisgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgPCEtLSBUaGUgc2VydmljZSBzZXJ2aW5nIHRoZSBSZW1vdGVWaWV3cyB0byB0aGUgY29sbGVjdGlvbiB3aWRnZXQgLS0+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iV2VhdGhlcldpZGdldFNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5CSU5EX1JFTU9URVZJRVdTIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgY29udGVudCBwcm92aWRlciBzZXJ2aW5nIHRoZSAoZmFrZSkgd2VhdGhlciBkYXRhIC0tPgorICAgICAgICA8cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJXZWF0aGVyRGF0YVByb3ZpZGVyIgorICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJjb20uZXhhbXBsZS5hbmRyb2lkLndlYXRoZXJsaXN0d2lkZ2V0LnByb3ZpZGVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGYyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L19pbmRleC5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzxwPlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgbGlzdC1iYXNlZCB3aWRnZXQgc3BlY2lmaWNhbGx5IGJhY2tlZCBieSBhIGNvbnRlbnQgcHJvdmlkZXIuPGJyLz4KKzxlbT5QbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IHVuZGVyc3RhbmQgdGhlIGVhcmxpZXIgc3RhY2sgd2lkZ2V0IHNhbXBsZSBjb2RlIGJlZm9yZSBkZWx2aW5nIGludG8gdGhpcyBleGFtcGxlCisgKHNlZSA8YSBocmVmPSIuLi9TdGFja1dpZGdldC9pbmRleC5odG1sIj5TdGFja1dpZGdldDwvYT4pLjwvZW0+PC9wPgorCis8cD5BcyBpbiB0aGUgU3RhY2tXaWRnZXQgZXhhbXBsZSwgd2Ugd2lsbCBiZSB1c2luZyBhIGNvbGxlY3Rpb24gdmlldyAodGhlIExpc3RWaWV3IGluIHRoaXMgY2FzZSkgdG8KK3ByZXNlbnQgc29tZSBtb2NrIHdlYXRoZXIgZGF0YSBpbiBhIHdpZGdldC4gIEluIHBhcnRpY3VsYXIsIHdlIHdpbGwgYmUgdXNpbmcgYSBjb250ZW50IHByb3ZpZGVyIHRvCitkZW1vbnN0cmF0ZSBob3cgdGhlIHdpZGdldCBjYW4gcmV0cmlldmUgZGF0YSBhbmQgdXBkYXRlIGl0c2VsZiB3aGVuIHlvdSBhcmUgdXNpbmcgbW9yZSBjb21wbGV4IGRhdGEKK3NvdXJjZXMuICBXaGVuIHdvcmtpbmcgd2l0aCBleHRlcm5hbCBkYXRhLCBvciBkYXRhIHdoaWNoIG11c3QgYmUgZmV0Y2hlZCBvdmVyIGhpZ2ggbGF0ZW5jeSwgaXQgaXMKK2ltcG9ydGFudCB0byBrZWVwIHRoZSBkYXRhIGNhY2hlZCBpbiBhIHBlcnNpc3RlbnQgbG9jYXRpb24gc28gdGhhdCB0aGUgd2lkZ2V0IGZlZWxzIHJlc3BvbnNpdmUuPC9wPgorCis8cD5UaGlzIHNhbXBsZSB1c2VzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKKwk8dWw+CisJCTxsaT48YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC93ZWF0aGVybGlzdHdpZGdldC9XZWF0aGVyRGF0YVByb3ZpZGVyLmh0bWwiPjxjb2RlPldlYXRoZXJEYXRhUHJvdmlkZXI8L2NvZGU+PC9hPiAmbWRhc2g7CisJCQlPdXIgQ29udGVudFByb3ZpZGVyIHdoaWNoIHN0b3JlcyB0aGUgd2VhdGhlciBkYXRhIGZvciB0aGlzIHNhbXBsZS4gIE5vdGUgdGhhdCBmb3Igc2ltcGxpY2l0eSwKKwkJCWl0IGN1cnJlbnRseSBzdG9yZXMgdGhlIGRhdGEgaW4gbWVtb3J5IGFzIG9wcG9zZWQgdG8gYW4gZXh0ZXJuYWwgYW5kIHBlcnNpc3RlbnQgc3RvcmFnZSBzdWNoCisJCQlhcyBhIGZpbGUsIG5ldHdvcmsgbG9jYXRpb24sIGRhdGFiYXNlLCBvciBzaGFyZWQgcHJlZmVyZW5jZS4KKwkJPC9saT4KKwkJPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3dlYXRoZXJsaXN0d2lkZ2V0L1dlYXRoZXJXaWRnZXRQcm92aWRlci5odG1sIj48Y29kZT5XZWF0aGVyV2lkZ2V0UHJvdmlkZXI8L2NvZGU+PC9hPiAmbWRhc2g7CisJCQlPdXIgQXBwV2lkZ2V0UHJvdmlkZXIgd2hpY2ggaGFuZGxlcyBzcGVjaWZpYyBpbnRlbnQgYWN0aW9ucyAoc3VjaCBhcyB3aGVuIGFuIGl0ZW0gaXMgY2xpY2tlZCwKKwkJCW9yIHRoZSByZWZyZXNoIGJ1dHRvbiBpcyBwcmVzc2VkKS4gIEl0IGFsc28gc2V0cyB1cCB0aGUgUmVtb3RlVmlld3MgZm9yIHRoZSB3aWRnZXQgYW5kIGJpbmRzCisJCQl0aGUgc2VydmljZSB0byB0aGUgY29sbGVjdGlvbiB2aWV3IGluIHRoZSB3aWRnZXQuCisJCTwvbGk+CisJCTxsaT48YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC93ZWF0aGVybGlzdHdpZGdldC9XZWF0aGVyV2lkZ2V0U2VydmljZS5odG1sIj48Y29kZT5XZWF0aGVyV2lkZ2V0U2VydmljZTwvY29kZT48L2E+ICZtZGFzaDsKKwkJCU91ciBSZW1vdGVWaWV3c1NlcnZpY2Ugd2hpY2ggbWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgbmV3IGZhY3Rvcmllcywgd2hpY2ggcmV0dXJuIHRoZSBSZW1vdGVWaWV3cworCQkJZm9yIGVhY2ggaXRlbSBpbiB0aGUgTGlzdFZpZXcuCisJCTwvbGk+CisJPC91bD4KKzwvcD4KKworPHA+SWYgeW91IGFyZSB3cml0aW5nIGNvbGxlY3Rpb24tYmFzZWQgd2lkZ2V0cywgcmVtZW1iZXIgdGhhdCB0aGUgZmVhdHVyZSBpcworc3VwcG9ydGVkIG9ubHkgb24gQW5kcm9pZCAzLjAgKEFQSSBsZXZlbCAxMSkgYW5kIGhpZ2hlciB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCitSZW1lbWJlciB0byBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBwdWJsaXNoaW5nIHRvIEFuZHJvaWQgTWFya2V0OjwvcD4KKworPHVsPgorPGxpPjxjb2RlPiZsdDt1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIiAvJmd0OzwvY29kZT4sIHdoaWNoIGluZGljYXRlcwordG8gQW5kcm9pZCBNYXJrZXQgYW5kIHRoZSBwbGF0Zm9ybSB0aGF0IHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgQW5kcm9pZCAzLjAgb3IKK2hpZ2hlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgPGEgaHJlZj0iLi4vLi4vLi4vZ3VpZGUvYXBwZW5kaXgvYXBpLWxldmVscy5odG1sIj5BUEkgTGV2ZWxzPC9hPgorYW5kIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKzxhIGhyZWY9Ii4uLy4uLy4uL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDt1c2VzLXNkayZndDs8L2NvZGU+PC9hPgorZWxlbWVudC48L2xpPgorPC91bD4KKworPGltZyBhbHQ9IlNjcmVlbnNob3QiIHNyYz0iLi4vaW1hZ2VzL1dlYXRoZXJMaXN0V2lkZ2V0LnBuZyIgLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2JvZHkucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9ib2R5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9ib2R5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2Zvb3Rlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2Zvb3Rlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjYzk1YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvZm9vdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2hlYWRlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2hlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1OWFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvaGVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc0YzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2l0ZW1fYmdfZGFyay5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2l0ZW1fYmdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5N2FiNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvaXRlbV9iZ19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL2l0ZW1fYmdfbGlnaHQucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTlmMzZjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL3JlZnJlc2gucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9yZWZyZXNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQ3NzczCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtaGRwaS9yZWZyZXNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1oZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwY2MzNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWhkcGkvcmVmcmVzaF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2JvZHkucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9ib2R5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U0Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9ib2R5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2Zvb3Rlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2Zvb3Rlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4OWJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvZm9vdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2hlYWRlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2hlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyOTU3NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvaGVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2ljb24ucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk1NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2l0ZW1fYmdfZGFyay5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2l0ZW1fYmdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvaXRlbV9iZ19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL2l0ZW1fYmdfbGlnaHQucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRiOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL3JlZnJlc2gucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9yZWZyZXNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgzNDNjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbGRwaS9yZWZyZXNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1sZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhM2FlNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLWxkcGkvcmVmcmVzaF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2JvZHkucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9ib2R5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMxYTlhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9ib2R5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2Zvb3Rlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2Zvb3Rlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4YjdlYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvZm9vdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2hlYWRlci5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2hlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1MmFiZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvaGVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24ucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdjNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2l0ZW1fYmdfZGFyay5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2l0ZW1fYmdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvaXRlbV9iZ19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL2l0ZW1fYmdfbGlnaHQucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njk2OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9pdGVtX2JnX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL3JlZnJlc2gucG5nIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9yZWZyZXNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjliMzYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvZHJhd2FibGUtbWRwaS9yZWZyZXNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1tZHBpL3JlZnJlc2hfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxMDY2MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLW1kcGkvcmVmcmVzaF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1ub2RwaS9wcmV2aWV3LnBuZyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlLW5vZHBpL3ByZXZpZXcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2JkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS1ub2RwaS9wcmV2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS9yZWZyZXNoX2J1dHRvbi54bWwgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9kcmF3YWJsZS9yZWZyZXNoX2J1dHRvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMDE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2RyYXdhYmxlL3JlZnJlc2hfYnV0dG9uLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9yZWZyZXNoX3ByZXNzZWQiIC8+IDwhLS0gcHJlc3NlZCAtLT4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcmVmcmVzaCIgLz4gPCEtLSBkZWZhdWx0IC0tPgorPC9zZWxlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9sYXlvdXQvZGFya193aWRnZXRfaXRlbS54bWwgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9sYXlvdXQvZGFya193aWRnZXRfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5MjBhMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL2xheW91dC9kYXJrX3dpZGdldF9pdGVtLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3dpZGdldF9pdGVtIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NmRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI1ZHAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaXRlbV9iZ19kYXJrIgorICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZTVlNWUxIgorICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiIC8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9sYXlvdXQvbGlnaHRfd2lkZ2V0X2l0ZW0ueG1sIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvbGF5b3V0L2xpZ2h0X3dpZGdldF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI5NDZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvbGF5b3V0L2xpZ2h0X3dpZGdldF9pdGVtLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3dpZGdldF9pdGVtIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NmRwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI1ZHAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaXRlbV9iZ19saWdodCIKKyAgICBhbmRyb2lkOnRleHRDb2xvcj0iI2U1ZTVlMSIKKyAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIiAvPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvbGF5b3V0L3dpZGdldF9sYXlvdXQueG1sIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvbGF5b3V0L3dpZGdldF9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDllZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3Jlcy9sYXlvdXQvd2lkZ2V0X2xheW91dC54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyOTRkcCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPEZyYW1lTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2hlYWRlciIgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JlZnJlc2giCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTZkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzlkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjIyMmRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVmcmVzaF9idXR0b24iIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9ib2R5Ij4KKyAgICAgICAgPExpc3RWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3dlYXRoZXJfbGlzdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtcHR5X3ZpZXciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZmZmZmIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2VtcHR5X3ZpZXdfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiIC8+CisgICAgPC9GcmFtZUxheW91dD4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9mb290ZXIiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQyNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iZW1wdHlfdmlld190ZXh0Ij5ObyBjaXRpZXMgZm91bmQuLi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvYXN0X2Zvcm1hdF9zdHJpbmciPiUxJHMgc2F5cyBIaSE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Iml0ZW1fZm9ybWF0X3N0cmluZyI+JTEkZFx1MDBCMCBpbiAlMiRzPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL3htbC93aWRnZXRpbmZvLnhtbCBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvcmVzL3htbC93aWRnZXRpbmZvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY0MTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9yZXMveG1sL3dpZGdldGluZm8ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YXBwd2lkZ2V0LXByb3ZpZGVyCisgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgYW5kcm9pZDptaW5XaWR0aD0iMjIyZGlwIgorICBhbmRyb2lkOm1pbkhlaWdodD0iMjIyZGlwIgorICBhbmRyb2lkOnVwZGF0ZVBlcmlvZE1pbGxpcz0iMTgwMDAwMCIKKyAgYW5kcm9pZDppbml0aWFsTGF5b3V0PSJAbGF5b3V0L3dpZGdldF9sYXlvdXQiCisgIGFuZHJvaWQ6cmVzaXplTW9kZT0idmVydGljYWwiCisgIGFuZHJvaWQ6cHJldmlld0ltYWdlPSJAZHJhd2FibGUvcHJldmlldyI+Cis8L2FwcHdpZGdldC1wcm92aWRlcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvd2VhdGhlcmxpc3R3aWRnZXQvV2VhdGhlckRhdGFQcm92aWRlci5qYXZhIGIvc2FtcGxlcy9XZWF0aGVyTGlzdFdpZGdldC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC93ZWF0aGVybGlzdHdpZGdldC9XZWF0aGVyRGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhMWNiMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvd2VhdGhlcmxpc3R3aWRnZXQvV2VhdGhlckRhdGFQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLndlYXRoZXJsaXN0d2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIGR1bW15IGNsYXNzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnRlcm5hbGx5IHRvIHN0b3JlIHdlYXRoZXIgZGF0YS4gIEdlbmVyYWxseSwgdGhpcyBkYXRhCisgKiB3aWxsIGJlIHN0b3JlZCBpbiBhbiBleHRlcm5hbCBhbmQgcGVyc2lzdGVudCBsb2NhdGlvbiAoaWUuIEZpbGUsIERhdGFiYXNlLCBTaGFyZWRQcmVmZXJlbmNlcykgc28KKyAqIHRoYXQgdGhlIGRhdGEgY2FuIHBlcnNpc3QgaWYgdGhlIHByb2Nlc3MgaXMgZXZlciBraWxsZWQuICBGb3Igc2ltcGxpY2l0eSwgaW4gdGhpcyBzYW1wbGUgdGhlCisgKiBkYXRhIHdpbGwgb25seSBiZSBzdG9yZWQgaW4gbWVtb3J5LgorICovCitjbGFzcyBXZWF0aGVyRGF0YVBvaW50IHsKKyAgICBTdHJpbmcgY2l0eTsKKyAgICBpbnQgZGVncmVlczsKKworICAgIFdlYXRoZXJEYXRhUG9pbnQoU3RyaW5nIGMsIGludCBkKSB7CisgICAgICAgIGNpdHkgPSBjOworICAgICAgICBkZWdyZWVzID0gZDsKKyAgICB9Cit9CisKKy8qKgorICogVGhlIEFwcFdpZGdldFByb3ZpZGVyIGZvciBvdXIgc2FtcGxlIHdlYXRoZXIgd2lkZ2V0LgorICovCitwdWJsaWMgY2xhc3MgV2VhdGhlckRhdGFQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9jb20uZXhhbXBsZS5hbmRyb2lkLndlYXRoZXJsaXN0d2lkZ2V0LnByb3ZpZGVyIik7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiX2lkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lUWSA9ICJjaXR5IjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUEVSQVRVUkUgPSAidGVtcGVyYXR1cmUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYWxseSwgdGhpcyBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGFuIGV4dGVybmFsIGFuZCBwZXJzaXN0ZW50IGxvY2F0aW9uIChpZS4gRmlsZSwKKyAgICAgKiBEYXRhYmFzZSwgU2hhcmVkUHJlZmVyZW5jZXMpIHNvIHRoYXQgdGhlIGRhdGEgY2FuIHBlcnNpc3QgaWYgdGhlIHByb2Nlc3MgaXMgZXZlciBraWxsZWQuCisgICAgICogRm9yIHNpbXBsaWNpdHksIGluIHRoaXMgc2FtcGxlIHRoZSBkYXRhIHdpbGwgb25seSBiZSBzdG9yZWQgaW4gbWVtb3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxXZWF0aGVyRGF0YVBvaW50PiBzRGF0YSA9IG5ldyBBcnJheUxpc3Q8V2VhdGhlckRhdGFQb2ludD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBXZSBhcmUgZ29pbmcgdG8gaW5pdGlhbGl6ZSB0aGUgZGF0YSBwcm92aWRlciB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJTYW4gRnJhbmNpc2NvIiwgMTMpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJOZXcgWW9yayIsIDEpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJTZWF0dGxlIiwgNykpOworICAgICAgICBzRGF0YS5hZGQobmV3IFdlYXRoZXJEYXRhUG9pbnQoIkJvc3RvbiIsIDQpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJNaWFtaSIsIDIyKSk7CisgICAgICAgIHNEYXRhLmFkZChuZXcgV2VhdGhlckRhdGFQb2ludCgiVG9yb250byIsIC0xMCkpOworICAgICAgICBzRGF0YS5hZGQobmV3IFdlYXRoZXJEYXRhUG9pbnQoIkNhbGdhcnkiLCAtMTMpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJUb2t5byIsIDgpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJLeW90byIsIDExKSk7CisgICAgICAgIHNEYXRhLmFkZChuZXcgV2VhdGhlckRhdGFQb2ludCgiTG9uZG9uIiwgLTEpKTsKKyAgICAgICAgc0RhdGEuYWRkKG5ldyBXZWF0aGVyRGF0YVBvaW50KCJOb21hbmlzYW4iLCAyNykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBhc3NlcnQodXJpLmdldFBhdGhTZWdtZW50cygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8gSW4gdGhpcyBzYW1wbGUsIHdlIG9ubHkgcXVlcnkgd2l0aG91dCBhbnkgcGFyYW1ldGVycywgc28gd2UgY2FuIGp1c3QgcmV0dXJuIGEgY3Vyc29yIHRvCisgICAgICAgIC8vIGFsbCB0aGUgd2VhdGhlciBkYXRhLgorICAgICAgICBmaW5hbCBNYXRyaXhDdXJzb3IgYyA9IG5ldyBNYXRyaXhDdXJzb3IoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyBDb2x1bW5zLklELCBDb2x1bW5zLkNJVFksIENvbHVtbnMuVEVNUEVSQVRVUkUgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0RhdGEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIFdlYXRoZXJEYXRhUG9pbnQgZGF0YSA9IHNEYXRhLmdldChpKTsKKyAgICAgICAgICAgIGMuYWRkUm93KG5ldyBPYmplY3RbXXsgbmV3IEludGVnZXIoaSksIGRhdGEuY2l0eSwgbmV3IEludGVnZXIoZGF0YS5kZWdyZWVzKSB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvdm5kLndlYXRoZXJsaXN0d2lkZ2V0LmNpdHl0ZW1wZXJhdHVyZSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgLy8gVGhpcyBleGFtcGxlIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBpbnNlcnRpbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICAvLyBUaGlzIGV4YW1wbGUgY29kZSBkb2VzIG5vdCBzdXBwb3J0IGRlbGV0aW5nCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5zaXplKCkgPT0gMSk7CisKKyAgICAgICAgLy8gSW4gdGhpcyBzYW1wbGUsIHdlIG9ubHkgdXBkYXRlIHRoZSBjb250ZW50IHByb3ZpZGVyIGluZGl2aWR1YWxseSBmb3IgZWFjaCByb3cgd2l0aCBuZXcKKyAgICAgICAgLy8gdGVtcGVyYXR1cmUgdmFsdWVzLgorICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMCkpOworICAgICAgICBmaW5hbCBNYXRyaXhDdXJzb3IgYyA9IG5ldyBNYXRyaXhDdXJzb3IoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyBDb2x1bW5zLklELCBDb2x1bW5zLkNJVFksIENvbHVtbnMuVEVNUEVSQVRVUkUgfSk7CisgICAgICAgIGFzc2VydCgwIDw9IGluZGV4ICYmIGluZGV4IDwgc0RhdGEuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgV2VhdGhlckRhdGFQb2ludCBkYXRhID0gc0RhdGEuZ2V0KGluZGV4KTsKKyAgICAgICAgZGF0YS5kZWdyZWVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihDb2x1bW5zLlRFTVBFUkFUVVJFKTsKKworICAgICAgICAvLyBOb3RpZnkgYW55IGxpc3RlbmVycyB0aGF0IHRoZSBkYXRhIGJhY2tpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgaGFzIGNoYW5nZWQsIGFuZCByZXR1cm4KKyAgICAgICAgLy8gdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkLgorICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKHVyaSwgbnVsbCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvd2VhdGhlcmxpc3R3aWRnZXQvV2VhdGhlcldpZGdldFByb3ZpZGVyLmphdmEgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3dlYXRoZXJsaXN0d2lkZ2V0L1dlYXRoZXJXaWRnZXRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmIzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3dlYXRoZXJsaXN0d2lkZ2V0L1dlYXRoZXJXaWRnZXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLndlYXRoZXJsaXN0d2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIE91ciBkYXRhIG9ic2VydmVyIGp1c3Qgbm90aWZpZXMgYW4gdXBkYXRlIGZvciBhbGwgd2VhdGhlciB3aWRnZXRzIHdoZW4gaXQgZGV0ZWN0cyBhIGNoYW5nZS4KKyAqLworY2xhc3MgV2VhdGhlckRhdGFQcm92aWRlck9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICBwcml2YXRlIEFwcFdpZGdldE1hbmFnZXIgbUFwcFdpZGdldE1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOworCisgICAgV2VhdGhlckRhdGFQcm92aWRlck9ic2VydmVyKEFwcFdpZGdldE1hbmFnZXIgbWdyLCBDb21wb25lbnROYW1lIGNuLCBIYW5kbGVyIGgpIHsKKyAgICAgICAgc3VwZXIoaCk7CisgICAgICAgIG1BcHBXaWRnZXRNYW5hZ2VyID0gbWdyOworICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAvLyBUaGUgZGF0YSBoYXMgY2hhbmdlZCwgc28gbm90aWZ5IHRoZSB3aWRnZXQgdGhhdCB0aGUgY29sbGVjdGlvbiB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgIC8vIEluIHJlc3BvbnNlLCB0aGUgZmFjdG9yeSdzIG9uRGF0YVNldENoYW5nZWQoKSB3aWxsIGJlIGNhbGxlZCB3aGljaCB3aWxsIHJlcXVlcnkgdGhlCisgICAgICAgIC8vIGN1cnNvciBmb3IgdGhlIG5ldyBkYXRhLgorICAgICAgICBtQXBwV2lkZ2V0TWFuYWdlci5ub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoCisgICAgICAgICAgICAgICAgbUFwcFdpZGdldE1hbmFnZXIuZ2V0QXBwV2lkZ2V0SWRzKG1Db21wb25lbnROYW1lKSwgUi5pZC53ZWF0aGVyX2xpc3QpOworICAgIH0KK30KKworLyoqCisgKiBUaGUgd2VhdGhlciB3aWRnZXQncyBBcHBXaWRnZXRQcm92aWRlci4KKyAqLworcHVibGljIGNsYXNzIFdlYXRoZXJXaWRnZXRQcm92aWRlciBleHRlbmRzIEFwcFdpZGdldFByb3ZpZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDTElDS19BQ1RJT04gPSAiY29tLmV4YW1wbGUuYW5kcm9pZC53ZWF0aGVybGlzdHdpZGdldC5DTElDSyI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGUkVTSF9BQ1RJT04gPSAiY29tLmV4YW1wbGUuYW5kcm9pZC53ZWF0aGVybGlzdHdpZGdldC5SRUZSRVNIIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFWFRSQV9DSVRZX0lEID0gImNvbS5leGFtcGxlLmFuZHJvaWQud2VhdGhlcmxpc3R3aWRnZXQuY2l0eSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyVGhyZWFkIHNXb3JrZXJUaHJlYWQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFuZGxlciBzV29ya2VyUXVldWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgV2VhdGhlckRhdGFQcm92aWRlck9ic2VydmVyIHNEYXRhT2JzZXJ2ZXI7CisKKyAgICBwdWJsaWMgV2VhdGhlcldpZGdldFByb3ZpZGVyKCkgeworICAgICAgICAvLyBTdGFydCB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBzV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldlYXRoZXJXaWRnZXRQcm92aWRlci13b3JrZXIiKTsKKyAgICAgICAgc1dvcmtlclRocmVhZC5zdGFydCgpOworICAgICAgICBzV29ya2VyUXVldWUgPSBuZXcgSGFuZGxlcihzV29ya2VyVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBleHRlcm5hbCB1cGRhdGVzIHRvIHRoZSBkYXRhIHRvIHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSB3aWRnZXQuICBXaGVuIHVzaW5nCisgICAgICAgIC8vIGNvbnRlbnQgcHJvdmlkZXJzLCB0aGUgZGF0YSBpcyBvZnRlbiB1cGRhdGVkIHZpYSBhIGJhY2tncm91bmQgc2VydmljZSwgb3IgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAgLy8gdXNlciBpbnRlcmFjdGlvbiBpbiB0aGUgbWFpbiBhcHAuICBUbyBlbnN1cmUgdGhhdCB0aGUgd2lkZ2V0IGFsd2F5cyByZWZsZWN0cyB0aGUgY3VycmVudAorICAgICAgICAvLyBzdGF0ZSBvZiB0aGUgZGF0YSwgd2UgbXVzdCBsaXN0ZW4gZm9yIGNoYW5nZXMgYW5kIHVwZGF0ZSBvdXJzZWx2ZXMgYWNjb3JkaW5nbHkuCisgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgaWYgKHNEYXRhT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgQXBwV2lkZ2V0TWFuYWdlciBtZ3IgPSBBcHBXaWRnZXRNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBjbiA9IG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIFdlYXRoZXJXaWRnZXRQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBzRGF0YU9ic2VydmVyID0gbmV3IFdlYXRoZXJEYXRhUHJvdmlkZXJPYnNlcnZlcihtZ3IsIGNuLCBzV29ya2VyUXVldWUpOworICAgICAgICAgICAgci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihXZWF0aGVyRGF0YVByb3ZpZGVyLkNPTlRFTlRfVVJJLCB0cnVlLCBzRGF0YU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGN0eCwgSW50ZW50IGludGVudCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhSRUZSRVNIX0FDVElPTikpIHsKKyAgICAgICAgICAgIC8vIEJyb2FkY2FzdFJlY2VpdmVycyBoYXZlIGEgbGltaXRlZCBhbW91bnQgb2YgdGltZSB0byBkbyB3b3JrLCBzbyBmb3IgdGhpcyBzYW1wbGUsIHdlCisgICAgICAgICAgICAvLyBhcmUgdHJpZ2dlcmluZyBhbiB1cGRhdGUgb2YgdGhlIGRhdGEgb24gYW5vdGhlciB0aHJlYWQuICBJbiBwcmFjdGljZSwgdGhpcyB1cGRhdGUKKyAgICAgICAgICAgIC8vIGNhbiBiZSB0cmlnZ2VyZWQgZnJvbSBhIGJhY2tncm91bmQgc2VydmljZSwgb3IgcGVyaGFwcyBhcyBhIHJlc3VsdCBvZiB1c2VyIGFjdGlvbnMKKyAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgbWFpbiBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGN0eDsKKyAgICAgICAgICAgIHNXb3JrZXJRdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIHNXb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciByID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGMgPSByLnF1ZXJ5KFdlYXRoZXJEYXRhUHJvdmlkZXIuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhEZWdyZWVzID0gOTY7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZGlzYWJsZSB0aGUgZGF0YSBjaGFuZ2VkIG9ic2VydmVyIHRlbXBvcmFyaWx5IHNpbmNlIGVhY2ggb2YgdGhlIHVwZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB0cmlnZ2VyIGFuIG9uQ2hhbmdlKCkgaW4gb3VyIGRhdGEgb2JzZXJ2ZXIuCisgICAgICAgICAgICAgICAgICAgIHIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihzRGF0YU9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoV2VhdGhlckRhdGFQcm92aWRlci5DT05URU5UX1VSSSwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFdlYXRoZXJEYXRhUHJvdmlkZXIuQ29sdW1ucy5URU1QRVJBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmRvbSgpLm5leHRJbnQobWF4RGVncmVlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgci51cGRhdGUodXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoV2VhdGhlckRhdGFQcm92aWRlci5DT05URU5UX1VSSSwgdHJ1ZSwgc0RhdGFPYnNlcnZlcik7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwV2lkZ2V0TWFuYWdlciBtZ3IgPSBBcHBXaWRnZXRNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGNuID0gbmV3IENvbXBvbmVudE5hbWUoY29udGV4dCwgV2VhdGhlcldpZGdldFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbWdyLm5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChtZ3IuZ2V0QXBwV2lkZ2V0SWRzKGNuKSwgUi5pZC53ZWF0aGVyX2xpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQ0xJQ0tfQUNUSU9OKSkgeworICAgICAgICAgICAgLy8gU2hvdyBhIHRvYXN0CisgICAgICAgICAgICBmaW5hbCBpbnQgYXBwV2lkZ2V0SWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsCisgICAgICAgICAgICAgICAgICAgIEFwcFdpZGdldE1hbmFnZXIuSU5WQUxJRF9BUFBXSURHRVRfSUQpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNpdHkgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfQ0lUWV9JRCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0U3RyID0gY3R4LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy50b2FzdF9mb3JtYXRfc3RyaW5nKTsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KGN0eCwgU3RyaW5nLmZvcm1hdChmb3JtYXRTdHIsIGNpdHkpLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLm9uUmVjZWl2ZShjdHgsIGludGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25VcGRhdGUoQ29udGV4dCBjb250ZXh0LCBBcHBXaWRnZXRNYW5hZ2VyIGFwcFdpZGdldE1hbmFnZXIsIGludFtdIGFwcFdpZGdldElkcykgeworICAgICAgICAvLyBVcGRhdGUgZWFjaCBvZiB0aGUgd2lkZ2V0cyB3aXRoIHRoZSByZW1vdGUgYWRhcHRlcgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcFdpZGdldElkcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgLy8gU3BlY2lmeSB0aGUgc2VydmljZSB0byBwcm92aWRlIGRhdGEgZm9yIHRoZSBjb2xsZWN0aW9uIHdpZGdldC4gIE5vdGUgdGhhdCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAvLyBlbWJlZCB0aGUgYXBwV2lkZ2V0SWQgdmlhIHRoZSBkYXRhIG90aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBXZWF0aGVyV2lkZ2V0U2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsIGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoaW50ZW50LnRvVXJpKEludGVudC5VUklfSU5URU5UX1NDSEVNRSkpKTsKKyAgICAgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIHJ2ID0gbmV3IFJlbW90ZVZpZXdzKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgUi5sYXlvdXQud2lkZ2V0X2xheW91dCk7CisgICAgICAgICAgICBydi5zZXRSZW1vdGVBZGFwdGVyKGFwcFdpZGdldElkc1tpXSwgUi5pZC53ZWF0aGVyX2xpc3QsIGludGVudCk7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgZW1wdHkgdmlldyB0byBiZSBkaXNwbGF5ZWQgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuICBJdCBtdXN0IGJlIGEgc2libGluZworICAgICAgICAgICAgLy8gdmlldyBvZiB0aGUgY29sbGVjdGlvbiB2aWV3LgorICAgICAgICAgICAgcnYuc2V0RW1wdHlWaWV3KFIuaWQud2VhdGhlcl9saXN0LCBSLmlkLmVtcHR5X3ZpZXcpOworCisgICAgICAgICAgICAvLyBCaW5kIGEgY2xpY2sgbGlzdGVuZXIgdGVtcGxhdGUgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgd2VhdGhlciBsaXN0LiAgTm90ZSB0aGF0IHdlCisgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSB0aGUgaW50ZW50J3MgZGF0YSBpZiB3ZSBzZXQgYW4gZXh0cmEsIHNpbmNlIHRoZSBleHRyYXMgd2lsbCBiZQorICAgICAgICAgICAgLy8gaWdub3JlZCBvdGhlcndpc2UuCisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgb25DbGlja0ludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgV2VhdGhlcldpZGdldFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIG9uQ2xpY2tJbnRlbnQuc2V0QWN0aW9uKFdlYXRoZXJXaWRnZXRQcm92aWRlci5DTElDS19BQ1RJT04pOworICAgICAgICAgICAgb25DbGlja0ludGVudC5wdXRFeHRyYShBcHBXaWRnZXRNYW5hZ2VyLkVYVFJBX0FQUFdJREdFVF9JRCwgYXBwV2lkZ2V0SWRzW2ldKTsKKyAgICAgICAgICAgIG9uQ2xpY2tJbnRlbnQuc2V0RGF0YShVcmkucGFyc2Uob25DbGlja0ludGVudC50b1VyaShJbnRlbnQuVVJJX0lOVEVOVF9TQ0hFTUUpKSk7CisgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IG9uQ2xpY2tQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoY29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgb25DbGlja0ludGVudCwgUGVuZGluZ0ludGVudC5GTEFHX1VQREFURV9DVVJSRU5UKTsKKyAgICAgICAgICAgIHJ2LnNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZShSLmlkLndlYXRoZXJfbGlzdCwgb25DbGlja1BlbmRpbmdJbnRlbnQpOworCisgICAgICAgICAgICAvLyBCaW5kIHRoZSBjbGljayBpbnRlbnQgZm9yIHRoZSByZWZyZXNoIGJ1dHRvbiBvbiB0aGUgd2lkZ2V0CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgcmVmcmVzaEludGVudCA9IG5ldyBJbnRlbnQoY29udGV4dCwgV2VhdGhlcldpZGdldFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJlZnJlc2hJbnRlbnQuc2V0QWN0aW9uKFdlYXRoZXJXaWRnZXRQcm92aWRlci5SRUZSRVNIX0FDVElPTik7CisgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHJlZnJlc2hQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoY29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaEludGVudCwgUGVuZGluZ0ludGVudC5GTEFHX1VQREFURV9DVVJSRU5UKTsKKyAgICAgICAgICAgIHJ2LnNldE9uQ2xpY2tQZW5kaW5nSW50ZW50KFIuaWQucmVmcmVzaCwgcmVmcmVzaFBlbmRpbmdJbnRlbnQpOworCisgICAgICAgICAgICBhcHBXaWRnZXRNYW5hZ2VyLnVwZGF0ZUFwcFdpZGdldChhcHBXaWRnZXRJZHNbaV0sIHJ2KTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5vblVwZGF0ZShjb250ZXh0LCBhcHBXaWRnZXRNYW5hZ2VyLCBhcHBXaWRnZXRJZHMpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3dlYXRoZXJsaXN0d2lkZ2V0L1dlYXRoZXJXaWRnZXRTZXJ2aWNlLmphdmEgYi9zYW1wbGVzL1dlYXRoZXJMaXN0V2lkZ2V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3dlYXRoZXJsaXN0d2lkZ2V0L1dlYXRoZXJXaWRnZXRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiYzY4MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvV2VhdGhlckxpc3RXaWRnZXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvd2VhdGhlcmxpc3R3aWRnZXQvV2VhdGhlcldpZGdldFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC53ZWF0aGVybGlzdHdpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3czsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRoZSBmYWN0b3J5IHRvIGJlIGJvdW5kIHRvIHRoZSBjb2xsZWN0aW9uIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBXZWF0aGVyV2lkZ2V0U2VydmljZSBleHRlbmRzIFJlbW90ZVZpZXdzU2VydmljZSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFja1JlbW90ZVZpZXdzRmFjdG9yeSh0aGlzLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLCBpbnRlbnQpOworICAgIH0KK30KKworLyoqCisgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgd2lsbCBwcm92aWRlIGRhdGEgdG8gdGhlIGNvbGxlY3Rpb24gd2lkZ2V0LgorICovCitjbGFzcyBTdGFja1JlbW90ZVZpZXdzRmFjdG9yeSBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgaW50IG1BcHBXaWRnZXRJZDsKKworICAgIHB1YmxpYyBTdGFja1JlbW90ZVZpZXdzRmFjdG9yeShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQXBwV2lkZ2V0SWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQXBwV2lkZ2V0TWFuYWdlci5FWFRSQV9BUFBXSURHRVRfSUQsCisgICAgICAgICAgICAgICAgQXBwV2lkZ2V0TWFuYWdlci5JTlZBTElEX0FQUFdJREdFVF9JRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIC8vIFNpbmNlIHdlIHJlbG9hZCB0aGUgY3Vyc29yIGluIG9uRGF0YVNldENoYW5nZWQoKSB3aGljaCBnZXRzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAgICAvLyBvbkNyZWF0ZSgpLCB3ZSBkbyBub3RoaW5nIGhlcmUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIC8vIEdldCB0aGUgZGF0YSBmb3IgdGhpcyBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICAgIFN0cmluZyBjaXR5ID0gIlVua25vd24gQ2l0eSI7CisgICAgICAgIGludCB0ZW1wID0gMDsKKyAgICAgICAgaWYgKG1DdXJzb3IubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2l0eUNvbEluZGV4ID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleChXZWF0aGVyRGF0YVByb3ZpZGVyLkNvbHVtbnMuQ0lUWSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdGVtcENvbEluZGV4ID0gbUN1cnNvci5nZXRDb2x1bW5JbmRleCgKKyAgICAgICAgICAgICAgICAgICAgV2VhdGhlckRhdGFQcm92aWRlci5Db2x1bW5zLlRFTVBFUkFUVVJFKTsKKyAgICAgICAgICAgIGNpdHkgPSBtQ3Vyc29yLmdldFN0cmluZyhjaXR5Q29sSW5kZXgpOworICAgICAgICAgICAgdGVtcCA9IG1DdXJzb3IuZ2V0SW50KHRlbXBDb2xJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gYSBwcm9wZXIgaXRlbSB3aXRoIHRoZSBwcm9wZXIgY2l0eSBhbmQgdGVtcGVyYXR1cmUuICBKdXN0IGZvciBmdW4sIHdlIGFsdGVybmF0ZQorICAgICAgICAvLyB0aGUgaXRlbXMgdG8gbWFrZSB0aGUgbGlzdCBlYXNpZXIgdG8gcmVhZC4KKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdFN0ciA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5pdGVtX2Zvcm1hdF9zdHJpbmcpOworICAgICAgICBmaW5hbCBpbnQgaXRlbUlkID0gKHBvc2l0aW9uICUgMiA9PSAwID8gUi5sYXlvdXQubGlnaHRfd2lkZ2V0X2l0ZW0KKyAgICAgICAgICAgICAgICA6IFIubGF5b3V0LmRhcmtfd2lkZ2V0X2l0ZW0pOworICAgICAgICBSZW1vdGVWaWV3cyBydiA9IG5ldyBSZW1vdGVWaWV3cyhtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBpdGVtSWQpOworICAgICAgICBydi5zZXRUZXh0Vmlld1RleHQoUi5pZC53aWRnZXRfaXRlbSwgU3RyaW5nLmZvcm1hdChmb3JtYXRTdHIsIHRlbXAsIGNpdHkpKTsKKworICAgICAgICAvLyBTZXQgdGhlIGNsaWNrIGludGVudCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgaXQgYW5kIHNob3cgYSB0b2FzdCBtZXNzYWdlCisgICAgICAgIGZpbmFsIEludGVudCBmaWxsSW5JbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGV4dHJhcy5wdXRTdHJpbmcoV2VhdGhlcldpZGdldFByb3ZpZGVyLkVYVFJBX0NJVFlfSUQsIGNpdHkpOworICAgICAgICBmaWxsSW5JbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7CisgICAgICAgIHJ2LnNldE9uQ2xpY2tGaWxsSW5JbnRlbnQoUi5pZC53aWRnZXRfaXRlbSwgZmlsbEluSW50ZW50KTsKKworICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpIHsKKyAgICAgICAgLy8gV2UgYXJlbid0IGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQgbG9hZGluZyB2aWV3IGluIHRoaXMgc2FtcGxlCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgLy8gVGVjaG5pY2FsbHksIHdlIGhhdmUgdHdvIHR5cGVzIG9mIHZpZXdzICh0aGUgZGFyayBhbmQgbGlnaHQgYmFja2dyb3VuZCB2aWV3cykKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAvLyBSZWZyZXNoIHRoZSBjdXJzb3IKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIG1DdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShXZWF0aGVyRGF0YVByb3ZpZGVyLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL0FuZHJvaWQubWsgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjYWQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisKKyMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0geG1sYWRhcHRlcnMKKworTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PSBkaXNhYmxlZAorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyBVc2UgdGhlIGZvbGxvd2luZyBpbmNsdWRlIHRvIG1ha2Ugb3VyIHRlc3QgYXBrLgorI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFjNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnMiPgorICAgIAorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDb250YWN0c0xpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY29udGFjdHNfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUGhvdG9zTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9waG90b3NfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNzUmVhZGVyQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Jzc19yZWFkZXJfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJ4bWxkb2N1bWVudCIgLz4KKworICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxwPlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFhNTCBhZGFwdGVycy48L3A+CisKKzxwPkFuIFhNTCBBZGFwdGVyIGlzIGFuIFhNTCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGJpbmRpbmdzIGJldHdlZW4gdGhlIGRhdGEKK3JldHJpZXZlZCBmcm9tIGEKKzxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmh0bWwiPjxjb2RlPkNvbnRlbnRQcm92aWRlcjwvY29kZT48L2E+CithbmQgdGhlIGRpZmZlcmVudCB2aWV3cyBvZiBhIGxheW91dC4gVGhleSBhcmUgcHJvdmlkZWQgYnkgdGhlCis8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuaHRtbCI+PGNvZGU+QWRhcHRlcnM8L2NvZGU+PC9hPgorY2xhc3MuPC9wPgorCitUaHJlZSBsaXN0IGFjdGl2aXRpZXMgYXJlIHByb3ZpZGVkIHdoaWNoIGlsbHVzdHJhdGUgdGhpczoKKzx1bD4KKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RzTGlzdEFjdGl2aXR5Lmh0bWwiPjxzdHJvbmc+CisgIENvbnRhY3RzTGlzdEFjdGl2aXR5PC9zdHJvbmc+PC9hPiB1c2VzIHRoZSBkZXZpY2UncyBDb250YWN0cyBwcm92aWRlciBhcyBpdHMgaW5wdXQgc291cmNlLgorICBDb250YWN0cyB3aXRoIGEgcGhvbmUgbnVtYmVyIGFyZSBkaXNwbGF5ZWQsIHRoZWlyIHBob3RvIGJlaW5nIHJldHJpZXZlZCBieSBhIGRlZGljYXRlZAorICA8YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuaHRtbCI+PGNvZGU+Q29udGFjdFBob3RvQmluZGVyCisgIDwvY29kZT48L2E+LjwvbGk+CisKKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Bob3Rvc0xpc3RBY3Rpdml0eS5odG1sIj48c3Ryb25nPgorICBQaG90b3NMaXN0QWN0aXZpdHk8L3N0cm9uZz48L2E+IHJldHJpZXZlcyBhbiBSU1MgcGhvdG8gZmVlZCBhbmQgZGlzcGxheXMgdGhlIGltYWdlcyBhbmQgdGhlaXIKKyAgdGl0bGVzLiBUaGUgaW1hZ2VzIGFyZSBkb3dubG9hZGVkIGZyb20gdGhlIFVSTCBmb3VuZCBpbiB0aGUgZmVlZCB1c2luZyB0aGUKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvSW1hZ2VEb3dubG9hZGVyLmh0bWwiPjxjb2RlPkltYWdlRG93bmxvYWRlcjwvY29kZT4KKyAgPC9hPiBoZWxwZXIgY2xhc3MuPC9saT4KKworICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuaHRtbCI+PHN0cm9uZz4KKyAgUnNzUmVhZGVyQWN0aXZpdHk8L3N0cm9uZz48L2E+IGFsc28gZGlzcGxheXMgaXRlbXMgZXh0cmFjdGVkIGZyb20gYW4gUlNTIGZlZWQuIEFuIGFkZGl0aW9uYWwKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW50ZW50TGlzdGVuZXIuaHRtbCI+PGNvZGU+VXJsSW50ZW50TGlzdGVuZXIKKyAgPC9jb2RlPjwvYT4gaXMgdXNlZCB0byBvcGVuIGEgYnJvd3NlciB3aGVuIG9uZSBvZiB0aGUgbmV3cyBpdGVtIGlzIHRhcHBlZC48L2xpPgorPC91bD4KKworPGltZyBhbHQ9IlhtbFBob3Rvc0FkYXB0ZXIiIHNyYz0iLi4vaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIiAvPgorPGltZyBhbHQ9IlhtbFJzc1JlYWRlciIgc3JjPSIuLi9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZyIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA1NjVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvZHJhd2FibGUtaGRwaS9pY19jb250YWN0X3BpY3R1cmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjAzMmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvZHJhd2FibGUtbWRwaS9pY19jb250YWN0X3BpY3R1cmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L2NvbnRhY3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjEwOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPiAgICAKKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYzAxOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0c19saXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIAorPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ub19jb250YWN0cyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCis8L21lcmdlPiAgICAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9waG90b19pdGVtLnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9waG90b19pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRiMTQzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3RvX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9waG90byIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZGlwIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3Rvc19saXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9waG90b3NfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1NmYzNwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9waG90b3NfbGlzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ub19waG90b3MiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKworPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZF9pdGVtLnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTc1YWVjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2l0ZW1fbGF5b3V0IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPgorCisgICAgICAgPEltYWdlVmlldworICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ltYWdlIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiIC8+CisKKyAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZHNfbGlzdC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcnNzX2ZlZWRzX2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjFkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcnNzX2ZlZWRzX2xpc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVyZ2UgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbm9fcnNzX2ZlZWQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKworPC9tZXJnZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOGFiNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisKKyAgICA8IS0tIEFkYXB0ZXIgdXNlZCB0byBiaW5kIGN1cnNvcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyIj4KKyAgICAgICAgPCEtLSBVUkkgdG8gZ2V0IHRoZSBjdXJzb3IgZnJvbS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ1cmkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNlbGVjdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzZWxlY3Rpb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNvcnQgb3JkZXIgc3RhdGVtZW50IGZvciB0aGUgcXVlcnkuIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic29ydE9yZGVyIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBMYXlvdXQgcmVzb3VyY2UgdXNlZCB0byBkaXNwbGF5IGVhY2ggcm93IGZyb20gdGhlIGN1cnNvci4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gYmluZCBpdGVtcyBmb3IgWE1MIGN1cnNvciBhZGFwdGVycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idG8iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIGJpbmRpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHR5cGUgd2lsbCBiZQorICAgICAgICAgICAgIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlICJ0byIgdGFyZ2V0IHZpZXcuIE1hbmRhdG9yeS4KKworICAgICAgICAgICAgIFRoZSB0eXBlIGNhbiBiZSBvbmUgb2Y6CisgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT5zdHJpbmcsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBibG9iIGRlc2NyaWJpbmcgYW4gaW1hZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UtdXJpLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgVVJJIHRvIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmRyYXdhYmxlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYSBkcmF3YWJsZS48L2xpPgorICAgICAgICAgICAgIDxsaT5BIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBjb3JyZXNwb25kaW5nIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlci48L2xpPgorICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYXMiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCBpbiBzZWxlY3QgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QuIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIG1hcCB2YWx1ZXMgdG8gbmV3IHZhbHVlcyBpbiBYTUwgY3Vyc29yIGFkYXB0ZXJzJyBiaW5kIGl0ZW1zLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9NYXBJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0b1ZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0iPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBNYW5kYXRvcnkgaWYgIndpdGhDbGFzcyIgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhFeHByZXNzaW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHJhbnNmb3JtYXRpb24gY2xhc3MsIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24uIE1hbmRhdG9yeSBpZiAid2l0aEV4cHJlc3Npb24iCisgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhDbGFzcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlMTU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiPlhtbCBBZGFwdGVyczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdHNfbGlzdF9hY3Rpdml0eSI+WG1sIENvbnRhY3RzIEFkYXB0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBob3Rvc19saXN0X2FjdGl2aXR5Ij5YbWwgUGhvdG9zIEFkYXB0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJzc19yZWFkZXJfYWN0aXZpdHkiPlhtbCBSU1MgUmVhZGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19jb250YWN0cyI+Tm8gY29udGFjdHMgYXZhaWxhYmxlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19waG90b3MiPkxvYWRpbmcgcGhvdG9zLi4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19yc3NfZmVlZCI+TG9hZGluZyBSU1MgZmVlZC4uLjwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9jb250YWN0cy54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvY29udGFjdHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTg1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvY29udGFjdHMueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycyIKKyAgYXBwOnVyaT0iY29udGVudDovL2NvbS5hbmRyb2lkLmNvbnRhY3RzL2NvbnRhY3RzIgorICBhcHA6c2VsZWN0aW9uPSJoYXNfcGhvbmVfbnVtYmVyPTEiCisgIGFwcDpsYXlvdXQ9IkBsYXlvdXQvY29udGFjdF9pdGVtIj4KKworICA8YmluZCBhcHA6ZnJvbT0iZGlzcGxheV9uYW1lIiBhcHA6dG89IkBpZC9uYW1lIiBhcHA6YXM9InN0cmluZyIgLz4KKyAgPGJpbmQgYXBwOmZyb209InN0YXJyZWQiIGFwcDp0bz0iQGlkL3N0YXIiIGFwcDphcz0iZHJhd2FibGUiPgorICAgICAgICA8bWFwIGFwcDpmcm9tVmFsdWU9IjAiIGFwcDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8+CisgICAgICAgIDxtYXAgYXBwOmZyb21WYWx1ZT0iMSIgYXBwOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvPgorICA8L2JpbmQ+CisgIDxiaW5kIGFwcDpmcm9tPSJfaWQiIGFwcDp0bz0iQGlkL25hbWUiIGFwcDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9waG90b3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTg4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycyIKKyAgICBhcHA6c2VsZWN0aW9uPSIvZmVlZC9lbnRyeSIKKyAgICBhcHA6bGF5b3V0PSJAbGF5b3V0L3Bob3RvX2l0ZW0iPgorCisgICAgPGJpbmQgYXBwOmZyb209Ii9zdW1tYXJ5IiBhcHA6dG89IkBpZC90aXRsZSIgYXBwOmFzPSJzdHJpbmciIC8+CisgICAgPGJpbmQgYXBwOmZyb209Ii9tZWRpYTpncm91cC9tZWRpYTp0aHVtYm5haWxcQHVybCIgYXBwOnRvPSJAaWQvcGhvdG8iCisgICAgICBhcHA6YXM9ImNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnMuVXJsSW1hZ2VCaW5kZXIiIC8+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcnNzX2ZlZWQueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL3Jzc19mZWVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg4NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL3Jzc19mZWVkLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycyIKKyAgICBhcHA6c2VsZWN0aW9uPSIvcnNzL2NoYW5uZWwvaXRlbSIKKyAgICBhcHA6bGF5b3V0PSJAbGF5b3V0L3Jzc19mZWVkX2l0ZW0iPgorCisgICAgPGJpbmQgYXBwOmZyb209Ii90aXRsZSIgYXBwOnRvPSJAaWQvdGl0bGUiIGFwcDphcz0ic3RyaW5nIiAvPgorICAgIDxiaW5kIGFwcDpmcm9tPSIvbWVkaWE6Y29udGVudEB1cmwiIGFwcDp0bz0iQGlkL2ltYWdlIiBhcHA6YXM9ImNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnMuVXJsSW1hZ2VCaW5kZXIiLz4KKyAgICA8YmluZCBhcHA6ZnJvbT0iL21lZGlhOmRlc2NyaXB0aW9uIiBhcHA6dG89IkBpZC9kZXNjcmlwdGlvbiIgYXBwOmFzPSJzdHJpbmciIC8+CisgICAgPGJpbmQgYXBwOmZyb209Ii9ndWlkIiBhcHA6dG89IkBpZC9pdGVtX2xheW91dCIgYXBwOmFzPSJ0YWciIC8+CisgICAgPGJpbmQgYXBwOmZyb209Ii9wdWJEYXRlIiBhcHA6dG89IkBpZC9kYXRlIiBhcHA6YXM9InN0cmluZyI+CisgICAgICAgPHRyYW5zZm9ybSBhcHA6d2l0aEV4cHJlc3Npb249IlB1Ymxpc2hlZCBvbiB7L3B1YkRhdGV9LiIgLz4KKyAgICA8L2JpbmQ+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0FkYXB0ZXJzLmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0Nzk0YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvQWRhcHRlcnMuamF2YQpAQCAtMCwwICsxLDEyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnM7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogPHA+VGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBsb2FkIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyIGFkYXB0ZXJzfSBkZWZpbmVkIGluCisgKiBYTUwgcmVzb3VyY2VzLiBYTUwtZGVmaW5lZCBhZGFwdGVycyBjYW4gYmUgdXNlZCB0byBlYXNpbHkgY3JlYXRlIGFkYXB0ZXJzIGluIHlvdXIKKyAqIG93biBhcHBsaWNhdGlvbiBvciB0byBwYXNzIGFkYXB0ZXJzIHRvIG90aGVyIHByb2Nlc3Nlcy48L3A+CisgKiAKKyAqIDxoMj5UeXBlcyBvZiBhZGFwdGVyczwvaDI+CisgKiA8cD5BZGFwdGVycyBkZWZpbmVkIHVzaW5nIFhNTCByZXNvdXJjZXMgY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3VwcG9ydGVkCisgKiB0eXBlcy4gQXJiaXRyYXJ5IGFkYXB0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIHRvIGd1YXJhbnRlZSB0aGUgc2FmZXR5IG9mIHRoZSBsb2FkZWQKKyAqIGNvZGUgd2hlbiBhZGFwdGVycyBhcmUgbG9hZGVkIGFjcm9zcyBwYWNrYWdlcy48L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXIiPkN1cnNvciBhZGFwdGVyPC9hPjogYSBjdXJzb3IgYWRhcHRlciBjYW4gYmUgdXNlZAorICogIHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYSBjdXJzb3IsIG1vc3Qgb2Z0ZW4gY29taW5nIGZyb20gYSBjb250ZW50IHByb3ZpZGVyPC9saT4KKyAqIDwvdWw+CisgKiA8cD5UaGUgY29tcGxldGUgWE1MIGZvcm1hdCBkZWZpbml0aW9uIG9mIGVhY2ggYWRhcHRlciB0eXBlIGlzIGF2YWlsYWJsZSBiZWxvdy48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlciI+PC9hPgorICogPGgyPkN1cnNvciBhZGFwdGVyPC9oMj4KKyAqIDxwPkEgY3Vyc29yIGFkYXB0ZXIgWE1MIGRlZmluaXRpb24gc3RhcnRzIHdpdGggdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXRhZyI+PGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPjwvYT4KKyAqIHRhZyBhbmQgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIHRoZSBmb2xsb3dpbmcgdGFnczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyI+PGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+PC9hPjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48L2E+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBBZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBBZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48L2E+CisgKiA8aDM+Jmx0O3NlbGVjdCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgY3Vyc29yCisgKiB3aGVuIGRvaW5nIHRoZSBxdWVyeS4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB1c2luZyB0cmFuc2Zvcm1hdGlvbnMgaW4gdGhlCisgKiA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gZWxlbWVudHMuIEl0IGNhbiBhbHNvIGJlIHZlcnkgdXNlZnVsIGlmIHlvdSBhcmUgcHJvdmlkaW5nCisgKiB5b3VyIG93biA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+YmluZGVyPC9hPiBvcgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPnRyYW5zZm9ybWF0aW9uPC9hPiBjbGFzc2VzLgorICogPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIGlnbm9yZWQgaWYgeW91IHN1cHBseSB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmNvbHVtbjwvY29kZT46IE5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QgaW4gdGhlIGN1cnNvciBkdXJpbmcgdGhlCisgKiAgcXVlcnkgb3BlcmF0aW9uPC9saT4KKyAqIDwvdWw+CisgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjb2x1bW4gbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiBpcyBhbHdheXMgaW1wbGljaXRseQorICogc2VsZWN0ZWQuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjwvYT4KKyAqIDxoMz4mbHQ7YmluZCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIGJpbmQgYSBjb2x1bW4gZnJvbSB0aGUgY3Vyc29yIHRvCisgKiBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30uIEEgY29sdW1uIGJvdW5kIHVzaW5nIHRoaXMgdGFnIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQKKyAqIGR1cmluZyB0aGUgcXVlcnkgYW5kIGEgbWF0Y2hpbmcKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHRoZXJlZm9yZQorICogbm90IHJlcXVpcmVkLjwvcD4KKyAqIAorICogPHA+RWFjaCBiaW5kaW5nIGlzIGRlY2xhcmVkIGFzIGEgb25lIHRvIG9uZSBtYXRjaGluZyBidXQKKyAqIGN1c3RvbSBiaW5kZXIgY2xhc3NlcyBvciBzcGVjaWFsCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10cmFuc2Zvcm1hdGlvbiI+ZGF0YSB0cmFuc2Zvcm1hdGlvbnM8L2E+IGNhbgorICogYWxsb3cgeW91IHRvIGJpbmQgc2V2ZXJhbCBjb2x1bW5zIHRvIGEgc2luZ2xlIHZpZXcuIEluIHRoaXMgY2FzZSB5b3UgbXVzdCB1c2UgdGhlCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyB0byBtYWtlCisgKiBzdXJlIGFueSByZXF1aXJlZCBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcXVlcnkuPC9wPgorICogCisgKiA8cD5UaGUgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IHRhZyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb208L2NvZGU+OiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuIE5vdGUgdGhhdCA8Y29kZT5APC9jb2RlPiB3aGljaCBhcmUgbm90IHVzZWQgdG8gcmVmZXJlbmNlIHJlc291cmNlcworICogIHNob3VsZCBiZSBiYWNrc2xhc2ggcHJvdGVjdGVkIGFzIGluIDxjb2RlPlxAPC9jb2RlPi48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvPC9jb2RlPjogVGhlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmFzPC9jb2RlPjogVGhlIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj5kYXRhIHR5cGU8L2E+CisgKiAgb2YgdGhlIGJpbmRpbmcuIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS48L2xpPgorICogPC91bD4KKyAqIAorICogPHA+SW4gYWRkaXRpb24sIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBpbnN0YW5jZXMgb2YKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2hpbGRyZW4KKyAqIHRhZ3MuPC9wPgorICoKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPjwvYT4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBBZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iPjwvYT4KKyAqIDxoND5CaW5kaW5nIHRyYW5zZm9ybWF0aW9uczwvaDQ+CisgKiA8cD5XaGVuIGRlZmluaW5nIGEgZGF0YSBiaW5kaW5nIHlvdSBjYW4gc3BlY2lmeSBhbiBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBieSB1c2luZyBvbmUKKyAqIG9mIHRoZSBmb2xsb3dpbmcgdGFncyBhcyBhIGNoaWxkIG9mIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT46IE1hcHMgYSBjb25zdGFudCBzdHJpbmcgdG8gYSBzdHJpbmcgb3IgYSByZXNvdXJjZS4gVXNlCisgKiAgb25lIGluc3RhbmNlIG9mIHRoaXMgdGFnIHBlciB2YWx1ZSB5b3Ugd2FudCB0byBtYXA8L2xpPgorICogIDxsaT48Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPjogVHJhbnNmb3JtcyBhIGNvbHVtbidzIHZhbHVlIHVzaW5nIGFuIGV4cHJlc3Npb24KKyAqICBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqIDwvdWw+CisgKiA8cD5XaGlsZSBzZXZlcmFsIDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IHRhZ3MgY2FuIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZSwgeW91IGNhbm5vdAorICogbWl4IDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzLiBJZiBzZXZlcmFsCisgKiA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzIGFyZSBzcGVjaWZpZWQsIG9ubHkgdGhlIGxhc3Qgb25lIGlzIHJldGFpbmVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tbWFwIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7bWFwIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBtYXAgZWxlbWVudCBzaW1wbHkgc3BlY2lmaWVzIGEgdmFsdWUgdG8gbWF0Y2ggZnJvbSBhbmQgYSB2YWx1ZSB0byBtYXRjaCB0by4gV2hlbgorICogYSBjb2x1bW4ncyB2YWx1ZSBlcXVhbHMgdGhlIHZhbHVlIHRvIG1hdGNoIGZyb20sIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIHRvIG1hdGNoCisgKiB0by4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb21WYWx1ZTwvY29kZT46IFRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggdG8uIFRoaXMgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHN0cmluZworICogIG9yIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gVGhpcyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkZW50aWZpZXIgd2hlbiB0aGUKKyAqICBkYXRhIGJpbmRpbmcgaXMgb2YgdHlwZSA8Y29kZT5kcmF3YWJsZTwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeTwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbi10cmFuc2Zvcm0iPjwvYT4KKyAqIDxwPjxzdHJvbmc+Jmx0O3RyYW5zZm9ybSAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgc2ltcGxlIHRyYW5zZm9ybSB0aGF0IG9jY3VycyBlaXRoZXIgYnkgY2FsbGluZyBhIHNwZWNpZmllZCBjbGFzcyBvciBieSBwZXJmb3JtaW5nCisgKiBzaW1wbGUgdGV4dCBzdWJzdGl0dXRpb24uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp3aXRoRXhwcmVzc2lvbjwvY29kZT46IFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBUaGUgZXhwcmVzc2lvbiBpcworICogIGEgc3RyaW5nIGNvbnRhaW5pbmcgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgd2l0aCBjdXJseSBicmFjZXMgeyBhbmQgfS4gRHVyaW5nIHRoZQorICogIHRyYW5zZm9ybWF0aW9uIGVhY2ggY29sdW1uIG5hbWUgaXMgcmVwbGFjZWQgYnkgaXRzIHZhbHVlLiBBbGwgY29sdW1ucyBtdXN0IGhhdmUgYmVlbgorICogIHNlbGVjdGVkIGluIHRoZSBxdWVyeS4gQW4gZXhhbXBsZSBvZiBleHByZXNzaW9uIGlzIDxjb2RlPiJGaXJzdCBuYW1lOiB7Zmlyc3RfbmFtZX0sCisgKiAgbGFzdCBuYW1lOiB7bGFzdF9uYW1lfSI8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkKKyAqICBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4gaXMgbm90IHNwZWNpZmllZCBhbmQgaWdub3JlZCBpZiA8Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT4KKyAqICBpcyBzcGVjaWZpZWQ8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhDbGFzczwvY29kZT46IEEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29ycmVzcG9uZGluZyB0byBhbgorICogIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn0uIEN1c3RvbQorICogIHRyYW5zZm9ybWF0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4KKyAqICBhbiBhcHAgd2lkZ2V0IFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeSBpZiA8Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPiBpcworICogIG5vdCBzcGVjaWZpZWQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGgzPkV4YW1wbGU8L2gzPgorICogPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjdXJzb3IgYWRhcHRlciB0aGF0IHF1ZXJpZXMgYWxsIHRoZSBjb250YWN0cyB3aXRoCisgKiBhIHBob25lIG51bWJlciB1c2luZyB0aGUgY29udGFjdHMgY29udGVudCBwcm92aWRlci4gRWFjaCBjb250YWN0IGlzIGRpc3BsYXllZCB3aXRoCisgKiBpdHMgZGlzcGxheSBuYW1lLCBpdHMgZmF2b3JpdGUgc3RhdHVzIGFuZCBpdHMgcGhvdG8uIFRvIGRpc3BsYXkgcGhvdG9zLCBhIGN1c3RvbSBkYXRhCisgKiBiaW5kZXIgaXMgZGVjbGFyZWQ6PC9wPgorICogCisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6dXJpPSJjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvY29udGFjdHMiCisgKiAgICAgYW5kcm9pZDpzZWxlY3Rpb249Imhhc19waG9uZV9udW1iZXI9MSIKKyAqICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9jb250YWN0X2l0ZW0iJmd0OworICoKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209ImRpc3BsYXlfbmFtZSIgYW5kcm9pZDp0bz0iQGlkL25hbWUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLyZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209InN0YXJyZWQiIGFuZHJvaWQ6dG89IkBpZC9zdGFyIiBhbmRyb2lkOmFzPSJkcmF3YWJsZSImZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjAiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb2ZmIiAvJmd0OworICogICAgICAgICAmbHQ7bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIxIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvJmd0OworICogICAgICZsdDsvYmluZCZndDsKKyAqICAgICAmbHQ7YmluZCBhbmRyb2lkOmZyb209Il9pZCIgYW5kcm9pZDp0bz0iQGlkL25hbWUiCisgKiAgICAgICAgICAgICAgYW5kcm9pZDphcz0iY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QuYWRhcHRlcnMuQ29udGFjdFBob3RvQmluZGVyIiAvJmd0OworICoKKyAqICZsdDsvY3Vyc29yLWFkYXB0ZXImZ3Q7CisgKiA8L3ByZT4KKyAqIAorICogPGgzPlJlbGF0ZWQgQVBJczwvaDM+CisgKiA8dWw+CisgKiAgPGxpPntAbGluayBBZGFwdGVycyNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIEFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIEFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBBZGFwdGVycy5DdXJzb3JCaW5kZXJ9PC9saT4KKyAqICA8bGk+e0BsaW5rIEFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfTwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXIKKyAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICogCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0CisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc2VsZWN0aW9uCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc29ydE9yZGVyCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fYXMKKyAqIGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9mcm9tCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX2Zyb21WYWx1ZQorICogYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZQorICogYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW1fY29sdW1uCisgKiBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoQ2xhc3MKKyAqIGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY1JlZmVyZW5jZSJ9KQorcHVibGljIGNsYXNzIEFkYXB0ZXJzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1IgPSAiY3Vyc29yLWFkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gYmluZCBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0gY29sdW1uIHRvIGEgVmlldy4gVGhpcworICAgICAqIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGJpbmRpbmdzIGZvciBkYXRhIHR5cGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEFkYXB0ZXJzfS48L3A+CisgICAgICogCisgICAgICogPHA+QSBiaW5kZXIgaXMgcHJvdmlkZWQgd2l0aCBhIGN1cnNvciB0cmFuc2Zvcm1hdGlvbiB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkCisgICAgICogdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgY3Vyc29yLiBUaGUgdHJhbnNmb3JtYXRpb24gaXMgZ3VhcmFudGVlZAorICAgICAqIHRvIG5ldmVyIGJlIG51bGwgc28gaXQncyBhbHdheXMgc2FmZSB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBiaW5kZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgQ29udGV4dCBidXQgY2FuIGJlIHJlLXVzZWQgd2l0aCBtdWx0aXBsZSBjdXJzb3JzLgorICAgICAqIEFzIHN1Y2gsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSBDdXJzb3IgaW4gdXNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LlZpZXcgCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEN1cnNvckJpbmRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgbmV2ZXIKKyAgICAgICAgICogbnVsbCBhbmQgbWF5IG9yIG1heSBub3QgYmUgYXBwbGllZCB0byB0aGUgQ3Vyc29yIGRhdGEgZHVyaW5nIHRoZQorICAgICAgICAgKiB7QGxpbmsgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpfSBvcGVyYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSAjYmluZChhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIGludCkgCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gbVRyYW5zZm9ybWF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IEN1cnNvciBiaW5kZXIuPC9wPiAKKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIFRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMKKyAgICAgICAgICogICAgICAgIHRyYW5zZm9ybWF0aW9uIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgYnkgdGhlIGJpbmRlciBhbmQgaXMgZ3VhcmFudGVlZAorICAgICAgICAgKiAgICAgICAgdG8gbm90IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkJpbmRzIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiB0byB0aGUgc3VwcGxpZWQgVmlldy4gVGhlIGJpbmRpbmcgb3BlcmF0aW9uCisgICAgICAgICAqIGNhbiBxdWVyeSBvdGhlciBDdXJzb3IgY29sdW1ucyBhcyBuZWVkZWQuIER1cmluZyB0aGUgYmluZGluZyBvcGVyYXRpb24sIHZhbHVlcworICAgICAgICAgKiByZXRyaWV2ZWQgZnJvbSB0aGUgQ3Vyc29yIG1heSBvciBtYXkgbm90IGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRoaXMgYmluZGVyJ3MKKyAgICAgICAgICogY3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGJpbmQgZGF0YSB0by4KKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGJpbmQgZGF0YSBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGNvbHVtbiBpbmRleCBpbiB0aGUgY3Vyc29yIHdoZXJlIHRoZSBkYXRhIHRvIGJpbmQgcmVzaWRlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI21UcmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb2x1bW4gd2FzIHN1Y2Nlc3NmdWxseSBib3VuZCB0byB0aGUgVmlldywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gdHJhbnNmb3JtIGRhdGEgY29taW5nIG91dCBvZiBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0KKyAgICAgKiBiZWZvcmUgaXQgaXMgYm91bmQgdG8gYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UcmFuc2Zvcm1hdGlvbnMgYXJlIHVzZWQgdG8gdHJhbnNmb3JtIHRleHQtYmFzZWQgZGF0YSAoaW4gdGhlIGZvcm0gb2YgYSBTdHJpbmcpLAorICAgICAqIG9yIHRvIHRyYW5zZm9ybSBkYXRhIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKKyAgICAgKiB0byBnZW5lcmF0ZSByZXNvdXJjZSBpZGVudGlmaWVycy48L3A+CisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgQWRhcHRlcnMuQ3Vyc29yQmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIFN0cmluZy4gVGhlIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gYXMgYSBTdHJpbmcgKHRoaXMgaXMga25vd24KKyAgICAgICAgICogYXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uKSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50LiBGb3IgaW5zdGFuY2UsCisgICAgICAgICAqIGEgdHJhbnNmb3JtYXRpb24gY2FuIHBlcmZvcm0gdGV4dCBzdWJzdGl0dXRpb25zIG9yIGNvbmNhdGVuYXRlIG90aGVyCisgICAgICAgICAqIGNvbHVtbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBvZiB0aGUgY29sdW1uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBpbnRlcnByZXRzIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4KKyAgICAgICAgICogYXMgYW4gaW50ZWdlci48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUmVzb3VyY2UoQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldEludChjb2x1bW5JbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyB1cmksCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnNldFVyaSh1cmkpOworICAgICAgICB9CisgICAgICAgIGFkYXB0ZXIubG9hZCgpOworCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0gZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogWE1MIHJlc291cmNlLiBUaGUgY29udGVudCBvZiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGN1cnNvci4KKyAgICAgKiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgc3VwcGxpZWQgY3Vyc29yLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGNvbnRhaW5pbmcgdGhlIGRhdGEgZm9yIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSAjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5jaGFuZ2VDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBYTUwgZGVmaW5pdGlvbiBvZgorICAgICAqIHRoZSBhZGFwdGVyIG11c3QgZm9sbG93IHRoZSBmb3JtYXQgZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIHN1cHBvcnRlZCBhZGFwdGVyCisgICAgICogdHlwZXMgZGVzY3JpYmVkIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBsb2FkZWQgYWRhcHRlciBpcyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIGFuZCB0aGUgc3VwcGxpZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBpcyBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LAorICAgICAqIHRoZSBjdXJzb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwKKyAgICAgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyLgorICAgICAqICAKKyAgICAgKiBAcmV0dXJuIEFuIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHNlZSAjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKQorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCYXNlQWRhcHRlciBsb2FkQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgZmluYWwgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBudWxsLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNYW5hZ2VkQWRhcHRlcikgeworICAgICAgICAgICAgKChNYW5hZ2VkQWRhcHRlcikgYWRhcHRlcikubG9hZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFuIGFkYXB0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIG9wdGlvbmFsIGFzc2VydE5hbWUgY2FuCisgICAgICogYmUgdXNlZCB0byBleGl0IGVhcmx5IGlmIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIFhNTCByZXNvdXJjZSBpcyBub3Qgb2YgdGhlCisgICAgICogZXhwZWN0ZWQgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQgZGVmaW5pbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGFzc2VydE5hbWUgVGhlIG1hbmRhdG9yeSBuYW1lIG9mIHRoZSBhZGFwdGVyIGluIHRoZSBYTUwgZG9jdW1lbnQuCisgICAgICogICAgICAgIElnbm9yZWQgaWYgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYWRhcHRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyBhc3NlcnROYW1lLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoaWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKGNvbnRleHQsIHBhcnNlciwgWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlciksCisgICAgICAgICAgICAgICAgICAgIGlkLCBwYXJhbWV0ZXJzLCBhc3NlcnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBhZGFwdGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgWE1MIHBhcnNlci4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKKyAgICAgKiBmb3IgY2hvb3NpbmcgdGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIgdG8gY3JlYXRlIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAqIFhNTCBwYXJzZXIuCisgICAgICogCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBnZW5lcmF0ZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZgorICAgICAqIDxjb2RlPmFzc2VydE5hbWU8L2NvZGU+IGlzIG5vdCBudWxsIGFuZCBkb2VzIG5vdCBtYXRjaCB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTAorICAgICAqIGRvY3VtZW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKENvbnRleHQgYywKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCwgT2JqZWN0W10gcGFyYW1ldGVycywKKyAgICAgICAgICAgIFN0cmluZyBhc3NlcnROYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoYXNzZXJ0TmFtZSAhPSBudWxsICYmICFhc3NlcnROYW1lLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhZGFwdGVyIGRlZmluZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSArICIgbXVzdCBiZSBhIDwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5hbWUgKyAiIC8+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVyID0gY3JlYXRlQ3Vyc29yQWRhcHRlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCwgcGFyYW1ldGVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gYWRhcHRlciBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gIiArIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGFwdGVyOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxDdXJzb3JBZGFwdGVyIHVzaW5nIGFuIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sQ3Vyc29yQWRhcHRlciBjcmVhdGVDdXJzb3JBZGFwdGVyKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsCisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCwgT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyKGMsIHBhcnNlciwgYXR0cnMsIGlkKS5wYXJzZShwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXIgdGhhdCBjYW4gZ2VuZXJhdGUgWG1sQ3Vyc29yQWRhcHRlciBpbnN0YW5jZXMuIFRoaXMgcGFyc2VyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIGhhbmRsaW5nIGFsbCB0aGUgYXR0cmlidXRlcyBhbmQgY2hpbGQgbm9kZXMgZm9yIGEgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbEN1cnNvckFkYXB0ZXJQYXJzZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQklORCA9ICJiaW5kIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX1NFTEVDVCA9ICJzZWxlY3QiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HID0gInN0cmluZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRSA9ICJpbWFnZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19UQUcgPSAidGFnIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSSA9ICJpbWFnZS11cmkiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUgPSAiZHJhd2FibGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfTUFQID0gIm1hcCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0gPSAidHJhbnNmb3JtIjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgWG1sUHVsbFBhcnNlciBtUGFyc2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZVNldCBtQXR0cnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IG1CaW5kZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1Gcm9tOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtVG87CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gbUlkZW50aXR5OworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlcyBtUmVzb3VyY2VzOworCisgICAgICAgIHB1YmxpYyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyKENvbnRleHQgYywgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGM7CisgICAgICAgICAgICBtUGFyc2VyID0gcGFyc2VyOworICAgICAgICAgICAgbUF0dHJzID0gYXR0cnM7CisgICAgICAgICAgICBtSWQgPSBpZDsKKworICAgICAgICAgICAgbVJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgbUJpbmRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4oKTsKKyAgICAgICAgICAgIG1Gcm9tID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBtVG8gPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICBtSWRlbnRpdHkgPSBuZXcgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihtQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlciBwYXJzZShPYmplY3RbXSBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG1SZXNvdXJjZXM7CisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsIFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl91cmkpOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGEuZ2V0U3RyaW5nKFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIgPSBhLmdldFN0cmluZyhSLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfbGF5b3V0LCAwKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBsYXlvdXQgc3BlY2lmaWVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG1QYXJzZXI7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpICYmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9CSU5ELmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUJpbmRUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX1NFTEVDVC5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VTZWxlY3RUYWcoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biB0YWcgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gZnJvbUFycmF5ID0gbUZyb20udG9BcnJheShuZXcgU3RyaW5nW21Gcm9tLnNpemUoKV0pOworICAgICAgICAgICAgaW50W10gdG9BcnJheSA9IG5ldyBpbnRbbVRvLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b0FycmF5W2ldID0gbVRvLmdldChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVycy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzW2ldID0gKFN0cmluZykgcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlcihtQ29udGV4dCwgbGF5b3V0LCB1cmksIGZyb21BcnJheSwgdG9BcnJheSwgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIsIG1CaW5kZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdFRhZygpIHsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IG1SZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbSk7CisKKyAgICAgICAgICAgIFN0cmluZyBmcm9tTmFtZSA9IGEuZ2V0U3RyaW5nKFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb21OYW1lID0gYS5nZXRTdHJpbmcoUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9mcm9tKTsKKyAgICAgICAgICAgIGlmIChmcm9tTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBiaW5kIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgaGF2ZSBhICdmcm9tJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHRvTmFtZSA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyk7CisgICAgICAgICAgICBpZiAoYXNUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIGJpbmQgaXRlbSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBkb2VzIG5vdCBoYXZlIGFuICdhcycgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Gcm9tLmFkZChmcm9tTmFtZSk7CisgICAgICAgICAgICBtVG8uYWRkKHRvTmFtZSk7CisgICAgICAgICAgICBtQmluZGVycy5wdXQoZnJvbU5hbWUsIGZpbmRCaW5kZXIoYXNUeXBlKSk7CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JCaW5kZXIgZmluZEJpbmRlcihTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBtSWRlbnRpdHk7CisKKyAgICAgICAgICAgIGludCB0YWdUeXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNEcmF3YWJsZSA9IEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFLmVxdWFscyh0eXBlKTsKKworICAgICAgICAgICAgd2hpbGUgKCgodGFnVHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAodGFnVHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGZpbmRUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfTUFQLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISh0cmFuc2Zvcm1hdGlvbiBpbnN0YW5jZW9mIE1hcFRyYW5zZm9ybWF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBuZXcgTWFwVHJhbnNmb3JtYXRpb24oY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluZE1hcCgoKE1hcFRyYW5zZm9ybWF0aW9uKSB0cmFuc2Zvcm1hdGlvbiksIGlzRHJhd2FibGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1NUUklORy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX1RBRy5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhZ0JpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZVVyaUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYXdhYmxlQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRlcih0eXBlLCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBjcmVhdGVCaW5kZXIoU3RyaW5nIHR5cGUsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobUNvbnRleHQuaXNSZXN0cmljdGVkKCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZSh0eXBlLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ3Vyc29yQmluZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDdXJzb3JCaW5kZXIpIGMubmV3SW5zdGFuY2UobUNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBmaW5kTWFwKE1hcFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uLCBib29sZWFuIGRyYXdhYmxlKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX01hcEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbSA9IGEuZ2V0U3RyaW5nKFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKFIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFN0cmluZ01hcHBpbmcoZnJvbSwgdG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgdG8gPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUsIDApOworICAgICAgICAgICAgICAgIGlmICh0byA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkUmVzb3VyY2VNYXBwaW5nKGZyb20sIHRvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGZpbmRUcmFuc2Zvcm1hdGlvbigpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24gPSBudWxsOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhDbGFzcyk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9IGEuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBtQ29udGV4dC5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEN1cnNvclRyYW5zZm9ybWF0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGMgPSBrbGFzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoQ29udGV4dC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IChDdXJzb3JUcmFuc2Zvcm1hdGlvbikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgdHJhbnNmb3JtIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIiBtdXN0IGhhdmUgYSAnd2l0aENsYXNzJyBvciAiICsKKyAgICAgICAgICAgICAgICAgICAgIid3aXRoRXhwcmVzc2lvbicgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yVHJhbnNmb3JtYXRpb24gY3JlYXRlRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihtQ29udGV4dCwgZXhwcmVzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBhZGFwdGVycyB0aGF0IHJlcXVpcmUgdG8gYmUgbG9hZGVkIGFmdGVyIGNyZWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBNYW5hZ2VkQWRhcHRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkcyB0aGUgY29udGVudCBvZiB0aGUgYWRhcHRlciwgYXN5bmNocm9ub3VzbHkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIEN1cnNvciBhZGFwdGVyIGRlZmluZWQgaW4gWE1MLiBUaGlzIGNsYXNzIGlzIGEgdGhpbiB3cmFwcGVyCisgICAgICogb2YgYSBTaW1wbGVDdXJzb3JBZGFwdGVyLiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoZSBhYmlsaXR5IHRvIGhhbmRsZSBDdXJzb3JCaW5kZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVDdXJzb3JBZGFwdGVyIGltcGxlbWVudHMgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtVXJpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU2VsZWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1TZWxlY3Rpb25BcmdzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU29ydE9yZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1Db2x1bW5zOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvckJpbmRlcltdIG1CaW5kZXJzOworICAgICAgICBwcml2YXRlIEFzeW5jVGFzazxWb2lkLFZvaWQsQ3Vyc29yPiBtTG9hZFRhc2s7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBsYXlvdXQsIFN0cmluZyB1cmksIFN0cmluZ1tdIGZyb20sIGludFtdIHRvLAorICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIsCisgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEN1cnNvckJpbmRlcj4gYmluZGVycykgeworCisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBsYXlvdXQsIG51bGwsIGZyb20sIHRvKTsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgICAgICBtU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgICAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICAgICAgICAgIG1Db2x1bW5zID0gbmV3IFN0cmluZ1tmcm9tLmxlbmd0aCArIDFdOworICAgICAgICAgICAgLy8gVGhpcyBpcyBtYW5kYXRvcnkgaW4gQ3Vyc29yQWRhcHRlcgorICAgICAgICAgICAgbUNvbHVtbnNbMF0gPSAiX2lkIjsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZnJvbSwgMCwgbUNvbHVtbnMsIDEsIGZyb20ubGVuZ3RoKTsKKworICAgICAgICAgICAgQ3Vyc29yQmluZGVyIGJhc2ljID0gbmV3IFN0cmluZ0JpbmRlcihjb250ZXh0LCBuZXcgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihjb250ZXh0KSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBmcm9tLmxlbmd0aDsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEN1cnNvckJpbmRlcltjb3VudF07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEN1cnNvckJpbmRlciBiaW5kZXIgPSBiaW5kZXJzLmdldChmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIGJpbmRlciA9IGJhc2ljOworICAgICAgICAgICAgICAgIG1CaW5kZXJzW2ldID0gYmluZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVG8ubGVuZ3RoOworICAgICAgICAgICAgZmluYWwgaW50W10gZnJvbSA9IG1Gcm9tOworICAgICAgICAgICAgZmluYWwgaW50W10gdG8gPSBtVG87CisgICAgICAgICAgICBmaW5hbCBDdXJzb3JCaW5kZXJbXSBiaW5kZXJzID0gbUJpbmRlcnM7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdiA9IHZpZXcuZmluZFZpZXdCeUlkKHRvW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlcnNbaV0uYmluZCh2LCBjdXJzb3IsIGZyb21baV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisgICAgICAgICAgICBpZiAobVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrID0gbmV3IFF1ZXJ5VGFzaygpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKEN1cnNvciBjKSB7CisgICAgICAgICAgICBpZiAobUxvYWRUYXNrICE9IG51bGwgJiYgbUxvYWRUYXNrLmdldFN0YXR1cygpICE9IFF1ZXJ5VGFzay5TdGF0dXMuRklOSVNIRUQpIHsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2suY2FuY2VsKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5jaGFuZ2VDdXJzb3IoYyk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBRdWVyeVRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQ3Vyc29yPiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDdXJzb3IgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChBY3Rpdml0eSkgbUNvbnRleHQpLm1hbmFnZWRRdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaS5wYXJzZShtVXJpKSwgbUNvbHVtbnMsIG1TZWxlY3Rpb24sIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIuc3VwZXIuY2hhbmdlQ3Vyc29yKGN1cnNvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIHJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4gYXMgYSBTdHJpbmcsCisgICAgICogd2l0aG91dCBwZXJmb3JtaW5nIGFueSBtYW5pcHVsYXRpb24uIFRoaXMgaXMgdXNlZCB3aGVuIG5vIHRyYW5zZm9ybWF0aW9uIGlzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJZGVudGl0eVRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwdWJsaWMgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXhwcmVzc2lvbiB0cmFuc2Zvcm1hdGlvbiBpcyBhIHNpbXBsZSB0ZW1wbGF0ZSBiYXNlZCByZXBsYWNlbWVudCB1dGlsaXR5LgorICAgICAqIEluIGFuIGV4cHJlc3Npb24sIGVhY2ggc2VnbWVudCBvZiB0aGUgZm9ybSA8Y29kZT57KFtefV0rKX08L2NvZGU+IGlzIHJlcGxhY2VkCisgICAgICogd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBvZiBuYW1lICQxLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uTm9kZSBtRmlyc3ROb2RlID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbk5vZGUoIiIpOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgICAgIHBhcnNlKGV4cHJlc3Npb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKFN0cmluZyBleHByZXNzaW9uKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uTm9kZSBub2RlID0gbUZpcnN0Tm9kZTsKKyAgICAgICAgICAgIGludCBzZWdtZW50U3RhcnQ7CisgICAgICAgICAgICBpbnQgY291bnQgPSBleHByZXNzaW9uLmxlbmd0aCgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBleHByZXNzaW9uLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBhIGNvbHVtbiBuYW1lIHNlZ21lbnQKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpOworICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCwgYnV0IHRoZSBleHByZXNzaW9uIGRpZG4ndCBjbG9zZQorICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSB0cmFuc2Zvcm0gZXhwcmVzc2lvbiBjb250YWlucyBhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWNsb3NlZCBjb2x1bW4gbmFtZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub2RlLm5leHQgPSBuZXcgQ29sdW1uRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0ICsgMSwgaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgY291bnQgJiYgKGMgPSBleHByZXNzaW9uLmNoYXJBdChpKSkgIT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbi5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJld2luZCBpZiB3ZSd2ZSByZWFjaGVkIGEgY29sdW1uIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSBpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBtQnVpbGRlcjsKKyAgICAgICAgICAgIGJ1aWxkZXIuZGVsZXRlKDAsIGJ1aWxkZXIubGVuZ3RoKCkpOworCisgICAgICAgICAgICBFeHByZXNzaW9uTm9kZSBub2RlID0gbUZpcnN0Tm9kZTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IG5vZGUKKyAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUubmV4dCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5vZGUuYXNTdHJpbmcoY3Vyc29yKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHVibGljIEV4cHJlc3Npb25Ob2RlIG5leHQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgQ29uc3RhbnRFeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db25zdGFudDsKKworICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uTm9kZShTdHJpbmcgY29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnQgPSBjb25zdGFudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbHVtbkV4cHJlc3Npb25Ob2RlIGV4dGVuZHMgRXhwcmVzc2lvbk5vZGUgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNvbHVtbk5hbWU7CisgICAgICAgICAgICBwcml2YXRlIEN1cnNvciBtU2lnbmF0dXJlOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbHVtbkluZGV4ID0gLTE7CisKKyAgICAgICAgICAgIENvbHVtbkV4cHJlc3Npb25Ob2RlKFN0cmluZyBjb2x1bW5OYW1lKSB7CisgICAgICAgICAgICAgICAgbUNvbHVtbk5hbWUgPSBjb2x1bW5OYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbVNpZ25hdHVyZSB8fCBtQ29sdW1uSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KG1Db2x1bW5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hdHVyZSA9IGN1cnNvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldFN0cmluZyhtQ29sdW1uSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtYXAgdHJhbnNmb3JtYXRpb24gb2ZmZXJzIGEgc2ltcGxlIG1hcHBpbmcgYmV0d2VlbiBzcGVjaWZpZWQgU3RyaW5nIHZhbHVlcworICAgICAqIHRvIFN0cmluZ3Mgb3IgaW50ZWdlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFwVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbVN0cmluZ01hcHBpbmdzOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtUmVzb3VyY2VNYXBwaW5nczsKKworICAgICAgICBwdWJsaWMgTWFwVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZFN0cmluZ01hcHBpbmcoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgeworICAgICAgICAgICAgbVN0cmluZ01hcHBpbmdzLnB1dChmcm9tLCB0byk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZFJlc291cmNlTWFwcGluZyhTdHJpbmcgZnJvbSwgaW50IHRvKSB7CisgICAgICAgICAgICBtUmVzb3VyY2VNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJhbnNmb3JtZWQgPSBtU3RyaW5nTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZCA9PSBudWxsID8gdmFsdWUgOiB0cmFuc2Zvcm1lZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUmVzb3VyY2UoQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHJhbnNmb3JtZWQgPSBtUmVzb3VyY2VNYXBwaW5ncy5nZXQodmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IEludGVnZXIucGFyc2VJbnQodmFsdWUpIDogdHJhbnNmb3JtZWQ7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYSBTdHJpbmcgdG8gYSBUZXh0Vmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgU3RyaW5nQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldFRleHQodGV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBpbWFnZSBibG9iIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBJbWFnZUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGN1cnNvci5nZXRCbG9iKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VCaXRtYXAoQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWdCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgVGFnQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICB2aWV3LnNldFRhZyh0ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgVVJJIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZVVyaUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBJbWFnZVVyaUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgdmlldykuc2V0SW1hZ2VVUkkoVXJpLnBhcnNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYSBkcmF3YWJsZSByZXNvdXJjZSBpZGVudGlmaWVyIHRvIGFuIEltYWdlVmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcmF3YWJsZUJpbmRlciBleHRlbmRzIEN1cnNvckJpbmRlciB7CisgICAgICAgIHB1YmxpYyBEcmF3YWJsZUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzb3VyY2UgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtVG9SZXNvdXJjZShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvQ29udGFjdFBob3RvQmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkZjAxMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvQ29udGFjdFBob3RvQmluZGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIFRoaXMgY3VzdG9tIGN1cnNvciBiaW5kZXIgaXMgdXNlZCBieSB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHJlcy94bWwgdG8KKyAqIGJpbmQgY29udGFjdHMgcGhvdG9zIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlzdCBpdGVtLiBUaGlzIGJpbmRlciBzaW1wbHkKKyAqIHF1ZXJpZXMgYSBjb250YWN0J3MgcGhvdG8gYmFzZWQgb24gdGhlIGNvbnRhY3QncyBpZCBhbmQgc2V0cyB0aGUKKyAqIHBob3RvIGFzIGEgY29tcG91bmQgZHJhd2FibGUgb24gdGhlIFRleHRWaWV3IHVzZWQgdG8gZGlzcGxheSB0aGUgY29udGFjdCdzCisgKiBuYW1lLgorICovCitwdWJsaWMgY2xhc3MgQ29udGFjdFBob3RvQmluZGVyIGV4dGVuZHMgQWRhcHRlcnMuQ3Vyc29yQmluZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEhPVE9fU0laRV9ESVAgPSA1NDsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1EZWZhdWx0OworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxMb25nLCBEcmF3YWJsZT4gbUNhY2hlOworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBob3RvU2l6ZTsKKworICAgIHB1YmxpYyBDb250YWN0UGhvdG9CaW5kZXIoQ29udGV4dCBjb250ZXh0LCBBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisKKyAgICAgICAgbVJlc291cmNlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAvLyBEZWZhdWx0IHBpY3R1cmUgdXNlZCB3aGVuIGEgY29udGFjdCBkb2VzIG5vdCBwcm92aWRlIG9uZQorICAgICAgICBtRGVmYXVsdCA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmUpOworICAgICAgICAvLyBDYWNoZSB1c2VkIHRvIGF2b2lkIHJlLXF1ZXJ5aW5nIGNvbnRhY3RzIHBob3RvcyBldmVyeSB0aW1lCisgICAgICAgIG1DYWNoZSA9IG5ldyBIYXNoTWFwPExvbmcsIERyYXdhYmxlPigpOworICAgICAgICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBwaG90byBiYXNlZCBvbiB0aGUgZGlzcGxheSdzIGRlbnNpdHkKKyAgICAgICAgbVBob3RvU2l6ZSA9IChpbnQpIChQSE9UT19TSVpFX0RJUCAqIG1SZXNvdXJjZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICsgMC41Zik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBmaW5hbCBsb25nIGlkID0gY3Vyc29yLmdldExvbmcoY29sdW1uSW5kZXgpOworICAgICAgICAKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgY2FjaGVkIHRoZSBjb250YWN0J3MgcGhvdG8KKyAgICAgICAgRHJhd2FibGUgZCA9IG1DYWNoZS5nZXQoaWQpOworICAgICAgICAKKyAgICAgICAgaWYgKGQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHBob3RvIHdhc24ndCBpbiB0aGUgY2FjaGUsIGFzayB0aGUgY29udGFjdHMgcHJvdmlkZXIgZm9yCisgICAgICAgICAgICAvLyBhbiBpbnB1dCBzdHJlYW0gd2UgY2FuIHVzZSB0byBsb2FkIHRoZSBwaG90bworICAgICAgICAgICAgVXJpIHVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuQ09OVEVOVF9VUkksIGlkKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMub3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgdXJpKTsKKyAgICAKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgdGhlIGRyYXdhYmxlIGZvciB0aGUgY29udGFjdCdzIHBob3RvIG9yIHVzZSBvdXIgZmFsbGJhY2sgZHJhd2FibGUKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGRlY29kaW5nIHRoZSBiaXRtYXAgY291bGQgYmUgZG9uZSBpbiBhIHdvcmtlciB0aHJlYWQgdG9vLgorICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIGQgPSBuZXcgQml0bWFwRHJhd2FibGUobVJlc291cmNlcywgYml0bWFwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZCA9IG1EZWZhdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLnNldEJvdW5kcygwLCAwLCBtUGhvdG9TaXplLCBtUGhvdG9TaXplKTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldENvbXBvdW5kRHJhd2FibGVzKGQsIG51bGwsIG51bGwsIG51bGwpOworCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgcGhvdG8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFjdAorICAgICAgICAgICAgbUNhY2hlLnB1dChpZCwgZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRDb21wb3VuZERyYXdhYmxlcyhkLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvQ29udGFjdHNMaXN0QWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvQ29udGFjdHNMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWVjZDllCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0c0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnM7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGNvbXBsZXggVUkgdXNpbmcgYSBMaXN0VmlldworICogYW5kIGFuIGFkYXB0ZXIgZGVmaW5lZCBpbiBYTUwuCisgKiAKKyAqIFRoZSBmb2xsb3dpbmcgYWN0aXZpdHkgc2hvd3MgYSBsaXN0IG9mIGNvbnRhY3RzLCB0aGVpciBzdGFycmVkIHN0YXR1cworICogYW5kIHRoZWlyIHBob3RvcywgdXNpbmcgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiByZXMveG1sLgorICovCitwdWJsaWMgY2xhc3MgQ29udGFjdHNMaXN0QWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jb250YWN0c19saXN0KTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoQWRhcHRlcnMubG9hZEFkYXB0ZXIodGhpcywgUi54bWwuY29udGFjdHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0ltYWdlRG93bmxvYWRlci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRmOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGhlbHBlciBjbGFzcyBkb3dubG9hZCBpbWFnZXMgZnJvbSB0aGUgSW50ZXJuZXQgYW5kIGJpbmRzIHRob3NlIHdpdGggdGhlIHByb3ZpZGVkIEltYWdlVmlldy4KKyAqCisgKiA8cD5JdCByZXF1aXJlcyB0aGUgSU5URVJORVQgcGVybWlzc2lvbiwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHlvdXIgYXBwbGljYXRpb24ncyBtYW5pZmVzdAorICogZmlsZS48L3A+CisgKgorICogQSBsb2NhbCBjYWNoZSBvZiBkb3dubG9hZGVkIGltYWdlcyBpcyBtYWludGFpbmVkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqLworcHVibGljIGNsYXNzIEltYWdlRG93bmxvYWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSW1hZ2VEb3dubG9hZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVJEX0NBQ0hFX0NBUEFDSVRZID0gNDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX0JFRk9SRV9QVVJHRSA9IDMwICogMTAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzCisKKyAgICAvLyBIYXJkIGNhY2hlLCB3aXRoIGEgZml4ZWQgbWF4aW11bSBjYXBhY2l0eSBhbmQgYSBsaWZlIGR1cmF0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQml0bWFwPiBzSGFyZEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBCaXRtYXA+KEhBUkRfQ0FDSEVfQ0FQQUNJVFkgLyAyLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTGlua2VkSGFzaE1hcC5FbnRyeTxTdHJpbmcsIEJpdG1hcD4gZWxkZXN0KSB7CisgICAgICAgICAgICBpZiAoc2l6ZSgpID4gSEFSRF9DQUNIRV9DQVBBQ0lUWSkgeworICAgICAgICAgICAgICAgIC8vIEVudHJpZXMgcHVzaC1vdXQgb2YgaGFyZCByZWZlcmVuY2UgY2FjaGUgYXJlIHRyYW5zZmVycmVkIHRvIHNvZnQgcmVmZXJlbmNlIGNhY2hlCisgICAgICAgICAgICAgICAgc1NvZnRCaXRtYXBDYWNoZS5wdXQoZWxkZXN0LmdldEtleSgpLCBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGVsZGVzdC5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gU29mdCBjYWNoZSBmb3IgYml0bWFwIGtpY2tlZCBvdXQgb2YgaGFyZCBjYWNoZQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PiBzU29mdEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PihIQVJEX0NBQ0hFX0NBUEFDSVRZIC8gMik7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgcHVyZ2VIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgcHVyZ2VyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckNhY2hlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRG93bmxvYWQgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSBJbnRlcm5ldCBhbmQgYmluZHMgaXQgdG8gdGhlIHByb3ZpZGVkIEltYWdlVmlldy4gVGhlCisgICAgICogYmluZGluZyBpcyBpbW1lZGlhdGUgaWYgdGhlIGltYWdlIGlzIGZvdW5kIGluIHRoZSBjYWNoZSBhbmQgd2lsbCBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICogb3RoZXJ3aXNlLiBBIG51bGwgYml0bWFwIHdpbGwgYmUgYXNzb2NpYXRlZCB0byB0aGUgSW1hZ2VWaWV3IGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBkb3dubG9hZCh1cmwsIGltYWdlVmlldywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI2Rvd25sb2FkKFN0cmluZywgSW1hZ2VWaWV3KX0sIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbAorICAgICAqIGNvb2tpZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBpbWFnZSB3aWxsIGJlIHJldHJpZXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICogQHBhcmFtIGNvb2tpZSBBIGNvb2tpZSBTdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGh0dHAgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIHJlc2V0UHVyZ2VUaW1lcigpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gZ2V0Qml0bWFwRnJvbUNhY2hlKHVybCk7CisKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgaW1hZ2VWaWV3LCBjb29raWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpOworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhbWUgYXMgZG93bmxvYWQgYnV0IHRoZSBpbWFnZSBpcyBhbHdheXMgZG93bmxvYWRlZCBhbmQgdGhlIGNhY2hlIGlzIG5vdCB1c2VkLgorICAgICAqIEtlcHQgcHJpdmF0ZSBhdCB0aGUgbW9tZW50IGFzIGl0cyBpbnRlcmVzdCBpcyBub3QgY2xlYXIuCisgICAgICAgcHJpdmF0ZSB2b2lkIGZvcmNlRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IHZpZXcpIHsKKyAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgdmlldywgbnVsbCk7CisgICAgICAgfQorICAgICAqLworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBkb3dubG9hZCBidXQgdGhlIGltYWdlIGlzIGFsd2F5cyBkb3dubG9hZGVkIGFuZCB0aGUgY2FjaGUgaXMgbm90IHVzZWQuCisgICAgICogS2VwdCBwcml2YXRlIGF0IHRoZSBtb21lbnQgYXMgaXRzIGludGVyZXN0IGlzIG5vdCBjbGVhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9yY2VEb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIC8vIFN0YXRlIHNhbml0eTogdXJsIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbCBpbiBEb3dubG9hZGVkRHJhd2FibGUgYW5kIGNhY2hlIGtleXMuCisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpKSB7CisgICAgICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayB0YXNrID0gbmV3IEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gbmV3IERvd25sb2FkZWREcmF3YWJsZSh0YXNrKTsKKyAgICAgICAgICAgIGltYWdlVmlldy5zZXRJbWFnZURyYXdhYmxlKGRvd25sb2FkZWREcmF3YWJsZSk7CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUodXJsLCBjb29raWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBpbWFnZSBjYWNoZSB1c2VkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gTm90ZSB0aGF0IGZvciBtZW1vcnkKKyAgICAgKiBlZmZpY2llbmN5IHJlYXNvbnMsIHRoZSBjYWNoZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBhIGNlcnRhaW4gaW5hY3Rpdml0eSBkZWxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgeworICAgICAgICBzSGFyZEJpdG1hcENhY2hlLmNsZWFyKCk7CisgICAgICAgIHNTb2Z0Qml0bWFwQ2FjaGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRQdXJnZVRpbWVyKCkgeworICAgICAgICBwdXJnZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHB1cmdlcik7CisgICAgICAgIHB1cmdlSGFuZGxlci5wb3N0RGVsYXllZChwdXJnZXIsIERFTEFZX0JFRk9SRV9QVVJHRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGRvd25sb2FkIGhhcyBiZWVuIGNhbmNlbGVkIG9yIGlmIHRoZXJlIHdhcyBubyBkb3dubG9hZCBpbgorICAgICAqIHByb2dyZXNzIG9uIHRoaXMgaW1hZ2Ugdmlldy4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb3dubG9hZCBpbiBwcm9ncmVzcyBkZWFscyB3aXRoIHRoZSBzYW1lIHVybC4gVGhlIGRvd25sb2FkIGlzIG5vdAorICAgICAqIHN0b3BwZWQgaW4gdGhhdCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuY2VsUG90ZW50aWFsRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayBiaXRtYXBEb3dubG9hZGVyVGFzayA9IGdldEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisKKyAgICAgICAgaWYgKGJpdG1hcERvd25sb2FkZXJUYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBiaXRtYXBVcmwgPSBiaXRtYXBEb3dubG9hZGVyVGFzay51cmw7CisgICAgICAgICAgICBpZiAoKGJpdG1hcFVybCA9PSBudWxsKSB8fCAoIWJpdG1hcFVybC5lcXVhbHModXJsKSkpIHsKKyAgICAgICAgICAgICAgICBiaXRtYXBEb3dubG9hZGVyVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzYW1lIFVSTCBpcyBhbHJlYWR5IGJlaW5nIGRvd25sb2FkZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbWFnZVZpZXcgQW55IGltYWdlVmlldworICAgICAqIEByZXR1cm4gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgZG93bmxvYWQgdGFzayAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbWFnZVZpZXcuCisgICAgICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRG93bmxvYWRlclRhc2sgZ2V0Qml0bWFwRG93bmxvYWRlclRhc2soSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBpZiAoaW1hZ2VWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gaW1hZ2VWaWV3LmdldERyYXdhYmxlKCk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgaW5zdGFuY2VvZiBEb3dubG9hZGVkRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gKERvd25sb2FkZWREcmF3YWJsZSlkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG93bmxvYWRlZERyYXdhYmxlLmdldEJpdG1hcERvd25sb2FkZXJUYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIEByZXR1cm4gVGhlIGNhY2hlZCBiaXRtYXAgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgQml0bWFwIGdldEJpdG1hcEZyb21DYWNoZShTdHJpbmcgdXJsKSB7CisgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgaGFyZCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gc0hhcmRCaXRtYXBDYWNoZS5nZXQodXJsKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBoYXJkIGNhY2hlCisgICAgICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IHRvIGZpcnN0IHBvc2l0aW9uLCBzbyB0aGF0IGl0IGlzIHJlbW92ZWQgbGFzdAorICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucmVtb3ZlKHVybCk7CisgICAgICAgICAgICAgICAgc0hhcmRCaXRtYXBDYWNoZS5wdXQodXJsLCBiaXRtYXApOworICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIHRyeSB0aGUgc29mdCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgU29mdFJlZmVyZW5jZTxCaXRtYXA+IGJpdG1hcFJlZmVyZW5jZSA9IHNTb2Z0Qml0bWFwQ2FjaGUuZ2V0KHVybCk7CisgICAgICAgIGlmIChiaXRtYXBSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IGJpdG1hcFJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBzb2Z0IGNhY2hlCisgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29mdCByZWZlcmVuY2UgaGFzIGJlZW4gR2FyYmFnZSBDb2xsZWN0ZWQKKyAgICAgICAgICAgICAgICBzU29mdEJpdG1hcENhY2hlLnJlbW92ZSh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBBc3luY1Rhc2sgdGhhdCB3aWxsIGFzeW5jaHJvbm91c2x5IGRvd25sb2FkIHRoZSBpbWFnZS4KKyAgICAgKi8KKyAgICBjbGFzcyBCaXRtYXBEb3dubG9hZGVyVGFzayBleHRlbmRzIEFzeW5jVGFzazxTdHJpbmcsIFZvaWQsIEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU9fQlVGRkVSX1NJWkUgPSA0ICogMTAyNDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJsOworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SW1hZ2VWaWV3PiBpbWFnZVZpZXdSZWZlcmVuY2U7CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrKEltYWdlVmlldyBpbWFnZVZpZXcpIHsKKyAgICAgICAgICAgIGltYWdlVmlld1JlZmVyZW5jZSA9IG5ldyBXZWFrUmVmZXJlbmNlPEltYWdlVmlldz4oaW1hZ2VWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY3R1YWwgZG93bmxvYWQgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoU3RyaW5nLi4uIHBhcmFtcykgeworICAgICAgICAgICAgZmluYWwgQW5kcm9pZEh0dHBDbGllbnQgY2xpZW50ID0gQW5kcm9pZEh0dHBDbGllbnQubmV3SW5zdGFuY2UoIkFuZHJvaWQiKTsKKyAgICAgICAgICAgIHVybCA9IHBhcmFtc1swXTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBHZXQgZ2V0UmVxdWVzdCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBTdHJpbmcgY29va2llID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdC5zZXRIZWFkZXIoImNvb2tpZSIsIGNvb2tpZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0UmVxdWVzdCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoIkltYWdlRG93bmxvYWRlciIsICJFcnJvciAiICsgc3RhdHVzQ29kZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRhdGFTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGF0YVN0cmVhbSwgSU9fQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weShpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGRhdGFTdHJlYW0udG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIDogU2hvdWxkIHVzZSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpbnB1dFN0cmVhbSkgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlucHV0U3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuY29uc3VtZUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkkvTyBlcnJvciB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBVUkw6ICIgKyB1cmwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgYml0bWFwIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmNlIHRoZSBpbWFnZSBpcyBkb3dubG9hZGVkLCBhc3NvY2lhdGVzIGl0IHRvIHRoZSBpbWFnZVZpZXcKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGJpdG1hcCB0byBjYWNoZQorICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucHV0KHVybCwgYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbWFnZVZpZXdSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZVZpZXcgPSBpbWFnZVZpZXdSZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICAgICAgQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2sgPSBnZXRCaXRtYXBEb3dubG9hZGVyVGFzayhpbWFnZVZpZXcpOworICAgICAgICAgICAgICAgIC8vIENoYW5nZSBiaXRtYXAgb25seSBpZiB0aGlzIHByb2Nlc3MgaXMgc3RpbGwgYXNzb2NpYXRlZCB3aXRoIGl0CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbSU9fQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbi5yZWFkKGIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmFrZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGltYWdlVmlldyB3aGlsZSB0aGUgZG93bmxvYWQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiA8cD5Db250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGRvd25sb2FkIHRhc2ssIHNvIHRoYXQgYSBkb3dubG9hZCB0YXNrIGNhbiBiZSBzdG9wcGVkCisgICAgICogaWYgYSBuZXcgYmluZGluZyBpcyByZXF1aXJlZCwgYW5kIG1ha2VzIHN1cmUgdGhhdCBvbmx5IHRoZSBsYXN0IHN0YXJ0ZWQgZG93bmxvYWQgcHJvY2VzcyBjYW4KKyAgICAgKiBiaW5kIGl0cyByZXN1bHQsIGluZGVwZW5kZW50bHkgb2YgdGhlIGRvd25sb2FkIGZpbmlzaCBvcmRlci48L3A+CisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERvd25sb2FkZWREcmF3YWJsZSBleHRlbmRzIENvbG9yRHJhd2FibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Qml0bWFwRG93bmxvYWRlclRhc2s+IGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlOworCisgICAgICAgIHB1YmxpYyBEb3dubG9hZGVkRHJhd2FibGUoQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgIHN1cGVyKENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlID0KKyAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxCaXRtYXBEb3dubG9hZGVyVGFzaz4oYml0bWFwRG93bmxvYWRlclRhc2spOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrIGdldEJpdG1hcERvd25sb2FkZXJUYXNrKCkgeworICAgICAgICAgICAgcmV0dXJuIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlLmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9QaG90b3NMaXN0QWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwMDdkNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSB1c2VzIGEgY3VzdG9tIGN1cnNvciBhZGFwdGVyIHdoaWNoIGZldGNoZXMgYSBYTUwgcGhvdG8gZmVlZCBhbmQgcGFyc2VzIHRoZSBYTUwgdG8KKyAqIGV4dHJhY3QgdGhlIGltYWdlcycgVVJMIGFuZCB0aGVpciB0aXRsZS4KKyAqLworcHVibGljIGNsYXNzIFBob3Rvc0xpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJQ0FTQV9GRUVEX1VSTCA9CisgICAgICAgICJodHRwOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS9mZWF0dXJlZD9tYXgtcmVzdWx0cz01MCZ0aHVtYnNpemU9MTQ0YyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucGhvdG9zX2xpc3QpOworICAgICAgICBzZXRMaXN0QWRhcHRlcihBZGFwdGVycy5sb2FkQ3Vyc29yQWRhcHRlcih0aGlzLCBSLnhtbC5waG90b3MsCisgICAgICAgICAgICAgICAgImNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/dXJsPSIgKyBVcmkuZW5jb2RlKFBJQ0FTQV9GRUVEX1VSTCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkZjI0NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZSB0aGUgY3JlYXRpb24gb2YgYSBzaW1wbGUgUlNTIGZlZWQgcmVhZGVyIHVzaW5nIHRoZSBYTUwgYWRhcHRlciBzeW50YXguCisgKiBUaGUgZGlmZmVyZW50IGVsZW1lbnRzIG9mIHRoZSBmZWVkIGFyZSBleHRyYWN0ZWQgdXNpbmcgYW4ge0BsaW5rIFhtbERvY3VtZW50UHJvdmlkZXJ9IGFuZCBhcmUKKyAqIGJpbmRlZCB0byB0aGUgZGlmZmVyZW50IHZpZXdzLiBBbiB7QGxpbmsgT25JdGVtQ2xpY2tMaXN0ZW5lcn0gaXMgYWxzbyBhZGRlZCwgd2hpY2ggd2lsbCBvcGVuIGEKKyAqIGJyb3dzZXIgb24gdGhlIGFzc29jaWF0ZWQgbmV3cyBpdGVtIHBhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBSc3NSZWFkZXJBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURfVVJJID0gImh0dHA6Ly9mZWVkcy5ueXRpbWVzLmNvbS9ueXQvcnNzL0hvbWVQYWdlIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yc3NfZmVlZHNfbGlzdCk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKEFkYXB0ZXJzLmxvYWRDdXJzb3JBZGFwdGVyKHRoaXMsIFIueG1sLnJzc19mZWVkLAorICAgICAgICAgICAgICAgICJjb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD0iICsgVXJpLmVuY29kZShGRUVEX1VSSSkpKTsKKworICAgICAgICBnZXRMaXN0VmlldygpLnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IFVybEludGVudExpc3RlbmVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW1hZ2VCaW5kZXIuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW1hZ2VCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg3NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9VcmxJbWFnZUJpbmRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKKy8qKgorICogVGhpcyBDdXJzb3JCaW5kZXIgYmluZHMgdGhlIHByb3ZpZGVkIGltYWdlIFVSTCB0byBhbiBJbWFnZVZpZXcgYnkgZG93bmxvYWRpbmcgdGhlIGltYWdlIGZyb20gdGhlCisgKiBJbnRlcm5ldC4KKyAqLworcHVibGljIGNsYXNzIFVybEltYWdlQmluZGVyIGV4dGVuZHMgQWRhcHRlcnMuQ3Vyc29yQmluZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSW1hZ2VEb3dubG9hZGVyIGltYWdlRG93bmxvYWRlcjsKKworICAgIHB1YmxpYyBVcmxJbWFnZUJpbmRlcihDb250ZXh0IGNvbnRleHQsIEFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgaW1hZ2VEb3dubG9hZGVyID0gbmV3IEltYWdlRG93bmxvYWRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBJbWFnZVZpZXcpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgaW1hZ2VEb3dubG9hZGVyLmRvd25sb2FkKHVybCwgKEltYWdlVmlldykgdmlldyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEludGVudExpc3RlbmVyLmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEludGVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4MTRkMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW50ZW50TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcjsKKworLyoqCisgKiBBIGxpc3RlbmVyIHdoaWNoIGV4cGVjdHMgYSBVUkwgYXMgYSB0YWcgb2YgdGhlIHZpZXcgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJdCB0aGVuIG9wZW5zIHRoZSBVUkwKKyAqIGluIHRoZSBicm93c2VyIGFwcGxpY2F0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVXJsSW50ZW50TGlzdGVuZXIgaW1wbGVtZW50cyBPbkl0ZW1DbGlja0xpc3RlbmVyIHsKKworICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHZpZXcuZ2V0VGFnKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UodXJsKSk7CisgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHBhcmVudC5nZXRDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9zb3VyY2UucHJvcGVydGllcyBiL3NhbXBsZXMvc291cmNlLnByb3BlcnRpZXMKaW5kZXggNTRhZGVhOS4uOGQxY2ZkNiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9zb3VyY2UucHJvcGVydGllcworKysgYi9zYW1wbGVzL3NvdXJjZS5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNCBAQAogUGtnLlVzZXJTcmM9ZmFsc2UKIFBrZy5SZXZpc2lvbj0xCi1BbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD0xMAotI0FuZHJvaWRWZXJzaW9uLkNvZGVOYW1lPWdpbmdlcmJyZWFkCi0KK0FuZHJvaWRWZXJzaW9uLkFwaUxldmVsPTEyCisjQW5kcm9pZFZlcnNpb24uQ29kZU5hbWU9SG9uZXljb21iCmRpZmYgLS1naXQgYS9zZGsvY29tcGF0aWJpbGl0eV9SRUFETUUudHh0IGIvc2RrL2NvbXBhdGliaWxpdHlfUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWYxNWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2RrL2NvbXBhdGliaWxpdHlfUkVBRE1FLnR4dApAQCAtMCwwICsxLDE2IEBACitDb21wYXRpYmlsaXR5IExpYnJhcmllcyBmb3IgQW5kcm9pZC4KKworVGhpcyBTREsgY29tcG9uZW50IGNvbnRhaW5zIHN0YXRpYyBsaWJyYXJpZXMgcHJvdmlkaW5nIGFjY2VzcyB0byBuZXdlciBBUElzCitvbiBvbGRlciBwbGF0Zm9ybXMuIFRvIHVzZSB0aG9zZSBsaWJyYXJpZXMsIHNpbXBseSBjb3B5IHRoZW0gYXMgc3RhdGljIGxpYnJhcmllcworaW50byB5b3VyIHByb2plY3QuCisKKyJ2NCIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgbmV3IEFQSXMgb24gQW5kcm9pZCBBUEkgNCAoMS42IC0gRG9udXQpIGFuZCBhYm92ZS4KKwordjQvYW5kcm9pZC1zdXBwb3J0LXY0LmphciBjb250YWluczoKKy0gRnJhZ21lbnQgQVBJLiBOZXcgaW4gQVBJIDExICgzLjAgLSBIb25leWNvbWIpLiBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2FwcC9GcmFnbWVudC5odG1sCistIExvYWRlciBBUEkuIE5ldyBpbiBBUEkgMTEgKDMuMCAtIEhvbmV5Y29tYikuIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuaHRtbAorLSBDdXJzb3JBZGFwdGVyIC8gUmVzb3VyY2VDdXJzb3JBZGFwdGVyIC8gU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlc2UgYXJlIHRoZSBBUEkgMTEgdmVyc2lvbnMuCistIE1lbnVDb21wYXQgYWxsb3dzIGNhbGxpbmcgTWVudUl0ZW0uc2V0U2hvd0FzQWN0aW9uIHdoaWNoIG9ubHkgZXhpc3RzIG9uIEFQSSAxMS4KKwordjQvc3JjLyBpcyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBjb21wYXRpYmlsaXR5IGxpYnJhcnkKK3Y0L3NhbXBsZXMvIHByb3ZpZGVzIGEgdmVyc2lvbiBvZiBBcGlEZW1vcyB1c2luZyB0aGUgbGlicmFyeS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGsvY29tcGF0aWJpbGl0eV9zb3VyY2UucHJvcGVydGllcyBiL3Nkay9jb21wYXRpYmlsaXR5X3NvdXJjZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzliNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZGsvY29tcGF0aWJpbGl0eV9zb3VyY2UucHJvcGVydGllcwpAQCAtMCwwICsxLDIgQEAKK1BrZy5Vc2VyU3JjPWZhbHNlCitQa2cuUmV2aXNpb249MQpkaWZmIC0tZ2l0IGEvc2RrL2RvY19zb3VyY2UucHJvcGVydGllcyBiL3Nkay9kb2Nfc291cmNlLnByb3BlcnRpZXMKaW5kZXggM2VkOTI3Mi4uODJjM2NkYSAxMDA2NDQKLS0tIGEvc2RrL2RvY19zb3VyY2UucHJvcGVydGllcworKysgYi9zZGsvZG9jX3NvdXJjZS5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNSBAQAogUGtnLlVzZXJTcmM9ZmFsc2UKIFBrZy5SZXZpc2lvbj0xCi1BbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD0xMAorQW5kcm9pZFZlcnNpb24uQXBpTGV2ZWw9MTIKICNBbmRyb2lkVmVyc2lvbi5Db2RlTmFtZT0KIApkaWZmIC0tZ2l0IGEvc2RrL3BsYXRfdG9vbHNfc291cmNlLnByb3BlcnRpZXMgYi9zZGsvcGxhdF90b29sc19zb3VyY2UucHJvcGVydGllcwppbmRleCBmMjNlNTJhLi5iNzVlMzI2IDEwMDY0NAotLS0gYS9zZGsvcGxhdF90b29sc19zb3VyY2UucHJvcGVydGllcworKysgYi9zZGsvcGxhdF90b29sc19zb3VyY2UucHJvcGVydGllcwpAQCAtMSwyICsxLDIgQEAKIFBrZy5Vc2VyU3JjPWZhbHNlCi1Qa2cuUmV2aXNpb249MworUGtnLlJldmlzaW9uPTQKZGlmZiAtLWdpdCBhL3Nkay9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcyBiL3Nkay9wbGF0Zm9ybV9zb3VyY2UucHJvcGVydGllcwppbmRleCAxNWEzOThkLi42YmUyY2IxIDEwMDY0NAotLS0gYS9zZGsvcGxhdGZvcm1fc291cmNlLnByb3BlcnRpZXMKKysrIGIvc2RrL3BsYXRmb3JtX3NvdXJjZS5wcm9wZXJ0aWVzCkBAIC0xLDYgKzEsNiBAQAotUGtnLkRlc2M9QW5kcm9pZCBTREsgUGxhdGZvcm0gMi4zLjMuX3IxCitQa2cuRGVzYz1BbmRyb2lkIFNESyBQbGF0Zm9ybSAzLjEKIFBrZy5Vc2VyU3JjPWZhbHNlCi1QbGF0Zm9ybS5WZXJzaW9uPTIuMy4zCitQbGF0Zm9ybS5WZXJzaW9uPTMuMQogUGtnLlJldmlzaW9uPTEKLUFuZHJvaWRWZXJzaW9uLkFwaUxldmVsPTEwCitBbmRyb2lkVmVyc2lvbi5BcGlMZXZlbD0xMgogI0FuZHJvaWRWZXJzaW9uLkNvZGVOYW1lPQpkaWZmIC0tZ2l0IGEvc2RrL3Nkay5wcm9wZXJ0aWVzIGIvc2RrL3Nkay5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjdhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZGsvc2RrLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2IEBACisjIFNESyBwcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBpcyBjb3BpZWQgaW4gdGhlIHJvb3QgZm9sZGVyIG9mIGVhY2ggcGxhdGZvcm0gY29tcG9uZW50LgorIyBJZiBpdCB1c2VkIGJ5IHZhcmlvdXMgdG9vbHMgdG8gZmlndXJlIG91dCB3aGF0IHRoZSBwbGF0Zm9ybSBjYW4gZG8uCitzZGsuYW50LnRlbXBsYXRlcy5yZXZpc2lvbj0xCitzZGsubGF5b3V0bGliLmFwaT01CitzZGsuc2tpbi5kZWZhdWx0PVdYR0EKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGsvdXNiZHJpdmVyX3NvdXJjZS5wcm9wZXJ0aWVzIGIvc2RrL3VzYmRyaXZlcl9zb3VyY2UucHJvcGVydGllcwppbmRleCBkNzY2NmViLi4zZjk0ODRiIDEwMDc1NQotLS0gYS9zZGsvdXNiZHJpdmVyX3NvdXJjZS5wcm9wZXJ0aWVzCisrKyBiL3Nkay91c2Jkcml2ZXJfc291cmNlLnByb3BlcnRpZXMKQEAgLTEsNCArMSw0IEBACi1Qa2cuUmV2aXNpb249Mw0KK1BrZy5SZXZpc2lvbj00DQogQXJjaGl2ZS5Pcz1XSU5ET1dTDQogQXJjaGl2ZS5BcmNoPUFOWQ0KIEV4dHJhLlBhdGg9dXNiX2RyaXZlcg0KZGlmZiAtLWdpdCBhL3Nka19vdmVybGF5L2ZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9zZGtfb3ZlcmxheS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTZlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZGtfb3ZlcmxheS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGVzZSByZXNvdXJjZXMgYXJlIGFyb3VuZCBqdXN0IHRvIGFsbG93IHRoZWlyIHZhbHVlcyB0byBiZSBjdXN0b21pemVkCisgICAgIGZvciBkaWZmZXJlbnQgaGFyZHdhcmUgYW5kIHByb2R1Y3QgYnVpbGRzLiAtLT4KKzxyZXNvdXJjZXM+CisgICAgPCEtLSBDb21wb25lbnQgbmFtZSBvZiB0aGUgc2VydmljZSBwcm92aWRpbmcgZ2VvY29kZXIgQVBJIHN1cHBvcnQuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX2dlb2NvZGVQcm92aWRlciI+Y29tLmdvb2dsZS5hbmRyb2lkLmxvY2F0aW9uLkdlb2NvZGVQcm92aWRlcjwvc3RyaW5nPgorCisgICAgPCEtLSBUaGlzIGRldmljZSBpcyBub3QgInZvaWNlIGNhcGFibGUiOyBpdCdzIGRhdGEtb25seS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX3ZvaWNlX2NhcGFibGUiPmZhbHNlPC9ib29sPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsgYi9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsKaW5kZXggM2NlN2NkNS4uNWEyZDNiNSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rCisrKyBiL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5tawpAQCAtNzAsNyArNzAsNyBAQAogCSMgd2l0aG91dCB1cyBleHBsaWNpdGx5IHNldHRpbmcgdGhlIExEX0xJQlJBUllfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQogCUxPQ0FMX0xETElCUyArPSAtV2wsLXosb3JpZ2luCiAJTE9DQUxfQ0ZMQUdTICs9IC1ER1RLX05PX0NIRUNLX0NBU1RTIC1EX19XWEdUS19fIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgXAotICAgCQkJCQktRF9MQVJHRV9GSUxFUyAtRF9MQVJHRUZJTEVfU09VUkNFPTEgCisgICAJCQkJCS1EX0xBUkdFX0ZJTEVTIC1EX0xBUkdFRklMRV9TT1VSQ0U9MSAtRE5PX0dDQ19QUkFHTUEKIAlMT0NBTF9MRExJQlMgKz0gLWxydAogZW5kaWYKIGlmZXEgKCQoSE9TVF9PUyksZGFyd2luKQpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAgYi9zaW11bGF0b3IvYXBwL1Byb3BlcnR5U2VydmVyLmNwcAppbmRleCA0YTBhMmFjLi45MTIyM2VmIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL1Byb3BlcnR5U2VydmVyLmNwcAorKysgYi9zaW11bGF0b3IvYXBwL1Byb3BlcnR5U2VydmVyLmNwcApAQCAtOTAsNiArOTAsOSBAQAogICAgICAgICB7ICJyby5idWlsZC5kYXRlIiwgIldlZCBOb3YgMjggMDc6NDQ6MTQgUFNUIDIwMDciIH0sCiAgICAgICAgIHsgInJvLmJ1aWxkLmRhdGUudXRjIiwgIjExOTYyNjQ2NTQiIH0sCiAgICAgICAgIHsgInJvLmJ1aWxkLnR5cGUiLCAiZW5nIiB9LAorICAgICAgICB7ICJyby5idWlsZC52ZXJzaW9uLnNkayIsICI4IiB9LAorICAgICAgICB7ICJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIiwgIkZyb3lvIiB9LAorICAgICAgICB7ICJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiLCAiRnJveW8iIH0sCiAgICAgICAgIHsgInJvLnByb2R1Y3QuZGV2aWNlIiwgInNpbXVsYXRvciIgLyoic29vbmVyIiovIH0sCiAgICAgICAgIHsgInJvLnByb2R1Y3QuYnJhbmQiLCAiZ2VuZXJpYyIgfSwKICAgICAgICAgeyAicm8uYnVpbGQudXNlciIsICJmYWRkZW4iIH0sCkBAIC05OSwxMiArMTAyLDE2IEBACiAgICAgICAgIHsgInJvLnJhZGlvLnVzZS1wcHAiLCAibm8iIH0sCiAgICAgICAgIHsgInJvLkZPUkVHUk9VTkRfQVBQX0FESiIsICIwIiB9LAogICAgICAgICB7ICJyby5WSVNJQkxFX0FQUF9BREoiLCAiMSIgfSwKKyAgICAgICAgeyAicm8uUEVSQ0VQVElCTEVfQVBQX0FESiIsICIyIiB9LAorICAgICAgICB7ICJyby5IRUFWWV9XRUlHSFRfQVBQX0FESiIsICIzIiB9LAogICAgICAgICB7ICJyby5TRUNPTkRBUllfU0VSVkVSX0FESiIsICIyIiB9LAogICAgICAgICB7ICJyby5ISURERU5fQVBQX01JTl9BREoiLCAiNyIgfSwKICAgICAgICAgeyAicm8uQ09OVEVOVF9QUk9WSURFUl9BREoiLCAiMTQiIH0sCiAgICAgICAgIHsgInJvLkVNUFRZX0FQUF9BREoiLCAiMTUiIH0sCiAgICAgICAgIHsgInJvLkZPUkVHUk9VTkRfQVBQX01FTSIsICIxNTM2IiB9LAogICAgICAgICB7ICJyby5WSVNJQkxFX0FQUF9NRU0iLCAiMjA0OCIgfSwKKyAgICAgICAgeyAicm8uUEVSQ0VQVElCTEVfQVBQX01FTSIsICI0MDk2IiB9LAorICAgICAgICB7ICJyby5IRUFWWV9XRUlHSFRfQVBQX01FTSIsICI0MDk2IiB9LAogICAgICAgICB7ICJyby5TRUNPTkRBUllfU0VSVkVSX01FTSIsICI0MDk2IiB9LAogICAgICAgICB7ICJyby5ISURERU5fQVBQX01FTSIsICI4MTkyIiB9LAogICAgICAgICB7ICJyby5FTVBUWV9BUFBfTUVNIiwgIjE2Mzg0IiB9LApAQCAtMTQ1LDYgKzE1Miw3IEBACiAgICAgICAgIHsgImxvZy5yZWRpcmVjdC1zdGRpbyIsICJmYWxzZSIgfSwgICAgICAgICAgLy8gLVhsb2ctc3RkaW8KIAogICAgICAgICAvKiBTdXJmYWNlRmxpbmdlciBvcHRpb25zICovCisgICAgICAgIHsgInJvLnNmLmxjZF9kZW5zaXR5IiwgIjE2MCIgfSwKICAgICAgICAgeyAiZGVidWcuc2Yubm9ib290YW5pbWF0aW9uIiwgIjEiIH0sCiAgICAgICAgIHsgImRlYnVnLnNmLnNob3d1cGRhdGVzIiwgIjAiIH0sCiAgICAgICAgIHsgImRlYnVnLnNmLnNob3djcHUiLCAiMCIgfSwKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvYWRiX2ludGVyZmFjZS5weSBiL3Rlc3RydW5uZXIvYWRiX2ludGVyZmFjZS5weQppbmRleCAxOTI4YzczLi4zYmQ0Mzk2IDEwMDc1NQotLS0gYS90ZXN0cnVubmVyL2FkYl9pbnRlcmZhY2UucHkKKysrIGIvdGVzdHJ1bm5lci9hZGJfaW50ZXJmYWNlLnB5CkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBvdXRwdXQgPSAiIgogICAgIGVycm9yID0gTm9uZQogICAgIGlmIHJ1bnRpbWVfcmVzdGFydDoKLSAgICAgIHNlbGYuU2VuZFNoZWxsQ29tbWFuZCgic2V0cHJvcCByby5tb25rZXkgMSIsIHJldHJ5X2NvdW50PXJldHJ5X2NvdW50KQorICAgICAgc2VsZi5TZW5kU2hlbGxDb21tYW5kKCJzZXRwcm9wIHJvLnRlc3RfaGFybmVzcyAxIiwgcmV0cnlfY291bnQ9cmV0cnlfY291bnQpCiAgICAgICAjIG1hbnVhbCByZXN0IGJvb3Rjb21wbGV0ZSBmbGFnCiAgICAgICBzZWxmLlNlbmRTaGVsbENvbW1hbmQoInNldHByb3AgZGV2LmJvb3Rjb21wbGV0ZSAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudD1yZXRyeV9jb3VudCkKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvY292ZXJhZ2VfdGFyZ2V0cy54bWwgYi90ZXN0cnVubmVyL2NvdmVyYWdlX3RhcmdldHMueG1sCmluZGV4IDc3NWYwZTEuLmIyMzlhODcgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvY292ZXJhZ2VfdGFyZ2V0cy54bWwKKysrIGIvdGVzdHJ1bm5lci9jb3ZlcmFnZV90YXJnZXRzLnhtbApAQCAtNzEsNiArNzEsOCBAQAogICAgICAgICB0eXBlPSJBUFBTIiAvPgogICAgIDxjb3ZlcmFnZV90YXJnZXQgbmFtZT0iRW1haWwiIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvRW1haWwiCiAgICAgICAgIHR5cGU9IkFQUFMiIC8+CisgICAgPGNvdmVyYWdlX3RhcmdldCBuYW1lPSJFeGNoYW5nZSIgYnVpbGRfcGF0aD0icGFja2FnZXMvYXBwcy9FeGNoYW5nZSIKKyAgICAgICAgdHlwZT0iQVBQUyIgLz4KICAgICA8Y292ZXJhZ2VfdGFyZ2V0IG5hbWU9IlNldHRpbmdzIiBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL1NldHRpbmdzIgogICAgICAgICB0eXBlPSJBUFBTIiAvPgogICAgIDxjb3ZlcmFnZV90YXJnZXQgbmFtZT0iUGhvbmUiIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvUGhvbmUiCkBAIC04Niw2ICs4OCw4IEBACiAgICAgICAgIHR5cGU9IkFQUFMiIC8+CiAKICAgIDwhLS0gY29udGVudCBwcm92aWRlcnMgLS0+CisgICAgPGNvdmVyYWdlX3RhcmdldCBuYW1lPSJBcHBsaWNhdGlvbnNQcm92aWRlciIKKyAgICAgICAgYnVpbGRfcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0FwcGxpY2F0aW9uc1Byb3ZpZGVyIiB0eXBlPSJBUFBTIiAvPgogICAgIDxjb3ZlcmFnZV90YXJnZXQgbmFtZT0iQ2FsZW5kYXJQcm92aWRlciIKICAgICAgICAgYnVpbGRfcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0NhbGVuZGFyUHJvdmlkZXIiIHR5cGU9IkFQUFMiIC8+CiAgICAgPGNvdmVyYWdlX3RhcmdldCBuYW1lPSJDb250YWN0c1Byb3ZpZGVyIgpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci9jcmVhdGVfdGVzdC5weSBiL3Rlc3RydW5uZXIvY3JlYXRlX3Rlc3QucHkKaW5kZXggMmZjM2EzYy4uZmFlYTAxMyAxMDA3NTUKLS0tIGEvdGVzdHJ1bm5lci9jcmVhdGVfdGVzdC5weQorKysgYi90ZXN0cnVubmVyL2NyZWF0ZV90ZXN0LnB5CkBAIC05OCw3ICs5OCw3IEBACiAgICAgSU9FcnJvcjogdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nCiAgICIiIgogICAjIHNraXAgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cwotICB0ZXN0c19wYXRoID0gIiVzLyVzIiAlIChtYW5pZmVzdC5hcHBfcGF0aCwgVGVzdHNDb25zdHMuVEVTVFNfRk9MREVSKQorICB0ZXN0c19wYXRoID0gIiVzLyVzIiAlIChtYW5pZmVzdC5HZXRBcHBQYXRoKCksIFRlc3RzQ29uc3RzLlRFU1RTX0ZPTERFUikKICAgdGVzdHNfbWFuaWZlc3RfcGF0aCA9ICIlcy8lcyIgJSAodGVzdHNfcGF0aCwgbWFuaWZlc3QuRklMRU5BTUUpCiAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3RzX21hbmlmZXN0X3BhdGgpOgogICAgIF9QcmludE1lc3NhZ2UoIiVzIGFscmVhZHkgZXhpc3RzLCBub3Qgb3ZlcndyaXR0ZW4iICUgdGVzdHNfbWFuaWZlc3RfcGF0aCkKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvcnVudGVzdC5weSBiL3Rlc3RydW5uZXIvcnVudGVzdC5weQppbmRleCA0YTg2YTYzLi4xOTEwMmM2IDEwMDc1NQotLS0gYS90ZXN0cnVubmVyL3J1bnRlc3QucHkKKysrIGIvdGVzdHJ1bm5lci9ydW50ZXN0LnB5CkBAIC0yMjMsOSArMjIzLDE0IEBACiAKICAgZGVmIF9Eb0J1aWxkKHNlbGYpOgogICAgIGxvZ2dlci5TaWxlbnRMb2coIkJ1aWxkaW5nIHRlc3RzLi4uIikKKworICAgIHRlc3RzID0gc2VsZi5fR2V0VGVzdHNUb1J1bigpCisgICAgIyB0dXJuIG9mZiBkYWx2aWsgdmVyaWZpZXIgaWYgbmVjZXNzYXJ5CisgICAgc2VsZi5fVHVybk9mZlZlcmlmaWVyKHRlc3RzKQorICAgIHNlbGYuX0RvRnVsbEJ1aWxkKHRlc3RzKQorCiAgICAgdGFyZ2V0X3NldCA9IFNldCgpCiAgICAgZXh0cmFfYXJnc19zZXQgPSBTZXQoKQotICAgIHRlc3RzID0gc2VsZi5fR2V0VGVzdHNUb1J1bigpCiAgICAgZm9yIHRlc3Rfc3VpdGUgaW4gdGVzdHM6CiAgICAgICBzZWxmLl9BZGRCdWlsZFRhcmdldCh0ZXN0X3N1aXRlLCB0YXJnZXRfc2V0LCBleHRyYV9hcmdzX3NldCkKIApAQCAtMjUxLDIzICsyNTYsOSBAQAogICAgICAgICAgIGxvZ2dlci5Mb2coY21kKQogICAgICAgICAgIHJ1bl9jb21tYW5kLlJ1bkNvbW1hbmQoY21kLCByZXR1cm5fb3V0cHV0PUZhbHNlKQogCi0gICAgICAjIGhhY2sgdG8gYnVpbGQgY3RzIGRlcGVuZGVuY2llcwotICAgICAgIyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIGJ1aWxkIGRlcGVuZGVuY3kgc3VwcG9ydCBhZGRlZCB0byBydW50ZXN0IG9yCi0gICAgICAjIGN0cyBkZXBlbmRlbmNpZXMgYXJlIHJlbW92ZWQKLSAgICAgIGlmIHNlbGYuX0lzQ3RzVGVzdHModGVzdHMpOgotICAgICAgICAjIG5lZWQgdG8gdXNlIG1ha2Ugc2luY2UgdGhlc2UgZmFpbCBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFCi0gICAgICAgIGNtZCA9ICgnbWFrZSAtaiVzIEN0c1Rlc3RTdHVicyBhbmRyb2lkLmNvcmUudGVzdHMucnVubmVyJyAlCi0gICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLm1ha2Vfam9icykKLSAgICAgICAgbG9nZ2VyLkxvZyhjbWQpCi0gICAgICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLnByZXZpZXc6Ci0gICAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgICAgb3MuY2hkaXIoc2VsZi5fcm9vdF9wYXRoKQotICAgICAgICAgIHJ1bl9jb21tYW5kLlJ1bkNvbW1hbmQoY21kLCByZXR1cm5fb3V0cHV0PUZhbHNlKQotICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCi0gICAgICAjIHR1cm4gb2ZmIGRhbHZpayB2ZXJpZmllciBpZiBuZWNlc3NhcnkKLSAgICAgIHNlbGYuX1R1cm5PZmZWZXJpZmllcih0ZXN0cykKICAgICAgIHRhcmdldF9idWlsZF9zdHJpbmcgPSAiICIuam9pbihsaXN0KHRhcmdldF9zZXQpKQogICAgICAgZXh0cmFfYXJnc19zdHJpbmcgPSAiICIuam9pbihsaXN0KGV4dHJhX2FyZ3Nfc2V0KSkKKwogICAgICAgIyBtbW0gY2Fubm90IGJlIHVzZWQgZnJvbSBweXRob24sIHNvIHBlcmZvcm0gYSBzaW1pbGFyIG9wZXJhdGlvbiB1c2luZwogICAgICAgIyBPTkVfU0hPVF9NQUtFRklMRQogICAgICAgY21kID0gJ09ORV9TSE9UX01BS0VGSUxFPSIlcyIgbWFrZSAtaiVzIC1DICIlcyIgZmlsZXMgJXMnICUgKApAQCAtMjg2LDEyICsyNzcsNDMgQEAKICAgICAgICAgbG9nZ2VyLkxvZygiU3luY2luZyB0byBkZXZpY2UuLi4iKQogICAgICAgICBzZWxmLl9hZGIuU3luYyhydW50aW1lX3Jlc3RhcnQ9cmVidWlsZF9saWJjb3JlKQogCisgIGRlZiBfRG9GdWxsQnVpbGQoc2VsZiwgdGVzdHMpOgorICAgICIiIklmIG5lY2Vzc2FyeSwgcnVuIGEgZnVsbCAnbWFrZScgY29tbWFuZCBmb3IgdGhlIHRlc3RzIHRoYXQgbmVlZCBpdC4iIiIKKyAgICBleHRyYV9hcmdzX3NldCA9IFNldCgpCisKKyAgICAjIGhhY2sgdG8gYnVpbGQgY3RzIGRlcGVuZGVuY2llcworICAgICMgVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiBjdHMgZGVwZW5kZW5jaWVzIGFyZSByZW1vdmVkCisgICAgaWYgc2VsZi5fSXNDdHNUZXN0cyh0ZXN0cyk6CisgICAgICAjIG5lZWQgdG8gdXNlIG1ha2Ugc2luY2UgdGhlc2UgZmFpbCBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFCisgICAgICBleHRyYV9hcmdzX3NldC5hZGQoJ0N0c1Rlc3RTdHVicycpCisgICAgICBleHRyYV9hcmdzX3NldC5hZGQoJ2FuZHJvaWQuY29yZS50ZXN0cy5ydW5uZXInKQorICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgaWYgdGVzdC5Jc0Z1bGxNYWtlKCk6CisgICAgICAgIGlmIHRlc3QuR2V0RXh0cmFCdWlsZEFyZ3MoKToKKyAgICAgICAgICAjIGV4dHJhIGFyZ3MgY29udGFpbnMgdGhlIGFyZ3MgdG8gcGFzcyB0byAnbWFrZScKKyAgICAgICAgICBleHRyYV9hcmdzX3NldC5hZGQodGVzdC5HZXRFeHRyYUJ1aWxkQXJncygpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGxvZ2dlci5Mb2coIldhcm5pbmc6IHRlc3QgJXMgbmVlZHMgYSBmdWxsIGJ1aWxkIGJ1dCBkb2VzIG5vdCBzcGVjaWZ5IgorICAgICAgICAgICAgICAgICAgICAgIiBleHRyYV9idWlsZF9hcmdzIiAlIHRlc3QuR2V0TmFtZSgpKQorCisgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhbnkgdGVzdHMgdGhhdCByZXF1aXJlZCBhIGZ1bGwgYnVpbGQKKyAgICBpZiBleHRyYV9hcmdzX3NldDoKKyAgICAgIGNtZCA9ICgnbWFrZSAtaiVzICVzJyAlIChzZWxmLl9vcHRpb25zLm1ha2Vfam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcuam9pbihsaXN0KGV4dHJhX2FyZ3Nfc2V0KSkpKQorICAgICAgbG9nZ2VyLkxvZyhjbWQpCisgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5wcmV2aWV3OgorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5fcm9vdF9wYXRoKQorICAgICAgICBydW5fY29tbWFuZC5SdW5Db21tYW5kKGNtZCwgcmV0dXJuX291dHB1dD1GYWxzZSkKKyAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKwogICBkZWYgX0FkZEJ1aWxkVGFyZ2V0KHNlbGYsIHRlc3Rfc3VpdGUsIHRhcmdldF9zZXQsIGV4dHJhX2FyZ3Nfc2V0KToKLSAgICBidWlsZF9kaXIgPSB0ZXN0X3N1aXRlLkdldEJ1aWxkUGF0aCgpCi0gICAgaWYgc2VsZi5fQWRkQnVpbGRUYXJnZXRQYXRoKGJ1aWxkX2RpciwgdGFyZ2V0X3NldCk6Ci0gICAgICBleHRyYV9hcmdzX3NldC5hZGQodGVzdF9zdWl0ZS5HZXRFeHRyYUJ1aWxkQXJncygpKQotICAgIGZvciBwYXRoIGluIHRlc3Rfc3VpdGUuR2V0QnVpbGREZXBlbmRlbmNpZXMoc2VsZi5fb3B0aW9ucyk6Ci0gICAgICBzZWxmLl9BZGRCdWlsZFRhcmdldFBhdGgocGF0aCwgdGFyZ2V0X3NldCkKKyAgICBpZiBub3QgdGVzdF9zdWl0ZS5Jc0Z1bGxNYWtlKCk6CisgICAgICBidWlsZF9kaXIgPSB0ZXN0X3N1aXRlLkdldEJ1aWxkUGF0aCgpCisgICAgICBpZiBzZWxmLl9BZGRCdWlsZFRhcmdldFBhdGgoYnVpbGRfZGlyLCB0YXJnZXRfc2V0KToKKyAgICAgICAgZXh0cmFfYXJnc19zZXQuYWRkKHRlc3Rfc3VpdGUuR2V0RXh0cmFCdWlsZEFyZ3MoKSkKKyAgICAgIGZvciBwYXRoIGluIHRlc3Rfc3VpdGUuR2V0QnVpbGREZXBlbmRlbmNpZXMoc2VsZi5fb3B0aW9ucyk6CisgICAgICAgIHNlbGYuX0FkZEJ1aWxkVGFyZ2V0UGF0aChwYXRoLCB0YXJnZXRfc2V0KQogCiAgIGRlZiBfQWRkQnVpbGRUYXJnZXRQYXRoKHNlbGYsIGJ1aWxkX2RpciwgdGFyZ2V0X3NldCk6CiAgICAgaWYgYnVpbGRfZGlyIGlzIG5vdCBOb25lOgpAQCAtMzY1LDYgKzM4Nyw3IEBACiAgICAgICAgICAgc2VsZi5fYWRiLlNlbmRDb21tYW5kKCJyZWJvb3QiKQogICAgICAgICAgIHNlbGYuX2FkYi5TZW5kQ29tbWFuZCgid2FpdC1mb3ItZGV2aWNlIiwgdGltZW91dF90aW1lPTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudD0zKQorICAgICAgICAgIHNlbGYuX2FkYi5FbmFibGVBZGJSb290KCkKIAogICBkZWYgUnVuVGVzdHMoc2VsZik6CiAgICAgIiIiTWFpbiBlbnRyeSBtZXRob2QgLSBleGVjdXRlcyB0aGUgdGVzdHMgYWNjb3JkaW5nIHRvIGNvbW1hbmQgbGluZSBhcmdzLiIiIgpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCmluZGV4IDE3YTM2OTQuLmI5ZDAwNmYgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKQEAgLTEyNSw2ICsxMjUsMTAgQEAKICAgICBidWlsZF9wYXRoPSJmcmFtZXdvcmtzL2Jhc2UvbGlicy91dGlscy90ZXN0cyIKICAgICBkZXNjcmlwdGlvbj0iRnJhbWV3b3JrIGxpYnV0aWxzIHVuaXQgdGVzdHMuIiAvPgogCis8dGVzdC1uYXRpdmUgbmFtZT0ibGliaW5wdXQiCisgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3NlcnZpY2VzL2lucHV0L3Rlc3RzIgorICAgIGRlc2NyaXB0aW9uPSJGcmFtZXdvcmsgbGliaW5wdXQgdW5pdCB0ZXN0cy4iIC8+CisKIDwhLS0gIGVuZCBvZiBmcmFtZXdvcmsgdGVzdHMgLS0+CiAKIDwhLS0gbWVkaWEgZnJhbWV3b3JrIHRlc3RzIC0tPgpAQCAtMjI0LDYgKzIyOCwxMyBAQAogICAgIHJ1bm5lcj0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvbkN0c1Rlc3RSdW5uZXIiCiAgICAgc3VpdGU9ImN0cyIgLz4KIAorPHRlc3QgbmFtZT0iY3RzLWFjY291bnRzIgorICAgIGJ1aWxkX3BhdGg9ImN0cy90ZXN0cy90ZXN0cy9hY2NvdW50cyIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFjY291bnRzLmN0cyIKKyAgICBydW5uZXI9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgIGNvdmVyYWdlX3RhcmdldD0iZnJhbWV3b3JrIgorICAgIHN1aXRlPSJjdHMiIC8+CisKIDx0ZXN0IG5hbWU9ImN0cy1hcGktc2lnbmF0dXJlIgogICAgIGJ1aWxkX3BhdGg9ImN0cy90ZXN0cy9TaWduYXR1cmVUZXN0IgogICAgIHBhY2thZ2U9ImFuZHJvaWQudGVzdHMuc2lndGVzdCIKQEAgLTM5OCwxNSArNDA5LDIzIEBACiAgICAgYnVpbGRfcGF0aD0iZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcyIKICAgICBwYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudGVzdHMiIC8+CiAKKzx0ZXN0IG5hbWU9ImFwcGxpY2F0aW9uc3Byb3YiCisgICAgYnVpbGRfcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL0FwcGxpY2F0aW9uc1Byb3ZpZGVyIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnByb3ZpZGVycy5hcHBsaWNhdGlvbnMudGVzdHMiCisgICAgY292ZXJhZ2VfdGFyZ2V0PSJBcHBsaWNhdGlvbnNQcm92aWRlciIKKyAgICBjb250aW51b3VzPSJ0cnVlIiAvPgorCiA8dGVzdCBuYW1lPSJicm93c2VyIgogICAgIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvQnJvd3NlciIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5icm93c2VyLnRlc3RzIgotICAgIGNvdmVyYWdlX3RhcmdldD0iQnJvd3NlciIgLz4KKyAgICBjb3ZlcmFnZV90YXJnZXQ9IkJyb3dzZXIiCisgICAgY29udGludW91cz0idHJ1ZSIgLz4KIAogPHRlc3QgbmFtZT0iY2FsY3VsYXRvciIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL0NhbGN1bGF0b3IiCiAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY2FsY3VsYXRvcjIudGVzdHMiCi0gICAgY292ZXJhZ2VfdGFyZ2V0PSJDYWxjdWxhdG9yIiAvPgorICAgIGNvdmVyYWdlX3RhcmdldD0iQ2FsY3VsYXRvciIKKyAgICBjb250aW51b3VzPSJ0cnVlIiAvPgogCiA8dGVzdCBuYW1lPSJjYWxlbmRhciIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL0NhbGVuZGFyIgpAQCAtNDU4LDYgKzQ3NywxMiBAQAogICAgIGNsYXNzPSJjb20uYW5kcm9pZC5lbWFpbC5TbWFsbFRlc3RzIgogICAgIGNvdmVyYWdlX3RhcmdldD0iRW1haWwiIC8+CiAKKzx0ZXN0IG5hbWU9ImV4Y2hhbmdlIgorICAgIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvRXhjaGFuZ2UiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZXhjaGFuZ2UudGVzdHMiCisgICAgY292ZXJhZ2VfdGFyZ2V0PSJFeGNoYW5nZSIKKyAgICBjb250aW51b3VzPSJ0cnVlIiAvPgorCiA8dGVzdCBuYW1lPSJtdXNpY3BsYXllciIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL011c2ljIgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm11c2ljLnRlc3RzIgpAQCAtNTA1LDYgKzUzMCwxMiBAQAogICAgIGRlc2NyaXB0aW9uPSJHb29nbGUgdGVzdC4iCiAgICAgZXh0cmFfYnVpbGRfYXJncz0iR1RFU1RfVEVTVFM9MSIgLz4KIAorPCEtLSBMaWJqaW5nbGUgLS0+Cis8dGVzdC1uYXRpdmUgbmFtZT0ibGliamluZ2xlIgorICAgIGJ1aWxkX3BhdGg9InZlbmRvci9nb29nbGUvbGlicmFyaWVzL2xpYmppbmdsZSIKKyAgICBkZXNjcmlwdGlvbj0iTGliamluZ2xlLiIKKyAgICBmdWxsX21ha2U9InRydWUiCisgICAgZXh0cmFfYnVpbGRfYXJncz0iTElCSklOR0xFX1RFU1RTPTEiIC8+CiAKIDwhLS0gaG9zdCBqYXZhIHRlc3RzIC0tPgogPHRlc3QtaG9zdCBuYW1lPSJjdHMtYXBwc2VjdXJpdHkiCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54c2QgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54c2QKaW5kZXggNzEzNDQ1OS4uNjc4MTk0MSAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueHNkCisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhzZApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KIAogICAgICAgICA8IS0tIEZpbGUgc3lzdGVtIHBhdGgsIHJlbGF0aXZlIHRvIEFuZHJvaWQgYnVpbGQgcm9vdCwgdG8gdGhpcwotICAgICAgICBwYWNrYWdlJ3MgQW5kcm9pZC5tayBmaWxlLiAtLT4KKyAgICAgICAgcGFja2FnZSdzIEFuZHJvaWQubWsgZmlsZS4tLT4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJidWlsZF9wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CiAKICAgICAgICAgPCEtLSBJbmNsdWRlIHRlc3QgaW4gY29udGludW91cyB0ZXN0IHN5c3RlbS4gLS0+CkBAIC01NSwxMCArNTUsMTcgQEAKICAgICAgICAgdGVzdC4gLS0+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KIAorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGF0IGEgZnVsbCAnbWFrZScsIGFzIG9wcG9zZWQgdG8gJ21tbScgY29tbWFuZCwgaXMKKyAgICAgICAgbmVlZGVkIHRvIGJ1aWxkIHRoaXMgdGVzdC4gVGhlIGJ1aWxkIGNvbW1hbmQgdXNlZCB3aWxsIGJlCisgICAgICAgICdtYWtlIGV4dHJhX2J1aWxkX2FyZ3MnIC0tPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZ1bGxfbWFrZSIgdHlwZT0ieHM6Ym9vbGVhbiIKKyAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIgLz4KKwogICAgICAgICA8IS0tICBFeHRyYSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIGJ1aWxkIGNvbW1hbmQgd2hlbiBidWlsZGluZyB0aGlzCiAgICAgICAgIHRlc3QuIC0tPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dHJhX2J1aWxkX2FyZ3MiIHR5cGU9InhzOnN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgdXNlPSJvcHRpb25hbCIgLz4KKwogICAgIDwveHM6Y29tcGxleFR5cGU+CiAKICAgICA8IS0tIEphdmEgb24gZGV2aWNlIGluc3RydW1lbnRhdGlvbiB0ZXN0LgpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvaW5zdHJ1bWVudGF0aW9uX3Rlc3QucHkgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy9pbnN0cnVtZW50YXRpb25fdGVzdC5weQppbmRleCA4NzgyNjE1Li40MGQ2YmVkIDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy9pbnN0cnVtZW50YXRpb25fdGVzdC5weQorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy9pbnN0cnVtZW50YXRpb25fdGVzdC5weQpAQCAtMTcsOSArMTcsNiBAQAogCiAiIiJUZXN0U3VpdGUgZGVmaW5pdGlvbiBmb3IgQW5kcm9pZCBpbnN0cnVtZW50YXRpb24gdGVzdHMuIiIiCiAKLSMgcHl0aG9uIGltcG9ydHMKLWltcG9ydCBvcwotCiAjIGxvY2FsIGltcG9ydHMKIGltcG9ydCBjb3ZlcmFnZQogaW1wb3J0IGVycm9ycwpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF9zdWl0ZS5weSBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfc3VpdGUucHkKaW5kZXggOTBkNTc5Mi4uMTAyYTczOCAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF9zdWl0ZS5weQorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3N1aXRlLnB5CkBAIC0zMiw2ICszMiw3IEBACiAgICAgc2VsZi5fc3VpdGUgPSBOb25lCiAgICAgc2VsZi5fZGVzY3JpcHRpb24gPSAnJwogICAgIHNlbGYuX2V4dHJhX2J1aWxkX2FyZ3MgPSAnJworICAgIHNlbGYuX2lzX2Z1bGxfbWFrZSA9IEZhbHNlCiAKICAgZGVmIEdldE5hbWUoc2VsZik6CiAgICAgcmV0dXJuIHNlbGYuX25hbWUKQEAgLTg4LDYgKzg5LDEzIEBACiAgICAgc2VsZi5fZXh0cmFfYnVpbGRfYXJncyA9IGJ1aWxkX2FyZ3MKICAgICByZXR1cm4gc2VsZgogCisgIGRlZiBJc0Z1bGxNYWtlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9pc19mdWxsX21ha2UKKworICBkZWYgU2V0SXNGdWxsTWFrZShzZWxmLCBmdWxsX21ha2UpOgorICAgIHNlbGYuX2lzX2Z1bGxfbWFrZSA9IGZ1bGxfbWFrZQorICAgIHJldHVybiBzZWxmCisKICAgZGVmIFJ1bihzZWxmLCBvcHRpb25zLCBhZGIpOgogICAgICIiIlJ1bnMgdGhlIHRlc3QuCiAKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfd2Fsa2VyLnB5IGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF93YWxrZXIucHkKaW5kZXggNGVmNjkyMy4uZTM0ZGFmYyAxMDA3NTUKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF93YWxrZXIucHkKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF93YWxrZXIucHkKQEAgLTY1LDIwICs2NSwyMCBAQAogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgIGxvZ2dlci5Mb2coJyVzIGRvZXMgbm90IGV4aXN0JyAlIHBhdGgpCiAgICAgICByZXR1cm4gW10KLSAgICBhYnNwYXRoID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCisgICAgcmVhbHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCiAgICAgIyBlbnN1cmUgcGF0aCBpcyBpbiBBTkRST0lEX0JVSUxEX1JPT1QKLSAgICBzZWxmLl9idWlsZF90b3AgPSBhbmRyb2lkX2J1aWxkLkdldFRvcCgpCi0gICAgaWYgbm90IHNlbGYuX0lzUGF0aEluQnVpbGRUcmVlKGFic3BhdGgpOgorICAgIHNlbGYuX2J1aWxkX3RvcCA9IG9zLnBhdGgucmVhbHBhdGgoYW5kcm9pZF9idWlsZC5HZXRUb3AoKSkKKyAgICBpZiBub3Qgc2VsZi5fSXNQYXRoSW5CdWlsZFRyZWUocmVhbHBhdGgpOgogICAgICAgbG9nZ2VyLkxvZygnJXMgaXMgbm90IGEgc3ViLWRpcmVjdG9yeSBvZiBidWlsZCByb290ICVzJyAlCiAgICAgICAgICAgICAgICAgIChwYXRoLCBzZWxmLl9idWlsZF90b3ApKQogICAgICAgcmV0dXJuIFtdCiAKICAgICAjIGZpcnN0LCBhc3N1bWUgcGF0aCBpcyBhIHBhcmVudCBkaXJlY3RvcnksIHdoaWNoIHNwZWNpZmllcyB0byBydW4gYWxsCiAgICAgIyB0ZXN0cyB3aXRoaW4gdGhpcyBkaXJlY3RvcnkKLSAgICB0ZXN0cyA9IHNlbGYuX0ZpbmRTdWJUZXN0cyhhYnNwYXRoLCBbXSkKKyAgICB0ZXN0cyA9IHNlbGYuX0ZpbmRTdWJUZXN0cyhyZWFscGF0aCwgW10pCiAgICAgaWYgbm90IHRlc3RzOgogICAgICAgbG9nZ2VyLlNpbGVudExvZygnTm8gdGVzdHMgZm91bmQgd2l0aGluICVzLCBzZWFyY2hpbmcgdXB3YXJkcycgJSBwYXRoKQotICAgICAgdGVzdHMgPSBzZWxmLl9GaW5kVXBzdHJlYW1UZXN0cyhhYnNwYXRoKQorICAgICAgdGVzdHMgPSBzZWxmLl9GaW5kVXBzdHJlYW1UZXN0cyhyZWFscGF0aCkKICAgICByZXR1cm4gdGVzdHMKIAogICBkZWYgX0lzUGF0aEluQnVpbGRUcmVlKHNlbGYsIHBhdGgpOgpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMveG1sX3N1aXRlX2hlbHBlci5weSBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3htbF9zdWl0ZV9oZWxwZXIucHkKaW5kZXggYjdlZDgzYi4uNmNmMmU2YyAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMveG1sX3N1aXRlX2hlbHBlci5weQorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy94bWxfc3VpdGVfaGVscGVyLnB5CkBAIC0zOSw2ICszOSw3IEBACiAgIF9TVUlURV9BVFRSID0gJ3N1aXRlJwogICBfREVTQ1JJUFRJT05fQVRUUiA9ICdkZXNjcmlwdGlvbicKICAgX0VYVFJBX0JVSUxEX0FSR1NfQVRUUiA9ICdleHRyYV9idWlsZF9hcmdzJworICBfRlVMTF9NQUtFX0FUVFIgPSAnZnVsbF9tYWtlJwogCiAgIGRlZiBQYXJzZShzZWxmLCBlbGVtZW50KToKICAgICAiIiJQb3B1bGF0ZXMgY29tbW9uIHN1aXRlIGF0dHJpYnV0ZXMgZnJvbSBnaXZlbiBzdWl0ZSB4bWwgZWxlbWVudC4KQEAgLTc5LDYgKzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWU9JycpKQogICAgIHRlc3Rfc3VpdGUuU2V0RXh0cmFCdWlsZEFyZ3Moc2VsZi5fUGFyc2VBdHRyaWJ1dGUoCiAgICAgICAgIHN1aXRlX2VsZW1lbnQsIHNlbGYuX0VYVFJBX0JVSUxEX0FSR1NfQVRUUiwgRmFsc2UsIGRlZmF1bHRfdmFsdWU9JycpKQorICAgIHRlc3Rfc3VpdGUuU2V0SXNGdWxsTWFrZShzZWxmLl9QYXJzZUF0dHJpYnV0ZSgKKyAgICAgICAgc3VpdGVfZWxlbWVudCwgc2VsZi5fRlVMTF9NQUtFX0FUVFIsIEZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlKSkKKwogCiAgIGRlZiBfUGFyc2VBdHRyaWJ1dGUoc2VsZiwgc3VpdGVfZWxlbWVudCwgYXR0cmlidXRlX25hbWUsIG1hbmRhdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlPU5vbmUpOgpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9BbmRyb2lkLm1rIGIvdG9vbHMvYTNkY29udmVydC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzYzNGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIEhvc3QgZXhlY3V0YWJsZQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYTNkY29udmVydAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfUlNfU0VSSUFMSVpFCisjIE5lZWRlZCBmb3IgY29sbGFkYURvbQorTE9DQUxfQ0ZMQUdTICs9IC1ETk9fQk9PU1QgLURET01fSU5DTFVERV9USU5ZWE1MIC1ETk9fWkFFCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgYTNkY29udmVydC5jcHAgXAorICAgIE9iakxvYWRlci5jcHAgXAorICAgIENvbGxhZGFDb25kaXRpb25lci5jcHAgXAorICAgIENvbGxhZGFHZW9tZXRyeS5jcHAgXAorICAgIENvbGxhZGFMb2FkZXIuY3BwCisKKworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9jb2xsYWRhL2luY2x1ZGUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZXh0ZXJuYWwvY29sbGFkYS9pbmNsdWRlLzEuNAorTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2Jhc2UvbGlicy9ycworCitMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYlJTc2VyaWFsaXplIGxpYnV0aWxzIGxpYmN1dGlscworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBjb2xsYWRhZG9tIGxpYnRpbnl4bWwgbGlicGNyZWNwcCBsaWJwY3JlCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhQ29uZGl0aW9uZXIuY3BwIGIvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhQ29uZGl0aW9uZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L0NvbGxhZGFDb25kaXRpb25lci5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgT3BlbiBTb3VyY2UgTGljZW5zZSwgZm9yIGRldGFpbHMgcGxlYXNlIHNlZSBsaWNlbnNlLnR4dCBvciB0aGUgd2Vic2l0ZQorKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAorKgorKi8KKworI2luY2x1ZGUgIkNvbGxhZGFDb25kaXRpb25lci5oIgordW5zaWduZWQgaW50IENvbGxhZGFDb25kaXRpb25lcjo6Z2V0TWF4T2Zmc2V0KCBkb21JbnB1dExvY2FsT2Zmc2V0X0FycmF5ICZpbnB1dF9hcnJheSApIHsKKworICAgIHVuc2lnbmVkIGludCBtYXhPZmZzZXQgPSAwOworICAgIGZvciAoIHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGlucHV0X2FycmF5LmdldENvdW50KCk7IGkrKyApIHsKKyAgICAgICAgaWYgKCBpbnB1dF9hcnJheVtpXS0+Z2V0T2Zmc2V0KCkgPiBtYXhPZmZzZXQgKSB7CisgICAgICAgICAgICBtYXhPZmZzZXQgPSAodW5zaWduZWQgaW50KWlucHV0X2FycmF5W2ldLT5nZXRPZmZzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4T2Zmc2V0OworfQorCit2b2lkIENvbGxhZGFDb25kaXRpb25lcjo6Y3JlYXRlVHJpYW5nbGVzRnJvbVBvbHlsaXN0KCBkb21NZXNoICp0aGlzTWVzaCwgZG9tUG9seWxpc3QgKnRoaXNQb2x5bGlzdCApIHsKKworICAgIC8vIENyZWF0ZSBhIG5ldyA8dHJpYW5nbGVzPiBpbnNpZGUgdGhlIG1lc2ggdGhhdCBoYXMgdGhlIHNhbWUgbWF0ZXJpYWwgYXMgdGhlIDxwb2x5bGlzdD4KKyAgICBkb21UcmlhbmdsZXMgKnRoaXNUcmlhbmdsZXMgPSAoZG9tVHJpYW5nbGVzICopdGhpc01lc2gtPmNyZWF0ZUFuZFBsYWNlKCJ0cmlhbmdsZXMiKTsKKyAgICAvL3RoaXNUcmlhbmdsZXMtPnNldENvdW50KCAwICk7CisgICAgdW5zaWduZWQgaW50IHRyaWFuZ2xlcyA9IDA7CisgICAgdGhpc1RyaWFuZ2xlcy0+c2V0TWF0ZXJpYWwodGhpc1BvbHlsaXN0LT5nZXRNYXRlcmlhbCgpKTsKKyAgICBkb21QKiBwX3RyaWFuZ2xlcyA9IChkb21QKil0aGlzVHJpYW5nbGVzLT5jcmVhdGVBbmRQbGFjZSgicCIpOworCisgICAgLy8gR2l2ZSB0aGUgbmV3IDx0cmlhbmdsZXM+IHRoZSBzYW1lIDxfZGFlPiBhbmQgPHBhcmFtZXRlcnM+IGFzIHRoZSBvbGQgPHBvbHlsaXN0PgorICAgIGZvcihpbnQgaT0wOyBpPChpbnQpKHRoaXNQb2x5bGlzdC0+Z2V0SW5wdXRfYXJyYXkoKS5nZXRDb3VudCgpKTsgaSsrKSB7CisKKyAgICAgICAgdGhpc1RyaWFuZ2xlcy0+cGxhY2VFbGVtZW50KCB0aGlzUG9seWxpc3QtPmdldElucHV0X2FycmF5KClbaV0tPmNsb25lKCkgKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBpbnB1dHMgYW5kIHByaW1pdGl2ZXMgZm9yIHRoZSBwb2x5Z29ucyBhcnJheQorICAgIGludCBudW1iZXJPZklucHV0cyA9IChpbnQpZ2V0TWF4T2Zmc2V0KHRoaXNQb2x5bGlzdC0+Z2V0SW5wdXRfYXJyYXkoKSkgKyAxOworICAgIGludCBudW1iZXJPZlByaW1pdGl2ZXMgPSAoaW50KSh0aGlzUG9seWxpc3QtPmdldFZjb3VudCgpLT5nZXRWYWx1ZSgpLmdldENvdW50KCkpOworCisgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisKKyAgICAvLyBUcmlhbmd1bGF0ZSBhbGwgdGhlIHByaW1pdGl2ZXMsIHRoaXMgZ2VuZXJhdGVzIGFsbCB0aGUgdHJpYW5nbGVzIGluIGEgc2luZ2xlIDxwPiBlbGVtZW50CisgICAgZm9yKGludCBqID0gMDsgaiA8IG51bWJlck9mUHJpbWl0aXZlczsgaisrKSB7CisKKyAgICAgICAgaW50IHRyaWFuZ2xlQ291bnQgPSAoaW50KXRoaXNQb2x5bGlzdC0+Z2V0VmNvdW50KCktPmdldFZhbHVlKClbal0gLTI7CisgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgcHJpbWl0aXZlcyBhcyB0cmlhbmdsZXMsIGp1c3QgZmFuIHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IGFzIHRoZSBiYXNlCisgICAgICAgIGludCBpZHggPSBudW1iZXJPZklucHV0czsKKyAgICAgICAgZm9yKGludCBrID0gMDsgayA8IHRyaWFuZ2xlQ291bnQ7IGsrKykgeworICAgICAgICAgICAgLy8gRmlyc3QgdmVydGV4CisgICAgICAgICAgICBmb3IoaW50IGwgPSAwOyBsIDwgbnVtYmVyT2ZJbnB1dHM7IGwrKykgeworCisgICAgICAgICAgICAgICAgcF90cmlhbmdsZXMtPmdldFZhbHVlKCkuYXBwZW5kKHRoaXNQb2x5bGlzdC0+Z2V0UCgpLT5nZXRWYWx1ZSgpW29mZnNldCArIGxdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNlY29uZCB2ZXJ0ZXgKKyAgICAgICAgICAgIGZvcihpbnQgbCA9IDA7IGwgPCBudW1iZXJPZklucHV0czsgbCsrKSB7CisKKyAgICAgICAgICAgICAgICBwX3RyaWFuZ2xlcy0+Z2V0VmFsdWUoKS5hcHBlbmQodGhpc1BvbHlsaXN0LT5nZXRQKCktPmdldFZhbHVlKClbb2Zmc2V0ICsgaWR4ICsgbF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhpcmQgdmVydGV4CisgICAgICAgICAgICBpZHggKz0gbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgICAgICBmb3IoaW50IGwgPSAwOyBsIDwgbnVtYmVyT2ZJbnB1dHM7IGwrKykgeworCisgICAgICAgICAgICAgICAgcF90cmlhbmdsZXMtPmdldFZhbHVlKCkuYXBwZW5kKHRoaXNQb2x5bGlzdC0+Z2V0UCgpLT5nZXRWYWx1ZSgpW29mZnNldCArIGlkeCArIGxdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyaWFuZ2xlcysrOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAodW5zaWduZWQgaW50KXRoaXNQb2x5bGlzdC0+Z2V0VmNvdW50KCktPmdldFZhbHVlKClbal0gKiBudW1iZXJPZklucHV0czsKKyAgICB9CisgICAgdGhpc1RyaWFuZ2xlcy0+c2V0Q291bnQoIHRyaWFuZ2xlcyApOworCit9CisKK3ZvaWQgQ29sbGFkYUNvbmRpdGlvbmVyOjpjcmVhdGVUcmlhbmdsZXNGcm9tUG9seWdvbnMoIGRvbU1lc2ggKnRoaXNNZXNoLCBkb21Qb2x5Z29ucyAqdGhpc1BvbHlnb25zICkgeworCisgICAgLy8gQ3JlYXRlIGEgbmV3IDx0cmlhbmdsZXM+IGluc2lkZSB0aGUgbWVzaCB0aGF0IGhhcyB0aGUgc2FtZSBtYXRlcmlhbCBhcyB0aGUgPHBvbHlnb25zPgorICAgIGRvbVRyaWFuZ2xlcyAqdGhpc1RyaWFuZ2xlcyA9IChkb21UcmlhbmdsZXMgKil0aGlzTWVzaC0+Y3JlYXRlQW5kUGxhY2UoInRyaWFuZ2xlcyIpOworICAgIHRoaXNUcmlhbmdsZXMtPnNldENvdW50KCAwICk7CisgICAgdGhpc1RyaWFuZ2xlcy0+c2V0TWF0ZXJpYWwodGhpc1BvbHlnb25zLT5nZXRNYXRlcmlhbCgpKTsKKyAgICBkb21QKiBwX3RyaWFuZ2xlcyA9IChkb21QKil0aGlzVHJpYW5nbGVzLT5jcmVhdGVBbmRQbGFjZSgicCIpOworCisgICAgLy8gR2l2ZSB0aGUgbmV3IDx0cmlhbmdsZXM+IHRoZSBzYW1lIDxfZGFlPiBhbmQgPHBhcmFtZXRlcnM+IGFzIHRoZSBvbGQgPHBvbHlnb25zPgorICAgIGZvcihpbnQgaT0wOyBpPChpbnQpKHRoaXNQb2x5Z29ucy0+Z2V0SW5wdXRfYXJyYXkoKS5nZXRDb3VudCgpKTsgaSsrKSB7CisKKyAgICAgICAgdGhpc1RyaWFuZ2xlcy0+cGxhY2VFbGVtZW50KCB0aGlzUG9seWdvbnMtPmdldElucHV0X2FycmF5KClbaV0tPmNsb25lKCkgKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBpbnB1dHMgYW5kIHByaW1pdGl2ZXMgZm9yIHRoZSBwb2x5Z29ucyBhcnJheQorICAgIGludCBudW1iZXJPZklucHV0cyA9IChpbnQpZ2V0TWF4T2Zmc2V0KHRoaXNQb2x5Z29ucy0+Z2V0SW5wdXRfYXJyYXkoKSkgKzE7CisgICAgaW50IG51bWJlck9mUHJpbWl0aXZlcyA9IChpbnQpKHRoaXNQb2x5Z29ucy0+Z2V0UF9hcnJheSgpLmdldENvdW50KCkpOworCisgICAgLy8gVHJpYW5ndWxhdGUgYWxsIHRoZSBwcmltaXRpdmVzLCB0aGlzIGdlbmVyYXRlcyBhbGwgdGhlIHRyaWFuZ2xlcyBpbiBhIHNpbmdsZSA8cD4gZWxlbWVudAorICAgIGZvcihpbnQgaiA9IDA7IGogPCBudW1iZXJPZlByaW1pdGl2ZXM7IGorKykgeworCisgICAgICAgIC8vIENoZWNrIHRoZSBwb2x5Z29ucyBmb3IgY29uc2lzdGFuY3kgKHNvbWUgZXhwb3J0ZWQgZmlsZXMgaGF2ZSBoYWQgdGhlIHdyb25nIG51bWJlciBvZiBpbmRpY2VzKQorICAgICAgICBkb21QICogdGhpc1ByaW1pdGl2ZSA9IHRoaXNQb2x5Z29ucy0+Z2V0UF9hcnJheSgpW2pdOworICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gKGludCkodGhpc1ByaW1pdGl2ZS0+Z2V0VmFsdWUoKS5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gU2tpcCB0aGUgaW52YWxpZCBwcmltaXRpdmUKKyAgICAgICAgaWYoKGVsZW1lbnRDb3VudCAlIG51bWJlck9mSW5wdXRzKSAhPSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0cmlhbmdsZUNvdW50ID0gKGVsZW1lbnRDb3VudC9udW1iZXJPZklucHV0cyktMjsKKyAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgcHJpbWl0aXZlcyBhcyB0cmlhbmdsZXMsIGp1c3QgZmFuIHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IGFzIHRoZSBiYXNlCisgICAgICAgICAgICBpbnQgaWR4ID0gbnVtYmVyT2ZJbnB1dHM7CisgICAgICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgdHJpYW5nbGVDb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgdmVydGV4CisgICAgICAgICAgICAgICAgZm9yKGludCBsID0gMDsgbCA8IG51bWJlck9mSW5wdXRzOyBsKyspIHsKKworICAgICAgICAgICAgICAgICAgICBwX3RyaWFuZ2xlcy0+Z2V0VmFsdWUoKS5hcHBlbmQodGhpc1ByaW1pdGl2ZS0+Z2V0VmFsdWUoKVtsXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNlY29uZCB2ZXJ0ZXgKKyAgICAgICAgICAgICAgICBmb3IoaW50IGwgPSAwOyBsIDwgbnVtYmVyT2ZJbnB1dHM7IGwrKykgeworCisgICAgICAgICAgICAgICAgICAgIHBfdHJpYW5nbGVzLT5nZXRWYWx1ZSgpLmFwcGVuZCh0aGlzUHJpbWl0aXZlLT5nZXRWYWx1ZSgpW2lkeCArIGxdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhpcmQgdmVydGV4CisgICAgICAgICAgICAgICAgaWR4ICs9IG51bWJlck9mSW5wdXRzOworICAgICAgICAgICAgICAgIGZvcihpbnQgbCA9IDA7IGwgPCBudW1iZXJPZklucHV0czsgbCsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcF90cmlhbmdsZXMtPmdldFZhbHVlKCkuYXBwZW5kKHRoaXNQcmltaXRpdmUtPmdldFZhbHVlKClbaWR4ICsgbF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzVHJpYW5nbGVzLT5zZXRDb3VudCh0aGlzVHJpYW5nbGVzLT5nZXRDb3VudCgpKzEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKworYm9vbCBDb2xsYWRhQ29uZGl0aW9uZXI6OnRyaWFuZ3VsYXRlKERBRSAqZGFlKSB7CisKKyAgICBpbnQgZXJyb3IgPSAwOworCisgICAgLy8gSG93IG1hbnkgZ2VvbWV0cnkgZWxlbWVudHMgYXJlIHRoZXJlPworICAgIGludCBnZW9tZXRyeUVsZW1lbnRDb3VudCA9IChpbnQpKGRhZS0+Z2V0RGF0YWJhc2UoKS0+Z2V0RWxlbWVudENvdW50KE5VTEwsICJnZW9tZXRyeSIgKSk7CisKKyAgICBmb3IoaW50IGN1cnJlbnRHZW9tZXRyeSA9IDA7IGN1cnJlbnRHZW9tZXRyeSA8IGdlb21ldHJ5RWxlbWVudENvdW50OyBjdXJyZW50R2VvbWV0cnkrKykgeworCisgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgZ2VvbWV0cnkgZWxlbWVudAorICAgICAgICBkb21HZW9tZXRyeSAqdGhpc0dlb21ldHJ5OworICAgICAgICAvLyAgICAgIGVycm9yID0gX2RhZS0+Z2V0RGF0YWJhc2UoKS0+Z2V0RWxlbWVudCgoZGFlRWxlbWVudCoqKSZ0aGlzR2VvbWV0cnksY3VycmVudEdlb21ldHJ5LCBOVUxMLCAiZ2VvbWV0cnkiKTsKKyAgICAgICAgZGFlRWxlbWVudCAqIGVsZW1lbnQgPSAwOworICAgICAgICBlcnJvciA9IGRhZS0+Z2V0RGF0YWJhc2UoKS0+Z2V0RWxlbWVudCgmZWxlbWVudCxjdXJyZW50R2VvbWV0cnksIE5VTEwsICJnZW9tZXRyeSIpOworICAgICAgICB0aGlzR2VvbWV0cnkgPSAoZG9tR2VvbWV0cnkgKikgZWxlbWVudDsKKworICAgICAgICAvLyBHZXQgdGhlIG1lc2ggb3V0IG9mIHRoZSBnZW9tZXRyeQorICAgICAgICBkb21NZXNoICp0aGlzTWVzaCA9IHRoaXNHZW9tZXRyeS0+Z2V0TWVzaCgpOworCisgICAgICAgIGlmICh0aGlzTWVzaCA9PSBOVUxMKXsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcG9seWdvbiBlbGVtZW50cworICAgICAgICBmb3IoaW50IGN1cnJlbnRQb2x5Z29ucyA9IDA7IGN1cnJlbnRQb2x5Z29ucyA8IChpbnQpKHRoaXNNZXNoLT5nZXRQb2x5Z29uc19hcnJheSgpLmdldENvdW50KCkpOyBjdXJyZW50UG9seWdvbnMrKykgeworCisgICAgICAgICAgICAvLyBHZXQgdGhlIHBvbHlnb25zIG91dCBvZiB0aGUgbWVzaAorICAgICAgICAgICAgLy8gQWx3YXlzIGdldCBpbmRleCAwIGJlY2F1c2UgZXZlcnkgcGFzcyB0aHJvdWdoIHRoaXMgbG9vcCBkZWxldGVzIHRoZSA8cG9seWdvbnM+IGVsZW1lbnQgYXMgaXQgZmluaXNoZXMgd2l0aCBpdAorICAgICAgICAgICAgZG9tUG9seWdvbnMgKnRoaXNQb2x5Z29ucyA9IHRoaXNNZXNoLT5nZXRQb2x5Z29uc19hcnJheSgpW2N1cnJlbnRQb2x5Z29uc107CisgICAgICAgICAgICBjcmVhdGVUcmlhbmdsZXNGcm9tUG9seWdvbnMoIHRoaXNNZXNoLCB0aGlzUG9seWdvbnMgKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodGhpc01lc2gtPmdldFBvbHlnb25zX2FycmF5KCkuZ2V0Q291bnQoKSA+IDApIHsKKworICAgICAgICAgICAgZG9tUG9seWdvbnMgKnRoaXNQb2x5Z29ucyA9IHRoaXNNZXNoLT5nZXRQb2x5Z29uc19hcnJheSgpLmdldCgwKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcG9seWdvbnMgZnJvbSB0aGUgbWVzaAorICAgICAgICAgICAgdGhpc01lc2gtPnJlbW92ZUNoaWxkRWxlbWVudCh0aGlzUG9seWdvbnMpOworICAgICAgICB9CisgICAgICAgIGludCBwb2x5bGlzdEVsZW1lbnRDb3VudCA9IChpbnQpKHRoaXNNZXNoLT5nZXRQb2x5bGlzdF9hcnJheSgpLmdldENvdW50KCkpOworICAgICAgICBmb3IoaW50IGN1cnJlbnRQb2x5bGlzdCA9IDA7IGN1cnJlbnRQb2x5bGlzdCA8IHBvbHlsaXN0RWxlbWVudENvdW50OyBjdXJyZW50UG9seWxpc3QrKykgeworCisgICAgICAgICAgICAvLyBHZXQgdGhlIHBvbHlsaXN0IG91dCBvZiB0aGUgbWVzaAorICAgICAgICAgICAgLy8gQWx3YXlzIGdldCBpbmRleCAwIGJlY2F1c2UgZXZlcnkgcGFzcyB0aHJvdWdoIHRoaXMgbG9vcCBkZWxldGVzIHRoZSA8cG9seWdvbnM+IGVsZW1lbnQgYXMgaXQgZmluaXNoZXMgd2l0aCBpdAorICAgICAgICAgICAgZG9tUG9seWxpc3QgKnRoaXNQb2x5bGlzdCA9IHRoaXNNZXNoLT5nZXRQb2x5bGlzdF9hcnJheSgpW2N1cnJlbnRQb2x5bGlzdF07CisgICAgICAgICAgICBjcmVhdGVUcmlhbmdsZXNGcm9tUG9seWxpc3QoIHRoaXNNZXNoLCB0aGlzUG9seWxpc3QgKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodGhpc01lc2gtPmdldFBvbHlsaXN0X2FycmF5KCkuZ2V0Q291bnQoKSA+IDApIHsKKworICAgICAgICAgICAgZG9tUG9seWxpc3QgKnRoaXNQb2x5bGlzdCA9IHRoaXNNZXNoLT5nZXRQb2x5bGlzdF9hcnJheSgpLmdldCgwKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcG9seWxpc3QgZnJvbSB0aGUgbWVzaAorICAgICAgICAgICAgdGhpc01lc2gtPnJlbW92ZUNoaWxkRWxlbWVudCh0aGlzUG9seWxpc3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoZXJyb3IgPT0gMCk7Cit9CisKK2Jvb2wgQ29sbGFkYUNvbmRpdGlvbmVyOjp0cmlhbmd1bGF0ZShjb25zdCBjaGFyICppbnB1dEZpbGUpIHsKKworICAgIERBRSBkYWU7CisgICAgYm9vbCBjb252ZXJ0U3VjZWVkZWQgPSB0cnVlOworICAgIGRvbUNPTExBREEqIHJvb3QgPSBkYWUub3BlbihpbnB1dEZpbGUpOworCisgICAgaWYgKCFyb290KSB7CisgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIHJlYWQgZmlsZSAlcy5cbiIsIGlucHV0RmlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb252ZXJ0U3VjZWVkZWQgPSB0cmlhbmd1bGF0ZSgmZGFlKTsKKworICAgIGRhZS53cml0ZUFsbCgpOworICAgIGlmKCFjb252ZXJ0U3VjZWVkZWQpIHsKKyAgICAgICAgcHJpbnRmKCJFbmNvdW50ZXJlZCBlcnJvcnNcbiIpOworICAgIH0KKworICAgIHJldHVybiBjb252ZXJ0U3VjZWVkZWQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhQ29uZGl0aW9uZXIuaCBiL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUNvbmRpdGlvbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwYjdiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUNvbmRpdGlvbmVyLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBPcGVuIFNvdXJjZSBMaWNlbnNlLCBmb3IgZGV0YWlscyBwbGVhc2Ugc2VlIGxpY2Vuc2UudHh0IG9yIHRoZSB3ZWJzaXRlCisqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisqCisqLworCisjaWZuZGVmIENPTExBREFfQ09ORElUSU9ORVIKKyNkZWZpbmUgQ09MTEFEQV9DT05ESVRJT05FUgorCisjaW5jbHVkZSA8ZGFlLmg+CisjaW5jbHVkZSA8ZG9tL2RvbUNvbnN0YW50cy5oPgorI2luY2x1ZGUgPGRvbS9kb21DT0xMQURBLmg+CisKK2NsYXNzIENvbGxhZGFDb25kaXRpb25lciB7CisKK3ByaXZhdGU6CisgICAgdW5zaWduZWQgaW50IGdldE1heE9mZnNldCggZG9tSW5wdXRMb2NhbE9mZnNldF9BcnJheSAmaW5wdXRfYXJyYXkgKTsKKyAgICB2b2lkIGNyZWF0ZVRyaWFuZ2xlc0Zyb21Qb2x5bGlzdCggZG9tTWVzaCAqdGhpc01lc2gsIGRvbVBvbHlsaXN0ICp0aGlzUG9seWxpc3QgKTsKKyAgICB2b2lkIGNyZWF0ZVRyaWFuZ2xlc0Zyb21Qb2x5Z29ucyggZG9tTWVzaCAqdGhpc01lc2gsIGRvbVBvbHlnb25zICp0aGlzUG9seWdvbnMgKTsKKworcHVibGljOgorICAgIGJvb2wgdHJpYW5ndWxhdGUoREFFICpkYWUpOworICAgIGJvb2wgdHJpYW5ndWxhdGUoY29uc3QgY2hhciAqaW5wdXRGaWxlKTsKK307CisKKyNlbmRpZiAvL0NPTExBREFfQ09ORElUSU9ORVIKZGlmZiAtLWdpdCBhL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUdlb21ldHJ5LmNwcCBiL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUdlb21ldHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJhNGYxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhR2VvbWV0cnkuY3BwCkBAIC0wLDAgKzEsMzE5IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIE9wZW4gU291cmNlIExpY2Vuc2UsIGZvciBkZXRhaWxzIHBsZWFzZSBzZWUgbGljZW5zZS50eHQgb3IgdGhlIHdlYnNpdGUKKyogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyoKKyovCisKKyNpbmNsdWRlICJDb2xsYWRhR2VvbWV0cnkuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCitDb2xsYWRhR2VvbWV0cnk6OkNvbGxhZGFHZW9tZXRyeSgpIDoKKyAgICAgICAgbVBvc2l0aW9uRmxvYXRzKE5VTEwpLCBtUG9zaXRpb25PZmZzZXQoLTEpLAorICAgICAgICBtTm9ybWFsRmxvYXRzKE5VTEwpLCBtTm9ybWFsT2Zmc2V0KC0xKSwKKyAgICAgICAgbVRhbmdlbnRGbG9hdHMoTlVMTCksIG1UYW5nZW50T2Zmc2V0KC0xKSwKKyAgICAgICAgbUJpbm9ybWFsRmxvYXRzKE5VTEwpLCBtQmlub3JtYWxPZmZzZXQoLTEpLAorICAgICAgICBtVGV4dHVyZTFGbG9hdHMoTlVMTCksIG1UZXh0dXJlMU9mZnNldCgtMSksCisgICAgICAgIG1NdWx0aUluZGV4T2Zmc2V0KC0xKSwKKyAgICAgICAgbVBvc2l0aW9uc1N0cmlkZSgzKSwgbU5vcm1hbHNTdHJpZGUoMyksCisgICAgICAgIG1UZXh0dXJlQ29vcmRzU3RyaWRlKDIpLCBtVGFuZ2VudHNzU3RyaWRlKDMpLCBtQmlub3JtYWxzU3RyaWRlKDMpIHsKKworICAgIG1Db252ZXJ0ZWRNZXNoLmFwcGVuZENoYW5uZWwoInBvc2l0aW9uIiwgbVBvc2l0aW9uc1N0cmlkZSk7CisgICAgbUNvbnZlcnRlZE1lc2guYXBwZW5kQ2hhbm5lbCgibm9ybWFsIiwgbU5vcm1hbHNTdHJpZGUpOworICAgIG1Db252ZXJ0ZWRNZXNoLmFwcGVuZENoYW5uZWwoInRleHR1cmUwIiwgbVRleHR1cmVDb29yZHNTdHJpZGUpOworICAgIG1Db252ZXJ0ZWRNZXNoLmFwcGVuZENoYW5uZWwoImJpbm9ybWFsIiwgbUJpbm9ybWFsc1N0cmlkZSk7CisgICAgbUNvbnZlcnRlZE1lc2guYXBwZW5kQ2hhbm5lbCgidGFuZ2VudCIsIG1UYW5nZW50c3NTdHJpZGUpOworCisgICAgbVBvc2l0aW9ucyA9ICZtQ29udmVydGVkTWVzaC5tQ2hhbm5lbHNbMF0ubURhdGE7CisgICAgbU5vcm1hbHMgPSAmbUNvbnZlcnRlZE1lc2gubUNoYW5uZWxzWzFdLm1EYXRhOworICAgIG1UZXh0dXJlQ29vcmRzID0gJm1Db252ZXJ0ZWRNZXNoLm1DaGFubmVsc1syXS5tRGF0YTsKKyAgICBtQmlub3JtYWxzID0gJm1Db252ZXJ0ZWRNZXNoLm1DaGFubmVsc1szXS5tRGF0YTsKKyAgICBtVGFuZ2VudHMgPSAmbUNvbnZlcnRlZE1lc2gubUNoYW5uZWxzWzRdLm1EYXRhOworfQorCitib29sIENvbGxhZGFHZW9tZXRyeTo6aW5pdChkb21HZW9tZXRyeVJlZiBnZW9tZXRyeSkgeworCisgICAgYm9vbCBjb252ZXJ0U3VjZWVkZWQgPSB0cnVlOworCisgICAgY29uc3QgY2hhciogZ2VvTmFtZSA9IGdlb21ldHJ5LT5nZXROYW1lKCk7CisgICAgaWYgKGdlb05hbWUgPT0gTlVMTCkgeworICAgICAgICBnZW9OYW1lID0gZ2VvbWV0cnktPmdldElkKCk7CisgICAgfQorICAgIG1Db252ZXJ0ZWRNZXNoLm1OYW1lID0gZ2VvTmFtZTsKKyAgICBtTWVzaCA9IGdlb21ldHJ5LT5nZXRNZXNoKCk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBpbmRleCBncm91cHMgYW5kIGJ1aWxkIHVwIGEgc2ltcGxlIHJlc29sdmVkIHRyaSBsaXN0IGFuZCB2ZXJ0ZXggYXJyYXkKKyAgICBjb25zdCBkb21UcmlhbmdsZXNfQXJyYXkgJmFsbFRyaUxpc3RzID0gbU1lc2gtPmdldFRyaWFuZ2xlc19hcnJheSgpOworICAgIGludCBudW1UcmlMaXN0cyA9IGFsbFRyaUxpc3RzLmdldENvdW50KCk7CisgICAgbUNvbnZlcnRlZE1lc2gubVRyaWFuZ2xlTGlzdHMucmVzZXJ2ZShudW1UcmlMaXN0cyk7CisgICAgbUNvbnZlcnRlZE1lc2gubVRyaWFuZ2xlTGlzdE5hbWVzLnJlc2VydmUobnVtVHJpTGlzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHJpTGlzdHM7IGkgKyspIHsKKyAgICAgICAgYWRkVHJpYW5nbGVzKGFsbFRyaUxpc3RzW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydFN1Y2VlZGVkOworfQorCit2b2lkIENvbGxhZGFHZW9tZXRyeTo6YWRkVHJpYW5nbGVzKGRvbVRyaWFuZ2xlcyAqIGNvbGxhZGFUcmlhbmdsZXMpIHsKKworICAgIGludCBudW1UcmlhbmdsZXMgPSBjb2xsYWRhVHJpYW5nbGVzLT5nZXRDb3VudCgpOworICAgIGludCB0cmlMaXN0SW5kZXggPSBtQ29udmVydGVkTWVzaC5tVHJpYW5nbGVMaXN0cy5zaXplKCk7CisgICAgbUNvbnZlcnRlZE1lc2gubVRyaWFuZ2xlTGlzdHMucmVzaXplKHRyaUxpc3RJbmRleCArIDEpOworICAgIHN0ZDo6c3RyaW5nIG1hdGVyaWFsTmFtZSA9IGNvbGxhZGFUcmlhbmdsZXMtPmdldE1hdGVyaWFsKCk7CisgICAgaWYgKG1hdGVyaWFsTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgImluZGV4JWQiLCB0cmlMaXN0SW5kZXgpOworICAgICAgICBtYXRlcmlhbE5hbWUgPSBidWZmZXI7CisgICAgfQorICAgIG1Db252ZXJ0ZWRNZXNoLm1UcmlhbmdsZUxpc3ROYW1lcy5wdXNoX2JhY2sobWF0ZXJpYWxOYW1lKTsKKworICAgIC8vIEl0J3MgYSBnb29kIGlkZWEgdG8gdGVsbCBzdGwgaG93IG11Y2ggbWVtb3J5IHdlIGludGVuZCB0byB1c2UKKyAgICAvLyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHJlYWxsb2NhdGlvbnMKKyAgICBtUG9zaXRpb25zLT5yZXNlcnZlKG51bVRyaWFuZ2xlcyAqIDMpOworICAgIG1Ob3JtYWxzLT5yZXNlcnZlKG51bVRyaWFuZ2xlcyAqIDMpOworICAgIG1UYW5nZW50cy0+cmVzZXJ2ZShudW1UcmlhbmdsZXMgKiAzKTsKKyAgICBtQmlub3JtYWxzLT5yZXNlcnZlKG51bVRyaWFuZ2xlcyAqIDMpOworICAgIG1UZXh0dXJlQ29vcmRzLT5yZXNlcnZlKG51bVRyaWFuZ2xlcyAqIDMpOworCisgICAgLy8gU3RvcmVzIHRoZSBwb2ludGVycyB0byB0aGUgaW1hZ2UgZGF0YSBhbmQgd2hlcmUgaW4gdGhlIHRyaSBsaXN0IHRoYXQgZGF0YSBjb21lcyBmcm9tCisgICAgY2FjaGVPZmZzZXRzQW5kRGF0YVBvaW50ZXJzKGNvbGxhZGFUcmlhbmdsZXMpOworCisgICAgLy8gQ29sbGFwc2UgdGhlIG11bHRpaW5kZXggdGhhdCBjb2xsYWRhIHVzZXMKKyAgICBjb25zdCBkb21MaXN0T2ZVSW50cyAmY29sbGFkYUluZGV4TGlzdCA9IGNvbGxhZGFUcmlhbmdsZXMtPmdldFAoKS0+Z2V0VmFsdWUoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJmEzZEluZGV4TGlzdCA9IG1Db252ZXJ0ZWRNZXNoLm1UcmlhbmdsZUxpc3RzW3RyaUxpc3RJbmRleF07CisgICAgYTNkSW5kZXhMaXN0LnJlc2l6ZShudW1UcmlhbmdsZXMgKiAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRyaWFuZ2xlcyAqIDM7IGkgKyspIHsKKworICAgICAgICBhM2RJbmRleExpc3RbaV0gPSByZW1hcEluZGV4QW5kU3RvcmVEYXRhKGNvbGxhZGFJbmRleExpc3QsIGkpOworICAgIH0KKworfQorCit2b2lkIENvbGxhZGFHZW9tZXRyeTo6Y2FjaGVPZmZzZXRzQW5kRGF0YVBvaW50ZXJzKGRvbVRyaWFuZ2xlcyAqIGNvbGxhZGFUcmlhbmdsZXMpIHsKKyAgICAvLyBEZWZpbmUgdGhlIG5hbWVzIG9mIGtub3duIHZlcnRleCBjaGFubmVscworICAgIGNvbnN0IGNoYXIgKnBvc2l0aW9uU2VtYW50aWMgPSAiUE9TSVRJT04iOworICAgIGNvbnN0IGNoYXIgKnZlcnRleFNlbWFudGljID0gIlZFUlRFWCI7CisgICAgY29uc3QgY2hhciAqbm9ybWFsU2VtYW50aWMgPSAiTk9STUFMIjsKKyAgICBjb25zdCBjaGFyICp0YW5nZW50U2VtYW50aWMgPSAiVEFOR0VOVCI7CisgICAgY29uc3QgY2hhciAqYmlub3JtYWxTZW1hbnRpYyA9ICJCSU5PUk1BTCI7CisgICAgY29uc3QgY2hhciAqdGV4dHVyZTFTZW1hbnRpYyA9ICJURVhDT09SRCI7CisKKyAgICBjb25zdCBkb21JbnB1dExvY2FsT2Zmc2V0X0FycmF5ICZpbnB1dHMgPSBjb2xsYWRhVHJpYW5nbGVzLT5nZXRJbnB1dF9hcnJheSgpOworICAgIG1NdWx0aUluZGV4T2Zmc2V0ID0gaW5wdXRzLmdldENvdW50KCk7CisKKyAgICAvLyBpbnB1dHMgd2l0aCBvZmZzZXRzCisgICAgLy8gVGhlcmUgYXJlIHR3byBwbGFjZXMgY29sbGFkYSBjYW4gcHV0IGxpbmtzIHRvIG91ciBkYXRhCisgICAgLy8gMSAtIGluIHRoZSBWRVJURVgsIHdoaWNoIGlzIGl0cyB3YXkgb2Ygc2F5aW5nIGZvbGxvdyBhIGxpbmsgdG8gdGhlIHZlcnRleCBzdHJ1Y3R1cmUKKyAgICAvLyAgICAgdGhlbiBldmVyeSBnZW9tZXRyeSBhcnJheSB5b3UgZmluZCB0aGVyZSBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBwb3NpdGlvbiBhcnJheQorICAgIC8vIDIgLSBhIGRpcmVjdCBsaW5rIHRvIHRoZSBjaGFubmVsIGZyb20gdGhlIHByaW1pdGl2ZSBsaXN0LiBUaGlzIHRlbGxzIHVzIHRoYXQgdGhlcmUgYXJlCisgICAgLy8gICAgIHBvdGVudGlhbGx5IG1vcmUgb3IgbGVzcyBmbG9hdHMgaW4gdGhvc2UgY2hhbm5lbHMgYmVjYXVzZSB0aGVyZSBpcyBzb21lIHZlcnRleCByZS11c2UKKyAgICAvLyAgICAgb3IgZGl2ZXJnZW5jZSBpbiB0aGF0IGRhdGEgY2hhbm5lbC4gRm9yIGV4YW1wbGUsIGhpZ2hseSBzZWdtZW50ZWQgdXYgc2V0IHdvdWxkIHByb2R1Y2UgYQorICAgIC8vICAgICBsYXJnZXIgYXJyYXkgYmVjYXVzZSBmb3IgZXZlcnkgcGh5c2ljYWwgdmVydGV4IHBvc2l0aW9uIHRocmUgbWlnaHQgYmUgMiBvciBtb3JlIHV2IGNvb3JkcworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbnB1dHMuZ2V0Q291bnQoKTsgaSArKykgeworCisgICAgICAgIGludCBjdXJyZW50T2Zmc2V0ID0gaW5wdXRzW2ldLT5nZXRPZmZzZXQoKTsKKyAgICAgICAgY29uc3QgY2hhciAqY3VycmVudFNlbWFudGljID0gaW5wdXRzW2ldLT5nZXRTZW1hbnRpYygpOworCisgICAgICAgIGRvbVNvdXJjZSAqIHNvdXJjZSA9IChkb21Tb3VyY2UqKSAoZG9tRWxlbWVudCopIGlucHV0c1tpXS0+Z2V0U291cmNlKCkuZ2V0RWxlbWVudCgpOworICAgICAgICBpZiAoc3RyY21wKHZlcnRleFNlbWFudGljLCBjdXJyZW50U2VtYW50aWMpID09IDApIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbk9mZnNldCA9IGN1cnJlbnRPZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG5vcm1hbFNlbWFudGljLCBjdXJyZW50U2VtYW50aWMpID09IDApIHsKKyAgICAgICAgICAgIG1Ob3JtYWxPZmZzZXQgPSBjdXJyZW50T2Zmc2V0OworICAgICAgICAgICAgbU5vcm1hbEZsb2F0cyA9ICZzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRhbmdlbnRTZW1hbnRpYywgY3VycmVudFNlbWFudGljKSA9PSAwKSB7CisgICAgICAgICAgICBtVGFuZ2VudE9mZnNldCA9IGN1cnJlbnRPZmZzZXQ7CisgICAgICAgICAgICBtVGFuZ2VudEZsb2F0cyA9ICZzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGJpbm9ybWFsU2VtYW50aWMsIGN1cnJlbnRTZW1hbnRpYykgPT0gMCkgeworICAgICAgICAgICAgbUJpbm9ybWFsT2Zmc2V0ID0gY3VycmVudE9mZnNldDsKKyAgICAgICAgICAgIG1CaW5vcm1hbEZsb2F0cyA9ICZzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRleHR1cmUxU2VtYW50aWMsIGN1cnJlbnRTZW1hbnRpYykgPT0gMCkgeworICAgICAgICAgICAgbVRleHR1cmUxT2Zmc2V0ID0gY3VycmVudE9mZnNldDsKKyAgICAgICAgICAgIG1UZXh0dXJlMUZsb2F0cyA9ICYgc291cmNlLT5nZXRGbG9hdF9hcnJheSgpLT5nZXRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHdheXMgb2YgZ2V0dGluZyB0byBkYXRhLCBzbyBmb2xsb3cgdGhlbSBhbGwKKyAgICBkb21WZXJ0aWNlcyAqIHZlcnRpY2VzID0gbU1lc2gtPmdldFZlcnRpY2VzKCk7CisgICAgY29uc3QgZG9tSW5wdXRMb2NhbF9BcnJheSAmdmVydGljZXNJbnB1dHMgPSB2ZXJ0aWNlcy0+Z2V0SW5wdXRfYXJyYXkoKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgdmVydGljZXNJbnB1dHMuZ2V0Q291bnQoKTsgaSArKykgeworCisgICAgICAgIGNvbnN0IGNoYXIgKmN1cnJlbnRTZW1hbnRpYyA9IHZlcnRpY2VzSW5wdXRzW2ldLT5nZXRTZW1hbnRpYygpOworCisgICAgICAgIGRvbVNvdXJjZSAqIHNvdXJjZSA9IChkb21Tb3VyY2UqKSAoZG9tRWxlbWVudCopIHZlcnRpY2VzSW5wdXRzW2ldLT5nZXRTb3VyY2UoKS5nZXRFbGVtZW50KCk7CisgICAgICAgIGlmIChzdHJjbXAocG9zaXRpb25TZW1hbnRpYywgY3VycmVudFNlbWFudGljKSA9PSAwKSB7CisgICAgICAgICAgICBtUG9zaXRpb25GbG9hdHMgPSAmIHNvdXJjZS0+Z2V0RmxvYXRfYXJyYXkoKS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFF1ZXJyeSB0aGlzIGZyb20gdGhlIGFjY2Vzc29yIGluIHRoZSBmdXR1cmUgYmVjYXVzZQorICAgICAgICAgICAgLy8gSSBzdXBvcG9zZSBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgNCBmbG9hdHMgaWYgd2UgaGlkZSBzb21ldGhpbmcgaW4gdworICAgICAgICAgICAgaW50IG51bWJlck9mRmxvYXRzUGVyUG9pbnQgPSAzOworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjbGxhcHNlIGR1cGxpY2F0ZSB2ZXJ0aWNlcywgb3RoZXJ3aXNlIHdlIGNvdWxkIGp1c3QgdW5yb2xsIHRoZSB0cmkgbGlzdAorICAgICAgICAgICAgbVZlcnRleFJlbWFwLnJlc2l6ZShzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldENvdW50KCkvbnVtYmVyT2ZGbG9hdHNQZXJQb2ludCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKG5vcm1hbFNlbWFudGljLCBjdXJyZW50U2VtYW50aWMpID09IDApIHsKKyAgICAgICAgICAgIG1Ob3JtYWxGbG9hdHMgPSAmIHNvdXJjZS0+Z2V0RmxvYXRfYXJyYXkoKS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIG1Ob3JtYWxPZmZzZXQgPSBtUG9zaXRpb25PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRhbmdlbnRTZW1hbnRpYywgY3VycmVudFNlbWFudGljKSA9PSAwKSB7CisgICAgICAgICAgICBtVGFuZ2VudEZsb2F0cyA9ICYgc291cmNlLT5nZXRGbG9hdF9hcnJheSgpLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgbVRhbmdlbnRPZmZzZXQgPSBtUG9zaXRpb25PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGJpbm9ybWFsU2VtYW50aWMsIGN1cnJlbnRTZW1hbnRpYykgPT0gMCkgeworICAgICAgICAgICAgbUJpbm9ybWFsRmxvYXRzID0gJiBzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldFZhbHVlKCk7CisgICAgICAgICAgICBtQmlub3JtYWxPZmZzZXQgPSBtUG9zaXRpb25PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRleHR1cmUxU2VtYW50aWMsIGN1cnJlbnRTZW1hbnRpYykgPT0gMCkgeworICAgICAgICAgICAgbVRleHR1cmUxRmxvYXRzID0gJiBzb3VyY2UtPmdldEZsb2F0X2FycmF5KCktPmdldFZhbHVlKCk7CisgICAgICAgICAgICBtVGV4dHVyZTFPZmZzZXQgPSBtUG9zaXRpb25PZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBDb2xsYWRhR2VvbWV0cnk6OnJlbWFwSW5kZXhBbmRTdG9yZURhdGEoY29uc3QgZG9tTGlzdE9mVUludHMgJmNvbGxhZGFJbmRleExpc3QsIGludCBpbmRleFRvUmVtYXApIHsKKworICAgIGRvbVVpbnQgcG9zaXRpb25JbmRleCA9IGNvbGxhZGFJbmRleExpc3RbaW5kZXhUb1JlbWFwKm1NdWx0aUluZGV4T2Zmc2V0ICsgbVBvc2l0aW9uT2Zmc2V0XTsKKworICAgIGZsb2F0IHBvc1ggPSAoKm1Qb3NpdGlvbkZsb2F0cylbcG9zaXRpb25JbmRleCAqIG1Qb3NpdGlvbnNTdHJpZGUgKyAwXTsKKyAgICBmbG9hdCBwb3NZID0gKCptUG9zaXRpb25GbG9hdHMpW3Bvc2l0aW9uSW5kZXggKiBtUG9zaXRpb25zU3RyaWRlICsgMV07CisgICAgZmxvYXQgcG9zWiA9ICgqbVBvc2l0aW9uRmxvYXRzKVtwb3NpdGlvbkluZGV4ICogbVBvc2l0aW9uc1N0cmlkZSArIDJdOworCisgICAgZmxvYXQgbm9ybVggPSAwOworICAgIGZsb2F0IG5vcm1ZID0gMDsKKyAgICBmbG9hdCBub3JtWiA9IDA7CisKKyAgICBpZiAobU5vcm1hbE9mZnNldCAhPSAtMSkgeworICAgICAgICBkb21VaW50IG5vcm1hbEluZGV4ID0gY29sbGFkYUluZGV4TGlzdFtpbmRleFRvUmVtYXAqbU11bHRpSW5kZXhPZmZzZXQgKyBtTm9ybWFsT2Zmc2V0XTsKKyAgICAgICAgbm9ybVggPSAoKm1Ob3JtYWxGbG9hdHMpW25vcm1hbEluZGV4ICogbU5vcm1hbHNTdHJpZGUgKyAwXTsKKyAgICAgICAgbm9ybVkgPSAoKm1Ob3JtYWxGbG9hdHMpW25vcm1hbEluZGV4ICogbU5vcm1hbHNTdHJpZGUgKyAxXTsKKyAgICAgICAgbm9ybVogPSAoKm1Ob3JtYWxGbG9hdHMpW25vcm1hbEluZGV4ICogbU5vcm1hbHNTdHJpZGUgKyAyXTsKKyAgICB9CisKKyAgICBmbG9hdCB0YW5YID0gMDsKKyAgICBmbG9hdCB0YW5ZID0gMDsKKyAgICBmbG9hdCB0YW5aID0gMDsKKworICAgIGlmIChtVGFuZ2VudE9mZnNldCAhPSAtMSkgeworICAgICAgICBkb21VaW50IHRhbmdlbnRJbmRleCA9IGNvbGxhZGFJbmRleExpc3RbaW5kZXhUb1JlbWFwKm1NdWx0aUluZGV4T2Zmc2V0ICsgbVRhbmdlbnRPZmZzZXRdOworICAgICAgICB0YW5YID0gKCptVGFuZ2VudEZsb2F0cylbdGFuZ2VudEluZGV4ICogbVRhbmdlbnRzc1N0cmlkZSArIDBdOworICAgICAgICB0YW5ZID0gKCptVGFuZ2VudEZsb2F0cylbdGFuZ2VudEluZGV4ICogbVRhbmdlbnRzc1N0cmlkZSArIDFdOworICAgICAgICB0YW5aID0gKCptVGFuZ2VudEZsb2F0cylbdGFuZ2VudEluZGV4ICogbVRhbmdlbnRzc1N0cmlkZSArIDJdOworICAgIH0KKworICAgIGZsb2F0IGJpbm9ybVggPSAwOworICAgIGZsb2F0IGJpbm9ybVkgPSAwOworICAgIGZsb2F0IGJpbm9ybVogPSAwOworCisgICAgaWYgKG1CaW5vcm1hbE9mZnNldCAhPSAtMSkgeworICAgICAgICBkb21VaW50IGJpbm9ybWFsSW5kZXggPSBjb2xsYWRhSW5kZXhMaXN0W2luZGV4VG9SZW1hcCptTXVsdGlJbmRleE9mZnNldCArIG1Ob3JtYWxPZmZzZXRdOworICAgICAgICBiaW5vcm1YID0gKCptQmlub3JtYWxGbG9hdHMpW2Jpbm9ybWFsSW5kZXggKiBtQmlub3JtYWxzU3RyaWRlICsgMF07CisgICAgICAgIGJpbm9ybVkgPSAoKm1CaW5vcm1hbEZsb2F0cylbYmlub3JtYWxJbmRleCAqIG1CaW5vcm1hbHNTdHJpZGUgKyAxXTsKKyAgICAgICAgYmlub3JtWiA9ICgqbUJpbm9ybWFsRmxvYXRzKVtiaW5vcm1hbEluZGV4ICogbUJpbm9ybWFsc1N0cmlkZSArIDJdOworICAgIH0KKworICAgIGZsb2F0IHRleENvb3JkWCA9IDA7CisgICAgZmxvYXQgdGV4Q29vcmRZID0gMDsKKworICAgIGlmIChtVGV4dHVyZTFPZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgZG9tVWludCB0ZXhDb29yZEluZGV4ID0gY29sbGFkYUluZGV4TGlzdFtpbmRleFRvUmVtYXAqbU11bHRpSW5kZXhPZmZzZXQgKyBtVGV4dHVyZTFPZmZzZXRdOworICAgICAgICB0ZXhDb29yZFggPSAoKm1UZXh0dXJlMUZsb2F0cylbdGV4Q29vcmRJbmRleCAqIG1UZXh0dXJlQ29vcmRzU3RyaWRlICsgMF07CisgICAgICAgIHRleENvb3JkWSA9ICgqbVRleHR1cmUxRmxvYXRzKVt0ZXhDb29yZEluZGV4ICogbVRleHR1cmVDb29yZHNTdHJpZGUgKyAxXTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJml0aFJlbWFwTGlzdCA9IG1WZXJ0ZXhSZW1hcFtwb3NpdGlvbkluZGV4XTsKKyAgICAvLyBXZSBtYXkgaGF2ZSBzb21lIHBvdGVudGlhbCB2ZXJ0aWNlcyB3ZSBjYW4gcmV1c2UKKyAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSBwb3RlbnRpYWwgY2FuZGlkYXRlcyBhbmQgc2VlIGlmIGFueSBtYXRjaCBvdXIgZ3V5CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGl0aFJlbWFwTGlzdC5zaXplKCk7IGkgKyspIHsKKworICAgICAgICBpbnQgaXRoUmVtYXAgPSBpdGhSZW1hcExpc3RbaV07CisgICAgICAgIC8vIGNvbXBhcmUgZXhpc3RpbmcgdmVydGV4IHdpdGggdGhlIG5ldyBvbmUKKyAgICAgICAgaWYgKCgqbVBvc2l0aW9ucylbaXRoUmVtYXAgKiBtUG9zaXRpb25zU3RyaWRlICsgMF0gIT0gcG9zWCB8fAorICAgICAgICAgICAgKCptUG9zaXRpb25zKVtpdGhSZW1hcCAqIG1Qb3NpdGlvbnNTdHJpZGUgKyAxXSAhPSBwb3NZIHx8CisgICAgICAgICAgICAoKm1Qb3NpdGlvbnMpW2l0aFJlbWFwICogbVBvc2l0aW9uc1N0cmlkZSArIDJdICE9IHBvc1opIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGdvIG92ZXIgbm9ybWFscworICAgICAgICBpZiAobU5vcm1hbE9mZnNldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKCgqbU5vcm1hbHMpW2l0aFJlbWFwICogbU5vcm1hbHNTdHJpZGUgKyAwXSAhPSBub3JtWCB8fAorICAgICAgICAgICAgICAgICgqbU5vcm1hbHMpW2l0aFJlbWFwICogbU5vcm1hbHNTdHJpZGUgKyAxXSAhPSBub3JtWSB8fAorICAgICAgICAgICAgICAgICgqbU5vcm1hbHMpW2l0aFJlbWFwICogbU5vcm1hbHNTdHJpZGUgKyAyXSAhPSBub3JtWikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGdvIG92ZXIgdGFuZ2VudHMKKyAgICAgICAgaWYgKG1UYW5nZW50T2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoKCptVGFuZ2VudHMpW2l0aFJlbWFwICogbVRhbmdlbnRzc1N0cmlkZSArIDBdICE9IHRhblggfHwKKyAgICAgICAgICAgICAgICAoKm1UYW5nZW50cylbaXRoUmVtYXAgKiBtVGFuZ2VudHNzU3RyaWRlICsgMV0gIT0gdGFuWSB8fAorICAgICAgICAgICAgICAgICgqbVRhbmdlbnRzKVtpdGhSZW1hcCAqIG1UYW5nZW50c3NTdHJpZGUgKyAyXSAhPSB0YW5aKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgZ28gb3ZlciBiaW5vcm1hbHMKKyAgICAgICAgaWYgKG1CaW5vcm1hbE9mZnNldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKCgqbUJpbm9ybWFscylbaXRoUmVtYXAgKiBtQmlub3JtYWxzU3RyaWRlICsgMF0gIT0gYmlub3JtWCB8fAorICAgICAgICAgICAgICAgICgqbUJpbm9ybWFscylbaXRoUmVtYXAgKiBtQmlub3JtYWxzU3RyaWRlICsgMV0gIT0gYmlub3JtWSB8fAorICAgICAgICAgICAgICAgICgqbUJpbm9ybWFscylbaXRoUmVtYXAgKiBtQmlub3JtYWxzU3RyaWRlICsgMl0gIT0gYmlub3JtWikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQW5kIHRleGNvb3JkcworICAgICAgICBpZiAobVRleHR1cmUxT2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoKCptVGV4dHVyZUNvb3JkcylbaXRoUmVtYXAgKiBtVGV4dHVyZUNvb3Jkc1N0cmlkZSArIDBdICE9IHRleENvb3JkWCB8fAorICAgICAgICAgICAgICAgICgqbVRleHR1cmVDb29yZHMpW2l0aFJlbWFwICogbVRleHR1cmVDb29yZHNTdHJpZGUgKyAxXSAhPSB0ZXhDb29yZFkpIHsKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZ290IGhlcmUgdGhlIG5ldyB2ZXJ0ZXggaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdGhhdCB3ZSBhbHJlYWR5IHN0b3JlZAorICAgICAgICByZXR1cm4gaXRoUmVtYXA7CisgICAgfQorCisgICAgLy8gV2UgZGlkIG5vdCBlbmNvdW50ZXIgdGhpcyB2ZXJ0ZXggeWV0LCBzdG9yZSBpdCBhbmQgcmV0dXJuIGl0cyBpbmRleAorICAgIG1Qb3NpdGlvbnMtPnB1c2hfYmFjayhwb3NYKTsKKyAgICBtUG9zaXRpb25zLT5wdXNoX2JhY2socG9zWSk7CisgICAgbVBvc2l0aW9ucy0+cHVzaF9iYWNrKHBvc1opOworCisgICAgaWYgKG1Ob3JtYWxPZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgbU5vcm1hbHMtPnB1c2hfYmFjayhub3JtWCk7CisgICAgICAgIG1Ob3JtYWxzLT5wdXNoX2JhY2sobm9ybVkpOworICAgICAgICBtTm9ybWFscy0+cHVzaF9iYWNrKG5vcm1aKTsKKyAgICB9CisKKyAgICBpZiAobVRhbmdlbnRPZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgbVRhbmdlbnRzLT5wdXNoX2JhY2sodGFuWCk7CisgICAgICAgIG1UYW5nZW50cy0+cHVzaF9iYWNrKHRhblkpOworICAgICAgICBtVGFuZ2VudHMtPnB1c2hfYmFjayh0YW5aKTsKKyAgICB9CisKKyAgICBpZiAobUJpbm9ybWFsT2Zmc2V0ICE9IC0xKSB7CisgICAgICAgIG1CaW5vcm1hbHMtPnB1c2hfYmFjayhiaW5vcm1YKTsKKyAgICAgICAgbUJpbm9ybWFscy0+cHVzaF9iYWNrKGJpbm9ybVkpOworICAgICAgICBtQmlub3JtYWxzLT5wdXNoX2JhY2soYmlub3JtWik7CisgICAgfQorCisgICAgaWYgKG1UZXh0dXJlMU9mZnNldCAhPSAtMSkgeworICAgICAgICBtVGV4dHVyZUNvb3Jkcy0+cHVzaF9iYWNrKHRleENvb3JkWCk7CisgICAgICAgIG1UZXh0dXJlQ29vcmRzLT5wdXNoX2JhY2sodGV4Q29vcmRZKTsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoaXMgbWFwcGluZy4gU2luY2Ugd2UgYXJlIHN0b3JpbmcgZmxvYXRzLCBub3QgdmVjMydzLCBuZWVkIHRvCisgICAgLy8gZGl2aWRlIGJ5IHBvc2l0aW9uIHNpemUgdG8gZ2V0IHRoZSByaWdodCBpbmRleAorICAgIGludCBjdXJyZW50VmVydGV4SW5kZXggPSAobVBvc2l0aW9ucy0+c2l6ZSgpL21Qb3NpdGlvbnNTdHJpZGUpIC0gMTsKKyAgICBpdGhSZW1hcExpc3QucHVzaF9iYWNrKGN1cnJlbnRWZXJ0ZXhJbmRleCk7CisKKyAgICByZXR1cm4gY3VycmVudFZlcnRleEluZGV4OworfQorCisKKworCisKKworCmRpZmYgLS1naXQgYS90b29scy9hM2Rjb252ZXJ0L0NvbGxhZGFHZW9tZXRyeS5oIGIvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhR2VvbWV0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc0OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhR2VvbWV0cnkuaApAQCAtMCwwICsxLDg0IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIE9wZW4gU291cmNlIExpY2Vuc2UsIGZvciBkZXRhaWxzIHBsZWFzZSBzZWUgbGljZW5zZS50eHQgb3IgdGhlIHdlYnNpdGUKKyogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyoKKyovCisKKyNpZm5kZWYgX0NPTExBREFfR0VPTUVUUllfSF8KKyNkZWZpbmUgX0NPTExBREFfR0VPTUVUUllfSF8KKworI2luY2x1ZGUgPGRhZS5oPgorI2luY2x1ZGUgPGRvbS9kb21DT0xMQURBLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzTWVzaC5oIgorI2luY2x1ZGUgIlNpbXBsZU1lc2guaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK2NsYXNzIENvbGxhZGFHZW9tZXRyeSB7CitwdWJsaWM6CisgICAgQ29sbGFkYUdlb21ldHJ5KCk7CisgICAgYm9vbCBpbml0KGRvbUdlb21ldHJ5UmVmIGdlb21ldHJ5KTsKKworICAgIE1lc2ggKmdldE1lc2goQ29udGV4dCAqcnNjKSB7CisgICAgICAgIHJldHVybiBtQ29udmVydGVkTWVzaC5nZXRNZXNoKHJzYyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy9TdG9yZSBzb21lIGNvbGxhZGEgc3R1ZmYKKyAgICBkb21NZXNoICptTWVzaDsKKworICAgIC8vIENhY2hlIHRoZSBwb2ludGVycyB0byB0aGUgY29sbGFkYSB2ZXJzaW9uIG9mIHRoZSBkYXRhCisgICAgLy8gVGhpcyBjb250YWlucyByYXcgdmVydGV4IGRhdGEgdGhhdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgc2l6ZSBmb3IgYWxsCisgICAgLy8gT2Zmc2V0IHJlZmVycyB0byB0aGUgd2F5IGNvbGxhZGEgcGFja3MgZWFjaCB0cmlhbmdsZSdzIGluZGV4IHRvIHBvc2l0aW9uIC8gbm9ybWFsIC8gZXRjLgorICAgIGRvbUxpc3RPZkZsb2F0cyAqbVBvc2l0aW9uRmxvYXRzOworICAgIGludCBtUG9zaXRpb25PZmZzZXQ7CisgICAgZG9tTGlzdE9mRmxvYXRzICptTm9ybWFsRmxvYXRzOworICAgIGludCBtTm9ybWFsT2Zmc2V0OworICAgIGRvbUxpc3RPZkZsb2F0cyAqbVRhbmdlbnRGbG9hdHM7CisgICAgaW50IG1UYW5nZW50T2Zmc2V0OworICAgIGRvbUxpc3RPZkZsb2F0cyAqbUJpbm9ybWFsRmxvYXRzOworICAgIGludCBtQmlub3JtYWxPZmZzZXQ7CisgICAgZG9tTGlzdE9mRmxvYXRzICptVGV4dHVyZTFGbG9hdHM7CisgICAgaW50IG1UZXh0dXJlMU9mZnNldDsKKworICAgIC8vIEluIHRoZSBsaXN0IG9mIHRyaWFuZ2xlcywgY29sbGFkYSB1c2VzIG11bHRpcGxlIGluZGVjaWVzIHBlciB0cmlhbmdsZSB0byBwb2ludCB0byB0aGUgY29ycmVjdAorICAgIC8vIGluZGV4IGluIGFsbCB0aGUgZGlmZmVyZW50IGFycmF5cy4gV2UgbmVlZCB0byBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgdGhlc2UgZ3V5cyBzbyB3ZSBjYW4KKyAgICAvLyBqdXN0IHRvIHRoZSBuZXh0IHRyaWFuZ2xlIHRvIHByb2Nlc3MKKyAgICBpbnQgbU11bHRpSW5kZXhPZmZzZXQ7CisKKyAgICAvLyBBbGwgdGhlc2UgdmVjdG9ycyB3b3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiAicG9pbnRzIgorICAgIC8vIGluZGV4KnN0cmlkZSB3b3VsZCBwcm9wZXJseSBnZXQgdG8gdGhlIHV2LCBub3JtYWwgZXRjLgorICAgIC8vIGNvbGxhZGEsIGxpa2UgbWF5YSBhbmQgbWFueSBvdGhlcnMga2VlcCBwb2ludCBhcnJheSwgbm9ybWFsIGFycmF5IGV0YworICAgIC8vIGRpZmZlcmVudCBzaXplIGluIHRoZSBjYXNlcyB0aGUgc2FtZSB2ZXJ0ZXggcHJvZHVjZXMgZGl2ZXJnZW50IG5vcm1hbHMgZm9yIGRpZmZlcmVudCBmYWNlcworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqbVBvc2l0aW9uczsKKyAgICB1bnNpZ25lZCBpbnQgbVBvc2l0aW9uc1N0cmlkZTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKm1Ob3JtYWxzOworICAgIHVuc2lnbmVkIGludCBtTm9ybWFsc1N0cmlkZTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKm1UZXh0dXJlQ29vcmRzOworICAgIHVuc2lnbmVkIGludCBtVGV4dHVyZUNvb3Jkc1N0cmlkZTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKm1UYW5nZW50czsKKyAgICB1bnNpZ25lZCBpbnQgbVRhbmdlbnRzc1N0cmlkZTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKm1CaW5vcm1hbHM7CisgICAgdW5zaWduZWQgaW50IG1CaW5vcm1hbHNTdHJpZGU7CisKKyAgICBTaW1wbGVNZXNoIG1Db252ZXJ0ZWRNZXNoOworCisgICAgLy8gVGhpcyB2ZWN0b3IgaXMgdXNlZCB0byByZW1hcCBhIHBvc2l0aW9uIGluZGV4IGludG8gYSBsaXN0IG9mIGFsbCBkaXZlcmdlbnQgdmVydGljZXMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ID4gbVZlcnRleFJlbWFwOworCisgICAgdm9pZCBhZGRUcmlhbmdsZXMoZG9tVHJpYW5nbGVzICogY29sbGFkYVRyaWFuZ2xlcyk7CisgICAgdm9pZCBjYWNoZU9mZnNldHNBbmREYXRhUG9pbnRlcnMoZG9tVHJpYW5nbGVzICogY29sbGFkYVRyaWFuZ2xlcyk7CisgICAgaW50IHJlbWFwSW5kZXhBbmRTdG9yZURhdGEoY29uc3QgZG9tTGlzdE9mVUludHMgJmNvbGxhZGFJbmRleExpc3QsIGludCBpbmRleFRvUmVtYXApOworCit9OworCisjZW5kaWYgLy9DT0xMQURBX1RPX0EzRF9HRU9NRVRSWQpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhTG9hZGVyLmNwcCBiL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUxvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3NDc0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2EzZGNvbnZlcnQvQ29sbGFkYUxvYWRlci5jcHAKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29sbGFkYUxvYWRlci5oIgorI2luY2x1ZGUgIkNvbGxhZGFDb25kaXRpb25lci5oIgorI2luY2x1ZGUgIkNvbGxhZGFHZW9tZXRyeS5oIgorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzRmlsZUEzRC5oIgorCisjaW5jbHVkZSA8ZGFlLmg+CisjaW5jbHVkZSA8ZG9tL2RvbUNPTExBREEuaD4KKworQ29sbGFkYUxvYWRlcjo6Q29sbGFkYUxvYWRlcigpIHsKKworfQorCitDb2xsYWRhTG9hZGVyOjp+Q29sbGFkYUxvYWRlcigpIHsKKyAgICBjbGVhckdlb21ldHJ5KCk7Cit9CisKK3ZvaWQgQ29sbGFkYUxvYWRlcjo6Y2xlYXJHZW9tZXRyeSgpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUdlb21ldHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1HZW9tZXRyaWVzW2ldOworICAgIH0KKyAgICBtR2VvbWV0cmllcy5jbGVhcigpOworfQorCitib29sIENvbGxhZGFMb2FkZXI6OmluaXQoY29uc3QgY2hhciAqY29sbGFkYUZpbGUpIHsKKyAgICBEQUUgZGFlOworCisgICAgY2xlYXJHZW9tZXRyeSgpOworCisgICAgYm9vbCBjb252ZXJ0U3VjZWVkZWQgPSB0cnVlOworCisgICAgZG9tQ09MTEFEQSogcm9vdCA9IGRhZS5vcGVuKGNvbGxhZGFGaWxlKTsKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBmaWxlICVzLlxuIiwgY29sbGFkYUZpbGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2Ugb25seSB3YW50IHRvIGRlYWwgd2l0aCB0cmlhbmd1bGF0ZWQgbWVzaGVzIHNpbmNlIHJlbmRlcmluZyBjb21wbGV4IHBvbHlnb25zIGlzIG5vdCBmZWFzaWJsZQorICAgIENvbGxhZGFDb25kaXRpb25lciBjb25kaXRpb25lcjsKKyAgICBjb25kaXRpb25lci50cmlhbmd1bGF0ZSgmZGFlKTsKKworICAgIGRvbUxpYnJhcnlfZ2VvbWV0cmllcyAqYWxsR2VvbWV0cnkgPSBkYWVTYWZlQ2FzdDxkb21MaWJyYXJ5X2dlb21ldHJpZXM+KHJvb3QtPmdldERlc2NlbmRhbnQoImxpYnJhcnlfZ2VvbWV0cmllcyIpKTsKKworICAgIGlmIChhbGxHZW9tZXRyeSkgeworICAgICAgICBjb252ZXJ0U3VjZWVkZWQgPSBjb252ZXJ0QWxsR2VvbWV0cnkoYWxsR2VvbWV0cnkpICYmIGNvbnZlcnRTdWNlZWRlZDsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydFN1Y2VlZGVkOworfQorCitib29sIENvbGxhZGFMb2FkZXI6OmNvbnZlcnRUb0EzRChjb25zdCBjaGFyICphM2RGaWxlKSB7CisgICAgaWYgKG1HZW9tZXRyaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gTm93IHdyaXRlIGFsbCB0aGlzIHN0dWZmIG91dAorICAgIENvbnRleHQgcnNjOworICAgIEZpbGVBM0QgZmlsZSgmcnNjKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtR2VvbWV0cmllcy5zaXplKCk7IGkrKykgeworICAgICAgICBNZXNoICpleHBvcnRlZE1lc2ggPSBtR2VvbWV0cmllc1tpXS0+Z2V0TWVzaCgmcnNjKTsKKyAgICAgICAgZmlsZS5hcHBlbmRUb0ZpbGUoZXhwb3J0ZWRNZXNoKTsKKyAgICAgICAgZGVsZXRlIGV4cG9ydGVkTWVzaDsKKyAgICB9CisKKyAgICBmaWxlLndyaXRlRmlsZShhM2RGaWxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2xsYWRhTG9hZGVyOjpjb252ZXJ0QWxsR2VvbWV0cnkoZG9tTGlicmFyeV9nZW9tZXRyaWVzICphbGxHZW9tZXRyeSkgeworCisgICAgYm9vbCBjb252ZXJ0U3VjZWVkZWQgPSB0cnVlOworICAgIGRvbUdlb21ldHJ5X0FycmF5ICZnZW9fYXJyYXkgPSBhbGxHZW9tZXRyeS0+Z2V0R2VvbWV0cnlfYXJyYXkoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdlb19hcnJheS5nZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgZG9tR2VvbWV0cnkgKmdlb21ldHJ5ID0gZ2VvX2FycmF5W2ldOworICAgICAgICBjb25zdCBjaGFyICpnZW9tZXRyeU5hbWUgPSBnZW9tZXRyeS0+Z2V0TmFtZSgpOworICAgICAgICBpZiAoZ2VvbWV0cnlOYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdlb21ldHJ5TmFtZSA9IGdlb21ldHJ5LT5nZXRJZCgpOworICAgICAgICB9CisKKyAgICAgICAgZG9tTWVzaFJlZiBtZXNoID0gZ2VvbWV0cnktPmdldE1lc2goKTsKKyAgICAgICAgaWYgKG1lc2ggIT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCJDb252ZXJ0aW5nIGdlb21ldHJ5OiAlc1xuIiwgZ2VvbWV0cnlOYW1lKTsKKyAgICAgICAgICAgIGNvbnZlcnRTdWNlZWRlZCA9IGNvbnZlcnRHZW9tZXRyeShnZW9tZXRyeSkgJiYgY29udmVydFN1Y2VlZGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJTa2lwcGluZyBnZW9tZXRyeTogJXMsIHVuc3VwcG9ydGVkIHR5cGVcbiIsIGdlb21ldHJ5TmFtZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBjb252ZXJ0U3VjZWVkZWQ7Cit9CisKK2Jvb2wgQ29sbGFkYUxvYWRlcjo6Y29udmVydEdlb21ldHJ5KGRvbUdlb21ldHJ5ICpnZW9tZXRyeSkgeworICAgIGJvb2wgY29udmVydFN1Y2VlZGVkID0gdHJ1ZTsKKworICAgIGRvbU1lc2hSZWYgbWVzaCA9IGdlb21ldHJ5LT5nZXRNZXNoKCk7CisKKyAgICBDb2xsYWRhR2VvbWV0cnkgKmNvbnZlcnRlZEdlbyA9IG5ldyBDb2xsYWRhR2VvbWV0cnkoKTsKKyAgICBjb252ZXJ0ZWRHZW8tPmluaXQoZ2VvbWV0cnkpOworCisgICAgbUdlb21ldHJpZXMucHVzaF9iYWNrKGNvbnZlcnRlZEdlbyk7CisKKyAgICByZXR1cm4gY29udmVydFN1Y2VlZGVkOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhTG9hZGVyLmggYi90b29scy9hM2Rjb252ZXJ0L0NvbGxhZGFMb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY2ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYTNkY29udmVydC9Db2xsYWRhTG9hZGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0NPTExBREFfTE9BREVSX0hfCisjZGVmaW5lIF9DT0xMQURBX0xPQURFUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyBkb21MaWJyYXJ5X2dlb21ldHJpZXM7CitjbGFzcyBkb21HZW9tZXRyeTsKK2NsYXNzIENvbGxhZGFHZW9tZXRyeTsKKworY2xhc3MgQ29sbGFkYUxvYWRlciB7CitwdWJsaWM6CisgICAgQ29sbGFkYUxvYWRlcigpOworICAgIH5Db2xsYWRhTG9hZGVyKCk7CisKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqY29sbGFkYUZpbGUpOworICAgIGJvb2wgY29udmVydFRvQTNEKGNvbnN0IGNoYXIgKmEzZEZpbGUpOworCitwcml2YXRlOgorICAgIHZvaWQgY2xlYXJHZW9tZXRyeSgpOworICAgIHN0ZDo6dmVjdG9yPENvbGxhZGFHZW9tZXRyeSo+IG1HZW9tZXRyaWVzOworCisgICAgYm9vbCBjb252ZXJ0QWxsR2VvbWV0cnkoZG9tTGlicmFyeV9nZW9tZXRyaWVzICphbGxHZW9tZXRyeSk7CisgICAgYm9vbCBjb252ZXJ0R2VvbWV0cnkoZG9tR2VvbWV0cnkgKmdlb21ldHJ5KTsKKworfTsKKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9PYmpMb2FkZXIuY3BwIGIvdG9vbHMvYTNkY29udmVydC9PYmpMb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjVmNGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L09iakxvYWRlci5jcHAKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiT2JqTG9hZGVyLmgiCisjaW5jbHVkZSA8cnNGaWxlQTNELmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworT2JqTG9hZGVyOjpPYmpMb2FkZXIoKSA6CisgICAgbVBvc2l0aW9uc1N0cmlkZSgzKSwgbU5vcm1hbHNTdHJpZGUoMyksIG1UZXh0dXJlQ29vcmRzU3RyaWRlKDIpIHsKKworfQorCitib29sIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKKyAgICBjb25zdCBjaGFyIHdoaXRlU3BhY2VbXSA9IHsgJyAnLCAnXG4nLCAnXHQnLCAnXGYnLCAnXHInIH07CisgICAgY29uc3QgdWludDMyX3QgbnVtV2hpdGVTcGFjZUNoYXJzID0gNTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtV2hpdGVTcGFjZUNoYXJzOyBpICsrKSB7CisgICAgICAgIGlmICh3aGl0ZVNwYWNlW2ldID09IGMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBlYXRXaGl0ZXNwYWNlKHN0ZDo6aXN0cmVhbSAmaXMpIHsKKyAgICB3aGlsZShpcy5nb29kKCkgJiYgaXNXaGl0ZXNwYWNlKGlzLnBlZWsoKSkpIHsKKyAgICAgICAgaXMuZ2V0KCk7CisgICAgfQorfQorCitib29sIGdldFRva2VuKHN0ZDo6aXN0cmVhbSAmaXMsIHN0ZDo6c3RyaW5nICZ0b2tlbikgeworICAgIGVhdFdoaXRlc3BhY2UoaXMpOworICAgIHRva2VuLmNsZWFyKCk7CisgICAgY2hhciBjOworICAgIHdoaWxlKGlzLmdvb2QoKSAmJiAhaXNXaGl0ZXNwYWNlKGlzLnBlZWsoKSkpIHsKKyAgICAgICAgYyA9IGlzLmdldCgpOworICAgICAgICBpZiAoaXMuZ29vZCgpKXsKKyAgICAgICAgICAgIHRva2VuICs9IGM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRva2VuLnNpemUoKSA+IDA7Cit9CisKK3ZvaWQgYXBwZW5kRGF0YUZyb21TdHJlYW0oc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZkYXRhVmVjLCB1aW50MzJfdCBudW1GbG9hdHMsIHN0ZDo6aXN0cmVhbSAmaXMpIHsKKyAgICBzdGQ6OnN0cmluZyB0b2tlbjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpICsrKXsKKyAgICAgICAgYm9vbCB2YWxpZCA9IGdldFRva2VuKGlzLCB0b2tlbik7CisgICAgICAgIGlmICh2YWxpZCkgeworICAgICAgICAgICAgZGF0YVZlYy5wdXNoX2JhY2soKGZsb2F0KWF0b2YodG9rZW4uY19zdHIoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFbmNvdW50ZXJlZCBlcnJvciByZWFkaW5nIGdlb21ldHJ5IGRhdGEiKTsKKyAgICAgICAgICAgIGRhdGFWZWMucHVzaF9iYWNrKDAuMGYpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIGNoZWNrTmVnYXRpdmVJbmRleChpbnQgaWR4KSB7CisgICAgaWYoaWR4IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5lZ2F0aXZlIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFNraXBwaW5nIGZhY2VcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9iakxvYWRlcjo6cGFyc2VSYXdGYWNlcygpeworICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgYSB0cmlhbmdsZQorICAgIGlmIChtUmF3RmFjZXMuc2l6ZSgpIDwgMykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciBzbGFzaCA9ICcvJzsKKyAgICBtUGFyc2VkRmFjZXMucmVzaXplKG1SYXdGYWNlcy5zaXplKCkpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtUmF3RmFjZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIHNpemVfdCBmaXJzdFNlcGFyYXRvciA9IG1SYXdGYWNlc1tpXS5maW5kX2ZpcnN0X29mKHNsYXNoKTsKKyAgICAgICAgc2l6ZV90IG5leHRTZXBhcmF0b3IgPSBtUmF3RmFjZXNbaV0uZmluZF9sYXN0X29mKHNsYXNoKTsKKworICAgICAgICAvLyBVc2UgdGhlIHN0cmluZyBhcyBhIHRlbXAgYnVmZmVyIHRvIHBhcnNlIHRoZSBpbmRleAorICAgICAgICAvLyBJbnNlcnQgMCBpbnN0ZWFkIG9mIHRoZSBzbGFzaCB0byBhdm9pZCBzdWJzdHJpbmdzCisgICAgICAgIGlmIChmaXJzdFNlcGFyYXRvciAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgbVJhd0ZhY2VzW2ldW2ZpcnN0U2VwYXJhdG9yXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2ltcGxlIGNhc2UsIG9ubHkgb25lIGluZGV4CisgICAgICAgIGludDMyX3QgdklkeCA9IGF0b2kobVJhd0ZhY2VzW2ldLmNfc3RyKCkpOworICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBpbmRpY2VzCisgICAgICAgIGlmICghY2hlY2tOZWdhdGl2ZUluZGV4KHZJZHgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gb2JqIGluZGljZXMgdGhpbmdzIGJlZ2lubmluZyAxCisgICAgICAgIG1QYXJzZWRGYWNlc1tpXS52ZXJ0SWR4ID0gKHVpbnQzMl90KXZJZHggLSAxOworCisgICAgICAgIGlmIChuZXh0U2VwYXJhdG9yICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIG5leHRTZXBhcmF0b3IgIT0gZmlyc3RTZXBhcmF0b3IpIHsKKyAgICAgICAgICAgIG1SYXdGYWNlc1tpXVtuZXh0U2VwYXJhdG9yXSA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBuSWR4ID0gYXRvaShtUmF3RmFjZXNbaV0uY19zdHIoKSArIG5leHRTZXBhcmF0b3IgKyAxKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOZWdhdGl2ZUluZGV4KG5JZHgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb2JqIGluZGV4ZXMgdGhpbmdzIGJlZ2lubmluZyAxCisgICAgICAgICAgICBtUGFyc2VkRmFjZXNbaV0ubm9ybUlkeCA9ICh1aW50MzJfdCluSWR4IC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlY29uZCBjYXNlIGlzIHdoZXJlIHdlIGhhdmUgdmVydGV4IGFuZCB0ZXh0dXJlIGluZGljZXMKKyAgICAgICAgaWYgKG5leHRTZXBhcmF0b3IgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgKG5leHRTZXBhcmF0b3IgPiBmaXJzdFNlcGFyYXRvciArIDEgfHwgbmV4dFNlcGFyYXRvciA9PSBmaXJzdFNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRJZHggPSBhdG9pKG1SYXdGYWNlc1tpXS5jX3N0cigpICsgZmlyc3RTZXBhcmF0b3IgKyAxKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOZWdhdGl2ZUluZGV4KHRJZHgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb2JqIGluZGV4ZXMgdGhpbmdzIGJlZ2lubmluZyAxCisgICAgICAgICAgICBtUGFyc2VkRmFjZXNbaV0udGV4SWR4ID0gKHVpbnQzMl90KXRJZHggLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIGEgZmFjZSBsaXN0IGV4aXN0cyBiZWZvcmUgd2UgZ28gYWRkaW5nIHRvIGl0CisgICAgaWYgKG1NZXNoZXMuYmFjaygpLm1VbmZpbHRlcmVkRmFjZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbU1lc2hlcy5iYWNrKCkuYXBwZW5kVW5maWx0ZXJlZEZhY2VzKG1MYXN0TXRsKTsKKyAgICB9CisKKyAgICAvLyBOb3cgd2UgaGF2ZSBvdXIgcGFyc2VkIGZhY2UsIHRoYXQgd2UgbmVlZCB0byB0cmlhbmd1bGF0ZSBhcyBuZWNlc3NhcnkKKyAgICAvLyBUcmVhdCBtb3JlIGNvbXBsZXggcG9seWdvbnMgYXMgZmFucy4KKyAgICAvLyBUaGlzIGFwcHJvYWNoIHdpbGwgb25seSB3b3JrIG9ubHkgZm9yIGNvbnZleCBwb2x5Z29ucworICAgIC8vIGJ1dCBjb25jYXZlIHBvbHlnb25zIG5lZWQgdG8gYmUgYWRkcmVzc2VkIGVsc2V3aGVyZSBhbnl3YXkKKyAgICBmb3IgKHVpbnQzMl90IG5leHQgPSAxOyBuZXh0IDwgbVBhcnNlZEZhY2VzLnNpemUoKSAtIDE7IG5leHQgKyspIHsKKyAgICAgICAgLy8gcHVzaCBpdCB0byBvdXIgY3VycmVudCBtZXNoCisgICAgICAgIG1NZXNoZXMuYmFjaygpLm1VbmZpbHRlcmVkRmFjZXMuYmFjaygpLnB1c2hfYmFjayhtUGFyc2VkRmFjZXNbMF0pOworICAgICAgICBtTWVzaGVzLmJhY2soKS5tVW5maWx0ZXJlZEZhY2VzLmJhY2soKS5wdXNoX2JhY2sobVBhcnNlZEZhY2VzW25leHRdKTsKKyAgICAgICAgbU1lc2hlcy5iYWNrKCkubVVuZmlsdGVyZWRGYWNlcy5iYWNrKCkucHVzaF9iYWNrKG1QYXJzZWRGYWNlc1tuZXh0ICsgMV0pOworICAgIH0KK30KKwordm9pZCBPYmpMb2FkZXI6OmNoZWNrTmV3TWVzaENyZWF0aW9uKHN0ZDo6c3RyaW5nICZuZXdHcm91cCkgeworICAgIC8vIHN0YXJ0IGEgbmV3IG1lc2ggaWYgd2UgaGF2ZSBzb21lIGZhY2VzCisgICAgLy8gYWNjdW11bGF0ZWQgb24gdGhlIGN1cnJlbnQgbWVzaC4KKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgZ3JvdXAgc3RhdGVtZW50cworICAgIC8vIGJ1dCB3ZSBvbmx5IGNhcmUgdG8gYWN0dWFsbHkgc3RhcnQgYSBuZXcgbWVzaAorICAgIC8vIG9uY2Ugd2UgY2FuIGhhdmUgc29tZXRoaW5nIHdlIGNhbiBkcmF3IG9uIHRoZSBwcmV2aW91cyBvbmUKKyAgICBpZiAobU1lc2hlcy5iYWNrKCkubVVuZmlsdGVyZWRGYWNlcy5zaXplKCkpIHsKKyAgICAgICAgbU1lc2hlcy5wdXNoX2JhY2soT2JqTWVzaCgpKTsKKyAgICB9CisKKyAgICBtTWVzaGVzLmJhY2soKS5tTmFtZSA9IG5ld0dyb3VwOworICAgIHByaW50ZigiQ29udmVydGluZyB2ZXJ0ZXggZ3JvdXA6ICVzXG4iLCBuZXdHcm91cC5jX3N0cigpKTsKK30KKwordm9pZCBPYmpMb2FkZXI6OmhhbmRsZU9iakxpbmUoY2hhciAqbGluZSkgeworICAgIGNvbnN0IGNoYXIqIHZ0eFRva2VuICAgID0gInYiOworICAgIGNvbnN0IGNoYXIqIG5vcm1Ub2tlbiAgID0gInZuIjsKKyAgICBjb25zdCBjaGFyKiB0ZXhUb2tlbiAgICA9ICJ2dCI7CisgICAgY29uc3QgY2hhciogZ3JvdXBUb2tlbiAgPSAiZyI7CisgICAgY29uc3QgY2hhciogbXRsVG9rZW4gICAgPSAidXNlbXRsIjsKKyAgICBjb25zdCBjaGFyKiBmYWNlVG9rZW4gICA9ICJmIjsKKworICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBsaW5lU3RyZWFtKGxpbmUsIHN0ZDo6aXN0cmluZ3N0cmVhbTo6aW4pOworCisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgYm9vbCB2YWxpZCA9IGdldFRva2VuKGxpbmVTdHJlYW0sIHRva2VuKTsKKyAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodG9rZW4gPT0gdnR4VG9rZW4pIHsKKyAgICAgICAgYXBwZW5kRGF0YUZyb21TdHJlYW0obU9ialBvc2l0aW9ucywgMywgbGluZVN0cmVhbSk7CisgICAgfSBlbHNlIGlmICh0b2tlbiA9PSBub3JtVG9rZW4pIHsKKyAgICAgICAgYXBwZW5kRGF0YUZyb21TdHJlYW0obU9iak5vcm1hbHMsIDMsIGxpbmVTdHJlYW0pOworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gdGV4VG9rZW4pIHsKKyAgICAgICAgYXBwZW5kRGF0YUZyb21TdHJlYW0obU9ialRleHR1cmVDb29yZHMsIDIsIGxpbmVTdHJlYW0pOworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gZ3JvdXBUb2tlbikgeworICAgICAgICB2YWxpZCA9IGdldFRva2VuKGxpbmVTdHJlYW0sIHRva2VuKTsKKyAgICAgICAgY2hlY2tOZXdNZXNoQ3JlYXRpb24odG9rZW4pOworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gZmFjZVRva2VuKSB7CisgICAgICAgIG1SYXdGYWNlcy5jbGVhcigpOworICAgICAgICB3aGlsZShnZXRUb2tlbihsaW5lU3RyZWFtLCB0b2tlbikpIHsKKyAgICAgICAgICAgIG1SYXdGYWNlcy5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgICAgIHBhcnNlUmF3RmFjZXMoKTsKKyAgICB9CisgICAgLy8gSWdub3JlIG1hdGVyaWFscyBmb3Igbm93CisgICAgZWxzZSBpZiAodG9rZW4gPT0gbXRsVG9rZW4pIHsKKyAgICAgICAgdmFsaWQgPSBnZXRUb2tlbihsaW5lU3RyZWFtLCB0b2tlbik7CisgICAgICAgIG1MYXN0TXRsID0gdG9rZW47CisKKyAgICAgICAgbU1lc2hlcy5iYWNrKCkuYXBwZW5kVW5maWx0ZXJlZEZhY2VzKHRva2VuKTsKKyAgICB9Cit9CisKK2Jvb2wgT2JqTG9hZGVyOjppbml0KGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlTmFtZSAsIHN0ZDo6aWZzdHJlYW06OmluKTsKKyAgICBpZiAoIWlmcy5nb29kKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCBmaWxlICVzLlxuIiwgZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbU1lc2hlcy5jbGVhcigpOworCisgICAgY29uc3QgdWludDMyX3QgbWF4QnVmZmVyU2l6ZSA9IDIwNDg7CisgICAgY2hhciAqYnVmZmVyID0gbmV3IGNoYXJbbWF4QnVmZmVyU2l6ZV07CisKKyAgICBtTWVzaGVzLnB1c2hfYmFjayhPYmpNZXNoKCkpOworCisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgYm9vbCBpc0RvbmUgPSBmYWxzZTsKKyAgICB3aGlsZSghaXNEb25lKSB7CisgICAgICAgIGlmcy5nZXRsaW5lKGJ1ZmZlciwgbWF4QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChpZnMuZ29vZCgpICYmIGlmcy5nY291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIGhhbmRsZU9iakxpbmUoYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzRG9uZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZnMuY2xvc2UoKTsKKyAgICBkZWxldGUgYnVmZmVyOworCisgICAgcmVJbmRleEdlb21ldHJ5KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPYmpMb2FkZXI6OmNvbnZlcnRUb0EzRChjb25zdCBjaGFyICphM2RGaWxlKSB7CisgICAgaWYgKCFnZXROdW1NZXNoZXMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIE5vdyB3cml0ZSBhbGwgdGhpcyBzdHVmZiBvdXQKKyAgICBDb250ZXh0IHJzYzsKKyAgICBGaWxlQTNEIGZpbGUoJnJzYyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ2V0TnVtTWVzaGVzKCk7IGkgKyspIHsKKyAgICAgICAgTWVzaCAqZXhwb3J0ZWRNZXNoID0gZ2V0TWVzaCgmcnNjLCBpKTsKKyAgICAgICAgZmlsZS5hcHBlbmRUb0ZpbGUoZXhwb3J0ZWRNZXNoKTsKKyAgICAgICAgZGVsZXRlIGV4cG9ydGVkTWVzaDsKKyAgICB9CisKKyAgICBmaWxlLndyaXRlRmlsZShhM2RGaWxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPYmpMb2FkZXI6OnJlSW5kZXhHZW9tZXRyeSgpIHsKKyAgICAvLyBXZSB3YW50IHRvIGtub3cgd2hlcmUgZWFjaCB2ZXJ0ZXggbGFuZHMKKyAgICBtVmVydGV4UmVtYXAucmVzaXplKG1PYmpQb3NpdGlvbnMuc2l6ZSgpIC8gbVBvc2l0aW9uc1N0cmlkZSk7CisKKyAgICBmb3IgKHVpbnQzMl90IG0gPSAwOyBtIDwgbU1lc2hlcy5zaXplKCk7IG0gKyspIHsKKyAgICAgICAgLy8gY2xlYXIgdGhlIHJlbWFwIHZlY3RvciBvZiBvbGQgZGF0YQorICAgICAgICBmb3IgKHVpbnQzMl90IHIgPSAwOyByIDwgbVZlcnRleFJlbWFwLnNpemUoKTsgciArKykgeworICAgICAgICAgICAgbVZlcnRleFJlbWFwW3JdLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU1lc2hlc1ttXS5tVW5maWx0ZXJlZEZhY2VzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgbU1lc2hlc1ttXS5tVHJpYW5nbGVMaXN0c1tpXS5yZXNlcnZlKG1NZXNoZXNbbV0ubVVuZmlsdGVyZWRGYWNlc1tpXS5zaXplKCkgKiAyKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgZkkgPSAwOyBmSSA8IG1NZXNoZXNbbV0ubVVuZmlsdGVyZWRGYWNlc1tpXS5zaXplKCk7IGZJICsrKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbmV3SW5kZXggPSByZUluZGV4R2VvbWV0cnlQcmltKG1NZXNoZXNbbV0sIG1NZXNoZXNbbV0ubVVuZmlsdGVyZWRGYWNlc1tpXVtmSV0pOworICAgICAgICAgICAgICAgIG1NZXNoZXNbbV0ubVRyaWFuZ2xlTGlzdHNbaV0ucHVzaF9iYWNrKG5ld0luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordWludDMyX3QgT2JqTG9hZGVyOjpyZUluZGV4R2VvbWV0cnlQcmltKE9iak1lc2ggJm1lc2gsIFByaW1pdGl2ZVZ0eCAmcHJpbSkgeworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZtUG9zaXRpb25zID0gbWVzaC5tQ2hhbm5lbHNbMF0ubURhdGE7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZtTm9ybWFscyA9IG1lc2gubUNoYW5uZWxzWzFdLm1EYXRhOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAmbVRleHR1cmVDb29yZHMgPSBtZXNoLm1DaGFubmVsc1syXS5tRGF0YTsKKworICAgIGZsb2F0IHBvc1ggPSBtT2JqUG9zaXRpb25zW3ByaW0udmVydElkeCAqIG1Qb3NpdGlvbnNTdHJpZGUgKyAwXTsKKyAgICBmbG9hdCBwb3NZID0gbU9ialBvc2l0aW9uc1twcmltLnZlcnRJZHggKiBtUG9zaXRpb25zU3RyaWRlICsgMV07CisgICAgZmxvYXQgcG9zWiA9IG1PYmpQb3NpdGlvbnNbcHJpbS52ZXJ0SWR4ICogbVBvc2l0aW9uc1N0cmlkZSArIDJdOworCisgICAgZmxvYXQgbm9ybVggPSAwLjBmOworICAgIGZsb2F0IG5vcm1ZID0gMC4wZjsKKyAgICBmbG9hdCBub3JtWiA9IDAuMGY7CisgICAgaWYgKHByaW0ubm9ybUlkeCAhPSBNQVhfSU5ERVgpIHsKKyAgICAgICAgbm9ybVggPSBtT2JqTm9ybWFsc1twcmltLm5vcm1JZHggKiBtTm9ybWFsc1N0cmlkZSArIDBdOworICAgICAgICBub3JtWSA9IG1PYmpOb3JtYWxzW3ByaW0ubm9ybUlkeCAqIG1Ob3JtYWxzU3RyaWRlICsgMV07CisgICAgICAgIG5vcm1aID0gbU9iak5vcm1hbHNbcHJpbS5ub3JtSWR4ICogbU5vcm1hbHNTdHJpZGUgKyAyXTsKKyAgICB9CisKKyAgICBmbG9hdCB0ZXhDb29yZFggPSAwLjBmOworICAgIGZsb2F0IHRleENvb3JkWSA9IDAuMGY7CisgICAgaWYgKHByaW0udGV4SWR4ICE9IE1BWF9JTkRFWCkgeworICAgICAgICB0ZXhDb29yZFggPSBtT2JqVGV4dHVyZUNvb3Jkc1twcmltLnRleElkeCAqIG1UZXh0dXJlQ29vcmRzU3RyaWRlICsgMF07CisgICAgICAgIHRleENvb3JkWSA9IG1PYmpUZXh0dXJlQ29vcmRzW3ByaW0udGV4SWR4ICogbVRleHR1cmVDb29yZHNTdHJpZGUgKyAxXTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+ICZpdGhSZW1hcExpc3QgPSBtVmVydGV4UmVtYXBbcHJpbS52ZXJ0SWR4XTsKKyAgICAvLyBXZSBtYXkgaGF2ZSBzb21lIHBvdGVudGlhbCB2ZXJ0aWNlcyB3ZSBjYW4gcmV1c2UKKyAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSBwb3RlbnRpYWwgY2FuZGlkYXRlcyBhbmQgc2VlIGlmIGFueSBtYXRjaCBvdXIgZ3V5CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBpdGhSZW1hcExpc3Quc2l6ZSgpOyBpICsrKSB7CisKKyAgICAgICAgaW50IGl0aFJlbWFwID0gaXRoUmVtYXBMaXN0W2ldOworICAgICAgICAvLyBjb21wYXJlIGV4aXN0aW5nIHZlcnRleCB3aXRoIHRoZSBuZXcgb25lCisgICAgICAgIGlmIChtUG9zaXRpb25zW2l0aFJlbWFwICogbVBvc2l0aW9uc1N0cmlkZSArIDBdICE9IHBvc1ggfHwKKyAgICAgICAgICAgIG1Qb3NpdGlvbnNbaXRoUmVtYXAgKiBtUG9zaXRpb25zU3RyaWRlICsgMV0gIT0gcG9zWSB8fAorICAgICAgICAgICAgbVBvc2l0aW9uc1tpdGhSZW1hcCAqIG1Qb3NpdGlvbnNTdHJpZGUgKyAyXSAhPSBwb3NaKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBnbyBvdmVyIG5vcm1hbHMKKyAgICAgICAgaWYgKHByaW0ubm9ybUlkeCAhPSBNQVhfSU5ERVgpIHsKKyAgICAgICAgICAgIGlmIChtTm9ybWFsc1tpdGhSZW1hcCAqIG1Ob3JtYWxzU3RyaWRlICsgMF0gIT0gbm9ybVggfHwKKyAgICAgICAgICAgICAgICBtTm9ybWFsc1tpdGhSZW1hcCAqIG1Ob3JtYWxzU3RyaWRlICsgMV0gIT0gbm9ybVkgfHwKKyAgICAgICAgICAgICAgICBtTm9ybWFsc1tpdGhSZW1hcCAqIG1Ob3JtYWxzU3RyaWRlICsgMl0gIT0gbm9ybVopIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFuZCB0ZXhjb29yZHMKKyAgICAgICAgaWYgKHByaW0udGV4SWR4ICE9IE1BWF9JTkRFWCkgeworICAgICAgICAgICAgaWYgKG1UZXh0dXJlQ29vcmRzW2l0aFJlbWFwICogbVRleHR1cmVDb29yZHNTdHJpZGUgKyAwXSAhPSB0ZXhDb29yZFggfHwKKyAgICAgICAgICAgICAgICBtVGV4dHVyZUNvb3Jkc1tpdGhSZW1hcCAqIG1UZXh0dXJlQ29vcmRzU3RyaWRlICsgMV0gIT0gdGV4Q29vcmRZKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSB0aGUgbmV3IHZlcnRleCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGF0IHdlIGFscmVhZHkgc3RvcmVkCisgICAgICAgIHJldHVybiBpdGhSZW1hcDsKKyAgICB9CisKKyAgICAvLyBXZSBkaWQgbm90IGVuY291bnRlciB0aGlzIHZlcnRleCB5ZXQsIHN0b3JlIGl0IGFuZCByZXR1cm4gaXRzIGluZGV4CisgICAgbVBvc2l0aW9ucy5wdXNoX2JhY2socG9zWCk7CisgICAgbVBvc2l0aW9ucy5wdXNoX2JhY2socG9zWSk7CisgICAgbVBvc2l0aW9ucy5wdXNoX2JhY2socG9zWik7CisKKyAgICBpZiAocHJpbS5ub3JtSWR4ICE9IE1BWF9JTkRFWCkgeworICAgICAgICBtTm9ybWFscy5wdXNoX2JhY2sobm9ybVgpOworICAgICAgICBtTm9ybWFscy5wdXNoX2JhY2sobm9ybVkpOworICAgICAgICBtTm9ybWFscy5wdXNoX2JhY2sobm9ybVopOworICAgIH0KKworICAgIGlmIChwcmltLnRleElkeCAhPSBNQVhfSU5ERVgpIHsKKyAgICAgICAgbVRleHR1cmVDb29yZHMucHVzaF9iYWNrKHRleENvb3JkWCk7CisgICAgICAgIG1UZXh0dXJlQ29vcmRzLnB1c2hfYmFjayh0ZXhDb29yZFkpOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhpcyBtYXBwaW5nLiBTaW5jZSB3ZSBhcmUgc3RvcmluZyBmbG9hdHMsIG5vdCB2ZWMzJ3MsIG5lZWQgdG8KKyAgICAvLyBkaXZpZGUgYnkgcG9zaXRpb24gc2l6ZSB0byBnZXQgdGhlIHJpZ2h0IGluZGV4CisgICAgaW50IGN1cnJlbnRWZXJ0ZXhJbmRleCA9IChtUG9zaXRpb25zLnNpemUoKS9tUG9zaXRpb25zU3RyaWRlKSAtIDE7CisgICAgaXRoUmVtYXBMaXN0LnB1c2hfYmFjayhjdXJyZW50VmVydGV4SW5kZXgpOworCisgICAgcmV0dXJuIGN1cnJlbnRWZXJ0ZXhJbmRleDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2EzZGNvbnZlcnQvT2JqTG9hZGVyLmggYi90b29scy9hM2Rjb252ZXJ0L09iakxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGIzNWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L09iakxvYWRlci5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfT0JKX0xPQURFUl9IXworI2RlZmluZSBfT0JKX0xPQURFUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSAiU2ltcGxlTWVzaC5oIgorI2luY2x1ZGUgPHJzQ29udGV4dC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgTUFYX0lOREVYIDB4ZmZmZmZmZmYKKworY2xhc3MgT2JqTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBPYmpMb2FkZXIoKTsKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqb2JqRmlsZSk7CisgICAgYm9vbCBjb252ZXJ0VG9BM0QoY29uc3QgY2hhciAqYTNkRmlsZSk7Citwcml2YXRlOgorCisgICAgTWVzaCAqZ2V0TWVzaChDb250ZXh0ICpyc2MsIHVpbnQzMl90IG1lc2hJbmRleCkgeworICAgICAgICByZXR1cm4gbU1lc2hlc1ttZXNoSW5kZXhdLmdldE1lc2gocnNjKTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0TnVtTWVzaGVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1lc2hlcy5zaXplKCk7CisgICAgfQorCisgICAgLy8gLm9iaiBoYXMgYSBnbG9iYWwgbGlzdCBvZiB2ZXJ0ZXggZGF0YQorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtT2JqUG9zaXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtT2JqTm9ybWFsczsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbU9ialRleHR1cmVDb29yZHM7CisKKyAgICBzdHJ1Y3QgUHJpbWl0aXZlVnR4IHsKKyAgICAgICAgdWludDMyX3QgdmVydElkeDsKKyAgICAgICAgdWludDMyX3Qgbm9ybUlkeDsKKyAgICAgICAgdWludDMyX3QgdGV4SWR4OworCisgICAgICAgIFByaW1pdGl2ZVZ0eCgpIDogdmVydElkeChNQVhfSU5ERVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1JZHgoTUFYX0lOREVYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhJZHgoTUFYX0lOREVYKXsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgZmFjZXMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVJhd0ZhY2VzOworICAgIHN0ZDo6dmVjdG9yPFByaW1pdGl2ZVZ0eD4gbVBhcnNlZEZhY2VzOworICAgIHN0ZDo6c3RyaW5nIG1MYXN0TXRsOworCisgICAgLy8gR3JvdXBzIGFyZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIG1lc2hlcyB3aXRoaW4gdGhlIHNhbWUgLm9iaiBmaWxlCisgICAgY2xhc3MgT2JqTWVzaCA6IHB1YmxpYyBTaW1wbGVNZXNoIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8UHJpbWl0aXZlVnR4PiA+IG1VbmZpbHRlcmVkRmFjZXM7CisKKyAgICAgICAgdm9pZCBhcHBlbmRVbmZpbHRlcmVkRmFjZXMoc3RkOjpzdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgYXBwZW5kRmFjZUxpc3QobmFtZSk7CisgICAgICAgICAgICBtVW5maWx0ZXJlZEZhY2VzLnB1c2hfYmFjayhzdGQ6OnZlY3RvcjxQcmltaXRpdmVWdHg+KCkpOworICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciBpbmRleCBkYXRhCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbnVtUmVzZXJ2ZUluZGVjaWVzID0gMTI4OworICAgICAgICAgICAgbVVuZmlsdGVyZWRGYWNlcy5iYWNrKCkucmVzZXJ2ZShudW1SZXNlcnZlSW5kZWNpZXMpOworICAgICAgICB9CisKKyAgICAgICAgT2JqTWVzaCgpIHsKKyAgICAgICAgICAgIGFwcGVuZENoYW5uZWwoInBvc2l0aW9uIiwgMyk7CisgICAgICAgICAgICBhcHBlbmRDaGFubmVsKCJub3JtYWwiLCAzKTsKKyAgICAgICAgICAgIGFwcGVuZENoYW5uZWwoInRleHR1cmUwIiwgMik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8T2JqTWVzaD4gbU1lc2hlczsKKyAgICB2b2lkIGNoZWNrTmV3TWVzaENyZWF0aW9uKHN0ZDo6c3RyaW5nICZuZXdHcm91cCk7CisKKyAgICB2b2lkIHBhcnNlUmF3RmFjZXMoKTsKKyAgICB2b2lkIGhhbmRsZU9iakxpbmUoY2hhciAqbGluZSk7CisKKyAgICB2b2lkIHJlSW5kZXhHZW9tZXRyeSgpOworICAgIHVpbnQzMl90IHJlSW5kZXhHZW9tZXRyeVByaW0oT2JqTWVzaCAmbWVzaCwgUHJpbWl0aXZlVnR4ICZwcmltKTsKKworICAgIHVuc2lnbmVkIGludCBtUG9zaXRpb25zU3RyaWRlOworICAgIHVuc2lnbmVkIGludCBtTm9ybWFsc1N0cmlkZTsKKyAgICB1bnNpZ25lZCBpbnQgbVRleHR1cmVDb29yZHNTdHJpZGU7CisKKyAgICAvLyBUaGlzIHZlY3RvciBpcyB1c2VkIHRvIHJlbWFwIGEgcG9zaXRpb24gaW5kZXggaW50byBhIGxpc3QKKyAgICAvLyAgb2YgYWxsIGRpdmVyZ2VudCB2ZXJ0aWNlcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gPiBtVmVydGV4UmVtYXA7Cit9OworCisjZW5kaWYgLy9fT0JKX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvdG9vbHMvYTNkY29udmVydC9TaW1wbGVNZXNoLmggYi90b29scy9hM2Rjb252ZXJ0L1NpbXBsZU1lc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UxYTdjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYTNkY29udmVydC9TaW1wbGVNZXNoLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TSU1QTEVfTUVTSF9IXworI2RlZmluZSBfU0lNUExFX01FU0hfSF8KKworI2luY2x1ZGUgPHJzQ29udGV4dC5oPgorI2luY2x1ZGUgPHJzTWVzaC5oPgordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitjbGFzcyBTaW1wbGVNZXNoIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgQ2hhbm5lbCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtRGF0YTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgfTsKKworICAgIC8vIFZlcnRleCBjaGFubmVscyAocG9zaXRpb24sIG5vcm1hbCkKKyAgICAvLyBUaGlzIGFzc3VtZXMgYWxsIHRoZSBkYXRhIGFycmF5IGFyZSB0aGUgc2FtZSBzaXplCisgICAgc3RkOjp2ZWN0b3I8Q2hhbm5lbD4gbUNoYW5uZWxzOworCisgICAgLy8gVHJpYW5nbGUgbGlzdCBpbmRleCBkYXRhCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDMyX3Q+ID4gbVRyaWFuZ2xlTGlzdHM7CisgICAgLy8gTmFtZXMgb2YgYWxsIHRoZSB0cmlhbmdsZSBsaXN0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVHJpYW5nbGVMaXN0TmFtZXM7CisgICAgLy8gTmFtZSBvZiB0aGUgZW50aXJlIG9iamVjdAorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworCisgICAgLy8gQWRkcyBhbm90aGVyIGluZGV4IHNldCB0byB0aGUgbWVzaAorICAgIHZvaWQgYXBwZW5kRmFjZUxpc3Qoc3RkOjpzdHJpbmcgbmFtZSkgeworICAgICAgICBtVHJpYW5nbGVMaXN0TmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgICAgICBtVHJpYW5nbGVMaXN0cy5wdXNoX2JhY2soc3RkOjp2ZWN0b3I8dWludDMyX3Q+KCkpOworICAgIH0KKworICAgIC8vIEFkZHMgYW5vdGhlciBkYXRhIGNoYW5uZWwgKHBvc2l0aW9uLCBub3JtYWwsIGV0Yy4pCisgICAgdm9pZCBhcHBlbmRDaGFubmVsKHN0ZDo6c3RyaW5nIG5hbWUsIHVpbnQzMl90IHN0cmlkZSkgeworICAgICAgICBtQ2hhbm5lbHMucHVzaF9iYWNrKENoYW5uZWwoKSk7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCByZXNlcnZlVnR4ID0gMTI4OworICAgICAgICBtQ2hhbm5lbHMuYmFjaygpLm1EYXRhLnJlc2VydmUocmVzZXJ2ZVZ0eCpzdHJpZGUpOworICAgICAgICBtQ2hhbm5lbHMuYmFjaygpLm1OYW1lID0gbmFtZTsKKyAgICAgICAgbUNoYW5uZWxzLmJhY2soKS5tU3RyaWRlID0gc3RyaWRlOworICAgIH0KKworICAgIFNpbXBsZU1lc2goKSB7CisgICAgICAgIC8vIHJlc2VydmUgc29tZSBkYXRhIGluIHRoZSB2ZWN0b3JzCisgICAgICAgIC8vIHNpbXBseSBsZXR0aW5nIGl0IGdyb3cgYnkgaXRzZWxmIHRlbmRzIHRvIHdhc3RlIGEgbG90IG9mIHRpbWUgb24KKyAgICAgICAgLy8gcmFsbG9jYXRpb25zIC8gY29waWVzIHdoZW4gZGVhbGluZyB3aXRoIGdlb21ldHJ5IGRhdGEKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHJlc2VydmVGYWNlcyA9IDg7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCByZXNlcnZlQ2hhbm5lbHMgPSA4OworICAgICAgICBtVHJpYW5nbGVMaXN0cy5yZXNlcnZlKHJlc2VydmVGYWNlcyk7CisgICAgICAgIG1UcmlhbmdsZUxpc3ROYW1lcy5yZXNlcnZlKHJlc2VydmVGYWNlcyk7CisgICAgICAgIG1DaGFubmVscy5yZXNlcnZlKHJlc2VydmVDaGFubmVscyk7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGVzIGEgcmVuZGVyc2NyaXB0IG1lc2ggdGhhdCBjb3VsZCBiZSB1c2VkIGZvciBhM2Qgc2VyaWFsaXphdGlvbgorICAgIE1lc2ggKmdldE1lc2goQ29udGV4dCAqcnNjKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgb3VyIGNoYW5uZWwgbGF5b3V0CisgICAgICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgICAgIGZvciAodWludDMyX3QgYyA9IDA7IGMgPCBtQ2hhbm5lbHMuc2l6ZSgpOyBjICsrKSB7CisgICAgICAgICAgICAvLyBTa2lwIGVtcHR5IGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobUNoYW5uZWxzW2NdLm1EYXRhLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpzdWJFbGVtID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgbUNoYW5uZWxzW2NdLm1TdHJpZGUpOworICAgICAgICAgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKHN1YkVsZW0sIG1DaGFubmVsc1tjXS5tTmFtZS5jX3N0cigpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShyc2MpOworCisgICAgICAgIHVpbnQzMl90IG51bVZlcnRzID0gbUNoYW5uZWxzWzBdLm1EYXRhLnNpemUoKS9tQ2hhbm5lbHNbMF0ubVN0cmlkZTsKKyAgICAgICAgVHlwZSAqdmVydGV4RGF0YVR5cGUgPSBUeXBlOjpnZXRUeXBlKHJzYywgdmVydGV4RGF0YUVsZW0sIG51bVZlcnRzLCAwLCAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB2ZXJ0ZXhEYXRhVHlwZS0+Y29tcHV0ZSgpOworCisgICAgICAgIEFsbG9jYXRpb24gKnZlcnRleEFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCB2ZXJ0ZXhEYXRhVHlwZSwgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOworCisgICAgICAgIHVpbnQzMl90IHZlcnRleFNpemUgPSB2ZXJ0ZXhEYXRhRWxlbS0+Z2V0U2l6ZUJ5dGVzKCkvc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgLy8gRmlsbCB0aGlzIGFsbG9jYXRpb24gd2l0aCBzb21lIGRhdGEKKyAgICAgICAgZmxvYXQgKmRhdGFQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVZlcnRzOyBpICsrKSB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHZlcnRleCdzIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IHZlcnRleFBvcyA9IGkqdmVydGV4U2l6ZTsKKyAgICAgICAgICAgIGZsb2F0ICp2ZXJ0ZXhQdHIgPSBkYXRhUHRyICsgdmVydGV4UG9zOworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGMgPSAwOyBjIDwgbUNoYW5uZWxzLnNpemUoKTsgYyArKykgeworICAgICAgICAgICAgICAgIC8vIFNraXAgZW1wdHkgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxzW2NdLm1EYXRhLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNTdHJpZGUgPSAwOyBjU3RyaWRlIDwgbUNoYW5uZWxzW2NdLm1TdHJpZGU7IGNTdHJpZGUgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKih2ZXJ0ZXhQdHIrKykgPSBtQ2hhbm5lbHNbY10ubURhdGFbaSAqIG1DaGFubmVsc1tjXS5tU3RyaWRlICsgY1N0cmlkZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGxldHMgd3JpdGUgaW5kZXggZGF0YQorICAgICAgICBjb25zdCBFbGVtZW50ICppbmRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX1VOU0lHTkVEXzE2LCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKKworICAgICAgICBNZXNoICptZXNoID0gbmV3IE1lc2gocnNjKTsKKyAgICAgICAgbWVzaC0+c2V0TmFtZShtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50ID0gMTsKKyAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlsxXTsKKyAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbMF0uc2V0KHZlcnRleEFsbG9jKTsKKworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gbVRyaWFuZ2xlTGlzdHMuc2l6ZSgpOworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOworCisgICAgICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKKyAgICAgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtZXNoLT5tUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgICAgIE1lc2g6OlByaW1pdGl2ZV90ICpwcmltID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OworICAgICAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXNbcENvdW50XSA9IHByaW07CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbVRyaWFuZ2xlTGlzdHNbcENvdW50XS5zaXplKCk7CisgICAgICAgICAgICBUeXBlICppbmRleFR5cGUgPSBUeXBlOjpnZXRUeXBlKHJzYywgaW5kZXhFbGVtLCBudW1JbmRpY2llcywgMCwgMCwgZmFsc2UsIGZhbHNlICk7CisKKyAgICAgICAgICAgIGluZGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgICAgICAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCBpbmRleFR5cGUsIFJTX0FMTE9DQVRJT05fVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgICAgIHVpbnQxNl90ICppbmRleFB0ciA9ICh1aW50MTZfdCopaW5kZXhBbGxvYy0+Z2V0UHRyKCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJmluZGV4TGlzdCA9IG1UcmlhbmdsZUxpc3RzW3BDb3VudF07CisgICAgICAgICAgICB1aW50MzJfdCBudW1UcmllcyA9IG51bUluZGljaWVzIC8gMzsKKworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVRyaWVzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaW5kZXhQdHJbaSAqIDMgKyAwXSA9ICh1aW50MTZfdClpbmRleExpc3RbaSAqIDMgKyAwXTsKKyAgICAgICAgICAgICAgICBpbmRleFB0cltpICogMyArIDFdID0gKHVpbnQxNl90KWluZGV4TGlzdFtpICogMyArIDFdOworICAgICAgICAgICAgICAgIGluZGV4UHRyW2kgKiAzICsgMl0gPSAodWludDE2X3QpaW5kZXhMaXN0W2kgKiAzICsgMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleEFsbG9jLT5zZXROYW1lKG1UcmlhbmdsZUxpc3ROYW1lc1twQ291bnRdLmNfc3RyKCkpOworICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKyAgICAgICAgICAgIHByaW0tPm1QcmltaXRpdmUgPSBSU19QUklNSVRJVkVfVFJJQU5HTEU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVzaDsKKyAgICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2EzZGNvbnZlcnQvYTNkY29udmVydC5jcHAgYi90b29scy9hM2Rjb252ZXJ0L2EzZGNvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjU3MzMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L2EzZGNvbnZlcnQuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQ29sbGFkYUxvYWRlci5oIgorI2luY2x1ZGUgIk9iakxvYWRlci5oIgorCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pIHsKKyAgICBjb25zdCBjaGFyICpvYmpFeHQgPSAiLm9iaiI7CisgICAgY29uc3QgY2hhciAqZGFlRXh0ID0gIi5kYWUiOworCisgICAgaWYoYXJnYyAhPSAzKSB7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICBwcmludGYoIlVzYWdlOlxuIik7CisgICAgICAgIHByaW50ZigiYTNkY29udmVydCBpbnB1dF9maWxlIGEzZF9vdXRwdXRfZmlsZVxuIik7CisgICAgICAgIHByaW50ZigiQ3VycmVudGx5IC5vYmogYW5kIC5kYWUgKGNvbGxhZGEpIGlucHV0IGZpbGVzIGFyZSBhY2NlcHRlZFxuIik7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBib29sIGlzU3VjY2Vzc2Z1bCA9IGZhbHNlOworCisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBhcmd2WzFdOworICAgIHNpemVfdCBkb3RQb3MgPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICBpZiAoZG90UG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHByaW50ZigiSW52YWxpZCBpbnB1dC4gQ3VycmVudGx5IC5vYmogYW5kIC5kYWUgKGNvbGxhZGEpIGlucHV0IGZpbGVzIGFyZSBhY2NlcHRlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGV4dCA9IGZpbGVuYW1lLnN1YnN0cihkb3RQb3MpOworICAgIGlmIChleHQgPT0gZGFlRXh0KSB7CisgICAgICAgIENvbGxhZGFMb2FkZXIgY29udmVydGVyOworICAgICAgICBpc1N1Y2Nlc3NmdWwgPSBjb252ZXJ0ZXIuaW5pdChhcmd2WzFdKTsKKyAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bCkgeworICAgICAgICAgICAgaXNTdWNjZXNzZnVsID0gY29udmVydGVyLmNvbnZlcnRUb0EzRChhcmd2WzJdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXh0ID09IG9iakV4dCkgeworICAgICAgICBPYmpMb2FkZXIgb2JqQ29udjsKKyAgICAgICAgaXNTdWNjZXNzZnVsID0gb2JqQ29udi5pbml0KGFyZ3ZbMV0pOworICAgICAgICBpZiAoaXNTdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBpc1N1Y2Nlc3NmdWwgPSBvYmpDb252LmNvbnZlcnRUb0EzRChhcmd2WzJdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiSW52YWxpZCBpbnB1dC4gQ3VycmVudGx5IC5vYmogYW5kIC5kYWUgKGNvbGxhZGEpIGlucHV0IGZpbGVzIGFyZSBhY2NlcHRlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKGlzU3VjY2Vzc2Z1bCkgeworICAgICAgICBwcmludGYoIi0tLUFsbCBkb25lLS0tXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIi0tLUVuY291bnRlcmVkIGVycm9ycywgY29udmVyc2lvbiBmYWlsZWQtLS1cbiIpOworICAgIH0KKworICAgIHJldHVybiBpc1N1Y2Nlc3NmdWwgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2EzZGNvbnZlcnQvbGljZW5zZS50eHQgYi90b29scy9hM2Rjb252ZXJ0L2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1NDY2N2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hM2Rjb252ZXJ0L2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMjUgQEAKK1BhcnRzIG9mIHRoaXMgY29kZSBjb21lIGZyb20gY29sbGFkYURvbSB3aXRoIHRoZSBsaWNlbnNlIGJlbG93LiBUaGUgcmVzdCBpcyBBT1NQLgorCisKKworVGhlIE1JVCBMaWNlbnNlDQorDQorQ29weXJpZ2h0IDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4NCisNCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQorDQorVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCisNCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NCitUSEUgU09GVFdBUkUuDQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWxmdHJlZS9BbmRyb2lkLm1rIGIvdG9vbHMvZWxmdHJlZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYmEwZjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbGZ0cmVlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisKKyMgVGFyZ2V0IGV4ZWN1dGFibGUKKyMgVE9ETzogUmVxdWlyZXMgbGliZWxmIGZvciB0YXJnZXQKKworI2luY2x1ZGUgJChDTEVBUl9WQVJTKQorI0xPQ0FMX01PRFVMRSA6PSAkKG1vZHVsZSkKKyNMT0NBTF9TUkNfRklMRVMgOj0gJChzcmNfZmlsZXMpCisjTE9DQUxfQ19JTkNMVURFUyA6PSAkKGNfaW5jbHVkZXMpCisjTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHNoYXJlZF9saWJyYXJpZXMpCisjTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAkKHN0YXRpY19saWJyYXJpZXMpCisjTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09QVElPTkFMX0VYRUNVVEFCTEVTKQorI0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisjTE9DQUxfTERMSUJTICs9CisjaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMgSG9zdCBleGVjdXRhYmxlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGVsZnRyZWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBlbGZ0cmVlLmMKK0xPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvZWxmdXRpbHMvbGliZWxmCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmVsZgoraW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2FwcHMvR3JhcGhpY3NMYWIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3Rvb2xzL2VsZnRyZWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGFwcHMvR3JhcGhpY3NMYWIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIHRvb2xzL2VsZnRyZWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMgYi90b29scy9lbGZ0cmVlL2VsZnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlZDEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUEFUSF9NQVggMjU2CisKK3N0YXRpYyBlbnVtIHsgSElERV9EVVBTLCBQUlVORV9EVVBTLCBTSE9XX0RVUFMgfSBkdXBfbW9kZTsKK3N0YXRpYyBjaGFyICpyb290X25hbWU7CisKK3N0YXRpYyB2b2lkIGFwcF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdW5peF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgZXJyc3Y7CisKKwllcnJzdiA9IGVycm5vOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJZnByaW50ZihzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvcihlcnJzdikpOworfQorCitzdGF0aWMgdm9pZCBlbGZfZXJyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIjogJXNcbiIsIGVsZl9lcnJtc2coLTEpKTsKK30KKworc3RydWN0IHNlZW4geworCWNoYXIgKm5hbWU7CisJc3RydWN0IHNlZW4gKm5leHQ7Cit9OworCitzdHJ1Y3QgdHJlZV9zdGF0ZSB7CisJaW50IGxldmVsOworCXN0cnVjdCBzZWVuICpzZWVuOworfTsKKworc3RhdGljIGludCBzZWVuKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzOworCisJZm9yIChzID0gdC0+c2VlbjsgczsgcyA9IHMtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAocy0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzID0gbWFsbG9jKHNpemVvZigqcykpOworCXMtPm5hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisJc3RyY3B5KHMtPm5hbWUsIG5hbWUpOworCXMtPm5leHQgPSB0LT5zZWVuOworCXQtPnNlZW4gPSBzOworfQorCitjaGFyICppbmRlbnRfc3RyID0gIiAgIjsKKworc3RhdGljIHZvaWQgaW5kZW50KHN0cnVjdCB0cmVlX3N0YXRlICp0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmxldmVsOyBpKyspCisJCXByaW50ZigiJXMiLCBpbmRlbnRfc3RyKTsKK30KKworc3RydWN0IHNlYXJjaF9kaXIgeworCWNoYXIgKnBhdGg7CisJc3RydWN0IHNlYXJjaF9kaXIgKm5leHQ7Cit9ICpkaXJzID0gTlVMTDsKKworc3RhdGljIHZvaWQgYWRkX3NlYXJjaF9kaXIoY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyID0gbWFsbG9jKHNpemVvZigqZGlyKSk7CisJZGlyLT5wYXRoID0gbWFsbG9jKHN0cmxlbihwYXRoKSArIDEpOworCXN0cmNweShkaXItPnBhdGgsIHBhdGgpOworCWRpci0+bmV4dCA9IGRpcnM7CisJZGlycyA9IGRpcjsKK30KKworc3RydWN0IGZpbGVfc3RhdGUgeworCXN0cnVjdCB0cmVlX3N0YXRlICp0OworCUVsZiAqZTsKKwlFbGZfRGF0YSAqc3RydGFiX2RhdGE7Cit9OworCitzdGF0aWMgRWxmX1NjbiAqZmluZF9zY24oc3RydWN0IGZpbGVfc3RhdGUgKmYsIEdFbGZfV29yZCBzaHQsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyX291dCkKK3sKKwl3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuKGYtPmUsIHNjbikpKSB7CisJCWlmICghZ2VsZl9nZXRzaGRyKHNjbiwgc2hkcl9vdXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNoZHJfb3V0LT5zaF90eXBlID09IHNodCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzY247Cit9CisKK3N0cnVjdCBkeW5fc3RhdGUgeworCXN0cnVjdCBmaWxlX3N0YXRlICpmOworCUVsZl9EYXRhICpkeW5fZGF0YTsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgaW50IGZpbmRfZHluKHN0cnVjdCBkeW5fc3RhdGUgKmQsIEdFbGZfU3h3b3JkIHRhZywgR0VsZl9EeW4gKmR5bl9vdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+Y291bnQ7IGkrKykgeworCQlpZiAoIWdlbGZfZ2V0ZHluKGQtPmR5bl9kYXRhLCBpLCBkeW5fb3V0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkeW5fb3V0LT5kX3RhZyA9PSB0YWcpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9maWxlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lLCBjaGFyICpwYXRoKTsKKworc3RhdGljIGludCBkdW1wX25lZWRlZChzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGZkOworCisJdC0+bGV2ZWwrKzsKKworCWZvciAoZGlyID0gZGlyczsgZGlyOyBkaXIgPSBkaXItPm5leHQpIHsKKwkJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIGRpci0+cGF0aCwgbmFtZSk7CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQljbG9zZShmZCk7CisJCQlkdW1wX2ZpbGUodCwgbmFtZSwgcGF0aCk7CisJCQl0LT5sZXZlbC0tOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlhcHBfZXJyKCJDb3VsZG4ndCByZXNvbHZlIGRlcGVuZGVuY3kgXCIlc1wiLiIsIG5hbWUpOworCXQtPmxldmVsLS07CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGR1bXBfZHluYW1pYyhzdHJ1Y3QgZmlsZV9zdGF0ZSAqZiwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCit7CisJc3RydWN0IGR5bl9zdGF0ZSBkOworCUdFbGZfRHluIG5lZWRlZF9keW47CisJY2hhciAqbmVlZGVkX25hbWU7CisJaW50IGk7CisKKwlkLmYgPSBmOworCWQuZHluX2RhdGEgPSBlbGZfZ2V0ZGF0YShzY24sIE5VTEwpOworCWlmICghZC5keW5fZGF0YSkgeworCQllbGZfZXJyKCJlbGZfZ2V0ZGF0YSBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkLmNvdW50ID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC5jb3VudDsgaSsrKSB7CisJCWlmICghZ2VsZl9nZXRkeW4oZC5keW5fZGF0YSwgaSwgJm5lZWRlZF9keW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKG5lZWRlZF9keW4uZF90YWcgIT0gRFRfTkVFREVEKQorCQkJY29udGludWU7CisKKwkJbmVlZGVkX25hbWUgPSAoY2hhciAqKWYtPnN0cnRhYl9kYXRhLT5kX2J1ZgorCQkJICAgICAgKyBuZWVkZWRfZHluLmRfdW4uZF92YWw7CisKKwkJZHVtcF9uZWVkZWQoZi0+dCwgbmVlZGVkX25hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfZmlsZShzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSwgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZV9zdGF0ZSBmOworCWludCBmZDsKKwlFbGZfU2NuICpzY247CisJR0VsZl9TaGRyIHNoZHI7CisKKwlpZiAoKGR1cF9tb2RlID09IEhJREVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlpbmRlbnQodCk7IHByaW50ZigiJXMiLCBuYW1lKTsKKworCWlmICgoZHVwX21vZGUgPT0gUFJVTkVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkgeworCQlwcmludGYoIi4uLlxuIik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ZigiOlxuIik7CisJfQorCisJc2VlKHQsIG5hbWUpOworCisJZi50ID0gdDsKKworCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQl1bml4X2Vycigib3BlbiglcykgZmFpbGVkIiwgZmlsZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmLmUgPSBlbGZfYmVnaW4oZmQsIEVMRl9DX1JFQUQsIE5VTEwpOworCWlmICghZi5lKSB7CisJCWVsZl9lcnIoImVsZl9iZWdpbiBmYWlsZWQgb24gJXMiLCBmaWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfU1RSVEFCLCBOVUxMLCAmc2hkcik7CisJZi5zdHJ0YWJfZGF0YSA9IGVsZl9nZXRkYXRhKHNjbiwgTlVMTCk7CisJaWYgKCFmLnN0cnRhYl9kYXRhKSB7CisJCWFwcF9lcnIoIiVzIGhhcyBubyBzdHJ0YWIgc2VjdGlvbiIsIGZpbGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2NuID0gTlVMTDsKKwl3aGlsZSAoKHNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfRFlOQU1JQywgc2NuLCAmc2hkcikpKSB7CisJCWR1bXBfZHluYW1pYygmZiwgc2NuLCAmc2hkcik7CisJfQorCisJZWxmX2VuZChmLmUpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGVsZnRyZWUgWyAtcyB8IC1oIF0gZWxmLWZpbGVcbiIKKwkgICAgICAgICAgICAgICAgIiAgLVMgIER1cGxpY2F0ZSBlbnRpcmUgc3VidHJlZSB3aGVuIGEgZHVwbGljYXRlIGlzIGZvdW5kXG4iCisJCQkiICAtUCAgU2hvdyBkdXBsaWNhdGVzLCBidXQgb25seSBpbmNsdWRlIHN1YnRyZWUgb25jZVxuIgorCQkJIiAgLUggIFNob3cgZWFjaCBsaWJyYXJ5IGF0IG1vc3Qgb25jZSwgZXZlbiBpZiBkdXBsaWNhdGVkXG4iCisJCQkiICAtaCAgU2hvdyB0aGlzIGhlbHAgc2NyZWVuXG4iKTsKK30KKworc3RhdGljIGludCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVMiKSkgeworCQkJZHVwX21vZGUgPSBTSE9XX0RVUFM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVAiKSkgeworCQkJZHVwX21vZGUgPSBQUlVORV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1IIikpIHsKKwkJCWR1cF9tb2RlID0gSElERV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKwkJCXVzYWdlKCk7CisJCQlleGl0KDApOworCQl9IGVsc2UgeworCQkJYXBwX2VycigiVW5leHBlY3RlZCBhcmd1bWVudCBcIiVzXCIhXG4iLCBhcmd2W2ldKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJvb3RfbmFtZSA9IGFyZ3ZbYXJnYyAtIDFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9zZWFyY2hfZGlycyh2b2lkKQoreworCWNoYXIgKnJlbHBhdGg7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKworCXJlbHBhdGggPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKKwlpZiAoIXJlbHBhdGgpIHsKKwkJYXBwX2VycigiV2FybmluZzogQU5EUk9JRF9QUk9EVUNUX09VVCBub3Qgc2V0OyAiCisJCSAgICAgICAgInVzaW5nIGN1cnJlbnQgZGlyZWN0b3J5LlxuIik7CisJCXJlbHBhdGggPSAiLiI7CisJfQorCisJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIHJlbHBhdGgsICJzeXN0ZW0vbGliIik7CisJYWRkX3NlYXJjaF9kaXIocGF0aCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHRyZWVfc3RhdGUgdDsKKworCWlmIChhcmdjIDwgMiB8fCBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpKSB7CisJCXVzYWdlKCk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkgeworCQllbGZfZXJyKCJ2ZXJzaW9uIG1pc21hdGNoIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwl0LmxldmVsID0gMDsKKwl0LnNlZW4gID0gTlVMTDsKKworCWFkZF9zZWFyY2hfZGlycygpOworCisJZHVtcF9maWxlKCZ0LCByb290X25hbWUsIHJvb3RfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfZG93bi5wbmcgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2Fycm93X2Rvd24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5ZmRlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2Fycm93X2Rvd24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfbGVmdC5wbmcgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2Fycm93X2xlZnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4MWIxOTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2Fycm93X2xlZnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfcmlnaHQucG5nIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9hcnJvd19yaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGNiYzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfcmlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfdXAucG5nIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9hcnJvd191cC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjljNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYXJyb3dfdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYmFja2dyb3VuZF9sYW5kLnBuZyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYmFja2dyb3VuZF9sYW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjEwY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9iYWNrZ3JvdW5kX2xhbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYmFja2dyb3VuZF9wb3J0LnBuZyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYmFja2dyb3VuZF9wb3J0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Njg1MWRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9iYWNrZ3JvdW5kX3BvcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYnV0dG9uLnBuZyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvYnV0dG9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjgxZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9idXR0b24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvY29udHJvbHMucG5nIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9jb250cm9scy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRiODVlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvY29udHJvbHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvaGFyZHdhcmUuaW5pIGIvdG9vbHMvZW11bGF0b3Ivc2tpbnMvV1hHQS9oYXJkd2FyZS5pbmkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTMwNTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvaGFyZHdhcmUuaW5pCkBAIC0wLDAgKzEsNiBAQAorIyBza2luLXNwZWNpZmljIGhhcmR3YXJlIHZhbHVlcworaHcubGNkLmRlbnNpdHk9MTYwCit2bS5oZWFwU2l6ZT00OAoraHcucmFtU2l6ZT0yNTYKK2h3LmtleWJvYXJkLmxpZD1ubworCmRpZmYgLS1naXQgYS90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2tleS5wbmcgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2tleS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBiMDNiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0Eva2V5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2tleWJvYXJkLnBuZyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0Eva2V5Ym9hcmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNDlkY2YKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2tleWJvYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2xheW91dCBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0EvbGF5b3V0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhYWViMWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL2xheW91dApAQCAtMCwwICsxLDg4IEBACitwYXJ0cyB7CisgICAgcG9ydHJhaXQgeworICAgICAgICBiYWNrZ3JvdW5kIHsKKyAgICAgICAgICAgIGltYWdlICAgYmFja2dyb3VuZF9wb3J0LnBuZworICAgICAgICB9CisgICAgfQorICAgIGxhbmRzY2FwZSB7CisgICAgICAgIGJhY2tncm91bmQgeworICAgICAgICAgICAgaW1hZ2UgICBiYWNrZ3JvdW5kX2xhbmQucG5nCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXZpY2UgeworICAgICAgICBkaXNwbGF5IHsKKyAgICAgICAgICAgIHdpZHRoICAgMTI4MAorICAgICAgICAgICAgaGVpZ2h0ICA4MDAKKyAgICAgICAgICAgIHggICAgICAgMAorICAgICAgICAgICAgeSAgICAgICAwCisgICAgICAgIH0KKyAgICB9CisgICAgCit9CisKK2xheW91dHMgeworCisgICAgbGFuZHNjYXBlIHsKKyAgICAgICAgd2lkdGggICAgIDEzMzMKKyAgICAgICAgaGVpZ2h0ICAgIDg1NQorICAgICAgICBjb2xvciAgICAgMHhlMGUwZTAKKyAgICAgICAgZXZlbnQgICAgIEVWX1NXOjA6MQorCisgICAgICAgIHBhcnQxIHsKKyAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKKyAgICAgICAgICAgIHggICAgICAgMTQwMAorICAgICAgICAgICAgeSAgICAgICAwCisgICAgICAgIH0KKworICAgICAgICBwYXJ0MiB7CisgICAgICAgICAgICBuYW1lICAgIGxhbmRzY2FwZQorICAgICAgICAgICAgeCAgICAgICAwCisgICAgICAgICAgICB5ICAgICAgIDAKKyAgICAgICAgfQorCisgICAgICAgIHBhcnQzIHsKKyAgICAgICAgICAgIG5hbWUgICAgICBkZXZpY2UKKyAgICAgICAgICAgIHggICAgICAgICAyNgorICAgICAgICAgICAgeSAgICAgICAgIDI5CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwb3J0cmFpdCB7CisgICAgICAgIHdpZHRoICAgICA4NTMKKyAgICAgICAgaGVpZ2h0ICAgIDEzMzQKKyAgICAgICAgY29sb3IgICAgIDB4ZTBlMGUwCisgICAgICAgIGV2ZW50ICAgICBFVl9TVzowOjAKKworICAgICAgICBkcGFkLXJvdGF0aW9uIDMKKyAgICAgICAgCisgICAgICAgIHBhcnQxIHsKKyAgICAgICAgICAgIG5hbWUgICAgcG9ydHJhaXQKKyAgICAgICAgICAgIHggICAgICAgMAorICAgICAgICAgICAgeSAgICAgICAwCisgICAgICAgIH0KKworICAgICAgICBwYXJ0MiB7CisgICAgICAgICAgICBuYW1lICAgIGxhbmRzY2FwZQorICAgICAgICAgICAgeCAgICAgICAxNDAwCisgICAgICAgICAgICB5ICAgICAgIDAKKyAgICAgICAgfQorCisgICAgICAgIHBhcnQzIHsKKyAgICAgICAgICAgIG5hbWUgICAgZGV2aWNlCisgICAgICAgICAgICB4ICAgICAgIDI3CisgICAgICAgICAgICB5ICAgICAgIDEzMDcKKyAgICAgICAgICAgIHJvdGF0aW9uICAzCisgICAgICAgIH0KKyAgICB9CisKK30KKwora2V5Ym9hcmQgeworICAgIGNoYXJtYXAgcXdlcnR5MgorfQorCituZXR3b3JrIHsKKyAgICBzcGVlZCAgZnVsbAorICAgIGRlbGF5ICBub25lCit9CmRpZmYgLS1naXQgYS90b29scy9lbXVsYXRvci9za2lucy9XWEdBL3NlbGVjdC5wbmcgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL3NlbGVjdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjRhNjVkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0Evc2VsZWN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9lbXVsYXRvci9za2lucy9XWEdBL3NwYWNlYmFyLnBuZyBiL3Rvb2xzL2VtdWxhdG9yL3NraW5zL1dYR0Evc3BhY2ViYXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhNDU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lbXVsYXRvci9za2lucy9XWEdBL3NwYWNlYmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9sYWJwcmV0ZXN0L1JFQURNRSBiL3Rvb2xzL2xhYnByZXRlc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODkwMzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L1JFQURNRQpAQCAtMCwwICsxLDUzIEBACitPdmVydmlldzoKKworVGhlIGxhYnByZXRlc3Quc2ggc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGVtdWxhdGUgYSB0eXBpY2FsIGF1dG9tYXRlZCB0ZXN0IGxhYgorc2Vzc2lvbi4gIEl0IHB1dHMgYSBkZXZpY2UgaW50byBib290bG9hZGVyIG1vZGUsIHJlYm9vdHMgaW50byBib290bG9hZGVyIG1vZGUsCitkZXRlcm1pbmVzIGRldmljZSB0eXBlLCBlcmFzZXMgdXNlciBjYWNoZSwgZmxhc2hlcyBhIGdlbmVyaWMgdXNlcmRhdGEgaW1hZ2UsCit1cGRhdGVzIHRoZSBib290bG9hZGVyIGltYWdlLCB1cGRhdGVzIHRoZSByYWRpbyBpbWFnZSwgdXBkYXRlcyB0aGUgc3lzdGVtIGltYWdlCithbmQgcmVib290cywgc2V0cyB1cCBmb3IgYSBtb25rZXkgcnVuIGFuZCBmaW5hbGx5IHJ1bnMgYSByYW5kb20gbW9ua2V5IHRlc3QuCitJdCB3aWxsIHJlcGVhdCB0aGlzIGJhc2VkIG9uIGFuIG9wdGlvbmFsIHBhcmFtZXRlcigtaSkgb3IgZGVmYXVsdCB0byAxMDAgdGltZXMuCitJdCB3aWxsIGRldGVjdCBpZiBpdCBpcyBpbiBhIGxvdyBiYXR0ZXJ5IHNpdHVhdGlvbiBhbmQgd2FpdCBmb3IgaXQgdG8gY2hhcmdlCithZ2Fpbi4KKworVGhlIGdvYWwgaXMgdG8gc2VlIGlmIGEgZGV2aWNlIGlzIHJlYWR5IGZvciBkZXBsb3ltZW50IHRvIGF1dG9tYXRlZCBsYWIgdGVzdGluZworYW5kIGNhbiBhbHNvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgbGFiIGluZnJhc3RydWN0dXJlIGlzIHJlYWR5IGZvciBkZXZpY2VzLgorVGhlIGlkZWEgaXMgdG8gcnVuIHRoaXMgc2NyaXB0IGF0IHRoZSBzYW1lIHRpbWUgZm9yIG11bHRpcGxlIGRldmljZXMsIHR5cGljYWxseQorSSB3b3VsZCBjb25uZWN0IDggZGV2aWNlcyB0byBhIGhvc3QgYW5kIHJ1biB0aGlzIHNjcmlwdCBpbiA4IHNlcGFyYXRlIHNoZWxsCitzZXNzaW9ucyBhbmQgd2F0Y2ggZm9yIGZhaWx1cmVzLgorCitSdW5uaW5nIHRoZSBzY3JpcHQ6CisKK0lmIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBhdHRhY2hlZCB0byB0aGUgaG9zdCB5b3UgY2FuIHNpbXBseSBqdXN0IHJ1biB0aGUKK3NjcmlwdCwgaXQgd2lsbCBkZXRlY3QgdGhlIGRldmljZSBhbmQgZ28gdGhyb3VnaCAxMDAgY3ljbGVzLCBydW5uaW5nIHRoZSBtb25rZXkKK2ZvciAyMDAgZXZlbnRzIGVhY2ggY3ljbGUuICBUaGUgc2NyaXB0IGlnbm9yZXMgbm9ybWFsIG1vbmtleSBmYWlsdXJlcy4gSWYgeW91CitoYXZlIG11bHRpcGxlIGRldmljZXMgYXR0YWNoZWQgdXNlIHRoZSAtZCA8ZGV2aWNlX2lkPiBwYXJhbWV0ZXIgdG8gdGFyZ2V0IGEKK3NwZWNpZmljIGRldmljZXMuICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIC1pIGZvciBob3cgbWFueSBjeWNsZXMgYW5kIC1tIGZvcgoraG93IG1hbnkgbW9ua2V5IGV2ZW50cyBhbmQgZmluYWxseSAteCB0byBtYWtlIGl0IHNraXAgdGhlIG1vbmtleSBydW4gcG9ydGlvbgorYWx0b2dldGhlci4KKworQWRkaW5nIHN1cHBvcnQgZm9yIG5ldyBkZXZpY2VzIG9yIGZyb20gc2NyYXRjaDoKKworVGhlIHNjcmlwdCB1c2VzIGluY2x1ZGVkIGNvcGllcyBvZiBhZGIgYW5kIGZhc3Rib290IHdoaWNoIGFyZSBpbiBpbiB0aGUgdG9vbHMvCitzdWIgZGlyZWN0b3J5LiBJZiB5b3UgYXJlIHNldHRpbmcgdGhpcyB1cCB3aXRoIG9ubHkgdGhlIHNjcmlwdCwgY3JlYXRlIGEgdG9vbHMKK3N1YiBkaXJlY3RvcnkgYW5kIHB1dCBhZGIgYW5kIGZhc3Rib290IGluIGl0IGFuZCBtYWtlIHN1cmUgdGhleSBhcmUgZXhlY3V0YWJsZS4KK0N1cnJlbnRseSB3ZSB1c2UgdXNlcmRlYnVnIGJ1aWxkcy4KKworSGVyZSBhcmUgdGhlIHN0ZXBzIHRvIGFkZCBhIG5ldyBkZXZpY2U6CisKKyAgMSkgQ3JlYXRlIGEgbmV3IHN1YiBkaXJlY3RvcnkgdXNpbmcgdGhlIHJlc3VsdCBvZiAiZmFzdGJvb3QgZ2V0dmFyIHByb2R1Y3QiLgorICAyKSBDb3B5IGEgYnVpbGQgaW1hZ2UgdG8gdGhlIG5ldyBzdWIgZGlyZWN0b3J5IGluIG91ciBmb3JtYXQuCisgICAgIChpLmUuIHBhc3Npb24taW1nLTI0ODI3LnppcCkKKyAgMykgQ29weSBhIGJvb3QgaW1hZ2UgdG8gdGhlIG5ldyBzdWIgZGlyZWN0b3J5IGluIG91ciBmb3JtYXQuCisgICAgIChpLmUuIGhib290LjAuMzMuMjAxMi5pbWcpCisgIDQpIENvcHkgYSByYWRpbyBpbWFnZSB0byB0aGUgbmV3IHN1YiBkaXJlY3RvcnkgaW4gb3VyIGZvcm1hdC4KKyAgICAgKGkuZS4gcmFkaW8uNC4wNC4wMC4wM18yLmltZykKKyAgNSkgQ29weSBhIHVzZXJkYXRhLmltZyBmaWxlLCBwb3NzaWJseSBmcm9tIG9uZSBvZiB0aGUgb3RoZXIgZGlyZWN0b3JpZXMuCisKK0N1c3RvbWl6YXRpb25zIHRvIHRoZSBmbGFzaGluZyBwcm9jZXNzIGFyZSBoYW5kbGVkIGJ5IGFkZGluZyBhIGN1c3RvbV9mbGFzaC5zaAorZmlsZSB0aGF0IGlzIHJlYWQgaW4gYmVmb3JlIHRoZSBtYWluIGxvb3Agc3RhcnRzLiBJdCBhbGxvd3MgeW91IHRvIGFkZCBhbnkgbm9uCitnZW5lcmljIGZ1bmN0aW9ucyBvciBkZXRhaWxzIHRvIHRoZSBmbGFzaGluZyBwcm9jZXNzLiBZb3UgbXVzdCB1c2UgaXQgdG8gZGVmaW5lCit0aGUgdmFyaWFibGUgImJvb3RwYXJ0IiB3aGljaCBpcyBub3QgZGVmaW5lZCBieSBkZWZhdWx0LiBBbHNvLCB1c2UgdGhpcyBmaWxlIHRvCityZXdyaXRlIHRoZSBmbGFzaF9kZXZpY2UgZnVuY3Rpb24gYW5kIGFueSBvdGhlcnMsIGV0Yy4uLgorCitUaGUgc2NyaXB0IHNob3VsZCBoYW5kbGUgdGhlIHJlc3QsIHVubGVzcyB0aGVyZSBhcmUgcmFkaWNhbCBjaGFuZ2VzIHRvIGZpbGUKK25hbWVzIG9yIHRoZSBwcm9jZXNzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3QvY3Jlc3BvL2N1c3RvbV9mbGFzaC5zaCBiL3Rvb2xzL2xhYnByZXRlc3QvY3Jlc3BvL2N1c3RvbV9mbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmIyNTgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGFicHJldGVzdC9jcmVzcG8vY3VzdG9tX2ZsYXNoLnNoCkBAIC0wLDAgKzEsODUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEF1dGhvcjogYmdheUBnb29nbGUuY29tIChCcnVjZSBHYXkpCisjCisjIHVzZWQgZm9yIGZsYXNoaW5nIGJvb3Rsb2FkZXIgaW1hZ2Ugb24gc2hvbGVzCisKK0JPT1RQQVJUPSdib290bG9hZGVyJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYm9vdCBwYXJ0aXRpb24gYW5kCisjIGJvb3RmaWxlLCB0aGVuIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBCT09UUEFSVAorIyAgIGJvb3Rsb2FkZXJmaWxlCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9ib290bG9hZGVyX2ltYWdlKCkKK3sKKyAgaWYgWyAkcHJvZHVjdCAhPSAiY3Jlc3BvIiBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJXcm9uZyBkZXZpY2UgdHlwZSwgZXhwZWN0ZWQgY3Jlc3BvISIKKyAgICBleGl0CisgIGZpCisgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBib290bG9hZGVyIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIGJvb3Rsb2FkZXJmaWxlPWBscyAtMSAkUk9PVC8kcHJvZHVjdC8gfCBzZWQgLW4gJ3MvXlwoYm9vdGxvYWRlclwuWzAtOUEtWmEtel9dKi5pbWdcKVxuKi9cMS8gcCdgCisgICAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBlbXB0eTogJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSBhcyBib290bG9hZGVyIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgYm9vdGxvYWRlciBpbWFnZSB0byAkZGV2aWNlIgorICBmbGFzaF9wYXJ0aXRpb24gJEJPT1RQQVJUICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZQorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmbGFzaGVzIHRoZSB1c2VyZGF0YSBwYXJ0aXRpb24KKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfdXNlcmRhdGFfaW1hZ2UoKQoreworICAjY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgc28gZXhpdGluZyBlYXJseS4uLiIKKyAgbG9nX3ByaW50ICJza2lwcGluZyB1cGRhdGUgb2YgdXNlcmRhdGEuaW1nLCBub3Qgc3VwcG9ydGVkIHlldC4iCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSByYWRpbyBwYXJ0aXRpb24gYW5kCisjIHJhZGlvZmlsZSBhbmQgZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIHJhZGlvZmlsZQorIyAgIHJhZGlvcGFydAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfcmFkaW9faW1hZ2UoKQoreworICAjY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgc28gZXhpdGluZyBlYXJseS4uLiIKKyAgbG9nX3ByaW50ICJza2lwcGluZyB1cGRhdGUgb2YgcmFkaW8gcGFydGl0aW9uLCBub3Qgc3VwcG9ydGVkIHlldC4iCit9CmRpZmYgLS1naXQgYS90b29scy9sYWJwcmV0ZXN0L2xhYnByZXRlc3Quc2ggYi90b29scy9sYWJwcmV0ZXN0L2xhYnByZXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWRiNzk2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xhYnByZXRlc3QvbGFicHJldGVzdC5zaApAQCAtMCwwICsxLDU4MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBiZ2F5QGdvb2dsZS5jb20gKEJydWNlIEdheSkKKyMKKyMgVGhlIGxhYnByZXRlc3Quc2ggc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGVtdWxhdGUgYSB0eXBpY2FsIGF1dG9tYXRlZCB0ZXN0IGxhYgorIyBzZXNzaW9uLiAgSXQgcHV0cyBhIGRldmljZSBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwgcmVib290cyBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwKKyMgZGV0ZXJtaW5lcyBkZXZpY2UgdHlwZSwgZXJhc2VzIHVzZXIgY2FjaGUsIGZsYXNoZXMgYSBnZW5lcmljIHVzZXJkYXRhIGltYWdlLAorIyB1cGRhdGVzIHRoZSBib290bG9hZGVyIGltYWdlLCB1cGRhdGVzIHRoZSByYWRpbyBpbWFnZSwgdXBkYXRlcyB0aGUgc3lzdGVtCisjIGltYWdlIGFuZCByZWJvb3RzLCBzZXRzIHVwIGZvciBhIG1vbmtleSBydW4gYW5kIGZpbmFsbHkgcnVucyBhIHJhbmRvbSBtb25rZXkKKyMgdGVzdC4gSXQgd2lsbCByZXBlYXQgdGhpcyBiYXNlZCBvbiBhbiBvcHRpb25hbCBwYXJhbWV0ZXIoLWkpIG9yIGRlZmF1bHQgdG8gMTAwCisjIHRpbWVzLiBJdCB3aWxsIGRldGVjdCBpZiBpdCBpcyBpbiBhIGxvdyBiYXR0ZXJ5IHNpdHVhdGlvbiBhbmQgd2FpdCBmb3IgaXQgdG8KKyMgY2hhcmdlIGFnYWluLgorCisKK0NPVU5UPTEwMAorUk9PVD0kKGNkIGBkaXJuYW1lICQwYCAmJiBwd2QpCitBREI9IiRST09UL3Rvb2xzL2FkYiIKK0ZBU1RCT09UPSIkUk9PVC90b29scy9mYXN0Ym9vdCIKK01FVkVOVFM9MjAwCitOT01PTktFWT0wCisKK2J1aWxkZmlsZT0nJworZGV2aWNlPScnCitwcm9kdWN0PScnCitib290cGFydD0nJworYm9vdGZpbGU9JycKKword2hpbGUgZ2V0b3B0cyAiZDppOjptOnhoIiBvcHRpb25OYW1lOyBkbworICBjYXNlICIkb3B0aW9uTmFtZSIgaW4KKyAgICBkKSBkZXZpY2U9IiRPUFRBUkciOzsKKyAgICBpKSBDT1VOVD0kT1BUQVJHOzsKKyAgICBtKSBNRVZFTlRTPSRPUFRBUkc7OworICAgIHgpIE5PTU9OS0VZPTE7OworICAgIGgpIGVjaG8gIm9wdGlvbnM6IFstZCA8ZGV2aWNlIElEPiwgLWkgPGxvb3AgY291bnQ+LCAtbSA8bW9ua2V5IGV2ZW50cz4gLXggKHNraXBzIG1vbmtleSldIjsgZXhpdDs7CisgICAgKikgZWNobyAiaW52YWxpZCBwYXJhbWV0ZXIgLSRvcHRpb25OYW1lIjsgZXhpdCAtMTs7CisgIGVzYWMKK2RvbmUKKworZGVjbGFyZSAtciBDT1VOVAorZGVjbGFyZSAtciBNRVZFTlRTCitkZWNsYXJlIC1yIE5PTU9OS0VZCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByaW50cyBvdXRwdXQgdG8gY29uc29sZSB3aXRoIHRpbWUgc3RhbXAKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2xvZ19wcmludCgpCit7CisgIGlmIFsgLXogIiQxIiBdOyB0aGVuCisgICAgZWNobyAiIyAkKGRhdGUgKyclRCAlVCcpIgorICBlbHNlCisgICAgZWNobyAiIyAkKGRhdGUgKyclRCAlVCcpOiAkMSIKKyAgZmkKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJsb2NrcyB1bnRpbCBiYXR0ZXJ5IGxldmVsIGlzIGF0IGxlYXN0CisjIGFib3ZlIFRBUkdFVCBpZiBiZWxvdyBMSU1JVAorIyBHbG9iYWxzOgorIyAgIEFEQgorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIword2FpdF9mb3JfYmF0dGVyeSgpCit7CisgIFRBUkdFVD04MAorICBMSU1JVD0yMAorICBsb2NhbCBiYXR0ZXJ5CisgIGxvY2FsIHRpY2sKKyAgbG9nX3ByaW50ICJjaGVja2luZyBiYXR0ZXJ5IGxldmVsIgorICB3aGlsZSBbICIkYmF0dGVyeSIgPSAiIiBdOyBkbworICAgIGJhdHRlcnk9YCRBREIgLXMgJGRldmljZSBzaGVsbCBkdW1wc3lzIGJhdHRlcnkgfCB0ciAtZCAnXHInIHwgYXdrICcvbGV2ZWw6LyB7cHJpbnQgJDJ9J2AKKyAgICBzbGVlcCAyCisgIGRvbmUKKyAgaWYgWyAkYmF0dGVyeSAtbHQgJExJTUlUIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgIkJhdHRlcnkgaXMgbG93LCB3YWl0aW5nIGZvciBjaGFyZ2UiCisgICAgd2hpbGUgdHJ1ZTsgZG8KKyAgICAgIGJhdHRlcnk9YCRBREIgLXMgJGRldmljZSBzaGVsbCBkdW1wc3lzIGJhdHRlcnkgfCB0ciAtZCAnXHInIHwgYXdrICcvbGV2ZWw6LyB7cHJpbnQgJDJ9J2AKKyAgICAgIGlmICgoICRiYXR0ZXJ5ID49ICRUQVJHRVQgKSk7IHRoZW4gYnJlYWs7IGZpCisgICAgICB0aWNrPSRbJFRBUkdFVCAtICRiYXR0ZXJ5XQorICAgICAgZWNobyAiYmF0dGVyeSBjaGFyZ2UgbGV2ZWwgaXMgJGJhdHRlcnksIHNsZWVwaW5nIGZvciAkdGljayBzZWNvbmRzIgorICAgICAgc2xlZXAgJFskVEFSR0VUIC0gJGJhdHRlcnkgKiAxMF0KKyAgICBkb25lCisgICAgbG9nX3ByaW50ICJyZXN1bWluZyB0ZXN0IHJ1biB3aXRoIGJhdHRlcnkgbGV2ZWwgYXQgJGJhdHRlcnklIgorICBlbHNlCisgICAgbG9nX3ByaW50ICJyZXN1bWluZyB0ZXN0IHJ1biB3aXRoIGJhdHRlcnkgbGV2ZWwgYXQgJGJhdHRlcnklIgorICBmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmxvY2tzIHVudGlsIGRldmljZSBpcyBpbiBmYXN0Ym9vdCBtb2RlIG9yCisjIHRpbWUgb3V0IGlzIHJlYWNoZWQKKyMgR2xvYmFsczoKKyMgICBsb29wCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmYXN0Ym9vdF93YWl0X2Zvcl9kZXZpY2UoKQoreworICBsb2NhbCBmZGV2aWNlPSIiCisgIGxvY2FsIG49MAorICB3aGlsZSBbICIkZGV2aWNlIiAhPSAiJGZkZXZpY2UiIC1hICRuIC1sZSAzMCBdOyBkbworICAgIHNsZWVwIDYKKyAgICBmZGV2aWNlPWAkRkFTVEJPT1QgZGV2aWNlcyB8IHNlZCAtbiAicy9cKCRkZXZpY2VcKS4qL1wxLyBwImAKKyAgICBsZXQgbis9MQorICBkb25lCisgIGlmIFsgJG4gLWd0IDMwIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImRldmljZSB0aW1lIG91dCBhZnRlciAkbG9vcCBpdGVyYXRpb25zIgorICAgIGV4aXQKKyAgZWxzZQorICAgIGxvZ19wcmludCAiZGV2aWNlIHJldHVybmVkIGFuZCBhdmFpbGFibGUiCisgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyByZWJvb3RzIGRldmljZSBpbnRvIGZhc3Rib290IG1vZGUgb3IKKyMgdGltZSBvdXQgaXMgcmVhY2hlZAorIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEFEQgorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9hZGIoKQoreworICBsb2dfcHJpbnQgInJlYm9vdGluZyBpbnRvIGJvb3Rsb2FkZXIgYW5kIHdhaXRpbmcgZm9yIGF2YWlsYWJpbGl0eSB2aWEgZmFzdGJvb3QiCisgICRBREIgLXMgJGRldmljZSByZWJvb3QgYm9vdGxvYWRlcgorICBmYXN0Ym9vdF93YWl0X2Zvcl9kZXZpY2UKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJlYm9vdHMgZGV2aWNlIGludG8gZmFzdGJvb3QgbW9kZSBvcgorIyB0aW1lcyBvdXQKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBGQVNUQk9PVAorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdCgpCit7CisgIGxvZ19wcmludCAicmVib290aW5nIGludG8gYm9vdGxvYWRlciBhbmQgd2FpdGluZyBmb3IgYXZhaWxhYmlsaXR5IHZpYSBmYXN0Ym9vdCIKKyAgJEZBU1RCT09UIC1zICRkZXZpY2UgcmVib290LWJvb3Rsb2FkZXIKKyAgZmFzdGJvb3Rfd2FpdF9mb3JfZGV2aWNlCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyByZWJvb3RzIGRldmljZSBmcm9tIGZhc3Rib290IHRvIGFkYiBvcgorIyB0aW1lcyBvdXQKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBGQVNUQk9PVAorIyAgIEFEQgorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcmVib290X2ludG9fYWRiX2Zyb21fZmFzdGJvb3QoKQoreworICBsb2dfcHJpbnQgInJlYm9vdGluZyBhbmQgd2FpdGluZyBmb3IgYXZhaWxhYmlsaXR5IHZpYSBhZGIiCisgICRGQVNUQk9PVCAtcyAkZGV2aWNlIHJlYm9vdAorICAkQURCIC1zICRkZXZpY2Ugd2FpdC1mb3ItZGV2aWNlCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyByZWJvb3RzIGRldmljZSBmcm9tIGZhc3Rib290IHRvIGFkYiBvcgorIyB0aW1lcyBvdXQKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBBREIKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3dhaXRfZm9yX2Jvb3RfY29tcGxldGUoKQoreworICBsb2dfcHJpbnQgIndhaXRpbmcgZm9yIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyIKKyAgbG9jYWwgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGdldHByb3AgZGV2LmJvb3Rjb21wbGV0ZSkKKyAgbG9jYWwgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MToxfQorICBlY2hvIC1uICIuIgorICB3aGlsZSBbIC16ICRyZXN1bHRfdGVzdCBdOyBkbworICAgIHNsZWVwIDEKKyAgICBlY2hvIC1uICIuIgorICAgIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBnZXRwcm9wIGRldi5ib290Y29tcGxldGUpCisgICAgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MDoxfQorICBkb25lCisgIGxvZ19wcmludCAiZmluaXNoZWQgYm9vdGluZyIKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZhc3Rib290IGZsYXNoZXMgcGFydGl0aW9uCisjCisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgRkFTVEJPT1QKKyMgQXJndW1lbnRzOgorIyAgIGNvbW1hbmRfbmFtZQorIyAgIGNvbW1hbmRfcGFyYW1ldGVycworIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmFzdGJvb3RfY29tbWFuZCgpCit7CisgICRGQVNUQk9PVCAtcyAkZGV2aWNlICQxICQyICQzCisgIHNsZWVwIDUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZhc3Rib290IGNvbW1hbmQgd3JhcHBlcgorIworIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEZBU1RCT09UCisjIEFyZ3VtZW50czoKKyMgICBwYXJ0aXRpb25fbmFtZQorIyAgIGZpbGVfbmFtZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfcGFydGl0aW9uKCkKK3sKKyAgJEZBU1RCT09UIC1zICRkZXZpY2UgZmxhc2ggJDEgJDIKKyAgc2xlZXAgNQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgYWRiIGNvbW1hbmQgd3JhcHBlcgorIworIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEFEQgorIyBBcmd1bWVudHM6CisjICAgY29tbWFuZF9uYW1lCisjICAgY29tbWFuZF9wYXJhbWV0ZXJzCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithZGJfY29tbWFuZCgpCit7CisgICRBREIgLXMgJGRldmljZSAkMSAkMiAkMyAkNCAkNQorICBzbGVlcCA1Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSBib290IHBhcnRpdGlvbiBhbmQKKyMgYm9vdGZpbGUsIHRoZW4gZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIGJvb3Rsb2FkZXJmaWxlCisjICAgYm9vdHBhcnQKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX2Jvb3Rsb2FkZXJfaW1hZ2UoKQoreworICBpZiBbICIkYm9vdHBhcnQiID09ICcnIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImJvb3RwYXJ0IG5vdCBkZWZpbmVkIgorICAgIGV4aXQKKyAgZmkKKyAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIGJvb3Rsb2FkZXIgZmlsZSBmb3IgJHByb2R1Y3QiCisgICAgYm9vdGxvYWRlcmZpbGU9YGxzIC0xICRST09ULyRwcm9kdWN0IHwgc2VkIC1uICdzL1woLipib290WzAtOS5fXVwraW1nXCkvXDEvIHAnYAorICAgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgZW1wdHk6ICRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGlmIFsgISAtZSAiJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBub3QgZm91bmQ6IC4vJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgbG9nX3ByaW50ICJ1c2luZyAkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUgYXMgdGhlIGJvb3Rsb2FkZXIgaW1hZ2UgZmlsZSIKKyAgZmkKKyAgbG9nX3ByaW50ICJkb3dubG9hZGluZyBib290bG9hZGVyIGltYWdlIHRvICRkZXZpY2UiCisgIGZsYXNoX3BhcnRpdGlvbiAkYm9vdHBhcnQgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNldHMgdGhlIG5hbWUgb2YgdGhlIHJhZGlvIHBhcnRpdGlvbiBhbmQKKyMgcmFkaW9maWxlIGFuZCBmbGFzaGVzIGRldmljZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgcmFkaW9maWxlCisjICAgcmFkaW9wYXJ0CisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9yYWRpb19pbWFnZSgpCit7CisgIGlmIFsgIiRyYWRpb3BhcnQiID09ICcnIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgInNldHRpbmcgcmFkaW8gcGFydGlvbiB0byAncmFkaW8nIgorICAgIHJhZGlvcGFydD0ncmFkaW8nCisgIGZpCisgIGlmIFsgIiRyYWRpb2ZpbGUiID09ICIiIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgcmFkaW8gZmlsZSBmb3IgJHByb2R1Y3QiCisgICAgcmFkaW9maWxlPWBscyAtMSAkUk9PVC8kcHJvZHVjdCB8IHNlZCAtbiAncy9cKHJhZGlvWzAtOS5fQS1aYS16XVwraW1nXCkvXDEvIHAnYAorICAgIGlmIFsgIiRyYWRpb2ZpbGUiID09ICIiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAicmFkaW8gZmlsZSBlbXB0eTogJHJhZGlvZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGlmIFsgISAtZSAiJFJPT1QvJHByb2R1Y3QvJHJhZGlvZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJyYWRpbyBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kcmFkaW9maWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgbG9nX3ByaW50ICJ1c2luZyAkUk9PVC8kcHJvZHVjdC8kcmFkaW9maWxlIGFzIHRoZSByYWRpbyBpbWFnZSBmaWxlIgorICBmaQorICBsb2dfcHJpbnQgImRvd25sb2FkaW5nIHJhZGlvIGltYWdlIHRvICRkZXZpY2UiCisgIGZsYXNoX3BhcnRpdGlvbiAkcmFkaW9wYXJ0ICAkUk9PVC8kcHJvZHVjdC8kcmFkaW9maWxlCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNldHMgdGhlIG5hbWUgb2YgdGhlIGJvb3QgcGFydGl0aW9uIGFuZAorIyBib290ZmlsZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgYnVpbGRmaWxlCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9zeXN0ZW1faW1hZ2UoKQoreworICBpZiBbICIkYnVpbGRmaWxlIiA9PSAiIiBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIGJ1aWxkIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIGJ1aWxkZmlsZT1gXGxzIC0xICRST09ULyRwcm9kdWN0IDI+JjEgfCBzZWQgLW4gJ3MvXChbYS16XVwrLWltZy1bMC05XVwrLnppcFwpL1wxLyBwJ2AKKyAgICBpZiBbICIkYnVpbGRmaWxlIiA9PSAiIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJ1aWxkIGZpbGUgZW1wdHk6ICRidWlsZGZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRidWlsZGZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYnVpbGQgZmlsZSBub3QgZm91bmQ6IC4vJHByb2R1Y3QvJGJ1aWxkZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJGJ1aWxkZmlsZSBhcyB0aGUgc3lzdGVtIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgc3lzdGVtIGltYWdlIHRvICRkZXZpY2UiCisgIGZhc3Rib290X2NvbW1hbmQgdXBkYXRlICRST09ULyRwcm9kdWN0LyRidWlsZGZpbGUKKworfQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGZsYXNoZXMgdGhlIHVzZXJkYXRhIHBhcnRpdGlvbgorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF91c2VyZGF0YV9pbWFnZSgpCit7CisgIGxvZ19wcmludCAiZmxhc2hpbmcgdXNlcmRhdGEuLi4iCisgIGlmIFsgLWUgJFJPT1QvJHByb2R1Y3QvdXNlcmRhdGEuaW1nIF07dGhlbgorICAgIGZsYXNoX3BhcnRpdGlvbiB1c2VyZGF0YSAkUk9PVC8kcHJvZHVjdC91c2VyZGF0YS5pbWcKKyAgZWxzZQorICAgIGxvZ19wcmludCAidXNlcmRhdGEuaW1nIGZpbGUgbm90IGZvdW5kOiAkUk9PVC8kcHJvZHVjdC91c2VyZGF0YS5pbWciCisgICAgZXhpdAorICBmaQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmbGFzaGVzIHRoZSBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIEZBU1RCT09UCisjICAgYm9vdGZpbGUKKyMgICBib290cGFydAorIyAgIHJhZGlvZmlsZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfZGV2aWNlKCkKK3sKKyAgbG9nX3ByaW50ICJlcmFzaW5nIGNhY2hlLi4uIgorICBmYXN0Ym9vdF9jb21tYW5kIGVyYXNlIGNhY2hlCisgIGZsYXNoX3VzZXJkYXRhX2ltYWdlCisgIGZsYXNoX2Jvb3Rsb2FkZXJfaW1hZ2UKKyAgZmxhc2hfcmFkaW9faW1hZ2UKKyAgZmxhc2hfc3lzdGVtX2ltYWdlCisgICNkZXZpY2UgaGFzIGJlZW4gcmVib290ZWQKKyAgYWRiX2NvbW1hbmQgd2FpdC1mb3ItZGV2aWNlCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBnZXRzIHRoZSBkZXZpY2UgcHJvZHVjdCB0eXBlIGFuZCBzZXRzIHByb2R1Y3QKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIEZBU1RCT09UCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzZXRfcHJvZHVjdF90eXBlKCkKK3sKKyAgaWYgWyAiJHByb2R1Y3QiID09ICIiIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgZGV2aWNlIHByb2R1Y3QgdHlwZSIKKyAgICBwcm9kdWN0PWAkRkFTVEJPT1QgLXMgJGRldmljZSBnZXR2YXIgcHJvZHVjdCAyPiYxIHwgc2VkIC1uICdzL3Byb2R1Y3Q6IFwoW2Etel0qXClcbiovXDEvIHAnYAorICAgIGlmIFsgISAtZSAiJFJPT1QvJHByb2R1Y3QiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiZGV2aWNlIHByb2R1Y3QgaWQgbm90IHN1cHBvcnRlZDogJHByb2R1Y3QiCisgICAgICBleGl0CisgICAgZmkKKyAgZmkKKyAgbG9nX3ByaW50ICJ1c2luZyAkcHJvZHVjdCBhcyBkZXZpY2UgcHJvZHVjdCBpZCIKK30KKworCisKKyNzdGFydCBvZiBzY3JpcHQKKyN0ZXN0IGZvciBkZXBlbmRlbmNpZXMKK2lmIFsgISAtZSAkQURCIF07IHRoZW4KKyAgZWNobyAiRXJyb3I6IGFkYiBub3QgaW4gcGF0aCEgUGxlYXNlIGNvcnJlY3QgdGhpcy4iCisgIGV4aXQKK2ZpCitpZiBbICEgLWUgJEZBU1RCT09UIF07IHRoZW4KKyAgZWNobyAiRXJyb3I6IGZhc3Rib290IG5vdCBpbiBwYXRoISBQbGVhc2UgY29ycmVjdCB0aGlzLiIKKyAgZXhpdAorZmkKKyNjaGVja3MgdG8gc2VlIGlmIHRoZSBjYWxsZWQgZGV2aWNlIGlzIGF2YWlsYWJsZQoraWYgWyAiJGRldmljZSIgIT0gIiIgXTsgdGhlbgorICB0bXBkZXZpY2U9YCRBREIgZGV2aWNlcyB8IHNlZCAtbiAicy9cKCRkZXZpY2VcKS4qL1wxLyBwImAKKyAgaWYgWyAiJGRldmljZSIgIT0gIiR0bXBkZXZpY2UiIF07IHRoZW4KKyAgICAgIHRtcGRldmljZT1gJEZBU1RCT09UIGRldmljZXMgfCBzZWQgLW4gInMvXCgkZGV2aWNlXCkuKi9cMS8gcCJgCisgICAgaWYgWyAiJGRldmljZSIgIT0gIiR0bXBkZXZpY2UiIF07IHRoZW4KKyAgICAgIGVjaG8gIldhcm5pbmc6IGRldmljZSBub3QgZm91bmQuLi4gJGRldmljZSIKKyAgICAgIGV4aXQKKyAgICBlbHNlCisgICAgICBlY2hvICInRGV2aWNlICckZGV2aWNlJyBmb3VuZCEnIgorICAgICAgcmVib290X2ludG9fYWRiX2Zyb21fZmFzdGJvb3QKKyAgICAgIHdhaXRfZm9yX2Jvb3RfY29tcGxldGUKKyAgICBmaQorICBmaQorZWxzZQorICBkZXZpY2U9YCRBREIgZGV2aWNlcyB8IHNlZCAtbiAncy8uKlwoXlswLTlBLVpdXHsyXH1bMC05QS1aXSpcKS4qL1wxLyBwJ2AKKyAgaWYgWyBgZWNobyAkZGV2aWNlIHwgd2MgLXdgIC1uZSAxIF07IHRoZW4KKyAgICBlY2hvICdUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGRldmljZSBmb3VuZCwnCisgICAgZWNobyAncGxlYXNlIHBhc3MgdGhlIGNvcnJlY3QgZGV2aWNlIElEIGluIGFzIGEgcGFyYW1ldGVyLicKKyAgICBleGl0CisgIGZpCitmaQoraWYgWyAiJGRldmljZSIgPT0gIiIgXTsgdGhlbgorICBlY2hvICdEZXZpY2Ugbm90IGZvdW5kIHZpYSBhZGInCisgIGRldmljZT1gJEZBU1RCT09UIGRldmljZXMgfCBzZWQgLW4gJ3MvLipcKF5bMC05QS1aXVx7Mlx9WzAtOUEtWl0qXCkuKi9cMS8gcCdgCisgIGlmIFsgYGVjaG8gJGRldmljZSB8IHdjIC13YCAtbmUgMSBdOyB0aGVuCisgICAgZWNobyAiVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXZpY2UgYXZhaWxhYmxlLCIKKyAgICBlY2hvICJwbGVhc2UgcGFzcyB0aGUgY29ycmVjdCBkZXZpY2UgSUQgaW4gYXMgYSBwYXJhbWV0ZXIuIgorICAgIGV4aXQKKyAgZmkKKyAgaWYgWyAiJGRldmljZSIgPT0gIiIgXTsgdGhlbgorICAgIGVjaG8gJ0RldmljZSBub3QgZm91bmQgdmlhIGZhc3Rib290LCBwbGVhc2UgaW52ZXN0aWdhdGUnCisgICAgZXhpdAorICBlbHNlCisgICAgZWNobyAnRGV2aWNlICckZGV2aWNlJyBmb3VuZCEnCisgICAgcmVib290X2ludG9fYWRiX2Zyb21fZmFzdGJvb3QKKyAgICB3YWl0X2Zvcl9ib290X2NvbXBsZXRlCisgICAgZWNobyAnSGFtbWVyaW5nIG9uICckZGV2aWNlCisgIGZpCitlbHNlCisgIGVjaG8gJ0hhbW1lcmluZyBvbiAnJGRldmljZQorZmkKK3JlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fYWRiCitzZXRfcHJvZHVjdF90eXBlCityZWJvb3RfaW50b19hZGJfZnJvbV9mYXN0Ym9vdAord2FpdF9mb3JfYm9vdF9jb21wbGV0ZQorCisjY2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBhIGN1c3RvbSBmbGFzaCBpbmZvIGZpbGUgYW5kIHJldHJlaXZlIGl0CitpZiBbIC1lICIkUk9PVC8kcHJvZHVjdC9jdXN0b21fZmxhc2guc2giIF07IHRoZW4KKyAgLiAkUk9PVC8kcHJvZHVjdC9jdXN0b21fZmxhc2guc2gKK2ZpCitlY2hvICQnXG5cbicKKworI3N0YXJ0IG9mIGxvb3BpbmcKK2ZvciAoKGxvb3A9MSA7IGxvb3AgPD0gJENPVU5UIDsgbG9vcCsrICkpIDsgZG8KKyAgZWNobyAiIgorICBlY2hvICIiCisgIGVjaG8gX19fX19fX19fX19fX19fXyAkKGRhdGUgKyclRCAlVCcpIC0gJGxvb3AgLSAkZGV2aWNlIF9fX19fX19fX19fX19fX19fX19fX18KKworICBsb2dfcHJpbnQgInNldHRpbmcgYWRiIHJvb3QgYW5kIHNsZWVwaW5nIGZvciA3IHNlY29uZHMiCisgIGFkYl9jb21tYW5kIHJvb3QKKyAgd2FpdF9mb3JfYmF0dGVyeQorICBsb2dfcHJpbnQgInJlYm9vdGluZyBpbnRvIGJvb3Rsb2FkZXIgYW5kIHdhaXRpbmcgZm9yIGF2YWlsYWJpbGl0eSB2aWEgZmFzdGJvb3QiCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fYWRiCisgICMgbm90IG5lY2Vzc2FyeSwgYnV0IHVzZWZ1bCBpbiB0ZXN0aW5nCisgIGxvZ19wcmludCAidXNpbmcgZmFzdGJvb3QgdG8gcmVib290IHRvIGJvb3Rsb2FkZXIgZm9yIHRlc3QgcHVycG9zZXMiCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QKKworICAjZmxhc2hpbmcgdGhlIGRldmljZQorICBmbGFzaF9kZXZpY2UKKworICAjcHJlcGluZyBkZXZpY2UgZm9yIG1vbmtleSBydW4KKyAgbG9nX3ByaW50ICJzZXR0aW5nIGFkYiByb290IgorICBhZGJfY29tbWFuZCByb290CisgIGxvZ19wcmludCAic2V0dGluZyByby50ZXN0X2hhcm5lc3MgcHJvcGVydHkiCisgIGFkYl9jb21tYW5kIHNoZWxsIHNldHByb3Agcm8udGVzdF9oYXJuZXNzIDEKKworICBsb2dfcHJpbnQgIndhaXRpbmcgZm9yIGRldmljZSB0byBmaW5pc2ggYm9vdGluZyIKKyAgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIGdldHByb3AgZGV2LmJvb3Rjb21wbGV0ZSkKKyAgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MToxfQorICBlY2hvIC1uICIuIgorICB3aGlsZSBbIC16ICRyZXN1bHRfdGVzdCBdOyBkbworICAgIHNsZWVwIDEKKyAgICBlY2hvIC1uICIuIgorICAgIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBnZXRwcm9wIGRldi5ib290Y29tcGxldGUpCisgICAgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MDoxfQorICBkb25lCisKKyAgbG9nX3ByaW50ICJmaW5pc2hlZCBib290aW5nIgorICBsb2dfcHJpbnQgIndhaXRpbmcgZm9yIHRoZSBQYWNrYWdlIE1hbmFnZXIiCisgIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBwbSBwYXRoIGFuZHJvaWQpCisgIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjA6N30KKyAgZWNobyAtbiAiLiIKKyAgd2hpbGUgWyAkcmVzdWx0X3Rlc3QgIT0gInBhY2thZ2UiIF07IGRvCisgICAgc2xlZXAgMQorICAgIGVjaG8gLW4gIi4iCisgICAgcmVzdWx0PSQoJEFEQiAtcyAkZGV2aWNlIHNoZWxsIHBtIHBhdGggYW5kcm9pZCkKKyAgICByZXN1bHRfdGVzdD0ke3Jlc3VsdDowOjd9CisgIGRvbmUKKyAgZWNobyAiUGFja2FnZSBNYW5hZ2VyIGF2YWlsYWJsZSIKKworICAjbGV0cyB5b3Ugc2VlIHdoYXQncyBnb2luZyBvbgorICBsb2dfcHJpbnQgInNldHRpbmcgc2hlbGwgc3ZjIHBvd2VyIHN0YXlvbiB0cnVlIgorICBhZGJfY29tbWFuZCBzaGVsbCBzdmMgcG93ZXIgc3RheW9uIHRydWUKKworICAjY2FsbHMgdGhlIG1vbmtleSBydW4gaWYgbm90IHNraXBwZWQKKyAgaWYgWyAkTk9NT05LRVkgPT0gMCBdOyB0aGVuCisgICAgc2VlZD0kKCgkKGRhdGUgKyVzKSAlIDk5KSkKKyAgICBsb2dfcHJpbnQgInJ1bm5pbmcgc2hvcnQgbW9ua2V5IHJ1bi4uLiIKKyAgICAkQURCIC1zICRkZXZpY2Ugc2hlbGwgbW9ua2V5IC1wIGNvbS5hbmRyb2lkLmFsYXJtY2xvY2sgLXAgY29tLmFuZHJvaWQuYnJvd3NlciAtcCBjb20uYW5kcm9pZC5jYWxjdWxhdG9yMiAtcCBjb20uYW5kcm9pZC5jYWxlbmRhciAtcCBjb20uYW5kcm9pZC5jYW1lcmEgLXAgY29tLmFuZHJvaWQuY29udGFjdHMgLXAgY29tLmdvb2dsZS5hbmRyb2lkLmdtIC1wIGNvbS5hbmRyb2lkLmltIC1wIGNvbS5hbmRyb2lkLmxhdW5jaGVyIC1wIGNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLm1hcHMgLXAgY29tLmFuZHJvaWQubW1zIC1wIGNvbS5hbmRyb2lkLm11c2ljIC1wIGNvbS5hbmRyb2lkLnBob25lIC1wIGNvbS5hbmRyb2lkLnNldHRpbmdzIC1wIGNvbS5nb29nbGUuYW5kcm9pZC5zdHJlZXQgLXAgY29tLmFuZHJvaWQudmVuZGluZyAtcCBjb20uZ29vZ2xlLmFuZHJvaWQueW91dHViZSAtcCBjb20uYW5kcm9pZC5lbWFpbCAtcCBjb20uZ29vZ2xlLmFuZHJvaWQudm9pY2VzZWFyY2ggIC1jIGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSICAtLWlnbm9yZS1zZWN1cml0eS1leGNlcHRpb25zICAtcyAkc2VlZCAkTUVWRU5UUworICAgIGxvZ19wcmludCAiZmluaXNoZWQgcnVubmluZyBtb25rZXksIHJpbnNlLCByZXBlYXQuLi4iCisgIGVsc2UKKyAgICBsb2dfcHJpbnQgIi14IHBhcmFtZXRlciB1c2VkLCBza2lwcGluZyB0aGUgbW9ua2V5IHJ1biIKKyAgZmkKKworICBpZiBbICRsb29wIC1lcSAkQ09VTlQgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZGV2aWNlICRkZXZpY2UgaGFzIHJldHVybmVkLCB0ZXN0aW5nIGNvbXBsZXRlZCwgY291bnQgPSAkbG9vcCIKKyAgICBlY2hvIGBlY2hvICJEZXZpY2UgJGRldmljZSBoYXMgcmV0dXJuZWQsIHRlc3RpbmcgY29tcGxldGVkLCBjb3VudCA9ICRsb29wLiIgPiAkUk9PVC8kZGV2aWNlLmxvZ2AKKyAgZWxzZQorICAgIGxvZ19wcmludCAiZGV2aWNlICRkZXZpY2UgaGFzIHJldHVybmVkLCByaW5zZSBhbmQgcmVwZWF0IGNvdW50ID0gJGxvb3AiCisgICAgZWNobyBgZWNobyAiRGV2aWNlICRkZXZpY2UgaGFzIHJldHVybmVkLCByaW5zZSBhbmQgcmVwZWF0IGNvdW50ID0gJGxvb3AuIiA+ICRST09ULyRkZXZpY2UubG9nYAorICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGFicHJldGVzdC9uZXh1c29uZS9jdXN0b21fZmxhc2guc2ggYi90b29scy9sYWJwcmV0ZXN0L25leHVzb25lL2N1c3RvbV9mbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlkNmZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGFicHJldGVzdC9uZXh1c29uZS9jdXN0b21fZmxhc2guc2gKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBBdXRob3I6IGJnYXlAZ29vZ2xlLmNvbSAoQnJ1Y2UgR2F5KQorIworIyB1c2VkIGZvciBmbGFzaGluZyBib290IGltYWdlIG9uIG5leHVzb25lCisKK2Jvb3RwYXJ0PSdoYm9vdCcKZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3Qvc2hvbGVzL2N1c3RvbV9mbGFzaC5zaCBiL3Rvb2xzL2xhYnByZXRlc3Qvc2hvbGVzL2N1c3RvbV9mbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4MjIyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGFicHJldGVzdC9zaG9sZXMvY3VzdG9tX2ZsYXNoLnNoCkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEF1dGhvcjogYmdheUBnb29nbGUuY29tIChCcnVjZSBHYXkpCisjCisjIHVzZWQgZm9yIGZsYXNoaW5nIGJvb3Rsb2FkZXIgaW1hZ2Ugb24gc2hvbGVzCisKK0JPT1RQQVJUPSdtb3RvYm9vdCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNldHMgdGhlIG5hbWUgb2YgdGhlIGJvb3QgcGFydGl0aW9uIGFuZAorIyBib290ZmlsZSwgdGhlbiBmbGFzaGVzIGRldmljZQorIworIyBHbG9iYWxzOgorIyAgIHByb2R1Y3QKKyMgICBST09UCisjICAgQk9PVFBBUlQKKyMgICBib290bG9hZGVyZmlsZQorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfYm9vdGxvYWRlcl9pbWFnZSgpCit7CisgIGlmIFsgJHByb2R1Y3QgIT0gInNob2xlcyIgXTsgdGhlbgorICAgIGxvZ19wcmludCAiV3JvbmcgZGV2aWNlIHR5cGUsIGV4cGVjdGVkIHNob2xlcyEiCisgICAgZXhpdAorICBmaQorICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgYm9vdGxvYWRlciBmaWxlIGZvciAkcHJvZHVjdCIKKyAgICBzZWN1cmU9YCRmYXN0Ym9vdCAtcyAkZGV2aWNlIGdldHZhciBzZWN1cmUgMj4mMSB8IHNlZCAtbiAncy9zZWN1cmU6IFwoW2Etel0qXClcbiovXDEvIHAnYAorICAgIGlmIFsgIiRzZWN1cmUiID0gIm5vIiBdOyB0aGVuCisgICAgICBib290bG9hZGVyZmlsZT1gbHMgLTEgc2hvbGVzLyB8IHNlZCAtbiAncy9eXChtb3RvYm9vdF91bnNlY3VyZS5bMC05QS1aXSouaW1nXClcbiovXDEvIHAnYAorICAgIGVsc2UKKyAgICAgIGJvb3Rsb2FkZXJmaWxlPWBscyAtMSBzaG9sZXMvIHwgc2VkIC1uICdzL15cKG1vdG9ib290X3NlY3VyZS5bMC05QS1aXSouaW1nXClcbiovXDEvIHAnYAorICAgIGZpCisgICAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBlbXB0eTogJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSBhcyB0aGUgYm9vdGxvYWRlciBpbWFnZSBmaWxlIgorICBmaQorICBsb2dfcHJpbnQgImRvd25sb2FkaW5nIGJvb3Rsb2FkZXIgaW1hZ2UgdG8gJGRldmljZSIKKyAgZmxhc2hfcGFydGl0aW9uICRCT09UUEFSVCAkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGFicHJldGVzdC9zdGluZ3JheS9jdXN0b21fZmxhc2guc2ggYi90b29scy9sYWJwcmV0ZXN0L3N0aW5ncmF5L2N1c3RvbV9mbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNhZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGFicHJldGVzdC9zdGluZ3JheS9jdXN0b21fZmxhc2guc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBiZ2F5QGdvb2dsZS5jb20gKEJydWNlIEdheSkKKyMKKyMgdXNlZCBmb3IgZmxhc2hpbmcgYm9vdGxvYWRlciBpbWFnZSBvbiBzaG9sZXMKKworQk9PVFBBUlQ9J21vdG9ib290JworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYm9vdCBwYXJ0aXRpb24gYW5kCisjIGJvb3RmaWxlLCB0aGVuIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBCT09UUEFSVAorIyAgIGJvb3Rsb2FkZXJmaWxlCisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9ib290bG9hZGVyX2ltYWdlKCkKK3sKKyAgaWYgWyAkcHJvZHVjdCAhPSAic3RpbmdyYXkiIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgIldyb25nIGRldmljZSB0eXBlLCBleHBlY3RlZCBzdGluZ3JheSEiCisgICAgZXhpdAorICBmaQorICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImdldHRpbmcgYm9vdGxvYWRlciBmaWxlIGZvciAkcHJvZHVjdCIKKyAgICBib290bG9hZGVyZmlsZT1gbHMgLTEgJHByb2R1Y3QvIHwgc2VkIC1uICdzL15cKG1vdG9ib290LlswLTlBLVpdKi5pbWdcKVxuKi9cMS8gcCdgCisgICAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBlbXB0eTogJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIG5vdCBmb3VuZDogLi8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSBhcyB0aGUgYm9vdGxvYWRlciBpbWFnZSBmaWxlIgorICBmaQorICBsb2dfcHJpbnQgImRvd25sb2FkaW5nIGJvb3Rsb2FkZXIgaW1hZ2UgdG8gJGRldmljZSIKKyAgZmxhc2hfcGFydGl0aW9uICRCT09UUEFSVCAkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUKKyAgcmVib290X2ludG9fZmFzdGJvb3RfZnJvbV9mYXN0Ym9vdAorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmxhc2hlcyB0aGUgdXNlcmRhdGEgcGFydGl0aW9uCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3VzZXJkYXRhX2ltYWdlKCkKK3sKKyAgI2N1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHNvIGV4aXRpbmcgZWFybHkuLi4iCisgIGxvZ19wcmludCAic2tpcHBpbmcgdXBkYXRlIG9mIHVzZXJkYXRhLmltZywgbm90IHN1cHBvcnRlZCB5ZXQuIgorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgcmFkaW8gcGFydGl0aW9uIGFuZAorIyByYWRpb2ZpbGUgYW5kIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICByYWRpb2ZpbGUKKyMgICByYWRpb3BhcnQKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3JhZGlvX2ltYWdlKCkKK3sKKyAgI2N1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHNvIGV4aXRpbmcgZWFybHkuLi4iCisgIGxvZ19wcmludCAic2tpcHBpbmcgdXBkYXRlIG9mIHJhZGlvIHBhcnRpdGlvbiwgbm90IHN1cHBvcnRlZCB5ZXQuIgorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRpY3QvQW5kcm9pZC5tayBiL3Rvb2xzL21ha2VkaWN0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmM1NTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWFrZWRpY3QvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlcixzcmMpCi1MT0NBTF9KQVJfTUFOSUZFU1QgOj0gZXRjL21hbmlmZXN0LnR4dAotTE9DQUxfTU9EVUxFIDo9IG1ha2VkaWN0Ci0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0pBVkFfTElCUkFSWSkKLWluY2x1ZGUgJChMT0NBTF9QQVRIKS9ldGMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRpY3QvZXRjL0FuZHJvaWQubWsgYi90b29scy9tYWtlZGljdC9ldGMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNjI4Ni4uMDAwMDAwMAotLS0gYS90b29scy9tYWtlZGljdC9ldGMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9QUkVCVUlMVF9FWEVDVVRBQkxFUyA6PSBtYWtlZGljdAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfUFJFQlVJTFQpCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2VkaWN0L2V0Yy9tYWtlZGljdCBiL3Rvb2xzL21ha2VkaWN0L2V0Yy9tYWtlZGljdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQyMGQ2ZS4uMDAwMDAwMAotLS0gYS90b29scy9tYWtlZGljdC9ldGMvbWFrZWRpY3QKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBTZXQgdXAgcHJvZyB0byBiZSB0aGUgcGF0aCBvZiB0aGlzIHNjcmlwdCwgaW5jbHVkaW5nIGZvbGxvd2luZyBzeW1saW5rcywKLSMgYW5kIHNldCB1cCBwcm9nZGlyIHRvIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgcGF0aG5hbWUgb2YgaXRzIGRpcmVjdG9yeS4KLXByb2c9IiQwIgotd2hpbGUgWyAtaCAiJHtwcm9nfSIgXTsgZG8KLSAgICBuZXdQcm9nPWAvYmluL2xzIC1sZCAiJHtwcm9nfSJgCi0gICAgbmV3UHJvZz1gZXhwciAiJHtuZXdQcm9nfSIgOiAiLiogLT4gXCguKlwpJCJgCi0gICAgaWYgZXhwciAieCR7bmV3UHJvZ30iIDogJ3gvJyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICAgIHByb2c9IiR7bmV3UHJvZ30iCi0gICAgZWxzZQotICAgICAgICBwcm9nZGlyPWBkaXJuYW1lICIke3Byb2d9ImAKLSAgICAgICAgcHJvZz0iJHtwcm9nZGlyfS8ke25ld1Byb2d9IgotICAgIGZpCi1kb25lCi1vbGR3ZD1gcHdkYAotcHJvZ2Rpcj1gZGlybmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtwcm9nZGlyfSIKLXByb2dkaXI9YHB3ZGAKLXByb2c9IiR7cHJvZ2Rpcn0iL2BiYXNlbmFtZSAiJHtwcm9nfSJgCi1jZCAiJHtvbGR3ZH0iCi0KLWphcmZpbGU9bWFrZWRpY3QuamFyCi1mcmFtZXdvcmtkaXI9IiRwcm9nZGlyIgotaWYgWyAhIC1yICIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIiBdCi10aGVuCi0gICAgZnJhbWV3b3JrZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL3Rvb2xzL2xpYgotICAgIGxpYmRpcj1gZGlybmFtZSAiJHByb2dkaXIiYC90b29scy9saWIKLWZpCi1pZiBbICEgLXIgIiRmcmFtZXdvcmtkaXIvJGphcmZpbGUiIF0KLXRoZW4KLSAgICBmcmFtZXdvcmtkaXI9YGRpcm5hbWUgIiRwcm9nZGlyImAvZnJhbWV3b3JrCi0gICAgbGliZGlyPWBkaXJuYW1lICIkcHJvZ2RpciJgL2xpYgotZmkKLWlmIFsgISAtciAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSIgXQotdGhlbgotICAgIGVjaG8gYGJhc2VuYW1lICIkcHJvZyJgIjogY2FuJ3QgZmluZCAkamFyZmlsZSIKLSAgICBleGl0IDEKLWZpCi0KLWlmIFsgIiRPU1RZUEUiID0gImN5Z3dpbiIgXSA7IHRoZW4KLSAgICBqYXJwYXRoPWBjeWdwYXRoIC13ICAiJGZyYW1ld29ya2Rpci8kamFyZmlsZSJgCi0gICAgcHJvZ2Rpcj1gY3lncGF0aCAtdyAgIiRwcm9nZGlyImAKLWVsc2UKLSAgICBqYXJwYXRoPSIkZnJhbWV3b3JrZGlyLyRqYXJmaWxlIgotZmkKLQotIyBuZWVkIHRvIHVzZSAiamF2YS5leHQuZGlycyIgYmVjYXVzZSAiLWphciIgY2F1c2VzIGNsYXNzcGF0aCB0byBiZSBpZ25vcmVkCi0jIG1pZ2h0IG5lZWQgbW9yZSBtZW1vcnksIGUuZy4gLVhteDEyOE0KLWV4ZWMgamF2YSAtRGphdmEuZXh0LmRpcnM9IiRmcmFtZXdvcmtkaXIiIC1qYXIgIiRqYXJwYXRoIiAiJEAiCmRpZmYgLS1naXQgYS90b29scy9tYWtlZGljdC9ldGMvbWFuaWZlc3QudHh0IGIvdG9vbHMvbWFrZWRpY3QvZXRjL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzYTNlOC4uMDAwMDAwMAotLS0gYS90b29scy9tYWtlZGljdC9ldGMvbWFuaWZlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQudG9vbHMuZGljdC5NYWtlQmluYXJ5RGljdGlvbmFyeQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvTWFrZUJpbmFyeURpY3Rpb25hcnkuamF2YSBiL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L01ha2VCaW5hcnlEaWN0aW9uYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3YTY0MDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvTWFrZUJpbmFyeURpY3Rpb25hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5kaWN0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotLyoqCi0gKiBDb21wcmVzc2VzIGEgbGlzdCBvZiB3b3JkcyBhbmQgZnJlcXVlbmNpZXMgaW50byBhIHRyZWUgc3RydWN0dXJlZCBiaW5hcnkgZGljdGlvbmFyeS4KLSAqLwotcHVibGljIGNsYXNzIE1ha2VCaW5hcnlEaWN0aW9uYXJ5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUEhBX1NJWkUgPSAyNTY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfV09SRCA9ICJ3IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZSRVEgPSAiZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BRERSRVNTX01BU0sgID0gMHg0MDAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVEVSTUlOQUxfTUFTSyA9IDB4ODAwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERSRVNTX01BU0sgPSAweDNGRkZGRjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJOb2RlIEVNUFRZX05PREUgPSBuZXcgQ2hhck5vZGUoKTsKLQotICAgIExpc3Q8Q2hhck5vZGU+IHJvb3RzOwotICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IG1EaWN0aW9uYXJ5OwotICAgIGludCBtV29yZENvdW50OwotICAgIAotICAgIHN0YXRpYyBjbGFzcyBDaGFyTm9kZSB7Ci0gICAgICAgIGNoYXIgZGF0YTsKLSAgICAgICAgaW50IGZyZXE7Ci0gICAgICAgIGJvb2xlYW4gdGVybWluYWw7Ci0gICAgICAgIExpc3Q8Q2hhck5vZGU+IGNoaWxkcmVuOwotICAgICAgICBzdGF0aWMgaW50IHNOb2RlczsKLQotICAgICAgICBwdWJsaWMgQ2hhck5vZGUoKSB7Ci0gICAgICAgICAgICBzTm9kZXMrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogbWFrZWRpY3QgPHNyYy54bWw+IDxkZXN0LmRpY3Q+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KC0xKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0gICAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3IE1ha2VCaW5hcnlEaWN0aW9uYXJ5KGFyZ3NbMF0sIGFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1ha2VCaW5hcnlEaWN0aW9uYXJ5KFN0cmluZyBzcmNGaWxlbmFtZSwgU3RyaW5nIGRlc3RGaWxlbmFtZSkgewotICAgICAgICBwb3B1bGF0ZURpY3Rpb25hcnkoc3JjRmlsZW5hbWUpOwotICAgICAgICB3cml0ZVRvRGljdChkZXN0RmlsZW5hbWUpOwotICAgICAgICAvLyBFbmFibGUgdGhlIGNvZGUgYmVsb3cgdG8gdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCB0cmVlIGlzIHRyYXZlcnNhYmxlLgotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIHRyYXZlcnNlRGljdCgwLCBuZXcgY2hhclszMl0sIDApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZURpY3Rpb25hcnkoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHJvb3RzID0gbmV3IEFycmF5TGlzdDxDaGFyTm9kZT4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IEZpbGUoZmlsZW5hbWUpLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpbldvcmQ7Ci0gICAgICAgICAgICAgICAgaW50IGZyZXE7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB3b3JkQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDQ4KTsKLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHFOYW1lLmVxdWFscygidyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbldvcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcSA9IEludGVnZXIucGFyc2VJbnQoYXR0cmlidXRlcy5nZXRWYWx1ZSgwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JkQnVpbGRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBvdGhlciB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmICghaW5Xb3JkKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRCdWlsZGVyLmFwcGVuZChkYXRhLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMoInciKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRCdWlsZGVyLmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdvcmRUb3Aod29yZEJ1aWxkZXIudG9TdHJpbmcoKSwgZnJlcSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdvcmRDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5Xb3JkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFeGNlcHRpb24gaW4gcGFyc2luZ1xuIiArIGlvZSk7Ci0gICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb2RlcyA9ICIgKyBDaGFyTm9kZS5zTm9kZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGluZGV4T2YoTGlzdDxDaGFyTm9kZT4gY2hpbGRyZW4sIGNoYXIgYykgewotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbi5nZXQoaSkuZGF0YSA9PSBjKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRXb3JkVG9wKFN0cmluZyB3b3JkLCBpbnQgb2NjdXIpIHsKLSAgICAgICAgaWYgKG9jY3VyID4gMjU1KSBvY2N1ciA9IDI1NTsKLSAgICAgICAgY2hhciBmaXJzdENoYXIgPSB3b3JkLmNoYXJBdCgwKTsKLSAgICAgICAgaW50IGluZGV4ID0gaW5kZXhPZihyb290cywgZmlyc3RDaGFyKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBDaGFyTm9kZSBuZXdOb2RlID0gbmV3IENoYXJOb2RlKCk7Ci0gICAgICAgICAgICBuZXdOb2RlLmRhdGEgPSBmaXJzdENoYXI7Ci0gICAgICAgICAgICBuZXdOb2RlLmZyZXEgPSBvY2N1cjsKLSAgICAgICAgICAgIGluZGV4ID0gcm9vdHMuc2l6ZSgpOwotICAgICAgICAgICAgcm9vdHMuYWRkKG5ld05vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcm9vdHMuZ2V0KGluZGV4KS5mcmVxICs9IG9jY3VyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkLmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgYWRkV29yZFJlYyhyb290cy5nZXQoaW5kZXgpLCB3b3JkLCAxLCBvY2N1cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByb290cy5nZXQoaW5kZXgpLnRlcm1pbmFsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRXb3JkUmVjKENoYXJOb2RlIHBhcmVudCwgU3RyaW5nIHdvcmQsIGludCBjaGFyQXQsIGludCBvY2N1cikgewotICAgICAgICBDaGFyTm9kZSBjaGlsZCA9IG51bGw7Ci0gICAgICAgIGNoYXIgZGF0YSA9IHdvcmQuY2hhckF0KGNoYXJBdCk7Ci0gICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDaGFyTm9kZT4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2hhck5vZGUgbm9kZSA9IHBhcmVudC5jaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YSA9PSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGlsZCA9IG5ldyBDaGFyTm9kZSgpOwotICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGQuZGF0YSA9IGRhdGE7Ci0gICAgICAgIGlmIChjaGlsZC5mcmVxID09IDApIGNoaWxkLmZyZXEgPSBvY2N1cjsKLSAgICAgICAgaWYgKHdvcmQubGVuZ3RoKCkgPiBjaGFyQXQgKyAxKSB7Ci0gICAgICAgICAgICBhZGRXb3JkUmVjKGNoaWxkLCB3b3JkLCBjaGFyQXQgKyAxLCBvY2N1cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZC50ZXJtaW5hbCA9IHRydWU7Ci0gICAgICAgICAgICBjaGlsZC5mcmVxID0gb2NjdXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBieXRlW10gZGljdDsKLSAgICBpbnQgZGljdFNpemU7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDSEFSX1dJRFRIID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1dJRFRIID0gMTsgLy8gVGVybWluYWwgZmxhZyAod29yZCBlbmQpCi0gICAgc3RhdGljIGZpbmFsIGludCBBRERSX1dJRFRIID0gMjM7IC8vIE9mZnNldCB0byBjaGlsZHJlbgotICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJFUV9XSURUSF9CWVRFUyA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT1VOVF9XSURUSF9CWVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ291bnQoaW50IGNvdW50KSB7Ci0gICAgICAgIGRpY3RbZGljdFNpemUrK10gPSAoYnl0ZSkgKDB4RkYgJiBjb3VudCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGROb2RlKENoYXJOb2RlIG5vZGUpIHsKLSAgICAgICAgaW50IGNoYXJEYXRhID0gMHhGRkZGICYgbm9kZS5kYXRhOwotICAgICAgICBpZiAoY2hhckRhdGEgPiAyNTQpIHsKLSAgICAgICAgICAgIGRpY3RbZGljdFNpemUrK10gPSAoYnl0ZSkgMjU1OwotICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAoKG5vZGUuZGF0YSA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAobm9kZS5kYXRhICYgMHhGRik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gKGJ5dGUpICgweEZGICYgbm9kZS5kYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWN0U2l6ZSArPSAzOyAvLyBTcGFjZSBmb3IgY2hpbGRyZW4gYWRkcmVzcwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGljdFNpemUgKz0gMTsgLy8gU3BhY2UgZm9yIGp1c3QgdGhlIHRlcm1pbmFsL2FkZHJlc3MgZmxhZ3MKLSAgICAgICAgfQotICAgICAgICBpZiAoKDB4RkZGRkZGICYgbm9kZS5mcmVxKSA+IDI1NSkgewotICAgICAgICAgICAgbm9kZS5mcmVxID0gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlLnRlcm1pbmFsKSB7Ci0gICAgICAgICAgICBieXRlIGZyZXEgPSAoYnl0ZSkgKDB4RkYgJiBub2RlLmZyZXEpOwotICAgICAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IGZyZXE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgbnVsbENoaWxkcmVuQ291bnQgPSAwOwotICAgIGludCBub3RUZXJtaW5hbENvdW50ID0gMDsKLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOb2RlQWRkcmVzcyhpbnQgbm9kZUFkZHJlc3MsIENoYXJOb2RlIG5vZGUsCi0gICAgICAgICAgICBpbnQgY2hpbGRyZW5BZGRyZXNzKSB7Ci0gICAgICAgIGlmICgoZGljdFtub2RlQWRkcmVzc10gJiAweEZGKSA9PSAweEZGKSB7IC8vIDMgYnl0ZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIG5vZGVBZGRyZXNzICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRyZW5BZGRyZXNzID0gQUREUkVTU19NQVNLICYgY2hpbGRyZW5BZGRyZXNzOwotICAgICAgICBpZiAoY2hpbGRyZW5BZGRyZXNzID09IDApIHsKLSAgICAgICAgICAgIG51bGxDaGlsZHJlbkNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZHJlbkFkZHJlc3MgfD0gRkxBR19BRERSRVNTX01BU0s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUudGVybWluYWwpIHsKLSAgICAgICAgICAgIGNoaWxkcmVuQWRkcmVzcyB8PSBGTEFHX1RFUk1JTkFMX01BU0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RUZXJtaW5hbENvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZGljdFtub2RlQWRkcmVzcyArIDFdID0gKGJ5dGUpIChjaGlsZHJlbkFkZHJlc3MgPj4gMTYpOwotICAgICAgICBpZiAoKGNoaWxkcmVuQWRkcmVzcyAmIEZMQUdfQUREUkVTU19NQVNLKSAhPSAwKSB7Ci0gICAgICAgICAgICBkaWN0W25vZGVBZGRyZXNzICsgMl0gPSAoYnl0ZSkgKChjaGlsZHJlbkFkZHJlc3MgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgZGljdFtub2RlQWRkcmVzcyArIDNdID0gKGJ5dGUpICgoY2hpbGRyZW5BZGRyZXNzICYgMHhGRikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZVdvcmRzUmVjKExpc3Q8Q2hhck5vZGU+IGNoaWxkcmVuKSB7Ci0gICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgIGFkZENvdW50KGNoaWxkQ291bnQpOwotICAgICAgICAvL2ludCBjaGlsZHJlblN0YXJ0ID0gZGljdFNpemU7Ci0gICAgICAgIGludFtdIGNoaWxkcmVuQWRkcmVzc2VzID0gbmV3IGludFtjaGlsZENvdW50XTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZENvdW50OyBqKyspIHsKLSAgICAgICAgICAgIENoYXJOb2RlIG5vZGUgPSBjaGlsZHJlbi5nZXQoaik7Ci0gICAgICAgICAgICBjaGlsZHJlbkFkZHJlc3Nlc1tqXSA9IGRpY3RTaXplOwotICAgICAgICAgICAgYWRkTm9kZShub2RlKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkQ291bnQ7IGorKykgewotICAgICAgICAgICAgQ2hhck5vZGUgbm9kZSA9IGNoaWxkcmVuLmdldChqKTsKLSAgICAgICAgICAgIGludCBub2RlQWRkcmVzcyA9IGNoaWxkcmVuQWRkcmVzc2VzW2pdOwotICAgICAgICAgICAgaW50IGNhY2hlRGljdFNpemUgPSBkaWN0U2l6ZTsKLSAgICAgICAgICAgIHdyaXRlV29yZHNSZWMobm9kZS5jaGlsZHJlbik7Ci0gICAgICAgICAgICB1cGRhdGVOb2RlQWRkcmVzcyhub2RlQWRkcmVzcywgbm9kZSwgbm9kZS5jaGlsZHJlbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gY2FjaGVEaWN0U2l6ZSA6IDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZVRvRGljdChTdHJpbmcgZGljdEZpbGVuYW1lKSB7Ci0gICAgICAgIC8vIDRNQiBtYXgsIDIyLWJpdCBvZmZzZXRzCi0gICAgICAgIGRpY3QgPSBuZXcgYnl0ZVs0ICogMTAyNCAqIDEwMjRdOyAvLyA0TUIgdXBwZXIgbGltaXQuIEFjdHVhbCBpcyBwcm9iYWJseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCAxTUIgaW4gbW9zdCBjYXNlcywgYXMgdGhlcmUgaXMgYSBsaW1pdCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIHNpemUgaW4gYXBrcy4KLSAgICAgICAgZGljdFNpemUgPSAwOwotICAgICAgICB3cml0ZVdvcmRzUmVjKHJvb3RzKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEaWN0IFNpemUgPSAiICsgZGljdFNpemUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkaWN0RmlsZW5hbWUpOwotICAgICAgICAgICAgZm9zLndyaXRlKGRpY3QsIDAsIGRpY3RTaXplKTsKLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3Igd3JpdGluZyBkaWN0IGZpbGU6IiArIGlvZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHRyYXZlcnNlRGljdChpbnQgcG9zLCBjaGFyW10gd29yZCwgaW50IGRlcHRoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IGRpY3RbcG9zKytdICYgMHhGRjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKGRpY3RbcG9zKytdICYgMHhGRik7Ci0gICAgICAgICAgICBpZiAoYyA9PSAweEZGKSB7Ci0gICAgICAgICAgICAgICAgYyA9IChjaGFyKSAoKChkaWN0W3Bvc10gJiAweEZGKSA8PCA4KSB8IChkaWN0W3BvcysxXSAmIDB4RkYpKTsKLSAgICAgICAgICAgICAgICBwb3MgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdvcmRbZGVwdGhdID0gYzsKLSAgICAgICAgICAgIGJvb2xlYW4gdGVybWluYWwgPSAoZGljdFtwb3NdICYgMHg4MCkgPiAwOwotICAgICAgICAgICAgaW50IGFkZHJlc3MgPSAwOwotICAgICAgICAgICAgaWYgKChkaWN0W3Bvc10gJiAoRkxBR19BRERSRVNTX01BU0sgPj4gMTYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gCi0gICAgICAgICAgICAgICAgICAgICgoZGljdFtwb3MgKyAwXSAmIChGTEFHX0FERFJFU1NfTUFTSyA+PiAxNikpIDw8IDE2KQotICAgICAgICAgICAgICAgICAgICB8ICgoZGljdFtwb3MgKyAxXSAmIDB4RkYpIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgIHwgKChkaWN0W3BvcyArIDJdICYgMHhGRikpOwotICAgICAgICAgICAgICAgIHBvcyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICBpZiAodGVybWluYWwpIHsKLSAgICAgICAgICAgICAgICBzaG93V29yZCh3b3JkLCBkZXB0aCArIDEsIGRpY3RbcG9zXSAmIDB4RkYpOwotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gMCkgewotICAgICAgICAgICAgICAgIHRyYXZlcnNlRGljdChhZGRyZXNzLCB3b3JkLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzaG93V29yZChjaGFyW10gd29yZCwgaW50IHNpemUsIGludCBmcmVxKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQobmV3IFN0cmluZyh3b3JkLCAwLCBzaXplKSArICIgIiArIGZyZXEgKyAiXG4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy96b25laW5mby9ab25lQ29tcGFjdG9yLmphdmEgYi90b29scy96b25laW5mby9ab25lQ29tcGFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWRkZmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vWm9uZUNvbXBhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLy8gdXNhZ2U6IGphdmEgWm9uZUNvbXBpbGVyIDxzZXR1cCBmaWxlPiA8dG9wLWxldmVsIGRpcmVjdG9yeT4KLS8vCi0vLyBDb21waWxlIGEgc2V0IG9mIHR6ZmlsZS1mb3JtYXR0ZWQgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlIHBsdXMKLS8vIGFuIGluZGV4IGZpbGUuCi0vLwotLy8gVGhlIGNvbXBpbGF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgYSBzZXR1cCBmaWxlLCB3aGljaCBpcyBwcm92aWRlZCBhcyBhCi0vLyBjb21tYW5kLWxpbmUgYXJndW1lbnQuICBUaGUgc2V0dXAgZmlsZSBoYXMgdGhlIGZvcm06Ci0vLwotLy8gTGluayA8dG9OYW1lPiA8ZnJvbU5hbWU+Ci0vLyAuLi4KLS8vIDx6b25lIGZpbGVuYW1lPgotLy8gLi4uCi0vLwotLy8gTm90ZSB0aGF0IHRoZSBsaW5rcyBtdXN0IGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSB6b25lIG5hbWVzLiAgQQotLy8gem9uZSBuYW1lIGlzIGEgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBkaXJlY3Rvcnkgc3VjaCBhcwotLy8gJ0dNVCcsICdBZnJpY2EvRGFrYXInLCBvciAnQW1lcmljYS9BcmdlbnRpbmEvSnVqdXknLgotLy8KLS8vIFVzZSB0aGUgJ3ppYycgY29tbWFuZC1saW5lIHRvb2wgdG8gY29udmVydCBmcm9tIGZsYXQgZmlsZXMKLS8vIChlLmcuLCAnYWZyaWNhJywgJ25vcnRoYW1lcmljYScpIGludG8gYSBzdWl0YWJsZSBzb3VyY2UgZGlyZWN0b3J5Ci0vLyBoaWVyYXJjaHkgZm9yIHRoaXMgdG9vbCAoZS5nLiwgJ2RhdGEvQWZyaWNhL0FiaWRqYW4nKS4KLS8vCi0vLyBFeGFtcGxlOgotLy8gICAgIHppYyAtZCBkYXRhIHR6MjAwN2gKLS8vICAgICBqYXZhYyBab25lQ29tcGFjdG9yLmphdmEKLS8vICAgICBqYXZhIFpvbmVDb21wYWN0b3Igc2V0dXAgZGF0YQotLy8gICAgIDxwcm9kdWNlcyB6b25laW5mby5kYXQgYW5kIHpvbmVpbmZvLmlkeD4KLQotcHVibGljIGNsYXNzIFpvbmVDb21wYWN0b3IgewotCi0gICAgLy8gWm9uZSBuYW1lIHN5bm9ueW1zCi0gICAgTWFwPFN0cmluZyxTdHJpbmc+IGxpbmtzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLQotICAgIC8vIEZpbGUgc3RhcnRpbmcgYnl0ZXMgYnkgem9uZSBuYW1lCi0gICAgTWFwPFN0cmluZyxJbnRlZ2VyPiBzdGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oKTsKLQotICAgIC8vIEZpbGUgbGVuZ3RocyBieSB6b25lIG5hbWUKLSAgICBNYXA8U3RyaW5nLEludGVnZXI+IGxlbmd0aHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oKTsKLQotICAgIC8vIFJhdyBHTVQgb2Zmc2V0cyBieSB6b25lIG5hbWUKLSAgICBNYXA8U3RyaW5nLEludGVnZXI+IG9mZnNldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oKTsKLSAgICBpbnQgc3RhcnQgPSAwOwotCi0gICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHpvbmUgbmFtZSwgaW5jbHVkaW5nICdcMCcgdGVybWluYXRvcgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhOQU1FID0gNDA7Ci0KLSAgICAvLyBDb25jYXRlbmF0ZSB0aGUgY29udGVudHMgb2YgJ2luRmlsZScgb250byAnb3V0JwotICAgIC8vIGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIGFzIGEgYnl0ZSBhcnJheS4KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gY29weUZpbGUoRmlsZSBpbkZpbGUsIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gcmV0ID0gbmV3IGJ5dGVbMF07Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGluRmlsZSk7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBuYnl0ZXMgPSBpbi5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICBpZiAobmJ5dGVzID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBuYnl0ZXMpOwotCi0gICAgICAgICAgICBieXRlW10gbnJldCA9IG5ldyBieXRlW3JldC5sZW5ndGggKyBuYnl0ZXNdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXQsIDAsIG5yZXQsIDAsIHJldC5sZW5ndGgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIDAsIG5yZXQsIHJldC5sZW5ndGgsIG5ieXRlcyk7Ci0gICAgICAgICAgICByZXQgPSBucmV0OwotICAgICAgICB9Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICAvLyBXcml0ZSBhIDMyLWJpdCBpbnRlZ2VyIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgotICAgIHByaXZhdGUgdm9pZCB3cml0ZUludChPdXRwdXRTdHJlYW0gb3MsIGludCB4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvcy53cml0ZSgoeCA+PiAyNCkgJiAweGZmKTsKLSAgICAgICAgb3Mud3JpdGUoKHggPj4gMTYpICYgMHhmZik7Ci0gICAgICAgIG9zLndyaXRlKCh4ID4+ICA4KSAmIDB4ZmYpOwotICAgICAgICBvcy53cml0ZSggeCAgICAgICAgJiAweGZmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWm9uZUNvbXBhY3RvcihTdHJpbmcgc2V0dXBGaWxlbmFtZSwgU3RyaW5nIGRpck5hbWUpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHpvbmVJbmZvRmlsZSA9IG5ldyBGaWxlKCJ6b25laW5mby5kYXQiKTsKLSAgICAgICAgem9uZUluZm9GaWxlLmRlbGV0ZSgpOwotICAgICAgICBPdXRwdXRTdHJlYW0gem9uZUluZm8gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh6b25lSW5mb0ZpbGUpOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJkciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzZXR1cEZpbGVuYW1lKSk7Ci0gICAgCi0gICAgICAgIFN0cmluZyBzOwotICAgICAgICB3aGlsZSAoKHMgPSByZHIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMudHJpbSgpOwotICAgICAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiTGluayIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzKTsKLSAgICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG8gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGxpbmtzLnB1dChmcm9tLCB0byk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gbGlua3MuZ2V0KHMpOwotICAgICAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyTmFtZSwgcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gZi5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRzLnB1dChzLCBuZXcgSW50ZWdlcihzdGFydCkpOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGhzLnB1dChzLCBuZXcgSW50ZWdlcigoaW50KWxlbmd0aCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjb3B5RmlsZShmLCB6b25lSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgVGltZVpvbmUgdHogPSBab25lSW5mby5tYWtlKHMsIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZ210T2Zmc2V0ID0gdHouZ2V0UmF3T2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldHMucHV0KHMsIG5ldyBJbnRlZ2VyKGdtdE9mZnNldCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB6b25lSW5mby5jbG9zZSgpOwotCi0gICAgICAgIC8vIEZpbGwgaW4gZmllbGRzIGZvciBsaW5rcwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaW5rcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmcm9tID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdG8gPSBsaW5rcy5nZXQoZnJvbSk7Ci0KLSAgICAgICAgICAgIHN0YXJ0cy5wdXQoZnJvbSwgc3RhcnRzLmdldCh0bykpOwotICAgICAgICAgICAgbGVuZ3Rocy5wdXQoZnJvbSwgbGVuZ3Rocy5nZXQodG8pKTsKLSAgICAgICAgICAgIG9mZnNldHMucHV0KGZyb20sIG9mZnNldHMuZ2V0KHRvKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGlkeEZpbGUgPSBuZXcgRmlsZSgiem9uZWluZm8uaWR4Iik7Ci0gICAgICAgIGlkeEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gaWR4ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4RmlsZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwuYWRkQWxsKHN0YXJ0cy5rZXlTZXQoKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobCk7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4geml0ZXIgPSBsLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlICh6aXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB6bmFtZSA9IHppdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh6bmFtZS5sZW5ndGgoKSA+PSBNQVhOQU1FKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciAtIHpvbmUgZmlsZW5hbWUgZXhjZWVkcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWE5BTUUgLSAxKSArICIgY2hhcmFjdGVycyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZVtdIHpuYW1lQnVmID0gbmV3IGJ5dGVbTUFYTkFNRV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHpuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB6bmFtZUJ1ZltpXSA9IChieXRlKXpuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkeC53cml0ZSh6bmFtZUJ1Zik7Ci0gICAgICAgICAgICB3cml0ZUludChpZHgsIHN0YXJ0cy5nZXQoem5hbWUpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgd3JpdGVJbnQoaWR4LCBsZW5ndGhzLmdldCh6bmFtZSkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICB3cml0ZUludChpZHgsIG9mZnNldHMuZ2V0KHpuYW1lKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZHguY2xvc2UoKTsKLQotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1heExlbmd0aCA9ICIgKyBtYXhMZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ1c2FnZTogamF2YSBab25lQ29tcGFjdG9yIDxzZXR1cD4gPGRhdGEgZGlyPiIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3IFpvbmVDb21wYWN0b3IoYXJnc1swXSwgYXJnc1sxXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90b29scy96b25laW5mby9ab25lSW5mby5qYXZhIGIvdG9vbHMvem9uZWluZm8vWm9uZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MDdhZS4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby9ab25lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBab25lSW5mbyBhbmQgWm9uZUluZm9EQiBpbiBkYWx2aWsuCi0gKiB7QGhpZGV9Ci0gKi8KLXB1YmxpYyBjbGFzcyBab25lSW5mbyBleHRlbmRzIFRpbWVab25lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDYwICogNjAgKiAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTRUNPTkRTX1BFUl80MDBfWUVBUlMgPQotICAgICAgICBNSUxMSVNFQ09ORFNfUEVSX0RBWSAqICg0MDAgKiAzNjUgKyAxMDAgLSAzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVU5JWF9PRkZTRVQgPSA2MjE2NzIxOTIwMDAwMEw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOT1JNQUwgPSBuZXcgaW50W10gewotICAgICAgICAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTEVBUCA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIDAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnVsbE5hbWUoYnl0ZVtdIGRhdGEsIGludCB3aGVyZSwgaW50IG9mZikgewotICAgICAgICBpZiAob2ZmIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCBlbmQgPSB3aGVyZSArIG9mZjsKLSAgICAgICAgd2hpbGUgKGVuZCA8IGRhdGEubGVuZ3RoICYmIGRhdGFbZW5kXSAhPSAnXDAnKQotICAgICAgICAgICAgZW5kKys7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgd2hlcmUgKyBvZmYsIGVuZCAtICh3aGVyZSArIG9mZikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWm9uZUluZm8gbWFrZShTdHJpbmcgbmFtZSwgYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgaW50IG50cmFuc2l0aW9uID0gcmVhZDQoZGF0YSwgMzIpOwotICAgICAgICBpbnQgbmdtdG9mZiA9IHJlYWQ0KGRhdGEsIDM2KTsKLSAgICAgICAgaW50IGJhc2UgPSA0NDsKLQotICAgICAgICBpbnRbXSB0cmFuc2l0aW9ucyA9IG5ldyBpbnRbbnRyYW5zaXRpb25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG50cmFuc2l0aW9uOyBpKyspCi0gICAgICAgICAgICB0cmFuc2l0aW9uc1tpXSA9IHJlYWQ0KGRhdGEsIGJhc2UgKyA0ICogaSk7Ci0gICAgICAgIGJhc2UgKz0gNCAqIG50cmFuc2l0aW9uOwotCi0gICAgICAgIGJ5dGVbXSB0eXBlID0gbmV3IGJ5dGVbbnRyYW5zaXRpb25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG50cmFuc2l0aW9uOyBpKyspCi0gICAgICAgICAgICB0eXBlW2ldID0gZGF0YVtiYXNlICsgaV07Ci0gICAgICAgIGJhc2UgKz0gbnRyYW5zaXRpb247Ci0KLSAgICAgICAgaW50W10gZ210b2ZmID0gbmV3IGludFtuZ210b2ZmXTsKLSAgICAgICAgYnl0ZVtdIGlzZHN0ID0gbmV3IGJ5dGVbbmdtdG9mZl07Ci0gICAgICAgIGJ5dGVbXSBhYmJyZXYgPSBuZXcgYnl0ZVtuZ210b2ZmXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZ210b2ZmOyBpKyspIHsKLSAgICAgICAgICAgIGdtdG9mZltpXSA9IHJlYWQ0KGRhdGEsIGJhc2UgKyA2ICogaSk7Ci0gICAgICAgICAgICBpc2RzdFtpXSA9IGRhdGFbYmFzZSArIDYgKiBpICsgNF07Ci0gICAgICAgICAgICBhYmJyZXZbaV0gPSBkYXRhW2Jhc2UgKyA2ICogaSArIDVdOwotICAgICAgICB9Ci0KLSAgICAgICAgYmFzZSArPSA2ICogbmdtdG9mZjsKLQotICAgICAgICByZXR1cm4gbmV3IFpvbmVJbmZvKG5hbWUsIHRyYW5zaXRpb25zLCB0eXBlLCBnbXRvZmYsIGlzZHN0LCBhYmJyZXYsIGRhdGEsIGJhc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCByZWFkNChieXRlW10gZGF0YSwgaW50IG9mZikgewotICAgICAgICByZXR1cm4gKChkYXRhW29mZiAgICBdICYgMHhGRikgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICgoZGF0YVtvZmYgKyAxXSAmIDB4RkYpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAoKGRhdGFbb2ZmICsgMl0gJiAweEZGKSA8PCAgOCkgfAotICAgICAgICAgICAgICAgKChkYXRhW29mZiArIDNdICYgMHhGRikgPDwgIDApOwotICAgIH0KLQotICAgIC8qcGFja2FnZSovIFpvbmVJbmZvKFN0cmluZyBuYW1lLCBpbnRbXSB0cmFuc2l0aW9ucywgYnl0ZVtdIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnRbXSBnbXRvZmYsIGJ5dGVbXSBpc2RzdCwgYnl0ZVtdIGFiYnJldiwKLSAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBpbnQgYWJicmV2b2ZmKSB7Ci0gICAgICAgIG1UcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zOwotICAgICAgICBtVHlwZXMgPSB0eXBlOwotICAgICAgICBtR210T2ZmcyA9IGdtdG9mZjsKLSAgICAgICAgbUlzRHN0cyA9IGlzZHN0OwotICAgICAgICBtVXNlRHN0ID0gZmFsc2U7Ci0gICAgICAgIHNldElEKG5hbWUpOwotCi0gICAgICAgIC8vIEZpbmQgdGhlIGxhdGVzdCBHTVQgYW5kIG5vbi1HTVQgb2Zmc2V0cyBmb3IgdGhlaXIgYWJicmV2aWF0aW9ucwotCi0gICAgICAgIGludCBsYXN0ZHN0OwotICAgICAgICBmb3IgKGxhc3Rkc3QgPSBtVHJhbnNpdGlvbnMubGVuZ3RoIC0gMTsgbGFzdGRzdCA+PSAwOyBsYXN0ZHN0LS0pIHsKLSAgICAgICAgICAgIGlmIChtSXNEc3RzW21UeXBlc1tsYXN0ZHN0XSAmIDB4RkZdICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGFzdHN0ZDsKLSAgICAgICAgZm9yIChsYXN0c3RkID0gbVRyYW5zaXRpb25zLmxlbmd0aCAtIDE7IGxhc3RzdGQgPj0gMDsgbGFzdHN0ZC0tKSB7Ci0gICAgICAgICAgICBpZiAobUlzRHN0c1ttVHlwZXNbbGFzdHN0ZF0gJiAweEZGXSA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhc3Rkc3QgPj0gMCkgewotICAgICAgICAgICAgbURheWxpZ2h0TmFtZSA9IG51bGxOYW1lKGRhdGEsIGFiYnJldm9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmJyZXZbbVR5cGVzW2xhc3Rkc3RdICYgMHhGRl0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0c3RkID49IDApIHsKLSAgICAgICAgICAgIG1TdGFuZGFyZE5hbWUgPSBudWxsTmFtZShkYXRhLCBhYmJyZXZvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJicmV2W21UeXBlc1tsYXN0c3RkXSAmIDB4RkZdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSB0aGUgbGF0ZXN0IG5vbi1EU1Qgb2Zmc2V0IGlmIGFueSBhcyB0aGUgcmF3IG9mZnNldAotCi0gICAgICAgIGlmIChsYXN0c3RkIDwgMCkgewotICAgICAgICAgICAgbGFzdHN0ZCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGFzdHN0ZCA+PSBtVHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBtUmF3T2Zmc2V0ID0gbUdtdE9mZnNbMF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmF3T2Zmc2V0ID0gbUdtdE9mZnNbbVR5cGVzW2xhc3RzdGRdICYgMHhGRl07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgcmF3IG9mZnNldCBmcm9tIGFsbCBvZmZzZXRzIHNvIGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgIC8vIGFuZCBhZmZlY3QgdGhlbSB0b28uCi0gICAgICAgIC8vIEZpbmQgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgb2JzZXJ2YW5jZXMgb2YgRFNULgotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUdtdE9mZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1HbXRPZmZzW2ldIC09IG1SYXdPZmZzZXQ7Ci0KLSAgICAgICAgICAgIGlmIChtSXNEc3RzW2ldICE9IDApIHsKLSAgICAgICAgICAgICAgICBtVXNlRHN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1SYXdPZmZzZXQgKj0gMTAwMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE9mZnNldChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGVyYSwKLSAgICAgICAgaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBkYXlPZldlZWssCi0gICAgICAgIGludCBtaWxsaXMpIHsKLSAgICAgICAgLy8gWFhYIFRoaXMgYXNzdW1lcyBHcmVnb3JpYW4gYWx3YXlzOyBDYWxlbmRhciBzd2l0Y2hlcyBmcm9tCi0gICAgICAgIC8vIEp1bGlhbiB0byBHcmVnb3JpYW4gaW4gMTU4Mi4gIFdoYXQgY2FsZW5kYXIgc3lzdGVtIGFyZSB0aGUKLSAgICAgICAgLy8gYXJndW1lbnRzIHN1cHBvc2VkIHRvIGNvbWUgZnJvbT8KLQotICAgICAgICBsb25nIGNhbGMgPSAoeWVhciAvIDQwMCkgKiBNSUxMSVNFQ09ORFNfUEVSXzQwMF9ZRUFSUzsKLSAgICAgICAgeWVhciAlPSA0MDA7Ci0KLSAgICAgICAgY2FsYyArPSB5ZWFyICogKDM2NSAqIE1JTExJU0VDT05EU19QRVJfREFZKTsKLSAgICAgICAgY2FsYyArPSAoKHllYXIgKyAzKSAvIDQpICogTUlMTElTRUNPTkRTX1BFUl9EQVk7Ci0KLSAgICAgICAgaWYgKHllYXIgPiAwKQotICAgICAgICAgICAgY2FsYyAtPSAoKHllYXIgLSAxKSAvIDEwMCkgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWTsKLQotICAgICAgICBib29sZWFuIGlzTGVhcCA9ICh5ZWFyID09IDAgfHwgKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSk7Ci0gICAgICAgIGludFtdIG1sZW4gPSBpc0xlYXAgPyBMRUFQIDogTk9STUFMOwotCi0gICAgICAgIGNhbGMgKz0gbWxlblttb250aF0gKiBNSUxMSVNFQ09ORFNfUEVSX0RBWTsKLSAgICAgICAgY2FsYyArPSAoZGF5IC0gMSkgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWTsKLSAgICAgICAgY2FsYyArPSBtaWxsaXM7Ci0KLSAgICAgICAgY2FsYyAtPSBtUmF3T2Zmc2V0OwotICAgICAgICBjYWxjIC09IFVOSVhfT0ZGU0VUOwotCi0gICAgICAgIHJldHVybiBnZXRPZmZzZXQoY2FsYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRPZmZzZXQobG9uZyB3aGVuKSB7Ci0gICAgICAgIGludCB1bml4ID0gKGludCkgKHdoZW4gLyAxMDAwKTsKLSAgICAgICAgaW50IHRyYW5zID0gQXJyYXlzLmJpbmFyeVNlYXJjaChtVHJhbnNpdGlvbnMsIHVuaXgpOwotCi0gICAgICAgIGlmICh0cmFucyA9PSB+MCkgewotICAgICAgICAgICAgcmV0dXJuIG1HbXRPZmZzWzBdICogMTAwMCArIG1SYXdPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRyYW5zIDwgMCkgewotICAgICAgICAgICAgdHJhbnMgPSB+dHJhbnMgLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1HbXRPZmZzW21UeXBlc1t0cmFuc10gJiAweEZGXSAqIDEwMDAgKyBtUmF3T2Zmc2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF3T2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbVJhd09mZnNldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXdPZmZzZXQoaW50IG9mZikgewotICAgICAgICBtUmF3T2Zmc2V0ID0gb2ZmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGluRGF5bGlnaHRUaW1lKERhdGUgd2hlbikgewotICAgICAgICBpbnQgdW5peCA9IChpbnQpICh3aGVuLmdldFRpbWUoKSAvIDEwMDApOwotICAgICAgICBpbnQgdHJhbnMgPSBBcnJheXMuYmluYXJ5U2VhcmNoKG1UcmFuc2l0aW9ucywgdW5peCk7Ci0KLSAgICAgICAgaWYgKHRyYW5zID09IH4wKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlzRHN0c1swXSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFucyA8IDApIHsKLSAgICAgICAgICAgIHRyYW5zID0gfnRyYW5zIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtSXNEc3RzW21UeXBlc1t0cmFuc10gJiAweEZGXSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZURheWxpZ2h0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Vc2VEc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgbVJhd09mZnNldDsKLSAgICBwcml2YXRlIGludFtdIG1UcmFuc2l0aW9uczsKLSAgICBwcml2YXRlIGludFtdIG1HbXRPZmZzOwotICAgIHByaXZhdGUgYnl0ZVtdIG1UeXBlczsKLSAgICBwcml2YXRlIGJ5dGVbXSBtSXNEc3RzOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlRHN0OwotICAgIHByaXZhdGUgU3RyaW5nIG1EYXlsaWdodE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN0YW5kYXJkTmFtZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgWm9uZUluZm8pKSB7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBab25lSW5mbyBvdGhlciA9IChab25lSW5mbykgb2JqOwotICAgICAgICByZXR1cm4gbVVzZURzdCA9PSBvdGhlci5tVXNlRHN0Ci0gICAgICAgICAgICAgICAgJiYgKG1EYXlsaWdodE5hbWUgPT0gbnVsbCA/IG90aGVyLm1EYXlsaWdodE5hbWUgPT0gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGF5bGlnaHROYW1lLmVxdWFscyhvdGhlci5tRGF5bGlnaHROYW1lKSkKLSAgICAgICAgICAgICAgICAmJiAobVN0YW5kYXJkTmFtZSA9PSBudWxsID8gb3RoZXIubVN0YW5kYXJkTmFtZSA9PSBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGFyZE5hbWUuZXF1YWxzKG90aGVyLm1TdGFuZGFyZE5hbWUpKQotICAgICAgICAgICAgICAgICYmIG1SYXdPZmZzZXQgPT0gb3RoZXIubVJhd09mZnNldAotICAgICAgICAgICAgICAgIC8vIEFycmF5cy5lcXVhbHMgcmV0dXJucyB0cnVlIGlmIGJvdGggYXJyYXlzIGFyZSBudWxsCi0gICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtR210T2Zmcywgb3RoZXIubUdtdE9mZnMpCi0gICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtSXNEc3RzLCBvdGhlci5tSXNEc3RzKQotICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHMobVR5cGVzLCBvdGhlci5tVHlwZXMpCi0gICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyhtVHJhbnNpdGlvbnMsIG90aGVyLm1UcmFuc2l0aW9ucyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgIGludCByZXN1bHQgPSAxOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobURheWxpZ2h0TmFtZSA9PSBudWxsKSA/IDAgOgotICAgICAgICAgICAgICAgIG1EYXlsaWdodE5hbWUuaGFzaENvZGUoKSk7Ci0gICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgQXJyYXlzLmhhc2hDb2RlKG1HbXRPZmZzKTsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUobUlzRHN0cyk7Ci0gICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbVJhd09mZnNldDsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1TdGFuZGFyZE5hbWUgPT0gbnVsbCkgPyAwIDoKLSAgICAgICAgICAgICAgICBtU3RhbmRhcmROYW1lLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEFycmF5cy5oYXNoQ29kZShtVHJhbnNpdGlvbnMpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEFycmF5cy5oYXNoQ29kZShtVHlwZXMpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChtVXNlRHN0ID8gMTIzMSA6IDEyMzcpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL2dlbmVyYXRlIGIvdG9vbHMvem9uZWluZm8vZ2VuZXJhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzNGExZmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vZ2VuZXJhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIS9iaW4vc2gKLQotdmVyc2lvbj10emRhdGEyMDEwawotCi1ta2RpciBkYXRhCi0KLWZvciBpIGluICR2ZXJzaW9uL2FmcmljYSBcCi0gICAgJHZlcnNpb24vYW50YXJjdGljYSBcCi0gICAgJHZlcnNpb24vYXNpYSBcCi0gICAgJHZlcnNpb24vYXVzdHJhbGFzaWEgXAotICAgICR2ZXJzaW9uL2V0Y2V0ZXJhIFwKLSAgICAkdmVyc2lvbi9ldXJvcGUgXAotICAgICR2ZXJzaW9uL2ZhY3RvcnkgXAotICAgICR2ZXJzaW9uL25vcnRoYW1lcmljYSBcCi0gICAgJHZlcnNpb24vc29sYXI4NyBcCi0gICAgJHZlcnNpb24vc29sYXI4OCBcCi0gICAgJHZlcnNpb24vc29sYXI4OSBcCi0gICAgJHZlcnNpb24vc291dGhhbWVyaWNhCi1kbwotICAgIHppYyAtZCBkYXRhICRpCi1kb25lCi0KLWphdmFjIC10YXJnZXQgMS41IFpvbmVDb21wYWN0b3IuamF2YSBab25lSW5mby5qYXZhCi0KLSgKLSAgICBjYXQgJHZlcnNpb24vKiB8IGdyZXAgJ15MaW5rJyB8IGF3ayAne3ByaW50ICQxLCAkMiwgJDN9JwotICAgICgKLSAgICAgICAgY2F0ICR2ZXJzaW9uLyogfCBncmVwICdeWm9uZScgfCBhd2sgJ3twcmludCAkMn0nCi0gICAgICAgIGNhdCAkdmVyc2lvbi8qIHwgZ3JlcCAnXkxpbmsnIHwgYXdrICd7cHJpbnQgJDN9JwotICAgICkgfCBMQ19BTEw9IkMiIHNvcnQKLSkgfCBncmVwIC12IFJpeWFkaDggPiBzZXR1cAotCi1qYXZhIFpvbmVDb21wYWN0b3Igc2V0dXAgZGF0YQotCi1jcCB6b25laW5mby5kYXQgem9uZWluZm8uaWR4IC4uLy4uLy4uL2Jpb25pYy9saWJjL3pvbmVpbmZvCi0KLWVjaG8gJHZlcnNpb24gfCBzZWQgJ3MvdHpkYXRhLy8nID4gLi4vLi4vLi4vYmlvbmljL2xpYmMvem9uZWluZm8vem9uZWluZm8udmVyc2lvbgpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvTU9EVUxFX0xJQ0VOU0VfUFVCTElDX0RPTUFJTiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL01PRFVMRV9MSUNFTlNFX1BVQkxJQ19ET01BSU4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvTU9EVUxFX0xJQ0VOU0VfUFVCTElDX0RPTUFJTgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9hZnJpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDEway9hZnJpY2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzc1MDYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvYWZyaWNhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0OCArMCwwIEBACi0jIDxwcmU+Ci0jIEAoIylhZnJpY2EJOC4yNwotIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgotIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KLQotIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKLSMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jCi0jIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwotIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCi0jIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCi0jCi0jIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKLSMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0Ci0jIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKLSMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKLSMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCi0jCi0jIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgotIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCi0jCi0jIEFub3RoZXIgc291cmNlIG9jY2FzaW9uYWxseSB1c2VkIGlzIEVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAotIyBXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLCB3aGljaAotIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCi0jCi0jIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcwotIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KLSMKLSMgUHJldmlvdXMgZWRpdGlvbnMgb2YgdGhpcyBkYXRhYmFzZSB1c2VkIFdBVCwgQ0FULCBTQVQsIGFuZCBFQVQKLSMgZm9yICswOjAwIHRocm91Z2ggKzM6MDAsIHJlc3BlY3RpdmVseSwKLSMgYnV0IE1hcmsgUiBWIE11cnJheSByZXBvcnRzIHRoYXQKLSMgYFNBU1QnIGlzIHRoZSBvZmZpY2lhbCBhYmJyZXZpYXRpb24gZm9yICsyOjAwIGluIHRoZSBjb3VudHJ5IG9mIFNvdXRoIEFmcmljYSwKLSMgYENBVCcgaXMgY29tbW9ubHkgdXNlZCBmb3IgKzI6MDAgaW4gY291bnRyaWVzIG5vcnRoIG9mIFNvdXRoIEFmcmljYSwgYW5kCi0jIGBXQVQnIGlzIHByb2JhYmx5IHRoZSBiZXN0IG5hbWUgZm9yICsxOjAwLCBhcyB0aGUgY29tbW9uIHBocmFzZSBmb3IKLSMgdGhlIGFyZWEgdGhhdCBpbmNsdWRlcyBOaWdlcmlhIGlzIGBgV2VzdCBBZnJpY2EnJy4KLSMgSGUgaGFzIGhlYXJkIG9mIGBgV2VzdGVybiBTYWhhcmEgVGltZScnIGZvciArMDowMCBidXQgY2FuIGZpbmQgbm8gcmVmZXJlbmNlLgotIwotIyBUbyBtYWtlIHRoaW5ncyBjb25mdXNpbmcsIGBXQVQnIHNlZW1zIHRvIGhhdmUgYmVlbiB1c2VkIGZvciAtMTowMCBsb25nIGFnbzsKLSMgSSdkIGd1ZXNzIHRoYXQgdGhpcyB3YXMgYmVjYXVzZSBwZW9wbGUgbmVlZGVkIF9zb21lXyBuYW1lIGZvciAtMTowMCwKLSMgYW5kIGF0IHRoZSB0aW1lLCBmYXIgd2VzdCBBZnJpY2Egd2FzIHRoZSBvbmx5IG1ham9yIGxhbmQgYXJlYSBpbiAtMTowMC4KLSMgVGhpcyB1c2FnZSBpcyBub3cgb2Jzb2xldGUsIGFzIHRoZSBsYXN0IHVzZSBvZiAtMTowMCBvbiB0aGUgQWZyaWNhbgotIyBtYWlubGFuZCBzZWVtcyB0byBoYXZlIGJlZW4gMTk3NiBpbiBXZXN0ZXJuIFNhaGFyYS4KLSMKLSMgVG8gc3VtbWFyaXplLCB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbnMgc2VlbSB0byBoYXZlIHNvbWUgY3VycmVuY3k6Ci0jCS0xOjAwCVdBVAlXZXN0IEFmcmljYSBUaW1lIChubyBsb25nZXIgdXNlZCkKLSMJIDA6MDAJR01UCUdyZWVud2ljaCBNZWFuIFRpbWUKLSMJIDI6MDAJQ0FUCUNlbnRyYWwgQWZyaWNhIFRpbWUKLSMJIDI6MDAJU0FTVAlTb3V0aCBBZnJpY2EgU3RhbmRhcmQgVGltZQotIyBhbmQgTXVycmF5IHN1Z2dlc3RzIHRoZSBmb2xsb3dpbmcgYWJicmV2aWF0aW9uOgotIwkgMTowMAlXQVQJV2VzdCBBZnJpY2EgVGltZQotIyBJIHJlYWxpemUgdGhhdCB0aGlzIGxlYWRzIHRvIGBXQVQnIGJlaW5nIHVzZWQgZm9yIGJvdGggLTE6MDAgYW5kIDE6MDAKLSMgZm9yIHRpbWVzIGJlZm9yZSAxOTc2LCBidXQgdGhpcyBpcyB0aGUgYmVzdCBJIGNhbiB0aGluayBvZgotIyB1bnRpbCB3ZSBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLSMgSSBpbnZlbnRlZCB0aGUgZm9sbG93aW5nIGFiYnJldmlhdGlvbnM7IGNvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQotIwkgMjowMAlXQVNUCVdlc3QgQWZyaWNhIFN1bW1lciBUaW1lCi0jCSAyOjMwCUJFQVQJQnJpdGlzaCBFYXN0IEFmcmljYSBUaW1lIChubyBsb25nZXIgdXNlZCkKLSMJIDI6NDQ6NDUgQkVBVVQJQnJpdGlzaCBFYXN0IEFmcmljYSBVbmlmaWVkIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotIwkgMzowMAlDQVNUCUNlbnRyYWwgQWZyaWNhIFN1bW1lciBUaW1lIChubyBsb25nZXIgdXNlZCkKLSMJIDM6MDAJU0FTVAlTb3V0aCBBZnJpY2EgU3VtbWVyIFRpbWUgKG5vIGxvbmdlciB1c2VkKQotIwkgMzowMAlFQVQJRWFzdCBBZnJpY2EgVGltZQotIwkgNDowMAlFQVNUCUVhc3QgQWZyaWNhIFN1bW1lciBUaW1lIChubyBsb25nZXIgdXNlZCkKLQotIyBBbGdlcmlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBbGdlcmlhCTE5MTYJb25seQktCUp1bgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTkxNgkxOTE5CS0JT2N0CVN1bj49MQkyMzowMHMJMAktCi1SdWxlCUFsZ2VyaWEJMTkxNwlvbmx5CS0JTWFyCTI0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTE4CW9ubHkJLQlNYXIJIDkJMjM6MDBzCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5MTkJb25seQktCU1hcgkgMQkyMzowMHMJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTIwCW9ubHkJLQlPY3QJMjMJMjM6MDBzCTAJLQotUnVsZQlBbGdlcmlhCTE5MjEJb25seQktCU1hcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTkyMQlvbmx5CS0JSnVuCTIxCTIzOjAwcwkwCS0KLVJ1bGUJQWxnZXJpYQkxOTM5CW9ubHkJLQlTZXAJMTEJMjM6MDBzCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5MzkJb25seQktCU5vdgkxOQkgMTowMAkwCS0KLVJ1bGUJQWxnZXJpYQkxOTQ0CTE5NDUJLQlBcHIJTW9uPj0xCSAyOjAwCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5NDQJb25seQktCU9jdAkgOAkgMjowMAkwCS0KLVJ1bGUJQWxnZXJpYQkxOTQ1CW9ubHkJLQlTZXAJMTYJIDE6MDAJMAktCi1SdWxlCUFsZ2VyaWEJMTk3MQlvbmx5CS0JQXByCTI1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTcxCW9ubHkJLQlTZXAJMjYJMjM6MDBzCTAJLQotUnVsZQlBbGdlcmlhCTE5NzcJb25seQktCU1heQkgNgkgMDowMAkxOjAwCVMKLVJ1bGUJQWxnZXJpYQkxOTc3CW9ubHkJLQlPY3QJMjEJIDA6MDAJMAktCi1SdWxlCUFsZ2VyaWEJMTk3OAlvbmx5CS0JTWFyCTI0CSAxOjAwCTE6MDAJUwotUnVsZQlBbGdlcmlhCTE5NzgJb25seQktCVNlcAkyMgkgMzowMAkwCS0KLVJ1bGUJQWxnZXJpYQkxOTgwCW9ubHkJLQlBcHIJMjUJIDA6MDAJMTowMAlTCi1SdWxlCUFsZ2VyaWEJMTk4MAlvbmx5CS0JT2N0CTMxCSAyOjAwCTAJLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwOjA5OjIwIGZvciBQYXJpcyBNZWFuIFRpbWU7IGdvIHdpdGggSG93c2UncwotIyBtb3JlIHByZWNpc2UgMDowOToyMS4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0FsZ2llcnMJMDoxMjoxMiAtCUxNVAkxODkxIE1hciAxNSAwOjAxCi0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCi0JCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk0MCBGZWIgMjUgMjowMAotCQkJMTowMAlBbGdlcmlhCUNFJXNUCTE5NDYgT2N0ICA3Ci0JCQkwOjAwCS0JV0VUCTE5NTYgSmFuIDI5Ci0JCQkxOjAwCS0JQ0VUCTE5NjMgQXByIDE0Ci0JCQkwOjAwCUFsZ2VyaWEJV0Ulc1QJMTk3NyBPY3QgMjEKLQkJCTE6MDAJQWxnZXJpYQlDRSVzVAkxOTc5IE9jdCAyNgotCQkJMDowMAlBbGdlcmlhCVdFJXNUCTE5ODEgTWF5Ci0JCQkxOjAwCS0JQ0VUCi0KLSMgQW5nb2xhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9MdWFuZGEJMDo1Mjo1NgktCUxNVAkxODkyCi0JCQkwOjUyOjA0CS0JQU9UCTE5MTEgTWF5IDI2ICMgQW5nb2xhIFRpbWUKLQkJCTE6MDAJLQlXQVQKLQotIyBCZW5pbgotIyBXaGl0bWFuIHNheXMgdGhleSBzd2l0Y2hlZCB0byAxOjAwIGluIDE5NDYsIG5vdCAxOTM0OwotIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL1BvcnRvLU5vdm8JMDoxMDoyOAktCUxNVAkxOTEyCi0JCQkwOjAwCS0JR01UCTE5MzQgRmViIDI2Ci0JCQkxOjAwCS0JV0FUCi0KLSMgQm90c3dhbmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0dhYm9yb25lCTE6NDM6NDAgLQlMTVQJMTg4NQotCQkJMjowMAktCUNBVAkxOTQzIFNlcCAxOSAyOjAwCi0JCQkyOjAwCTE6MDAJQ0FTVAkxOTQ0IE1hciAxOSAyOjAwCi0JCQkyOjAwCS0JQ0FUCi0KLSMgQnVya2luYSBGYXNvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9PdWFnYWRvdWdvdQktMDowNjowNCAtCUxNVAkxOTEyCi0JCQkgMDowMAktCUdNVAotCi0jIEJ1cnVuZGkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL0J1anVtYnVyYQkxOjU3OjI4CS0JTE1UCTE4OTAKLQkJCTI6MDAJLQlDQVQKLQotIyBDYW1lcm9vbgotIyBXaGl0bWFuIHNheXMgdGhleSBzd2l0Y2hlZCB0byAxOjAwIGluIDE5MjA7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvRG91YWxhCTA6Mzg6NDgJLQlMTVQJMTkxMgotCQkJMTowMAktCVdBVAotCi0jIENhcGUgVmVyZGUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvQ2FwZV9WZXJkZSAtMTozNDowNCAtCUxNVAkxOTA3CQkJIyBQcmFpYQotCQkJLTI6MDAJLQlDVlQJMTk0MiBTZXAKLQkJCS0yOjAwCTE6MDAJQ1ZTVAkxOTQ1IE9jdCAxNQotCQkJLTI6MDAJLQlDVlQJMTk3NSBOb3YgMjUgMjowMAotCQkJLTE6MDAJLQlDVlQKLQotIyBDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0Jhbmd1aQkxOjE0OjIwCS0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKLQotIyBDaGFkCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9OZGphbWVuYQkxOjAwOjEyIC0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQJMTk3OSBPY3QgMTQKLQkJCTE6MDAJMTowMAlXQVNUCTE5ODAgTWFyICA4Ci0JCQkxOjAwCS0JV0FUCi0KLSMgQ29tb3JvcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vQ29tb3JvCTI6NTM6MDQgLQlMTVQJMTkxMSBKdWwgICAjIE1vcm9uaSwgR3JhbiBDb21vcm8KLQkJCTM6MDAJLQlFQVQKLQotIyBEZW1vY3JhdGljIFJlcHVibGljIG9mIENvbmdvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9LaW5zaGFzYQkxOjAxOjEyIC0JTE1UCTE4OTcgTm92IDkKLQkJCTE6MDAJLQlXQVQKLVpvbmUgQWZyaWNhL0x1YnVtYmFzaGkJMTo0OTo1MiAtCUxNVAkxODk3IE5vdiA5Ci0JCQkyOjAwCS0JQ0FUCi0KLSMgUmVwdWJsaWMgb2YgdGhlIENvbmdvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9CcmF6emF2aWxsZQkxOjAxOjA4IC0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKLQotIyBDb3RlIEQnSXZvaXJlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9BYmlkamFuCS0wOjE2OjA4IC0JTE1UCTE5MTIKLQkJCSAwOjAwCS0JR01UCi0KLSMgRGppYm91dGkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0RqaWJvdXRpCTI6NTI6MzYgLQlMTVQJMTkxMSBKdWwKLQkJCTM6MDAJLQlFQVQKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEVneXB0Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUVneXB0CTE5NDAJb25seQktCUp1bAkxNQkwOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTQwCW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJRWd5cHQJMTk0MQlvbmx5CS0JQXByCTE1CTA6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5NDEJb25seQktCVNlcAkxNgkwOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTQyCTE5NDQJLQlBcHIJIDEJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk0Mglvbmx5CS0JT2N0CTI3CTA6MDAJMAktCi1SdWxlCUVneXB0CTE5NDMJMTk0NQktCU5vdgkgMQkwOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTQ1CW9ubHkJLQlBcHIJMTYJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk1Nwlvbmx5CS0JTWF5CTEwCTA6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5NTcJMTk1OAktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTU4CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk1OQkxOTgxCS0JTWF5CSAxCTE6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5NTkJMTk2NQktCVNlcAkzMAkzOjAwCTAJLQotUnVsZQlFZ3lwdAkxOTY2CTE5OTQJLQlPY3QJIDEJMzowMAkwCS0KLVJ1bGUJRWd5cHQJMTk4Mglvbmx5CS0JSnVsCTI1CTE6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5ODMJb25seQktCUp1bAkxMgkxOjAwCTE6MDAJUwotUnVsZQlFZ3lwdAkxOTg0CTE5ODgJLQlNYXkJIDEJMTowMAkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk4OQlvbmx5CS0JTWF5CSA2CTE6MDAJMTowMAlTCi1SdWxlCUVneXB0CTE5OTAJMTk5NAktCU1heQkgMQkxOjAwCTE6MDAJUwotIyBJQVRBIChhZnRlciAxOTkwKSBzYXlzIHRyYW5zaXRpb25zIGFyZSBhdCAwOjAwLgotIyBHbyB3aXRoIElBVEEgc3RhcnRpbmcgaW4gMTk5NSwgZXhjZXB0IGNvcnJlY3QgMTk5NSBlbnRyeSBmcm9tIDA5LTMwIHRvIDA5LTI5LgotUnVsZQlFZ3lwdAkxOTk1CW1heAktCUFwcglsYXN0RnJpCSAwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMTk5NQkyMDA1CS0JU2VwCWxhc3RUaHUJMjM6MDBzCTAJLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOS0xOSk6Ci0jIFRoZSBFZ3lwdGlhbiBHYXpldHRlLCBpc3N1ZSA0MSwwOTAgKDIwMDYtMDktMTgpLCBwYWdlIDEsIHJlcG9ydHM6Ci0jIEVneXB0IHdpbGwgdHVybiBiYWNrIGNsb2NrcyBieSBvbmUgaG91ciBhdCB0aGUgbWlkbmlnaHQgb2YgVGh1cnNkYXkKLSMgYWZ0ZXIgb2JzZXJ2aW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBzaW5jZSBNYXkuCi0jIGh0dHA6Ly9uZXdzLmdvbS5jb20uZWcvZ2F6ZXR0ZS9wZGYvMjAwNi8wOS8xOC8wMS5wZGYKLVJ1bGUJRWd5cHQJMjAwNglvbmx5CS0JU2VwCTIxCTIzOjAwcwkwCS0KLSMgRnJvbSBEaXJrIExvc2NoICgyMDA3LTA4LTE0KToKLSMgSSByZWNlaXZlZCBhIG1haWwgZnJvbSBhbiBhaXJsaW5lIHdoaWNoIHNheXMgdGhhdCB0aGUgZGF5bGlnaHQKLSMgc2F2aW5nIHRpbWUgaW4gRWd5cHQgd2lsbCBlbmQgaW4gdGhlIG5pZ2h0IG9mIDIwMDctMDktMDYgdG8gMjAwNy0wOS0wNy4KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDctMDgtMTUpOiBbVGhlIGZvbGxvd2luZyBhZ3JlZTpdCi0jIGh0dHA6Ly93d3cubmVudGplcy5pbmZvL0JpbGwvYmlsbDUuaHRtIAotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL2NpdHkuaHRtbD9uPTUzCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTA5LTA0KTogVGhlIG9mZmljaWFsIGluZm9ybWF0aW9uLi4uOgotIyBodHRwOi8vd3d3LnNpcy5nb3YuZWcvRW4vRWd5cHRPbmxpbmUvTWlzY2VsbGFuZW91cy8wMDAwMDIvMDIwNzAwMDAwMDAwMDAwMDAwMTU4MC5odG0KLVJ1bGUJRWd5cHQJMjAwNwlvbmx5CS0JU2VwCVRodT49MQkyMzowMHMJMAktCi0jIEZyb20gQWJkZWxyYWhtYW4gSGFzc2FuICgyMDA3LTA5LTA2KToKLSMgRHVlIHRvIHRoZSBIaWpyaSAobHVuYXIgSXNsYW1pYyBjYWxlbmRhcikgeWVhciBiZWluZyAxMSBkYXlzIHNob3J0ZXIKLSMgdGhhbiB0aGUgeWVhciBvZiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyLCBSYW1hZGFuIHNoaWZ0cyBlYXJsaWVyIGVhY2gKLSMgeWVhci4gVGhpcyB5ZWFyIGl0IHdpbGwgYmUgb2JzZXJ2ZWQgU2VwdGVtYmVyIDEzIChTZXB0ZW1iZXIgaXMgcXVpdGUKLSMgaG90IGluIEVneXB0KSwgYW5kIHRoZSBpZGVhIGlzIHRvIG1ha2UgZmFzdGluZyBlYXNpZXIgZm9yIHdvcmtlcnMgYnkKLSMgc2hpZnRpbmcgYnVzaW5lc3MgaG91cnMgb25lIGhvdXIgb3V0IG9mIGRheXRpbWUgaGVhdC4gQ29uc2VxdWVudGx5LAotIyB1bmxlc3MgZGlzY29udGludWVkLCBuZXh0IERTVCBtYXkgZW5kIFRodXJzZGF5IDI4IEF1Z3VzdCAyMDA4LgotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA4LTE3KToKLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGFzc3VtZSB0aGUgbmV3IHJ1bGUgaXMgbGFzdCBUaHVyc2RheSBpbiBBdWd1c3QuCi0KLSMgRnJvbSBQZXRyIE1hY2hhdGEgKDIwMDktMDQtMDYpOgotIyBUaGUgZm9sbG93aW5nIGFwcGVhcmVkIGluIFJlZCBIYXQgYnVnemlsbGFbMV0gKGVkaXRlZCk6Ci0jCi0jID4gJCB6ZHVtcCAtdiAvdXNyL3NoYXJlL3pvbmVpbmZvL0FmcmljYS9DYWlybyB8IGdyZXAgMjAwOQotIyA+IC91c3Ivc2hhcmUvem9uZWluZm8vQWZyaWNhL0NhaXJvICBUaHUgQXByIDIzIDIxOjU5OjU5IDIwMDkgVVRDID0gVGh1ID0KLSMgQXByIDIzCi0jID4gMjM6NTk6NTkgMjAwOSBFRVQgaXNkc3Q9MCBnbXRvZmY9NzIwMAotIyA+IC91c3Ivc2hhcmUvem9uZWluZm8vQWZyaWNhL0NhaXJvICBUaHUgQXByIDIzIDIyOjAwOjAwIDIwMDkgVVRDID0gRnJpID0KLSMgQXByIDI0Ci0jID4gMDE6MDA6MDAgMjAwOSBFRVNUIGlzZHN0PTEgZ210b2ZmPTEwODAwCi0jID4gL3Vzci9zaGFyZS96b25laW5mby9BZnJpY2EvQ2Fpcm8gIFRodSBBdWcgMjcgMjA6NTk6NTkgMjAwOSBVVEMgPSBUaHUgPQotIyBBdWcgMjcKLSMgPiAyMzo1OTo1OSAyMDA5IEVFU1QgaXNkc3Q9MSBnbXRvZmY9MTA4MDAKLSMgPiAvdXNyL3NoYXJlL3pvbmVpbmZvL0FmcmljYS9DYWlybyAgVGh1IEF1ZyAyNyAyMTowMDowMCAyMDA5IFVUQyA9IFRodSA9Ci0jIEF1ZyAyNwotIyA+IDIzOjAwOjAwIDIwMDkgRUVUIGlzZHN0PTAgZ210b2ZmPTcyMDAKLSMKLSMgPiBlbmQgZGF0ZSBzaG91bGQgYmUgVGh1IFNlcCAyNCAyMDA5IChMYXN0IFRodXJzZGF5IGluIFNlcHRlbWJlciBhdCAyMzo1OT0KLSMgOjU5KQotIyA+IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvOTU4NzI5LwotIwotIyB0aW1lYW5kZGF0ZVsyXSBhbmQgYW5vdGhlciBzaXRlIEkndmUgZm91bmRbM10gYWxzbyBzdXBwb3J0IHRoYXQuCi0jCi0jIFsxXSA8YSBocmVmPSJodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ5MjI2MyI+Ci0jIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMjYzCi0jIDwvYT4KLSMgWzJdIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2xvY2tjaGFuZ2UuaHRtbD9uPTUzIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay9jbG9ja2NoYW5nZS5odG1sP249NTMKLSMgPC9hPgotIyBbM10gPGEgaHJlZj0iaHR0cDovL3d3cC5ncmVlbndpY2htZWFudGltZS5jb20vdGltZS16b25lL2FmcmljYS9lZ3lwdC8iPgotIyBodHRwOi8vd3dwLmdyZWVud2ljaG1lYW50aW1lLmNvbS90aW1lLXpvbmUvYWZyaWNhL2VneXB0LwotIyA8L2E+Ci0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDQtMjApOgotIyBJbiAyMDA5IChhbmQgZm9yIHRoZSBuZXh0IHNldmVyYWwgeWVhcnMpLCBSYW1hZGFuIGVuZHMgYmVmb3JlIHRoZSBmb3VydGgKLSMgVGh1cnNkYXkgaW4gU2VwdGVtYmVyOyBFZ3lwdCBpcyBleHBlY3RlZCB0byByZXZlcnQgdG8gdGhlIGxhc3QgVGh1cnNkYXkKLSMgaW4gU2VwdGVtYmVyLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA4LTExKToKLSMgV2UgaGF2ZSBiZWVuIGFibGUgdG8gY29uZmlybSB0aGUgQXVndXN0IGNoYW5nZSB3aXRoIHRoZSBFZ3lwdGlhbiBDYWJpbmV0IAotIyBJbmZvcm1hdGlvbiBhbmQgRGVjaXNpb24gU3VwcG9ydCBDZW50ZXI6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9lZ3lwdC1kc3QtZW5kcy0yMDA5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvZWd5cHQtZHN0LWVuZHMtMjAwOS5odG1sCi0jIDwvYT4KLSMgCi0jIFRoZSBNaWRkbGUgRWFzdCBOZXdzIEFnZW5jeQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgiPgotIyBodHRwOi8vd3d3Lm1lbmEub3JnLmVnL2luZGV4LmFzcHgKLSMgPC9hPgotIyBhbHNvIHJlcG9ydHMgIkVneXB0IHN0YXJ0cyB3aW50ZXIgdGltZSBvbiBBdWd1c3QgMjEiCi0jIHRvZGF5IGluIGFydGljbGUgbnVtYmVyZWQgIjcxLCAxMS8wOC8yMDA5IDEyOjI1IEdNVC4iIAotIyBPbmx5IHRoZSB0aXRsZSBhYm92ZSBpcyBhdmFpbGFibGUgd2l0aG91dCBhIHN1YnNjcmlwdGlvbiB0byB0aGVpciBzZXJ2aWNlLAotIyBhbmQgY2FuIGJlIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3IgIndpbnRlciIgaW4gdGhlaXIgc2VhcmNoIGVuZ2luZQotIyAoYXQgbGVhc3QgdG9kYXkpLgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDEwLTA3LTIwKToKLSMgQWNjb3JkaW5nIHRvIE5ld3MgZnJvbSBFZ3lwdCAtICBBbC1NYXNyeSBBbC1Zb3VtIEVneXB0J3MgY2FiaW5ldCBoYXMKLSMgZGVjaWRlZCB0aGF0IERheWxpZ2h0IFNhdmluZyBUaW1lIHdpbGwgbm90IGJlIHVzZWQgaW4gRWd5cHQgZHVyaW5nCi0jIFJhbWFkYW4uCi0jCi0jIEFyYWJpYyB0cmFuc2xhdGlvbjoKLSMgIkNsb2NrcyB0byBnbyBiYWNrIGR1cmluZyBSYW1hZGFuLS1hbmQgdGhlbiBmb3J3YXJkIGFnYWluIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFsbWFzcnlhbHlvdW0uY29tL2VuL25ld3MvY2xvY2tzLWdvLWJhY2stZHVyaW5nLXJhbWFkYW4tYW5kLXRoZW4tZm9yd2FyZC1hZ2FpbiI+Ci0jIGh0dHA6Ly93d3cuYWxtYXNyeWFseW91bS5jb20vZW4vbmV3cy9jbG9ja3MtZ28tYmFjay1kdXJpbmctcmFtYWRhbi1hbmQtdGhlbi1mb3J3YXJkLWFnYWluCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19lZ3lwdDAyLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2VneXB0MDIuaHRtbAotIyA8L2E+Ci0KLVJ1bGUJRWd5cHQJMjAwOAlvbmx5CS0JQXVnCWxhc3RUaHUJMjM6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDA5CW9ubHkJLQlBdWcJMjAJMjM6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlBdWcJMTAJMjM6MDBzCTAJLQotUnVsZQlFZ3lwdAkyMDEwCW9ubHkJLQlTZXAJOQkwOjAwcwkxOjAwCVMKLVJ1bGUJRWd5cHQJMjAxMAltYXgJLQlTZXAJbGFzdFRodQkyMzowMHMJMAktCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0NhaXJvCTI6MDU6MDAgLQlMTVQJMTkwMCBPY3QKLQkJCTI6MDAJRWd5cHQJRUUlc1QKLQotIyBFcXVhdG9yaWFsIEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTWFsYWJvCTA6MzU6MDggLQlMTVQJMTkxMgotCQkJMDowMAktCUdNVAkxOTYzIERlYyAxNQotCQkJMTowMAktCVdBVAotCi0jIEVyaXRyZWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0FzbWFyYQkyOjM1OjMyIC0JTE1UCTE4NzAKLQkJCTI6MzU6MzIJLQlBTVQJMTg5MAkgICAgICAjIEFzbWFyYSBNZWFuIFRpbWUKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKLQkJCTM6MDAJLQlFQVQKLQotIyBFdGhpb3BpYQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgRXRoaW9waWEgaGFkIHNpeCBuYXJyb3dseS1zcGFjZWQgdGltZSB6b25lcwotIyBiZXR3ZWVuIDE4NzAgYW5kIDE4OTAsIGFuZCB0aGF0IHRoZXkgbWVyZ2VkIHRvIDM4RTUwICgyOjM1OjIwKSBpbiAxODkwLgotIyBXZSdsbCBndWVzcyB0aGF0IDM4RTUwIGlzIGZvciBBZGlzIERlcmEuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9BZGRpc19BYmFiYQkyOjM0OjQ4IC0JTE1UCTE4NzAKLQkJCTI6MzU6MjAJLQlBRE1UCTE5MzYgTWF5IDUgICAgIyBBZGlzIERlcmEgTVQKLQkJCTM6MDAJLQlFQVQKLQotIyBHYWJvbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvTGlicmV2aWxsZQkwOjM3OjQ4IC0JTE1UCTE5MTIKLQkJCTE6MDAJLQlXQVQKLQotIyBHYW1iaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0Jhbmp1bAktMTowNjozNiAtCUxNVAkxOTEyCi0JCQktMTowNjozNiAtCUJNVAkxOTM1CSMgQmFuanVsIE1lYW4gVGltZQotCQkJLTE6MDAJLQlXQVQJMTk2NAotCQkJIDA6MDAJLQlHTVQKLQotIyBHaGFuYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBzYXlzIERTVCB3YXMgb2JzZXJ2ZWQgZnJvbSAxOTMxIHRvIGBgdGhlIHByZXNlbnQnJzsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUdoYW5hCTE5MzYJMTk0MgktCVNlcAkgMQkwOjAwCTA6MjAJR0hTVAotUnVsZQlHaGFuYQkxOTM2CTE5NDIJLQlEZWMJMzEJMDowMAkwCUdNVAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQWNjcmEJLTA6MDA6NTIgLQlMTVQJMTkxOAotCQkJIDA6MDAJR2hhbmEJJXMKLQotIyBHdWluZWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0NvbmFrcnkJLTA6NTQ6NTIgLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAKLQkJCSAwOjAwCS0JR01UCi0KLSMgR3VpbmVhLUJpc3NhdQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvQmlzc2F1CS0xOjAyOjIwIC0JTE1UCTE5MTEgTWF5IDI2Ci0JCQktMTowMAktCVdBVAkxOTc1Ci0JCQkgMDowMAktCUdNVAotCi0jIEtlbnlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9OYWlyb2JpCTI6Mjc6MTYJLQlMTVQJMTkyOCBKdWwKLQkJCTM6MDAJLQlFQVQJMTkzMAotCQkJMjozMAktCUJFQVQJMTk0MAotCQkJMjo0NDo0NQktCUJFQVVUCTE5NjAKLQkJCTM6MDAJLQlFQVQKLQotIyBMZXNvdGhvCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9NYXNlcnUJMTo1MDowMCAtCUxNVAkxOTAzIE1hcgotCQkJMjowMAktCVNBU1QJMTk0MyBTZXAgMTkgMjowMAotCQkJMjowMAkxOjAwCVNBU1QJMTk0NCBNYXIgMTkgMjowMAotCQkJMjowMAktCVNBU1QKLQotIyBMaWJlcmlhCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBJbiAxOTcyIExpYmVyaWEgd2FzIHRoZSBsYXN0IGNvdW50cnkgdG8gc3dpdGNoCi0jIGZyb20gYSBVVEMgb2Zmc2V0IHRoYXQgd2FzIG5vdCBhIG11bHRpcGxlIG9mIDE1IG9yIDIwIG1pbnV0ZXMuCi0jIEhvd3NlIHJlcG9ydHMgdGhhdCBpdCB3YXMgaW4gaG9ub3Igb2YgdGhlaXIgcHJlc2lkZW50J3MgYmlydGhkYXkuCi0jIFNoYW5rICYgUG90dGVuZ2VyIHJlcG9ydCB0aGUgZGF0ZSBhcyBNYXkgMSwgd2hlcmVhcyBIb3dzZSByZXBvcnRzIEphbjsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIEZvciBMaWJlcmlhIGJlZm9yZSAxOTcyLCBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IC0wOjQ0LCB3aGVyZWFzIEhvd3NlIGFuZAotIyBXaGl0bWFuIGVhY2ggcmVwb3J0IC0wOjQ0OjMwOyBnbyB3aXRoIHRoZSBtb3JlIHByZWNpc2UgZmlndXJlLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTW9ucm92aWEJLTA6NDM6MDggLQlMTVQJMTg4MgotCQkJLTA6NDM6MDggLQlNTVQJMTkxOSBNYXIgIyBNb25yb3ZpYSBNZWFuIFRpbWUKLQkJCS0wOjQ0OjMwIC0JTFJUCTE5NzIgTWF5ICMgTGliZXJpYSBUaW1lCi0JCQkgMDowMAktCUdNVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTGlieWEKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTGlieWEJMTk1MQlvbmx5CS0JT2N0CTE0CTI6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5NTIJb25seQktCUphbgkgMQkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTUzCW9ubHkJLQlPY3QJIDkJMjowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk1NAlvbmx5CS0JSmFuCSAxCTA6MDAJMAktCi1SdWxlCUxpYnlhCTE5NTUJb25seQktCVNlcAkzMAkwOjAwCTE6MDAJUwotUnVsZQlMaWJ5YQkxOTU2CW9ubHkJLQlKYW4JIDEJMDowMAkwCS0KLVJ1bGUJTGlieWEJMTk4MgkxOTg0CS0JQXByCSAxCTA6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5ODIJMTk4NQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTg1CW9ubHkJLQlBcHIJIDYJMDowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk4Nglvbmx5CS0JQXByCSA0CTA6MDAJMTowMAlTCi1SdWxlCUxpYnlhCTE5ODYJb25seQktCU9jdAkgMwkwOjAwCTAJLQotUnVsZQlMaWJ5YQkxOTg3CTE5ODkJLQlBcHIJIDEJMDowMAkxOjAwCVMKLVJ1bGUJTGlieWEJMTk4NwkxOTg5CS0JT2N0CSAxCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9Ucmlwb2xpCTA6NTI6NDQgLQlMTVQJMTkyMAotCQkJMTowMAlMaWJ5YQlDRSVzVAkxOTU5Ci0JCQkyOjAwCS0JRUVUCTE5ODIKLQkJCTE6MDAJTGlieWEJQ0Ulc1QJMTk5MCBNYXkgIDQKLSMgVGhlIGZvbGxvd2luZyBlbnRyaWVzIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjsKLSMgdGhlIElBVEEgU1NJTSBkYXRhIGNvbnRhaW4gc29tZSBvYnZpb3VzIGVycm9ycy4KLQkJCTI6MDAJLQlFRVQJMTk5NiBTZXAgMzAKLQkJCTE6MDAJLQlDRVQJMTk5NyBBcHIgIDQKLQkJCTE6MDAJMTowMAlDRVNUCTE5OTcgT2N0ICA0Ci0JCQkyOjAwCS0JRUVUCi0KLSMgTWFkYWdhc2NhcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBJbmRpYW4vQW50YW5hbmFyaXZvIDM6MTA6MDQgLQlMTVQJMTkxMSBKdWwKLQkJCTM6MDAJLQlFQVQJMTk1NCBGZWIgMjcgMjM6MDBzCi0JCQkzOjAwCTE6MDAJRUFTVAkxOTU0IE1heSAyOSAyMzowMHMKLQkJCTM6MDAJLQlFQVQKLQotIyBNYWxhd2kKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0JsYW50eXJlCTI6MjA6MDAgLQlMTVQJMTkwMyBNYXIKLQkJCTI6MDAJLQlDQVQKLQotIyBNYWxpCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9CYW1ha28JLTA6MzI6MDAgLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAgSnVuIDIwCi0JCQkgMDowMAktCUdNVAotCi0jIE1hdXJpdGFuaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL05vdWFrY2hvdHQJLTE6MDM6NDggLQlMTVQJMTkxMgotCQkJIDA6MDAJLQlHTVQJMTkzNCBGZWIgMjYKLQkJCS0xOjAwCS0JV0FUCTE5NjAgTm92IDI4Ci0JCQkgMDowMAktCUdNVAotCi0jIE1hdXJpdGl1cwotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA2LTI1KToKLSMgTWF1cml0aXVzIHBsYW5zIHRvIG9ic2VydmUgRFNUIGZyb20gMjAwOC0xMS0wMSB0byAyMDA5LTAzLTMxIG9uIGEgdHJpYWwKLSMgYmFzaXMuLi4uCi0jIEl0IHNlZW1zIHRoYXQgTWF1cml0aXVzIG9ic2VydmVkIGRheWxpZ2h0IHNhdmluZyB0aW1lIGZyb20gMTk4Mi0xMC0xMCB0byAKLSMgMTk4My0wMy0yMCBhcyB3ZWxsLCBidXQgdGhhdCB3YXMgbm90IHN1Y2Nlc3NmdWwuLi4uCi0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tYXVyaXRpdXMtZGF5bGlnaHQtc2F2aW5nLXRpbWUuaHRtbAotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNi0yNSk6Ci0jIGh0dHA6Ly9lY29ub21pY2RldmVsb3BtZW50Lmdvdi5tdS9wb3J0YWwvc2l0ZS9NYWluaG9tZXBhZ2UvbWVudWl0ZW0uYTQyYjI0MTI4MTA0ZDk4NDVkYWJkZGQxNTQ1MDhhMGMvP2NvbnRlbnRfaWQ9MGE3Y2VlOGI1ZDY5YTExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA2LTMwKToKLSMgVGhlIHd3dy50aW1lYW5kZGF0ZS5jb20gYXJ0aWNsZSBjaXRlZCBieSBTdGVmZmVuIFRob3JzZW4gbm90ZXMgdGhhdCAiQQotIyBmaW5hbCBkZWNpc2lvbiBoYXMgeWV0IHRvIGJlIG1hZGUgb24gdGhlIHRpbWVzIHRoYXQgZGF5bGlnaHQgc2F2aW5nCi0jIHdvdWxkIGJlZ2luIGFuZCBlbmQgb24gdGhlc2UgZGF0ZXMuIiBBcyBhIHBsYWNlIGhvbGRlciwgdXNlIG1pZG5pZ2h0LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDYtMzApOgotIyBGb2xsb3cgVGhvcnNlbiBvbiBEU1QgaW4gMTk4Mi8xOTgzLCBpbnN0ZWFkIG9mIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wNy0xMCk6Ci0jIEFjY29yZGluZyB0bwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYiPgotIyBodHRwOi8vd3d3LmxleHByZXNzLm11L2Rpc3BsYXlfYXJ0aWNsZS5waHA/bmV3c19pZD0xMTEyMTYKLSMgPC9hPgotIyAoaW4gRnJlbmNoKSwgTWF1cml0aXVzIHdpbGwgc3RhcnQgYW5kIGVuZCB0aGVpciBEU1QgYSBmZXcgZGF5cyBlYXJsaWVyCi0jIHRoYW4gcHJldmlvdXNseSBhbm5vdW5jZWQgKDIwMDgtMTEtMDEgdG8gMjAwOS0wMy0zMSkuICBUaGUgbmV3IHN0YXJ0Ci0jIGRhdGUgaXMgMjAwOC0xMC0yNiBhdCAwMjowMCBhbmQgdGhlIG5ldyBlbmQgZGF0ZSBpcyAyMDA5LTAzLTI3IChubyB0aW1lCi0jIGdpdmVuLCBidXQgaXQgaXMgcHJvYmFibHkgYXQgZWl0aGVyIDIgb3IgMyB3YWxsIGNsb2NrIHRpbWUpLgotIyAKLSMgQSBsaXR0bGUgc3RyYW5nZSB0aG91Z2gsIHNpbmNlIHRoZSBhcnRpY2xlIHNheXMgdGhhdCB0aGV5IG1vdmVkIHRoZSBkYXRlIAotIyB0byBhbGlnbiBpdHNlbGYgd2l0aCBFdXJvcGUgYW5kIFVTQSB3aGljaCBhbHNvIGNoYW5nZSB0aW1lIG9uIHRoYXQgZGF0ZSwgCi0jIGJ1dCB0aGF0IG1lYW5zIHRoZXkgaGF2ZSBub3QgcGFpZCBhdHRlbnRpb24gdG8gd2hhdCBoYXBwZW5lZCBpbiAKLSMgVVNBL0NhbmFkYSBsYXN0IHllYXIgKERTVCBlbmRzIGZpcnN0IFN1bmRheSBpbiBOb3ZlbWJlcikuIEkgYWxzbyB3b25kZXIgCi0jIHdoeSB0aGF0IHRoZXkgZW5kIG9uIGEgRnJpZGF5LCBpbnN0ZWFkIG9mIGFsaWduaW5nIHdpdGggRXVyb3BlIHdoaWNoIAotIyBjaGFuZ2VzIHR3byBkYXlzIGxhdGVyLgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNy0xMSk6Ci0jIFNlZW1zIHRoYXQgRW5nbGlzaCBsYW5ndWFnZSBhcnRpY2xlICJUaGUgcmV2aXZhbCBvZiBkYXlsaWdodCBzYXZpbmcKLSMgdGltZTogIEVuZXJneSBjb25zZXJ2YXRpb24/Ii0jIE5vLiAxNjU3OCAoMDcvMTEvMjAwOCkgd2FzIG9yaWdpbmFsbHkKLSMgcHVibGlzaGVkIG9uIE1vbmRheSwgSnVuZSAzMCwgMjAwOC4uLgotIwotIyBJIGd1ZXNzIHRoYXQgYXJ0aWNsZSBpbiBGcmVuY2ggIkxlIGdvdXZlcm5lbWVudCBhdmFuY2UgbCdpbnRyb2R1Y3Rpb24KLSMgZGUgbCdoZXVyZSBkJ2V0ZSIgc3RhdGluZyB0aGF0IERTVCBpbiBNYXVyaXRpdXMgc3RhcnRpbmcgb24gT2N0b2JlciAyNgotIyBhbmQgZW5kaW5nIG9uIE1hcmNoIDI3LCAyMDA5IGlzIHRoZSBtb3N0IHJlY2VudCBvbmUuCi0jIC4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21hdXJpdGl1czAyLmh0bWwKLSMgPC9hPgotCi0jIEZyb20gUmlhZCBNLiBIb3NzZW4gQWxseSAoMjAwOC0wOC0wMyk6Ci0jIFRoZSBHb3Zlcm5tZW50IG9mIE1hdXJpdGl1cyB3ZWJsaW5rCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRCI+Ci0jIGh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9zaXRlL3Btb3NpdGUvbWVudWl0ZW0uNGNhMGVmZGVlNDc0NjJlNzQ0MGE2MDAyNDhhNTIxY2EvP2NvbnRlbnRfaWQ9NDcyOGNhNjhiMmE1YjExMFZnblZDTTEwMDAwMDBhMDRhOGMwUkNSRAotIyA8L2E+Ci0jIENhYmluZXQgRGVjaXNpb24gb2YgSnVseSAxOHRoLCAyMDA4IHN0YXRlcyBhcyBmb2xsb3dzOgotIwotIyA0LiAuLi5DYWJpbmV0IGhhcyBhZ3JlZWQgdG8gdGhlIGludHJvZHVjdGlvbiBpbnRvIHRoZSBOYXRpb25hbCBBc3NlbWJseQotIyBvZiB0aGUgVGltZSBCaWxsIHdoaWNoIHByb3ZpZGVzIGZvciB0aGUgaW50cm9kdWN0aW9uIG9mIHN1bW1lciB0aW1lIGluCi0jIE1hdXJpdGl1cy4gVGhlIHN1bW1lciB0aW1lIHBlcmlvZCB3aGljaCB3aWxsIGJlIG9mIG9uZSBob3VyIGFoZWFkIG9mCi0jIHRoZSBzdGFuZGFyZCB0aW1lLCB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGF0IGluIEV1cm9wZSBhbmQgdGhlIFVuaXRlZAotIyBTdGF0ZXMgb2YgQW1lcmljYS4gSXQgd2lsbCBzdGFydCBhdCB0d28gbydjbG9jayBpbiB0aGUgbW9ybmluZyBvbiB0aGUKLSMgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBhbmQgd2lsbCBlbmQgYXQgdHdvIG8nY2xvY2sgaW4gdGhlIG1vcm5pbmcgb24KLSMgdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIHRoZSBmb2xsb3dpbmcgeWVhci4gVGhlIHN1bW1lciB0aW1lIGZvciB0aGUKLSMgeWVhciAyMDA4IC0gMjAwOSB3aWxsLCB0aGVyZWZvcmUsIGJlIGVmZmVjdGl2ZSBhcyBmcm9tIDI2IE9jdG9iZXIgMjAwOAotIyBhbmQgZW5kIG9uIDI5IE1hcmNoIDIwMDkuCi0KLSMgRnJvbSBFZCBNYXN0ZSAoMjAwOC0xMC0wNyk6Ci0jIFRIRSBUSU1FIEJJTEwgKE5vLiBYWFZJSSBvZiAyMDA4KSBFeHBsYW5hdG9yeSBNZW1vcmFuZHVtIHN0YXRlcyB0aGUKLSMgYmVnaW5uaW5nIC8gZW5kaW5nIG9mIHN1bW1lciB0aW1lIGlzIDIgbydjbG9jayBzdGFuZGFyZCB0aW1lIGluIHRoZQotIyBtb3JuaW5nIG9mIHRoZSBsYXN0IFN1bmRheSBvZiBPY3RvYmVyIC8gbGFzdCBTdW5kYXkgb2YgTWFyY2guCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ292Lm11L3BvcnRhbC9nb2MvYXNzZW1ibHlzaXRlL2ZpbGUvYmlsbDI3MDgucGRmIj4KLSMgaHR0cDovL3d3dy5nb3YubXUvcG9ydGFsL2dvYy9hc3NlbWJseXNpdGUvZmlsZS9iaWxsMjcwOC5wZGYKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA2LTA1KToKLSMgQWNjb3JkaW5nIHRvIHNldmVyYWwgc291cmNlcywgTWF1cml0aXVzIHdpbGwgbm90IGNvbnRpbnVlIHRvIG9ic2VydmUKLSMgRFNUIHRoZSBjb21pbmcgc3VtbWVyLi4uCi0jCi0jIFNvbWUgc291cmNlcywgaW4gRnJlbmNoOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRlZmltZWRpYS5pbmZvL25ld3MvOTQ2L1Jhc2hpZC1CZWViZWVqYXVuLTotJUMyJUFCLUwlRTIlODAlOTloZXVyZS1kJUUyJTgwJTk5JUMzJUE5dCVDMyVBOS1uZS1zZXJhLXBhcy1hcHBsaXF1JUMzJUE5ZS1jZXR0ZS1hbm4lQzMlQTllLSVDMiVCQiI+Ci0jIGh0dHA6Ly93d3cuZGVmaW1lZGlhLmluZm8vbmV3cy85NDYvUmFzaGlkLUJlZWJlZWphdW4tOi0lQzIlQUItTCVFMiU4MCU5OWhldXJlLWQlRTIlODAlOTklQzMlQTl0JUMzJUE5LW5lLXNlcmEtcGFzLWFwcGxpcXUlQzMlQTllLWNldHRlLWFubiVDMyVBOWUtJUMyJUJCCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL2xleHByZXNzLm11L1N0b3J5LzMzOTh+QmVlYmVlamF1bi0tLUxlcy1vYmplY3RpZnMtZC0lQzMlQTljb25vbWllLWQtJUMzJUE5bmVyZ2llLWRlLWwtaGV1cmUtZC0lQzMlQTl0JUMzJUE5LW9udC0lQzMlQTl0JUMzJUE5LWF0dGVpbnRzLSI+Ci0jIGh0dHA6Ly9sZXhwcmVzcy5tdS9TdG9yeS8zMzk4fkJlZWJlZWphdW4tLS1MZXMtb2JqZWN0aWZzLWQtJUMzJUE5Y29ub21pZS1kLSVDMyVBOW5lcmdpZS1kZS1sLWhldXJlLWQtJUMzJUE5dCVDMyVBOS1vbnQtJUMzJUE5dCVDMyVBOS1hdHRlaW50cy0KLSMgPC9hPgotIwotIyBPdXIgd3JhcC11cDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbWF1cml0aXVzLWRzdC13aWxsLW5vdC1yZXBlYXQuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMDctMTEpOgotIyBUaGUgIm1hdXJpdGl1cy1kc3Qtd2lsbC1ub3QtcmVwZWF0IiB3cmFwdXAgaW5jbHVkZXMgdGhpczogCi0jICJUaGUgdHJpYWwgZW5kZWQgb24gTWFyY2ggMjksIDIwMDksIHdoZW4gdGhlIGNsb2NrcyBtb3ZlZCBiYWNrIGJ5IG9uZSBob3VyCi0jIGF0IDJhbSAob3IgMDI6MDApIGxvY2FsIHRpbWUuLi4iCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlIE1hdXJpdGl1cwkxOTgyCW9ubHkJLQlPY3QJMTAJMDowMAkxOjAwCVMKLVJ1bGUgTWF1cml0aXVzCTE5ODMJb25seQktCU1hcgkyMQkwOjAwCTAJLQotUnVsZSBNYXVyaXRpdXMJMjAwOAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCVMKLVJ1bGUgTWF1cml0aXVzCTIwMDkJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEluZGlhbi9NYXVyaXRpdXMJMzo1MDowMCAtCUxNVAkxOTA3CQkjIFBvcnQgTG91aXMKLQkJCTQ6MDAgTWF1cml0aXVzCU1VJXNUCSMgTWF1cml0aXVzIFRpbWUKLSMgQWdhbGVnYSBJcywgUm9kcmlndWV6Ci0jIG5vIGluZm9ybWF0aW9uOyBwcm9iYWJseSBsaWtlIEluZGlhbi9NYXVyaXRpdXMKLQotIyBNYXlvdHRlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYXlvdHRlCTM6MDA6NTYgLQlMTVQJMTkxMSBKdWwJIyBNYW1vdXR6b3UKLQkJCTM6MDAJLQlFQVQKLQotIyBNb3JvY2NvCi0jIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgU3BhbmlzaCBNb3JvY2NvIChBZnJpY2EvQ2V1dGEpLgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0wOSk6Ci0jIEhlcmUgaXMgYW4gYXJ0aWNsZSB0aGF0IE1vcm9jY28gcGxhbiB0byBpbnRyb2R1Y2UgRGF5bGlnaHQgU2F2aW5nIFRpbWUgYmV0d2VlbgotIyAxIEp1bmUsIDIwMDggYW5kIDI3IFNlcHRlbWJlciwgMjAwOC4KLSMKLSMgIi4uLiBNb3JvY2NvIGlzIHRvIHNhdmUgZW5lcmd5IGJ5IGFkanVzdGluZyBpdHMgY2xvY2sgZHVyaW5nIHN1bW1lciBzbyBpdCB3aWxsCi0jIGJlIG9uZSBob3VyIGFoZWFkIG9mIEdNVCBiZXR3ZWVuIDEgSnVuZSBhbmQgMjcgU2VwdGVtYmVyLCBhY2NvcmRpbmcgdG8KLSMgQ29tbXVuaWNhdGlvbiBNaW5pc3RlciBhbmQgR292IGVybm1lbnQgU3Bva2VzbWFuLCBLaGFsaWQgTmFjaXJpLi4uLiIKLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19tb3JvY2NvMDEuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAxLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vZW4uYWZyaWsuY29tL25ld3MxMTg5Mi5odG1sIj4KLSMgaHR0cDovL2VuLmFmcmlrLmNvbS9uZXdzMTE4OTIuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBBbGV4IEtyaXZlbnlzaGV2ICgyMDA4LTA1LTA5KToKLSMgVGhlIE1vcm9jY28gdGltZSBjaGFuZ2UgY2FuIGJlIGNvbmZpcm1lZCBvbiBNb3JvY2NvIHdlYiBzaXRlIE1hZ2hyZWIgQXJhYmUgUHJlc3NlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcC5tYS9lbmcvc2VjdGlvbnMvYm94My9tb3JvY2NvX3NoaWZ0c190b19kYS92aWV3Ij4KLSMgaHR0cDovL3d3dy5tYXAubWEvZW5nL3NlY3Rpb25zL2JveDMvbW9yb2Njb19zaGlmdHNfdG9fZGEvdmlldwotIyA8L2E+Ci0jCi0jIE1vcm9jY28gc2hpZnRzIHRvIGRheWxpZ2h0IHRpbWUgb24gSnVuZSAxc3QgdGhyb3VnaCBTZXB0ZW1iZXIgMjcsIEdvdnQuCi0jIHNwb2tlc21hbi4KLQotIyBGcm9tIFBhdHJpY2UgU2NhdHRvbGluICgyMDA4LTA1LTA5KToKLSMgQWNjb3JkaW5nIHRvIHRoaXMgYXJ0aWNsZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdm1hcm9jLmNvbS9hY3R1YWxpdGUvaGV1cmUtZGV0ZS1jb21tZW50LWExMjc4OTYuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuYXZtYXJvYy5jb20vYWN0dWFsaXRlL2hldXJlLWRldGUtY29tbWVudC1hMTI3ODk2Lmh0bWwKLSMgPC9hPgotIyAoYW5kIHJlcHVibGlzaGVkIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWN0dS5tYS9oZXVyZS1kZXRlLWNvbW1lbnRfaTEyNzg5Nl8wLmh0bWwiPgotIyBodHRwOi8vd3d3LmFjdHUubWEvaGV1cmUtZGV0ZS1jb21tZW50X2kxMjc4OTZfMC5odG1sCi0jIDwvYT4KLSMgKQotIyB0aGUgY2hhbmdlcyBvY2N1cnMgYXQgbWlkbmlnaHQ6Ci0jCi0jIHNhdHVyZGF5IG5pZ2h0IG1heSAzMXN0IGF0IG1pZG5pZ2h0ICh3aGljaCBpbiBmcmVuY2ggaXMgdG8gYmUKLSMgaW50cmVwcmV0ZWQgYXMgdGhlIG5pZ2h0IGJldHdlZW4gc2F0dXJkYXkgYW5kIHN1bmRheSkKLSMgc3VuZGF5IG5pZ2h0IHRoZSAyOHRoICBhdCBtaWRuaWdodAotIwotIyBTZWVpbmcgdGhhdCB0aGUgMjh0aCBpcyBtb25kYXksIEkgYW0gZ3Vlc3NpbmcgdGhhdCBzaGUgaW50ZW5kcyB0byBzYXkKLSMgdGhlIG1pZG5pZ2h0IG9mIHRoZSAyOHRoIHdoaWNoIGlzIHRoZSBtaWRuaWdodCBiZXR3ZWVuIHN1bmRheSBhbmQKLSMgbW9uZGF5LCB3aGljaCBqaXZlcyB3aXRoIG90aGVyIHNvdXJjZXMgdGhhdCBzYXkgdGhhdCBpdCdzIGluY2x1c2l2ZQotIyBqdW5lMXN0IHRvIHNlcHQgMjd0aC4KLSMKLSMgVGhlIGRlY2lzaW9uIHdhcyB0YWtlbiBieSBkZWNyZWUgKjItMDgtMjI0ICpidXQgSSBjYW4ndCBmaW5kIHRoZSBkZWNyZWUKLSMgcHVibGlzaGVkIG9uIHRoZSB3ZWIuCi0jCi0jIEl0J3MgYWxzbyBjb25maXJtZWQgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tYXJvYy5tYS9OUi9leGVyZXMvRkFDRjE0MUYtRDkxMC00NEIwLUI3RkEtNkUwMzczMzQyNUQxLmh0bSI+Ci0jIGh0dHA6Ly93d3cubWFyb2MubWEvTlIvZXhlcmVzL0ZBQ0YxNDFGLUQ5MTAtNDRCMC1CN0ZBLTZFMDM3MzM0MjVEMS5odG0KLSMgPC9hPgotIyBvbiBhIGdvdmVybm1lbnQgcG9ydGFsIGFzIGJlaW5nICBiZXR3ZWVuIGp1bmUgMXN0IGFuZCBzZXB0IDI3dGggKG5vdCB5ZXQKLSMgcG9zdGVkIGluIGVuZ2xpc2gpLgotIwotIyBUaGUgZm9sbG93aW5nIGdvb2dsZSBxdWVyeSB3aWxsIGdlbmVyYXRlIG1hbnkgcmVsZXZhbnQgaGl0czoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9obD1lbiZxPUNvbnNlaWwrZGUrZ291dmVybmVtZW50K21hcm9jK2hldXJlK2F2YW5jZSZidG5HPVNlYXJjaCI+Ci0jIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/aGw9ZW4mcT1Db25zZWlsK2RlK2dvdXZlcm5lbWVudCttYXJvYytoZXVyZSthdmFuY2UmYnRuRz1TZWFyY2gKLSMgPC9hPgotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wNS0wOSk6Ci0jIElzIFdlc3Rlcm4gU2FoYXJhIChwYXJ0IHdoaWNoIGFkbWluaXN0cmF0ZWQgYnkgTW9yb2NjbykgZ29pbmcgdG8gZm9sbG93Ci0jIE1vcm9jY28gRFNUIGNoYW5nZXM/ICBBbnkgaW5mb3JtYXRpb24/ICBXaGF0IGFib3V0IG90aGVyIHBhcnQgb2YKLSMgV2VzdGVybiBTYWhhcmEgLSB1bmRlciBhZG1pbmlzdHJhdGlvbiBvZiBQT0xJU0FSSU8gRnJvbnQgKGFsc28gbmFtZWQKLSMgU0FEUiBTYWhhcmF3aSBBcmFiIERlbW9jcmF0aWMgUmVwdWJsaWMpPwotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA1LTA5KToKLSMgWFhYLS1ndWVzcyB0aGF0IGl0IGlzIG9ubHkgTW9yb2NjbyBmb3Igbm93OyBndWVzcyBvbmx5IDIwMDggZm9yIG5vdy4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wOC0yNyk6Ci0jIE1vcm9jY28gd2lsbCBjaGFuZ2UgdGhlIGNsb2NrcyBiYWNrIG9uIHRoZSBtaWRuaWdodCBiZXR3ZWVuIEF1Z3VzdCAzMSAKLSMgYW5kIFNlcHRlbWJlciAxLiBUaGV5IG9yaWdpbmFsbHkgcGxhbm5lZCB0byBvYnNlcnZlIERTVCB0byBuZWFyIHRoZSBlbmQgCi0jIG9mIFNlcHRlbWJlcjoKLSMKLSMgT25lIGFydGljbGUgYWJvdXQgaXQgKGluIEZyZW5jaCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWVuYXJhLm1hL2ZyL0FjdHVhbGl0ZXMvTWFyb2MvU29jaWV0ZS9jaS5yZXRvdXJfYV9sX2hldXJlX2dtdF9hX3BhcnRpcl9kdV9kaW1hbmNoZV8zMV9hb3V0X2FfbWludWl0X29mZmljaWVsXy5kZWZhdWx0Ij4KLSMgaHR0cDovL3d3dy5tZW5hcmEubWEvZnIvQWN0dWFsaXRlcy9NYXJvYy9Tb2NpZXRlL2NpLnJldG91cl9hX2xfaGV1cmVfZ210X2FfcGFydGlyX2R1X2RpbWFuY2hlXzMxX2FvdXRfYV9taW51aXRfb2ZmaWNpZWxfLmRlZmF1bHQKLSMgPC9hPgotIwotIyBXZSBoYXZlIHNvbWUgZnVydGhlciBkZXRhaWxzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbW9yb2Njby1lbmRzLWRzdC1lYXJseS0yMDA4Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE3KToKLSMgTW9yb2NjbyB3aWxsIG9ic2VydmUgRFNUIGZyb20gMjAwOS0wNi0wMSAwMDowMCB0byAyMDA5LTA4LTIxIDAwOjAwIGFjY29yZGluZwotIyB0byBtYW55IHNvdXJjZXMsIHN1Y2ggYXMKLSMgPGEgaHJlZj0iaHR0cDovL25ld3MubWFyd2ViLmNvbS9tb3JvY2NvL2VudGVydGFpbm1lbnQvbW9yb2Njby1kYXlsaWdodC1zYXZpbmcuaHRtbCI+Ci0jIGh0dHA6Ly9uZXdzLm1hcndlYi5jb20vbW9yb2Njby9lbnRlcnRhaW5tZW50L21vcm9jY28tZGF5bGlnaHQtc2F2aW5nLmh0bWwKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1lZGkxc2F0Lm1hL2ZyL2RlcGVjaGUuYXNweD9pZHA9MjMxMiI+Ci0jIGh0dHA6Ly93d3cubWVkaTFzYXQubWEvZnIvZGVwZWNoZS5hc3B4P2lkcD0yMzEyCi0jIDwvYT4KLSMgKEZyZW5jaCkKLSMKLSMgT3VyIHN1bW1hcnk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAwOS5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tc3RhcnRzLWRzdC0yMDA5Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTAzLTE3KToKLSMgSGVyZSBpcyBhIGxpbmsgdG8gb2ZmaWNpYWwgZG9jdW1lbnQgZnJvbSBSb3lhdW1lIGR1IE1hcm9jIFByZW1pZXIgTWluaXN0cmUsCi0jIE1pbmlzdGVyZSBkZSBsYSBNb2Rlcm5pc2F0aW9uIGRlcyBTZWN0ZXVycyBQdWJsaWNzCi0jCi0jIFVuZGVyIEFydGljbGUgMSBvZiBSb3lhbCBEZWNyZWUgTm8uIDQ1NS02NyBvZiBBY3QgMjMgc2FmYXIgMTM4NyAoMiBqdW5lIDE5NjcpCi0jIGNvbmNlcm5pbmcgdGhlIGFtZW5kbWVudCBvZiB0aGUgbGVnYWwgdGltZSwgdGhlIE1pbmlzdHJ5IG9mIE1vZGVybml6YXRpb24gb2YKLSMgUHVibGljIFNlY3RvcnMgYW5ub3VuY2VkIHRoYXQgdGhlIG9mZmljaWFsIHRpbWUgaW4gdGhlIEtpbmdkb20gd2lsbCBiZQotIyBhZHZhbmNlZCA2MCBtaW51dGVzIGZyb20gU3VuZGF5IDMxIE1heSAyMDA5IGF0IG1pZG5pZ2h0LgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1tc3AuZ292Lm1hL2ZyYW5jYWlzL0FjdHVhbGl0ZXNfZnIvUERGX0FjdHVhbGl0ZXNfRnIvSGV1cmVFdGVfRlIucGRmIj4KLSMgaHR0cDovL3d3dy5tbXNwLmdvdi5tYS9mcmFuY2Fpcy9BY3R1YWxpdGVzX2ZyL1BERl9BY3R1YWxpdGVzX0ZyL0hldXJlRXRlX0ZSLnBkZgotIyA8L2E+Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfbW9yb2NjbzAzLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX21vcm9jY28wMy5odG1sCi0jIDwvYT4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxMC0wNC0xMyk6Ci0jIFNldmVyYWwgbmV3cyBtZWRpYSBpbiBNb3JvY2NvIHJlcG9ydCB0aGF0IHRoZSBNaW5pc3RyeSBvZiBNb2Rlcm5pemF0aW9uCi0jIG9mIFB1YmxpYyBTZWN0b3JzIGhhcyBhbm5vdW5jZWQgdGhhdCBNb3JvY2NvIHdpbGwgaGF2ZSBEU1QgZnJvbQotIyAyMDEwLTA1LTAyIHRvIDIwMTAtMDgtMDguCi0jCi0jIEV4YW1wbGU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubGF2aWVlY28uY29tL2FjdHVhbGl0ZXMvNDA5OS1sZS1tYXJvYy1wYXNzZXJhLWEtbC1oZXVyZS1kLWV0ZS1nbXQxLWxlLTItbWFpLmh0bWwiPgotIyBodHRwOi8vd3d3LmxhdmllZWNvLmNvbS9hY3R1YWxpdGVzLzQwOTktbGUtbWFyb2MtcGFzc2VyYS1hLWwtaGV1cmUtZC1ldGUtZ210MS1sZS0yLW1haS5odG1sCi0jIDwvYT4KLSMgKEZyZW5jaCkKLSMgT3VyIHBhZ2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9tb3JvY2NvLXN0YXJ0cy1kc3QtMjAxMC5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL21vcm9jY28tc3RhcnRzLWRzdC0yMDEwLmh0bWwKLSMgPC9hPgotCi0jIFJVTEUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotCi1SdWxlCU1vcm9jY28JMTkzOQlvbmx5CS0JU2VwCTEyCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTE5MzkJb25seQktCU5vdgkxOQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkxOTQwCW9ubHkJLQlGZWIJMjUJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMTk0NQlvbmx5CS0JTm92CTE4CSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NTAJb25seQktCUp1bgkxMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTUwCW9ubHkJLQlPY3QJMjkJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMTk2Nwlvbmx5CS0JSnVuCSAzCTEyOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTE5NjcJb25seQktCU9jdAkgMQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkxOTc0CW9ubHkJLQlKdW4JMjQJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMTk3NAlvbmx5CS0JU2VwCSAxCSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NzYJMTk3NwktCU1heQkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTc2CW9ubHkJLQlBdWcJIDEJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMTk3Nwlvbmx5CS0JU2VwCTI4CSAwOjAwCTAJLQotUnVsZQlNb3JvY2NvCTE5NzgJb25seQktCUp1bgkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJTW9yb2NjbwkxOTc4CW9ubHkJLQlBdWcJIDQJIDA6MDAJMAktCi1SdWxlCU1vcm9jY28JMjAwOAlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlNb3JvY2NvCTIwMDgJb25seQktCVNlcAkgMQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDA5CW9ubHkJLQlKdW4JIDEJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAwOQlvbmx5CS0JQXVnCSAyMQkgMDowMAkwCS0KLVJ1bGUJTW9yb2NjbwkyMDEwCW9ubHkJLQlNYXkJIDIJIDA6MDAJMTowMAlTCi1SdWxlCU1vcm9jY28JMjAxMAlvbmx5CS0JQXVnCSA4CSAwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBZnJpY2EvQ2FzYWJsYW5jYQktMDozMDoyMCAtCUxNVAkxOTEzIE9jdCAyNgotCQkJIDA6MDAJTW9yb2NjbwlXRSVzVAkxOTg0IE1hciAxNgotCQkJIDE6MDAJLQlDRVQJMTk4NgotCQkJIDA6MDAJTW9yb2NjbwlXRSVzVAotIyBXZXN0ZXJuIFNhaGFyYQotWm9uZSBBZnJpY2EvRWxfQWFpdW4JLTA6NTI6NDggLQlMTVQJMTkzNCBKYW4KLQkJCS0xOjAwCS0JV0FUCTE5NzYgQXByIDE0Ci0JCQkgMDowMAktCVdFVAotCi0jIE1vemFtYmlxdWUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL01hcHV0bwkyOjEwOjIwIC0JTE1UCTE5MDMgTWFyCi0JCQkyOjAwCS0JQ0FUCi0KLSMgTmFtaWJpYQotIyBUaGUgMTk5NC0wNC0wMyB0cmFuc2l0aW9uIGlzIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgcmVwb3J0IG5vIERTVCBhZnRlciAxOTk4LTA0OyBnbyB3aXRoIElBVEEuCi0KLSMgRnJvbSBQZXRyb25lbGxhIFNpYmVlbmUgKDIwMDctMDMtMzApIGluCi0jIDxodHRwOi8vYWxsYWZyaWNhLmNvbS9zdG9yaWVzLzIwMDcwMzMwMDE3OC5odG1sPjoKLSMgV2hpbGUgdGhlIGVudGlyZSBjb3VudHJ5IGNoYW5nZXMgaXRzIHRpbWUsIEthdGltYSBNdWxpbG8gYW5kIG90aGVyCi0jIHNldHRsZW1lbnRzIGluIENhcHJpdmkgdW5vZmZpY2lhbGx5IHdpbGwgbm90IGJlY2F1c2UgdGhlIHN1biB0aGVyZQotIyByaXNlcyBhbmQgc2V0cyBlYXJsaWVyIGNvbXBhcmVkIHRvIG90aGVyIHJlZ2lvbnMuICBDaGllZiBvZgotIyBGb3JlY2FzdGluZyBSaWFhbiB2YW4gWnlsIGV4cGxhaW5lZCB0aGF0IHRoZSBmYXIgZWFzdGVybiBwYXJ0cyBvZgotIyB0aGUgY291bnRyeSBhcmUgY2xvc2UgdG8gNDAgbWludXRlcyBlYXJsaWVyIGluIHN1bnJpc2UgdGhhbiB0aGUgcmVzdAotIyBvZiB0aGUgY291bnRyeS4KLSMgCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMzEpOgotIyBBcHBhcmVudGx5IHRoZSBDYXByaXZpIFN0cmlwIGluZm9ybWFsbHkgb2JzZXJ2ZXMgQm90c3dhbmEgdGltZSwgYnV0Ci0jIHdlIGhhdmUgbm8gZGV0YWlscy4gIEluIHRoZSBtZWFudGltZSBwZW9wbGUgdGhlcmUgY2FuIHVzZSBBZnJpY2EvR2Fib3JvbmUuCi0KLSMgUlVMRQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5hbWliaWEJMTk5NAltYXgJLQlTZXAJU3VuPj0xCTI6MDAJMTowMAlTCi1SdWxlCU5hbWliaWEJMTk5NQltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9XaW5kaG9lawkxOjA4OjI0IC0JTE1UCTE4OTIgRmViIDgKLQkJCTE6MzAJLQlTV0FUCTE5MDMgTWFyCSMgU1cgQWZyaWNhIFRpbWUKLQkJCTI6MDAJLQlTQVNUCTE5NDIgU2VwIDIwIDI6MDAKLQkJCTI6MDAJMTowMAlTQVNUCTE5NDMgTWFyIDIxIDI6MDAKLQkJCTI6MDAJLQlTQVNUCTE5OTAgTWFyIDIxICMgaW5kZXBlbmRlbmNlCi0JCQkyOjAwCS0JQ0FUCTE5OTQgQXByICAzCi0JCQkxOjAwCU5hbWliaWEJV0Elc1QKLQotIyBOaWdlcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTmlhbWV5CSAwOjA4OjI4IC0JTE1UCTE5MTIKLQkJCS0xOjAwCS0JV0FUCTE5MzQgRmViIDI2Ci0JCQkgMDowMAktCUdNVAkxOTYwCi0JCQkgMTowMAktCVdBVAotCi0jIE5pZ2VyaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0xhZ29zCTA6MTM6MzYgLQlMTVQJMTkxOSBTZXAKLQkJCTE6MDAJLQlXQVQKLQotIyBSZXVuaW9uCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9SZXVuaW9uCTM6NDE6NTIgLQlMTVQJMTkxMSBKdW4JIyBTYWludC1EZW5pcwotCQkJNDowMAktCVJFVAkjIFJldW5pb24gVGltZQotIwotIyBTY2F0dGVyZWQgSXNsYW5kcyAoSWxlcyBFcGFyc2VzKSBhZG1pbmlzdGVyZWQgZnJvbSBSZXVuaW9uIGFyZSBhcyBmb2xsb3dzLgotIyBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZW0gaXMgdGFrZW4gZnJvbQotIyBJbGVzIEVwYXJzZXMgKHd3dy5vdXRyZS1tZXIuZ291di5mci9kb210b20vaWxlLmh0bSwgMTk5Ny0wNy0yMiwgaW4gRnJlbmNoOwotIyBubyBsb25nZXIgYXZhaWxhYmxlIGFzIG9mIDE5OTktMDgtMTcpLgotIyBXZSBoYXZlIG5vIGluZm8gYWJvdXQgdGhlaXIgdGltZSB6b25lIGhpc3Rvcmllcy4KLSMKLSMgQmFzc2FzIGRhIEluZGlhIC0gdW5pbmhhYml0ZWQKLSMgRXVyb3BhIElzbGFuZCAtIGluaGFiaXRlZCBmcm9tIDE5MDUgdG8gMTkxMCBieSB0d28gZmFtaWxpZXMKLSMgR2xvcmlvc28gSXMgLSBpbmhhYml0ZWQgdW50aWwgYXQgbGVhc3QgMTk1OAotIyBKdWFuIGRlIE5vdmEgLSB1bmluaGFiaXRlZAotIyBUcm9tZWxpbiAtIGluaGFiaXRlZCB1bnRpbCBhdCBsZWFzdCAxOTU4Ci0KLSMgUndhbmRhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9LaWdhbGkJMjowMDoxNiAtCUxNVAkxOTM1IEp1bgotCQkJMjowMAktCUNBVAotCi0jIFN0IEhlbGVuYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBdGxhbnRpYy9TdF9IZWxlbmEJLTA6MjI6NDggLQlMTVQJMTg5MAkJIyBKYW1lc3Rvd24KLQkJCS0wOjIyOjQ4IC0JSk1UCTE5NTEJIyBKYW1lc3Rvd24gTWVhbiBUaW1lCi0JCQkgMDowMAktCUdNVAotIyBUaGUgb3RoZXIgcGFydHMgb2YgdGhlIFN0IEhlbGVuYSB0ZXJyaXRvcnkgYXJlIHNpbWlsYXI6Ci0jCVRyaXN0YW4gZGEgQ3VuaGE6IG9uIEdNVCwgc2F5IFdoaXRtYW4gYW5kIHRoZSBDSUEKLSMJQXNjZW5zaW9uOiBvbiBHTVQsIHNheXMgdXNubzE5OTUgYW5kIHRoZSBDSUEKLSMJR291Z2ggKHNjaWVudGlmaWMgc3RhdGlvbiBzaW5jZSAxOTU1OyBzZWFsZXJzIHdpbnRlcmVkIHByZXZpb3VzbHkpOgotIwkJb24gR01ULCBzYXlzIHRoZSBDSUEKLSMJSW5hY2Nlc3NpYmxlLCBOaWdodGluZ2FsZTogbm8gaW5mb3JtYXRpb24sIGJ1dCBwcm9iYWJseSBHTVQKLQotIyBTYW8gVG9tZSBhbmQgUHJpbmNpcGUKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL1Nhb19Ub21lCSAwOjI2OjU2IC0JTE1UCTE4ODQKLQkJCS0wOjM2OjMyIC0JTE1UCTE5MTIJIyBMaXNib24gTWVhbiBUaW1lCi0JCQkgMDowMAktCUdNVAotCi0jIFNlbmVnYWwKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0Rha2FyCS0xOjA5OjQ0IC0JTE1UCTE5MTIKLQkJCS0xOjAwCS0JV0FUCTE5NDEgSnVuCi0JCQkgMDowMAktCUdNVAotCi0jIFNleWNoZWxsZXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJSW5kaWFuL01haGUJMzo0MTo0OCAtCUxNVAkxOTA2IEp1bgkjIFZpY3RvcmlhCi0JCQk0OjAwCS0JU0NUCSMgU2V5Y2hlbGxlcyBUaW1lCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDUtMzApOgotIyBBbGRhYnJhLCBGYXJxdWhhciwgYW5kIERlc3JvY2hlcywgb3JpZ2luYWxseSBkZXBlbmRlbmNpZXMgb2YgdGhlCi0jIFNleWNoZWxsZXMsIHdlcmUgdHJhbnNmZXJyZWQgdG8gdGhlIEJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeQotIyBpbiAxOTY1IGFuZCByZXR1cm5lZCB0byBTZXljaGVsbGVzIGNvbnRyb2wgaW4gMTk3Ni4gIFdlIGRvbid0IGtub3cKLSMgd2hldGhlciB0aGlzIGFmZmVjdGVkIHRoZWlyIHRpbWUgem9uZSwgc28gb21pdCB0aGlzIGZvciBub3cuCi0jIFBvc3NpYmx5IHRoZSBpc2xhbmRzIHdlcmUgdW5pbmhhYml0ZWQuCi0KLSMgU2llcnJhIExlb25lCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBXaGl0bWFuIGdpdmVzIE1hciAzMSAtIEF1ZyAzMSBmb3IgMTkzMSBvbjsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNMCTE5MzUJMTk0MgktCUp1bgkgMQkwOjAwCTA6NDAJU0xTVAotUnVsZQlTTAkxOTM1CTE5NDIJLQlPY3QJIDEJMDowMAkwCVdBVAotUnVsZQlTTAkxOTU3CTE5NjIJLQlKdW4JIDEJMDowMAkxOjAwCVNMU1QKLVJ1bGUJU0wJMTk1NwkxOTYyCS0JU2VwCSAxCTA6MDAJMAlHTVQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0ZyZWV0b3duCS0wOjUzOjAwIC0JTE1UCTE4ODIKLQkJCS0wOjUzOjAwIC0JRk1UCTE5MTMgSnVuICMgRnJlZXRvd24gTWVhbiBUaW1lCi0JCQktMTowMAlTTAklcwkxOTU3Ci0JCQkgMDowMAlTTAklcwotCi0jIFNvbWFsaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQWZyaWNhL01vZ2FkaXNodQkzOjAxOjI4IC0JTE1UCTE4OTMgTm92Ci0JCQkzOjAwCS0JRUFUCTE5MzEKLQkJCTI6MzAJLQlCRUFUCTE5NTcKLQkJCTM6MDAJLQlFQVQKLQotIyBTb3V0aCBBZnJpY2EKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVNBCTE5NDIJMTk0MwktCVNlcAlTdW4+PTE1CTI6MDAJMTowMAktCi1SdWxlCVNBCTE5NDMJMTk0NAktCU1hcglTdW4+PTE1CTI6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9Kb2hhbm5lc2J1cmcgMTo1MjowMCAtCUxNVAkxODkyIEZlYiA4Ci0JCQkxOjMwCS0JU0FTVAkxOTAzIE1hcgotCQkJMjowMAlTQQlTQVNUCi0jIE1hcmlvbiBhbmQgUHJpbmNlIEVkd2FyZCBJcwotIyBzY2llbnRpZmljIHN0YXRpb24gc2luY2UgMTk0NwotIyBubyBpbmZvcm1hdGlvbgotCi0jIFN1ZGFuCi0jCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5zdW5hbmV3cy5uZXQvc24xM2phbmUuaHRtbCI+Ci0jIFN1ZGFuIE5ld3MgQWdlbmN5ICgyMDAwLTAxLTEzKQotIyA8L2E+LCBhbHNvIHJlcG9ydGVkIGJ5IE1pY2hhZWwgRGUgQmV1a2VsYWVyLURvc3NjaGUgdmlhIFN0ZWZmZW4gVGhvcnNlbjoKLSMgQ2xvY2tzIHdpbGwgYmUgbW92ZWQgYWhlYWQgZm9yIDYwIG1pbnV0ZXMgYWxsIG92ZXIgdGhlIFN1ZGFuIGFzIG9mIG5vb24KLSMgU2F0dXJkYXkuLi4uICBUaGlzIHdhcyBhbm5vdW5jZWQgVGh1cnNkYXkgYnkgQ2FyZXRha2VyIFN0YXRlIE1pbmlzdGVyIGZvcgotIyBNYW5wb3dlciBBYmR1bC1SYWhtYW4gTnVyLUVkZGluLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJU3VkYW4JMTk3MAlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlCVN1ZGFuCTE5NzAJMTk4NQktCU9jdAkxNQkwOjAwCTAJLQotUnVsZQlTdWRhbgkxOTcxCW9ubHkJLQlBcHIJMzAJMDowMAkxOjAwCVMKLVJ1bGUJU3VkYW4JMTk3MgkxOTg1CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0toYXJ0b3VtCTI6MTA6MDggLQlMTVQJMTkzMQotCQkJMjowMAlTdWRhbglDQSVzVAkyMDAwIEphbiAxNSAxMjowMAotCQkJMzowMAktCUVBVAotCi0jIFN3YXppbGFuZAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTWJhYmFuZQkyOjA0OjI0IC0JTE1UCTE5MDMgTWFyCi0JCQkyOjAwCS0JU0FTVAotCi0jIFRhbnphbmlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFmcmljYS9EYXJfZXNfU2FsYWFtIDI6Mzc6MDggLQlMTVQJMTkzMQotCQkJMzowMAktCUVBVAkxOTQ4Ci0JCQkyOjQ0OjQ1CS0JQkVBVVQJMTk2MQotCQkJMzowMAktCUVBVAotCi0jIFRvZ28KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0xvbWUJMDowNDo1MiAtCUxNVAkxODkzCi0JCQkwOjAwCS0JR01UCi0KLSMgVHVuaXNpYQotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDUtMDQtMzApOgotIyBNeSBjb3JyZXNwb25kZW50LCBSaXN0byBOeWthbmVuLCBoYXMgYWxlcnRlZCBtZSB0byBhbm90aGVyIGFkb3B0aW9uIG9mIERTVCwKLSMgdGhpcyB0aW1lIGluIFR1bmlzaWEuICBBY2NvcmRpbmcgdG8gWWFob28gRnJhbmNlIE5ld3MKLSMgPGh0dHA6Ly9mci5uZXdzLnlhaG9vLmNvbS8wNTA0MjYvNS80ZHVtay5odG1sPiwgaW4gYSBzdG9yeSBhdHRyaWJ1dGVkIHRvIEFQCi0jIGFuZCBkYXRlZCAyMDA1LTA0LTI2LCAiVHVuaXNpYSBoYXMgZGVjaWRlZCB0byBhZHZhbmNlIGl0cyBvZmZpY2lhbCB0aW1lIGJ5Ci0jIG9uZSBob3VyLCBzdGFydGluZyBvbiBTdW5kYXksIE1heSAxLiAgSGVuY2Vmb3J0aCwgVHVuaXNpYW4gdGltZSB3aWxsIGJlCi0jIFVUQysyIGluc3RlYWQgb2YgVVRDKzEuICBUaGUgY2hhbmdlIHdpbGwgdGFrZSBwbGFjZSBhdCAyMzowMCBVVEMgbmV4dAotIyBTYXR1cmRheS4iICAoTXkgdHJhbnNsYXRpb24pCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMDIpOgotIyBMYVByZXNzZSwgdGhlIGZpcnN0IG5hdGlvbmFsIGRhaWx5IG5ld3NwYXBlciAuLi4KLSMgPGh0dHA6Ly93d3cubGFwcmVzc2UudG4vYXJjaGl2ZXMvYXJjaGl2ZXMyODA0MDUvYWN0dWFsaXRlcy9saGV1cmUuaHRtbD4KLSMgLi4uIERTVCBmb3IgMjAwNTogb246IFN1biBNYXkgMSAwaCBzdGFuZGFyZCB0aW1lLCBvZmY6IEZyaSBTZXB0LiAzMCwKLSMgMWggc3RhbmRhcmQgdGltZS4KLSMKLSMgRnJvbSBBdGVmIExvdWtpbCAoMjAwNi0wMy0yOCk6Ci0jIFRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSB3aWxsIGJlIHRoZSBzYW1lIGVhY2ggeWVhcjoKLSMgQmVnaW5uaW5nICAgICAgOiB0aGUgbGFzdCBTdW5kYXkgb2YgTWFyY2ggYXQgMDI6MDAKLSMgRW5kaW5nICAgICAgICAgOiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBhdCAwMzowMCAuLi4KLSMgaHR0cDovL3d3dy50YXAuaW5mby50bi9lbi9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMTg4Jkl0ZW1pZD01MAotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE2KToKLSMgQWNjb3JkaW5nIHRvIHNldmVyYWwgbmV3cyBzb3VyY2VzLCBUdW5pc2lhIHdpbGwgbm90IG9ic2VydmUgRFNUIHRoaXMgeWVhci4KLSMgKEFyYWJpYykKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lbGJhc2hheWVyLmNvbS8/cGFnZT12aWV3biZuaWQ9NDI1NDYiPgotIyBodHRwOi8vd3d3LmVsYmFzaGF5ZXIuY29tLz9wYWdlPXZpZXduJm5pZD00MjU0NgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFibmV0Lm5ldC9raXdpZGV0YWlsLTE1Mjk1LmFzcCI+Ci0jIGh0dHA6Ly93d3cuYmFibmV0Lm5ldC9raXdpZGV0YWlsLTE1Mjk1LmFzcAotIyA8L2E+Ci0jCi0jIFdlIGhhdmUgYWxzbyBjb25maXJtZWQgdGhpcyB3aXRoIHRoZSBVUyBlbWJhc3N5IGluIFR1bmlzaWEuCi0jIFdlIGhhdmUgYSB3cmFwLXVwIGFib3V0IHRoaXMgb24gdGhlIGZvbGxvd2luZyBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvdHVuaXNpYS1jYW5jZWxzLWRzdC0yMDA5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvdHVuaXNpYS1jYW5jZWxzLWRzdC0yMDA5Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTAzLTE3KToKLSMgSGVyZSBpcyBhIGxpbmsgdG8gVHVuaXMgQWZyaXF1ZSBQcmVzc2UgTmV3cyBBZ2VuY3kKLSMKLSMgU3RhbmRhcmQgdGltZSB0byBiZSBrZXB0IHRoZSB3aG9sZSB5ZWFyIGxvbmcgKHRhcC5pbmZvLnRuKToKLSMKLSMgKGluIEVuZ2xpc2gpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGFwLmluZm8udG4vZW4vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MjY4MTMmSXRlbWlkPTE1NyI+Ci0jIGh0dHA6Ly93d3cudGFwLmluZm8udG4vZW4vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9MjY4MTMmSXRlbWlkPTE1NwotIyA8L2E+Ci0jCi0jIChpbiBBcmFiaWMpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGFwLmluZm8udG4vYXIvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NjEyNDAmSXRlbWlkPTEiPgotIyBodHRwOi8vd3d3LnRhcC5pbmZvLnRuL2FyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTYxMjQwJkl0ZW1pZD0xCi0jIDwvYT4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0tMy0xOCk6Ci0jIFRoZSBUdW5pcyBBZnJpcXVlIFByZXNzZSBOZXdzIEFnZW5jeSBub3RpY2UgY29udGFpbnMgdGhpczogIlRoaXMgbWVhc3VyZSBpcyBkdWUgdG8gdGhlIGZhY3QKLSMgdGhhdCB0aGUgZmFzdGluZyBtb250aCBvZiByYW1hZGFuIGNvaW5jaWRlcyB3aXRoIHRoZSBwZXJpb2QgY29uY2VybmVkIGJ5IHN1bW1lciB0aW1lLgotIyBUaGVyZWZvcmUsIHRoZSBzdGFuZGFyZCB0aW1lIHdpbGwgYmUga2VwdCB1bmNoYW5nZWQgdGhlIHdob2xlIHllYXIgbG9uZy4iCi0jIFNvIGZvcmVnb2luZyBEU1Qgc2VlbXMgdG8gYmUgYW4gZXhjZXB0aW9uIChhbGJlaXQgb25lIHRoYXQgbWF5IGJlIHJlcGVhdGVkIGluIHRoZSAgZnV0dXJlKS4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wMy0yNyk6Ci0jIEFjY29yZGluZyB0byBzb21lIG5ld3MgcmVwb3J0cyBUdW5pcyBjb25maXJtZWQgbm90IHRvIHVzZSBEU1QgaW4gMjAxMAotIwotIyAodHJhbnNsYXRpb24pOgotIyAiVGhlIFR1bmlzaWFuIGdvdmVybm1lbnQgaGFzIGRlY2lkZWQgdG8gYWJhbmRvbiBEU1QsIHdoaWNoIHdhcyBzY2hlZHVsZWQgb24KLSMgU3VuZGF5Li4uCi0jIFR1bmlzaWFuIGF1dGhvcml0aWVzIGhhZCBzdXNwZW5kZWQgdGhlIERTVCBmb3IgdGhlIGZpcnN0IHRpbWUgbGFzdCB5ZWFyIGFsc28KLSMgY29pbmNpZGVkIHdpdGggdGhlIG1vbnRoIG9mIFJhbWFkYW4uLi4iCi0jCi0jIChpbiBBcmFiaWMpCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW9oZWV0LmNvbS9zaG93X25ld3MuYXNweD9uaWQ9MzU4ODYxJnBnPTEiPgotIyBodHRwOi8vd3d3Lm1vaGVldC5jb20vc2hvd19uZXdzLmFzcHg/bmlkPTM1ODg2MSZwZz0xCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWxtYWRlbmFobmV3cy5jb20vbmV3c3MvbmV3cy5waHA/Yz0xMTgmaWQ9MzgwMzYiPgotIyBodHRwOi8vd3d3LmFsbWFkZW5haG5ld3MuY29tL25ld3NzL25ld3MucGhwP2M9MTE4JmlkPTM4MDM2Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfdHVuaXMwMi5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c190dW5pczAyLmh0bWwKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVHVuaXNpYQkxOTM5CW9ubHkJLQlBcHIJMTUJMjM6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5MzkJb25seQktCU5vdgkxOAkyMzowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk0MAlvbmx5CS0JRmViCTI1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQxCW9ubHkJLQlPY3QJIDYJIDA6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0Mglvbmx5CS0JTWFyCSA5CSAwOjAwCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5NDIJb25seQktCU5vdgkgMgkgMzowMAkwCS0KLVJ1bGUJVHVuaXNpYQkxOTQzCW9ubHkJLQlNYXIJMjkJIDI6MDAJMTowMAlTCi1SdWxlCVR1bmlzaWEJMTk0Mwlvbmx5CS0JQXByCTE3CSAyOjAwCTAJLQotUnVsZQlUdW5pc2lhCTE5NDMJb25seQktCUFwcgkyNQkgMjowMAkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQzCW9ubHkJLQlPY3QJIDQJIDI6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0NAkxOTQ1CS0JQXByCU1vbj49MQkgMjowMAkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTQ0CW9ubHkJLQlPY3QJIDgJIDA6MDAJMAktCi1SdWxlCVR1bmlzaWEJMTk0NQlvbmx5CS0JU2VwCTE2CSAwOjAwCTAJLQotUnVsZQlUdW5pc2lhCTE5NzcJb25seQktCUFwcgkzMAkgMDowMHMJMTowMAlTCi1SdWxlCVR1bmlzaWEJMTk3Nwlvbmx5CS0JU2VwCTI0CSAwOjAwcwkwCS0KLVJ1bGUJVHVuaXNpYQkxOTc4CW9ubHkJLQlNYXkJIDEJIDA6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTE5NzgJb25seQktCU9jdAkgMQkgMDowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk4OAlvbmx5CS0JSnVuCSAxCSAwOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTg4CTE5OTAJLQlTZXAJbGFzdFN1bgkgMDowMHMJMAktCi1SdWxlCVR1bmlzaWEJMTk4OQlvbmx5CS0JTWFyCTI2CSAwOjAwcwkxOjAwCVMKLVJ1bGUJVHVuaXNpYQkxOTkwCW9ubHkJLQlNYXkJIDEJIDA6MDBzCTE6MDAJUwotUnVsZQlUdW5pc2lhCTIwMDUJb25seQktCU1heQkgMQkgMDowMHMJMTowMAlTCi1SdWxlCVR1bmlzaWEJMjAwNQlvbmx5CS0JU2VwCTMwCSAxOjAwcwkwCS0KLVJ1bGUJVHVuaXNpYQkyMDA2CTIwMDgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlCVR1bmlzaWEJMjAwNgkyMDA4CS0JT2N0CWxhc3RTdW4JIDI6MDBzCTAJLQotCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCi0jIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoZSAxOTExIHN3aXRjaCB3YXMgb24gTWFyIDk7IGdvIHdpdGggSG93c2UncyBNYXIgMTEuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFmcmljYS9UdW5pcwkwOjQwOjQ0IC0JTE1UCTE4ODEgTWF5IDEyCi0JCQkwOjA5OjIxCS0JUE1UCTE5MTEgTWFyIDExICAgICMgUGFyaXMgTWVhbiBUaW1lCi0JCQkxOjAwCVR1bmlzaWEJQ0Ulc1QKLQotIyBVZ2FuZGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQWZyaWNhL0thbXBhbGEJMjowOTo0MCAtCUxNVAkxOTI4IEp1bAotCQkJMzowMAktCUVBVAkxOTMwCi0JCQkyOjMwCS0JQkVBVAkxOTQ4Ci0JCQkyOjQ0OjQ1CS0JQkVBVVQJMTk1NwotCQkJMzowMAktCUVBVAotCi0jIFphbWJpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvTHVzYWthCTE6NTM6MDggLQlMTVQJMTkwMyBNYXIKLQkJCTI6MDAJLQlDQVQKLQotIyBaaW1iYWJ3ZQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBZnJpY2EvSGFyYXJlCTI6MDQ6MTIgLQlMTVQJMTkwMyBNYXIKLQkJCTI6MDAJLQlDQVQKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2FudGFyY3RpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDEway9hbnRhcmN0aWNhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjliMmQ3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2FudGFyY3RpY2EKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotIyA8cHJlPgotIyBAKCMpYW50YXJjdGljYQk4LjgKLSMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKLSMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0xMS0xNSk6Ci0jIFRvIGtlZXAgdGhpbmdzIG1hbmFnZWFibGUsIHdlIGxpc3Qgb25seSBsb2NhdGlvbnMgb2NjdXBpZWQgeWVhci1yb3VuZDsgc2VlCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29tbmFwLmFxL2NvbW5hcC9jb21uYXAubnNmL1AvU3RhdGlvbnMvIj4KLSMgQ09NTkFQIC0gU3RhdGlvbnMgYW5kIEJhc2VzCi0jIDwvYT4KLSMgYW5kCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3ByaS5jYW0uYWMudWsvYm9iL3BlcmlhbnQuaHRtIj4KLSMgU3VtbWFyeSBvZiB0aGUgUGVyaS1BbnRhcmN0aWMgSXNsYW5kcyAoMTk5OC0wNy0yMykKLSMgPC9hPgotIyBmb3IgaW5mb3JtYXRpb24uCi0jIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB3ZSBoYXZlIG5vIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4KLSMKLSMgRXhjZXB0IGZvciB0aGUgRnJlbmNoIGVudHJpZXMsCi0jIEkgbWFkZSB1cCBhbGwgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgbWVudGlvbmVkIGhlcmU7IGNvcnJlY3Rpb25zIHdlbGNvbWUhCi0jIEZPUk1BVCBpcyBgenp6JyBhbmQgR01UT0ZGIGlzIDAgZm9yIGxvY2F0aW9ucyB3aGlsZSB1bmluaGFiaXRlZC4KLQotIyBUaGVzZSBydWxlcyBhcmUgc3RvbGVuIGZyb20gdGhlIGBldXJvcGUnIGZpbGUuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlSdXNzQVEJMTk4MQkxOTg0CS0JQXByCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlSdXNzQVEJMTk4MQkxOTgzCS0JT2N0CSAxCSAwOjAwCTAJLQotUnVsZQlSdXNzQVEJMTk4NAkxOTkxCS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZQlSdXNzQVEJMTk4NQkxOTkxCS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUwotUnVsZQlSdXNzQVEJMTk5Mglvbmx5CS0JTWFyCWxhc3RTYXQJIDIzOjAwCTE6MDAJUwotUnVsZQlSdXNzQVEJMTk5Mglvbmx5CS0JU2VwCWxhc3RTYXQJIDIzOjAwCTAJLQotUnVsZQlSdXNzQVEJMTk5MwltYXgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlCVJ1c3NBUQkxOTkzCTE5OTUJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCi1SdWxlCVJ1c3NBUQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAyOjAwcwkwCS0KLQotIyBUaGVzZSBydWxlcyBhcmUgc3RvbGVuIGZyb20gdGhlIGBzb3V0aGFtZXJpY2EnIGZpbGUuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBcmdBUQkxOTY0CTE5NjYJLQlNYXIJIDEJMDowMAkwCS0KLVJ1bGUJQXJnQVEJMTk2NAkxOTY2CS0JT2N0CTE1CTA6MDAJMTowMAlTCi1SdWxlCUFyZ0FRCTE5NjcJb25seQktCUFwcgkgMgkwOjAwCTAJLQotUnVsZQlBcmdBUQkxOTY3CTE5NjgJLQlPY3QJU3VuPj0xCTA6MDAJMTowMAlTCi1SdWxlCUFyZ0FRCTE5NjgJMTk2OQktCUFwcglTdW4+PTEJMDowMAkwCS0KLVJ1bGUJQXJnQVEJMTk3NAlvbmx5CS0JSmFuCTIzCTA6MDAJMTowMAlTCi1SdWxlCUFyZ0FRCTE5NzQJb25seQktCU1heQkgMQkwOjAwCTAJLQotUnVsZQlDaGlsZUFRCTE5NzIJMTk4NgktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlQVEJMTk3NAkxOTg3CS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGVBUQkxOTg3CW9ubHkJLQlBcHIJMTIJMzowMHUJMAktCi1SdWxlCUNoaWxlQVEJMTk4OAkxOTg5CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTg4CW9ubHkJLQlPY3QJU3VuPj0xCTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZUFRCTE5ODkJb25seQktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlQVEJMTk5MAlvbmx5CS0JTWFyCTE4CTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5OTAJb25seQktCVNlcAkxNgk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGVBUQkxOTkxCTE5OTYJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5OTEJMTk5NwktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlQVEJMTk5Nwlvbmx5CS0JTWFyCTMwCTM6MDB1CTAJLQotUnVsZQlDaGlsZUFRCTE5OTgJb25seQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlQVEJMTk5OAlvbmx5CS0JU2VwCTI3CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZUFRCTE5OTkJb25seQktCUFwcgkgNAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGVBUQkxOTk5CW1heAktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlQVEJMjAwMAltYXgJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotCi0jIFRoZXNlIHJ1bGVzIGFyZSBzdG9sZW4gZnJvbSB0aGUgYGF1c3RyYWxhc2lhJyBmaWxlLgotUnVsZQlBdXNBUQkxOTE3CW9ubHkJLQlKYW4JIDEJMDowMQkxOjAwCS0KLVJ1bGUJQXVzQVEJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMAktCi1SdWxlCUF1c0FRCTE5NDIJb25seQktCUphbgkgMQkyOjAwCTE6MDAJLQotUnVsZQlBdXNBUQkxOTQyCW9ubHkJLQlNYXIJMjkJMjowMAkwCS0KLVJ1bGUJQXVzQVEJMTk0Mglvbmx5CS0JU2VwCTI3CTI6MDAJMTowMAktCi1SdWxlCUF1c0FRCTE5NDMJMTk0NAktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUF1c0FRCTE5NDMJb25seQktCU9jdAkgMwkyOjAwCTE6MDAJLQotUnVsZQlBVEFRCTE5NjcJb25seQktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMTk2OAlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUQVEJMTk2OAkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMTk2OQkxOTcxCS0JTWFyCVN1bj49OAkyOjAwcwkwCS0KLVJ1bGUJQVRBUQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVRBUQkxOTczCTE5ODEJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVEFRCTE5ODIJMTk4MwktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVEFRCTE5ODQJMTk4NgktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUQVEJMTk4Nglvbmx5CS0JT2N0CVN1bj49MTUJMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMTk4NwkxOTkwCS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFUQVEJMTk4Nwlvbmx5CS0JT2N0CVN1bj49MjIJMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMTk4OAkxOTkwCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMTk5MQkxOTk5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVRBUQkxOTkxCTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVRBUQkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVRBUQkyMDAxCW1heAktCU9jdAlTdW4+PTEJMjowMHMJMTowMAktCi1SdWxlCUFUQVEJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVRBUQkyMDA3CW9ubHkJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVRBUQkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi0KLSMgQXJnZW50aW5hIC0geWVhci1yb3VuZCBiYXNlcwotIyBCZWxncmFubyBJSSwgQ29uZmluIENvYXN0LCAtNzcwMjI3LTAzNDM3MzcsIHNpbmNlIDE5NzItMDItMDUKLSMgRXNwZXJhbnphLCBTYW4gTWFydGluIExhbmQsIC02MzIzLTA1NjU5LCBzaW5jZSAxOTUyLTEyLTE3Ci0jIEp1YmFueSwgUG90dGVyIFBlbmluc3VsYSwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjQxNC0wNjAyMzIwLCBzaW5jZSAxOTgyLTAxCi0jIE1hcmFtYmlvLCBTZXltb3VyIEksIC02NDE0LTA1NjM3LCBzaW5jZSAxOTY5LTEwLTI5Ci0jIE9yY2FkYXMsIExhdXJpZSBJLCAtNjAxNi0wNDQ0NCwgc2luY2UgMTkwNC0wMi0yMgotIyBTYW4gTWFydGluLCBEZWJlbmhhbSBJLCAtNjgwNy0wNjcwOCwgc2luY2UgMTk1MS0wMy0yMQotIwkoZXhjZXB0IDE5NjAtMDMgLyAxOTc2LTAzLTIxKQotCi0jIEF1c3RyYWxpYSAtIHRlcnJpdG9yaWVzCi0jIEhlYXJkIElzbGFuZCwgTWNEb25hbGQgSXNsYW5kcyAodW5pbmhhYml0ZWQpCi0jCXByZXZpb3VzbHkgc2VhbGVycyBhbmQgc2NpZW50aWZpYyBwZXJzb25uZWwgd2ludGVyZWQKLSMJPGEgaHJlZj0iaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwMjEyMDQyMjIyNDUvaHR0cDovL3d3dy5kc3RjLnF1dC5lZHUuYXUvRFNUL21hcmcvZGF5bGlnaHQuaHRtbCI+Ci0jCU1hcmdhcmV0IFR1cm5lciByZXBvcnRzCi0jCTwvYT4gKDE5OTktMDktMzApIHRoYXQgdGhleSdyZSBVVEMrNSwgd2l0aCBubyBEU1Q7Ci0jCXByZXN1bWFibHkgdGhpcyBpcyB3aGVuIHRoZXkgaGF2ZSB2aXNpdG9ycy4KLSMKLSMgeWVhci1yb3VuZCBiYXNlcwotIyBDYXNleSwgQmFpbGV5IFBlbmluc3VsYSwgLTY2MTcrMTEwMzIsIHNpbmNlIDE5NjkKLSMgRGF2aXMsIFZlc3Rmb2xkIEhpbGxzLCAtNjgzNSswNzc1OSwgc2luY2UgMTk1Ny0wMS0xMwotIwkoZXhjZXB0IDE5NjQtMTEgLSAxOTY5LTAyKQotIyBNYXdzb24sIEhvbG1lIEJheSwgLTY3MzYrMDYyNTMsIHNpbmNlIDE5NTQtMDItMTMKLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wMy0xMSk6Ci0jIFRocmVlIEF1c3RyYWxpYW4gc3RhdGlvbnMgaW4gQW50YXJjdGljYSBoYXZlIGNoYW5nZWQgdGhlaXIgdGltZSB6b25lOgotIyBDYXNleSBtb3ZlZCBmcm9tIFVUQys4IHRvIFVUQysxMQotIyBEYXZpcyBtb3ZlZCBmcm9tIFVUQys3IHRvIFVUQys1Ci0jIE1hd3NvbiBtb3ZlZCBmcm9tIFVUQys2IHRvIFVUQys1Ci0jIFRoZSBjaGFuZ2VzIG9jY3VycmVkIG9uIDIwMDktMTAtMTggYXQgMDI6MDAgKGxvY2FsIHRpbWVzKS4KLSMKLSMgR292ZXJubWVudCBzb3VyY2U6IChBdXN0cmFsaWFuIEFudGFyY3RpYyBEaXZpc2lvbikKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hYWQuZ292LmF1L2RlZmF1bHQuYXNwP2Nhc2lkPTM3MDc5Ij4KLSMgaHR0cDovL3d3dy5hYWQuZ292LmF1L2RlZmF1bHQuYXNwP2Nhc2lkPTM3MDc5Ci0jIDwvYT4KLSMKLSMgV2UgaGF2ZSBtb3JlIGJhY2tncm91bmQgaW5mb3JtYXRpb24gaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2FudGFyY3RpY2EtbmV3LXRpbWVzLmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvYW50YXJjdGljYS1uZXctdGltZXMuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDMtMTApOgotIyBXZSBnb3QgdGhlc2UgY2hhbmdlcyBmcm9tIHRoZSBBdXN0cmFsaWFuIEFudGFyY3RpYyBEaXZpc2lvbjoKLSMgLSBNYWNxdWFyaWUgSXNsYW5kIHdpbGwgc3RheSBvbiBVVEMrMTEgZm9yIHdpbnRlciBhbmQgdGhlcmVmb3JlIG5vdAotIyBzd2l0Y2ggYmFjayBmcm9tIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB3aGVuIG90aGVyIHBhcnRzIG9mIEF1c3RyYWxpYSBkbwotIyBvbiA0IEFwcmlsLgotIwotIyAtIENhc2V5IHN0YXRpb24gcmV2ZXJ0ZWQgdG8gaXRzIG5vcm1hbCB0aW1lIG9mIFVUQys4IG9uIDUgTWFyY2ggMjAxMC4KLSMgVGhlIGNoYW5nZSB0byBVVEMrMTEgaXMgYmVpbmcgY29uc2lkZXJlZCBhcyBhIHJlZ3VsYXIgc3VtbWVyIHRoaW5nIGJ1dAotIyBoYXMgbm90IGJlZW4gZGVjaWRlZCB5ZXQuCi0jCi0jIC0gRGF2aXMgc3RhdGlvbiB3aWxsIHJldmVydCB0byBpdHMgbm9ybWFsIHRpbWUgb2YgVVRDKzcgYXQgMTAgTWFyY2ggMjAxMAotIyAyMDowMCBVVEMuCi0jCi0jIC0gTWF3c29uIHN0YXRpb24gc3RheXMgb24gVVRDKzUuCi0jCi0jIEluIGFkZGl0aW9uIHRvIHRoZSBSdWxlIGNoYW5nZXMgZm9yIENhc2V5L0RhdmlzLCBpdCBtZWFucyB0aGF0IE1hY3F1YXJpZQotIyB3aWxsIG5vIGxvbmdlciBiZSBsaWtlIEhvYmFydCBhbmQgd2lsbCBoYXZlIHRvIGhhdmUgaXRzIG93biBab25lIGNyZWF0ZWQuCi0jCi0jIEJhY2tncm91bmQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9hbnRhcnRpY2EtdGltZS1jaGFuZ2VzLTIwMTAuaHRtbCI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9hbnRhcnRpY2EtdGltZS1jaGFuZ2VzLTIwMTAuaHRtbAotIyA8L2E+Ci0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW50YXJjdGljYS9DYXNleQkwCS0Jenp6CTE5NjkKLQkJCTg6MDAJLQlXU1QJMjAwOSBPY3QgMTggMjowMAotCQkJCQkJIyBXZXN0ZXJuIChBdXMpIFN0YW5kYXJkIFRpbWUKLQkJCTExOjAwCS0JQ0FTVAkyMDEwIE1hciA1IDI6MDAKLQkJCQkJCSMgQ2FzZXkgVGltZQotCQkJODowMAktCVdTVAotWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQl6enoJMTk1NyBKYW4gMTMKLQkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICMgRGF2aXMgVGltZQotCQkJMAktCXp6egkxOTY5IEZlYgotCQkJNzowMAktCURBVlQJMjAwOSBPY3QgMTggMjowMAotCQkJNTowMAktCURBVlQJMjAxMCBNYXIgMTAgMjA6MDB1Ci0JCQk3OjAwCS0JREFWVAotWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0Jenp6CTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAyOjAwCi0JCQkJCQkjIE1hd3NvbiBUaW1lCi0JCQk1OjAwCS0JTUFXVAotWm9uZSBBbnRhcmN0aWNhL01hY3F1YXJpZSAwCS0Jenp6CTE5MTEKLQkJCTEwOjAwCS0JRVNUCTE5MTYgT2N0IDEgMjowMAotCQkJMTA6MDAJMTowMAlFU1QJMTkxNyBGZWIKLQkJCTEwOjAwCUF1c0FRCUVTVAkxOTY3Ci0JCQkxMDowMAlBVEFRCUVTVAkyMDEwIEFwciA0IDM6MDAKLQkJCTExOjAwCS0JTUlTVAkjIE1hY3F1YXJpZSBJc2xhbmQgVGltZQotIyBSZWZlcmVuY2VzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sIj4KLSMgQ2FzZXkgV2VhdGhlciAoMTk5OC0wMi0yNikKLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2RhdmlzL3ZpZGVvLmh0bWwiPgotIyBEYXZpcyBTdGF0aW9uLCBBbnRhcmN0aWNhICgxOTk4LTAyLTI2KQotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW50ZGl2Lmdvdi5hdS9hYWQvZXhvcC9zZm8vbWF3c29uL3ZpZGVvLmh0bWwiPgotIyBNYXdzb24gU3RhdGlvbiwgQW50YXJjdGljYSAoMTk5OC0wMi0yNSkKLSMgPC9hPgotCi0jIEJyYXppbCAtIHllYXItcm91bmQgYmFzZQotIyBDb21hbmRhbnRlIEZlcnJheiwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIwNSswNTgyNCwgc2luY2UgMTk4My80Ci0KLSMgQ2hpbGUgLSB5ZWFyLXJvdW5kIGJhc2VzIGFuZCB0b3ducwotIyBFc2N1ZGVybywgU291dGggU2hldGxhbmQgSXMsIC02MjExNTctMDU4NTczNSwgc2luY2UgMTk5NAotIyBQcmVzaWRlbnRlIEVkdWFkcm8gRnJlaSwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIxNC0wNTg0OCwgc2luY2UgMTk2OS0wMy0wNwotIyBHZW5lcmFsIEJlcm5hcmRvIE8nSGlnZ2lucywgQW50YXJjdGljIFBlbmluc3VsYSwgLTYzMTktMDU3MDQsIHNpbmNlIDE5NDgtMDIKLSMgQ2FwaXRhbiBBcnR1cm8gUHJhdCwgLTYyMzAtMDU5NDEKLSMgVmlsbGEgTGFzIEVzdHJlbGxhcyAoYSB0b3duKSwgYXJvdW5kIHRoZSBGcmVpIGJhc2UsIHNpbmNlIDE5ODQtMDQtMDkKLSMgVGhlc2UgbG9jYXRpb25zIGhhdmUgYWx3YXlzIHVzZWQgU2FudGlhZ28gdGltZTsgdXNlIFRaPSdBbWVyaWNhL1NhbnRpYWdvJy4KLQotIyBDaGluYSAtIHllYXItcm91bmQgYmFzZXMKLSMgR3JlYXQgV2FsbCwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIxMy0wNTg1OCwgc2luY2UgMTk4NS0wMi0yMAotIyBaaG9uZ3NoYW4sIExhcnNlbWFubiBIaWxscywgUHJ5ZHogQmF5LCAtNjkyMiswNzYyMywgc2luY2UgMTk4OS0wMi0yNgotCi0jIEZyYW5jZSAtIHllYXItcm91bmQgYmFzZXMKLSMKLSMgRnJvbSBBbnRvaW5lIExlY2EgKDE5OTctMDEtMjApOgotIyBUaW1lIGRhdGEgYXJlIGZyb20gTmljb2xlIFBhaWxsZWF1IGF0IHRoZSBJRlJUUAotIyAoRnJlbmNoIEluc3RpdHV0ZSBmb3IgUG9sYXIgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kpLgotIyBTaGUgY29uZmlybXMgdGhhdCBGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMgYW5kIFRlcnJlIEFkZWxpZSBiYXNlcwotIyBkb24ndCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZyB0aW1lLCBldmVuIGlmIFRlcnJlIEFkZWxpZSBzdXBwbGllcyBjYW1lCi0jIGZyb20gVGFzbWFuaWEuCi0jCi0jIEZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyB3aXRoIHllYXItcm91bmQgaW5oYWJpdGFudHMKLSMKLSMgTWFydGluLWRlLVZpdmllcyBCYXNlLCBBbXN0ZXJkYW0gSXNsYW5kLCAtMzc0MTA1KzA3NzMxNTUsIHNpbmNlIDE5NTAKLSMgQWxmcmVkLUZhdXJlIEJhc2UsIENyb3pldCBJc2xhbmRzLCAtNDYyNTUxKzA1MTUxNTIsIHNpbmNlIDE5NjQKLSMgUG9ydC1hdXgtRnJhbmNhaXMsIEtlcmd1ZWxlbiBJc2xhbmRzLCAtNDkyMTEwKzA3MDEzMDMsIHNpbmNlIDE5NTE7Ci0jCXdoYWxpbmcgJiBzZWFsaW5nIHN0YXRpb24gb3BlcmF0ZWQgMTkwOC8xOTE0LCAxOTIwLzE5MjksIGFuZCAxOTUxLzE5NTYKLSMKLSMgU3QgUGF1bCBJc2xhbmQgLSBuZWFyIEFtc3RlcmRhbSwgdW5pbmhhYml0ZWQKLSMJZmlzaGluZyBzdGF0aW9ucyBvcGVyYXRlZCB2YXJpb3VzbHkgMTgxOS8xOTMxCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEluZGlhbi9LZXJndWVsZW4JMAktCXp6egkxOTUwCSMgUG9ydC1hdXgtRnJhbmNhaXMKLQkJCTU6MDAJLQlURlQJIyBJU08gY29kZSBURiBUaW1lCi0jCi0jIHllYXItcm91bmQgYmFzZSBpbiB0aGUgbWFpbiBjb250aW5lbnQKLSMgRHVtb250LWQnVXJ2aWxsZSwgSWxlIGRlcyBQZXRyZWxzLCAtNjY0MCsxNDAwMSwgc2luY2UgMTk1Ni0xMQotIwotIyBBbm90aGVyIGJhc2UgYXQgUG9ydC1NYXJ0aW4sIDUwa20gZWFzdCwgYmVnYW4gb3BlcmF0aW9uIGluIDE5NDcuCi0jIEl0IHdhcyBkZXN0cm95ZWQgYnkgZmlyZSBvbiAxOTUyLTAxLTE0LgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbnRhcmN0aWNhL0R1bW9udERVcnZpbGxlIDAgLQl6enoJMTk0NwotCQkJMTA6MDAJLQlQTVQJMTk1MiBKYW4gMTQgIyBQb3J0LU1hcnRpbiBUaW1lCi0JCQkwCS0Jenp6CTE5NTYgTm92Ci0JCQkxMDowMAktCUREVVQJIyBEdW1vbnQtZCdVcnZpbGxlIFRpbWUKLSMgUmVmZXJlbmNlOgotIyA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0R1bW9udF9kJ1VydmlsbGVfU3RhdGlvbiI+Ci0jIER1bW9udCBkJ1VydmlsbGUgU3RhdGlvbiAoMjAwNS0xMi0wNSkKLSMgPC9hPgotCi0jIEdlcm1hbnkgLSB5ZWFyLXJvdW5kIGJhc2UKLSMgR2Vvcmcgdm9uIE5ldW1heWVyLCAtNzAzOS0wMDgxNQotCi0jIEluZGlhIC0geWVhci1yb3VuZCBiYXNlCi0jIERha3NoaW4gR2FuZ290cmksIC03MDA1KzAxMjAwCi0KLSMgSmFwYW4gLSB5ZWFyLXJvdW5kIGJhc2VzCi0jIERvbWUgRnVqaSwgLTc3MTkrMDM5NDIKLSMgU3lvd2EsIC02OTAwMjIrMDM5MzUyNAotIwotIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OS0wMi0wNik6Ci0jIEluIGFsbCBKYXBhbmVzZSBzdGF0aW9ucywgKzAzMDAgaXMgdXNlZCBhcyB0aGUgc3RhbmRhcmQgdGltZS4KLSMKLSMgU3lvd2Egc3RhdGlvbiwgd2hpY2ggaXMgdGhlIGZpcnN0IGFudGFyY3RpYyBzdGF0aW9uIG9mIEphcGFuLAotIyB3YXMgZXN0YWJsaXNoZWQgb24gMTk1Ny0wMS0yOS4gIFNpbmNlIFN5b3dhIHN0YXRpb24gaXMgc3RpbGwgdGhlIG1haW4KLSMgc3RhdGlvbiBvZiBKYXBhbiwgaXQncyBhcHByb3ByaWF0ZSBmb3IgdGhlIHByaW5jaXBhbCBsb2NhdGlvbi4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW50YXJjdGljYS9TeW93YQkwCS0Jenp6CTE5NTcgSmFuIDI5Ci0JCQkzOjAwCS0JU1lPVAkjIFN5b3dhIFRpbWUKLSMgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5pcHIuYWMuanAvZW5nbGlzaC9hcmEwMS5odG1sIj4KLSMgTklQUiBBbnRhcmN0aWMgUmVzZWFyY2ggQWN0aXZpdGllcyAoMTk5OS0wOC0xNykKLSMgPC9hPgotCi0jIFMgS29yZWEgLSB5ZWFyLXJvdW5kIGJhc2UKLSMgS2luZyBTZWpvbmcsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTMtMDU4NDcsIHNpbmNlIDE5ODgKLQotIyBOZXcgWmVhbGFuZCAtIGNsYWltcwotIyBCYWxsZW55IElzbGFuZHMgKG5ldmVyIGluaGFiaXRlZCkKLSMgU2NvdHQgSXNsYW5kIChuZXZlciBpbmhhYml0ZWQpCi0jCi0jIHllYXItcm91bmQgYmFzZQotIyBTY290dCwgUm9zcyBJc2xhbmQsIHNpbmNlIDE5NTctMDEsIGlzIGxpa2UgQW50YXJjdGljYS9NY011cmRvLgotIwotIyBUaGVzZSBydWxlcyBmb3IgTmV3IFplYWxhbmQgYXJlIHN0b2xlbiBmcm9tIHRoZSBgYXVzdHJhbGFzaWEnIGZpbGUuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOWkFRCTE5NzQJb25seQktCU5vdgkgMwkyOjAwcwkxOjAwCUQKLVJ1bGUJTlpBUQkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKLVJ1bGUJTlpBUQkxOTg5CW9ubHkJLQlPY3QJIDgJMjowMHMJMTowMAlECi1SdWxlCU5aQVEJMTk5MAkyMDA2CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCUQKLVJ1bGUJTlpBUQkxOTc1CW9ubHkJLQlGZWIJMjMJMjowMHMJMAlTCi1SdWxlCU5aQVEJMTk3NgkxOTg5CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKLVJ1bGUJTlpBUQkxOTkwCTIwMDcJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCVMKLVJ1bGUJTlpBUQkyMDA3CW1heAktCVNlcAlsYXN0U3VuCTI6MDBzCTE6MDAJRAotUnVsZQlOWkFRCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCVMKLQotIyBOb3J3YXkgLSB0ZXJyaXRvcmllcwotIyBCb3V2ZXQgKG5ldmVyIGluaGFiaXRlZCkKLSMKLSMgY2xhaW1zCi0jIFBldGVyIEkgSXNsYW5kIChuZXZlciBpbmhhYml0ZWQpCi0KLSMgUG9sYW5kIC0geWVhci1yb3VuZCBiYXNlCi0jIEFyY3Rvd3NraSwgS2luZyBHZW9yZ2UgSXNsYW5kLCAtNjIwOTQ1LTA1ODI3NDUsIHNpbmNlIDE5NzcKLQotIyBSdXNzaWEgLSB5ZWFyLXJvdW5kIGJhc2VzCi0jIEJlbGxpbmdzaGF1c2VuLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjExNTktMDU4NTMzNywgc2luY2UgMTk2OC0wMi0yMgotIyBNaXJueSwgRGF2aXMgY29hc3QsIC02NjMzKzA5MzAxLCBzaW5jZSAxOTU2LTAyCi0jIE1vbG9kZXpobmF5YSwgQWxhc2hleWV2IEJheSwgLTY3NDArMDQ1NTEsCi0jCXllYXItcm91bmQgZnJvbSAxOTYyLTAyIHRvIDE5OTktMDctMDEKLSMgTm92b2xhemFyZXZza2F5YSwgUXVlZW4gTWF1ZCBMYW5kLCAtNzA0NiswMTE1MCwKLSMJeWVhci1yb3VuZCBmcm9tIDE5NjAvNjEgdG8gMTk5MgotCi0jIFZvc3Rvaywgc2luY2UgMTk1Ny0xMi0xNiwgdGVtcG9yYXJpbHkgY2xvc2VkIDE5OTQtMDIvMTk5NC0xMQotIyA8YSBocmVmPSJodHRwOi8vcXVlc3QuYXJjLm5hc2EuZ292L2FudGFyY3RpY2EvUUEvY29tcHV0ZXJzL0RpcmVjdGlvbnMsVGltZSxaSVAiPgotIyBGcm9tIENyYWlnIE11bmRlbGwgKDE5OTQtMTItMTUpPC9hPjoKLSMgVm9zdG9rLCB3aGljaCBpcyBvbmUgb2YgdGhlIFJ1c3NpYW4gc3RhdGlvbnMsIGlzIHNldCBvbiB0aGUgc2FtZQotIyB0aW1lIGFzIE1vc2NvdywgUnVzc2lhLgotIwotIyBGcm9tIExlZSBIb3R6ICgyMDAxLTAzLTA4KToKLSMgSSBxdWVyaWVkIHRoZSBmb2xrcyBhdCBDb2x1bWJpYSB3aG8gc3BlbnQgdGhlIHN1bW1lciBhdCBWb3N0b2sgYW5kIHRoaXMgaXMKLSMgd2hhdCB0aGV5IGhhZCB0byBzYXkgYWJvdXQgdGltZSB0aGVyZToKLSMgYGBpbiB0aGUgVVMgQ2FtcCAoRWFzdCBDYW1wKSB3ZSBoYXZlIGJlZW4gb24gTmV3IFplYWxhbmQgKE1jTXVyZG8pCi0jIHRpbWUsIHdoaWNoIGlzIDEyIGhvdXJzIGFoZWFkIG9mIEdNVC4gVGhlIFJ1c3NpYW4gU3RhdGlvbiBWb3N0b2sgd2FzCi0jIDYgaG91cnMgYmVoaW5kIHRoYXQgKGFsdGhvdWdoIG9ubHkgMiBtaWxlcyBhd2F5LCBpLmUuIDYgaG91cnMgYWhlYWQKLSMgb2YgR01UKS4gVGhpcyBpcyBhIHRpbWUgem9uZSBJIHRoaW5rIHR3byBob3VycyBlYXN0IG9mIE1vc2Nvdy4gVGhlCi0jIG5hdHVyYWwgdGltZSB6b25lIGlzIGluIGJldHdlZW4gdGhlIHR3bzogOCBob3VycyBhaGVhZCBvZiBHTVQuJycKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0wNCk6Ci0jIFRoaXMgc2VlbXMgdG8gYmUgaG9wZWxlc3NseSBjb25mdXNpbmcsIHNvIEkgYXNrZWQgTGVlIEhvdHogYWJvdXQgaXQKLSMgaW4gcGVyc29uLiAgSGUgc2FpZCB0aGF0IHNvbWUgQW50YXJ0aWMgbG9jYXRpb25zIHNldCB0aGVpciBsb2NhbAotIyB0aW1lIHNvIHRoYXQgbm9vbiBpcyB0aGUgd2FybWVzdCBwYXJ0IG9mIHRoZSBkYXksIGFuZCB0aGF0IHRoaXMKLSMgY2hhbmdlcyBkdXJpbmcgdGhlIHllYXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVhbgotIyBzb2xhciBub29uLiAgU28gdGhlIFZvc3RvayB0aW1lIG1pZ2h0IGhhdmUgYmVlbiB3aGF0ZXZlciB0aGUgY2xvY2tzCi0jIGhhcHBlbmVkIHRvIGJlIGR1cmluZyB0aGVpciB2aXNpdC4gIFNvIHdlIHN0aWxsIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGltZQotIyBpdCBpcyBhdCBWb3N0b2suICBCdXQgd2UnbGwgZ3Vlc3MgVVRDKzYuCi0jCi1ab25lIEFudGFyY3RpY2EvVm9zdG9rCTAJLQl6enoJMTk1NyBEZWMgMTYKLQkJCTY6MDAJLQlWT1NUCSMgVm9zdG9rIHRpbWUKLQotIyBTIEFmcmljYSAtIHllYXItcm91bmQgYmFzZXMKLSMgTWFyaW9uIElzbGFuZCwgLTQ2NTMrMDM3NTIKLSMgU2FuYWUsIC03MTQxLTAwMjUwCi0KLSMgVUsKLSMKLSMgQnJpdGlzaCBBbnRhcmN0aWMgVGVycml0b3JpZXMgKEJBVCkgY2xhaW1zCi0jIFNvdXRoIE9ya25leSBJc2xhbmRzCi0jCXNjaWVudGlmaWMgc3RhdGlvbiBmcm9tIDE5MDMKLSMJd2hhbGluZyBzdGF0aW9uIGF0IFNpZ255IEkgMTkyMC8xOTI2Ci0jIFNvdXRoIFNoZXRsYW5kIElzbGFuZHMKLSMKLSMgeWVhci1yb3VuZCBiYXNlcwotIyBCaXJkIElzbGFuZCwgU291dGggR2VvcmdpYSwgLTU0MDAtMDM4MDMsIHNpbmNlIDE5ODMKLSMgRGVjZXB0aW9uIElzbGFuZCwgLTYyNTktMDYwMzQsIHdoYWxpbmcgc3RhdGlvbiAxOTEyLzE5MzEsCi0jCXNjaWVudGlmaWMgc3RhdGlvbiAxOTQzLzE5NjcsCi0jCXByZXZpb3VzbHkgc2VhbGVycyBhbmQgYSBzY2llbnRpZmljIGV4cGVkaXRpb24gd2ludGVyZWQgYnkgYWNjaWRlbnQsCi0jCWFuZCBhIGdhcnJpc29uIHdhcyBkZXBsb3llZCBicmllZmx5Ci0jIEhhbGxleSwgQ29hdGVzIExhbmQsIC03NTM1LTAyNjA0LCBzaW5jZSAxOTU2LTAxLTA2Ci0jCUhhbGxleSBpcyBvbiBhIG1vdmluZyBpY2Ugc2hlbGYgYW5kIGlzIHBlcmlvZGljYWxseSByZWxvY2F0ZWQKLSMJc28gdGhhdCBpdCBpcyBuZXZlciBtb3JlIHRoYW4gMTBrbSBmcm9tIGl0cyBub21pbmFsIGxvY2F0aW9uLgotIyBSb3RoZXJhLCBBZGVsYWlkZSBJc2xhbmQsIC02NzM0LTY4MDgsIHNpbmNlIDE5NzYtMTItMDEKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMi0xMC0yMikKLSMgPGh0dHA6Ly93ZWJleGhpYml0cy5vcmcvZGF5bGlnaHRzYXZpbmcvZy5odG1sPiBzYXlzIFJvdGhlcmEgaXMgLTAzIGFsbCB5ZWFyLgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbnRhcmN0aWNhL1JvdGhlcmEJMAktCXp6egkxOTc2IERlYyAgMQotCQkJLTM6MDAJLQlST1RUCSMgUm90aGVyYSB0aW1lCi0KLSMgVXJ1Z3VheSAtIHllYXIgcm91bmQgYmFzZQotIyBBcnRpZ2FzLCBLaW5nIEdlb3JnZSBJc2xhbmQsIC02MjExMDQtMDU4NTEwNwotCi0jIFVTQSAtIHllYXItcm91bmQgYmFzZXMKLSMKLSMgUGFsbWVyLCBBbnZlcnMgSXNsYW5kLCBzaW5jZSAxOTY1IChtb3ZlZCAyIG1pbGVzIGluIDE5NjgpCi0jCi0jIEZyb20gRXRoYW4gRGlja3MgKDE5OTYtMTAtMDYpOgotIyBJdCBrZWVwcyB0aGUgc2FtZSB0aW1lIGFzIFB1bnRhIEFyZW5hcywgQ2hpbGUsIGJlY2F1c2UsIGp1c3QgbGlrZSB1cwotIyBhbmQgdGhlIFNvdXRoIFBvbGUsIHRoYXQncyB0aGUgb3RoZXIgZW5kIG9mIHRoZWlyIHN1cHBseSBsaW5lLi4uLgotIyBJIHZlcmlmaWVkIHdpdGggc29tZW9uZSB3aG8gd2FzIHRoZXJlIHRoYXQgc2luY2UgMTk4MCwKLSMgUGFsbWVyIGhhcyBmb2xsb3dlZCBDaGlsZS4gIFByaW9yIHRvIHRoYXQsIGJlZm9yZSB0aGUgRmFsa2xhbmRzIFdhciwKLSMgUGFsbWVyIHVzZWQgdG8gYmUgc3VwcGxpZWQgZnJvbSBBcmdlbnRpbmEuCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFudGFyY3RpY2EvUGFsbWVyCTAJLQl6enoJMTk2NQotCQkJLTQ6MDAJQXJnQVEJQVIlc1QJMTk2OSBPY3QgNQotCQkJLTM6MDAJQXJnQVEJQVIlc1QJMTk4MiBNYXkKLQkJCS00OjAwCUNoaWxlQVEJQ0wlc1QKLSMKLSMKLSMgTWNNdXJkbywgUm9zcyBJc2xhbmQsIHNpbmNlIDE5NTUtMTIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW50YXJjdGljYS9NY011cmRvCTAJLQl6enoJMTk1NgotCQkJMTI6MDAJTlpBUQlOWiVzVAotIwotIyBBbXVuZHNlbi1TY290dCwgU291dGggUG9sZSwgY29udGludW91c2x5IG9jY3VwaWVkIHNpbmNlIDE5NTYtMTEtMjAKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6Ci0jIE5vcm1hbGx5IGl0IHdvdWxkbid0IGhhdmUgYSBzZXBhcmF0ZSBlbnRyeSwgc2luY2UgaXQncyBsaWtlIHRoZQotIyBsYXJnZXIgQW50YXJjdGljYS9NY011cmRvIHNpbmNlIDE5NzAsIGJ1dCBpdCdzIHRvbyBmYW1vdXMgdG8gb21pdC4KLSMKLSMgRnJvbSBDaHJpcyBDYXJyaWVyICgxOTk2LTA2LTI3KToKLSMgU2lwbGUsIHRoZSBmaXJzdCBjb21tYW5kZXIgb2YgdGhlIFNvdXRoIFBvbGUgc3RhdGlvbiwKLSMgc3RhdGVkIHRoYXQgaGUgd291bGQgaGF2ZSBsaWtlZCB0byBoYXZlIGtlcHQgR01UIGF0IHRoZSBzdGF0aW9uLAotIyBidXQgdGhhdCBoZSBmb3VuZCBpdCBtb3JlIGNvbnZlbmllbnQgdG8ga2VlcCBHTVQrMTIKLSMgYXMgc3VwcGxpZXMgZm9yIHRoZSBzdGF0aW9uIHdlcmUgY29taW5nIGZyb20gTWNNdXJkbyBTb3VuZCwKLSMgd2hpY2ggd2FzIG9uIEdNVCsxMiBiZWNhdXNlIE5ldyBaZWFsYW5kIHdhcyBvbiBHTVQrMTIgYWxsIHllYXIKLSMgYXQgdGhhdCB0aW1lICgxOTU3KS4gIChTb3VyY2U6IFNpcGxlJ3MgYm9vayA5MCBkZWdyZWVzIFNPVVRILikKLSMKLSMgRnJvbSBTdXNhbiBTbWl0aAotIyBodHRwOi8vd3d3LmN5YmVydG91cnMuY29tL3docy9wb2xlMTAuaHRtbAotIyAoMTk5NS0xMS0xMyAxNjoyNDo1NiArMTMwMCwgbm8gbG9uZ2VyIGF2YWlsYWJsZSk6Ci0jIFdlIHVzZSB0aGUgc2FtZSB0aW1lIGFzIE1jTXVyZG8gZG9lcy4KLSMgQW5kIHRoZXkgdXNlIHRoZSBzYW1lIHRpbWUgYXMgQ2hyaXN0Y2h1cmNoLCBOWiBkb2VzLi4uLgotIyBPbmUgbGFzdCBxdWlyayBhYm91dCBTb3V0aCBQb2xlIHRpbWUuCi0jIEFsbCB0aGUgZWxlY3RyaWMgY2xvY2tzIGFyZSB1c3VhbGx5IHdyb25nLgotIyBTb21ldGhpbmcgYWJvdXQgdGhlIGdlbmVyYXRvcnMgcnVubmluZyBhdCA2MC4xaGVydHogb3Igc29tZXRoaW5nCi0jIG1ha2VzIGFsbCBvZiB0aGUgY2xvY2tzIHJ1biBmYXN0LiAgU28gZXZlcnkgY291cGxlIG9mIGRheXMsCi0jIHdlIGhhdmUgdG8gZ28gYXJvdW5kIGFuZCBzZXQgdGhlbSBiYWNrIDUgbWludXRlcyBvciBzby4KLSMgTWF5YmUgaWYgd2UgbGV0IHRoZW0gcnVuIGZhc3QgYWxsIG9mIHRoZSB0aW1lLCB3ZSdkIGdldCB0byBsZWF2ZSBoZXJlIHNvb25lciEhCi0jCi1MaW5rCUFudGFyY3RpY2EvTWNNdXJkbwlBbnRhcmN0aWNhL1NvdXRoX1BvbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2FzaWEgYi90b29scy96b25laW5mby90emRhdGEyMDEway9hc2lhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZmMmZmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2FzaWEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTczICswLDAgQEAKLSMgQCgjKWFzaWEJOC42MAotIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgotIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KLQotIyBUaGlzIGRhdGEgaXMgYnkgbm8gbWVhbnMgYXV0aG9yaXRhdGl2ZTsgaWYgeW91IHRoaW5rIHlvdSBrbm93IGJldHRlciwKLSMgZ28gYWhlYWQgYW5kIGVkaXQgdGhlIGZpbGUgKGFuZCBwbGVhc2Ugc2VuZCBhbnkgY2hhbmdlcyB0bwotIyB0ekBlbHNpZS5uY2kubmloLmdvdiBmb3IgZ2VuZXJhbCB1c2UgaW4gdGhlIGZ1dHVyZSkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jCi0jIEEgZ29vZCBzb3VyY2UgZm9yIHRpbWUgem9uZSBoaXN0b3JpY2FsIGRhdGEgb3V0c2lkZSB0aGUgVS5TLiBpcwotIyBUaG9tYXMgRy4gU2hhbmtzIGFuZCBSaXF1ZSBQb3R0ZW5nZXIsIFRoZSBJbnRlcm5hdGlvbmFsIEF0bGFzICg2dGggZWRpdGlvbiksCi0jIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMjAwMykuCi0jCi0jIEd3aWxsaW0gTGF3IHdyaXRlcyB0aGF0IGEgZ29vZCBzb3VyY2UKLSMgZm9yIHJlY2VudCB0aW1lIHpvbmUgZGF0YSBpcyB0aGUgSW50ZXJuYXRpb25hbCBBaXIgVHJhbnNwb3J0Ci0jIEFzc29jaWF0aW9uJ3MgU3RhbmRhcmQgU2NoZWR1bGVzIEluZm9ybWF0aW9uIE1hbnVhbCAoSUFUQSBTU0lNKSwKLSMgcHVibGlzaGVkIHNlbWlhbm51YWxseS4gIExhdyBzZW50IGluIHNldmVyYWwgaGVscGZ1bCBzdW1tYXJpZXMKLSMgb2YgdGhlIElBVEEncyBkYXRhIGFmdGVyIDE5OTAuCi0jCi0jIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2Ugbm90ZWQsIFNoYW5rcyAmIFBvdHRlbmdlciBpcyB0aGUgc291cmNlIGZvcgotIyBlbnRyaWVzIHRocm91Z2ggMTk5MCwgYW5kIElBVEEgU1NJTSBpcyB0aGUgc291cmNlIGZvciBlbnRyaWVzIGFmdGVyd2FyZHMuCi0jCi0jIEFub3RoZXIgc291cmNlIG9jY2FzaW9uYWxseSB1c2VkIGlzIEVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAotIyBXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLCB3aGljaAotIyBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCi0jCi0jIEEgcmVsaWFibGUgYW5kIGVudGVydGFpbmluZyBzb3VyY2UgYWJvdXQgdGltZSB6b25lcyBpcwotIyBEZXJlayBIb3dzZSwgR3JlZW53aWNoIHRpbWUgYW5kIGxvbmdpdHVkZSwgUGhpbGlwIFdpbHNvbiBQdWJsaXNoZXJzICgxOTk3KS4KLSMKLSMgSSBpbnZlbnRlZCB0aGUgYWJicmV2aWF0aW9ucyBtYXJrZWQgYConIGluIHRoZSBmb2xsb3dpbmcgdGFibGU7Ci0jIHRoZSByZXN0IGFyZSBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvciBmcm9tIG90aGVyIHNvdXJjZXMuCi0jIENvcnJlY3Rpb25zIGFyZSB3ZWxjb21lIQotIwkgICAgIHN0ZCAgZHN0Ci0jCSAgICAgTE1UCUxvY2FsIE1lYW4gVGltZQotIwkyOjAwIEVFVCAgRUVTVAlFYXN0ZXJuIEV1cm9wZWFuIFRpbWUKLSMJMjowMCBJU1QgIElEVAlJc3JhZWwKLSMJMzowMCBBU1QgIEFEVAlBcmFiaWEqCi0jCTM6MzAgSVJTVCBJUkRUCUlyYW4KLSMJNDowMCBHU1QJR3VsZioKLSMJNTozMCBJU1QJSW5kaWEKLSMJNzowMCBJQ1QJSW5kb2NoaW5hKgotIwk3OjAwIFdJVAl3ZXN0IEluZG9uZXNpYQotIwk4OjAwIENJVAljZW50cmFsIEluZG9uZXNpYQotIwk4OjAwIENTVAlDaGluYQotIwk5OjAwIENKVAlDZW50cmFsIEphcGFuZXNlIFRpbWUgKDE4OTYvMTkzNykqCi0jCTk6MDAgRUlUCWVhc3QgSW5kb25lc2lhCi0jCTk6MDAgSlNUICBKRFQJSmFwYW4KLSMJOTowMCBLU1QgIEtEVAlLb3JlYQotIwk5OjMwIENTVAkoQXVzdHJhbGlhbikgQ2VudHJhbCBTdGFuZGFyZCBUaW1lCi0jCi0jIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgUnVzc2lhIGFuZCBUdXJrZXkgaW4gQXNpYS4KLQotIyBGcm9tIEd1eSBIYXJyaXM6Ci0jIEluY29ycG9yYXRlcyBkYXRhIGZvciBTaW5nYXBvcmUgZnJvbSBSb2JlcnQgRWx6JyBhc2lhIDEuMSwgYXMgd2VsbCBhcwotIyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gVG9tIFlhcCwgU3VuIE1pY3Jvc3lzdGVtcyBJbnRlcmNvbnRpbmVudGFsCi0jIFRlY2huaWNhbCBTdXBwb3J0IChpbmNsdWRpbmcgYSBwYWdlIGZyb20gdGhlIE9mZmljaWFsIEFpcmxpbmUgR3VpZGUgLQotIyBXb3JsZHdpZGUgRWRpdGlvbikuICBUaGUgbmFtZXMgZm9yIHRpbWUgem9uZXMgYXJlIGd1ZXNzZXMuCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUaGVzZSBydWxlcyBhcmUgc3RvbGVuIGZyb20gdGhlIGBldXJvcGUnIGZpbGUuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlFVUFzaWEJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMTowMHUJMTowMAlTCi1SdWxlCUVVQXNpYQkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMTowMHUJMAktCi1SdWxlCUVVQXNpYQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAxOjAwdQkwCS0KLVJ1bGUgRS1FdXJBc2lhCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDA6MDAJMTowMAlTCi1SdWxlIEUtRXVyQXNpYQkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMDowMAkwCS0KLVJ1bGUgRS1FdXJBc2lhCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDA6MDAJMAktCi1SdWxlIFJ1c3NpYUFzaWEJMTk4MQkxOTg0CS0JQXByCTEJIDA6MDAJMTowMAlTCi1SdWxlIFJ1c3NpYUFzaWEJMTk4MQkxOTgzCS0JT2N0CTEJIDA6MDAJMAktCi1SdWxlIFJ1c3NpYUFzaWEJMTk4NAkxOTkxCS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZSBSdXNzaWFBc2lhCTE5ODUJMTk5MQktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUgUnVzc2lhQXNpYQkxOTkyCW9ubHkJLQlNYXIJbGFzdFNhdAkyMzowMAkxOjAwCVMKLVJ1bGUgUnVzc2lhQXNpYQkxOTkyCW9ubHkJLQlTZXAJbGFzdFNhdAkyMzowMAkwCS0KLVJ1bGUgUnVzc2lhQXNpYQkxOTkzCW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUgUnVzc2lhQXNpYQkxOTkzCTE5OTUJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCi1SdWxlIFJ1c3NpYUFzaWEJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCi0KLSMgQWZnaGFuaXN0YW4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9LYWJ1bAk0OjM2OjQ4IC0JTE1UCTE4OTAKLQkJCTQ6MDAJLQlBRlQJMTk0NQotCQkJNDozMAktCUFGVAotCi0jIEFybWVuaWEKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBoYXZlIFllcmV2YW4gc3dpdGNoaW5nIHRvIDM6MDAgKHdpdGggUnVzc2lhbiBEU1QpCi0jIGluIHNwcmluZyAxOTkxLCB0aGVuIHRvIDQ6MDAgd2l0aCBubyBEU1QgaW4gZmFsbCAxOTk1LCB0aGVuCi0jIHJlYWRvcHRpbmcgUnVzc2lhbiBEU1QgaW4gMTk5Ny4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLCBldmVuCi0jIHdoZW4gdGhleSBkaXNhZ3JlZSB3aXRoIG90aGVycy4gIEVkZ2FyIERlci1EYW5pZWxpYW50egotIyByZXBvcnRlZCAoMTk5Ni0wNS0wNCkgdGhhdCBZZXJldmFuIHByb2JhYmx5IHdvdWxkbid0IHVzZSBEU1QKLSMgaW4gMTk5NiwgdGhvdWdoIGl0IGRpZCB1c2UgRFNUIGluIDE5OTUuICBJQVRBIFNTSU0gKDE5OTEvMTk5OCkgcmVwb3J0cyB0aGF0Ci0jIEFybWVuaWEgc3dpdGNoZWQgZnJvbSAzOjAwIHRvIDQ6MDAgaW4gMTk5OCBhbmQgb2JzZXJ2ZWQgRFNUIGFmdGVyIDE5OTEsCi0jIGJ1dCBzdGFydGVkIHN3aXRjaGluZyBhdCAzOjAwcyBpbiAxOTk4LgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1llcmV2YW4JMjo1ODowMCAtCUxNVAkxOTI0IE1heSAgMgotCQkJMzowMAktCVlFUlQJMTk1NyBNYXIgICAgIyBZZXJldmFuIFRpbWUKLQkJCTQ6MDAgUnVzc2lhQXNpYSBZRVIlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTM6MDAJMTowMAlZRVJTVAkxOTkxIFNlcCAyMyAjIGluZGVwZW5kZW5jZQotCQkJMzowMCBSdXNzaWFBc2lhCUFNJXNUCTE5OTUgU2VwIDI0IDI6MDBzCi0JCQk0OjAwCS0JQU1UCTE5OTcKLQkJCTQ6MDAgUnVzc2lhQXNpYQlBTSVzVAotCi0jIEF6ZXJiYWlqYW4KLSMgRnJvbSBSdXN0YW0gQWxpeWV2IG9mIHRoZSBBemVyYmFpamFuIEludGVybmV0IEZvcnVtICgyMDA1LTEwLTIzKToKLSMgQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIENhYmluZXQgb2YgTWluaXN0ZXJzLCAxOTk3Ci0jIFJlc29sdXRpb24gYXZhaWxhYmxlIGF0OiBodHRwOi8vYWlmLmF6L2RvY3MvZGF5bGlnaHRfcmVzLnBkZgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQXplcgkxOTk3CW1heAktCU1hcglsYXN0U3VuCSA0OjAwCTE6MDAJUwotUnVsZQlBemVyCTE5OTcJbWF4CS0JT2N0CWxhc3RTdW4JIDU6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFrdQkzOjE5OjI0IC0JTE1UCTE5MjQgTWF5ICAyCi0JCQkzOjAwCS0JQkFLVAkxOTU3IE1hciAgICAjIEJha3UgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhIEJBSyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMzowMAkxOjAwCUJBS1NUCTE5OTEgQXVnIDMwICMgaW5kZXBlbmRlbmNlCi0JCQkzOjAwIFJ1c3NpYUFzaWEJQVolc1QJMTk5MiBTZXAgbGFzdFNhdCAyMzowMAotCQkJNDowMAktCUFaVAkxOTk2ICMgQXplcmJhaWphbiB0aW1lCi0JCQk0OjAwCUVVQXNpYQlBWiVzVAkxOTk3Ci0JCQk0OjAwCUF6ZXIJQVolc1QKLQotIyBCYWhyYWluCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFocmFpbgkzOjIyOjIwIC0JTE1UCTE5MjAJCSMgQWwgTWFuYW1haAotCQkJNDowMAktCUdTVAkxOTcyIEp1bgotCQkJMzowMAktCUFTVAotCi0jIEJhbmdsYWRlc2gKLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDUtMTMpOgotIyBBY2NvcmRpbmcgdG8gbmV3c3BhcGVyIEFzaWFuIFRyaWJ1bmUgKE1heSA2LCAyMDA5KSBCYW5nbGFkZXNoIG1heSBpbnRyb2R1Y2UKLSMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZnJvbSBKdW5lIDE2IHRvIFNlcHQgMzAKLSMKLSMgQmFuZ2xhZGVzaCB0byBpbnRyb2R1Y2UgZGF5bGlnaHQgc2F2aW5nIHRpbWUgbGlrZWx5IGZyb20gSnVuZSAxNgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFzaWFudHJpYnVuZS5jb20vP3E9bm9kZS8xNzI4OCI+Ci0jIGh0dHA6Ly93d3cuYXNpYW50cmlidW5lLmNvbS8/cT1ub2RlLzE3Mjg4Ci0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDIuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDAyLmh0bWwKLSMgPC9hPgotIwotIyAiLi4uIEJhbmdsYWRlc2ggZ292ZXJubWVudCBoYXMgZGVjaWRlZCB0byBzd2l0Y2ggZGF5bGlnaHQgc2F2aW5nIHRpbWUgZnJvbQotIyBKdW5lCi0jIDE2IHRpbGwgU2VwdGVtYmVyIDMwIGluIGEgYmlkIHRvIGVuc3VyZSBtYXhpbXVtIHVzZSBvZiBkYXlsaWdodCB0byBjb3BlIHdpdGgKLSMgY3JpcHBsaW5nIHBvd2VyIGNyaXNpcy4gIgotIwotIyBUaGUgc3dpdGNoIHdpbGwgcmVtYWluIGluIGVmZmVjdCBmcm9tIEp1bmUgMTYgdG8gU2VwdCAzMCAoMjAwOSkgYnV0IGlmCi0jIGltcGxlbWVudGVkIHRoZSBuZXh0IHllYXIsIGl0IHdpbGwgY29tZSBpbiBmb3JjZSBmcm9tIEFwcmlsIDEsIDIwMTAKLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wNi0wMik6Ci0jIFRoZXkgaGF2ZSBmaW5hbGx5IGRlY2lkZWQgbm93LCBidXQgY2hhbmdlZCB0aGUgc3RhcnQgZGF0ZSB0byBtaWRuaWdodCBiZXR3ZWVuCi0jIHRoZSAxOXRoIGFuZCAyMHRoLCBhbmQgdGhleSBoYXZlIG5vdCBzZXQgdGhlIGVuZCBkYXRlIHlldC4KLSMKLSMgU29tZSBzb3VyY2VzOgotIyA8YSBocmVmPSJodHRwOi8vaW4ucmV1dGVycy5jb20vYXJ0aWNsZS9zb3V0aEFzaWFOZXdzL2lkSU5JbmRpYS00MDAxNzYyMDA5MDYwMSI+Ci0jIGh0dHA6Ly9pbi5yZXV0ZXJzLmNvbS9hcnRpY2xlL3NvdXRoQXNpYU5ld3MvaWRJTkluZGlhLTQwMDE3NjIwMDkwNjAxCi0jIDwvYT4KLSMgPGEgaHJlZj0iaHR0cDovL2JkbmV3czI0LmNvbS9kZXRhaWxzLnBocD9pZD04NTg4OSZjaWQ9MiI+Ci0jIGh0dHA6Ly9iZG5ld3MyNC5jb20vZGV0YWlscy5waHA/aWQ9ODU4ODkmY2lkPTIKLSMgPC9hPgotIwotIyBPdXIgd3JhcC11cDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JhbmdsYWRlc2gtZGF5bGlnaHQtc2F2aW5nLTIwMDkuaHRtbCI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9iYW5nbGFkZXNoLWRheWxpZ2h0LXNhdmluZy0yMDA5Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gQS4gTi4gTS4gS2FtcnVzIFNhYWRhdCAoMjAwOS0wNi0xNSk6Ci0jIEZpbmFsbHkgd2UndmUgZ290IHRoZSBvZmZpY2lhbCBtYWlsIHJlZ2FyZGluZyBEU1Qgc3RhcnQgdGltZSB3aGVyZSBEU1Qgc3RhcnQgCi0jIHRpbWUgaXMgbWVudGlvbmVkIGFzIEp1biAxOSAyMDA5LCAyMzowMCBmcm9tIEJUUkMgKEJhbmdsYWRlc2ggCi0jIFRlbGVjb21tdW5pY2F0aW9uIFJlZ3VsYXRvcnkgQ29tbWlzc2lvbikuIAotIwotIyBObyBEU1QgZW5kIGRhdGUgaGFzIGJlZW4gYW5ub3VuY2VkIHlldC4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wOS0yNSk6Ci0jIEJhbmdsYWRlc2ggd29uJ3QgZ28gYmFjayB0byBTdGFuZGFyZCBUaW1lIGZyb20gT2N0b2JlciAxLCAyMDA5LCAKLSMgaW5zdGVhZCBpdCB3aWxsIGNvbnRpbnVlIERTVCBtZWFzdXJlIHRpbGwgdGhlIGNhYmluZXQgbWFrZXMgYSBmcmVzaCBkZWNpc2lvbi4gCi0jCi0jIEZvbGxvd2luZyByZXBvcnQgYnkgc2FtZSBuZXdzcGFwZXItIlRoZSBEYWlseSBTdGFyIEZyaWRheSI6Ci0jICJEU1QgY2hhbmdlIGF3YWl0cyBjYWJpbmV0IGRlY2lzaW9uLUNsb2NrIHdvbid0IGdvIGJhY2sgYnkgMS1ociBmcm9tIE9jdCAxIgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL25ld3MtZGV0YWlscy5waHA/bmlkPTEwNzAyMSI+Ci0jIGh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTA3MDIxCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDQuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA0Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTEzKToKLSMgSUFOUyAoSW5kby1Bc2lhbiBOZXdzIFNlcnZpY2UpIG5vdyByZXBvcnRzOgotIyBCYW5nbGFkZXNoIGhhcyBkZWNpZGVkIHRoYXQgdGhlIGNsb2NrIGFkdmFuY2VkIGJ5IGFuIGhvdXIgdG8gbWFrZSAKLSMgbWF4aW11bSB1c2Ugb2YgZGF5bGlnaHQgaG91cnMgYXMgYW4gZW5lcmd5IHNhdmluZyBtZWFzdXJlIHdvdWxkIAotIyAiY29udGludWUgZm9yIGFuIGluZGVmaW5pdGUgcGVyaW9kLiIKLSMKLSMgT25lIG9mIG1hbnkgcGxhY2VzIHdoZXJlIGl0IGlzIHB1Ymxpc2hlZDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sIj4KLSMgaHR0cDovL3d3dy50aGFpbmRpYW4uY29tL25ld3Nwb3J0YWwvYnVzaW5lc3MvYmFuZ2xhZGVzaC10by1jb250aW51ZS1pbmRlZmluaXRlbHktd2l0aC1hZHZhbmNlZC10aW1lXzEwMDI1OTk4Ny5odG1sCi0jIDwvYT4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0xMi0yNCk6Ci0jIEFjY29yZGluZyB0byBCYW5nbGFkZXNoIG5ld3NwYXBlciAiVGhlIERhaWx5IFN0YXIsIgotIyBCYW5nbGFkZXNoIHdpbGwgY2hhbmdlIGl0cyBjbG9jayBiYWNrIHRvIFN0YW5kYXJkIFRpbWUgb24gRGVjIDMxLCAyMDA5LgotIwotIyBDbG9jayBnb2VzIGJhY2sgMS1ociBvbiBEZWMgMzEgbmlnaHQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlZGFpbHlzdGFyLm5ldC9uZXdEZXNpZ24vbmV3cy1kZXRhaWxzLnBocD9uaWQ9MTE5MjI4Ij4KLSMgaHR0cDovL3d3dy50aGVkYWlseXN0YXIubmV0L25ld0Rlc2lnbi9uZXdzLWRldGFpbHMucGhwP25pZD0xMTkyMjgKLSMgPC9hPgotIyBhbmQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDUuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYmFuZ2xhZGVzaDA1Lmh0bWwKLSMgPC9hPgotIwotIyAiLi4uVGhlIGdvdmVybm1lbnQgeWVzdGVyZGF5IGRlY2lkZWQgdG8gcHV0IHRoZSBjbG9jayBiYWNrIGJ5IG9uZSBob3VyCi0jIG9uIERlY2VtYmVyIDMxIG1pZG5pZ2h0IGFuZCB0aGUgbmV3IHRpbWUgd2lsbCBjb250aW51ZSB1bnRpbCBNYXJjaCAzMSwKLSMgMjAxMCBtaWRuaWdodC4gVGhlIGRlY2lzaW9uIGNhbWUgYXQgYSBjYWJpbmV0IG1lZXRpbmcgYXQgdGhlIFByaW1lCi0jIE1pbmlzdGVyJ3MgT2ZmaWNlIGxhc3QgbmlnaHQuLi4iCi0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTAtMDMtMjIpOgotIyBBY2NvcmRpbmcgdG8gQmFuZ2xhZGVzaCBuZXdzcGFwZXIgIlRoZSBEYWlseSBTdGFyLCIKLSMgQ2FiaW5ldCBjYW5jZWxzIERheWxpZ2h0IFNhdmluZyBUaW1lIAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL2xhdGVzdF9uZXdzLnBocD9uaWQ9MjI4MTciPgotIyBodHRwOi8vd3d3LnRoZWRhaWx5c3Rhci5uZXQvbmV3RGVzaWduL2xhdGVzdF9uZXdzLnBocD9uaWQ9MjI4MTcKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2JhbmdsYWRlc2gwNi5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19iYW5nbGFkZXNoMDYuaHRtbAotIyA8L2E+Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCURoYWthCTIwMDkJb25seQktCUp1bgkxOQkyMzowMAkxOjAwCVMKLVJ1bGUJRGhha2EJMjAwOQlvbmx5CS0JRGVjCTMxCTIzOjU5CTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGhha2EJNjowMTo0MCAtCUxNVAkxODkwCi0JCQk1OjUzOjIwCS0JSE1UCTE5NDEgT2N0ICAgICMgSG93cmFoIE1lYW4gVGltZT8KLQkJCTY6MzAJLQlCVVJUCTE5NDIgTWF5IDE1ICMgQnVybWEgVGltZQotCQkJNTozMAktCUlTVAkxOTQyIFNlcAotCQkJNjozMAktCUJVUlQJMTk1MSBTZXAgMzAKLQkJCTY6MDAJLQlEQUNUCTE5NzEgTWFyIDI2ICMgRGFjY2EgVGltZQotCQkJNjowMAktCUJEVAkyMDA5Ci0JCQk2OjAwCURoYWthCUJEJXNUCi0KLSMgQmh1dGFuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvVGhpbXBodQk1OjU4OjM2IC0JTE1UCTE5NDcgQXVnIDE1ICMgb3IgVGhpbWJ1Ci0JCQk1OjMwCS0JSVNUCTE5ODcgT2N0Ci0JCQk2OjAwCS0JQlRUCSMgQmh1dGFuIFRpbWUKLQotIyBCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkKLSMgV2hpdG1hbiBhbmQgdGhlIDE5OTUgQ0lBIHRpbWUgem9uZSBtYXAgc2F5IDU6MDAsIGJ1dCB0aGUKLSMgMTk5NyBhbmQgbGF0ZXIgbWFwcyBzYXkgNjowMC4gIEFzc3VtZSB0aGUgc3dpdGNoIG9jY3VycmVkIGluIDE5OTYuCi0jIFdlIGhhdmUgbm8gaW5mb3JtYXRpb24gYXMgdG8gd2hlbiBzdGFuZGFyZCB0aW1lIHdhcyBpbnRyb2R1Y2VkOwotIyBhc3N1bWUgaXQgb2NjdXJyZWQgaW4gMTkwNywgdGhlIHNhbWUgeWVhciBhcyBNYXVyaXRpdXMgKHdoaWNoCi0jIHRoZW4gY29udGFpbmVkIHRoZSBDaGFnb3MgQXJjaGlwZWxhZ28pLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlJbmRpYW4vQ2hhZ29zCTQ6NDk6NDAJLQlMTVQJMTkwNwotCQkJNTowMAktCUlPVAkxOTk2ICMgQklPVCBUaW1lCi0JCQk2OjAwCS0JSU9UCi0KLSMgQnJ1bmVpCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQnJ1bmVpCTc6Mzk6NDAgLQlMTVQJMTkyNiBNYXIgICAjIEJhbmRhciBTZXJpIEJlZ2F3YW4KLQkJCTc6MzAJLQlCTlQJMTkzMwotCQkJODowMAktCUJOVAotCi0jIEJ1cm1hIC8gTXlhbm1hcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1Jhbmdvb24JNjoyNDo0MCAtCUxNVAkxODgwCQkjIG9yIFlhbmdvbgotCQkJNjoyNDozNgktCVJNVAkxOTIwCSAgICMgUmFuZ29vbiBNZWFuIFRpbWU/Ci0JCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAgICMgQnVybWEgVGltZQotCQkJOTowMAktCUpTVAkxOTQ1IE1heSAzCi0JCQk2OjMwCS0JTU1UCQkgICAjIE15YW5tYXIgVGltZQotCi0jIENhbWJvZGlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUGhub21fUGVuaAk2OjU5OjQwIC0JTE1UCTE5MDYgSnVuICA5Ci0JCQk3OjA2OjIwCS0JU01UCTE5MTEgTWFyIDExIDA6MDEgIyBTYWlnb24gTVQ/Ci0JCQk3OjAwCS0JSUNUCTE5MTIgTWF5Ci0JCQk4OjAwCS0JSUNUCTE5MzEgTWF5Ci0JCQk3OjAwCS0JSUNUCi0KLSMgQ2hpbmEKLQotIyBGcm9tIEd1eSBIYXJyaXM6Ci0jIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hLiAgWWVzLCB0aGV5IHJlYWxseSBoYXZlIG9ubHkgb25lIHRpbWUgem9uZS4KLQotIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgotIyBObyB0aGV5IGRvbid0LiAgU2VlIFRJTUUgbWFnLCAxOTg2LTAyLTE3IHAuNTIuICBFdmVuIHRob3VnaAotIyBDaGluYSBpcyBhY3Jvc3MgNCBwaHlzaWNhbCB0aW1lIHpvbmVzLCBiZWZvcmUgRmViIDEsIDE5ODYgb25seSB0aGUKLSMgUGVraW5nIChCZWppbmcpIHRpbWUgem9uZSB3YXMgcmVjb2duaXplZC4gIFNpbmNlIHRoYXQgZGF0ZSwgQ2hpbmEKLSMgaGFzIHR3byBvZiAnZW0gLS0gUGVraW5nJ3MgYW5kIFVydW1xaSAobmFtZWQgYWZ0ZXIgdGhlIGNhcGl0YWwgb2YKLSMgdGhlIFhpbmppYW5nIFV5Z2h1ciBBdXRvbm9tb3VzIFJlZ2lvbikuICBJIGRvbid0IGtub3cgYWJvdXQgRFNUIGZvciBpdC4KLSMKLSMgLiAuIC5JIGp1c3QgZGVsZXRlZCB0aGUgRFNUIHRhYmxlIGFuZCB0aGlzIGVkaXRvciBtYWtlcyBpdCB0b28KLSMgcGFpbmZ1bCB0byBzdWNrIGluIGFub3RoZXIgY29weS4uICBTbywgaGVyZSBpcyB3aGF0IEkgaGF2ZSBmb3IKLSMgRFNUIHN0YXJ0L2VuZCBkYXRlcyBmb3IgUGVraW5nJ3MgdGltZSB6b25lIChpbmZvIGZyb20gQVApOgotIwotIyAgICAgMTk4NiBNYXkgNCAtIFNlcHQgMTQKLSMgICAgIDE5ODcgbWlkLUFwcmlsIC0gPz8KLQotIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg5LTAxLTE5KToKLSMgQ0hJTkEgICAgICAgICAgICAgICA4IEggIEFIRUFEIE9GIFVUQyAgQUxMIE9GIENISU5BLCBJTkNMIFRBSVdBTgotIyBDSElOQSAgICAgICAgICAgICAgIDkgSCAgQUhFQUQgT0YgVVRDICBBUFIgMTcgLSBTRVAgMTAKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgQ2hpbmEgKGV4Y2VwdCBmb3IgSG9uZyBLb25nIGFuZCBNYWNhdSkKLSMgaGFzIGhhZCBhIHNpbmdsZSB0aW1lIHpvbmUgc2luY2UgMTk4MCBNYXkgMSwgb2JzZXJ2aW5nIHN1bW1lciBEU1QKLSMgZnJvbSAxOTg2IHRocm91Z2ggMTk5MTsgdGhpcyBjb250cmFkaWN0cyBEZXZpbmUncwotIyBub3RlIGFib3V0IFRpbWUgbWFnYXppbmUsIHRob3VnaCBhcHBhcmVudGx5IF9zb21ldGhpbmdfIGhhcHBlbmVkIGluIDE5ODYuCi0jIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIGZvciBub3cuICBJIG1hZGUgdXAgbmFtZXMgZm9yIHRoZSBvdGhlcgotIyBwcmUtMTk4MCB0aW1lIHpvbmVzLgotCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJU2hhbmcJMTk0MAlvbmx5CS0JSnVuCSAzCTA6MDAJMTowMAlECi1SdWxlCVNoYW5nCTE5NDAJMTk0MQktCU9jdAkgMQkwOjAwCTAJUwotUnVsZQlTaGFuZwkxOTQxCW9ubHkJLQlNYXIJMTYJMDowMAkxOjAwCUQKLVJ1bGUJUFJDCTE5ODYJb25seQktCU1heQkgNAkwOjAwCTE6MDAJRAotUnVsZQlQUkMJMTk4NgkxOTkxCS0JU2VwCVN1bj49MTEJMDowMAkwCVMKLVJ1bGUJUFJDCTE5ODcJMTk5MQktCUFwcglTdW4+PTEwCTA6MDAJMTowMAlECi0KLSMgRnJvbSBBbnRob255IEZvayAoMjAwMS0xMi0yMCk6Ci0jIEJUVywgSSBkaWQgc29tZSByZXNlYXJjaCBvbi1saW5lIGFuZCBmb3VuZCBzb21lIGluZm8gcmVnYXJkaW5nIHRoZXNlIGZpdmUKLSMgaGlzdG9yaWMgdGltZXpvbmVzIGZyb20gc29tZSBUYWl3YW4gd2Vic2l0ZXMuICBBbmQgeWVzLCB0aGVyZSBhcmUgb2ZmaWNpYWwKLSMgQ2hpbmVzZSBuYW1lcyBmb3IgdGhlc2UgbG9jYWxlcyAoYmVmb3JlIDE5NDkpLgotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0wNy0xNCk6Ci0jIEkgaGF2ZSBpbnZlc3RpZ2F0ZWQgdGhlIHRpbWV6b25lcyBhcm91bmQgMTk3MCBvbiB0aGUKLSMgaHR0cDovL3d3dy5hc3Ryby5jb20vYXRsYXMgc2l0ZSBbd2l0aCBwcm92aW5jZXMgYW5kIGNvdW50eQotIyBib3VuZGFyaWVzIHN1bW1hcml6ZWQgYmVsb3ddLi4uLiAgQSBmZXcgb3RoZXIgZXhjZXB0aW9ucyB3ZXJlIHR3bwotIyBjb3VudGllcyBvbiB0aGUgU2ljaHVhbiBzaWRlIG9mIHRoZSBYaXphbmctU2ljaHVhbiBib3JkZXIsCi0jIGNvdW50aWVzIERlZ2UgYW5kIEJhaXl1IHdoaWNoIGxpZXMgb24gdGhlIFNpY2h1YW4gc2lkZSBhbmQgYXJlCi0jIHRoZXJlZm9yZSBzdXBwb3NlZCB0byBiZSBHTVQrNywgWGl6YW5nIHJlZ2lvbiBiZWluZyBHTVQrNiwgYnV0IERlZ2UKLSMgY291bnR5IGlzIEdNVCs4IGFjY29yZGluZyB0byBhc3Ryby5jb20gd2hpbGUgQmFpeXUgY291bnR5IGlzIEdNVCs2Ci0jIChjb3VsZCBiZSB0cnVlKSwgZm9yIHRoZSBtb21lbnQgSSBhbSBhc3N1bWluZyB0aGF0IHRob3NlIHR3bwotIyBjb3VudGllcyBhcmUgbWlzdGFrZXMgaW4gdGhlIGFzdHJvLmNvbSBkYXRhLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDItMTEpOgotIyBJIGp1c3Qgbm93IGNoZWNrZWQgR29vZ2xlIE5ld3MgZm9yIHdlc3Rlcm4gbmV3cyBzb3VyY2VzIHRoYXQgdGFsawotIyBhYm91dCBDaGluYSdzIHNpbmdsZSB0aW1lIHpvbmUsIGFuZCBjb3VsZG4ndCBmaW5kIGFueXRoaW5nIGJlZm9yZSAxOTg2Ci0jIHRhbGtpbmcgYWJvdXQgQ2hpbmEgYmVpbmcgaW4gb25lIHRpbWUgem9uZS4gIChUaGF0IGFydGljbGUgd2FzOiBKaW0KLSMgTWFubiwgIkEgY2x1bXN5IGVtYnJhY2UgZm9yIGFub3RoZXIgd2VzdGVybiBjdXN0b206IENoaW5hIG9uIGRheWxpZ2h0Ci0jIHRpbWUtLXNvcnQgb2YiLCBMb3MgQW5nZWxlcyBUaW1lcywgMTk4Ni0wNS0wNS4gIEJ5IHRoZSB3YXksIHRoaXMKLSMgYXJ0aWNsZSBjb25maXJtcyB0aGUgdHogZGF0YWJhc2UncyBkYXRhIGNsYWltaW5nIHRoYXQgQ2hpbmEgYmVnYW4KLSMgb2JzZXJ2aW5nIGRheWxpZ2h0IHNhdmluZyB0aW1lIGluIDE5ODYuCi0jCi0jIEZyb20gVGhvbWFzIFMuIE11bGxhbmV5ICgyMDA4LTAyLTExKToKLSMgSSB0aGluayB5b3UncmUgY29tYmluaW5nIHR3byBzdWJqZWN0cyB0aGF0IG5lZWQgdG8gdHJlYXRlZCAKLSMgc2VwYXJhdGVseTogZGF5bGlnaHQgc2F2aW5ncyAod2hpY2gsIHlvdSdyZSBjb3JyZWN0LCB3YXNuJ3QgCi0jIGltcGxlbWVudGVkIHVudGlsIHRoZSAxOTgwcykgYW5kIHRoZSB1bmlmaWVkIHRpbWUgem9uZSBjZW50ZXJlZCBuZWFyIAotIyBCZWlqaW5nICh3aGljaCB3YXMgaW1wbGVtZW50ZWQgaW4gMTk0OSkuIEJyaWVmbHksIHRoZXJlIHdhcyBhbHNvIGEgCi0jICJMaGFzYSBUaW1lIiBpbiBUaWJldCBhbmQgIlVydW1xaSBUaW1lIiBpbiBYaW5qaWFuZy4gVGhlIGZpcnN0IHdhcyAKLSMgY2Vhc2VkLCBhbmQgdGhlIHNlY29uZCBldmVudHVhbGx5IHJlY29nbml6ZWQgKGFnYWluLCBpbiB0aGUgMTk4MHMpLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA4LTA2LTMwKToKLSMgVGhlcmUgc2VlbXMgdG8gYmUgYSBnb29kIGNoYW5jZSBDaGluYSBzd2l0Y2hlZCB0byBhIHNpbmdsZSB0aW1lIHpvbmUgaW4gMTk0OQotIyByYXRoZXIgdGhhbiBpbiAxOTgwIGFzIFNoYW5rcyAmIFBvdHRlbmdlciBoYXZlIGl0LCBidXQgd2UgZG9uJ3QgaGF2ZSBhCi0jIHJlbGlhYmxlIGRvY3VtZW50YXJ5IHNvdXJjZSBzYXlpbmcgc28geWV0LCBzbyBmb3Igbm93IHdlIHN0aWxsIGdvIHdpdGgKLSMgU2hhbmtzICYgUG90dGVuZ2VyLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi0jIENoYW5nYmFpIFRpbWUgKCJMb25nLXdoaXRlIFRpbWUiLCBMb25nLXdoaXRlID0gSGVpbG9uZ2ppYW5nIGFyZWEpCi0jIEhlaWxvbmdqaWFuZyAoZXhjZXB0IE1vaGUgY291bnR5KSwgSmlsaW4KLVpvbmUJQXNpYS9IYXJiaW4JODoyNjo0NAktCUxNVAkxOTI4ICMgb3IgSGFlcmJpbgotCQkJODozMAktCUNIQVQJMTkzMiBNYXIgIyBDaGFuZ2JhaSBUaW1lCi0JCQk4OjAwCS0JQ1NUCTE5NDAKLQkJCTk6MDAJLQlDSEFUCTE5NjYgTWF5Ci0JCQk4OjMwCS0JQ0hBVAkxOTgwIE1heQotCQkJODowMAlQUkMJQyVzVAotIyBaaG9uZ3l1YW4gVGltZSAoIkNlbnRyYWwgcGxhaW4gVGltZSIpCi0jIG1vc3Qgb2YgQ2hpbmEKLVpvbmUJQXNpYS9TaGFuZ2hhaQk4OjA1OjUyCS0JTE1UCTE5MjgKLQkJCTg6MDAJU2hhbmcJQyVzVAkxOTQ5Ci0JCQk4OjAwCVBSQwlDJXNUCi0jIExvbmctc2h1IFRpbWUgKHByb2JhYmx5IGR1ZSB0byBMb25nIGFuZCBTaHUgYmVpbmcgdHdvIG5hbWVzIG9mIHRoYXQgYXJlYSkKLSMgR3Vhbmd4aSwgR3VpemhvdSwgSGFpbmFuLCBOaW5neGlhLCBTaWNodWFuLCBTaGFhbnhpLCBhbmQgWXVubmFuOwotIyBtb3N0IG9mIEdhbnN1OyB3ZXN0IElubmVyIE1vbmdvbGlhOyB3ZXN0IFFpbmdoYWk7IGFuZCB0aGUgR3Vhbmdkb25nCi0jIGNvdW50aWVzIERlcWluZywgRW5waW5nLCBLYWlwaW5nLCBMdW9kaW5nLCBUYWlzaGFuLCBYaW54aW5nLAotIyBZYW5nY2h1biwgWWFuZ2ppYW5nLCBZdSduYW4sIGFuZCBZdW5mdS4KLVpvbmUJQXNpYS9DaG9uZ3FpbmcJNzowNjoyMAktCUxNVAkxOTI4ICMgb3IgQ2h1bmdraW5nCi0JCQk3OjAwCS0JTE9OVAkxOTgwIE1heSAjIExvbmctc2h1IFRpbWUKLQkJCTg6MDAJUFJDCUMlc1QKLSMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKQotIyBUaGUgR2Fuc3UgY291bnRpZXMgQWtzYXksIEFueGksIER1bmh1YW5nLCBTdWJlaTsgd2VzdCBRaW5naGFpOwotIyB0aGUgR3Vhbmdkb25nIGNvdW50aWVzICBYdXdlbiwgSGFpa2FuZywgU3VpeGksIExpYW5qaWFuZywKLSMgWmhhbmppYW5nLCBXdWNodWFuLCBIdWF6aG91LCBHYW96aG91LCBNYW9taW5nLCBEaWFuYmFpLCBhbmQgWGlueWk7Ci0jIGVhc3QgVGliZXQsIGluY2x1ZGluZyBMaGFzYSwgQ2hhbWRvLCBTaGlnYWlzZSwgSmltc2FyLCBTaGF3YW4gYW5kIEh1dHViaTsKLSMgZWFzdCBYaW5qaWFuZywgaW5jbHVkaW5nIFVydW1xaSwgVHVycGFuLCBLYXJhbWF5LCBLb3JsYSwgTWluZmVuZywgSmluZ2hlLAotIyBXdXN1LCBRaWVtbywgWGlueWFuLCBXdWxhbnd1c3UsIEppbmdoZSwgWXVtaW4sIFRhY2hlbmcsIFR1b2xpLCBFbWluLAotIyBTaGloZXppLCBDaGFuZ2ppLCBZYW5xaSwgSGVzaHVvLCBUdW9rZXh1biwgVHVsdWZhbiwgU2hhbnNoYW4sIEhhbWksCi0jIEZ1a2FuZywgS3VpdHVuLCBLdW11a3VsaSwgTWlxdWFuLCBRaXRhaSwgYW5kIFR1cmZhbi4KLVpvbmUJQXNpYS9VcnVtcWkJNTo1MDoyMAktCUxNVAkxOTI4ICMgb3IgVXJ1bWNoaQotCQkJNjowMAktCVVSVVQJMTk4MCBNYXkgIyBVcnVtcWkgVGltZQotCQkJODowMAlQUkMJQyVzVAotIyBLdW5sdW4gVGltZQotIyBXZXN0IFRpYmV0LCBpbmNsdWRpbmcgUHVsYW4sIEFoZXFpLCBTaHVmdSwgU2h1bGU7Ci0jIFdlc3QgWGluamlhbmcsIGluY2x1ZGluZyBBa3N1LCBBdHVzaGksIFlpbmluZywgSGV0aWFuLCBDZWxlLCBMdW9wdSwgTmlsZWtlLAotIyBaaGFvc3UsIFRla2VzaSwgR29uZ2xpdSwgQ2hhYnVjaGFlciwgSHVvY2hlbmcsIEJvbGUsIFBpc2hhbiwgU3VpZGluZywKLSMgYW5kIFlhcmthbmQuCi0KLSMgRnJvbSBMdXRoZXIgTWEgKDIwMDktMTAtMTcpOgotIyBBbG1vc3QgYWxsICg+OTkuOSUpIGV0aG5pYyBDaGluZXNlIChwcm9wZXJseSBldGhuaWMgSGFuKSBsaXZpbmcgaW4KLSMgWGluamlhbmcgdXNlIENoaW5lc2UgU3RhbmRhcmQgVGltZS4gU29tZSBhcmUgYXdhcmUgb2YgWGluamlhbmcgdGltZSwKLSMgYnV0IGhhdmUgbm8gbmVlZCBvZiBpdC4gQWxsIHBsYW5lcywgdHJhaW5zLCBhbmQgc2Nob29scyBmdW5jdGlvbiBvbgotIyB3aGF0IGlzIGNhbGxlZCAiQmVpamluZyB0aW1lLiIgV2hlbiBIYW4gbWFrZSBhbiBhcHBvaW50bWVudCBpbiBDaGluZXNlCi0jIHRoZXkgaW1wbGljaXRseSB1c2UgQmVpamluZyB0aW1lLgotIwotIyBPbiB0aGUgb3RoZXIgaGFuZCwgZXRobmljIFV5Z2h1cnMsIHdobyBtYWtlIHVwIGFib3V0IGhhbGYgdGhlCi0jIHBvcHVsYXRpb24gb2YgWGluamlhbmcsIHR5cGljYWxseSB1c2UgIlhpbmppYW5nIHRpbWUiIHdoaWNoIGlzIHR3bwotIyBob3VycyBiZWhpbmQgQmVpamluZyB0aW1lLCBvciBVVEMgKzA2MDAuIFRoZSBnb3Zlcm5tZW50IG9mIHRoZSBYaW5qaWFuZwotIyBVeWdodXIgQXV0b25vbW91cyBSZWdpb24sIChYQVVSLCBvciBqdXN0IFhpbmppYW5nIGZvciBzaG9ydCkgYXMgd2VsbCBhcwotIyBsb2NhbCBnb3Zlcm5tZW50cyBzdWNoIGFzIHRoZSBVcnVtcWkgY2l0eSBnb3Zlcm5tZW50IHVzZSBib3RoIHRpbWVzIGluCi0jIHB1YmxpY2F0aW9ucywgcmVmZXJyaW5nIHRvIHdoYXQgaXMgcG9wdWxhcmx5IGNhbGxlZCBYaW5qaWFuZyB0aW1lIGFzCi0jICJVcnVtcWkgdGltZS4iIFdoZW4gVXlnaHVycyBtYWtlIGFuIGFwcG9pbnRtZW50IGluIHRoZSBVeWdodXIgbGFuZ3VhZ2UKLSMgdGhleSBhbG1vc3QgaW52YXJpYWJseSB1c2UgWGluamlhbmcgdGltZS4KLSMKLSMgKFRoZWlyIGV0aG5pYyBIYW4gY29tcGF0cmlvdHMgd291bGQgdHlwaWNhbGx5IGhhdmUgbm8gY2x1ZSBvZiBpdHMKLSMgd2lkZXNwcmVhZCB1c2UsIGhvd2V2ZXIsIGJlY2F1c2Ugc28gZXh0cmVtZWx5IGZldyBvZiB0aGVtIGFyZSBmbHVlbnQgaW4KLSMgVXlnaHVyLCBjb21wYXJhYmxlIHRvIHRoZSBudW1iZXIgb2YgQW5nbG8tQW1lcmljYW5zIGZsdWVudCBpbiBOYXZham8uKQotIwotIyAoLi4uQXMgd2l0aCB0aGUgcmVzdCBvZiBDaGluYSB0aGVyZSB3YXMgYSBicmllZiBpbnRlcnZhbCBlbmRpbmcgaW4gMTk5MAotIyBvciAxOTkxIHdoZW4gc3VtbWVyIHRpbWUgd2FzIGluIHVzZS4gIFRoZSBjb25mdXNpb24gd2FzIHNldmVyZSwgd2l0aAotIyB0aGUgcHJvdmluY2Ugbm90IGhhdmluZyBkdWFsIHRpbWVzIGJ1dCBmb3VyIHRpbWVzIGluIHVzZSBhdCB0aGUgc2FtZQotIyB0aW1lLiBTb21lIGFyZWFzIHJlbWFpbmVkIG9uIHN0YW5kYXJkIFhpbmppYW5nIHRpbWUgb3IgQmVpamluZyB0aW1lIGFuZAotIyBvdGhlcnMgbW92aW5nIHRoZWlyIGNsb2NrcyBhaGVhZC4pCi0jCi0jIC4uLmFuIGV4YW1wbGUgb2YgYW4gb2ZmaWNpYWwgd2Vic2l0ZSB1c2luZyBvZiBVcnVtcWkgdGltZS4KLSMKLSMgVGhlIGZpcnN0IGZldyBsaW5lcyBvZiB0aGUgR29vZ2xlIHRyYW5zbGF0aW9uIG9mCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZmp5c2dsLmdvdi5jbi9zaG93LmFzcHg/aWQ9MjM3OSZjaWQ9MzkiPgotIyBodHRwOi8vd3d3LmZqeXNnbC5nb3YuY24vc2hvdy5hc3B4P2lkPTIzNzkmY2lkPTM5Ci0jIDwvYT4KLSMgKHJldHJpZXZlZCAyMDA5LTEwLTEzKQotIyA+IFVydW1xaSBmaXJlIHNldmVuIHBlb3BsZSBhcmUgbWlzc2luZyB0aGUgYWxsZWdlZCBsb3NzZXMgb2YgYXQgbGVhc3QKLSMgPiA1MDAgbWlsbGlvbiB5dWFuCi0jID4KLSMgPiAoUmVwb3J0ZXIgRG9uZyBMaXUpIHRoZSBkYXkgYmVmb3JlIDIwOjIwIG9yIHNvIChVcnVtcWkgVGltZSAxODoyMCksCi0jID4gVXJ1bXFpIENpdHkgRGVwYXJ0bWVudCBvZiBJbnRlcm5hdGlvbmFsIFBsYXphIEx1dGhlciBRaWFudGFuZyBSaXZlcgotIyA+IGJ1cnN0IGZpcmUuIEFzIG9mIHllc3RlcmRheSwgMTg6MzAsIFVydW1xaSBDaXR5IEZpcmUgb2ZmaWNlcnMgYW5kIG1lbgotIyA+IGhhdmUgd29ya2VkIGNvbnRpbnVvdXNseSBmb3IgMjIgaG91cnMuLi4KLQotIyBGcm9tIEx1dGhlciBNYSAoMjAwOS0xMS0xOSk6Ci0jIFdpdGggdGhlIHJpc2sgb2YgYmVpbmcgcmVkdW5kYW50IHRvIHByZXZpb3VzIGFuc3dlcnMgdGhlc2UgYXJlIHRoZSBtb3N0IGNvbW1vbgotIyBFbmdsaXNoICJ0cmFuc2xpdGVyYXRpb25zIiAody9vIHVzaW5nIG5vbi1FbmdsaXNoIHN5bWJvbHMpOgotIwotIyAxLiBXdWx1bXVxaS4uLgotIyAyLiBLYXNoaS4uLgotIyAzLiBVcnVtcWkuLi4KLSMgNC4gS2FzaGdhci4uLgotIyAuLi4KLSMgNS4gSXQgc2VlbXMgdGhhdCBVeWdodXJzIGluIFVydW1xaSBoYXMgYmVlbiB1c2luZyBYaW5qaWFuZyBzaW5jZSBhdCBsZWFzdCB0aGUKLSMgMTk2MCdzLiBJIGtub3cgb2Ygb25lIEhhbiwgbm93IG92ZXIgNTAsIHdobyBncmV3IHVwIGluIHRoZSBzdXJyb3VuZGluZwotIyBjb3VudHJ5c2lkZSBhbmQgdXNlZCBYaW5qaWFuZyB0aW1lIGFzIGEgY2hpbGQuCi0jCi0jIDYuIExpa2V3aXNlIGZvciBLYXNoZ2FyIGFuZCB0aGUgcmVzdCBvZiBzb3V0aCBYaW5qaWFuZyBJIGRvbid0IGtub3cgb2YgYW55Ci0jIHN0YXJ0IGRhdGUgZm9yIFhpbmppYW5nIHRpbWUuCi0jCi0jIFdpdGhvdXQgaGF2aW5nIGFjY2VzcyB0byBsb2NhbCBoaXN0b3JpY2FsIHJlY29yZHMsIG5vciB0aGUgYWJpbGl0eSB0byBsZWdhbGx5Ci0jIHB1Ymxpc2ggdGhlbSwgSSB3b3VsZCBnbyB3aXRoIE9jdG9iZXIgMSwgMTk0OSwgd2hlbiBYaW5qaWFuZyBiZWNhbWUgdGhlIFV5Z2h1cgotIyBBdXRvbm9tb3VzIFJlZ2lvbiB1bmRlciB0aGUgUFJDLiAoQmVmb3JlIHRoYXQgVXlnaHVycywgb2YgY291cnNlLCB3b3VsZCBhbHNvCi0jIG5vdCBiZSB1c2luZyBCZWlqaW5nIHRpbWUsIGJ1dCBzb21lIGxvY2FsIHRpbWUuKQotCi1ab25lCUFzaWEvS2FzaGdhcgk1OjAzOjU2CS0JTE1UCTE5MjggIyBvciBLYXNoaSBvciBLYXhnYXIKLQkJCTU6MzAJLQlLQVNUCTE5NDAJICMgS2FzaGdhciBUaW1lCi0JCQk1OjAwCS0JS0FTVAkxOTgwIE1heQotCQkJODowMAlQUkMJQyVzVAotCi0KLSMgRnJvbSBMZWUgWWl1IENodW5nICgyMDA5LTEwLTI0KToKLSMgSSBmb3VuZCB0aGVyZSBhcmUgc29tZSBtaXN0YWtlcyBmb3IgdGhlLi4uRFNUIHJ1bGUgZm9yIEhvbmcKLSMgS29uZy4gW0FjY29yZGluZ10gdG8gdGhlIERTVCByZWNvcmQgZnJvbSBIb25nIEtvbmcgT2JzZXJ2YXRvcnkgKGFjdHVhbGx5LAotIyBpdCBpcyBub3QgW2FuXSBvYnNlcnZhdG9yeSwgYnV0IHRoZSBvZmZpY2lhbCBtZXRlb3JvbG9naWNhbCBhZ2VuY3kgb2YgSEssCi0jIGFuZCBhbHNvIHNlcnZlcyBhcyB0aGUgb2ZmaWNpYWwgdGltaW5nIGFnZW5jeSksIHRoZXJlIGFyZSBzb21lIG1pc3NpbmcKLSMgYW5kIGluY29ycmVjdCBydWxlcy4gQWx0aG91Z2ggdGhlIGV4YWN0IHN3aXRjaCBvdmVyIHRpbWUgaXMgbWlzc2luZywgSQotIyB0aGluayAzOjMwIGlzIGNvcnJlY3QuIFRoZSBvZmZpY2lhbCBEU1QgcmVjb3JkIGZvciBIb25nIEtvbmcgY2FuIGJlCi0jIG9idGFpbmVkIGZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtIj4KLSMgaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtCi0jIDwvYT4uCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDktMTAtMjgpOgotIyBIZXJlIGFyZSB0aGUgZGF0ZXMgZ2l2ZW4gYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtIj4KLSMgaHR0cDovL3d3dy5oa28uZ292LmhrL2d0cy90aW1lL1N1bW1lcnRpbWUuaHRtCi0jIDwvYT4KLSMgYXMgb2YgMjAwOS0xMC0yODoKLSMgWWVhciAgICAgICAgUGVyaW9kCi0jIDE5NDEgICAgICAgIDEgQXByIHRvIDMwIFNlcAotIyAxOTQyICAgICAgICBXaG9sZSB5ZWFyIAotIyAxOTQzICAgICAgICBXaG9sZSB5ZWFyCi0jIDE5NDQgICAgICAgIFdob2xlIHllYXIKLSMgMTk0NSAgICAgICAgV2hvbGUgeWVhcgotIyAxOTQ2ICAgICAgICAyMCBBcHIgdG8gMSBEZWMKLSMgMTk0NyAgICAgICAgMTMgQXByIHRvIDMwIERlYwotIyAxOTQ4ICAgICAgICAyIE1heSB0byAzMSBPY3QKLSMgMTk0OSAgICAgICAgMyBBcHIgdG8gMzAgT2N0Ci0jIDE5NTAgICAgICAgIDIgQXByIHRvIDI5IE9jdAotIyAxOTUxICAgICAgICAxIEFwciB0byAyOCBPY3QKLSMgMTk1MiAgICAgICAgNiBBcHIgdG8gMjUgT2N0Ci0jIDE5NTMgICAgICAgIDUgQXByIHRvIDEgTm92Ci0jIDE5NTQgICAgICAgIDIxIE1hciB0byAzMSBPY3QKLSMgMTk1NSAgICAgICAgMjAgTWFyIHRvIDYgTm92Ci0jIDE5NTYgICAgICAgIDE4IE1hciB0byA0IE5vdgotIyAxOTU3ICAgICAgICAyNCBNYXIgdG8gMyBOb3YKLSMgMTk1OCAgICAgICAgMjMgTWFyIHRvIDIgTm92Ci0jIDE5NTkgICAgICAgIDIyIE1hciB0byAxIE5vdgotIyAxOTYwICAgICAgICAyMCBNYXIgdG8gNiBOb3YKLSMgMTk2MSAgICAgICAgMTkgTWFyIHRvIDUgTm92Ci0jIDE5NjIgICAgICAgIDE4IE1hciB0byA0IE5vdgotIyAxOTYzICAgICAgICAyNCBNYXIgdG8gMyBOb3YKLSMgMTk2NCAgICAgICAgMjIgTWFyIHRvIDEgTm92Ci0jIDE5NjUgICAgICAgIDE4IEFwciB0byAxNyBPY3QKLSMgMTk2NiAgICAgICAgMTcgQXByIHRvIDE2IE9jdAotIyAxOTY3ICAgICAgICAxNiBBcHIgdG8gMjIgT2N0Ci0jIDE5NjggICAgICAgIDIxIEFwciB0byAyMCBPY3QKLSMgMTk2OSAgICAgICAgMjAgQXByIHRvIDE5IE9jdAotIyAxOTcwICAgICAgICAxOSBBcHIgdG8gMTggT2N0Ci0jIDE5NzEgICAgICAgIDE4IEFwciB0byAxNyBPY3QKLSMgMTk3MiAgICAgICAgMTYgQXByIHRvIDIyIE9jdAotIyAxOTczICAgICAgICAyMiBBcHIgdG8gMjEgT2N0Ci0jIDE5NzMvNzQgICAgIDMwIERlYyA3MyB0byAyMCBPY3QgNzQKLSMgMTk3NSAgICAgICAgMjAgQXByIHRvIDE5IE9jdAotIyAxOTc2ICAgICAgICAxOCBBcHIgdG8gMTcgT2N0Ci0jIDE5NzcgICAgICAgIE5pbAotIyAxOTc4ICAgICAgICBOaWwKLSMgMTk3OSAgICAgICAgMTMgTWF5IHRvIDIxIE9jdAotIyAxOTgwIHRvIE5vdyBOaWwKLSMgVGhlIHBhZ2UgZG9lcyBub3QgZ2l2ZSBzdGFydCBvciBlbmQgdGltZXMgb2YgZGF5LgotIyBUaGUgcGFnZSBkb2VzIG5vdCBnaXZlIGEgc3RhcnQgZGF0ZSBmb3IgMTk0Mi4KLSMgVGhlIHBhZ2UgZG9lcyBub3QgZ2l2dyBhbiBlbmQgZGF0ZSBmb3IgMTk0NS4KLSMgVGhlIEphcGFuZXNlIG9jY3VwYXRpb24gb2YgSG9uZyBLb25nIGJlZ2FuIG9uIDE5NDEtMTItMjUuCi0jIFRoZSBKYXBhbmVzZSBzdXJyZW5kZXIgb2YgSG9uZyBLb25nIHdhcyBzaWduZWQgMTk0NS0wOS0xNS4KLSMgRm9yIGxhY2sgb2YgYW55dGhpbmcgYmV0dGVyLCB1c2Ugc3RhcnQgb2YgdGhvc2UgZGF5cyBhcyB0aGUgdHJhbnNpdGlvbiB0aW1lcy4KLQotIyBIb25nIEtvbmcgKFhpYW5nZ2FuZykKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUhLCTE5NDEJb25seQktCUFwcgkxCTM6MzAJMTowMAlTCi1SdWxlCUhLCTE5NDEJb25seQktCVNlcAkzMAkzOjMwCTAJLQotUnVsZQlISwkxOTQ2CW9ubHkJLQlBcHIJMjAJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk0Nglvbmx5CS0JRGVjCTEJMzozMAkwCS0KLVJ1bGUJSEsJMTk0Nwlvbmx5CS0JQXByCTEzCTM6MzAJMTowMAlTCi1SdWxlCUhLCTE5NDcJb25seQktCURlYwkzMAkzOjMwCTAJLQotUnVsZQlISwkxOTQ4CW9ubHkJLQlNYXkJMgkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTQ4CTE5NTEJLQlPY3QJbGFzdFN1bgkzOjMwCTAJLQotUnVsZQlISwkxOTUyCW9ubHkJLQlPY3QJMjUJMzozMAkwCS0KLVJ1bGUJSEsJMTk0OQkxOTUzCS0JQXByCVN1bj49MQkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTUzCW9ubHkJLQlOb3YJMQkzOjMwCTAJLQotUnVsZQlISwkxOTU0CTE5NjQJLQlNYXIJU3VuPj0xOAkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTU0CW9ubHkJLQlPY3QJMzEJMzozMAkwCS0KLVJ1bGUJSEsJMTk1NQkxOTY0CS0JTm92CVN1bj49MQkzOjMwCTAJLQotUnVsZQlISwkxOTY1CTE5NzcJLQlBcHIJU3VuPj0xNgkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTY1CTE5NzcJLQlPY3QJU3VuPj0xNgkzOjMwCTAJLQotUnVsZQlISwkxOTczCW9ubHkJLQlEZWMJMzAJMzozMAkxOjAwCVMKLVJ1bGUJSEsJMTk3OQlvbmx5CS0JTWF5CVN1bj49OAkzOjMwCTE6MDAJUwotUnVsZQlISwkxOTc5CW9ubHkJLQlPY3QJU3VuPj0xNgkzOjMwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0hvbmdfS29uZwk3OjM2OjM2IC0JTE1UCTE5MDQgT2N0IDMwCi0JCQk4OjAwCUhLCUhLJXNUCTE5NDEgRGVjIDI1Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDE1Ci0JCQk4OjAwCUhLCUhLJXNUCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWl3YW4KLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBUYWl3YW4gb2JzZXJ2ZWQgRFNUIGR1cmluZyAxOTQ1LCB3aGVuIGl0Ci0jIHdhcyBzdGlsbCBjb250cm9sbGVkIGJ5IEphcGFuLiAgVGhpcyBpcyBoYXJkIHRvIGJlbGlldmUsIGJ1dCB3ZSBkb24ndAotIyBoYXZlIGFueSBvdGhlciBpbmZvcm1hdGlvbi4KLQotIyBGcm9tIHNtYWxsdWZvICgyMDEwLTA0LTAzKToKLSMgQWNjb3JkaW5nIHRvIFRhaXdhbidzIENXQiwKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jd2IuZ292LnR3L1Y2L2FzdHJvbm9teS9jZGF0YS9zdW1tZXJ0Lmh0bSI+Ci0jIGh0dHA6Ly93d3cuY3diLmdvdi50dy9WNi9hc3Ryb25vbXkvY2RhdGEvc3VtbWVydC5odG0KLSMgPC9hPgotIyBUYWlwZWkgaGFzIERTVCBpbiAxOTc5IGJldHdlZW4gSnVseSAxc3QgYW5kIFNlcCAzMC4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wNC0wNyk6Ci0jIEhlcmUncyBHb29nbGUncyB0cmFuc2xhdGlvbiBvZiB0aGUgdGFibGUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgInN1bW1lcnQuaHRtIiBwYWdlOgotIyBEZWNhZGUgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IGFuZCBlbmQgZGF0ZQotIyBSZXB1YmxpYyBvZiBDaGluYSAzNCB5ZWFycyB0byA0MCB5ZWFycyAoQUQgMTk0NS0xOTUxIHllYXJzKSBTdW1tZXIgVGltZSAgICAgICAgICAgICAgIE1heSAxIHRvIFNlcHRlbWJlciAzMCAKLSMgNDEgeWVhcnMgb2YgdGhlIFJlcHVibGljIG9mIENoaW5hIChBRCAxOTUyKSAgICAgICAgICAgICAgICAgRGF5bGlnaHQgU2F2aW5nIFRpbWUgICAgICBNYXJjaCAxIHRvIE9jdG9iZXIgMzEgCi0jIFJlcHVibGljIG9mIENoaW5hIDQyIHllYXJzIHRvIDQzIHllYXJzIChBRCAxOTUzLTE5NTQgeWVhcnMpIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgQXByaWwgMSB0byBPY3RvYmVyIDMxIAotIyBJbiB0aGUgNDQgeWVhcnMgdG8gNDUgeWVhcnMgKEFEIDE5NTUtMTk1NiB5ZWFycykgICAgICAgICAgICBEYXlsaWdodCBTYXZpbmcgVGltZSAgICAgIEFwcmlsIDEgdG8gU2VwdGVtYmVyIDMwIAotIyBSZXB1YmxpYyBvZiBDaGluYSA0NiB5ZWFycyB0byA0OCB5ZWFycyAoQUQgMTk1Ny0xOTU5KSAgICAgICBTdW1tZXIgVGltZSAgICAgICAgICAgICAgIEFwcmlsIDEgdG8gU2VwdGVtYmVyIDMwIAotIyBSZXB1YmxpYyBvZiBDaGluYSA0OSB5ZWFycyB0byA1MCB5ZWFycyAoQUQgMTk2MC0xOTYxKSAgICAgICBTdW1tZXIgVGltZSAgICAgICAgICAgICAgIEp1bmUgMSB0byBTZXB0ZW1iZXIgMzAgCi0jIFJlcHVibGljIG9mIENoaW5hIDUxIHllYXJzIHRvIDYyIHllYXJzIChBRCAxOTYyLTE5NzMgeWVhcnMpIFN0b3AgU3VtbWVyIFRpbWUgCi0jIFJlcHVibGljIG9mIENoaW5hIDYzIHllYXJzIHRvIDY0IHllYXJzICgxOTc0LTE5NzUgQUQpICAgICAgIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgQXByaWwgMSB0byBTZXB0ZW1iZXIgMzAgCi0jIFJlcHVibGljIG9mIENoaW5hIDY1IHllYXJzIHRvIDY3IHllYXJzICgxOTc2LTE5NzggQUQpICAgICAgIFN0b3AgRGF5bGlnaHQgU2F2aW5nIFRpbWUgCi0jIFJlcHVibGljIG9mIENoaW5hIDY4IHllYXJzIChBRCAxOTc5KSAgICAgICAgICAgICAgICAgICAgICAgIERheWxpZ2h0IFNhdmluZyBUaW1lICAgICAgSnVseSAxIHRvIFNlcHRlbWJlciAzMCAKLSMgUmVwdWJsaWMgb2YgQ2hpbmEgc2luY2UgNjkgeWVhcnMgKEFEIDE5ODApICAgICAgICAgICAgICAgICAgU3RvcCBEYXlsaWdodCBTYXZpbmcgVGltZQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUYWl3YW4JMTk0NQkxOTUxCS0JTWF5CTEJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NDUJMTk1MQktCU9jdAkxCTA6MDAJMAlTCi1SdWxlCVRhaXdhbgkxOTUyCW9ubHkJLQlNYXIJMQkwOjAwCTE6MDAJRAotUnVsZQlUYWl3YW4JMTk1MgkxOTU0CS0JTm92CTEJMDowMAkwCVMKLVJ1bGUJVGFpd2FuCTE5NTMJMTk1OQktCUFwcgkxCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTU1CTE5NjEJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlUYWl3YW4JMTk2MAkxOTYxCS0JSnVuCTEJMDowMAkxOjAwCUQKLVJ1bGUJVGFpd2FuCTE5NzQJMTk3NQktCUFwcgkxCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTc0CTE5NzUJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlUYWl3YW4JMTk3OQlvbmx5CS0JSnVuCTMwCTA6MDAJMTowMAlECi1SdWxlCVRhaXdhbgkxOTc5CW9ubHkJLQlTZXAJMzAJMDowMAkwCVMKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RhaXBlaQk4OjA2OjAwIC0JTE1UCTE4OTYgIyBvciBUYWliZWkgb3IgVCdhaS1wZWkKLQkJCTg6MDAJVGFpd2FuCUMlc1QKLQotIyBNYWNhdSAoTWFjYW8sIEFvbWVuKQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTWFjYXUJMTk2MQkxOTYyCS0JTWFyCVN1bj49MTYJMzozMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk2MQkxOTY0CS0JTm92CVN1bj49MQkzOjMwCTAJLQotUnVsZQlNYWNhdQkxOTYzCW9ubHkJLQlNYXIJU3VuPj0xNgkwOjAwCTE6MDAJUwotUnVsZQlNYWNhdQkxOTY0CW9ubHkJLQlNYXIJU3VuPj0xNgkzOjMwCTE6MDAJUwotUnVsZQlNYWNhdQkxOTY1CW9ubHkJLQlNYXIJU3VuPj0xNgkwOjAwCTE6MDAJUwotUnVsZQlNYWNhdQkxOTY1CW9ubHkJLQlPY3QJMzEJMDowMAkwCS0KLVJ1bGUJTWFjYXUJMTk2NgkxOTcxCS0JQXByCVN1bj49MTYJMzozMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk2NgkxOTcxCS0JT2N0CVN1bj49MTYJMzozMAkwCS0KLVJ1bGUJTWFjYXUJMTk3MgkxOTc0CS0JQXByCVN1bj49MTUJMDowMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk3MgkxOTczCS0JT2N0CVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJTWFjYXUJMTk3NAkxOTc3CS0JT2N0CVN1bj49MTUJMzozMAkwCS0KLVJ1bGUJTWFjYXUJMTk3NQkxOTc3CS0JQXByCVN1bj49MTUJMzozMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk3OAkxOTgwCS0JQXByCVN1bj49MTUJMDowMAkxOjAwCVMKLVJ1bGUJTWFjYXUJMTk3OAkxOTgwCS0JT2N0CVN1bj49MTUJMDowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9NYWNhdQk3OjM0OjIwIC0JTE1UCTE5MTIKLQkJCTg6MDAJTWFjYXUJTU8lc1QJMTk5OSBEZWMgMjAgIyByZXR1cm4gdG8gQ2hpbmEKLQkJCTg6MDAJUFJDCUMlc1QKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ3lwcnVzCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDeXBydXMJMTk3NQlvbmx5CS0JQXByCTEzCTA6MDAJMTowMAlTCi1SdWxlCUN5cHJ1cwkxOTc1CW9ubHkJLQlPY3QJMTIJMDowMAkwCS0KLVJ1bGUJQ3lwcnVzCTE5NzYJb25seQktCU1heQkxNQkwOjAwCTE6MDAJUwotUnVsZQlDeXBydXMJMTk3Nglvbmx5CS0JT2N0CTExCTA6MDAJMAktCi1SdWxlCUN5cHJ1cwkxOTc3CTE5ODAJLQlBcHIJU3VuPj0xCTA6MDAJMTowMAlTCi1SdWxlCUN5cHJ1cwkxOTc3CW9ubHkJLQlTZXAJMjUJMDowMAkwCS0KLVJ1bGUJQ3lwcnVzCTE5NzgJb25seQktCU9jdAkyCTA6MDAJMAktCi1SdWxlCUN5cHJ1cwkxOTc5CTE5OTcJLQlTZXAJbGFzdFN1bgkwOjAwCTAJLQotUnVsZQlDeXBydXMJMTk4MQkxOTk4CS0JTWFyCWxhc3RTdW4JMDowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9OaWNvc2lhCTI6MTM6MjggLQlMTVQJMTkyMSBOb3YgMTQKLQkJCTI6MDAJQ3lwcnVzCUVFJXNUCTE5OTggU2VwCi0JCQkyOjAwCUVVQXNpYQlFRSVzVAotIyBJQVRBIFNTSU0gKDE5OTgtMDkpIGhhcyBDeXBydXMgdXNpbmcgRVUgcnVsZXMgZm9yIHRoZSBmaXJzdCB0aW1lLgotCi0jIENsYXNzaWNhbGx5LCBDeXBydXMgYmVsb25ncyB0byBBc2lhOyBlLmcuIHNlZSBIZXJvZG90dXMsIEhpc3RvcmllcywgSS43Mi4KLSMgSG93ZXZlciwgZm9yIHZhcmlvdXMgcmVhc29ucyBtYW55IHVzZXJzIGV4cGVjdCB0byBmaW5kIGl0IHVuZGVyIEV1cm9wZS4KLUxpbmsJQXNpYS9OaWNvc2lhCUV1cm9wZS9OaWNvc2lhCi0KLSMgR2VvcmdpYQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk0LTExLTE5KToKLSMgVG9kYXkncyBfRWNvbm9taXN0XyAocCA2MCkgcmVwb3J0cyB0aGF0IEdlb3JnaWEgbW92ZWQgaXRzIGNsb2NrcyBmb3J3YXJkCi0jIGFuIGhvdXIgcmVjZW50bHksIGR1ZSB0byBhIGxhdyBwcm9wb3NlZCBieSBadXJhYiBNdXJ2YW5pZHplLAotIyBhbiBNUCB3aG8gd2VudCBvbiBhIGh1bmdlciBzdHJpa2UgZm9yIDExIGRheXMgdG8gZm9yY2UgZGlzY3Vzc2lvbiBhYm91dCBpdCEKLSMgV2UgaGF2ZSBubyBkZXRhaWxzLCBidXQgd2UnbGwgZ3Vlc3MgdGhleSBkaWRuJ3QgbW92ZSB0aGUgY2xvY2tzIGJhY2sgaW4gZmFsbC4KLSMKLSMgRnJvbSBNYXRoZXcgRW5nbGFuZGVyLCBxdW90aW5nIEFQICgxOTk2LTEwLTIzIDEzOjA1LTA0KToKLSMgSW5zdGVhZCBvZiBwdXR0aW5nIGJhY2sgY2xvY2tzIGF0IHRoZSBlbmQgb2YgT2N0b2JlciwgR2VvcmdpYQotIyB3aWxsIHN0YXkgb24gZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHRoaXMgd2ludGVyIHRvIHNhdmUgZW5lcmd5LAotIyBQcmVzaWRlbnQgRWR1YXJkIFNoZXZhcmRuYWR6ZSBkZWNyZWVkIFdlZG5lc2RheS4KLSMKLSMgRnJvbSB0aGUgQkJDIHZpYSBKb3NlcGggUy4gTXllcnMgKDIwMDQtMDYtMjcpOgotIwotIyBHZW9yZ2lhIG1vdmVkIGNsb3NlciB0byBXZXN0ZXJuIEV1cm9wZSBvbiBTdW5kYXkuLi4gIFRoZSBmb3JtZXIgU292aWV0Ci0jIHJlcHVibGljIGhhcyBjaGFuZ2VkIGl0cyB0aW1lIHpvbmUgYmFjayB0byB0aGF0IG9mIE1vc2Nvdy4gIEFzIGEgcmVzdWx0IGl0Ci0jIGlzIG5vdyBqdXN0IGZvdXIgaG91cnMgYWhlYWQgb2YgR3JlZW53aWNoIE1lYW4gVGltZSwgcmF0aGVyIHRoYW4gZml2ZSBob3VycwotIyBhaGVhZC4gIFRoZSBzd2l0Y2ggd2FzIGRlY3JlZWQgYnkgdGhlIHByby1XZXN0ZXJuIHByZXNpZGVudCBvZiBHZW9yZ2lhLAotIyBNaWtoYWlsIFNhYWthc2h2aWxpLCB3aG8gc2FpZCB0aGUgY2hhbmdlIHdhcyBwYXJ0bHkgcHJvbXB0ZWQgYnkgdGhlIHByb2Nlc3MKLSMgb2YgaW50ZWdyYXRpb24gaW50byBFdXJvcGUuCi0KLSMgRnJvbSBUZWltdXJheiBBYmFzaGlkemUgKDIwMDUtMTEtMDcpOgotIyBHb3Zlcm5tZW50IG9mIEdlb3JnaWEgLi4uIGRlY2lkZWQgdG8gTk9UIENIQU5HRSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgb24KLSMgW09jdC5dIDMwLCBhcyBpdCB3YXMgZG9uZSBiZWZvcmUgZHVyaW5nIGxhc3QgbW9yZSB0aGFuIDEwIHllYXJzLgotIyBDdXJyZW50bHksIHdlIGFyZSBpbiBmYWN0IEdNVCArNDowMCwgYXMgYmVmb3JlIDMwIE9jdG9iZXIgaXQgd2FzIEdNVAotIyArMzowMC4uLi4gVGhlIHByb2JsZW0gaXMsIHRoZXJlIGlzIE5PIEZPUk1BTCBMQVcgb3IgZ292ZXJubWVudGFsIGRvY3VtZW50Ci0jIGFib3V0IGl0LiAgQXMgZmFyIGFzIEkgY2FuIGZpbmQsIEkgd2FzIHRvbGQsIHRoYXQgdGhlcmUgaXMgbm8gZG9jdW1lbnQsCi0jIGJlY2F1c2Ugd2UganVzdCBESUROJ1QgSVNTVUUgZG9jdW1lbnQgYWJvdXQgc3dpdGNoaW5nIHRvIHdpbnRlciB0aW1lLi4uLgotIyBJIGRvbid0IGtub3cgd2hhdCBjYW4gYmUgZG9uZSwgZXNwZWNpYWxseSBrbm93aW5nIHRoYXQgc29tZSB5ZWFycyBhZ28gb3VyCi0jIERTVCBydWxlcyB3aGVyZSBjaGFuZ2VkIFRIUkVFIFRJTUVTIGR1cmluZyBvbmUgbW9udGguCi0KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1RiaWxpc2kJMjo1OToxNiAtCUxNVAkxODgwCi0JCQkyOjU5OjE2CS0JVEJNVAkxOTI0IE1heSAgMiAjIFRiaWxpc2kgTWVhbiBUaW1lCi0JCQkzOjAwCS0JVEJJVAkxOTU3IE1hciAgICAjIFRiaWxpc2kgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhIFRCSSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMzowMAkxOjAwCVRCSVNUCTE5OTEgQXByICA5ICMgaW5kZXBlbmRlbmNlCi0JCQkzOjAwIFJ1c3NpYUFzaWEgR0Ulc1QJMTk5MiAjIEdlb3JnaWEgVGltZQotCQkJMzowMCBFLUV1ckFzaWEJR0Ulc1QJMTk5NCBTZXAgbGFzdFN1bgotCQkJNDowMCBFLUV1ckFzaWEJR0Ulc1QJMTk5NiBPY3QgbGFzdFN1bgotCQkJNDowMAkxOjAwCUdFU1QJMTk5NyBNYXIgbGFzdFN1bgotCQkJNDowMCBFLUV1ckFzaWEJR0Ulc1QJMjAwNCBKdW4gMjcKLQkJCTM6MDAgUnVzc2lhQXNpYQlHRSVzVAkyMDA1IE1hciBsYXN0U3VuIDI6MDAKLQkJCTQ6MDAJLQlHRVQKLQotIyBFYXN0IFRpbW9yCi0KLSMgU2VlIEluZG9uZXNpYSBmb3IgdGhlIDE5NDUgdHJhbnNpdGlvbi4KLQotIyBGcm9tIEpvYW8gQ2FycmFzY2FsYW8sIGJyb3RoZXIgb2YgdGhlIGZvcm1lciBnb3Zlcm5vciBvZiBFYXN0IFRpbW9yLCBpbgotIyA8YSBocmVmPSJodHRwOi8vZXRhbi5vcmcvZXQ5OWMvZGVjZW1iZXIvMjYtMzEvMzBFVE1BWS5odG0iPgotIyBFYXN0IFRpbW9yIG1heSBiZSBsYXRlIGZvciBpdHMgbWlsbGVubml1bQotIyA8L2E+ICgxOTk5LTEyLTI2LzMxKToKLSMgUG9ydHVnYWwgdHJpZWQgdG8gY2hhbmdlIHRoZSB0aW1lIGZvcndhcmQgaW4gMTk3NCBiZWNhdXNlIHRoZSBzdW4KLSMgcmlzZXMgdG9vIGVhcmx5IGJ1dCB0aGUgc3VnZ2VzdGlvbiByYWlzZWQgYSBsb3Qgb2YgcHJvYmxlbXMgd2l0aCB0aGUKLSMgVGltb3Jlc2UgYW5kIEkgc3RpbGwgZG9uJ3QgdGhpbmsgaXQgd291bGQgd29yayB0b2RheSBiZWNhdXNlIGl0Ci0jIGNvbmZsaWN0cyB3aXRoIHRoZWlyIHdheSBvZiBsaWZlLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgotIyBXZSBkb24ndCBoYXZlIGFueSByZWNvcmQgb2YgdGhlIGFib3ZlIGF0dGVtcHQuCi0jIE1vc3QgbGlrZWx5IG91ciByZWNvcmRzIGFyZSBpbmNvbXBsZXRlLCBidXQgd2UgaGF2ZSBubyBiZXR0ZXIgZGF0YS4KLQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmhyaS5vcmcvbmV3cy93b3JsZC91bmRoL2xhc3QvMDAtMDgtMTYudW5kaC5odG1sIj4KLSMgRnJvbSBNYW5vZWwgZGUgQWxtZWlkYSBlIFNpbHZhLCBEZXB1dHkgU3Bva2VzbWFuIGZvciB0aGUgVU4gU2VjcmV0YXJ5LUdlbmVyYWwKLSMgKDIwMDAtMDgtMTYpPC9hPjoKLSMgVGhlIENhYmluZXQgb2YgdGhlIEVhc3QgVGltb3IgVHJhbnNpdGlvbiBBZG1pbmlzdHJhdGlvbiBkZWNpZGVkCi0jIHRvZGF5IHRvIGFkdmFuY2UgRWFzdCBUaW1vcidzIHRpbWUgYnkgb25lIGhvdXIuICBUaGUgdGltZSBjaGFuZ2UsCi0jIHdoaWNoIHdpbGwgYmUgcGVybWFuZW50LCB3aXRoIG5vIHNlYXNvbmFsIGFkanVzdG1lbnQsIHdpbGwgaGFwcGVuIGF0Ci0jIG1pZG5pZ2h0IG9uIFNhdHVyZGF5LCBTZXB0ZW1iZXIgMTYuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9EaWxpCTg6MjI6MjAgLQlMTVQJMTkxMgotCQkJODowMAktCVRMVAkxOTQyIEZlYiAyMSAyMzowMCAjIEUgVGltb3IgVGltZQotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMwotCQkJOTowMAktCVRMVAkxOTc2IE1heSAgMwotCQkJODowMAktCUNJVAkyMDAwIFNlcCAxNyAwMDowMAotCQkJOTowMAktCVRMVAotCi0jIEluZGlhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvS29sa2F0YQk1OjUzOjI4IC0JTE1UCTE4ODAJIyBLb2xrYXRhCi0JCQk1OjUzOjIwCS0JSE1UCTE5NDEgT2N0ICAgICMgSG93cmFoIE1lYW4gVGltZT8KLQkJCTY6MzAJLQlCVVJUCTE5NDIgTWF5IDE1ICMgQnVybWEgVGltZQotCQkJNTozMAktCUlTVAkxOTQyIFNlcAotCQkJNTozMAkxOjAwCUlTVAkxOTQ1IE9jdCAxNQotCQkJNTozMAktCUlTVAotIyBUaGUgZm9sbG93aW5nIGFyZSBsaWtlIEFzaWEvS29sa2F0YToKLSMJQW5kYW1hbiBJcwotIwlMYWtzaGFkd2VlcCAoTGFjY2FkaXZlLCBNaW5pY295IGFuZCBBbWluZGl2aSBJcykKLSMJTmljb2JhciBJcwotCi0jIEluZG9uZXNpYQotIwotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDAxLTA1LTI4KSwgb3ZlcnJpZGluZyBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIDxodHRwOi8vd3d3LnN1bWF0ZXJhLWluYy5jb20vZ29fdG9faW52ZXN0L2Fib3V0X2luZG9uZXNpYS5hc3Ajc3RhbmR0aW1lPgotIyBzYXlzIHRoYXQgSW5kb25lc2lhJ3MgdGltZSB6b25lcyBjaGFuZ2VkIG9uIDE5ODgtMDEtMDEuICBMb29raW5nIGF0IHNvbWUKLSMgdGltZSB6b25lIG1hcHMsIEkgdGhpbmsgdGhhdCBtdXN0IHJlZmVyIHRvIFdlc3Rlcm4gQm9ybmVvIChLYWxpbWFudGFuIEJhcmF0Ci0jIGFuZCBLYWxpbWFudGFuIFRlbmdhaCkgc3dpdGNoaW5nIGZyb20gVVRDKzggdG8gVVRDKzcuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMTApOgotIyBIZXJlIGlzIGFub3RoZXIgY29ycmVjdGlvbiB0byBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIEpvaG5UV0Igd3JpdGVzIHRoYXQgSmFwYW5lc2UgZm9yY2VzIGRpZCBub3Qgc3VycmVuZGVyIGNvbnRyb2wgaW4KLSMgSW5kb25lc2lhIHVudGlsIDE5NDUtMDktMDEgMDA6MDAgYXQgdGhlIGVhcmxpZXN0IChpbiBKYWthcnRhKSBhbmQKLSMgb3RoZXIgZm9ybWFsIHN1cnJlbmRlciBjZXJlbW9uaWVzIHdlcmUgU2VwdGVtYmVyIDksIDExLCBhbmQgMTMsIHBsdXMKLSMgU2VwdGVtYmVyIDEyIGZvciB0aGUgcmVnaW9uYWwgc3VycmVuZGVyIHRvIE1vdW50YmF0dGVuIGluIFNpbmdhcG9yZS4KLSMgVGhlc2Ugd291bGQgYmUgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIHRpbWVzIGZvciBhIGNoYW5nZS4KLSMgUmVnaW1lcyBob3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgYnkgSGVucmkgTGUgQ29ycmUsIChFZGl0aW9ucwotIyBUcmFkaXRpb25uZWxsZXMsIDE5ODcsIFBhcmlzKSBzYXlzIHRoYXQgSmF2YSBhbmQgTWFkdXJhIHN3aXRjaGVkCi0jIGZyb20gSlNUIHRvIFVUQyswNzozMCBvbiAxOTQ1LTA5LTIzLCBhbmQgZ2l2ZXMgMTk0NC0wOS0wMSBmb3IgSmF5YXB1cmEKLSMgKEhvbGxhbmRpYSkuICBGb3Igbm93LCBhc3N1bWUgYWxsIEluZG9uZXNpYW4gbG9jYXRpb25zIG90aGVyIHRoYW4gSmF5YXB1cmEKLSMgc3dpdGNoZWQgb24gMTk0NS0wOS0yMy4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXNpYS9KYWthcnRhCTc6MDc6MTIgLQlMTVQJMTg2NyBBdWcgMTAKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGUgbmV4dCB0cmFuc2l0aW9uIHdhcyBhdCAxOTI0IEphbiAxIDA6MTMsCi0jIGJ1dCB0aGlzIG11c3QgYmUgYSB0eXBvLgotCQkJNzowNzoxMgktCUpNVAkxOTIzIERlYyAzMSAyMzo0NzoxMiAjIEpha2FydGEKLQkJCTc6MjAJLQlKQVZUCTE5MzIgTm92CSAjIEphdmEgVGltZQotCQkJNzozMAktCVdJVAkxOTQyIE1hciAyMwotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAyMwotCQkJNzozMAktCVdJVAkxOTQ4IE1heQotCQkJODowMAktCVdJVAkxOTUwIE1heQotCQkJNzozMAktCVdJVAkxOTY0Ci0JCQk3OjAwCS0JV0lUCi1ab25lIEFzaWEvUG9udGlhbmFrCTc6MTc6MjAJLQlMTVQJMTkwOCBNYXkKLQkJCTc6MTc6MjAJLQlQTVQJMTkzMiBOb3YgICAgIyBQb250aWFuYWsgTVQKLQkJCTc6MzAJLQlXSVQJMTk0MiBKYW4gMjkKLQkJCTk6MDAJLQlKU1QJMTk0NSBTZXAgMjMKLQkJCTc6MzAJLQlXSVQJMTk0OCBNYXkKLQkJCTg6MDAJLQlXSVQJMTk1MCBNYXkKLQkJCTc6MzAJLQlXSVQJMTk2NAotCQkJODowMAktCUNJVAkxOTg4IEphbiAgMQotCQkJNzowMAktCVdJVAotWm9uZSBBc2lhL01ha2Fzc2FyCTc6NTc6MzYgLQlMTVQJMTkyMAotCQkJNzo1NzozNgktCU1NVAkxOTMyIE5vdiAgICAjIE1hY2Fzc2FyIE1UCi0JCQk4OjAwCS0JQ0lUCTE5NDIgRmViICA5Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDIzCi0JCQk4OjAwCS0JQ0lUCi1ab25lIEFzaWEvSmF5YXB1cmEJOToyMjo0OCAtCUxNVAkxOTMyIE5vdgotCQkJOTowMAktCUVJVAkxOTQ0IFNlcCAgMQotCQkJOTozMAktCUNTVAkxOTY0Ci0JCQk5OjAwCS0JRUlUCi0KLSMgSXJhbgotCi0jIEZyb20gUm9vemJlaCBQb3VybmFkZXIgKDIwMDMtMDMtMTUpOgotIyBUaGlzIGlzIGFuIEVuZ2xpc2ggdHJhbnNsYXRpb24gb2Ygd2hhdCBJIGp1c3QgZm91bmQgKG9yaWdpbmFsbHkgaW4gUGVyc2lhbikuCi0jIFRoZSBHcmVnb3JpYW4gZGF0ZXMgaW4gYnJhY2tldHMgYXJlIG1pbmU6Ci0jCi0jCU9mZmljaWFsIE5ld3NwYXBlciBOby4gMTM1NDgtMTM3MC82LzI1IFsxOTkxLTA5LTE2XQotIwlOby4gMTY3NjAvVDIzMyBICQkJCTEzNzAvNi8xMCBbMTk5MS0wOS0wMV0KLSMKLSMJVGhlIFJ1bGUgQWJvdXQgQ2hhbmdlIG9mIHRoZSBPZmZpY2lhbCBUaW1lIG9mIHRoZSBDb3VudHJ5Ci0jCi0jCVRoZSBCb2FyZCBvZiBNaW5pc3RlcnMsIGluIHRoZSBtZWV0aW5nIGRhdGVkIDEzNzAvNS8yMyBbMTk5MS0wOC0xNF0sCi0jCWJhc2VkIG9uIHRoZSBzdWdnZXN0aW9uIG51bWJlciAyMjIxL0QgZGF0ZWQgMTM3MC80LzIyIFsxOTkxLTA3LTEzXQotIwlvZiB0aGUgQ291bnRyeSdzIE9yZ2FuaXphdGlvbiBmb3IgT2ZmaWNpYWwgYW5kIEVtcGxveW1lbnQgQWZmYWlycywKLSMJYW5kIHJlZmVycmluZyB0byB0aGUgbGF3IGZvciBlcXVhdGluZyB0aGUgd29ya2luZyBob3VycyBvZiB3b3JrZXJzCi0jCWFuZCBvZmZpY2VycyBpbiB0aGUgd2hvbGUgY291bnRyeSBkYXRlZCAxMzU5LzQvMjMgWzE5ODAtMDctMTRdLCBhbmQKLSMJZm9yIHN5bmNocm9uaXppbmcgdGhlIG9mZmljaWFsIHRpbWVzIG9mIHRoZSBjb3VudHJ5LCBhZ3JlZWQgdGhhdDoKLSMKLSMJVGhlIG9mZmljaWFsIHRpbWUgb2YgdGhlIGNvdW50cnkgd2lsbCBzaG91bGQgbW92ZSBmb3J3YXJkIG9uZSBob3VyCi0jCWF0IHRoZSAyNFs6MDBdIGhvdXJzIG9mIHRoZSBmaXJzdCBkYXkgb2YgRmFydmFyZGluIGFuZCBzaG91bGQgcmV0dXJuCi0jCXRvIGl0cyBwcmV2aW91cyBzdGF0ZSBhdCB0aGUgMjRbOjAwXSBob3VycyBvZiB0aGUgMzB0aCBkYXkgb2YKLSMJU2hhaHJpdmFyLgotIwotIwlGaXJzdCBEZXB1dHkgdG8gdGhlIFByZXNpZGVudCAtIEhhc3NhbiBIYWJpYmkKLSMKLSMgRnJvbSBwZXJzb25hbCBleHBlcmllbmNlLCB0aGF0IGFncmVlcyB3aXRoIHdoYXQgaGFzIGJlZW4gZm9sbG93ZWQKLSMgZm9yIGF0IGxlYXN0IHRoZSBsYXN0IDUgeWVhcnMuICBCZWZvcmUgdGhhdCwgZm9yIGEgZmV3IHllYXJzLCB0aGUKLSMgZGF0ZSB1c2VkIHdhcyB0aGUgZmlyc3QgVGh1cnNkYXkgbmlnaHQgb2YgRmFydmFyZGluIGFuZCB0aGUgbGFzdAotIyBUaHVyc2RheSBuaWdodCBvZiBTaGFocml2YXIsIGJ1dCBJIGNhbid0IGdpdmUgZXhhY3QgZGF0ZXMuLi4uCi0jIEkgaGF2ZSBhbHNvIGNoYW5nZWQgdGhlIGFiYnJldmlhdGlvbnMgdG8gd2hhdCBpcyBjb25zaWRlcmVkIGNvcnJlY3QKLSMgaGVyZSBpbiBJcmFuLCBJUlNUIGZvciByZWd1bGFyIHRpbWUgYW5kIElSRFQgZm9yIGRheWxpZ2h0IHNhdmluZyB0aW1lLgotIwotIyBGcm9tIFJvb3piZWggUG91cm5hZGVyICgyMDA1LTA0LTA1KToKLSMgVGhlIHRleHQgb2YgdGhlIElyYW5pYW4gbGF3LCBpbiBlZmZlY3Qgc2luY2UgMTkyNSwgY2xlYXJseSBtZW50aW9ucwotIyB0aGF0IHRoZSB0cnVlIHNvbGFyIHllYXIgaXMgdGhlIG1lYXN1cmUsIGFuZCB0aGVyZSBpcyBubyBhcml0aG1ldGljCi0jIGxlYXAgeWVhciBjYWxjdWxhdGlvbiBpbnZvbHZlZC4gIFRoZXJlIGhhcyBuZXZlciBiZWVuIGFueSBzZXJpb3VzCi0jIHBsYW4gdG8gY2hhbmdlIHRoYXQgbGF3Li4uLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgR28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYmVmb3JlIFNlcHQuIDE5OTEsIGFuZCB3aXRoIFBvdXJuYWRlciB0aGVyZWFmdGVyLgotIyBJIHVzZWQgRWQgUmVpbmdvbGQncyBjYWwtcGVyc2lhIGluIEdOVSBFbWFjcyAyMS4yIHRvIGNoZWNrIFBlcnNpYW4gZGF0ZXMsCi0jIHN0b3BwaW5nIGFmdGVyIDIwMzcgd2hlbiAzMi1iaXQgdGltZV90J3Mgb3ZlcmZsb3cuCi0jIFRoYXQgY2FsLXBlcnNpYSB1c2VkIEJpcmFzaGsncyBhcHByb3hpbWF0aW9uLCB3aGljaCBkaXNhZ3JlZXMgd2l0aCB0aGUgc29sYXIKLSMgY2FsZW5kYXIgcHJlZGljdGlvbnMgZm9yIHRoZSB5ZWFyIDIwMjUsIHNvIEkgY29ycmVjdGVkIHRob3NlIGRhdGVzIGJ5IGhhbmQuCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDMtMzApLCB3cml0aW5nIGFib3V0IGZ1dHVyZQotIyBkaXNjcmVwYW5jaWVzIGJldHdlZW4gY2FsLXBlcnNpYSBhbmQgdGhlIElyYW5pYW4gY2FsZW5kYXI6Ci0jIEZvciAyMDkxIHNvbGFyLWxvbmdpdHVkZS1hZnRlciB5aWVsZHMgMjA5MS0wMy0yMCAwODo0MDowNy43IFVUIGZvcgotIyB0aGUgdmVybmFsIGVxdWlub3ggYW5kIHRoYXQgZ2V0cyBzbyBjbG9zZSB0byAxMjowMCBzb21lIGxvY2FsCi0jIElyYW5pYW4gdGltZSB0aGF0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb3JyZWN0IGxvY2F0aW9uIG5lZWRzIHRvIGJlCi0jIGtub3duIGV4YWN0bHksIGFtb25nc3Qgb3RoZXIgZmFjdG9ycy4gIDIxNTcgaXMgZXZlbiBjbG9zZXI6Ci0jIDIxNTctMDMtMjAgMDg6Mzc6MTUuNSBVVC4gIEJ1dCB0aGUgR3JlZ29yaWFuIHllYXIgMjAyNSBzaG91bGQgZ2l2ZQotIyBubyBpbnRlcnByZXRhdGlvbiBwcm9ibGVtIHdoYXRzb2V2ZXIuICBCeSB0aGUgd2F5LCBhbm90aGVyIGluc3RhbnQKLSMgaW4gdGhlIG5lYXIgZnV0dXJlIHdoZXJlIHRoZXJlIHdpbGwgYmUgYSBkaXNjcmVwYW5jeSBiZXR3ZWVuCi0jIGFyaXRobWV0aWNhbCBhbmQgYXN0cm9ub21pY2FsIElyYW5pYW4gY2FsZW5kYXJzIHdpbGwgYmUgaW4gMjA1ODoKLSMgdmVybmFsIGVxdWlub3ggb24gMjA1OC0wMy0yMCAwOTowMzowNS45IFVULiAgVGhlIEphdmEgdmVyc2lvbiBvZgotIyBSZWluZ29sZCdzL0RlcnNob3dpdHonIGNhbGN1bGF0b3IgZ2l2ZXMgY29ycmVjdGx5IHRoZSBHcmVnb3JpYW4gZGF0ZQotIyAyMDU4LTAzLTIxIGZvciAxIEZhcnZhcmRpbiAxNDM3IChhc3Ryb25vbWljYWwpLgotIwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wMy0yMik6Ci0jIFNldmVyYWwgb2YgbXkgdXNlcnMgaGF2ZSByZXBvcnRlZCB0aGF0IElyYW4gd2lsbCBub3Qgb2JzZXJ2ZSBEU1QgYW55bW9yZToKLSMgaHR0cDovL3d3dy5pcm5hLmlyL2VuL25ld3Mvdmlldy9saW5lLTE3LzA2MDMxOTM4MTIxNjQ5NDguaHRtCi0jCi0jIEZyb20gUmV1dGVycyAoMjAwNy0wOS0xNiksIHdpdGggYSBoZWFkcy11cCBmcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbjoKLSMgLi4uIHRoZSBHdWFyZGlhbiBDb3VuY2lsIC4uLiBhcHByb3ZlZCBhIGxhdyBvbiBTdW5kYXkgdG8gcmUtaW50cm9kdWNlCi0jIGRheWxpZ2h0IHNhdmluZyB0aW1lIC4uLgotIyBodHRwOi8vdWsucmV1dGVycy5jb20vYXJ0aWNsZS9vaWxScHQvaWRVS0JMQTY1MDQ4NDIwMDcwOTE2Ci0jCi0jIEZyb20gUm9vemJlaCBQb3VybmFkZXIgKDIwMDctMTEtMDUpOgotIyBUaGlzIGlzIHF1b3RlZCBmcm9tIE9mZmljaWFsIEdhemV0dGUgb2YgdGhlIElzbGFtaWMgUmVwdWJsaWMgb2YKLSMgSXJhbiwgVm9sdW1lIDYzLCBOdW1iZXIgMTgyNDIsIGRhdGVkIFR1ZXNkYXkgMTM4Ni82LzI0Ci0jIFsyMDA3LTEwLTE2XS4gSSBhbSBkb2luZyB0aGUgYmVzdCB0cmFuc2xhdGlvbiBJIGNhbjouLi4KLSMgVGhlIG9mZmljaWFsIHRpbWUgb2YgdGhlIGNvdW50cnkgd2lsbCBiZSBtb3ZlZCBmb3J3YXJkIGZvciBvbmUgaG91cgotIyBvbiB0aGUgMjQgaG91cnMgb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGggb2YgRmFydmFyZGluIGFuZCB3aWxsCi0jIGJlIGNoYW5nZWQgYmFjayB0byBpdHMgcHJldmlvdXMgc3RhdGUgb24gdGhlIDI0IGhvdXJzIG9mIHRoZQotIyB0aGlydGlldGggZGF5IG9mIFNoYWhyaXZhci4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUlyYW4JMTk3OAkxOTgwCS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMTk3OAlvbmx5CS0JT2N0CTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMTk3OQlvbmx5CS0JU2VwCTE5CTA6MDAJMAlTCi1SdWxlCUlyYW4JMTk4MAlvbmx5CS0JU2VwCTIzCTA6MDAJMAlTCi1SdWxlCUlyYW4JMTk5MQlvbmx5CS0JTWF5CSAzCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMTk5MgkxOTk1CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMTk5MQkxOTk1CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMTk5Nglvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMTk5Nglvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMTk5NwkxOTk5CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMTk5NwkxOTk5CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwMAlvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwMAlvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwMQkyMDAzCS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwMQkyMDAzCS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwNAlvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwNAlvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwNQlvbmx5CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwNQlvbmx5CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwOAlvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwOAlvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAwOQkyMDExCS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAwOQkyMDExCS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAxMglvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAxMglvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAxMwkyMDE1CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAxMwkyMDE1CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAxNglvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAxNglvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAxNwkyMDE5CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAxNwkyMDE5CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAyMAlvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAyMAlvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAyMQkyMDIzCS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAyMQkyMDIzCS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAyNAlvbmx5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAyNAlvbmx5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAyNQkyMDI3CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAyNQkyMDI3CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAyOAkyMDI5CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAyOAkyMDI5CS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAzMAkyMDMxCS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAzMAkyMDMxCS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAzMgkyMDMzCS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAzMgkyMDMzCS0JU2VwCTIxCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAzNAkyMDM1CS0JTWFyCTIyCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAzNAkyMDM1CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUlyYW4JMjAzNgkyMDM3CS0JTWFyCTIxCTA6MDAJMTowMAlECi1SdWxlCUlyYW4JMjAzNgkyMDM3CS0JU2VwCTIxCTA6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvVGVocmFuCTM6MjU6NDQJLQlMTVQJMTkxNgotCQkJMzoyNTo0NAktCVRNVAkxOTQ2CSMgVGVocmFuIE1lYW4gVGltZQotCQkJMzozMAktCUlSU1QJMTk3NyBOb3YKLQkJCTQ6MDAJSXJhbglJUiVzVAkxOTc5Ci0JCQkzOjMwCUlyYW4JSVIlc1QKLQotCi0jIElyYXEKLSMKLSMgRnJvbSBKb25hdGhhbiBMZW5ub3ggKDIwMDAtMDYtMTIpOgotIyBBbiBhcnRpY2xlIGluIHRoaXMgd2VlaydzIEVjb25vbWlzdCAoIkluc2lkZSB0aGUgU2FkZGFtLWZyZWUgem9uZSIsIHAuIDUwIGluCi0jIHRoZSBVLlMuIGVkaXRpb24pIG9uIHRoZSBJcmFxaSBLdXJkcyBjb250YWlucyBhIHBhcmFncmFwaDoKLSMgIlRoZSB0aHJlZSBub3J0aGVybiBwcm92aW5jZXMgLi4uIHN3aXRjaGVkIHRoZWlyIGNsb2NrcyB0aGlzIHNwcmluZyBhbmQKLSMgYXJlIGFuIGhvdXIgYWhlYWQgb2YgQmFnaGRhZC4iCi0jCi0jIEJ1dCBSaXZlcyBNY0RvdyAoMjAwMC0wNi0xOCkgcXVvdGVzIGEgY29udGFjdCBpbiBJcmFxaS1LdXJkaXN0YW4gYXMgZm9sbG93czoKLSMgSW4gdGhlIHBhc3QsIHNvbWUgS3VyZGlzaCBuYXRpb25hbGlzdHMsIGFzIGEgcHJvdGVzdCB0byB0aGUgSXJhcWkKLSMgR292ZXJubWVudCwgZGlkIG5vdCBhZGhlcmUgdG8gZGF5bGlnaHQgc2F2aW5nIHRpbWUuICBUaGV5IHJlZmVycmVkCi0jIHRvIGRheWxpZ2h0IHNhdmluZyBhcyBTYWRkYW0gdGltZS4gIEJ1dCwgYXMgb2YgdG9kYXksIHRoZSB0aW1lIHpvbmUKLSMgaW4gSXJhcWktS3VyZGlzdGFuIGlzIG9uIHN0YW5kYXJkIHRpbWUgd2l0aCBCYWdoZGFkLCBJcmFxLgotIwotIyBTbyB3ZSdsbCBpZ25vcmUgdGhlIEVjb25vbWlzdCdzIGNsYWltLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTAzLTEwKToKLSMgVGhlIGNhYmluZXQgaW4gSXJhcSBhYm9saXNoZWQgRFNUIGxhc3Qgd2VlaywgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcKLSMgbmV3cyBzb3VyY2VzIChpbiBBcmFiaWMpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFsamVlcmFuLm5ldC93ZXNpbWFfYXJ0aWNsZXMvbmV3cy0yMDA4MDMwNS05ODYwMi5odG1sIj4KLSMgaHR0cDovL3d3dy5hbGplZXJhbi5uZXQvd2VzaW1hX2FydGljbGVzL25ld3MtMjAwODAzMDUtOTg2MDIuaHRtbAotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXN3YXRhbGlyYXEuaW5mby9sb29rL2FydGljbGUudHBsP2lkPTIwNDcmSWRMYW5ndWFnZT0xNyZJZFB1YmxpY2F0aW9uPTQmTnJBcnRpY2xlPTcxNzQzJk5ySXNzdWU9MSZOclNlY3Rpb249MTAiPgotIyBodHRwOi8vd3d3LmFzd2F0YWxpcmFxLmluZm8vbG9vay9hcnRpY2xlLnRwbD9pZD0yMDQ3JklkTGFuZ3VhZ2U9MTcmSWRQdWJsaWNhdGlvbj00Jk5yQXJ0aWNsZT03MTc0MyZOcklzc3VlPTEmTnJTZWN0aW9uPTEwCi0jIDwvYT4KLSMKLSMgV2UgaGF2ZSBwdWJsaXNoZWQgYSBzaG9ydCBhcnRpY2xlIGluIEVuZ2xpc2ggYWJvdXQgdGhlIGNoYW5nZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2lyYXEtZHVtcHMtZGF5bGlnaHQtc2F2aW5nLmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvaXJhcS1kdW1wcy1kYXlsaWdodC1zYXZpbmcuaHRtbAotIyA8L2E+Ci0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUlyYXEJMTk4Mglvbmx5CS0JTWF5CTEJMDowMAkxOjAwCUQKLVJ1bGUJSXJhcQkxOTgyCTE5ODQJLQlPY3QJMQkwOjAwCTAJUwotUnVsZQlJcmFxCTE5ODMJb25seQktCU1hcgkzMQkwOjAwCTE6MDAJRAotUnVsZQlJcmFxCTE5ODQJMTk4NQktCUFwcgkxCTA6MDAJMTowMAlECi1SdWxlCUlyYXEJMTk4NQkxOTkwCS0JU2VwCWxhc3RTdW4JMTowMHMJMAlTCi1SdWxlCUlyYXEJMTk4NgkxOTkwCS0JTWFyCWxhc3RTdW4JMTowMHMJMTowMAlECi0jIElBVEEgU1NJTSAoMTk5MS8xOTk2KSBzYXlzIEFwciAxIDEyOjAxYW0gVVRDOyBndWVzcyB0aGUgYDowMScgaXMgYSB0eXBvLgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IElyYXEgZGlkIG5vdCBvYnNlcnZlIERTVCAxOTkyLzE5OTc7IGlnbm9yZSB0aGlzLgotIwotUnVsZQlJcmFxCTE5OTEJMjAwNwktCUFwcgkgMQkzOjAwcwkxOjAwCUQKLVJ1bGUJSXJhcQkxOTkxCTIwMDcJLQlPY3QJIDEJMzowMHMJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFnaGRhZAkyOjU3OjQwCS0JTE1UCTE4OTAKLQkJCTI6NTc6MzYJLQlCTVQJMTkxOAkgICAgIyBCYWdoZGFkIE1lYW4gVGltZT8KLQkJCTM6MDAJLQlBU1QJMTk4MiBNYXkKLQkJCTM6MDAJSXJhcQlBJXNUCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIElzcmFlbAotCi0jIEZyb20gRXBocmFpbSBTaWx2ZXJiZXJnICgyMDAxLTAxLTExKToKLSMKLSMgSSBjb2luZWQgIklTVC9JRFQiIGNpcmNhIDE5ODguICBVbnRpbCB0aGVuIHRoZXJlIHdlcmUgdGhyZWUKLSMgZGlmZmVyZW50IGFiYnJldmlhdGlvbnMgaW4gdXNlOgotIwotIyBKU1QgIEplcnVzYWxlbSBTdGFuZGFyZCBUaW1lIFtEYW5ueSBCcmFuaXNzLCBIZWJyZXcgVW5pdmVyc2l0eV0KLSMgSVpUICBJc3JhZWwgWm9uYWwgKHNpYykgVGltZSBbUHJvZi4gSGFpbSBQYXBvLCBUZWNobmlvbl0KLSMgRUVTVCBFYXN0ZXJuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIFt1c2VkIGJ5IGFsbW9zdCBldmVyeW9uZSBlbHNlXQotIwotIyBTaW5jZSB0aW1lem9uZXMgc2hvdWxkIGJlIGNhbGxlZCBieSBjb3VudHJ5IGFuZCBub3QgY2FwaXRhbCBjaXRpZXMsCi0jIEkgcnVsZWQgb3V0IEpTVC4gIEFzIElzcmFlbCBpcyBpbiBBc2lhIE1pbm9yIGFuZCBub3QgRWFzdGVybiBFdXJvcGUsCi0jIEVFU1Qgd2FzIGVxdWFsbHkgdW5hY2NlcHRhYmxlLiAgU2luY2UgInpvbmFsIiB3YXMgbm90IGNvbXBhdGlibGUgd2l0aAotIyBhbnkgb3RoZXIgdGltZXpvbmUgYWJicmV2aWF0aW9uLCBJIGZlbHQgdGhhdCAnSVNUJyB3YXMgdGhlIHdheSB0byBnbwotIyBhbmQsIGluZGVlZCwgaXQgaGFzIHJlY2VpdmVkIGFsbW9zdCB1bml2ZXJzYWwgYWNjZXB0YW5jZSBpbiB0aW1lem9uZQotIyBzZXR0aW5ncyBpbiBJc3JhZWxpIGNvbXB1dGVycy4KLSMKLSMgSW4gYW55IGNhc2UsIEkgYW0gaGFwcHkgdG8gc2hhcmUgdGltZXpvbmUgYWJicmV2aWF0aW9ucyB3aXRoIEluZGlhLAotIyBoaWdoIG9uIG15IGZhdm9yaXRlLWNvdW50cnkgbGlzdCAoYW5kIG5vdCBvbmx5IGJlY2F1c2UgbXkgd2lmZSdzCi0jIGZhbWlseSBpcyBmcm9tIEluZGlhKS4KLQotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVppb24JMTk0MAlvbmx5CS0JSnVuCSAxCTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk0MgkxOTQ0CS0JTm92CSAxCTA6MDAJMAlTCi1SdWxlCVppb24JMTk0Mwlvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECi1SdWxlCVppb24JMTk0NAlvbmx5CS0JQXByCSAxCTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk0NQlvbmx5CS0JQXByCTE2CTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk0NQlvbmx5CS0JTm92CSAxCTI6MDAJMAlTCi1SdWxlCVppb24JMTk0Nglvbmx5CS0JQXByCTE2CTI6MDAJMTowMAlECi1SdWxlCVppb24JMTk0Nglvbmx5CS0JTm92CSAxCTA6MDAJMAlTCi1SdWxlCVppb24JMTk0OAlvbmx5CS0JTWF5CTIzCTA6MDAJMjowMAlERAotUnVsZQlaaW9uCTE5NDgJb25seQktCVNlcAkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NDgJMTk0OQktCU5vdgkgMQkyOjAwCTAJUwotUnVsZQlaaW9uCTE5NDkJb25seQktCU1heQkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTAJb25seQktCUFwcgkxNgkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTAJb25seQktCVNlcAkxNQkzOjAwCTAJUwotUnVsZQlaaW9uCTE5NTEJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTEJb25seQktCU5vdgkxMQkzOjAwCTAJUwotUnVsZQlaaW9uCTE5NTIJb25seQktCUFwcgkyMAkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTIJb25seQktCU9jdAkxOQkzOjAwCTAJUwotUnVsZQlaaW9uCTE5NTMJb25seQktCUFwcgkxMgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTMJb25seQktCVNlcAkxMwkzOjAwCTAJUwotUnVsZQlaaW9uCTE5NTQJb25seQktCUp1bgkxMwkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTQJb25seQktCVNlcAkxMgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NTUJb25seQktCUp1bgkxMQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTUJb25seQktCVNlcAkxMQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NTYJb25seQktCUp1bgkgMwkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTYJb25seQktCVNlcAkzMAkzOjAwCTAJUwotUnVsZQlaaW9uCTE5NTcJb25seQktCUFwcgkyOQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NTcJb25seQktCVNlcAkyMgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NzQJb25seQktCUp1bAkgNwkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NzQJb25seQktCU9jdAkxMwkwOjAwCTAJUwotUnVsZQlaaW9uCTE5NzUJb25seQktCUFwcgkyMAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5NzUJb25seQktCUF1ZwkzMQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5ODUJb25seQktCUFwcgkxNAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5ODUJb25seQktCVNlcAkxNQkwOjAwCTAJUwotUnVsZQlaaW9uCTE5ODYJb25seQktCU1heQkxOAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5ODYJb25seQktCVNlcAkgNwkwOjAwCTAJUwotUnVsZQlaaW9uCTE5ODcJb25seQktCUFwcgkxNQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5ODcJb25seQktCVNlcAkxMwkwOjAwCTAJUwotUnVsZQlaaW9uCTE5ODgJb25seQktCUFwcgkgOQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5ODgJb25seQktCVNlcAkgMwkwOjAwCTAJUwotCi0jIEZyb20gRXBocmFpbSBTaWx2ZXJiZXJnCi0jICgxOTk3LTAzLTA0LCAxOTk4LTAzLTE2LCAxOTk4LTEyLTI4LCAyMDAwLTAxLTE3LCAyMDAwLTA3LTI1LCAyMDA0LTEyLTIyLAotIyBhbmQgMjAwNS0wMi0xNyk6Ci0KLSMgQWNjb3JkaW5nIHRvIHRoZSBPZmZpY2Ugb2YgdGhlIFNlY3JldGFyeSBHZW5lcmFsIG9mIHRoZSBNaW5pc3RyeSBvZgotIyBJbnRlcmlvciwgdGhlcmUgaXMgTk8gc2V0IHJ1bGUgZm9yIERheWxpZ2h0LVNhdmluZ3MvU3RhbmRhcmQgdGltZSBjaGFuZ2VzLgotIyBPbmUgdGhpbmcgaXMgZW50cmVuY2hlZCBpbiBsYXcsIGhvd2V2ZXI6IHRoYXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAxNTAKLSMgZGF5cyBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgYW5udWFsbHkuICBGcm9tIDE5OTMtMTk5OCwgdGhlIGNoYW5nZSB0bwotIyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgd2FzIG9uIGEgRnJpZGF5IG1vcm5pbmcgZnJvbSBtaWRuaWdodCBJU1QgdG8KLSMgMSBhLm0gSURUOyB1cCB1bnRpbCAxOTk4LCB0aGUgY2hhbmdlIGJhY2sgdG8gc3RhbmRhcmQgdGltZSB3YXMgb24gYQotIyBTYXR1cmRheSBuaWdodCBmcm9tIG1pZG5pZ2h0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSB0byAxMSBwLm0uIHN0YW5kYXJkCi0jIHRpbWUuICAxOTk2IGlzIGFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgd2hlcmUgdGhlIGNoYW5nZSBiYWNrIHRvIHN0YW5kYXJkCi0jIHRpbWUgdG9vayBwbGFjZSBvbiBTdW5kYXkgbmlnaHQgaW5zdGVhZCBvZiBTYXR1cmRheSBuaWdodCB0byBhdm9pZAotIyBjb25mbGljdHMgd2l0aCB0aGUgSmV3aXNoIE5ldyBZZWFyLiAgSW4gMTk5OSwgdGhlIGNoYW5nZSB0bwotIyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgd2FzIHN0aWxsIG9uIGEgRnJpZGF5IG1vcm5pbmcgYnV0IGZyb20KLSMgMiBhLm0uIElTVCB0byAzIGEubS4gSURUOyBmdXJ0aGVybW9yZSwgdGhlIGNoYW5nZSBiYWNrIHRvIHN0YW5kYXJkIHRpbWUKLSMgd2FzIGFsc28gb24gYSBGcmlkYXkgbW9ybmluZyBmcm9tIDIgYS5tLiBJRFQgdG8gMSBhLm0uIElTVCBmb3IKLSMgMTk5OSBvbmx5LiAgSW4gdGhlIHllYXIgMjAwMCwgdGhlIGNoYW5nZSB0byBkYXlsaWdodCBzYXZpbmdzIHRpbWUgd2FzCi0jIHNpbWlsYXIgdG8gMTk5OSwgYnV0IGFsdGhvdWdoIHRoZSBjaGFuZ2UgYmFjayB3aWxsIGJlIG9uIGEgRnJpZGF5LCBpdAotIyB3aWxsIHRha2UgcGxhY2UgZnJvbSAxIGEubS4gSURUIHRvIG1pZG5pZ2h0IElTVC4gIFN0YXJ0aW5nIGluIDIwMDEsIGFsbAotIyBjaGFuZ2VzIHRvL2Zyb20gd2lsbCB0YWtlIHBsYWNlIGF0IDEgYS5tLiBvbGQgdGltZSwgYnV0IG5vdyB0aGVyZSBpcyBubwotIyBydWxlIGFzIHRvIHdoYXQgZGF5IG9mIHRoZSB3ZWVrIGl0IHdpbGwgdGFrZSBwbGFjZSBpbiBhcyB0aGUgc3RhcnQgZGF0ZQotIyAoZXhjZXB0IGluIDIwMDMpIGlzIHRoZSBuaWdodCBhZnRlciB0aGUgUGFzc292ZXIgU2VkZXIgKGkuZS4gdGhlIGV2ZQotIyBvZiB0aGUgMTZ0aCBvZiBOaXNhbiBpbiB0aGUgbHVuYXIgSGVicmV3IGNhbGVuZGFyKSBhbmQgdGhlIGVuZCBkYXRlCi0jIChleGNlcHQgaW4gMjAwMikgaXMgdGhyZWUgbmlnaHRzIGJlZm9yZSBZb20gS2lwcHVyIFtEYXkgb2YgQXRvbmVtZW50XQotIyAodGhlIGV2ZSBvZiB0aGUgN3RoIG9mIFRpc2hyZWkgaW4gdGhlIGx1bmFyIEhlYnJldyBjYWxlbmRhcikuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVppb24JMTk4OQlvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk4OQlvbmx5CS0JU2VwCSAzCTA6MDAJMAlTCi1SdWxlCVppb24JMTk5MAlvbmx5CS0JTWFyCTI1CTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk5MAlvbmx5CS0JQXVnCTI2CTA6MDAJMAlTCi1SdWxlCVppb24JMTk5MQlvbmx5CS0JTWFyCTI0CTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk5MQlvbmx5CS0JU2VwCSAxCTA6MDAJMAlTCi1SdWxlCVppb24JMTk5Mglvbmx5CS0JTWFyCTI5CTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk5Mglvbmx5CS0JU2VwCSA2CTA6MDAJMAlTCi1SdWxlCVppb24JMTk5Mwlvbmx5CS0JQXByCSAyCTA6MDAJMTowMAlECi1SdWxlCVppb24JMTk5Mwlvbmx5CS0JU2VwCSA1CTA6MDAJMAlTCi0KLSMgVGhlIGRhdGVzIGZvciAxOTk0LTE5OTUgd2VyZSBvYnRhaW5lZCBmcm9tIE9mZmljZSBvZiB0aGUgU3Bva2Vzd29tYW4gZm9yIHRoZQotIyBNaW5pc3RyeSBvZiBJbnRlcmlvciwgSmVydXNhbGVtLCBJc3JhZWwuICBUaGUgc3Bva2Vzd29tYW4gY2FuIGJlIHJlYWNoZWQgYnkKLSMgY2FsbGluZyB0aGUgb2ZmaWNlIGRpcmVjdGx5IGF0IDk3Mi0yLTY3MDE0NDcgb3IgOTcyLTItNjcwMTQ0OC4KLQotIyBSdWxlCU5BTUUgICAgRlJPTSAgICBUTyAgICAgIFRZUEUgICAgSU4gICAgICBPTiAgICAgIEFUICAgICAgU0FWRSAgICBMRVRURVIvUwotUnVsZQlaaW9uCTE5OTQJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTQJb25seQktCUF1ZwkyOAkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTUJb25seQktCU1hcgkzMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTUJb25seQktCVNlcAkgMwkwOjAwCTAJUwotCi0jIFRoZSBkYXRlcyBmb3IgMTk5NiB3ZXJlIGRldGVybWluZWQgYnkgdGhlIE1pbmlzdGVyIG9mIEludGVyaW9yIG9mIHRoZQotIyB0aW1lLCBIYWltIFJhbW9uLiAgVGhlIG9mZmljaWFsIGFubm91bmNlbWVudCByZWdhcmRpbmcgMTk5Ni0xOTk4Ci0jICh3aXRoIHRoZSBkYXRlcyBmb3IgMTk5Ny0xOTk4IG5vIGxvbmdlciBiZWluZyByZWxldmFudCkgY2FuIGJlIHZpZXdlZCBhdDoKLSMKLSMgICBmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8xOTk2LTE5OTgucmFtb24ucHMuZ3oKLSMKLSMgVGhlIGRhdGVzIGZvciAxOTk3LTE5OTggd2VyZSBhbHRlcmVkIGJ5IGhpcyBzdWNjZXNzb3IsIFJhYmJpIEVsaSBTdWlzc2EuCi0jCi0jIFRoZSBvZmZpY2lhbCBhbm5vdW5jZW1lbnRzIGZvciB0aGUgeWVhcnMgMTk5Ny0xOTk5IGNhbiBiZSB2aWV3ZWQgYXQ6Ci0jCi0jICAgZnRwOi8vZnRwLmNzLmh1amkuYWMuaWwvcHViL3R6L2Fubm91bmNlbWVudHMvWVlZWS5wcy5negotIwotIyAgICAgICB3aGVyZSBZWVlZIGlzIHRoZSByZWxldmFudCB5ZWFyLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlaaW9uCTE5OTYJb25seQktCU1hcgkxNQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTYJb25seQktCVNlcAkxNgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTcJb25seQktCU1hcgkyMQkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTcJb25seQktCVNlcAkxNAkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTgJb25seQktCU1hcgkyMAkwOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTgJb25seQktCVNlcAkgNgkwOjAwCTAJUwotUnVsZQlaaW9uCTE5OTkJb25seQktCUFwcgkgMgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTE5OTkJb25seQktCVNlcAkgMwkyOjAwCTAJUwotCi0jIFRoZSBLbmVzc2V0IEludGVyaW9yIENvbW1pdHRlZSBoYXMgY2hhbmdlZCB0aGUgZGF0ZXMgZm9yIDIwMDAgZm9yCi0jIHRoZSB0aGlyZCB0aW1lIGluIGp1c3Qgb3ZlciBhIHllYXIgYW5kIGhhdmUgc2V0IG5ldyBkYXRlcyBmb3IgdGhlCi0jIHllYXJzIDIwMDEtMjAwNCBhcyB3ZWxsLgotIwotIyBUaGUgb2ZmaWNpYWwgYW5ub3VuY2VtZW50IGZvciB0aGUgc3RhcnQgZGF0ZSBvZiAyMDAwIGNhbiBiZSB2aWV3ZWQgYXQ6Ci0jCi0jCWZ0cDovL2Z0cC5jcy5odWppLmFjLmlsL3B1Yi90ei9hbm5vdW5jZW1lbnRzLzIwMDAtc3RhcnQucHMuZ3oKLSMKLSMgVGhlIG9mZmljaWFsIGFubm91bmNlbWVudCBmb3IgdGhlIGVuZCBkYXRlIG9mIDIwMDAgYW5kIHRoZSBkYXRlcwotIyBmb3IgdGhlIHllYXJzIDIwMDEtMjAwNCBjYW4gYmUgdmlld2VkIGF0OgotIwotIwlmdHA6Ly9mdHAuY3MuaHVqaS5hYy5pbC9wdWIvdHovYW5ub3VuY2VtZW50cy8yMDAwLTIwMDQucHMuZ3oKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJWmlvbgkyMDAwCW9ubHkJLQlBcHIJMTQJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDAwCW9ubHkJLQlPY3QJIDYJMTowMAkwCVMKLVJ1bGUJWmlvbgkyMDAxCW9ubHkJLQlBcHIJIDkJMTowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDAxCW9ubHkJLQlTZXAJMjQJMTowMAkwCVMKLVJ1bGUJWmlvbgkyMDAyCW9ubHkJLQlNYXIJMjkJMTowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDAyCW9ubHkJLQlPY3QJIDcJMTowMAkwCVMKLVJ1bGUJWmlvbgkyMDAzCW9ubHkJLQlNYXIJMjgJMTowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDAzCW9ubHkJLQlPY3QJIDMJMTowMAkwCVMKLVJ1bGUJWmlvbgkyMDA0CW9ubHkJLQlBcHIJIDcJMTowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDA0CW9ubHkJLQlTZXAJMjIJMTowMAkwCVMKLQotIyBUaGUgcHJvcG9zZWQgbGF3IGFncmVlZCB1cG9uIGJ5IHRoZSBLbmVzc2V0IEludGVyaW9yIENvbW1pdHRlZSBvbgotIyAyMDA1LTAyLTE0IGlzIHRoYXQsIGZvciAyMDA1IGFuZCBiZXlvbmQsIERTVCBzdGFydHMgYXQgMDI6MDAgdGhlCi0jIGxhc3QgRnJpZGF5IGJlZm9yZSBBcHJpbCAybmQgKGkuZS4gdGhlIGxhc3QgRnJpZGF5IGluIE1hcmNoIG9yIEFwcmlsCi0jIDFzdCBpdHNlbGYgaWYgaXQgZmFsbHMgb24gYSBGcmlkYXkpIGFuZCBlbmRzIGF0IDAyOjAwIG9uIHRoZSBTYXR1cmRheQotIyBuaWdodCBfYmVmb3JlXyB0aGUgZmFzdCBvZiBZb20gS2lwcHVyLgotIwotIyBUaG9zZSB3aG8gY2FuIHJlYWQgSGVicmV3IGNhbiB2aWV3IHRoZSBhbm5vdW5jZW1lbnQgYXQ6Ci0jCi0jCWZ0cDovL2Z0cC5jcy5odWppLmFjLmlsL3B1Yi90ei9hbm5vdW5jZW1lbnRzLzIwMDUrYmV5b25kLnBzCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wMi0yMik6Ci0jIEkgdXNlZCBFcGhyYWltIFNpbHZlcmJlcmcncyBkc3QtaXNyYWVsLmVsIHByb2dyYW0KLSMgPGZ0cDovL2Z0cC5jcy5odWppLmFjLmlsL3B1Yi90ei9zb2Z0d2FyZS9kc3QtaXNyYWVsLmVsPiAoMjAwNS0wMi0yMCkKLSMgYWxvbmcgd2l0aCBFZCBSZWluZ29sZCdzIGNhbC1oZWJyZXcgaW4gR05VIEVtYWNzIDIxLjQsCi0jIHRvIGdlbmVyYXRlIHRoZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGxpc3QuCi0jIChJIHJlcGxhY2VkICJsYXN0RnJpIiB3aXRoICJGcmk+PTI2IiBieSBoYW5kLikKLSMgVGhlIHNwcmluZyB0cmFuc2l0aW9ucyBiZWxvdyBhbGwgY29ycmVzcG9uZCB0byB0aGUgZm9sbG93aW5nIFJ1bGU6Ci0jCi0jIFJ1bGUJWmlvbgkyMDA1CW1heAktCU1hcglGcmk+PTI2CTI6MDAJMTowMAlECi0jCi0jIGJ1dCBvbGRlciB6aWMgaW1wbGVtZW50YXRpb25zIChlLmcuLCBTb2xhcmlzIDgpIGRvIG5vdCBzdXBwb3J0Ci0jICJGcmk+PTI2IiB0byBtZWFuIEFwcmlsIDEgaW4geWVhcnMgbGlrZSAyMDA1LCBzbyBmb3Igbm93IHdlIGxpc3QgdGhlCi0jIHNwcmluZ3RpbWUgdHJhbnNpdGlvbnMgZXhwbGljaXRseS4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJWmlvbgkyMDA1CW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDA1CW9ubHkJLQlPY3QJIDkJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDA2CTIwMTAJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMDYJb25seQktCU9jdAkgMQkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMDcJb25seQktCVNlcAkxNgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMDgJb25seQktCU9jdAkgNQkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMDkJb25seQktCVNlcAkyNwkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTAJb25seQktCVNlcAkxMgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTEJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMTEJb25seQktCU9jdAkgMgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMTIJMjAxNQktCU1hcglGcmk+PTI2CTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAxMglvbmx5CS0JU2VwCTIzCTI6MDAJMAlTCi1SdWxlCVppb24JMjAxMwlvbmx5CS0JU2VwCSA4CTI6MDAJMAlTCi1SdWxlCVppb24JMjAxNAlvbmx5CS0JU2VwCTI4CTI6MDAJMAlTCi1SdWxlCVppb24JMjAxNQlvbmx5CS0JU2VwCTIwCTI6MDAJMAlTCi1SdWxlCVppb24JMjAxNglvbmx5CS0JQXByCSAxCTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAxNglvbmx5CS0JT2N0CSA5CTI6MDAJMAlTCi1SdWxlCVppb24JMjAxNwkyMDIxCS0JTWFyCUZyaT49MjYJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDE3CW9ubHkJLQlTZXAJMjQJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDE4CW9ubHkJLQlTZXAJMTYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDE5CW9ubHkJLQlPY3QJIDYJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDIwCW9ubHkJLQlTZXAJMjcJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDIxCW9ubHkJLQlTZXAJMTIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDIyCW9ubHkJLQlBcHIJIDEJMjowMAkxOjAwCUQKLVJ1bGUJWmlvbgkyMDIyCW9ubHkJLQlPY3QJIDIJMjowMAkwCVMKLVJ1bGUJWmlvbgkyMDIzCTIwMzIJLQlNYXIJRnJpPj0yNgkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMjMJb25seQktCVNlcAkyNAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjQJb25seQktCU9jdAkgNgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjUJb25seQktCVNlcAkyOAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjYJb25seQktCVNlcAkyMAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjcJb25seQktCU9jdAkxMAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjgJb25seQktCVNlcAkyNAkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMjkJb25seQktCVNlcAkxNgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzAJb25seQktCU9jdAkgNgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzEJb25seQktCVNlcAkyMQkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzIJb25seQktCVNlcAkxMgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzMJb25seQktCUFwcgkgMQkyOjAwCTE6MDAJRAotUnVsZQlaaW9uCTIwMzMJb25seQktCU9jdAkgMgkyOjAwCTAJUwotUnVsZQlaaW9uCTIwMzQJMjAzNwktCU1hcglGcmk+PTI2CTI6MDAJMTowMAlECi1SdWxlCVppb24JMjAzNAlvbmx5CS0JU2VwCTE3CTI6MDAJMAlTCi1SdWxlCVppb24JMjAzNQlvbmx5CS0JT2N0CSA3CTI6MDAJMAlTCi1SdWxlCVppb24JMjAzNglvbmx5CS0JU2VwCTI4CTI6MDAJMAlTCi1SdWxlCVppb24JMjAzNwlvbmx5CS0JU2VwCTEzCTI6MDAJMAlTCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9KZXJ1c2FsZW0JMjoyMDo1NiAtCUxNVAkxODgwCi0JCQkyOjIwOjQwCS0JSk1UCTE5MTgJIyBKZXJ1c2FsZW0gTWVhbiBUaW1lPwotCQkJMjowMAlaaW9uCUklc1QKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBKYXBhbgotCi0jIGA5OjAwJyBhbmQgYEpTVCcgaXMgZnJvbSBHdXkgSGFycmlzLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMDMtMDYpOgotIyBUb2RheSdzIF9Bc2FoaSBFdmVuaW5nIE5ld3NfIChwYWdlIDQpIHJlcG9ydHMgdGhhdCBKYXBhbiBoYWQKLSMgZGF5bGlnaHQgc2F2aW5nIGJldHdlZW4gMTk0OCBhbmQgMTk1MSwgYnV0IGBgdGhlIHN5c3RlbSB3YXMgZGlzY29udGludWVkCi0jIGJlY2F1c2UgdGhlIHB1YmxpYyBiZWxpZXZlZCBpdCB3b3VsZCBsZWFkIHRvIGxvbmdlciB3b3JraW5nIGhvdXJzLicnCi0KLSMgRnJvbSBNYXl1bWkgTmVnaXNoaSBpbiB0aGUgMjAwNS0wOC0xMCBKYXBhbiBUaW1lcwotIyA8aHR0cDovL3d3dy5qYXBhbnRpbWVzLmNvLmpwL2NnaS1iaW4vZ2V0YXJ0aWNsZS5wbDU/bm4yMDA1MDgxMGYyLmh0bT46Ci0jIE9jY3VwYXRpb24gYXV0aG9yaXRpZXMgaW1wb3NlZCBkYXlsaWdodC1zYXZpbmcgdGltZSBvbiBKYXBhbiBvbgotIyBbMTk0OC0wNS0wMV0uLi4uICBCdXQgbGFjayBvZiBwcmlvciBkZWJhdGUgYW5kIHRoZSBleGVjdXRpb24gb2YKLSMgZGF5bGlnaHQtc2F2aW5nIHRpbWUganVzdCB0aHJlZSBkYXlzIGFmdGVyIHRoZSBiaWxsIHdhcyBwYXNzZWQgZ2VuZXJhdGVkCi0jIGRlZXAgaGF0cmVkIG9mIHRoZSBjb25jZXB0Li4uLiAgVGhlIERpZXQgdW5jZXJlbW9uaW91c2x5IHBhc3NlZCBhIGJpbGwgdG8KLSMgZHVtcCB0aGUgdW5wb3B1bGFyIHN5c3RlbSBpbiBPY3RvYmVyIDE5NTEsIGxlc3MgdGhhbiBhIG1vbnRoIGFmdGVyIHRoZSBTYW4KLSMgRnJhbmNpc2NvIFBlYWNlIFRyZWF0eSB3YXMgc2lnbmVkLiAgKEEgZ292ZXJubWVudCBwb2xsIGluIDE5NTEgc2hvd2VkIDUzJQotIyBvZiB0aGUgSmFwYW5lc2Ugd2FudGVkIHRvIHNjcmFwIGRheWxpZ2h0LXNhdmluZyB0aW1lLCBhcyBvcHBvc2VkIHRvIDMwJSB3aG8KLSMgd2FudGVkIHRvIGtlZXAgaXQuKQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBEU1QgaW4gSmFwYW4gZHVyaW5nIHRob3NlIHllYXJzIHdhcyBhcyBmb2xsb3dzOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSmFwYW4JMTk0OAlvbmx5CS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJRAotUnVsZQlKYXBhbgkxOTQ4CTE5NTEJLQlTZXAJU2F0Pj04CTI6MDAJMAlTCi1SdWxlCUphcGFuCTE5NDkJb25seQktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJSmFwYW4JMTk1MAkxOTUxCS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJRAotIyBidXQgdGhlIG9ubHkgbG9jYXRpb25zIHVzaW5nIGl0IChmb3IgYmlydGggY2VydGlmaWNhdGVzLCBwcmVzdW1hYmx5LCBzaW5jZQotIyB0aGVpciBhdWRpZW5jZSBpcyBhc3Ryb2xvZ2Vycykgd2VyZSBVUyBtaWxpdGFyeSBiYXNlcy4gIEZvciBub3csIGFzc3VtZQotIyB0aGF0IGZvciBtb3N0IHB1cnBvc2VzIGRheWxpZ2h0LXNhdmluZyB0aW1lIHdhcyBvYnNlcnZlZDsgb3RoZXJ3aXNlLCB3aGF0Ci0jIHdvdWxkIGhhdmUgYmVlbiB0aGUgcG9pbnQgb2YgdGhlIDE5NTEgcG9sbD8KLQotIyBGcm9tIEhpZGV5dWtpIFN1enVraSAoMTk5OC0xMS0wOSk6Ci0jICdUb2t5bycgdXN1YWxseSBzdGFuZHMgZm9yIHRoZSBmb3JtZXIgbG9jYXRpb24gb2YgVG9reW8gQXN0cm9ub21pY2FsCi0jIE9ic2VydmF0b3J5OiBFIDEzOSA0NCcgNDAiLjkwICg5aCAxOG0gNThzLjcyNyksIE4gMzUgMzknIDE2Ii4wLgotIyBUaGlzIGRhdGEgaXMgZnJvbSAnUmlrYSBOZW5weW91IChDaHJvbm9sb2dpY2FsIFNjaWVudGlmaWMgVGFibGVzKSAxOTk2JwotIyBlZGl0ZWQgYnkgTmF0aW9uYWwgQXN0cm9ub21pY2FsIE9ic2VydmF0b3J5IG9mIEphcGFuLi4uLgotIyBKU1QgKEphcGFuIFN0YW5kYXJkIFRpbWUpIGhhcyBiZWVuIHVzZWQgc2luY2UgMTg4OC0wMS0wMSAwMDowMCAoSlNUKS4KLSMgVGhlIGxhdyBpcyBlbmFjdGVkIG9uIDE4ODYtMDctMDcuCi0KLSMgRnJvbSBIaWRleXVraSBTdXp1a2kgKDE5OTgtMTEtMTYpOgotIyBUaGUgb3JkaW5hbmNlIE5vLiA1MSAoMTg4NikgZXN0YWJsaXNoZWQgInN0YW5kYXJkIHRpbWUiIGluIEphcGFuLAotIyB3aGljaCBzdGFuZHMgZm9yIHRoZSB0aW1lIG9uIEUgMTM1IGRlZ3JlZS4KLSMgSW4gdGhlIG9yZGluYW5jZSBOby4gMTY3ICgxODk1KSwgInN0YW5kYXJkIHRpbWUiIHdhcyByZW5hbWVkIHRvICJjZW50cmFsCi0jIHN0YW5kYXJkIHRpbWUiLiAgQW5kIHRoZSBzYW1lIG9yZGluYW5jZSBhbHNvIGVzdGFibGlzaGVkICJ3ZXN0ZXJuIHN0YW5kYXJkCi0jIHRpbWUiLCB3aGljaCBzdGFuZHMgZm9yIHRoZSB0aW1lIG9uIEUgMTIwIGRlZ3JlZS4uLi4gIEJ1dCAid2VzdGVybiBzdGFuZGFyZAotIyB0aW1lIiB3YXMgYWJvbGlzaGVkIGluIHRoZSBvcmRpbmFuY2UgTm8uIDUyOSAoMTkzNykuICBJbiB0aGUgb3JkaW5hbmNlIE5vLgotIyAxNjcsIHRoZXJlIGlzIG5vIG1lbnRpb24gcmVnYXJkaW5nIGZvciB3aGF0IHBsYWNlIHdlc3Rlcm4gc3RhbmRhcmQgdGltZSBpcwotIyBzdGFuZGFyZC4uLi4KLSMKLSMgSSB3cm90ZSAib3JkaW5hbmNlIiBhYm92ZSwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlLgotIyBJbiBKYXBhbmVzZSBpdCdzICJjaG9rdXJlaSIsIHdoaWNoIG1lYW5zIG9yZGluYW5jZSBmcm9tIGVtcGVyb3IuCi0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGNsYWltIEpTVCBpbiB1c2Ugc2luY2UgMTg5NiwgYW5kIHRoYXQgYSBmZXcKLSMgcGxhY2VzIChlLmcuIElzaGlnYWtpKSB1c2UgKzA4MDA7IGdvIHdpdGggU3V6dWtpLiAgR3Vlc3MgdGhhdCBhbGwKLSMgb3JkaW5hbmNlcyB0b29rIGVmZmVjdCBvbiBKYW4gMS4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1Rva3lvCTk6MTg6NTkJLQlMTVQJMTg4NyBEZWMgMzEgMTU6MDB1Ci0JCQk5OjAwCS0JSlNUCTE4OTYKLQkJCTk6MDAJLQlDSlQJMTkzOAotCQkJOTowMAlKYXBhbglKJXNUCi0jIFNpbmNlIDE5MzgsIGFsbCBKYXBhbmVzZSBwb3NzZXNzaW9ucyBoYXZlIGJlZW4gbGlrZSBBc2lhL1Rva3lvLgotCi0jIEpvcmRhbgotIwotIyBGcm9tIDxhIGhyZWY9Imh0dHA6Ly9zdGFyLmFyYWJpYS5jb20vOTkwNzAxL0pPOS5odG1sIj4KLSMgSm9yZGFuIFdlZWsgKDE5OTktMDctMDEpIDwvYT4gdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMTk5OS0wOS0wOSk6Ci0jIENsb2NrcyBpbiBKb3JkYW4gd2VyZSBmb3J3YXJkZWQgb25lIGhvdXIgb24gV2VkbmVzZGF5IGF0IG1pZG5pZ2h0LAotIyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGdvdmVybm1lbnQncyBkZWNpc2lvbiB0byBpbXBsZW1lbnQgc3VtbWVyIHRpbWUKLSMgYWxsIHllYXIgcm91bmQuCi0jCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3N0YXIuYXJhYmlhLmNvbS85OTA5MzAvSk85Lmh0bWwiPgotIyBKb3JkYW4gV2VlayAoMTk5OS0wOS0zMCkgPC9hPiB2aWEgU3RlZmZlbiBUaG9yc2VuICgxOTk5LTExLTA5KToKLSMgV2ludGVyIHRpbWUgc3RhcnRzIHRvZGF5IFRodXJzZGF5LCAzMCBTZXB0ZW1iZXIuIENsb2NrcyB3aWxsIGJlIHR1cm5lZCBiYWNrCi0jIGJ5IG9uZSBob3VyLiAgVGhpcyBpcyB0aGUgbGF0ZXN0IGdvdmVybm1lbnQgZGVjaXNpb24gYW5kIGl0J3MgZmluYWwhCi0jIFRoZSBkZWNpc2lvbiB3YXMgdGFrZW4gYmVjYXVzZSBvZiB0aGUgaW5jcmVhc2UgaW4gd29ya2luZyBob3VycyBpbgotIyBnb3Zlcm5tZW50J3MgZGVwYXJ0bWVudHMgZnJvbSBzaXggdG8gc2V2ZW4gaG91cnMuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTEtMjIpOgotIyBTdGFydGluZyAyMDAzIHRyYW5zaXRpb25zIGFyZSBmcm9tIFN0ZWZmZW4gVGhvcnNlbidzIHdlYiBzaXRlIHRpbWVhbmRkYXRlLmNvbS4KLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMTEtMjMpOgotIyBGb3IgSm9yZGFuIEkgaGF2ZSByZWNlaXZlZCBtdWx0aXBsZSBpbmRlcGVuZGVudCB1c2VyIHJlcG9ydHMgZXZlcnkgeWVhcgotIyBhYm91dCBEU1QgZW5kIGRhdGVzLCBhcyB0aGUgZW5kLXJ1bGUgaXMgZGlmZmVyZW50IGV2ZXJ5IHllYXIuCi0jCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA2LTEwLTAxKSwgYWZ0ZXIgYSBoZWFkcy11cCBmcm9tIEhpbGFsIE1hbGF3aToKLSMgaHR0cDovL3d3dy5wZXRyYW5ld3MuZ292LmpvL25lcHJhcy8yMDA2L1NlcC8wNS80MDAwLmh0bQotIyAiSm9yZGFuIHdpbGwgc3dpdGNoIHRvIHdpbnRlciB0aW1lIG9uIEZyaWRheSwgT2N0b2JlciAyNyIuCi0jCi0KLSMgRnJvbSBQaGlsIFBpenpleSAoMjAwOS0wNC0wMik6Ci0jIC4uLkkgdGhpbmsgSSBtYXkgaGF2ZSBzcG90dGVkIGFuIGVycm9yIGluIHRoZSB0aW1lem9uZSBkYXRhIGZvcgotIyBKb3JkYW4uCi0jIFRoZSBjdXJyZW50ICgyMDA5ZCkgYXNpYSBmaWxlIHNob3dzIEpvcmRhbiBnb2luZyB0byBkYXlsaWdodAotIyBzYXZpbmcKLSMgdGltZSBvbiB0aGUgbGFzdCBUaHVyc2RheSBpbiBNYXJjaC4KLSMKLSMgUnVsZSAgSm9yZGFuICAgICAgMjAwMCAgbWF4CS0gIE1hciAgIGxhc3RUaHUgICAgIDA6MDBzIDE6MDAgIFMKLSMKLSMgSG93ZXZlciB0aW1lYW5kZGF0ZS5jb20sIHdoaWNoIEkgdXN1YWxseSBmaW5kIHJlbGlhYmxlLCBzaG93cyBKb3JkYW4KLSMgZ29pbmcgdG8gZGF5bGlnaHQgc2F2aW5nIHRpbWUgb24gdGhlIGxhc3QgRnJpZGF5IGluIE1hcmNoIHNpbmNlIDIwMDIuCi0jIFBsZWFzZSBzZWUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay90aW1lem9uZS5odG1sP249MTEiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS93b3JsZGNsb2NrL3RpbWV6b25lLmh0bWw/bj0xMQotIyA8L2E+Ci0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMDQtMDIpOgotIyBUaGlzIHNpbmdsZSBvbmUgbWlnaHQgYmUgZ29vZCBlbm91Z2gsICgyMDA5LTAzLTI0LCBBcmFiaWMpOgotIyA8YSBocmVmPSJodHRwOi8vcGV0cmEuZ292LmpvL0FydGljYWwuYXNweD9Mbmc9MiZTZWN0aW9uPTgmQXJ0aWNhbD05NTI3OSI+Ci0jIGh0dHA6Ly9wZXRyYS5nb3Yuam8vQXJ0aWNhbC5hc3B4P0xuZz0yJlNlY3Rpb249OCZBcnRpY2FsPTk1Mjc5Ci0jIDwvYT4KLSMKLSMgR29vZ2xlJ3MgdHJhbnNsYXRpb246Ci0jCi0jID4gVGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIGRlY2lkZWQgaW4gMjAwMiB0byBhZG9wdCB0aGUgcHJpbmNpcGxlIG9mIHRpbWVseQotIyA+IHN1Ym1pc3Npb24gb2YgdGhlIHN1bW1lciBhdCA2MCBtaW51dGVzIGFzIG9mIG1pZG5pZ2h0IG9uIHRoZSBsYXN0IFRodXJzZGF5Ci0jID4gb2YgdGhlIG1vbnRoIG9mIE1hcmNoIG9mIGVhY2ggeWVhci4KLSMKLSMgU28gLSB0aGlzIG1lYW5zIHRoZSBtaWRuaWdodCBiZXR3ZWVuIFRodXJzZGF5IGFuZCBGcmlkYXkgc2luY2UgMjAwMi4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOS0wNC0wNik6Ci0jIFdlIHN0aWxsIGhhdmUgSm9yZGFuIHN3aXRjaGluZyB0byBEU1Qgb24gVGh1cnNkYXlzIGluIDIwMDAgYW5kIDIwMDEuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUpvcmRhbgkxOTczCW9ubHkJLQlKdW4JNgkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk3MwkxOTc1CS0JT2N0CTEJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5NzQJMTk3NwktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTc2CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQotUnVsZQlKb3JkYW4JMTk3Nwlvbmx5CS0JT2N0CTEJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5NzgJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk3OAlvbmx5CS0JU2VwCTMwCTA6MDAJMAktCi1SdWxlCUpvcmRhbgkxOTg1CW9ubHkJLQlBcHIJMQkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk4NQlvbmx5CS0JT2N0CTEJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5ODYJMTk4OAktCUFwcglGcmk+PTEJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5ODYJMTk5MAktCU9jdAlGcmk+PTEJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5ODkJb25seQktCU1heQk4CTA6MDAJMTowMAlTCi1SdWxlCUpvcmRhbgkxOTkwCW9ubHkJLQlBcHIJMjcJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5OTEJb25seQktCUFwcgkxNwkwOjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMTk5MQlvbmx5CS0JU2VwCTI3CTA6MDAJMAktCi1SdWxlCUpvcmRhbgkxOTkyCW9ubHkJLQlBcHIJMTAJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5OTIJMTk5MwktCU9jdAlGcmk+PTEJMDowMAkwCS0KLVJ1bGUJSm9yZGFuCTE5OTMJMTk5OAktCUFwcglGcmk+PTEJMDowMAkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5OTQJb25seQktCVNlcAlGcmk+PTE1CTA6MDAJMAktCi1SdWxlCUpvcmRhbgkxOTk1CTE5OTgJLQlTZXAJRnJpPj0xNQkwOjAwcwkwCS0KLVJ1bGUJSm9yZGFuCTE5OTkJb25seQktCUp1bAkgMQkwOjAwcwkxOjAwCVMKLVJ1bGUJSm9yZGFuCTE5OTkJMjAwMgktCVNlcAlsYXN0RnJpCTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMjAwMAkyMDAxCS0JTWFyCWxhc3RUaHUJMDowMHMJMTowMAlTCi1SdWxlCUpvcmRhbgkyMDAyCW1heAktCU1hcglsYXN0VGh1CTI0OjAwCTE6MDAJUwotUnVsZQlKb3JkYW4JMjAwMwlvbmx5CS0JT2N0CTI0CTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMjAwNAlvbmx5CS0JT2N0CTE1CTA6MDBzCTAJLQotUnVsZQlKb3JkYW4JMjAwNQlvbmx5CS0JU2VwCWxhc3RGcmkJMDowMHMJMAktCi1SdWxlCUpvcmRhbgkyMDA2CW1heAktCU9jdAlsYXN0RnJpCTA6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0FtbWFuCTI6MjM6NDQgLQlMTVQJMTkzMQotCQkJMjowMAlKb3JkYW4JRUUlc1QKLQotCi0jIEthemFraHN0YW4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTExLTIyKToKLSMgQW5kcmV3IEV2dGljaG92ICgxOTk2LTA0LTEzKSB3cml0ZXMgdGhhdCBLYXpha2hzdGFuCi0jIHN0YXllZCBpbiBzeW5jIHdpdGggTW9zY293IGFmdGVyIDE5OTAsIGFuZCB0aGF0IEFxdG9iZSAoZm9ybWVybHkgQWt0eXViaW5zaykKLSMgYW5kIEFxdGF1IChmb3JtZXJseSBTaGV2Y2hlbmtvKSBhcmUgdGhlIGxhcmdlc3QgY2l0aWVzIGluIHRoZWlyIHpvbmVzLgotIyBHdWVzcyB0aGF0IEFxdGF1IGFuZCBBcXRvYmUgZGl2ZXJnZWQgaW4gMTk5NSwgc2luY2UgdGhhdCdzIHRoZSBmaXJzdCB0aW1lCi0jIElBVEEgU1NJTSBtZW50aW9ucyBhIHRoaXJkIHRpbWUgem9uZSBpbiBLYXpha2hzdGFuLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBHZXJtYW4gSW9maXMsIEVMU0ksIEFsbWF0eSAoMjAwMS0xMC0wOSkgcmVwb3J0cyB0aGF0IEthemFraHN0YW4gdXNlcwotIyBSdXNzaWFBc2lhIHJ1bGVzLCBpbnN0ZWFkIG9mIHN3aXRjaGluZyBhdCAwMDowMCBhcyB0aGUgSUFUQSBoYXMgaXQuCi0jIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLCB3aG8gaGF2ZSB0aGVtIGFsd2F5cyB1c2luZyBSdXNzaWFBc2lhIHJ1bGVzLgotIyBBbHNvIGdvIHdpdGggdGhlIGZvbGxvd2luZyBjbGFpbXMgb2YgU2hhbmtzICYgUG90dGVuZ2VyOgotIwotIyAtIEthemFraHN0YW4gZGlkIG5vdCBvYnNlcnZlIERTVCBpbiAxOTkxLgotIyAtIFF5enlsb3JkYSBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs2OjAwIG9uIDE5OTItMDEtMTkgMDI6MDAuCi0jIC0gT3JhbCBzd2l0Y2hlZCBmcm9tICs1OjAwIHRvICs0OjAwIGluIHNwcmluZyAxOTg5LgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cua2F6c29jaWV0eS5vcmcudWsvbmV3cy8yMDA1LzAzLzMwLmh0bSI+Ci0jIEZyb20gS2F6YWtoc3RhbiBFbWJhc3N5J3MgTmV3cyBCdWxsZXRpbiAjMTEgKDIwMDUtMDMtMjEpOgotIyA8L2E+Ci0jIFRoZSBHb3Zlcm5tZW50IG9mIEthemFraHN0YW4gcGFzc2VkIGEgcmVzb2x1dGlvbiBNYXJjaCAxNSBhYm9saXNoaW5nCi0jIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNpdGluZyBsYWNrIG9mIGVjb25vbWljIGJlbmVmaXRzIGFuZCBoZWFsdGgKLSMgY29tcGxpY2F0aW9ucyBjb3VwbGVkIHdpdGggYSBkZWNyZWFzZSBpbiBwcm9kdWN0aXZpdHkuCi0jCi0jIEZyb20gQnJhbmlzbGF2IEtvamljIChpbiBBc3RhbmEpIHZpYSBHd2lsbGltIExhdyAoMjAwNS0wNi0yOCk6Ci0jIC4uLiB3aGF0IGhhcHBlbmVkIHdhcyB0aGF0IHRoZSBmb3JtZXIgS2F6YWtoc3RhbiBFYXN0ZXJuIHRpbWUgem9uZQotIyB3YXMgImJsZW5kZWQiIHdpdGggdGhlIENlbnRyYWwgem9uZS4gIFRoZXJlZm9yZSwgS2F6YWtoc3RhbiBub3cgaGFzCi0jIHR3byB0aW1lIHpvbmVzLCBhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgb25lIGhvdXIuICBUaGUgem9uZQotIyBjbG9zZXIgdG8gVVRDIGlzIHRoZSBmb3JtZXIgV2VzdGVybiB6b25lIChwcm9iYWJseSBzdGlsbCBjYWxsZWQgdGhlCi0jIHNhbWUpLCBlbmNvbXBhc3NpbmcgZm91ciBwcm92aW5jZXMgaW4gdGhlIHdlc3Q6IEFxdG9iZSwgQXR5cmF1LAotIyBNYW5nZ2h5c3RhdSwgYW5kIFdlc3QgS2F6YWtoc3Rhbi4gIFRoZSBvdGhlciB6b25lIGVuY29tcGFzc2VzCi0jIGV2ZXJ5dGhpbmcgZWxzZS4uLi4gIEkgZ3Vlc3MgdGhhdCB3b3VsZCBtYWtlIEthemFraHN0YW4gdGltZSB6b25lcwotIyBkZSBqdXJlIFVUQys1IGFuZCBVVEMrNiByZXNwZWN0aXZlbHkuCi0KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMKLSMgQWxtYXR5IChmb3JtZXJseSBBbG1hLUF0YSksIHJlcHJlc2VudGluZyBtb3N0IGxvY2F0aW9ucyBpbiBLYXpha2hzdGFuCi1ab25lCUFzaWEvQWxtYXR5CTU6MDc6NDggLQlMTVQJMTkyNCBNYXkgIDIgIyBvciBBbG1hLUF0YQotCQkJNTowMAktCUFMTVQJMTkzMCBKdW4gMjEgIyBBbG1hLUF0YSBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEgQUxNJXNUCTE5OTEKLQkJCTY6MDAJLQlBTE1UCTE5OTIKLQkJCTY6MDAgUnVzc2lhQXNpYQlBTE0lc1QJMjAwNSBNYXIgMTUKLQkJCTY6MDAJLQlBTE1UCi0jIFF5enlsb3JkYSAoYWthIEt5enlsb3JkYSwgS2l6aWxvcmRhLCBLenlsLU9yZGEsIGV0Yy4pCi1ab25lCUFzaWEvUXl6eWxvcmRhCTQ6MjE6NTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlLSVpUCTE5MzAgSnVuIDIxICMgS2l6aWxvcmRhIFRpbWUKLQkJCTU6MDAJLQlLSVpUCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJS0laU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlLSVpUCTE5ODIgQXByICAxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJS0laJXNUCTE5OTEKLQkJCTU6MDAJLQlLSVpUCTE5OTEgRGVjIDE2ICMgaW5kZXBlbmRlbmNlCi0JCQk1OjAwCS0JUVlaVAkxOTkyIEphbiAxOSAyOjAwCi0JCQk2OjAwIFJ1c3NpYUFzaWEJUVlaJXNUCTIwMDUgTWFyIDE1Ci0JCQk2OjAwCS0JUVlaVAotIyBBcXRvYmUgKGFrYSBBa3RvYmUsIGZvcm1lcmx5IEFrdCd1Ymluc2spCi1ab25lCUFzaWEvQXF0b2JlCTM6NDg6NDAJLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlBS1RUCTE5MzAgSnVuIDIxICMgQWt0eXViaW5zayBUaW1lCi0JCQk1OjAwCS0JQUtUVAkxOTgxIEFwciAgMQotCQkJNTowMAkxOjAwCUFLVFNUCTE5ODEgT2N0ICAxCi0JCQk2OjAwCS0JQUtUVAkxOTgyIEFwciAgMQotCQkJNTowMCBSdXNzaWFBc2lhCUFLVCVzVAkxOTkxCi0JCQk1OjAwCS0JQUtUVAkxOTkxIERlYyAxNiAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCUFRVCVzVAkyMDA1IE1hciAxNSAjIEFxdG9iZSBUaW1lCi0JCQk1OjAwCS0JQVFUVAotIyBNYW5nZ2h5c3RhdQotIyBBcXRhdSB3YXMgbm90IGZvdW5kZWQgdW50aWwgMTk2MywgYnV0IGl0IHJlcHJlc2VudHMgYW4gaW5oYWJpdGVkIHJlZ2lvbiwKLSMgc28gaW5jbHVkZSB0aW1lIHN0YW1wcyBiZWZvcmUgMTk2My4KLVpvbmUJQXNpYS9BcXRhdQkzOjIxOjA0CS0JTE1UCTE5MjQgTWF5ICAyCi0JCQk0OjAwCS0JRk9SVAkxOTMwIEp1biAyMSAjIEZvcnQgU2hldmNoZW5rbyBUCi0JCQk1OjAwCS0JRk9SVAkxOTYzCi0JCQk1OjAwCS0JU0hFVAkxOTgxIE9jdCAgMSAjIFNoZXZjaGVua28gVGltZQotCQkJNjowMAktCVNIRVQJMTk4MiBBcHIgIDEKLQkJCTU6MDAgUnVzc2lhQXNpYQlTSEUlc1QJMTk5MQotCQkJNTowMAktCVNIRVQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAgUnVzc2lhQXNpYQlBUVQlc1QJMTk5NSBNYXIgbGFzdFN1biAyOjAwICMgQXF0YXUgVGltZQotCQkJNDowMCBSdXNzaWFBc2lhCUFRVCVzVAkyMDA1IE1hciAxNQotCQkJNTowMAktCUFRVFQKLSMgV2VzdCBLYXpha2hzdGFuCi1ab25lCUFzaWEvT3JhbAkzOjI1OjI0CS0JTE1UCTE5MjQgTWF5ICAyICMgb3IgVXJhbCdzawotCQkJNDowMAktCVVSQVQJMTkzMCBKdW4gMjEgIyBVcmFsJ3NrIHRpbWUKLQkJCTU6MDAJLQlVUkFUCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJVVJBU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlVUkFUCTE5ODIgQXByICAxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJVVJBJXNUCTE5ODkgTWFyIDI2IDI6MDAKLQkJCTQ6MDAgUnVzc2lhQXNpYQlVUkElc1QJMTk5MQotCQkJNDowMAktCVVSQVQJMTk5MSBEZWMgMTYgIyBpbmRlcGVuZGVuY2UKLQkJCTQ6MDAgUnVzc2lhQXNpYQlPUkElc1QJMjAwNSBNYXIgMTUgIyBPcmFsIFRpbWUKLQkJCTU6MDAJLQlPUkFUCi0KLSMgS3lyZ3l6c3RhbiAoS2lyZ2l6c3RhbikKLSMgVHJhbnNpdGlvbnMgdGhyb3VnaCAxOTkxIGFyZSBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTE1KToKLSMgQWNjb3JkaW5nIHRvIGFuIGFydGljbGUgZGF0ZWQgdG9kYXkgaW4gdGhlIEt5cmd5enN0YW4gRGV2ZWxvcG1lbnQgR2F0ZXdheQotIyA8aHR0cDovL2VuZy5nYXRld2F5LmtnL2NnaS1iaW4vcGFnZS5wbD9pZD0xJnN0b3J5X25hbWU9ZG9jOTk3OS5zaHRtbD4KLSMgS3lyZ3l6c3RhbiBpcyBjYW5jZWxpbmcgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIHN5c3RlbS4gIEkgdGFrZSB0aGUgYXJ0aWNsZQotIyB0byBtZWFuIHRoYXQgdGhleSB3aWxsIGxlYXZlIHRoZWlyIGNsb2NrcyBhdCA2IGhvdXJzIGFoZWFkIG9mIFVUQy4KLSMgRnJvbSBNYWxpayBBYmR1Z2FsaWV2ICgyMDA1LTA5LTIxKToKLSMgT3VyIGdvdmVybm1lbnQgY2FuY2VscyBkYXlsaWdodCBzYXZpbmcgdGltZSA2dGggb2YgQXVndXN0IDIwMDUuCi0jIEZyb20gMjAwNS0wOC0xMiBvdXIgR01ULW9mZnNldCBpcyArNiwgdy9vIGFueSBkYXlsaWdodCBzYXZpbmcuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUt5cmd5egkxOTkyCTE5OTYJLQlBcHIJU3VuPj03CTA6MDBzCTE6MDAJUwotUnVsZQlLeXJneXoJMTk5MgkxOTk2CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJS3lyZ3l6CTE5OTcJMjAwNQktCU1hcglsYXN0U3VuCTI6MzAJMTowMAlTCi1SdWxlCUt5cmd5egkxOTk3CTIwMDQJLQlPY3QJbGFzdFN1bgkyOjMwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL0Jpc2hrZWsJNDo1ODoyNCAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCUZSVVQJMTkzMCBKdW4gMjEgIyBGcnVuemUgVGltZQotCQkJNjowMCBSdXNzaWFBc2lhIEZSVSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJNTowMAkxOjAwCUZSVVNUCTE5OTEgQXVnIDMxIDI6MDAgIyBpbmRlcGVuZGVuY2UKLQkJCTU6MDAJS3lyZ3l6CUtHJXNUCTIwMDUgQXVnIDEyICAgICMgS3lyZ3l6c3RhbiBUaW1lCi0JCQk2OjAwCS0JS0dUCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBLb3JlYSAoTm9ydGggYW5kIFNvdXRoKQotCi0jIEZyb20gQW5uaWUgSS4gQmFuZyAoMjAwNi0wNy0xMCkgaW4KLSMgPGh0dHA6Ly93d3cua29yZWFoZXJhbGQuY28ua3IvU0lURS9kYXRhL2h0bWxfZGlyLzIwMDYvMDcvMTAvMjAwNjA3MTAwMDEyLmFzcD46Ci0jIFRoZSBNaW5pc3RyeSBvZiBDb21tZXJjZSwgSW5kdXN0cnkgYW5kIEVuZXJneSBoYXMgYWxyZWFkeQotIyBjb21taXNzaW9uZWQgYSByZXNlYXJjaCBwcm9qZWN0IFt0byByZWludHJvZHVjZSBEU1RdIGFuZCBoYXMgc2FpZAotIyB0aGUgc3lzdGVtIG1heSBiZWdpbiBhcyBlYXJseSBhcyAyMDA4Li4uLiAgS29yZWEgcmFuIGEgZGF5bGlnaHQKLSMgc2F2aW5nIHByb2dyYW0gZnJvbSAxOTQ5LTYxIGJ1dCBzdG9wcGVkIGl0IGR1cmluZyB0aGUgMTk1MC01MyBLb3JlYW4gV2FyLgotCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUk9LCTE5NjAJb25seQktCU1heQkxNQkwOjAwCTE6MDAJRAotUnVsZQlST0sJMTk2MAlvbmx5CS0JU2VwCTEzCTA6MDAJMAlTCi1SdWxlCVJPSwkxOTg3CTE5ODgJLQlNYXkJU3VuPj04CTA6MDAJMTowMAlECi1SdWxlCVJPSwkxOTg3CTE5ODgJLQlPY3QJU3VuPj04CTA6MDAJMAlTCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9TZW91bAk4OjI3OjUyCS0JTE1UCTE4OTAKLQkJCTg6MzAJLQlLU1QJMTkwNCBEZWMKLQkJCTk6MDAJLQlLU1QJMTkyOAotCQkJODozMAktCUtTVAkxOTMyCi0JCQk5OjAwCS0JS1NUCTE5NTQgTWFyIDIxCi0JCQk4OjAwCVJPSwlLJXNUCTE5NjEgQXVnIDEwCi0JCQk4OjMwCS0JS1NUCTE5NjggT2N0Ci0JCQk5OjAwCVJPSwlLJXNUCi1ab25lCUFzaWEvUHlvbmd5YW5nCTg6MjM6MDAgLQlMTVQJMTg5MAotCQkJODozMAktCUtTVAkxOTA0IERlYwotCQkJOTowMAktCUtTVAkxOTI4Ci0JCQk4OjMwCS0JS1NUCTE5MzIKLQkJCTk6MDAJLQlLU1QJMTk1NCBNYXIgMjEKLQkJCTg6MDAJLQlLU1QJMTk2MSBBdWcgMTAKLQkJCTk6MDAJLQlLU1QKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEt1d2FpdAotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBGcm9tIHRoZSBBcmFiIFRpbWVzICgyMDA3LTAzLTE0KToKLSMgVGhlIENpdmlsIFNlcnZpY2UgQ29tbWlzc2lvbiAoQ1NDKSBoYXMgYXBwcm92ZWQgYSBwcm9wb3NhbCBmb3J3YXJkZWQKLSMgYnkgTVAgQWhtYWQgQmFxZXIgb24gaW1wbGVtZW50aW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSAoRFNUKSBpbgotIyBLdXdhaXQgc3RhcnRpbmcgZnJvbSBBcHJpbCB1bnRpbCB0aGUgZW5kIG9mIFNlcHQgdGhpcyB5ZWFyLCByZXBvcnRzIEFsLUFuYmEuCi0jIDxodHRwOi8vd3d3LmFyYWJ0aW1lc29ubGluZS5jb20vYXJhYnRpbWVzL2t1d2FpdC9WaWV3ZGV0LmFzcD9JRD05OTUwPi4KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMy0yOSk6Ci0jIFdlIGRvbid0IGtub3cgdGhlIGRldGFpbHMsIG9yIHdoZXRoZXIgdGhlIGFwcHJvdmFsIG1lYW5zIGl0J2xsIGhhcHBlbiwKLSMgc28gZm9yIG5vdyB3ZSBhc3N1bWUgbm8gRFNULgotWm9uZQlBc2lhL0t1d2FpdAkzOjExOjU2IC0JTE1UCTE5NTAKLQkJCTM6MDAJLQlBU1QKLQotIyBMYW9zCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvVmllbnRpYW5lCTY6NTA6MjQgLQlMTVQJMTkwNiBKdW4gIDkgIyBvciBWaWFuZ2NoYW4KLQkJCTc6MDY6MjAJLQlTTVQJMTkxMSBNYXIgMTEgMDowMSAjIFNhaWdvbiBNVD8KLQkJCTc6MDAJLQlJQ1QJMTkxMiBNYXkKLQkJCTg6MDAJLQlJQ1QJMTkzMSBNYXkKLQkJCTc6MDAJLQlJQ1QKLQotIyBMZWJhbm9uCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlMZWJhbm9uCTE5MjAJb25seQktCU1hcgkyOAkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5MjAJb25seQktCU9jdAkyNQkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5MjEJb25seQktCUFwcgkzCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTkyMQlvbmx5CS0JT2N0CTMJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTIyCW9ubHkJLQlNYXIJMjYJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTIyCW9ubHkJLQlPY3QJOAkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5MjMJb25seQktCUFwcgkyMgkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5MjMJb25seQktCVNlcAkxNgkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5NTcJMTk2MQktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk1NwkxOTYxCS0JT2N0CTEJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTcyCW9ubHkJLQlKdW4JMjIJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTcyCTE5NzcJLQlPY3QJMQkwOjAwCTAJLQotUnVsZQlMZWJhbm9uCTE5NzMJMTk3NwktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk3OAlvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk3OAlvbmx5CS0JU2VwCTMwCTA6MDAJMAktCi1SdWxlCUxlYmFub24JMTk4NAkxOTg3CS0JTWF5CTEJMDowMAkxOjAwCVMKLVJ1bGUJTGViYW5vbgkxOTg0CTE5OTEJLQlPY3QJMTYJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTg4CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5ODkJb25seQktCU1heQkxMAkwOjAwCTE6MDAJUwotUnVsZQlMZWJhbm9uCTE5OTAJMTk5MgktCU1heQkxCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk5Mglvbmx5CS0JT2N0CTQJMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTkzCW1heAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCUxlYmFub24JMTk5MwkxOTk4CS0JU2VwCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJTGViYW5vbgkxOTk5CW1heAktCU9jdAlsYXN0U3VuCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmVpcnV0CTI6MjI6MDAgLQlMTVQJMTg4MAotCQkJMjowMAlMZWJhbm9uCUVFJXNUCi0KLSMgTWFsYXlzaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5Cb3JuZW8JMTkzNQkxOTQxCS0JU2VwCTE0CTA6MDAJMDoyMAlUUyAjIG9uZS1UaGlyZCBTdW1tZXIKLVJ1bGUJTkJvcm5lbwkxOTM1CTE5NDEJLQlEZWMJMTQJMDowMAkwCS0KLSMKLSMgcGVuaW5zdWxhciBNYWxheXNpYQotIyBUaGUgZGF0YSBoZXJlIGFyZSB0YWtlbiBmcm9tIE1vayBMeSBZbmcgKDIwMDMtMTAtMzApCi0jIDxodHRwOi8vd3d3Lm1hdGgubnVzLmVkdS5zZy9hc2xha3Nlbi90ZWFjaGluZy90aW1lem9uZS5odG1sPi4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXNpYS9LdWFsYV9MdW1wdXIJNjo0Njo0NiAtCUxNVAkxOTAxIEphbiAgMQotCQkJNjo1NToyNQktCVNNVAkxOTA1IEp1biAgMSAjIFNpbmdhcG9yZSBNLlQuCi0JCQk3OjAwCS0JTUFMVAkxOTMzIEphbiAgMSAjIE1hbGF5YSBUaW1lCi0JCQk3OjAwCTA6MjAJTUFMU1QJMTkzNiBKYW4gIDEKLQkJCTc6MjAJLQlNQUxUCTE5NDEgU2VwICAxCi0JCQk3OjMwCS0JTUFMVAkxOTQyIEZlYiAxNgotCQkJOTowMAktCUpTVAkxOTQ1IFNlcCAxMgotCQkJNzozMAktCU1BTFQJMTk4MiBKYW4gIDEKLQkJCTg6MDAJLQlNWVQJIyBNYWxheXNpYSBUaW1lCi0jIFNhYmFoICYgU2FyYXdhawotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgVGhlIGRhdGEgaGVyZSBhcmUgbW9zdGx5IGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBidXQgdGhlIDE5NDIsIDE5NDUgYW5kIDE5ODIKLSMgdHJhbnNpdGlvbiBkYXRlcyBhcmUgZnJvbSBNb2sgTHkgWW5nLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBc2lhL0t1Y2hpbmcJNzoyMToyMAktCUxNVAkxOTI2IE1hcgotCQkJNzozMAktCUJPUlQJMTkzMwkjIEJvcm5lbyBUaW1lCi0JCQk4OjAwCU5Cb3JuZW8JQk9SJXNUCTE5NDIgRmViIDE2Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDEyCi0JCQk4OjAwCS0JQk9SVAkxOTgyIEphbiAgMQotCQkJODowMAktCU1ZVAotCi0jIE1hbGRpdmVzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUluZGlhbi9NYWxkaXZlcwk0OjU0OjAwIC0JTE1UCTE4ODAJIyBNYWxlCi0JCQk0OjU0OjAwCS0JTU1UCTE5NjAJIyBNYWxlIE1lYW4gVGltZQotCQkJNTowMAktCU1WVAkJIyBNYWxkaXZlcyBUaW1lCi0KLSMgTW9uZ29saWEKLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgTW9uZ29saWEgaGFzIHRocmVlIHRpbWUgem9uZXMsIGJ1dAotIyB1c25vMTk5NSBhbmQgdGhlIENJQSBtYXAgU3RhbmRhcmQgVGltZSBab25lcyBvZiB0aGUgV29ybGQgKDIwMDUtMDMpCi0jIGJvdGggc2F5IHRoYXQgaXQgaGFzIGp1c3Qgb25lLgotCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDE5OTktMTItMTEpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm1vbmdvbGlhdG91cmlzbS5nb3YubW4vZ2VuZXJhbC5odG0iPgotIyBHZW5lcmFsIEluZm9ybWF0aW9uIE1vbmdvbGlhCi0jIDwvYT4gKDE5OTktMDkpCi0jICJUaW1lOiBNb25nb2xpYSBoYXMgdHdvIHRpbWUgem9uZXMuIFRocmVlIHdlc3Rlcm5tb3N0IHByb3ZpbmNlcyBvZgotIyBCYXlhbi1VbGdpaSwgVXZzLCBhbmQgSG92ZCBhcmUgb25lIGhvdXIgZWFybGllciB0aGFuIHRoZSBjYXBpdGFsIGNpdHksIGFuZAotIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeSBmb2xsb3dzIHRoZSBVbGFhbmJhYXRhciB0aW1lLCB3aGljaCBpcyBVVEMvR01UIHBsdXMKLSMgZWlnaHQgaG91cnMuIgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTItMTMpOgotIyBNb25nb2xpYSBkaXNjb250aW51ZWQgdGhlIHVzZSBvZiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW4gMTk5OTsgMTk5OAotIyBiZWluZyB0aGUgbGFzdCB5ZWFyIGl0IHdhcyBpbXBsZW1lbnRlZC4gIFRoZSBkYXRlcyBvZiBpbXBsZW1lbnRhdGlvbiBJIGFtCi0jIHVuc3VyZSBvZiwgYnV0IG1vc3QgcHJvYmFibHkgaXQgd2FzIHNpbWlsYXIgdG8gUnVzc2lhLCBleGNlcHQgZm9yIHRoZSB0aW1lCi0jIG9mIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIGJlZW4gZGlmZmVyZW50Li4uLgotIyBTb21lIG1hcHMgaW4gdGhlIHBhc3QgaGF2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSB3YXMgYW4gYWRkaXRpb25hbCB0aW1lCi0jIHpvbmUgaW4gdGhlIGVhc3Rlcm4gcGFydCBvZiBNb25nb2xpYSwgaW5jbHVkaW5nIHRoZSBwcm92aW5jZXMgb2YgRG9ybm9kLAotIyBTdWhiYWF0YXIsIGFuZCBwb3NzaWJseSBLaGVudGlqLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTItMTUpOgotIyBOYW1pbmcgYW5kIHNwZWxsaW5nIGlzIHRyaWNreSBpbiBNb25nb2xpYS4KLSMgV2UnbGwgdXNlIEhvdmQgKGFsc28gc3BlbGxlZCBDaG92ZCBhbmQgS2hvdmQpIHRvIHJlcHJlc2VudCB0aGUgd2VzdCB6b25lOwotIyB0aGUgY2FwaXRhbCBvZiB0aGUgSG92ZCBwcm92aW5jZSBpcyBzb21ldGltZXMgY2FsbGVkIEhvdmQsIHNvbWV0aW1lcyBEdW5kLVVzLAotIyBhbmQgc29tZXRpbWVzIEppcmdhbGFudGEgKHdpdGggdmFyaWFudCBzcGVsbGluZ3MpLCBidXQgdGhlIG5hbWUgSG92ZAotIyBpcyBnb29kIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMDUtMTMpOgotIyBJbiBhZGRpdGlvbiB0byBNb25nb2xpYSBzdGFydGluZyBkYXlsaWdodCBzYXZpbmdzIGFzIHJlcG9ydGVkIGVhcmxpZXIKLSMgKGFkb3B0ZWQgRFNUIG9uIDIwMDEtMDQtMjcgMDI6MDAgbG9jYWwgdGltZSwgZW5kaW5nIDIwMDEtMDktMjgpLAotIyB0aGVyZSBhcmUgdGhyZWUgdGltZSB6b25lcy4KLSMKLSMgUHJvdmluY2VzIFthdCA3OjAwXTogQmF5YW4tdWxnaWksIFV2cywgS2hvdmQsIFphdmtoYW4sIEdvdmktQWx0YWkKLSMgUHJvdmluY2VzIFthdCA4OjAwXTogS2hvdnNnb2wsIEJ1bGdhbiwgQXJraGFuZ2FpLCBLaGVudGlpLCBUb3YsCi0jCUJheWFua2hvbmdvciwgT3ZvcmtoYW5nYWksIER1bmRnb3ZpLCBEb3Jub2dvdmksIE9tbm9nb3ZpCi0jIFByb3ZpbmNlcyBbYXQgOTowMF06IERvcm5vZCwgU3VraGJhYXRhcgotIwotIyBbVGhlIHByb3ZpbmNlIG9mIFNlbGVuZ2UgaXMgb21pdHRlZCBmcm9tIHRoZSBhYm92ZSBsaXN0cy5dCi0KLSMgRnJvbSBHYW5ib2xkIFRzLiwgVWxhYW5iYWF0YXIgKDIwMDQtMDQtMTcpOgotIyBEYXlsaWdodCBzYXZpbmcgb2NjdXJzIGF0IDAyOjAwIGxvY2FsIHRpbWUgbGFzdCBTYXR1cmRheSBvZiBNYXJjaC4KLSMgSXQgd2lsbCBjaGFuZ2UgYmFjayB0byBub3JtYWwgYXQgMDI6MDAgbG9jYWwgdGltZSBsYXN0IFNhdHVyZGF5IG9mCi0jIFNlcHRlbWJlci4uLi4gQXMgSSByZW1lbWJlciB0aGlzIHJ1bGUgd2FzIGNoYW5nZWQgaW4gMjAwMS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNC0wNC0xNyk6Ci0jIEZvciBub3csIGFzc3VtZSBSaXZlcyBNY0RvdydzIGluZm9ybWFudCBnb3QgY29uZnVzZWQgYWJvdXQgRnJpZGF5IHZzCi0jIFNhdHVyZGF5LCBhbmQgdGhhdCBoaXMgMjAwMSBkYXRlcyBzaG91bGQgaGF2ZSAxIGFkZGVkIHRvIHRoZW0uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wNy0yNik6Ci0jIFdlIGhhdmUgd2lsZGx5IGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IE1vbmdvbGlhJ3MgdGltZSB6b25lcy4KLSMgQmlsbCBCb25uZXQgKDIwMDUtMDUtMTkpIHJlcG9ydHMgdGhhdCB0aGUgVVMgRW1iYXNzeSBpbiBVbGFhbmJhYXRhciBzYXlzCi0jIHRoZXJlIGlzIG9ubHkgb25lIHRpbWUgem9uZSBhbmQgdGhhdCBEU1QgaXMgb2JzZXJ2ZWQsIGNpdGluZyBNaWNyb3NvZnQKLSMgV2luZG93cyBYUCBhcyB0aGUgc291cmNlLiAgUmlzdG8gTnlrYW5lbiAoMjAwNS0wNS0xNikgcmVwb3J0cyB0aGF0Ci0jIHRyYXZlbG1vbmdvbGlhLm9yZyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcyAoVVRDKzcsIFVUQys4KSB3aXRoIG5vIERTVC4KLSMgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMjApIHJlcG9ydHMgdGhhdCB0aGUgTW9uZ29saWFuIEVtYmFzc3kgaW4KLSMgV2FzaGluZ3RvbiwgREMgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMsIHdpdGggRFNUIG9ic2VydmVkLgotIyBIZSBhbHNvIGZvdW5kCi0jIDxodHRwOi8vdWJwb3N0Lm1vbmdvbG5ld3MubW4vaW5kZXgucGhwP3N1YmFjdGlvbj1zaG93Y29tbWVudHMmaWQ9MTExMTYzNDg5NCZhcmNoaXZlPSZzdGFydF9mcm9tPSZ1Y2F0PTEmPgotIyB3aGljaCBhbHNvIHNheXMgdGhhdCB0aGVyZSBpcyBEU1QsIGFuZCB3aGljaCBoYXMgYSBjb21tZW50IGJ5ICJUb2RkaXVzIgotIyAoMjAwNS0wMy0zMSAwNjowNSArMDcwMCkgc2F5aW5nICJNb25nb2xpYSBhY3R1YWxseSBoYXMgMy41IHRpbWUgem9uZXMuCi0jIFRoZSBXZXN0IChPTEdJSSkgaXMgKzcgR01ULCBtb3N0IG9mIHRoZSBjb3VudHJ5IGlzIFVMQVQgaXMgKzggR01UCi0jIGFuZCBzb21lIEVhc3Rlcm4gcHJvdmluY2VzIGFyZSArOSBHTVQgYnV0IFN1a2hiYWF0YXIgQWltYWcgaXMgU1VISyArOC41IEdNVC4KLSMgVGhlIFNVS0ggdGltZXpvbmUgaXMgbmV3IHRoaXMgeWVhciwgaXQgaXMgb25lIG9mIHRoZSBmZXcgdGhpbmdzIHRoZQotIyBwYXJsaWFtZW50IHBhc3NlZCBkdXJpbmcgdGhlIHR1bXVsdHVvdXMgd2ludGVyIHNlc3Npb24uIgotIyBGb3Igbm93LCBsZXQncyBpZ25vcmUgdGhpcyBpbmZvcm1hdGlvbiwgdW50aWwgd2UgaGF2ZSBtb3JlIGNvbmZpcm1hdGlvbi4KLQotIyBGcm9tIEdhbmJvbGQgVHMuICgyMDA3LTAyLTI2KToKLSMgUGFybGlhbWVudCBvZiBNb25nb2xpYSBoYXMganVzdCBjaGFuZ2VkIHRoZSBkYXlsaWdodC1zYXZpbmcgcnVsZSBpbiBGZWJydWFyeS4KLSMgVGhleSBkZWNpZGVkIG5vdCB0byBhZG9wdCBkYXlsaWdodC1zYXZpbmcgdGltZS4uLi4KLSMgaHR0cDovL3d3dy5tb25nb2xuZXdzLm1uL2luZGV4LnBocD9tb2R1bGU9dW51dWR1ciZzZWM9dmlldyZpZD0xNTc0MgotCi0jIEZyb20gRGVib3JhaCBHb2xkc21pdGggKDIwMDgtMDMtMzApOgotIyBXZSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgY2xhaW1pbmcgdGhhdCB0aGUgdHogZGF0YWJhc2UgVVRDIG9mZnNldCBmb3IKLSMgQXNpYS9DaG9pYmFsc2FuIChHTVQrMDk6MDApIGlzIGluY29ycmVjdCwgYW5kIHRoYXQgaXQgc2hvdWxkIGJlIEdNVAotIyArMDg6MDAgaW5zdGVhZC4gRGlmZmVyZW50IHNvdXJjZXMgYXBwZWFyIHRvIGRpc2FncmVlIHdpdGggdGhlIHR6Ci0jIGRhdGFiYXNlIG9uIHRoaXMsIGUuZy46Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNiI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL3dvcmxkY2xvY2svY2l0eS5odG1sP249MTAyNgotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lc2VydmVyLmNvbS9jdXJyZW50X3RpbWVfaW5fTU4uYXNweAotIyA8L2E+Ci0jCi0jIGJvdGggc2F5IEdNVCswODowMC4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOC0wMy0zMSk6Ci0jIGV6bmlzIGFpcndheXMsIHdoaWNoIG9wZXJhdGVzIHNldmVyYWwgZG9tZXN0aWMgZmxpZ2h0cywgaGFzIGEgZmxpZ2h0Ci0jIHNjaGVkdWxlIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXpuaXMuY29tL0NvbnRhaW5lci5qc3A/aWQ9MTEyIj4KLSMgaHR0cDovL3d3dy5lem5pcy5jb20vQ29udGFpbmVyLmpzcD9pZD0xMTIKLSMgPC9hPgotIyAoY2xpY2sgdGhlIEVuZ2xpc2ggZmxhZyBmb3IgRW5nbGlzaCkKLSMKLSMgVGhlcmUgaXQgYXBwZWFycyB0aGF0IGZsaWdodHMgYmV0d2VlbiBDaG9pYmFsc2FuIGFuZCBVbGFhbmJhdGFyIGFycml2ZQotIyBhYm91dCAxOjM1IC0gMTo1MCBob3VycyBsYXRlciBpbiBsb2NhbCBjbG9jayB0aW1lLCBubyBtYXR0ZXIgdGhlCi0jIGRpcmVjdGlvbiwgd2hpbGUgVWxhYW5iYWF0YXItS2h2b2QgdGFrZXMgMiBob3VycyBpbiB0aGUgRWFzdGVybgotIyBkaXJlY3Rpb24gYW5kIDM6MzUgYmFjaywgd2hpY2ggaW5kaWNhdGVzIHRoYXQgVWxhYW5iYXRhciBhbmQgS2h2b2QgYXJlCi0jIGluIGRpZmZlcmVudCB0aW1lIHpvbmVzIChsaWtlIHdlIGtub3cgYWJvdXQpLCB3aGlsZSBDaG9pYmFsc2FuIGFuZAotIyBVbGFhbmJhdGFyIGFyZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgKGNvcnJlY3Rpb24gbmVlZGVkKS4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wNS0xOSk6Ci0jIEFzc3VtZSB0aGF0IENob2liYWxzYW4gaXMgaW5kZWVkIG9mZnNldCBieSA4OjAwLgotIyBYWFgtLWluIHRoZSBhYnNlbmNlIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgYXNzdW1lIHRoYXQgdHJhbnNpdGlvbgotIyB3YXMgYXQgdGhlIHN0YXJ0IG9mIDIwMDgtMDMtMzEgKHRoZSBkYXkgb2YgU3RlZmZlbiBUaG9yc2VuJ3MgcmVwb3J0KTsKLSMgdGhpcyBpcyBhbG1vc3Qgc3VyZWx5IHdyb25nLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlNb25nb2wJMTk4MwkxOTg0CS0JQXByCTEJMDowMAkxOjAwCVMKLVJ1bGUJTW9uZ29sCTE5ODMJb25seQktCU9jdAkxCTA6MDAJMAktCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBhbmQgSUFUQSBTU0lNIHNheSAxOTkwcyBzd2l0Y2hlcyBvY2N1cnJlZCBhdCAwMDowMCwKLSMgYnV0IE1jRG93IHNheXMgdGhlIDIwMDEgc3dpdGNoZXMgb2NjdXJyZWQgYXQgMDI6MDAuICBBbHNvLCBJQVRBIFNTSU0KLSMgKDE5OTYtMDkpIHNheXMgMTk5Ni0xMC0yNS4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyIHRocm91Z2ggMTk5OC4KLSMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IHRoZSBTZXB0LiAxOTg0IHRocm91Z2ggU2VwdC4gMTk5MCBzd2l0Y2hlcwotIyBpbiBDaG9pYmFsc2FuIChtb3JlIHByZWNpc2VseSwgaW4gRG9ybm9kIGFuZCBTdWtoYmFhdGFyKSB0b29rIHBsYWNlCi0jIGF0IDAyOjAwIHN0YW5kYXJkIHRpbWUsIG5vdCBhdCAwMDowMCBsb2NhbCB0aW1lIGFzIGluIHRoZSByZXN0IG9mCi0jIHRoZSBjb3VudHJ5LiAgVGhhdCB3b3VsZCBiZSBvZGQsIGFuZCBwb3NzaWJseSBpcyBhIHJlc3VsdCBvZiB0aGVpcgotIyBjb3JyZWN0aW9uIG9mIDAyOjAwIChpbiB0aGUgcHJldmlvdXMgZWRpdGlvbikgbm90IGJlaW5nIGRvbmUgY29ycmVjdGx5Ci0jIGluIHRoZSBsYXRlc3QgZWRpdGlvbjsgc28gaWdub3JlIGl0IGZvciBub3cuCi0KLVJ1bGUJTW9uZ29sCTE5ODUJMTk5OAktCU1hcglsYXN0U3VuCTA6MDAJMTowMAlTCi1SdWxlCU1vbmdvbAkxOTg0CTE5OTgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJLQotIyBJQVRBIFNTSU0gKDE5OTktMDkpIHNheXMgTW9uZ29saWEgbm8gbG9uZ2VyIG9ic2VydmVzIERTVC4KLVJ1bGUJTW9uZ29sCTIwMDEJb25seQktCUFwcglsYXN0U2F0CTI6MDAJMTowMAlTCi1SdWxlCU1vbmdvbAkyMDAxCTIwMDYJLQlTZXAJbGFzdFNhdAkyOjAwCTAJLQotUnVsZQlNb25nb2wJMjAwMgkyMDA2CS0JTWFyCWxhc3RTYXQJMjowMAkxOjAwCVMKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBIb3ZkLCBhLmsuYS4gQ2hvdmQsIER1bmQtVXMsIER6aGFyZ2FsYW50LCBLaG92ZCwgSmlyZ2FsYW50YQotWm9uZQlBc2lhL0hvdmQJNjowNjozNiAtCUxNVAkxOTA1IEF1ZwotCQkJNjowMAktCUhPVlQJMTk3OAkjIEhvdmQgVGltZQotCQkJNzowMAlNb25nb2wJSE9WJXNUCi0jIFVsYWFuYmFhdGFyLCBhLmsuYS4gVWxhbiBCYXRhYXIsIFVsYW4gQmF0b3IsIFVyZ2EKLVpvbmUJQXNpYS9VbGFhbmJhYXRhciA3OjA3OjMyIC0JTE1UCTE5MDUgQXVnCi0JCQk3OjAwCS0JVUxBVAkxOTc4CSMgVWxhYW5iYWF0YXIgVGltZQotCQkJODowMAlNb25nb2wJVUxBJXNUCi0jIENob2liYWxzYW4sIGEuay5hLiBCYWphbiBUdWVtZW4sIEJhamFuIFR1bWVuLCBDaG9qYmFsc2FuLAotIyBDaG95YmFsc2FuLCBTYW5iZWpzZSwgVGNob2liYWxzYW4KLVpvbmUJQXNpYS9DaG9pYmFsc2FuCTc6Mzg6MDAgLQlMTVQJMTkwNSBBdWcKLQkJCTc6MDAJLQlVTEFUCTE5NzgKLQkJCTg6MDAJLQlVTEFUCTE5ODMgQXByCi0JCQk5OjAwCU1vbmdvbAlDSE8lc1QJMjAwOCBNYXIgMzEgIyBDaG9pYmFsc2FuIFRpbWUKLQkJCTg6MDAJTW9uZ29sCUNITyVzVAotCi0jIE5lcGFsCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvS2F0aG1hbmR1CTU6NDE6MTYgLQlMTVQJMTkyMAotCQkJNTozMAktCUlTVAkxOTg2Ci0JCQk1OjQ1CS0JTlBUCSMgTmVwYWwgVGltZQotCi0jIE9tYW4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9NdXNjYXQJMzo1NDoyMCAtCUxNVAkxOTIwCi0JCQk0OjAwCS0JR1NUCi0KLSMgUGFraXN0YW4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAyLTAzLTEzKToKLSMgSSBoYXZlIGJlZW4gYWR2aXNlZCB0aGF0IFBha2lzdGFuIGhhcyBkZWNpZGVkIHRvIGFkb3B0IGRzdCBvbiBhCi0jIFRSSUFMIGJhc2lzIGZvciBvbmUgeWVhciwgc3RhcnRpbmcgMDA6MDEgbG9jYWwgdGltZSBvbiBBcHJpbCA3LCAyMDAyCi0jIGFuZCBlbmRpbmcgYXQgMDA6MDEgbG9jYWwgdGltZSBPY3RvYmVyIDYsIDIwMDIuICBUaGlzIGlzIHdoYXQgSSB3YXMKLSMgdG9sZCwgYnV0IEkgYmVsaWV2ZSB0aGF0IHRoZSBhY3R1YWwgdGltZSBvZiBjaGFuZ2UgbWF5IGJlIDAwOjAwOyB0aGUKLSMgMDA6MDEgd2FzIHRvIG1ha2UgaXQgY2xlYXIgd2hpY2ggZGF5IGl0IHdhcyBvbi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAyLTAzLTE1KToKLSMgSmVzcGVyIE5vcmdhYXJkIGZvdW5kIHRoaXMgVVJMOgotIyBodHRwOi8vd3d3LnBhay5nb3YucGsvcHVibGljL25ld3MvYXBwL2FwcDA2X2RlYy5odG0KLSMgKGRhdGVkIDIwMDEtMTItMDYpIHdoaWNoIHNheXMgdGhhdCB0aGUgQ2FiaW5ldCBhZG9wdGVkIGEgc2NoZW1lICJ0bwotIyBhZHZhbmNlIHRoZSBjbG9ja3MgYnkgb25lIGhvdXIgb24gdGhlIG5pZ2h0IGJldHdlZW4gdGhlIGZpcnN0Ci0jIFNhdHVyZGF5IGFuZCBTdW5kYXkgb2YgQXByaWwgYW5kIHJldmVydCB0byB0aGUgb3JpZ2luYWwgcG9zaXRpb24gb24KLSMgMTV0aCBPY3RvYmVyIGVhY2ggeWVhciIuICBUaGlzIGFncmVlcyB3aXRoIE1jRG93J3MgMDQtMDcgYXQgMDA6MDAsCi0jIGJ1dCBkaXNhZ3JlZXMgYWJvdXQgdGhlIE9jdG9iZXIgdHJhbnNpdGlvbiwgYW5kIG1ha2VzIGl0IHNvdW5kIGxpa2UKLSMgaXQncyBub3Qgb24gYSB0cmlhbCBiYXNpcy4gIEFsc28sIHRoZSAiYmV0d2VlbiB0aGUgZmlyc3QgU2F0dXJkYXkKLSMgYW5kIFN1bmRheSBvZiBBcHJpbCIgcGhyYXNlLCBpZiB0YWtlbiBsaXRlcmFsbHksIG1lYW5zIHRoYXQgdGhlCi0jIHRyYW5zaXRpb24gdGFrZXMgcGxhY2UgYXQgMDA6MDAgb24gdGhlIGZpcnN0IFN1bmRheSBvbiBvciBhZnRlciAwNC0wMi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTAyLTA5KToKLSMgREFXTiA8aHR0cDovL3d3dy5kYXduLmNvbS8yMDAyLzEwLzA2L3RvcDEzLmh0bT4gcmVwb3J0ZWQgb24gMjAwMi0xMC0wNQotIyB0aGF0IDIwMDIgRFNUIGVuZGVkIHRoYXQgZGF5IGF0IG1pZG5pZ2h0LiAgR28gd2l0aCBNY0RvdyBmb3Igbm93LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDAzLTAzLTE0KToKLSMgQWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cuZGF3bi5jb20vMjAwMy8wMy8wNy90b3AxNS5odG0KLSMgdGhlcmUgd2lsbCBiZSBubyBEU1QgaW4gUGFraXN0YW4gdGhpcyB5ZWFyOgotIwotIyBJU0xBTUFCQUQsIE1hcmNoIDY6IEluZm9ybWF0aW9uIGFuZCBNZWRpYSBEZXZlbG9wbWVudCBNaW5pc3RlciBTaGVpa2gKLSMgUmFzaGlkIEFobWVkIG9uIFRodXJzZGF5IHNhaWQgdGhlIGNhYmluZXQgaGFkIHJldmVyc2VkIGEgcHJldmlvdXMKLSMgZGVjaXNpb24gdG8gYWR2YW5jZSBjbG9ja3MgYnkgb25lIGhvdXIgaW4gc3VtbWVyIGFuZCBwdXQgdGhlbSBiYWNrIGJ5Ci0jIG9uZSBob3VyIGluIHdpbnRlciB3aXRoIHRoZSBhaW0gb2Ygc2F2aW5nIGxpZ2h0IGhvdXJzIGFuZCBlbmVyZ3kuCi0jCi0jIFRoZSBtaW5pc3RlciB0b2xkIGEgbmV3cyBjb25mZXJlbmNlIHRoYXQgdGhlIGV4cGVyaW1lbnQgaGFkIHJhdGhlcgotIyBzaG93biA4IHBlciBjZW50IGhpZ2hlciBjb25zdW1wdGlvbiBvZiBlbGVjdHJpY2l0eS4KLQotIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDUtMTUpOgotIyAKLSMgSGVyZSBpcyBhbiBhcnRpY2xlIHRoYXQgUGFraXN0YW4gcGxhbiB0byBpbnRyb2R1Y2UgRGF5bGlnaHQgU2F2aW5nIFRpbWUgCi0jIG9uIEp1bmUgMSwgMjAwOCBmb3IgMyBtb250aHMuCi0jIAotIyAiLi4uIFRoZSBmZWRlcmFsIGNhYmluZXQgb24gV2VkbmVzZGF5IGFubm91bmNlZCBhIG5ldyBjb25zZXJ2YXRpb24gcGxhbiB0byBoZWxwIAotIyByZWR1Y2UgbG9hZCBzaGVkZGluZyBieSBhcHByb3ZpbmcgdGhlIGNsb3N1cmUgb2YgY29tbWVyY2lhbCBjZW50cmVzIGF0IDlwbSBhbmQgCi0jIG1vdmluZyBjbG9ja3MgZm9yd2FyZCBieSBvbmUgaG91ciBmb3IgdGhlIG5leHQgdGhyZWUgbW9udGhzLiAKLSMgLi4uLiIKLSMgCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5uZXQvZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjAxLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRhaWx5dGltZXMuY29tLnBrL2RlZmF1bHQuYXNwP3BhZ2U9MjAwOCU1QzA1JTVDMTUlNUNzdG9yeV8xNS01LTIwMDhfcGcxXzQiPgotIyBodHRwOi8vd3d3LmRhaWx5dGltZXMuY29tLnBrL2RlZmF1bHQuYXNwP3BhZ2U9MjAwOCU1QzA1JTVDMTUlNUNzdG9yeV8xNS01LTIwMDhfcGcxXzQKLSMgPC9hPgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTA1LTE5KToKLSMgWFhYLS1taWRuaWdodCB0cmFuc2l0aW9ucyBpcyBhIGd1ZXNzOyAyMDA4IG9ubHkgaXMgYSBndWVzcy4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOC0yOCk6Ci0jIFBha2lzdGFuIGdvdmVybm1lbnQgaGFzIGRlY2lkZWQgdG8ga2VlcCB0aGUgd2F0Y2hlcyBvbmUtaG91ciBhZHZhbmNlZAotIyBmb3IgYW5vdGhlciAyIG1vbnRocy0tcGxhbiB0byByZXR1cm4gdG8gU3RhbmRhcmQgVGltZSBvbiBPY3RvYmVyIDMxCi0jIGluc3RlYWQgb2YgQXVndXN0IDMxLgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3Bha2lzdGFuMDIuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wMi5odG1sCi0jIDwvYT4KLSMgT1IKLSMgPGEgaHJlZj0iaHR0cDovL2RhaWx5bWFpbG5ld3MuY29tLzIwMDgwOC8yOC9uZXdzL2RtYnJuMDMuaHRtbCI+Ci0jIGh0dHA6Ly9kYWlseW1haWxuZXdzLmNvbS8yMDA4MDgvMjgvbmV3cy9kbWJybjAzLmh0bWwKLSMgPC9hPgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTA0LTA4KToKLSMgQmFzZWQgb24gcHJldmlvdXMgbWVkaWEgcmVwb3J0cyB0aGF0ICIuLi4gcHJvcG9zZWQgcGxhbiB0bwotIyBhZHZhbmNlIGNsb2NrcyBieSBvbmUgaG91ciBmcm9tIE1heSAxIHdpbGwgY2F1c2UgZGlzdHVyYmFuY2UKLSMgdG8gdGhlIHdvcmtpbmcgc2NoZWR1bGVzIHJhdGhlciB0aGFuIGJyaW5naW5nIGRpc2NpcGxpbmUgaW4KLSMgb2ZmaWNpYWwgd29ya2luZy4iCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvZGFpbHlfZGV0YWlsLmFzcD9pZD0xNzEyODAiPgotIyBodHRwOi8vd3d3LnRoZW5ld3MuY29tLnBrL2RhaWx5X2RldGFpbC5hc3A/aWQ9MTcxMjgwCi0jIDwvYT4KLSMKLSMgcmVjZW50IG5ld3MgdGhhdCBpbnN0ZWFkIG9mIE1heSAyMDA5IC0gUGFraXN0YW4gcGxhbiB0bwotIyBpbnRyb2R1Y2UgRFNUIGZyb20gQXByaWwgMTUsIDIwMDkKLSMKLSMgRllJOiBBc3NvY2lhdGVkIFByZXNzIE9mIFBha2lzdGFuCi0jIEFwcmlsIDA4LCAyMDA5Ci0jIENhYmluZXQgb2theXMgcHJvcG9zYWwgdG8gYWR2YW5jZSBjbG9ja3MgYnkgb25lIGhvdXIgZnJvbSBBcHJpbCAxNQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTczMDQzJkl0ZW1pZD0xIj4KLSMgaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD03MzA0MyZJdGVtaWQ9MQotIyA8L2E+Ci0jCi0jIG9yCi0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjA1Lmh0bWwKLSMgPC9hPgotIwotIyAuLi4uCi0jIFRoZSBGZWRlcmFsIENhYmluZXQgb24gV2VkbmVzZGF5IGFwcHJvdmVkIHRoZSBwcm9wb3NhbCB0bwotIyBhZHZhbmNlIGNsb2NrcyBpbiB0aGUgY291bnRyeSBieSBvbmUgaG91ciBmcm9tIEFwcmlsIDE1IHRvCi0jIGNvbnNlcnZlIGVuZXJneSIKLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0wOS0xNyk6Ci0jICJUaGUgTmV3cyBJbnRlcm5hdGlvbmFsLCIgUGFraXN0YW4gcmVwb3J0cyB0aGF0OiAiVGhlIEZlZGVyYWwKLSMgR292ZXJubWVudCBoYXMgZGVjaWRlZCB0byByZXN0b3JlIHRoZSBwcmV2aW91cyB0aW1lIGJ5IG1vdmluZyB0aGUKLSMgY2xvY2tzIGJhY2t3YXJkIGJ5IG9uZSBob3VyIGZyb20gT2N0b2JlciAxLiBBIGZvcm1hbCBhbm5vdW5jZW1lbnQgdG8KLSMgdGhpcyBlZmZlY3Qgd2lsbCBiZSBtYWRlIGFmdGVyIHRoZSBQcmltZSBNaW5pc3RlciBncmFudHMgYXBwcm92YWwgaW4KLSMgdGhpcyByZWdhcmQuIiAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way91cGRhdGVzLmFzcD9pZD04NzE2OCI+Ci0jIGh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdXBkYXRlcy5hc3A/aWQ9ODcxNjgKLSMgPC9hPgotCi0jIEZyb20gQWxleGFuZGVyIEtyaXZlbnlzaGV2ICgyMDA5LTA5LTI4KToKLSMgQWNjb3JkaW5nIHRvIEFzc29jaWF0ZWQgUHJlc3MgT2YgUGFraXN0YW4sIGl0IGlzIGNvbmZpcm1lZCB0aGF0Ci0jIFBha2lzdGFuIGNsb2NrcyBhY3Jvc3MgdGhlIGNvdW50cnkgd291bGQgYmUgdHVybmVkIGJhY2sgYnkgYW4gaG91ciBmcm9tIE9jdG9iZXIKLSMgMSwgMjAwOS4KLSMKLSMgIkNsb2NrcyB0byBnbyBiYWNrIG9uZSBob3VyIGZyb20gMSBPY3QiCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9ODY3MTUmSXRlbWlkPTIiPgotIyBodHRwOi8vd3d3LmFwcC5jb20ucGsvZW5fL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTg2NzE1Jkl0ZW1pZD0yCi0jIDwvYT4KLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19wYWtpc3RhbjA3Lmh0bSI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcGFraXN0YW4wNy5odG0KLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA5LTI5KToKLSMgQWxleGFuZGVyIEtyaXZlbnlzaGV2IHdyb3RlOgotIyA+IEFjY29yZGluZyB0byBBc3NvY2lhdGVkIFByZXNzIE9mIFBha2lzdGFuLCBpdCBpcyBjb25maXJtZWQgdGhhdAotIyA+IFBha2lzdGFuIGNsb2NrcyBhY3Jvc3MgdGhlIGNvdW50cnkgd291bGQgYmUgdHVybmVkIGJhY2sgYnkgYW4gaG91ciBmcm9tIE9jdG9iZXIKLSMgPiAxLCAyMDA5LgotIwotIyBOb3cgdGhleSBzZWVtIHRvIGhhdmUgY2hhbmdlZCB0aGVpciBtaW5kLCBOb3ZlbWJlciAxIGlzIHRoZSBuZXcgZGF0ZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aGVuZXdzLmNvbS5way90b3Bfc3RvcnlfZGV0YWlsLmFzcD9JZD0yNDc0MiI+Ci0jIGh0dHA6Ly93d3cudGhlbmV3cy5jb20ucGsvdG9wX3N0b3J5X2RldGFpbC5hc3A/SWQ9MjQ3NDIKLSMgPC9hPgotIyAiVGhlIGNvdW50cnkncyBjbG9ja3Mgd2lsbCBiZSByZXZlcnNlZCBieSBvbmUgaG91ciBvbiBOb3ZlbWJlciAxLgotIyBPZmZpY2lhbHMgb2YgRmVkZXJhbCBNaW5pc3RyeSBmb3IgSW50ZXJpb3IgdG9sZCB0aGlzIHRvIEdlbyBOZXdzIG9uCi0jIE1vbmRheS4iCi0jCi0jIEFuZCBtb3JlIGltcG9ydGFudGx5LCBpdCBzZWVtcyB0aGF0IHRoZXNlIGRhdGVzIHdpbGwgYmUga2VwdCBldmVyeSB5ZWFyOgotIyAiSXQgaGFzIG5vdyBiZWVuIGRlY2lkZWQgdGhhdCBjbG9ja3Mgd2lsbCBiZSB3b3VuZCBmb3J3YXJkIGJ5IG9uZSBob3VyCi0jIG9uIEFwcmlsIDE1IGFuZCByZXZlcnNlZCBieSBhbiBob3VyIG9uIE5vdmVtYmVyIDEgZXZlcnkgeWVhciB3aXRob3V0Ci0jIG9idGFpbmluZyBwcmlvciBhcHByb3ZhbCwgdGhlIG9mZmljaWFscyBhZGRlZC4iCi0jCi0jIFdlIGhhdmUgY29uZmlybWVkIHRoaXMgeWVhcidzIGVuZCBkYXRlIHdpdGggYm90aCB3aXRoIHRoZSBNaW5pc3RyeSBvZgotIyBXYXRlciBhbmQgUG93ZXIgYW5kIHRoZSBQYWtpc3RhbiBFbGVjdHJpYyBQb3dlciBDb21wYW55OgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvcGFraXN0YW4tZW5kcy1kc3QwOS5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3Bha2lzdGFuLWVuZHMtZHN0MDkuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBDaHJpc3RvcGggR29laHJlICgyMDA5LTEwLTAxKToKLSMgW1RdaGUgR2VybWFuIENvbnN1bGF0ZSBHZW5lcmFsIGluIEthcmFjaGkgcmVwb3J0ZWQgbWUgdG9kYXkgdGhhdCBQYWtpc3RhbgotIyB3aWxsIGdvIGJhY2sgdG8gc3RhbmRhcmQgdGltZSBvbiAxc3Qgb2YgTm92ZW1iZXIuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDMtMjYpOgotIyBTdGVmZmVuIFRob3JzZW4gd3JvdGU6Ci0jID4gT24gVGh1cnNkYXkgKDIwMTAtMDMtMjUpIGl0IHdhcyBhbm5vdW5jZWQgdGhhdCBEU1Qgd291bGQgc3RhcnQgaW4KLSMgPiBQYWtpc3RhbiBvbiAyMDEwLTA0LTAxLgotIyA+Ci0jID4gVGhlbiB0b2RheSwgdGhlIHByZXNpZGVudCBzYWlkIHRoYXQgdGhleSBtaWdodCBoYXZlIHRvIHJldmVydCB0aGUKLSMgPiBkZWNpc2lvbiBpZiBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwYXJsaWFtZW50LiBTbyBhdCB0aGUgdGltZQotIyA+IGJlaW5nLCBpdCBzZWVtcyB1bmNsZWFyIGlmIERTVCB3aWxsIGJlIGFjdHVhbGx5IG9ic2VydmVkIG9yIG5vdCAtIGJ1dAotIyA+IEFwcmlsIDEgY291bGQgYmUgYSBtb3JlIGxpa2VseSBkYXRlIHRoYW4gQXByaWwgMTUuCi0jIE5vdywgaXQgc2VlbXMgdGhhdCB0aGUgZGVjaXNpb24gdG8gbm90IG9ic2VydmUgRFNUIGluIGZpbmFsOgotIwotIyAiR292dCBXaXRoZHJhd3MgUGxhbiBUbyBBZHZhbmNlIENsb2NrcyIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFraXN0YW5uZXdzLmNvbS9nb3Z0LXdpdGhkcmF3cy1wbGFuLXRvLWFkdmFuY2UtY2xvY2tzLTE3MjA0MSI+Ci0jIGh0dHA6Ly93d3cuYXBha2lzdGFubmV3cy5jb20vZ292dC13aXRoZHJhd3MtcGxhbi10by1hZHZhbmNlLWNsb2Nrcy0xNzIwNDEKLSMgPC9hPgotIwotIyAiUGVvcGxlIGxhdWQgUE0ncyBhbm5vdW5jZW1lbnQgdG8gZW5kIERTVCIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hcHAuY29tLnBrL2VuXy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD05OTM3NCZJdGVtaWQ9MiI+Ci0jIGh0dHA6Ly93d3cuYXBwLmNvbS5way9lbl8vaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9OTkzNzQmSXRlbWlkPTIKLSMgPC9hPgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZSBQYWtpc3RhbgkyMDAyCW9ubHkJLQlBcHIJU3VuPj0yCTA6MDEJMTowMAlTCi1SdWxlIFBha2lzdGFuCTIwMDIJb25seQktCU9jdAlTdW4+PTIJMDowMQkwCS0KLVJ1bGUgUGFraXN0YW4JMjAwOAlvbmx5CS0JSnVuCTEJMDowMAkxOjAwCVMKLVJ1bGUgUGFraXN0YW4JMjAwOAlvbmx5CS0JTm92CTEJMDowMAkwCS0KLVJ1bGUgUGFraXN0YW4JMjAwOQlvbmx5CS0JQXByCTE1CTA6MDAJMTowMAlTCi1SdWxlIFBha2lzdGFuCTIwMDkJb25seQktCU5vdgkxCTA6MDAJMAktCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9LYXJhY2hpCTQ6Mjg6MTIgLQlMTVQJMTkwNwotCQkJNTozMAktCUlTVAkxOTQyIFNlcAotCQkJNTozMAkxOjAwCUlTVAkxOTQ1IE9jdCAxNQotCQkJNTozMAktCUlTVAkxOTUxIFNlcCAzMAotCQkJNTowMAktCUtBUlQJMTk3MSBNYXIgMjYgIyBLYXJhY2hpIFRpbWUKLQkJCTU6MDAgUGFraXN0YW4JUEslc1QJIyBQYWtpc3RhbiBUaW1lCi0KLSMgUGFsZXN0aW5lCi0KLSMgRnJvbSBBbW9zIFNoYXBpciAoMTk5OC0wMi0xNSk6Ci0jCi0jIEZyb20gMTkxNyB1bnRpbCAxOTQ4LTA1LTE1LCBhbGwgb2YgUGFsZXN0aW5lLCBpbmNsdWRpbmcgdGhlIHBhcnRzIG5vdwotIyBrbm93biBhcyB0aGUgR2F6YSBTdHJpcCBhbmQgdGhlIFdlc3QgQmFuaywgd2FzIHVuZGVyIEJyaXRpc2ggcnVsZS4KLSMgVGhlcmVmb3JlIHRoZSBydWxlcyBnaXZlbiBmb3IgSXNyYWVsIGZvciB0aGF0IHBlcmlvZCwgYXBwbHkgdGhlcmUgdG9vLi4uCi0jCi0jIFRoZSBHYXphIFN0cmlwIHdhcyB1bmRlciBFZ3lwdGlhbiBydWxlIGJldHdlZW4gMTk0OC0wNS0xNSB1bnRpbCAxOTY3LTA2LTA1Ci0jIChleGNlcHQgYSBzaG9ydCBvY2N1cGF0aW9uIGJ5IElzcmFlbCBmcm9tIDE5NTYtMTEgdGlsbCAxOTU3LTAzLCBidXQgbm8KLSMgdGltZSB6b25lIHdhcyBhZmZlY3RlZCB0aGVuKS4gIEl0IHdhcyBuZXZlciBmb3JtYWxseSBhbm5leGVkIHRvIEVneXB0LAotIyB0aG91Z2guCi0jCi0jIFRoZSByZXN0IG9mIFBhbGVzdGluZSB3YXMgdW5kZXIgSm9yZGFuaWFuIHJ1bGUgYXQgdGhhdCB0aW1lLCBmb3JtYWxseQotIyBhbm5leGVkIGluIDE5NTAgYXMgdGhlIFdlc3QgQmFuayAoYW5kIHRoZSB3b3JkICJUcmFucyIgd2FzIGRyb3BwZWQgZnJvbQotIyB0aGUgY291bnRyeSdzIHByZXZpb3VzIG5hbWUgb2YgInRoZSBIYXNoZW1pdGUgS2luZ2RvbSBvZiB0aGUKLSMgVHJhbnMtSm9yZGFuIikuICBTbyB0aGUgcnVsZXMgZm9yIEpvcmRhbiBmb3IgdGhhdCB0aW1lIGFwcGx5LiAgTWFqb3IKLSMgdG93bnMgaW4gdGhhdCBhcmVhIGFyZSBOYWJsdXMgKFNoY2hlbSksIEVsLUhhbGlsIChIZWJyb24pLCBSYW1hbGxhaCwgYW5kCi0jIEVhc3QgSmVydXNhbGVtLgotIwotIyBCb3RoIGFyZWFzIHdlcmUgb2NjdXBpZWQgYnkgSXNyYWVsIGluIEp1bmUgMTk2NywgYnV0IG5vdCBhbm5leGVkIChleGNlcHQKLSMgZm9yIEVhc3QgSmVydXNhbGVtKS4gIFRoZXkgd2VyZSBvbiBJc3JhZWwgdGltZSBzaW5jZSB0aGVuOyB0aGVyZSBtaWdodAotIyBoYXZlIGJlZW4gYSBNaWxpdGFyeSBHb3Zlcm5vcidzIG9yZGVyIGFib3V0IHRpbWUgem9uZXMsIGJ1dCBJJ20gbm90IGF3YXJlCi0jIG9mIGFueSAoc3VjaCBvcmRlcnMgbWF5IGhhdmUgYmVlbiBpc3N1ZWQgc2VtaS1hbm51YWxseSB3aGVuZXZlciBzdW1tZXIKLSMgdGltZSB3YXMgaW4gZWZmZWN0LCBidXQgbWF5YmUgdGhlIGxlZ2FsIGFzcGVjdCBvZiB0aW1lIHdhcyBqdXN0IG5lZ2xlY3RlZCkuCi0jCi0jIFRoZSBQYWxlc3RpbmlhbiBBdXRob3JpdHkgd2FzIGVzdGFibGlzaGVkIGluIDE5OTMsIGFuZCBnb3QgaG9sZCBvZiBtb3N0Ci0jIHRvd25zIGluIHRoZSBXZXN0IEJhbmsgYW5kIEdhemEgYnkgMTk5NS4gIEkga25vdyB0aGF0IGluIG9yZGVyIHRvCi0jIGRlbW9uc3RyYXRlLi4uaW5kZXBlbmRlbmNlLCB0aGV5IGhhdmUgYmVlbiBzd2l0Y2hpbmcgdG8KLSMgc3VtbWVyIHRpbWUgYW5kIGJhY2sgb24gYSBkaWZmZXJlbnQgc2NoZWR1bGUgdGhhbiBJc3JhZWwncywgYnV0IEkgZG9uJ3QKLSMga25vdyB3aGVuIHRoaXMgd2FzIHN0YXJ0ZWQsIG9yIHdoYXQgYWxnb3JpdGhtIGlzIHVzZWQgKG1vc3QgbGlrZWx5IHRoZQotIyBKb3JkYW5pYW4gb25lKS4KLSMKLSMgVG8gc3VtbWFyaXplLCB0aGUgdGFibGUgc2hvdWxkIHByb2JhYmx5IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhhdDoKLSMKLSMgQXJlYSBcIHdoZW4gfCAxOTE4LTE5NDcgfCAxOTQ4LTE5NjcgfCAxOTY3LTE5OTUgfCAxOTk2LQotIyAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSMgSXNyYWVsICAgICAgfCBaaW9uICAgICAgfCBaaW9uICAgICAgfCBaaW9uICAgICAgfCBaaW9uCi0jIFdlc3QgYmFuayAgIHwgWmlvbiAgICAgIHwgSm9yZGFuICAgIHwgWmlvbiAgICAgIHwgSm9yZGFuCi0jIEdhemEgICAgICAgIHwgWmlvbiAgICAgIHwgRWd5cHQgICAgIHwgWmlvbiAgICAgIHwgSm9yZGFuCi0jCi0jIEkgZ3Vlc3MgbW9yZSBpbmZvIG1heSBiZSBhdmFpbGFibGUgZnJvbSB0aGUgUEEncyB3ZWIgcGFnZSAoaWYvd2hlbiB0aGV5Ci0jIGhhdmUgb25lKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgR2F6YSBkaWQgbm90IG9ic2VydmUgRFNUIHVudGlsIDE5NTcsIGJ1dCBnbwotIyB3aXRoIFNoYXBpciBhbmQgYXNzdW1lIHRoYXQgaXQgb2JzZXJ2ZWQgRFNUIGZyb20gMTk0MCB0aHJvdWdoIDE5NDcsCi0jIGFuZCB0aGF0IGl0IHVzZWQgSm9yZGFuaWFuIHJ1bGVzIHN0YXJ0aW5nIGluIDE5OTYuCi0jIFdlIGRvbid0IHlldCBuZWVkIGEgc2VwYXJhdGUgZW50cnkgZm9yIHRoZSBXZXN0IEJhbmssIHNpbmNlCi0jIHRoZSBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW4gaXQgYW5kIEdhemEgdGhhdCB3ZSBrbm93IGFib3V0Ci0jIG9jY3VycmVkIGJlZm9yZSBvdXIgY3V0b2ZmIGRhdGUgb2YgMTk3MC4KLSMgSG93ZXZlciwgYXMgd2UgZ2V0IG1vcmUgaW5mb3JtYXRpb24sIHdlIG1heSBuZWVkIHRvIGFkZCBlbnRyaWVzCi0jIGZvciBwYXJ0cyBvZiB0aGUgV2VzdCBCYW5rIGFzIHRoZXkgdHJhbnNpdGlvbmVkIGZyb20gSXNyYWVsJ3MgcnVsZXMKLSMgdG8gUGFsZXN0aW5lJ3MgcnVsZXMuICBJZiB5b3UgaGF2ZSBtb3JlIGluZm8gYWJvdXQgdGhpcywgcGxlYXNlCi0jIHNlbmQgaXQgdG8gdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGluY29ycG9yYXRpb24gaW50byBmdXR1cmUgZWRpdGlvbnMuCi0KLSMgRnJvbSBJSU5TIE5ld3MgU2VydmljZSAtIElzcmFlbCAtIDE5OTgtMDMtMjMgMTA6Mzg6MDcgSXNyYWVsIHRpbWUsCi0jIGZvcndhcmRlZCBieSBFcGhyYWltIFNpbHZlcmJlcmc6Ci0jCi0jIERlc3BpdGUgdGhlIGZhY3QgdGhhdCBJc3JhZWwgY2hhbmdlZCBvdmVyIHRvIGRheWxpZ2h0IHNhdmluZ3MgdGltZQotIyBsYXN0IHdlZWssIHRoZSBQTE8gQXV0aG9yaXR5IChQQSkgaGFzIGRlY2lkZWQgbm90IHRvIHR1cm4gaXRzIGNsb2NrcwotIyBvbmUtaG91ciBmb3J3YXJkIGF0IHRoaXMgdGltZS4gIEFzIGEgc2lnbiBvZiBpbmRlcGVuZGVuY2UgZnJvbSBJc3JhZWxpIHJ1bGUsCi0jIHRoZSBQQSBoYXMgZGVjaWRlZCB0byBpbXBsZW1lbnQgRFNUIGluIEFwcmlsLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDktMjApOgotIyBEYW91ZCBLdXR0YWIgd3JpdGVzIGluCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuanBvc3QuY29tL2NvbS9BcmNoaXZlLzIyLkFwci4xOTk5L09waW5pb24vQXJ0aWNsZS0yLmh0bWwiPgotIyBIb2xpZGF5IGhhdm9jCi0jIDwvYT4gKEplcnVzYWxlbSBQb3N0LCAxOTk5LTA0LTIyKSB0aGF0Ci0jIHRoZSBQYWxlc3RpbmlhbiBOYXRpb25hbCBBdXRob3JpdHkgY2hhbmdlZCB0byBEU1Qgb24gMTk5OS0wNC0xNS4KLSMgSSB2YWd1ZWx5IHJlY2FsbCB0aGF0IHRoZXkgc3dpdGNoIGJhY2sgaW4gT2N0b2JlciAoc29ycnksIGZvcmdvdCB0aGUgc291cmNlKS4KLSMgRm9yIG5vdywgbGV0J3MgYXNzdW1lIHRoYXQgdGhlIHNwcmluZyBzd2l0Y2ggd2FzIGF0IDI0OjAwLAotIyBhbmQgdGhhdCB0aGV5IHN3aXRjaCBhdCAwOjAwIG9uIHRoZSAzcmQgRnJpZGF5cyBvZiBBcHJpbCBhbmQgT2N0b2Jlci4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTExLTIyKToKLSMgU3RhcnRpbmcgMjAwNCB0cmFuc2l0aW9ucyBhcmUgZnJvbSBTdGVmZmVuIFRob3JzZW4ncyB3ZWIgc2l0ZSB0aW1lYW5kZGF0ZS5jb20uCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDUtMTEtMjMpOgotIyBBIHVzZXIgZnJvbSBHYXphIHJlcG9ydGVkIHRoYXQgR2F6YSBtYWRlIHRoZSBjaGFuZ2UgZWFybHkgYmVjYXVzZSBvZgotIyB0aGUgUmFtYWRhbi4gIE5leHQgeWVhciBSYW1hZGFuIHdpbGwgYmUgZXZlbiBlYXJsaWVyLCBzbyBJIHRoaW5rCi0jIHRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgbmV4dCB5ZWFyJ3MgZW5kIGRhdGUgd2lsbCBiZSBhcm91bmQgdHdvIHdlZWtzCi0jIGVhcmxpZXItLXRoZSBzYW1lIGdvZXMgZm9yIEpvcmRhbi4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOC0xNyk6Ci0jIEkgd2FzIGluZm9ybWVkIGJ5IGEgdXNlciBpbiBCZXRobGVoZW0gdGhhdCBpbiBCZXRobGVoZW0gaXQgc3RhcnRlZCB0aGUKLSMgc2FtZSBkYXkgYXMgSXNyYWVsLCBhbmQgYWZ0ZXIgY2hlY2tpbmcgd2l0aCBvdGhlciB1c2VycyBpbiB0aGUgYXJlYSwgSQotIyB3YXMgaW5mb3JtZWQgdGhhdCB0aGV5IHN0YXJ0ZWQgRFNUIG9uZSBkYXkgYWZ0ZXIgSXNyYWVsLiAgSSB3YXMgbm90Ci0jIGFibGUgdG8gZmluZCBhbnkgYXV0aG9yaXRhdGl2ZSBzb3VyY2VzIGF0IHRoZSB0aW1lLCBub3IgZGV0YWlscyBpZgotIyBHYXphIGNoYW5nZWQgYXMgd2VsbCwgYnV0IHByZXN1bWVkIEdhemEgdG8gZm9sbG93IHRoZSBzYW1lIHJ1bGVzIGFzCi0jIHRoZSBXZXN0IEJhbmsuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDktMjYpOgotIyBhY2NvcmRpbmcgdG8gdGhlIFBhbGVzdGluZSBOZXdzIE5ldHdvcmsgKDIwMDYtMDktMTkpOgotIyBodHRwOi8vZW5nbGlzaC5wbm4ucHMvaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ0YXNrPXZpZXcmaWQ9NTk2Jkl0ZW1pZD01Ci0jID4gVGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIGFubm91bmNlZCB0aGF0IHRoaXMgeWVhciBpdHMgd2ludGVyIHNjaGVkdWxlCi0jID4gd2lsbCBiZWdpbiBlYXJseSwgYXMgb2YgbWlkbmlnaHQgVGh1cnNkYXkuICBJdCBpcyBhbHNvIHRpbWUgdG8gdHVybgotIyA+IGJhY2sgdGhlIGNsb2NrcyBmb3Igd2ludGVyLiAgRnJpZGF5IHdpbGwgYmVnaW4gYW4gaG91ciBsYXRlIHRoaXMgd2Vlay4KLSMgSSBndWVzcyBpdCBpcyBsaWtlbHkgdGhhdCBuZXh0IHllYXIncyBkYXRlIHdpbGwgYmUgbW92ZWQgYXMgd2VsbCwKLSMgYmVjYXVzZSBvZiB0aGUgUmFtYWRhbi4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNy0wOS0xOCk6Ci0jIEFjY29yZGluZyB0byBTdGVmZmVuIFRob3JzZW4ncyB3ZWIgc2l0ZSB0aGUgR2F6YSBTdHJpcCBhbmQgdGhlIHJlc3Qgb2YgdGhlCi0jIFBhbGVzdGluaWFuIHRlcnJpdG9yaWVzIGxlZnQgRFNUIGVhcmx5IG9uIDEzLnRoLiBvZiBTZXB0ZW1iZXIgYXQgMjowMC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTA5LTIwKToKLSMgTXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IEdhemEgYW5kIHRoZSBXZXN0IEJhbmsgZGlzYWdyZWUgZXZlbiBvdmVyIHdoZW4KLSMgdGhlIHdlZWtlbmQgaXMgKFRodXJzZGF5K0ZyaWRheSB2ZXJzdXMgRnJpZGF5K1NhdHVyZGF5KSwgc28gSSdkIGJlIGEgYml0Ci0jIHN1cnByaXNlZCBpZiB0aGV5IGFncmVlZCBhYm91dCBEU1QuICBCdXQgZm9yIG5vdywgYXNzdW1lIHRoZXkgYWdyZWUuCi0jIEZvciBsYWNrIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgcHJlZGljdCB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHdpbGwgYmUKLSMgdGhlIDJuZCBUaHVyc2RheSBvZiBTZXB0ZW1iZXIgYXQgMDI6MDAuCi0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDgtMDgtMjgpOgotIyBIZXJlIGlzIGFuIGFydGljbGUsIHRoYXQgTWlkZWFzdCBydW5uaW5nIG9uIGRpZmZlcmVudCBjbG9ja3MgYXQgUmFtYWRhbi4KLSMKLSMgR2F6YSBTdHJpcCAoYXMgRWd5cHQpIGVuZGVkIERTVCBhdCBtaWRuaWdodCBUaHVyc2RheSAoQXVnIDI4LCAyMDA4KSwgd2hpbGUKLSMgdGhlIFdlc3QgQmFuayB3aWxsIGVuZCBEYXlsaWdodCBTYXZpbmcgVGltZSBhdCBtaWRuaWdodCBTdW5kYXkgKEF1ZyAzMSwgMjAwOCkuCi0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3VhcmRpYW4uY28udWsvd29ybGQvZmVlZGFydGljbGUvNzc1OTAwMSI+Ci0jIGh0dHA6Ly93d3cuZ3VhcmRpYW4uY28udWsvd29ybGQvZmVlZGFydGljbGUvNzc1OTAwMQotIyA8L2E+Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYWJjbmV3cy5nby5jb20vSW50ZXJuYXRpb25hbC93aXJlU3Rvcnk/aWQ9NTY3NjA4NyI+Ci0jIGh0dHA6Ly93d3cuYWJjbmV3cy5nby5jb20vSW50ZXJuYXRpb25hbC93aXJlU3Rvcnk/aWQ9NTY3NjA4NwotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDEuaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDEuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDMtMjYpOgotIyBBY2NvcmRpbmcgdG8gdGhlIFBhbGVzdGluZSBOZXdzIE5ldHdvcmsgKGFyYWJpYy5wbm4ucHMpLCBQYWxlc3RpbmlhbgotIyBnb3Zlcm5tZW50IGRlY2lkZWQgdG8gc3RhcnQgRGF5bGlnaHQgVGltZSBvbiBUaHVyc2RheSBuaWdodCBNYXJjaAotIyAyNiBhbmQgY29udGludWUgdW50aWwgdGhlIG5pZ2h0IG9mIDI3IFNlcHRlbWJlciAyMDA5LgotIwotIyAoaW4gQXJhYmljKQotIyA8YSBocmVmPSJodHRwOi8vYXJhYmljLnBubi5wcy9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD01MDg1MCI+Ci0jIGh0dHA6Ly9hcmFiaWMucG5uLnBzL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTUwODUwCi0jIDwvYT4KLSMKLSMgb3IKLSMgKEVuZ2xpc2ggdHJhbnNsYXRpb24pCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3Nfd2VzdGJhbmswMS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAxLmh0bWwKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA4LTMxKToKLSMgUGFsZXN0aW5lJ3MgQ291bmNpbCBvZiBNaW5pc3RlcnMgYW5ub3VuY2VkIHRoYXQgdGhleSB3aWxsIHJldmVydCBiYWNrIHRvCi0jIHdpbnRlciB0aW1lIG9uIEZyaWRheSwgMjAwOS0wOS0wNC4KLSMKLSMgT25lIG5ld3Mgc291cmNlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhZmEucHMvYXJhLz9hY3Rpb249c2hvd2RldGFpbCZzZWlkPTQxNTgiPgotIyBodHRwOi8vd3d3LnNhZmEucHMvYXJhLz9hY3Rpb249c2hvd2RldGFpbCZzZWlkPTQxNTgKLSMgPC9hPgotIyAoUGFsZXN0aW5pYW4gcHJlc3MgYWdlbmN5LCBBcmFiaWMpLAotIyBHb29nbGUgdHJhbnNsYXRlOiAiRGVjaWRlZCB0aGF0IHRoZSBQYWxlc3RpbmlhbiBnb3Zlcm5tZW50IGluIFJhbWFsbGFoCi0jIGhlYWRlZCBieSBTYWxhbSBGYXl5YWQsIHRoZSBzdGFydCBvZiB3b3JrIGluIHRpbWUgZm9yIHRoZSB3aW50ZXIgb2YKLSMgMjAwOSwgc3RhcnRpbmcgb24gRnJpZGF5IGFwcHJvdmVkIHRoZSBmb3VydGggZGVsYXkgU2VwdC4gY2xvY2sgc2l4dHkKLSMgbWludXRlcyBwZXIgaG91ciBhcyBvZiBGcmlkYXkgbW9ybmluZy4iCi0jCi0jIFdlIGFyZSBub3Qgc3VyZSBpZiBHYXphIHdpbGwgZG8gdGhlIHNhbWUsIGxhc3QgeWVhciB0aGV5IGhhZCBhIGRpZmZlcmVudAotIyBlbmQgZGF0ZSwgd2Ugd2lsbCBrZWVwIHRoaXMgcGFnZSB1cGRhdGVkOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvd2VzdGJhbmstZ2F6YS1kc3QtMjAwOS5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL3dlc3RiYW5rLWdhemEtZHN0LTIwMDkuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMDktMDIpOgotIyBTZWVtcyB0aGF0IEdhemEgU3RyaXAgd2lsbCBnbyBiYWNrIHRvIFdpbnRlciBUaW1lIHNhbWUgZGF0ZSBhcyBXZXN0IEJhbmsuCi0jCi0jIEFjY29yZGluZyB0byBQYWxlc3RpbmlhbiBNaW5pc3RyeSBPZiBJbnRlcmlvciwgV2VzdCBCYW5rIGFuZCBHYXphIFN0cmlwIHBsYW4KLSMgdG8gY2hhbmdlIHRpbWUgYmFjayB0byBTdGFuZGFyZCB0aW1lIG9uIFNlcHRlbWJlciA0LCAyMDA5LgotIwotIyAiV2ludGVyIHRpbWUgdW5pdGUgdGhlIFdlc3QgQmFuayBhbmQgR2F6YSIKLSMgKGZyb20gUGFsZXN0aW5pYW4gTmF0aW9uYWwgQXV0aG9yaXR5KToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tb2kuZ292LnBzL2VuLz9wYWdlPTYzMzE2NzM0MzI1MDU5NDAyNSZuaWQ9MTE1MDUKLSMgaHR0cDovL3d3dy5tb2kuZ292LnBzL2VuLz9wYWdlPTYzMzE2NzM0MzI1MDU5NDAyNSZuaWQ9MTE1MDUKLSMgPC9hPgotIyBvcgotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2dhemFzdHJpcDAyLmh0bWw+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZ2F6YXN0cmlwMDIuaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTAtMDMtMTkpOgotIyBBY2NvcmRpbmcgdG8gVm9pY2Ugb2YgUGFsZXN0aW5lIERTVCB3aWxsIGxhc3QgZm9yIDE5MSBkYXlzLCBmcm9tIE1hcmNoCi0jIDI2LCAyMDEwIHRpbGwgInRoZSBsYXN0IFN1bmRheSBiZWZvcmUgdGhlIHRlbnRoIGRheSBvZiBUaXNocmkKLSMgKE9jdG9iZXIpLCBlYWNoIHllYXIiIChPY3RvYmVyIDAzLCAyMDEwPykKLSMKLSMgPGEgaHJlZj0iaHR0cDovL3BhbHZvaWNlLm9yZy9mb3J1bXMvc2hvd3RocmVhZC5waHA/dD0yNDU2OTciPgotIyBodHRwOi8vcGFsdm9pY2Uub3JnL2ZvcnVtcy9zaG93dGhyZWFkLnBocD90PTI0NTY5NwotIyA8L2E+Ci0jIChpbiBBcmFiaWMpCi0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3Nfd2VzdGJhbmswMy5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c193ZXN0YmFuazAzLmh0bWwKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTI0KToKLSMgLi4uTWEnYW4gTmV3cyBBZ2VuY3kgcmVwb3J0cyB0aGF0IEhhbWFzIGNhYmluZXQgaGFzIGRlY2lkZWQgaXQgd2lsbAotIyBzdGFydCBvbmUgZGF5IGxhdGVyLCBhdCAxMjowMWFtLiBOb3Qgc3VyZSBpZiB0aGV5IHJlYWxseSBtZWFuIDEyOjAxYW0gb3IKLSMgbm9vbiB0aG91Z2g6Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTI3MTE3OCI+Ci0jIGh0dHA6Ly93d3cubWFhbm5ld3MubmV0L2VuZy9WaWV3RGV0YWlscy5hc3B4P0lEPTI3MTE3OAotIyA8L2E+Ci0jIChNYSdhbiBOZXdzIEFnZW5jeSkKLSMgIkF0IDEyOjAxYW0gRnJpZGF5LCBjbG9ja3MgaW4gSXNyYWVsIGFuZCB0aGUgV2VzdCBCYW5rIHdpbGwgY2hhbmdlIHRvCi0jIDE6MDFhbSwgd2hpbGUgR2F6YSBjbG9ja3Mgd2lsbCBjaGFuZ2UgYXQgMTI6MDFhbSBTYXR1cmRheSBtb3JuaW5nLiIKLQotIyBUaGUgcnVsZXMgZm9yIEVneXB0IGFyZSBzdG9sZW4gZnJvbSB0aGUgYGFmcmljYScgZmlsZS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlIEVneXB0QXNpYQkxOTU3CW9ubHkJLQlNYXkJMTAJMDowMAkxOjAwCVMKLVJ1bGUgRWd5cHRBc2lhCTE5NTcJMTk1OAktCU9jdAkgMQkwOjAwCTAJLQotUnVsZSBFZ3lwdEFzaWEJMTk1OAlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlIEVneXB0QXNpYQkxOTU5CTE5NjcJLQlNYXkJIDEJMTowMAkxOjAwCVMKLVJ1bGUgRWd5cHRBc2lhCTE5NTkJMTk2NQktCVNlcAkzMAkzOjAwCTAJLQotUnVsZSBFZ3lwdEFzaWEJMTk2Nglvbmx5CS0JT2N0CSAxCTM6MDAJMAktCi0KLVJ1bGUgUGFsZXN0aW5lCTE5OTkJMjAwNQktCUFwcglGcmk+PTE1CTA6MDAJMTowMAlTCi1SdWxlIFBhbGVzdGluZQkxOTk5CTIwMDMJLQlPY3QJRnJpPj0xNQkwOjAwCTAJLQotUnVsZSBQYWxlc3RpbmUJMjAwNAlvbmx5CS0JT2N0CSAxCTE6MDAJMAktCi1SdWxlIFBhbGVzdGluZQkyMDA1CW9ubHkJLQlPY3QJIDQJMjowMAkwCS0KLVJ1bGUgUGFsZXN0aW5lCTIwMDYJMjAwOAktCUFwcgkgMQkwOjAwCTE6MDAJUwotUnVsZSBQYWxlc3RpbmUJMjAwNglvbmx5CS0JU2VwCTIyCTA6MDAJMAktCi1SdWxlIFBhbGVzdGluZQkyMDA3CW9ubHkJLQlTZXAJVGh1Pj04CTI6MDAJMAktCi1SdWxlIFBhbGVzdGluZQkyMDA4CW9ubHkJLQlBdWcJbGFzdEZyaQkyOjAwCTAJLQotUnVsZSBQYWxlc3RpbmUJMjAwOQlvbmx5CS0JTWFyCWxhc3RGcmkJMDowMAkxOjAwCVMKLVJ1bGUgUGFsZXN0aW5lCTIwMTAJbWF4CS0JTWFyCWxhc3RTYXQJMDowMQkxOjAwCVMKLVJ1bGUgUGFsZXN0aW5lCTIwMDkJbWF4CS0JU2VwCUZyaT49MQkyOjAwCTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvR2F6YQkyOjE3OjUyCS0JTE1UCTE5MDAgT2N0Ci0JCQkyOjAwCVppb24JRUVUCTE5NDggTWF5IDE1Ci0JCQkyOjAwIEVneXB0QXNpYQlFRSVzVAkxOTY3IEp1biAgNQotCQkJMjowMAlaaW9uCUklc1QJMTk5NgotCQkJMjowMAlKb3JkYW4JRUUlc1QJMTk5OQotCQkJMjowMCBQYWxlc3RpbmUJRUUlc1QKLQotIyBQYXJhY2VsIElzCi0jIG5vIGluZm9ybWF0aW9uCi0KLSMgUGhpbGlwcGluZXMKLSMgT24gMTg0NC0wOC0xNiwgTmFyY2lzbyBDbGF2ZXJpYSwgZ292ZXJub3ItZ2VuZXJhbCBvZiB0aGUKLSMgUGhpbGlwcGluZXMsIGlzc3VlZCBhIHByb2NsYW1hdGlvbiBhbm5vdW5jaW5nIHRoYXQgMTg0NC0xMi0zMCB3YXMgdG8KLSMgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgMTg0NS0wMS0wMS4gIFJvYmVydCBILiB2YW4gR2VudCBoYXMgYQotIyB0cmFuc2NyaXB0IG9mIHRoZSBkZWNyZWUgaW4gPGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvaWRsL2lkbC5odG0+LgotIyBUaGUgcmVzdCBvZiB0aGUgZGF0YSBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNC0yNSk6Ci0jIFRvbW9ycm93J3MgTWFuaWxhIFN0YW5kYXJkIHJlcG9ydHMgdGhhdCB0aGUgUGhpbGlwcGluZXMgRGVwYXJ0bWVudCBvZgotIyBUcmFkZSBhbmQgSW5kdXN0cnkgaXMgY29uc2lkZXJpbmcgYWRvcHRpbmcgRFNUIHRoaXMgSnVuZSB3aGVuIHRoZQotIyByYWlueSBzZWFzb24gYmVnaW5zLiAgU2VlCi0jIDxodHRwOi8vd3d3Lm1hbmlsYXN0YW5kYXJkdG9kYXkuY29tLz9wYWdlPXBvbGl0aWNzMDJfYXByaWwyNl8yMDA2Pi4KLSMgRm9yIG5vdywgd2UnbGwgaWdub3JlIHRoaXMsIHNpbmNlIGl0J3Mgbm90IGRlZmluaXRlIGFuZCB3ZSBsYWNrIGRldGFpbHMuCi0jCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA0LTI2KToKLSMgLi4uIGNsYWltcyB0aGF0IFBoaWxpcHBpbmVzIGhhZCBEU1QgbGFzdCB0aW1lIGluIDE5OTA6Ci0jIGh0dHA6Ly9zdG9yeS5waGlsaXBwaW5ldGltZXMuY29tL3AueC9jdC85L2lkLzE0NWJlMjBjYzZiMTIxYzAvY2lkLzNlNWJiY2NjNzMwZDI1OGMvCi0jIFthIHN0b3J5IGRhdGVkIDIwMDYtMDQtMjUgYnkgQ3JpcyBMYXJhbm8gb2YgRG93IEpvbmVzIE5ld3N3aXJlcywKLSMgYnV0IG5vIGRldGFpbHNdCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVBoaWwJMTkzNglvbmx5CS0JTm92CTEJMDowMAkxOjAwCVMKLVJ1bGUJUGhpbAkxOTM3CW9ubHkJLQlGZWIJMQkwOjAwCTAJLQotUnVsZQlQaGlsCTE5NTQJb25seQktCUFwcgkxMgkwOjAwCTE6MDAJUwotUnVsZQlQaGlsCTE5NTQJb25seQktCUp1bAkxCTA6MDAJMAktCi1SdWxlCVBoaWwJMTk3OAlvbmx5CS0JTWFyCTIyCTA6MDAJMTowMAlTCi1SdWxlCVBoaWwJMTk3OAlvbmx5CS0JU2VwCTIxCTA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvTWFuaWxhCS0xNTo1NjowMCAtCUxNVAkxODQ0IERlYyAzMQotCQkJODowNDowMCAtCUxNVAkxODk5IE1heSAxMQotCQkJODowMAlQaGlsCVBIJXNUCTE5NDIgTWF5Ci0JCQk5OjAwCS0JSlNUCTE5NDQgTm92Ci0JCQk4OjAwCVBoaWwJUEglc1QKLQotIyBRYXRhcgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1FhdGFyCTM6MjY6MDggLQlMTVQJMTkyMAkjIEFsIERhd2hhaCAvIERvaGEKLQkJCTQ6MDAJLQlHU1QJMTk3MiBKdW4KLQkJCTM6MDAJLQlBU1QKLQotIyBTYXVkaSBBcmFiaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9SaXlhZGgJMzowNjo1MiAtCUxNVAkxOTUwCi0JCQkzOjAwCS0JQVNUCi0KLSMgU2luZ2Fwb3JlCi0jIFRoZSBkYXRhIGhlcmUgYXJlIHRha2VuIGZyb20gTW9rIEx5IFluZyAoMjAwMy0xMC0zMCkKLSMgPGh0dHA6Ly93d3cubWF0aC5udXMuZWR1LnNnL2FzbGFrc2VuL3RlYWNoaW5nL3RpbWV6b25lLmh0bWw+LgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1NpbmdhcG9yZQk2OjU1OjI1IC0JTE1UCTE5MDEgSmFuICAxCi0JCQk2OjU1OjI1CS0JU01UCTE5MDUgSnVuICAxICMgU2luZ2Fwb3JlIE0uVC4KLQkJCTc6MDAJLQlNQUxUCTE5MzMgSmFuICAxICMgTWFsYXlhIFRpbWUKLQkJCTc6MDAJMDoyMAlNQUxTVAkxOTM2IEphbiAgMQotCQkJNzoyMAktCU1BTFQJMTk0MSBTZXAgIDEKLQkJCTc6MzAJLQlNQUxUCTE5NDIgRmViIDE2Ci0JCQk5OjAwCS0JSlNUCTE5NDUgU2VwIDEyCi0JCQk3OjMwCS0JTUFMVAkxOTY1IEF1ZyAgOSAjIGluZGVwZW5kZW5jZQotCQkJNzozMAktCVNHVAkxOTgyIEphbiAgMSAjIFNpbmdhcG9yZSBUaW1lCi0JCQk4OjAwCS0JU0dUCi0KLSMgU3ByYXRseSBJcwotIyBubyBpbmZvcm1hdGlvbgotCi0jIFNyaSBMYW5rYQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA5LTAzKToKLSMgIlNyaSBMYW5rYSBhZHZhbmNlcyBjbG9jayBieSBhbiBob3VyIHRvIGF2b2lkIGJsYWNrb3V0IgotIyAod3d3LnZpcnR1YWwtcGMuY29tL2xhbmthd2ViL25ld3MvaXRlbXMvMjQwNTk2LTIuaHRtbCwgMTk5Ni0wNS0yNCwKLSMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBvZiAxOTk5LTA4LTE3KQotIyByZXBvcnRlZCBgYHRoZSBjb3VudHJ5J3Mgc3RhbmRhcmQgdGltZSB3aWxsIGJlIHB1dCBmb3J3YXJkIGJ5IG9uZSBob3VyIGF0Ci0jIG1pZG5pZ2h0IEZyaWRheSAoMTgzMCBHTVQpIGBpbiB0aGUgbGlnaHQgb2YgdGhlIHByZXNlbnQgcG93ZXIgY3Jpc2lzJy4nJwotIwotIyBGcm9tIERoYXJtYXNpcmkgU2VuYW5heWFrZSwgU3JpIExhbmthIE1lZGlhIE1pbmlzdGVyICgxOTk2LTEwLTI0KSwgYXMgcXVvdGVkCi0jIGJ5IFNoYW1pbmRyYSBpbgotIyA8YSBocmVmPSJuZXdzOjU0cmthNSRtNWhAbXRpbnNjMDEtbWd0Lm9wcy53b3JsZG5ldC5hdHQubmV0Ij4KLSMgRGFpbHkgTmV3cyAtIEhvdCBOZXdzIFNlY3Rpb24gKDE5OTYtMTAtMjYpCi0jIDwvYT46Ci0jIFdpdGggZWZmZWN0IGZyb20gMTIuMzAgYS5tLiBvbiAyNnRoIE9jdG9iZXIgMTk5NgotIyBTcmkgTGFua2Egd2lsbCBiZSBzaXggKDA2KSBob3VycyBhaGVhZCBvZiBHTVQuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDQtMTQpLCBxdW90aW5nIFNyaSBMYW5rYSBOZXdzIE9ubGluZQotIyA8aHR0cDovL25ld3Muc2luaGFsYXlhLmNvbS93bXZpZXcucGhwP0FydElEPTExMDAyPiAoMjAwNi0wNC0xMyk6Ci0jIDAwMzAgaHJzIG9uIEFwcmlsIDE1LCAyMDA2IChtaWRuaWdodCBvZiBBcHJpbCAxNCwgMjAwNiArMzAgbWludXRlcykKLSMgYXQgcHJlc2VudCwgYmVjb21lIDI0MDAgaG91cnMgb2YgQXByaWwgMTQsIDIwMDYgKG1pZG5pZ2h0IG9mIEFwcmlsIDE0LCAyMDA2KS4KLQotIyBGcm9tIFBldGVyIEFwcHMgYW5kIFJhbmdhIFNpcmlsYSBvZiBSZXV0ZXJzICgyMDA2LTA0LTEyKSBpbjoKLSMgPGh0dHA6Ly90b2RheS5yZXV0ZXJzLmNvLnVrL25ld3MvbmV3c0FydGljbGUuYXNweD90eXBlPXNjaWVuY2VOZXdzJnN0b3J5SUQ9MjAwNi0wNC0xMlQxNzIyMjhaXzAxX0NPTDI5NTc2Ml9SVFJJRFNUXzBfU0NJRU5DRS1TUklMQU5LQS1USU1FLURDLlhNTD4KLSMgW1RoZSBUYW1pbCBUaWdlcnNdIG5ldmVyIGFjY2VwdGVkIHRoZSBvcmlnaW5hbCAxOTk2IHRpbWUgY2hhbmdlIGFuZCBzaW1wbHkKLSMga2VwdCB0aGVpciBjbG9ja3Mgc2V0IGZpdmUgYW5kIGEgaGFsZiBob3VycyBhaGVhZCBvZiBHcmVlbndpY2ggTWVhbgotIyBUaW1lIChHTVQpLCBpbiBsaW5lIHdpdGggbmVpZ2hib3IgSW5kaWEuCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMTgpOgotIyBQZW9wbGUgd2hvIGxpdmUgaW4gcmVnaW9ucyB1bmRlciBUYW1pbCBjb250cm9sIGNhbiB1c2UgW1RaPSdBc2lhL0tvbGthdGEnXSwKLSMgYXMgdGhhdCB6b25lIGhhcyBhZ3JlZWQgd2l0aCB0aGUgVGFtaWwgYXJlYXMgc2luY2Ugb3VyIGN1dG9mZiBkYXRlIG9mIDE5NzAuCi0KLSMgRnJvbSBLIFNldGh1ICgyMDA2LTA0LTI1KToKLSMgSSB0aGluayB0aGUgYWJicmV2aWF0aW9uIExLVCBvcmlnaW5hdGVkIGZyb20gdGhlIHdvcmxkIG9mIGNvbXB1dGVycyBhdAotIyB0aGUgdGltZSBvZiBvciBzdWJzZXF1ZW50IHRvIHRoZSB0aW1lIHpvbmUgY2hhbmdlcyBieSBTTCBHb3Zlcm5tZW50Ci0jIHR3aWNlIGluIDE5OTYgYW5kIHByb2JhYmx5IFNMIEdvdmVybm1lbnQgb3IgaXRzIHN0YW5kYXJkaXphdGlvbgotIyBhZ2VuY2llcyBuZXZlciBkZWNsYXJlZCBhbiBhYmJyZXZpYXRpb24gYXMgYSBuYXRpb25hbCBzdGFuZGFyZC4KLSMKLSMgSSByZWNvbGxlY3QgYmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlIHRoZSBnb3Zlcm5tZW50IGFubm91Y2VtbWVudHMKLSMgbWVudGlvbmluZyBpdCBhcyBzaW1wbHkgY2hhbmdpbmcgU3JpIExhbmthIFN0YW5kYXJkIFRpbWUgb3IgU3JpIExhbmthCi0jIFRpbWUgYW5kIG5vIG1lbnRpb24gd2FzIG1hZGUgYWJvdXQgdGhlIGFiYnJldmlhdGlvbi4KLSMKLSMgSWYgd2UgbG9vayBhdCBTcmkgTGFua2EgRGVwYXJ0bWVudCBvZiBHb3Zlcm5tZW50J3MgIk9mZmljaWFsIE5ld3MKLSMgV2Vic2l0ZSBvZiBTcmkgTGFua2EiIC4uLiBodHRwOi8vd3d3Lm5ld3MubGsvIHdlIGNhbiBzZWUgdGhhdCB0aGV5Ci0jIHVzZSBTTFQgYXMgYWJicmV2aWF0aW9uIGluIHRpbWUgc3RhbXAgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG5ld3MKLSMgaXRlbS4uLi4KLSMKLSMgV2l0aGluIFNyaSBMYW5rYSBJIHRoaW5rIExLVCBpcyB3ZWxsIGtub3duIGFtb25nIGNvbXB1dGVyIHVzZXJzIGFuZAotIyBhZG1pbnNpdHJhdG9ycy4gIEluIG15IG9waW5pb24gU0xUIG1heSBub3QgYmUgYSBnb29kIGNob2ljZSBiZWNhdXNlIHRoZQotIyBuYXRpb24ncyBsYXJnZXN0IHRlbGNvbSAvIGludGVybmV0IG9wZXJhdG9yIFNyaSBMYW5rYSBUZWxjb20gaXMgd2VsbAotIyBrbm93biBieSB0aGF0IGFiYnJldmlhdGlvbiAtIHNpbXBseSBhcyBTTFQgKHRoZXJlIElQIGRvbWFpbnMgYXJlCi0jIHNsdC5sayBhbmQgc2x0bmV0LmxrKS4KLSMKLSMgQnV0IGlmIGluZGVlZCBvdXIgZ292ZXJubWVudCBoYXMgYWRvcHRlZCBTTFQgYXMgc3RhbmRhcmQgYWJicmV2aWF0aW9uCi0jICh0aGF0IHdlIGhhdmUgbm90IGtub3duIHNvIGZhcikgdGhlbiAgaXQgaXMgYmV0dGVyIHRoYXQgaXQgYmUgdXNlZCBmb3IKLSMgYWxsIGNvbXB1dGVycy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA0LTI1KToKLSMgT25lIHBvc3NpYmlsaXR5IGlzIHRoYXQgd2Ugd2FpdCBmb3IgYSBiaXQgZm9yIHRoZSBkdXN0IHRvIHNldHRsZSBkb3duCi0jIGFuZCB0aGVuIHNlZSB3aGF0IHBlb3BsZSBhY3R1YWxseSBzYXkgaW4gcHJhY3RpY2UuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9Db2xvbWJvCTU6MTk6MjQgLQlMTVQJMTg4MAotCQkJNToxOTozMgktCU1NVAkxOTA2CSMgTW9yYXR1d2EgTWVhbiBUaW1lCi0JCQk1OjMwCS0JSVNUCTE5NDIgSmFuICA1Ci0JCQk1OjMwCTA6MzAJSUhTVAkxOTQyIFNlcAotCQkJNTozMAkxOjAwCUlTVAkxOTQ1IE9jdCAxNiAyOjAwCi0JCQk1OjMwCS0JSVNUCTE5OTYgTWF5IDI1IDA6MDAKLQkJCTY6MzAJLQlMS1QJMTk5NiBPY3QgMjYgMDozMAotCQkJNjowMAktCUxLVAkyMDA2IEFwciAxNSAwOjMwCi0JCQk1OjMwCS0JSVNUCi0KLSMgU3lyaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVN5cmlhCTE5MjAJMTkyMwktCUFwcglTdW4+PTE1CTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5MjAJMTkyMwktCU9jdAlTdW4+PTEJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk2Mglvbmx5CS0JQXByCTI5CTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5NjIJb25seQktCU9jdAkxCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5NjMJMTk2NQktCU1heQkxCTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5NjMJb25seQktCVNlcAkzMAkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTY0CW9ubHkJLQlPY3QJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTY1CW9ubHkJLQlTZXAJMzAJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk2Nglvbmx5CS0JQXByCTI0CTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5NjYJMTk3NgktCU9jdAkxCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5NjcJMTk3OAktCU1heQkxCTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5NzcJMTk3OAktCVNlcAkxCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5ODMJMTk4NAktCUFwcgk5CTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5ODMJMTk4NAktCU9jdAkxCTI6MDAJMAktCi1SdWxlCVN5cmlhCTE5ODYJb25seQktCUZlYgkxNgkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTg2CW9ubHkJLQlPY3QJOQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTg3CW9ubHkJLQlNYXIJMQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTg3CTE5ODgJLQlPY3QJMzEJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk4OAlvbmx5CS0JTWFyCTE1CTI6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5ODkJb25seQktCU1hcgkzMQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTg5CW9ubHkJLQlPY3QJMQkyOjAwCTAJLQotUnVsZQlTeXJpYQkxOTkwCW9ubHkJLQlBcHIJMQkyOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTkwCW9ubHkJLQlTZXAJMzAJMjowMAkwCS0KLVJ1bGUJU3lyaWEJMTk5MQlvbmx5CS0JQXByCSAxCTA6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5OTEJMTk5MgktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlTeXJpYQkxOTkyCW9ubHkJLQlBcHIJIDgJMDowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk5Mwlvbmx5CS0JTWFyCTI2CTA6MDAJMTowMAlTCi1SdWxlCVN5cmlhCTE5OTMJb25seQktCVNlcAkyNQkwOjAwCTAJLQotIyBJQVRBIFNTSU0gKDE5OTgtMDIpIHNheXMgMTk5OC0wNC0wMjsKLSMgKDE5OTgtMDkpIHNheXMgMTk5OS0wMy0yOSBhbmQgMTk5OS0wOS0yOTsgKDE5OTktMDIpIHNheXMgMTk5OS0wNC0wMiwKLSMgMjAwMC0wNC0wMiwgYW5kIDIwMDEtMDQtMDI7ICgxOTk5LTA5KSBzYXlzIDIwMDAtMDMtMzEgYW5kIDIwMDEtMDMtMzE7Ci0jICgyMDA2KSBzYXlzIDIwMDYtMDMtMzEgYW5kIDIwMDYtMDktMjI7Ci0jIGZvciBub3cgaWdub3JlIGFsbCB0aGVzZSBjbGFpbXMgYW5kIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLAotIyBleGNlcHQgZm9yIHRoZSAyMDA2LTA5LTIyIGNsYWltICh3aGljaCBzZWVtcyByaWdodCBmb3IgUmFtYWRhbikuCi1SdWxlCVN5cmlhCTE5OTQJMTk5NgktCUFwcgkgMQkwOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkxOTk0CTIwMDUJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJU3lyaWEJMTk5NwkxOTk4CS0JTWFyCWxhc3RNb24JMDowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMTk5OQkyMDA2CS0JQXByCSAxCTA6MDAJMTowMAlTCi0jIEZyb20gU3RlcGhlbiBDb2xlYm91cm5lICgyMDA2LTA5LTE4KToKLSMgQWNjb3JkaW5nIHRvIElBVEEgZGF0YSwgU3lyaWEgd2lsbCBjaGFuZ2UgRFNUIG9uIDIxc3QgU2VwdGVtYmVyIFsyMTowMCBVVENdCi0jIHRoaXMgeWVhciBbb25seV0uLi4uICBUaGlzIGlzIHByb2JhYmx5IHJlbGF0ZWQgdG8gUmFtYWRhbiwgbGlrZSBFZ3lwdC4KLVJ1bGUJU3lyaWEJMjAwNglvbmx5CS0JU2VwCTIyCTA6MDAJMAktCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMjkpOgotIyBUb2RheSB0aGUgQVAgcmVwb3J0ZWQgIlN5cmlhIHdpbGwgc3dpdGNoIHRvIHN1bW1lcnRpbWUgYXQgbWlkbmlnaHQgVGh1cnNkYXkuIgotIyBodHRwOi8vd3d3LmlodC5jb20vYXJ0aWNsZXMvYXAvMjAwNy8wMy8yOS9hZnJpY2EvTUUtR0VOLVN5cmlhLVRpbWUtQ2hhbmdlLnBocAotUnVsZQlTeXJpYQkyMDA3CW9ubHkJLQlNYXIJbGFzdEZyaQkwOjAwCTE6MDAJUwotIyBGcm9tIEplc3BlciBOb3JnYXJkICgyMDA3LTEwLTI3KToKLSMgVGhlIHNpc3RlciBjZW50ZXIgSUNBUkRBIG9mIG15IHdvcmsgQ0lNTVlUIGlzIGNvbmZpcm1pbmcgdGhhdCBTeXJpYSBEU1Qgd2lsbAotIyBub3QgdGFrZSBwbGFjZSAxLnN0IE5vdmVtYmVyIGF0IDA6MDAgbydjbG9jayBidXQgMS5zdCBOb3ZlbWJlciBhdCAyNDowMCBvcgotIyByYXRoZXIgTWlkbmlnaHQgYmV0d2VlbiBUaHVyc2RheSBhbmQgRnJpZGF5LiBUaGlzIGRvZXMgbWFrZSBtb3JlIHNlbmNlIHRoYW4KLSMgaGF2aW5nIGl0IGJldHdlZW4gV2VkbmVzZGF5IGFuZCBUaHVyc2RheSAodHdvIHdvcmtkYXlzIGluIFN5cmlhKSBzaW5jZSB0aGUKLSMgd2Vla2VuZCBpbiBTeXJpYSBpcyBub3QgU2F0dXJkYXkgYW5kIFN1bmRheSwgYnV0IEZyaWRheSBhbmQgU2F0dXJkYXkuIFNvIG5vdwotIyBpdCBpcyBpbXBsZW1lbnRlZCBhdCBtaWRuaWdodCBvZiB0aGUgbGFzdCB3b3JrZGF5IGJlZm9yZSB3ZWVrZW5kLi4uCi0jIAotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0xMC0yNyk6Ci0jIEplc3BlciBOb3JnYWFyZCBXZWxlbiB3cm90ZToKLSMgCi0jID4gIldpbnRlciBsb2NhbCB0aW1lIGluIFN5cmlhIHdpbGwgYmUgb2JzZXJ2ZWQgYXQgbWlkbmlnaHQgb2YgVGh1cnNkYXkgMQotIyA+IE5vdmVtYmVyIDIwMDcsIGFuZCB0aGUgY2xvY2sgd2lsbCBiZSBwdXQgYmFjayAxIGhvdXIuIgotIyAKLSMgSSBmb3VuZCBjb25maXJtYXRpb24gb24gdGhpcyBpbiB0aGlzIGdvdi5zeS1hcnRpY2xlIChBcmFiaWMpOgotIyBodHRwOi8vd2VoZGEuYWx3ZWhkYS5nb3Yuc3kvX3ByaW50X3ZlaXcuYXNwP0ZpbGVOYW1lPTEyNTIxNzEwNTIwMDcwOTI2MTExMjQ3Ci0jIAotIyB3aGljaCB1c2luZyBHb29nbGUncyB0cmFuc2xhdGUgdG9vbHMgc2F5czoKLSMgQ291bmNpbCBvZiBNaW5pc3RlcnMgYWxzbyBhcHByb3ZlZCB0aGUgY29tbWVuY2VtZW50IG9mIHdvcmsgb24gCi0jIGlkZW50aWZ5aW5nIHRoZSB3aW50ZXIgdGltZSBhcyBvZiBGcmlkYXksIDIvMTEvMjAwNyB3aGVyZSB0aGUgNjB0aCAKLSMgbWludXRlIGRlbGF5IGF0IG1pZG5pZ2h0IFRodXJzZGF5IDEvMTEvMjAwNy4KLVJ1bGUJU3lyaWEJMjAwNwlvbmx5CS0JTm92CSBGcmk+PTEJMDowMAkwCS0KLQotIyBGcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZSAoMjAwOC0wMy0xNyk6Ci0jIEZvciBldmVyeW9uZSdzIGluZm8sIEkgc2F3IGFuIElBVEEgdGltZSB6b25lIGNoYW5nZSBmb3IgW1N5cmlhXSBmb3IKLSMgdGhpcyBtb250aCAoTWFyY2ggMjAwOCkgaW4gdGhlIGxhc3QgZGF5IG9yIHNvLi4uVGhpcyBpcyB0aGUgZGF0YSBJQVRBCi0jIGFyZSBub3cgdXNpbmc6Ci0jIENvdW50cnkgICAgIFRpbWUgU3RhbmRhcmQgICAtLS0gRFNUIFN0YXJ0IC0tLSAgIC0tLSBEU1QgRW5kIC0tLSAgRFNUCi0jIE5hbWUgICAgICAgIFpvbmUgVmFyaWF0aW9uICAgVGltZSAgICBEYXRlICAgICAgICBUaW1lICAgIERhdGUKLSMgVmFyaWF0aW9uCi0jIFN5cmlhbiBBcmFiCi0jIFJlcHVibGljICAgIFNZICAgICswMjAwICAgICAgMjIwMCAgMDNBUFIwOCAgICAgICAyMTAwICAzMFNFUDA4ICAgKzAzMDAKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAwICAwMkFQUjA5ICAgICAgIDIxMDAgIDMwU0VQMDkgICArMDMwMAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDAgIDAxQVBSMTAgICAgICAgMjEwMCAgMzBTRVAxMCAgICswMzAwCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTcpOgotIyBIZXJlJ3MgYSBsaW5rIHRvIEVuZ2xpc2gtbGFuZ3VhZ2UgY292ZXJhZ2UgYnkgdGhlIFN5cmlhbiBBcmFiIE5ld3MKLSMgQWdlbmN5IChTQU5BKS4uLgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvZW5nLzIxLzIwMDgvMDMvMTEvMTY1MTczLmh0bSI+Ci0jIGh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOC8wMy8xMS8xNjUxNzMuaHRtCi0jIDwvYT4uLi53aGljaCByZWFkcyAoaW4gcGFydCkgIlRoZSBDYWJpbmV0IGFwcHJvdmVkIHRoZSBzdWdnZXN0aW9uIG9mIHRoZQotIyBNaW5pc3RyeSBvZiBFbGVjdHJpY2l0eSB0byBiZWdpbiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgb24gRnJpZGF5IEFwcmlsCi0jIDR0aCwgYWR2YW5jaW5nIGNsb2NrcyBvbmUgaG91ciBhaGVhZCBvbiBtaWRuaWdodCBvZiBUaHVyc2RheSBBcHJpbCAzcmQuIgotIyBTaW5jZSBTeXJpYSBpcyB0d28gaG91cnMgZWFzdCBvZiBVVEMsIHRoZSAyMjAwIGFuZCAyMTAwIHRyYW5zaXRpb24gdGltZXMKLSMgc2hvd24gYWJvdmUgbWF0Y2ggdXAgd2l0aCBtaWRuaWdodCBpbiBTeXJpYS4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0xOCk6Ci0jIE15IGJ1ZXN0IGd1ZXNzIGF0IGEgU3lyaWFuIHJ1bGUgaXMgInRoZSBGcmlkYXkgbmVhcmVzdCBBcHJpbCAxIjsKLSMgY29kaW5nIHRoYXQgaW52b2x2ZXMgZWl0aGVyIHVzaW5nIGEgIk1hciBGcmk+PTI5IiBjb25zdHJ1Y3QgdGhhdCBvbGQgdGltZSB6b25lCi0jIGNvbXBpbGVycyBjYW4ndCBoYW5kbGUgIG9yIGhhdmluZyBtdWx0aXBsZSBSdWxlcyAoYSBsYSBJc3JhZWwpLgotIyBGb3Igbm93LCB1c2UgIkFwciBGcmk+PTEiLCBhbmQgZ28gd2l0aCBJQVRBIG9uIGEgdW5pZm9ybSBTZXAgMzAgZW5kLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTEwLTA3KToKLSMgU3lyaWEgaGFzIG5vdyBvZmZpY2lhbGx5IGRlY2lkZWQgdG8gZW5kIERTVCBvbiAyMDA4LTExLTAxIHRoaXMgeWVhciwKLSMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBpbiB0aGUgU3lyaWFuIEFyYWIgTmV3cyBBZ2VuY3kgKFNBTkEpLgotIwotIyBUaGUgYXJ0aWNsZSBpcyBpbiBBcmFiaWMsIGFuZCBzZWVtcyB0byB0ZWxsIHRoYXQgdGhleSB3aWxsIGdvIGJhY2sgdG8KLSMgd2ludGVyIHRpbWUgb24gMjAwOC0xMS0wMSBhdCAwMDowMCBsb2NhbCBkYXlsaWdodCB0aW1lIChkZWxheWluZy9zZXR0aW5nCi0jIGNsb2NrcyBiYWNrIDYwIG1pbnV0ZXMpLgotIwotIyA8YSBocmVmPSJodHRwOi8vc2FuYS5zeS9hcmEvMi8yMDA4LzEwLzA3LzE5NTQ1OS5odG0iPgotIyBodHRwOi8vc2FuYS5zeS9hcmEvMi8yMDA4LzEwLzA3LzE5NTQ1OS5odG0KLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTAzLTE5KToKLSMgU3lyaWEgd2lsbCBzdGFydCBEU1Qgb24gMjAwOS0wMy0yNyAwMDowMCB0aGlzIHllYXIgYWNjb3JkaW5nIHRvIG1hbnkgc291cmNlcywKLSMgdHdvIGV4YW1wbGVzOgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmEuc3kvZW5nLzIxLzIwMDkvMDMvMTcvMjE3NTYzLmh0bSI+Ci0jIGh0dHA6Ly93d3cuc2FuYS5zeS9lbmcvMjEvMjAwOS8wMy8xNy8yMTc1NjMuaHRtCi0jIDwvYT4KLSMgKEVuZ2xpc2gsIFN5cmlhbiBBcmFiIE5ld3MgIyBBZ2VuY3kpCi0jIDxhIGhyZWY9Imh0dHA6Ly90aGF3cmEuYWx3ZWhkYS5nb3Yuc3kvX1ZpZXdfbmV3czIuYXNwP0ZpbGVOYW1lPTk0NDU5MjU4NzIwMDkwMzE4MDEyMjA5Ij4KLSMgaHR0cDovL3RoYXdyYS5hbHdlaGRhLmdvdi5zeS9fVmlld19uZXdzMi5hc3A/RmlsZU5hbWU9OTQ0NTkyNTg3MjAwOTAzMTgwMTIyMDkKLSMgPC9hPgotIyAoQXJhYmljLCBnb3Ytc2l0ZSkKLSMKLSMgV2UgaGF2ZSBub3QgZm91bmQgYW55IHNvdXJjZXMgc2F5aW5nIGFueXRoaW5nIGFib3V0IHdoZW4gRFNUIGVuZHMgdGhpcyB5ZWFyLgotIwotIyBPdXIgc3VtbWFyeQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc3lyaWEtZHN0LXN0YXJ0cy1tYXJjaC0yNy0yMDA5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc3lyaWEtZHN0LXN0YXJ0cy1tYXJjaC0yNy0yMDA5Lmh0bWwKLSMgPC9hPgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTEwLTI3KToKLSMgVGhlIFN5cmlhbiBBcmFiIE5ld3MgTmV0d29yayBvbiAyMDA5LTA5LTI5IHJlcG9ydGVkIHRoYXQgU3lyaWEgd2lsbCAKLSMgcmV2ZXJ0IGJhY2sgdG8gd2ludGVyIChzdGFuZGFyZCkgdGltZSBvbiBtaWRuaWdodCBiZXR3ZWVuIFRodXJzZGF5IAotIyAyMDA5LTEwLTI5IGFuZCBGcmlkYXkgMjAwOS0xMC0zMDoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5hLnN5L2FyYS8yLzIwMDkvMDkvMjkvMjQ3MDEyLmh0bSI+Ci0jIGh0dHA6Ly93d3cuc2FuYS5zeS9hcmEvMi8yMDA5LzA5LzI5LzI0NzAxMi5odG0gKEFyYWJpYykKLSMgPC9hPgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTEwLTI4KToKLSMgV2UnbGwgc2VlIGlmIGZ1dHVyZSBEU1Qgc3dpdGNoaW5nIHRpbWVzIHR1cm4gb3V0IHRvIGJlIGVuZCBvZiB0aGUgbGFzdAotIyBUaHVyc2RheSBvZiB0aGUgbW9udGggb3IgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IEZyaWRheSBvZiB0aGUgbW9udGggb3IKLSMgc29tZXRoaW5nIGVsc2UuIEZvciBub3csIHVzZSB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgRnJpZGF5LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDEwLTAzLTE3KToKLSMgVGhlICJTeXJpYW4gTmV3cyBTdGF0aW9uIiByZXBvcnRlZCBvbiAyMDEwLTAzLTE2IHRoYXQgdGhlIENvdW5jaWwgb2YKLSMgTWluaXN0ZXJzIGhhcyBkZWNpZGVkIHRoYXQgU3lyaWEgd2lsbCBzdGFydCBEU1Qgb24gbWlkbmlnaHQgVGh1cnNkYXkKLSMgMjAxMC0wNC0wMTogKG1pZG5pZ2h0IGJldHdlZW4gVGh1cnNkYXkgYW5kIEZyaWRheSk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9zbnMuc3kvc25zLz9wYXRoPW5ld3MvcmVhZC8xMTQyMSI+Ci0jIGh0dHA6Ly9zbnMuc3kvc25zLz9wYXRoPW5ld3MvcmVhZC8xMTQyMSAoQXJhYmljKQotIyA8L2E+Ci0KLVJ1bGUJU3lyaWEJMjAwOAlvbmx5CS0JQXByCUZyaT49MQkwOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkyMDA4CW9ubHkJLQlOb3YJMQkwOjAwCTAJLQotUnVsZQlTeXJpYQkyMDA5CW9ubHkJLQlNYXIJbGFzdEZyaQkwOjAwCTE6MDAJUwotUnVsZQlTeXJpYQkyMDEwCW1heAktCUFwcglGcmk+PTEJMDowMAkxOjAwCVMKLVJ1bGUJU3lyaWEJMjAwOQltYXgJLQlPY3QJbGFzdEZyaQkwOjAwCTAJLQotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRGFtYXNjdXMJMjoyNToxMiAtCUxNVAkxOTIwCSMgRGltYXNocQotCQkJMjowMAlTeXJpYQlFRSVzVAotCi0jIFRhamlraXN0YW4KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvRHVzaGFuYmUJNDozNToxMiAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCURVU1QJMTkzMCBKdW4gMjEgIyBEdXNoYW5iZSBUaW1lCi0JCQk2OjAwIFJ1c3NpYUFzaWEgRFVTJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQk1OjAwCTE6MDAJRFVTU1QJMTk5MSBTZXAgIDkgMjowMHMKLQkJCTU6MDAJLQlUSlQJCSAgICAjIFRhamlraXN0YW4gVGltZQotCi0jIFRoYWlsYW5kCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQmFuZ2tvawk2OjQyOjA0CS0JTE1UCTE4ODAKLQkJCTY6NDI6MDQJLQlCTVQJMTkyMCBBcHIgIyBCYW5na29rIE1lYW4gVGltZQotCQkJNzowMAktCUlDVAotCi0jIFR1cmttZW5pc3RhbgotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9Bc2hnYWJhdAkzOjUzOjMyIC0JTE1UCTE5MjQgTWF5ICAyICMgb3IgQXNoa2hhYmFkCi0JCQk0OjAwCS0JQVNIVAkxOTMwIEp1biAyMSAjIEFzaGtoYWJhZCBUaW1lCi0JCQk1OjAwIFJ1c3NpYUFzaWEJQVNIJXNUCTE5OTEgTWFyIDMxIDI6MDAKLQkJCTQ6MDAgUnVzc2lhQXNpYQlBU0glc1QJMTk5MSBPY3QgMjcgIyBpbmRlcGVuZGVuY2UKLQkJCTQ6MDAgUnVzc2lhQXNpYQlUTSVzVAkxOTkyIEphbiAxOSAyOjAwCi0JCQk1OjAwCS0JVE1UCi0KLSMgVW5pdGVkIEFyYWIgRW1pcmF0ZXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQXNpYS9EdWJhaQkzOjQxOjEyIC0JTE1UCTE5MjAKLQkJCTQ6MDAJLQlHU1QKLQotIyBVemJla2lzdGFuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvU2FtYXJrYW5kCTQ6Mjc6MTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQlTQU1UCTE5MzAgSnVuIDIxICMgU2FtYXJrYW5kIFRpbWUKLQkJCTU6MDAJLQlTQU1UCTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJU0FNU1QJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQlUQVNUCTE5ODIgQXByICAxICMgVGFzaGtlbnQgVGltZQotCQkJNTowMCBSdXNzaWFBc2lhCVNBTSVzVAkxOTkxIFNlcCAgMSAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCVVaJXNUCTE5OTIKLQkJCTU6MDAJLQlVWlQKLVpvbmUJQXNpYS9UYXNoa2VudAk0OjM3OjEyIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQk1OjAwCS0JVEFTVAkxOTMwIEp1biAyMSAjIFRhc2hrZW50IFRpbWUKLQkJCTY6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBNYXIgMzEgMjowMAotCQkJNTowMCBSdXNzaWFBc2lhCVRBUyVzVAkxOTkxIFNlcCAgMSAjIGluZGVwZW5kZW5jZQotCQkJNTowMCBSdXNzaWFBc2lhCVVaJXNUCTE5OTIKLQkJCTU6MDAJLQlVWlQKLQotIyBWaWV0bmFtCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDMtMTgpOgotIyBUaGUgRW5nbGlzaC1sYW5ndWFnZSBuYW1lIG9mIFZpZXRuYW0ncyBtb3N0IHBvcHVsb3VzIGNpdHkgaXMgIkhvIENoaSBNaW4gQ2l0eSI7Ci0jIHdlIHVzZSBIb19DaGlfTWluaCBiZWxvdyB0byBhdm9pZCBhIG5hbWUgb2YgbW9yZSB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvSG9fQ2hpX01pbmgJNzowNjo0MCAtCUxNVAkxOTA2IEp1biAgOQotCQkJNzowNjoyMAktCVNNVAkxOTExIE1hciAxMSAwOjAxICMgU2FpZ29uIE1UPwotCQkJNzowMAktCUlDVAkxOTEyIE1heQotCQkJODowMAktCUlDVAkxOTMxIE1heQotCQkJNzowMAktCUlDVAotCi0jIFllbWVuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvQWRlbgkzOjAwOjQ4CS0JTE1UCTE5NTAKLQkJCTM6MDAJLQlBU1QKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2F1c3RyYWxhc2lhIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvYXVzdHJhbGFzaWEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTgxYjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvYXVzdHJhbGFzaWEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM5ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKWF1c3RyYWxhc2lhCTguMTgKLSMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKLSMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCi0KLSMgVGhpcyBmaWxlIGFsc28gaW5jbHVkZXMgUGFjaWZpYyBpc2xhbmRzLgotCi0jIE5vdGVzIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQXVzdHJhbGlhCi0KLSMgUGxlYXNlIHNlZSB0aGUgbm90ZXMgYmVsb3cgZm9yIHRoZSBjb250cm92ZXJzeSBhYm91dCAiRVNUIiB2ZXJzdXMgIkFFU1QiIGV0Yy4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQXVzCTE5MTcJb25seQktCUphbgkgMQkwOjAxCTE6MDAJLQotUnVsZQlBdXMJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMAktCi1SdWxlCUF1cwkxOTQyCW9ubHkJLQlKYW4JIDEJMjowMAkxOjAwCS0KLVJ1bGUJQXVzCTE5NDIJb25seQktCU1hcgkyOQkyOjAwCTAJLQotUnVsZQlBdXMJMTk0Mglvbmx5CS0JU2VwCTI3CTI6MDAJMTowMAktCi1SdWxlCUF1cwkxOTQzCTE5NDQJLQlNYXIJbGFzdFN1bgkyOjAwCTAJLQotUnVsZQlBdXMJMTk0Mwlvbmx5CS0JT2N0CSAzCTI6MDAJMTowMAktCi0jIEdvIHdpdGggV2hpdG1hbiBhbmQgdGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgU3RhbmRhcmRzIENvbW1pc3Npb24sIHdoaWNoCi0jIHNheXMgVyBBdXN0cmFsaWEgZGlkbid0IHVzZSBEU1QgaW4gMTk0My8xOTQ0LiAgSWdub3JlIFdoaXRtYW4ncyBjbGFpbSB0aGF0Ci0jIDE5NDQvMTk0NSB3YXMganVzdCBsaWtlIDE5NDMvMTk0NC4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBOb3J0aGVybiBUZXJyaXRvcnkKLVpvbmUgQXVzdHJhbGlhL0RhcndpbgkgODo0MzoyMCAtCUxNVAkxODk1IEZlYgotCQkJIDk6MDAJLQlDU1QJMTg5OSBNYXkKLQkJCSA5OjMwCUF1cwlDU1QKLSMgV2VzdGVybiBBdXN0cmFsaWEKLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFXCTE5NzQJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVwkxOTgzCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVcJMTk4NAlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVcJMTk5MQlvbmx5CS0JTm92CTE3CTI6MDBzCTE6MDAJLQotUnVsZQlBVwkxOTkyCW9ubHkJLQlNYXIJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlBVwkyMDA2CW9ubHkJLQlEZWMJIDMJMjowMHMJMTowMAktCi1SdWxlCUFXCTIwMDcJMjAwOQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVwkyMDA3CTIwMDgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVpvbmUgQXVzdHJhbGlhL1BlcnRoCSA3OjQzOjI0IC0JTE1UCTE4OTUgRGVjCi0JCQkgODowMAlBdXMJV1NUCTE5NDMgSnVsCi0JCQkgODowMAlBVwlXU1QKLVpvbmUgQXVzdHJhbGlhL0V1Y2xhCSA4OjM1OjI4IC0JTE1UCTE4OTUgRGVjCi0JCQkgODo0NQlBdXMJQ1dTVAkxOTQzIEp1bAotCQkJIDg6NDUJQVcJQ1dTVAotCi0jIFF1ZWVuc2xhbmQKLSMKLSMgRnJvbSBBbGV4IExpdmluZ3N0b24gKDE5OTYtMTEtMDEpOgotIyBJIGhhdmUgaGVhcmQgb3IgcmVhZCBtb3JlIHRoYW4gb25jZSB0aGF0IHNvbWUgcmVzb3J0IGlzbGFuZHMgb2ZmIHRoZSBjb2FzdAotIyBvZiBRdWVlbnNsYW5kIGNob3NlIHRvIGtlZXAgb2JzZXJ2aW5nIGRheWxpZ2h0LXNhdmluZyB0aW1lIGV2ZW4gYWZ0ZXIKLSMgUXVlZW5zbGFuZCBjZWFzZWQgdG8uCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMTEtMjIpOgotIyBJQVRBIFNTSU0gKDE5OTMtMDIvMTk5NC0wOSkgc2F5IHRoYXQgdGhlIEhvbGlkYXkgSXNsYW5kcyAoSGF5bWFuLCBMaW5kZW1hbiwKLSMgSGFtaWx0b24pIG9ic2VydmVkIERTVCBmb3IgdHdvIHllYXJzIGFmdGVyIHRoZSByZXN0IG9mIFF1ZWVuc2xhbmQgc3RvcHBlZC4KLSMgSGFtaWx0b24gaXMgdGhlIGxhcmdlc3QsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgSGFtaWx0b24gaW4gVmljdG9yaWEsCi0jIHNvIHVzZSBMaW5kZW1hbi4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFRCTE5NzEJb25seQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBUQkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVEJMTk4OQkxOTkxCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFRCTE5OTAJMTk5MgktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUhvbGlkYXkJMTk5MgkxOTkzCS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUhvbGlkYXkJMTk5MwkxOTk0CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVpvbmUgQXVzdHJhbGlhL0JyaXNiYW5lCTEwOjEyOjA4IC0JTE1UCTE4OTUKLQkJCTEwOjAwCUF1cwlFU1QJMTk3MQotCQkJMTA6MDAJQVEJRVNUCi1ab25lIEF1c3RyYWxpYS9MaW5kZW1hbiAgOTo1NTo1NiAtCUxNVAkxODk1Ci0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFRCUVTVAkxOTkyIEp1bAotCQkJMTA6MDAJSG9saWRheQlFU1QKLQotIyBTb3V0aCBBdXN0cmFsaWEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUFTCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBUwkxOTg2CW9ubHkJLQlPY3QJMTkJMjowMHMJMTowMAktCi1SdWxlCUFTCTE5ODcJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBUwkxOTcyCW9ubHkJLQlGZWIJMjcJMjowMHMJMAktCi1SdWxlCUFTCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFTCTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlBUwkxOTkwCW9ubHkJLQlNYXIJU3VuPj0xOAkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5MQlvbmx5CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVMJMTk5Mglvbmx5CS0JTWFyCVN1bj49MTgJMjowMHMJMAktCi1SdWxlCUFTCTE5OTMJb25seQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFTCTE5OTQJb25seQktCU1hcglTdW4+PTE4CTI6MDBzCTAJLQotUnVsZQlBUwkxOTk1CTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFTCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVMJMjAwOAltYXgJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBdXN0cmFsaWEvQWRlbGFpZGUJOToxNDoyMCAtCUxNVAkxODk1IEZlYgotCQkJOTowMAktCUNTVAkxODk5IE1heQotCQkJOTozMAlBdXMJQ1NUCTE5NzEKLQkJCTk6MzAJQVMJQ1NUCi0KLSMgVGFzbWFuaWEKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6Ci0jIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sPgotIyBzYXlzIEtpbmcgSXNsYW5kIGRpZG4ndCBvYnNlcnZlIERTVCBmcm9tIFdXSUkgdW50aWwgbGF0ZSAxOTcxLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQVQJMTk2Nwlvbmx5CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMTk2OAlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTE5NjgJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTY5CTE5NzEJLQlNYXIJU3VuPj04CTI6MDBzCTAJLQotUnVsZQlBVAkxOTcyCW9ubHkJLQlGZWIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk4MgkxOTgzCS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTE5ODQJMTk4NgktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFUCTE5ODYJb25seQktCU9jdAlTdW4+PTE1CTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTg3CTE5OTAJLQlNYXIJU3VuPj0xNQkyOjAwcwkwCS0KLVJ1bGUJQVQJMTk4Nwlvbmx5CS0JT2N0CVN1bj49MjIJMjowMHMJMTowMAktCi1SdWxlCUFUCTE5ODgJMTk5MAktCU9jdAlsYXN0U3VuCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTkxCTE5OTkJLQlPY3QJU3VuPj0xCTI6MDBzCTE6MDAJLQotUnVsZQlBVAkxOTkxCTIwMDUJLQlNYXIJbGFzdFN1bgkyOjAwcwkwCS0KLVJ1bGUJQVQJMjAwMAlvbmx5CS0JQXVnCWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFUCTIwMDEJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVQJMjAwNglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQVQJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFUCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXVzdHJhbGlhL0hvYmFydAk5OjQ5OjE2CS0JTE1UCTE4OTUgU2VwCi0JCQkxMDowMAktCUVTVAkxOTE2IE9jdCAxIDI6MDAKLQkJCTEwOjAwCTE6MDAJRVNUCTE5MTcgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NjcKLQkJCTEwOjAwCUFUCUVTVAotWm9uZSBBdXN0cmFsaWEvQ3VycmllCTk6MzU6MjgJLQlMTVQJMTg5NSBTZXAKLQkJCTEwOjAwCS0JRVNUCTE5MTYgT2N0IDEgMjowMAotCQkJMTA6MDAJMTowMAlFU1QJMTkxNyBGZWIKLQkJCTEwOjAwCUF1cwlFU1QJMTk3MSBKdWwKLQkJCTEwOjAwCUFUCUVTVAotCi0jIFZpY3RvcmlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBVgkxOTcxCTE5ODUJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMTk3Mglvbmx5CS0JRmViCWxhc3RTdW4JMjowMHMJMAktCi1SdWxlCUFWCTE5NzMJMTk4NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTE5ODYJMTk5MAktCU1hcglTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlBVgkxOTg2CTE5ODcJLQlPY3QJU3VuPj0xNQkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMTk4OAkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTE5OTEJMTk5NAktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTE5OTUJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQVYJMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFWCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBVgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFWCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXVzdHJhbGlhL01lbGJvdXJuZSA5OjM5OjUyIC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAlBdXMJRVNUCTE5NzEKLQkJCTEwOjAwCUFWCUVTVAotCi0jIE5ldyBTb3V0aCBXYWxlcwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQU4JMTk3MQkxOTg1CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTE5NzIJb25seQktCUZlYgkyNwkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk3MwkxOTgxCS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4Mglvbmx5CS0JQXByCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4MwkxOTg1CS0JTWFyCVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJQU4JMTk4NgkxOTg5CS0JTWFyCVN1bj49MTUJMjowMHMJMAktCi1SdWxlCUFOCTE5ODYJb25seQktCU9jdAkxOQkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMTk4NwkxOTk5CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTE5OTAJMTk5NQktCU1hcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBTgkyMDAwCW9ubHkJLQlBdWcJbGFzdFN1bgkyOjAwcwkxOjAwCS0KLVJ1bGUJQU4JMjAwMQkyMDA3CS0JT2N0CWxhc3RTdW4JMjowMHMJMTowMAktCi1SdWxlCUFOCTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTIwMDcJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlBTgkyMDA4CW1heAktCUFwcglTdW4+PTEJMjowMHMJMAktCi1SdWxlCUFOCTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwcwkxOjAwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXVzdHJhbGlhL1N5ZG5leQkxMDowNDo1MiAtCUxNVAkxODk1IEZlYgotCQkJMTA6MDAJQXVzCUVTVAkxOTcxCi0JCQkxMDowMAlBTglFU1QKLVpvbmUgQXVzdHJhbGlhL0Jyb2tlbl9IaWxsIDk6MjU6NDggLQlMTVQJMTg5NSBGZWIKLQkJCTEwOjAwCS0JRVNUCTE4OTYgQXVnIDIzCi0JCQk5OjAwCS0JQ1NUCTE4OTkgTWF5Ci0JCQk5OjMwCUF1cwlDU1QJMTk3MQotCQkJOTozMAlBTglDU1QJMjAwMAotCQkJOTozMAlBUwlDU1QKLQotIyBMb3JkIEhvd2UgSXNsYW5kCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlMSAkxOTgxCTE5ODQJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJLQotUnVsZQlMSAkxOTgyCTE5ODUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTE5ODUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTE5ODYJMTk4OQktCU1hcglTdW4+PTE1CTI6MDAJMAktCi1SdWxlCUxICTE5ODYJb25seQktCU9jdAkxOQkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTg3CTE5OTkJLQlPY3QJbGFzdFN1bgkyOjAwCTA6MzAJLQotUnVsZQlMSAkxOTkwCTE5OTUJLQlNYXIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTE5OTYJMjAwNQktCU1hcglsYXN0U3VuCTI6MDAJMAktCi1SdWxlCUxICTIwMDAJb25seQktCUF1ZwlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTIwMDEJMjAwNwktCU9jdAlsYXN0U3VuCTI6MDAJMDozMAktCi1SdWxlCUxICTIwMDYJb25seQktCUFwcglTdW4+PTEJMjowMAkwCS0KLVJ1bGUJTEgJMjAwNwlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkwCS0KLVJ1bGUJTEgJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDAJMAktCi1SdWxlCUxICTIwMDgJbWF4CS0JT2N0CVN1bj49MQkyOjAwCTA6MzAJLQotWm9uZSBBdXN0cmFsaWEvTG9yZF9Ib3dlIDEwOjM2OjIwIC0JTE1UCTE4OTUgRmViCi0JCQkxMDowMAktCUVTVAkxOTgxIE1hcgotCQkJMTA6MzAJTEgJTEhTVAotCi0jIEF1c3RyYWxpYW4gbWlzY2VsbGFueQotIwotIyBBc2htb3JlIElzLCBDYXJ0aWVyCi0jIG5vIGluZGlnZW5vdXMgaW5oYWJpdGFudHM7IG9ubHkgc2Vhc29uYWwgY2FyZXRha2VycwotIyBubyB0aW1lcyBhcmUgc2V0Ci0jCi0jIENvcmFsIFNlYSBJcwotIyBubyBpbmRpZ2Vub3VzIGluaGFiaXRhbnRzOyBvbmx5IG1ldGVvcm9sb2dpc3RzCi0jIG5vIHRpbWVzIGFyZSBzZXQKLSMKLSMgTWFjcXVhcmllCi0jIHBlcm1hbmVudCBvY2N1cGF0aW9uIChzY2llbnRpZmljIHN0YXRpb24pIHNpbmNlIDE5NDg7Ci0jIHNlYWxpbmcgYW5kIHBlbmd1aW4gb2lsIHN0YXRpb24gb3BlcmF0ZWQgMTg4OC8xOTE3Ci0jIGxpa2UgQXVzdHJhbGlhL0hvYmFydAotCi0jIENocmlzdG1hcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBJbmRpYW4vQ2hyaXN0bWFzCTc6MDI6NTIgLQlMTVQJMTg5NSBGZWIKLQkJCTc6MDAJLQlDWFQJIyBDaHJpc3RtYXMgSXNsYW5kIFRpbWUKLQotIyBDb29rIElzCi0jIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyOgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ29vawkxOTc4CW9ubHkJLQlOb3YJMTIJMDowMAkwOjMwCUhTCi1SdWxlCUNvb2sJMTk3OQkxOTkxCS0JTWFyCVN1bj49MQkwOjAwCTAJLQotUnVsZQlDb29rCTE5NzkJMTk5MAktCU9jdAlsYXN0U3VuCTA6MDAJMDozMAlIUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1Jhcm90b25nYQktMTA6Mzk6MDQgLQlMTVQJMTkwMQkJIyBBdmFydWEKLQkJCS0xMDozMAktCUNLVAkxOTc4IE5vdiAxMgkjIENvb2sgSXMgVGltZQotCQkJLTEwOjAwCUNvb2sJQ0slc1QKLQotIyBDb2NvcwotIyBUaGVzZSBpc2xhbmRzIHdlcmUgcnVsZWQgYnkgdGhlIFJvc3MgZmFtaWx5IGZyb20gYWJvdXQgMTgzMCB0byAxOTc4LgotIyBXZSBkb24ndCBrbm93IHdoZW4gc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZDsgZm9yIG5vdywgd2UgZ3Vlc3MgMTkwMC4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJSW5kaWFuL0NvY29zCTY6Mjc6NDAJLQlMTVQJMTkwMAotCQkJNjozMAktCUNDVAkjIENvY29zIElzbGFuZHMgVGltZQotCi0jIEZpamkKLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMDktMTEtMTApOgotIyBBY2NvcmRpbmcgdG8gRmlqaSBCcm9hZGNhc3RpbmcgQ29ycG9yYXRpb24sICBGaWppIHBsYW5zIHRvIHJlLWludHJvZHVjZSBEU1QKLSMgZnJvbSBOb3ZlbWJlciAyOXRoIDIwMDkgIHRvIEFwcmlsIDI1dGggMjAxMC4KLSMKLSMgIkRheWxpZ2h0IHNhdmluZ3MgdG8gY29tbWVuY2UgdGhpcyBtb250aCIKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWRpb2ZpamkuY29tLmZqL2Z1bGxzdG9yeS5waHA/aWQ9MjM3MTkiPgotIyBodHRwOi8vd3d3LnJhZGlvZmlqaS5jb20uZmovZnVsbHN0b3J5LnBocD9pZD0yMzcxOQotIyA8L2E+Ci0jIG9yCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfZmlqaTAxLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2ZpamkwMS5odG1sCi0jIDwvYT4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMS0xMCk6Ci0jIFRoZSBGaWppIEdvdmVybm1lbnQgaGFzIHBvc3RlZCBzb21lIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgYXBwcm92ZWQKLSMgYW1lbmRtZW50czoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5maWppLmdvdi5mai9wdWJsaXNoL3BhZ2VfMTYxOTguc2h0bWwiPgotIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL3B1Ymxpc2gvcGFnZV8xNjE5OC5zaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMTAtMDMtMDMpOgotIyBUaGUgQ2FiaW5ldCBpbiBGaWppIGhhcyBkZWNpZGVkIHRvIGVuZCBEU1QgYWJvdXQgYSBtb250aCBlYXJseSwgb24KLSMgMjAxMC0wMy0yOCBhdCAwMzowMC4KLSMgVGhlIHBsYW4gaXMgdG8gb2JzZXJ2ZSBEU1QgYWdhaW4sIGZyb20gMjAxMC0xMC0yNCB0byBzb21ldGltZSBpbiBNYXJjaAotIyAyMDExIChsYXN0IFN1bmRheSBhIGdvb2QgZ3Vlc3M/KS4KLSMKLSMgT2ZmaWNpYWwgc291cmNlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmZpamkuZ292LmZqL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTEwOTY6MzMxMC1jYWJpbmV0LWFwcHJvdmVzLWNoYW5nZS1pbi1kYXlsaWdodC1zYXZpbmdzLWRhdGVzJmNhdGlkPTQ5OmNhYmluZXQtcmVsZWFzZXMmSXRlbWlkPTE2NiI+Ci0jIGh0dHA6Ly93d3cuZmlqaS5nb3YuZmovaW5kZXgucGhwP29wdGlvbj1jb21fY29udGVudCZ2aWV3PWFydGljbGUmaWQ9MTA5NjozMzEwLWNhYmluZXQtYXBwcm92ZXMtY2hhbmdlLWluLWRheWxpZ2h0LXNhdmluZ3MtZGF0ZXMmY2F0aWQ9NDk6Y2FiaW5ldC1yZWxlYXNlcyZJdGVtaWQ9MTY2Ci0jIDwvYT4KLSMKLSMgQSBiaXQgbW9yZSBiYWNrZ3JvdW5kIGluZm8gaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2ZpamktZHN0LWVuZHMtbWFyY2gtMjAxMC5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2ZpamktZHN0LWVuZHMtbWFyY2gtMjAxMC5odG1sCi0jIDwvYT4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRmlqaQkxOTk4CTE5OTkJLQlOb3YJU3VuPj0xCTI6MDAJMTowMAlTCi1SdWxlCUZpamkJMTk5OQkyMDAwCS0JRmViCWxhc3RTdW4JMzowMAkwCS0KLVJ1bGUJRmlqaQkyMDA5CW9ubHkJLQlOb3YJMjkJMjowMAkxOjAwCVMKLVJ1bGUJRmlqaQkyMDEwCW9ubHkJLQlNYXIJbGFzdFN1bgkzOjAwCTAJLQotUnVsZQlGaWppCTIwMTAJb25seQktCU9jdAkyNAkyOjAwCTE6MDAJUwotUnVsZQlGaWppCTIwMTEJb25seQktCU1hcglsYXN0U3VuIDM6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvRmlqaQkxMTo1Mzo0MCAtCUxNVAkxOTE1IE9jdCAyNgkjIFN1dmEKLQkJCTEyOjAwCUZpamkJRkolc1QJIyBGaWppIFRpbWUKLQotIyBGcmVuY2ggUG9seW5lc2lhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvR2FtYmllcgkgLTg6NTk6NDggLQlMTVQJMTkxMiBPY3QJIyBSaWtpdGVhCi0JCQkgLTk6MDAJLQlHQU1UCSMgR2FtYmllciBUaW1lCi1ab25lCVBhY2lmaWMvTWFycXVlc2FzIC05OjE4OjAwIC0JTE1UCTE5MTIgT2N0Ci0JCQkgLTk6MzAJLQlNQVJUCSMgTWFycXVlc2FzIFRpbWUKLVpvbmUJUGFjaWZpYy9UYWhpdGkJIC05OjU4OjE2IC0JTE1UCTE5MTIgT2N0CSMgUGFwZWV0ZQotCQkJLTEwOjAwCS0JVEFIVAkjIFRhaGl0aSBUaW1lCi0jIENsaXBwZXJ0b24gKG5lYXIgTm9ydGggQW1lcmljYSkgaXMgYWRtaW5pc3RlcmVkIGZyb20gRnJlbmNoIFBvbHluZXNpYTsKLSMgaXQgaXMgdW5pbmhhYml0ZWQuCi0KLSMgR3VhbQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL0d1YW0JLTE0OjIxOjAwIC0JTE1UCTE4NDQgRGVjIDMxCi0JCQkgOTozOTowMCAtCUxNVAkxOTAxCQkjIEFnYW5hCi0JCQkxMDowMAktCUdTVAkyMDAwIERlYyAyMwkjIEd1YW0KLQkJCTEwOjAwCS0JQ2hTVAkjIENoYW1vcnJvIFN0YW5kYXJkIFRpbWUKLQotIyBLaXJpYmF0aQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1RhcmF3YQkgMTE6MzI6MDQgLQlMTVQJMTkwMQkJIyBCYWlyaWtpCi0JCQkgMTI6MDAJLQlHSUxUCQkgIyBHaWxiZXJ0IElzIFRpbWUKLVpvbmUgUGFjaWZpYy9FbmRlcmJ1cnkJLTExOjI0OjIwIC0JTE1UCTE5MDEKLQkJCS0xMjowMAktCVBIT1QJMTk3OSBPY3QgIyBQaG9lbml4IElzIFRpbWUKLQkJCS0xMTowMAktCVBIT1QJMTk5NQotCQkJIDEzOjAwCS0JUEhPVAotWm9uZSBQYWNpZmljL0tpcml0aW1hdGkJLTEwOjI5OjIwIC0JTE1UCTE5MDEKLQkJCS0xMDo0MAktCUxJTlQJMTk3OSBPY3QgIyBMaW5lIElzIFRpbWUKLQkJCS0xMDowMAktCUxJTlQJMTk5NQotCQkJIDE0OjAwCS0JTElOVAotCi0jIE4gTWFyaWFuYSBJcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1NhaXBhbgktMTQ6MTc6MDAgLQlMTVQJMTg0NCBEZWMgMzEKLQkJCSA5OjQzOjAwIC0JTE1UCTE5MDEKLQkJCSA5OjAwCS0JTVBUCTE5NjkgT2N0ICMgTiBNYXJpYW5hIElzIFRpbWUKLQkJCTEwOjAwCS0JTVBUCTIwMDAgRGVjIDIzCi0JCQkxMDowMAktCUNoU1QJIyBDaGFtb3JybyBTdGFuZGFyZCBUaW1lCi0KLSMgTWFyc2hhbGwgSXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9NYWp1cm8JMTE6MjQ6NDggLQlMTVQJMTkwMQotCQkJMTE6MDAJLQlNSFQJMTk2OSBPY3QgIyBNYXJzaGFsbCBJc2xhbmRzIFRpbWUKLQkJCTEyOjAwCS0JTUhUCi1ab25lIFBhY2lmaWMvS3dhamFsZWluCTExOjA5OjIwIC0JTE1UCTE5MDEKLQkJCTExOjAwCS0JTUhUCTE5NjkgT2N0Ci0JCQktMTI6MDAJLQlLV0FUCTE5OTMgQXVnIDIwCSMgS3dhamFsZWluIFRpbWUKLQkJCTEyOjAwCS0JTUhUCi0KLSMgTWljcm9uZXNpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL0NodXVrCTEwOjA3OjA4IC0JTE1UCTE5MDEKLQkJCTEwOjAwCS0JQ0hVVAkJCSMgQ2h1dWsgVGltZQotWm9uZSBQYWNpZmljL1BvaG5wZWkJMTA6MzI6NTIgLQlMTVQJMTkwMQkJIyBLb2xvbmlhCi0JCQkxMTowMAktCVBPTlQJCQkjIFBvaG5wZWkgVGltZQotWm9uZSBQYWNpZmljL0tvc3JhZQkxMDo1MTo1NiAtCUxNVAkxOTAxCi0JCQkxMTowMAktCUtPU1QJMTk2OSBPY3QJIyBLb3NyYWUgVGltZQotCQkJMTI6MDAJLQlLT1NUCTE5OTkKLQkJCTExOjAwCS0JS09TVAotCi0jIE5hdXJ1Ci0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTmF1cnUJMTE6MDc6NDAgLQlMTVQJMTkyMSBKYW4gMTUJIyBVYW9iZQotCQkJMTE6MzAJLQlOUlQJMTk0MiBNYXIgMTUJIyBOYXVydSBUaW1lCi0JCQk5OjAwCS0JSlNUCTE5NDQgQXVnIDE1Ci0JCQkxMTozMAktCU5SVAkxOTc5IE1heQotCQkJMTI6MDAJLQlOUlQKLQotIyBOZXcgQ2FsZWRvbmlhCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOQwkxOTc3CTE5NzgJLQlEZWMJU3VuPj0xCTA6MDAJMTowMAlTCi1SdWxlCU5DCTE5NzgJMTk3OQktCUZlYgkyNwkwOjAwCTAJLQotUnVsZQlOQwkxOTk2CW9ubHkJLQlEZWMJIDEJMjowMHMJMTowMAlTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIGZvbGxvd2luZyB3YXMgYXQgMjowMDsgZ28gd2l0aCBJQVRBLgotUnVsZQlOQwkxOTk3CW9ubHkJLQlNYXIJIDIJMjowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm91bWVhCTExOjA1OjQ4IC0JTE1UCTE5MTIgSmFuIDEzCi0JCQkxMTowMAlOQwlOQyVzVAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOZXcgWmVhbGFuZAotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlOWgkxOTI3CW9ubHkJLQlOb3YJIDYJMjowMAkxOjAwCVMKLVJ1bGUJTloJMTkyOAlvbmx5CS0JTWFyCSA0CTI6MDAJMAlNCi1SdWxlCU5aCTE5MjgJMTkzMwktCU9jdAlTdW4+PTgJMjowMAkwOjMwCVMKLVJ1bGUJTloJMTkyOQkxOTMzCS0JTWFyCVN1bj49MTUJMjowMAkwCU0KLVJ1bGUJTloJMTkzNAkxOTQwCS0JQXByCWxhc3RTdW4JMjowMAkwCU0KLVJ1bGUJTloJMTkzNAkxOTQwCS0JU2VwCWxhc3RTdW4JMjowMAkwOjMwCVMKLVJ1bGUJTloJMTk0Nglvbmx5CS0JSmFuCSAxCTA6MDAJMAlTCi0jIFNpbmNlIDE5NTcgQ2hhdGhhbSBoYXMgYmVlbiA0NSBtaW51dGVzIGFoZWFkIG9mIE5aLCBidXQgdGhlcmUncyBubwotIyBjb252ZW5pZW50IG5vdGF0aW9uIGZvciB0aGlzIHNvIHdlIG11c3QgZHVwbGljYXRlIHRoZSBSdWxlIGxpbmVzLgotUnVsZQlOWgkxOTc0CW9ubHkJLQlOb3YJU3VuPj0xCTI6MDBzCTE6MDAJRAotUnVsZQlDaGF0aGFtCTE5NzQJb25seQktCU5vdglTdW4+PTEJMjo0NXMJMTowMAlECi1SdWxlCU5aCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6MDBzCTAJUwotUnVsZQlDaGF0aGFtCTE5NzUJb25seQktCUZlYglsYXN0U3VuCTI6NDVzCTAJUwotUnVsZQlOWgkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjAwcwkxOjAwCUQKLVJ1bGUJQ2hhdGhhbQkxOTc1CTE5ODgJLQlPY3QJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMTk3NgkxOTg5CS0JTWFyCVN1bj49MQkyOjAwcwkwCVMKLVJ1bGUJQ2hhdGhhbQkxOTc2CTE5ODkJLQlNYXIJU3VuPj0xCTI6NDVzCTAJUwotUnVsZQlOWgkxOTg5CW9ubHkJLQlPY3QJU3VuPj04CTI6MDBzCTE6MDAJRAotUnVsZQlDaGF0aGFtCTE5ODkJb25seQktCU9jdAlTdW4+PTgJMjo0NXMJMTowMAlECi1SdWxlCU5aCTE5OTAJMjAwNgktCU9jdAlTdW4+PTEJMjowMHMJMTowMAlECi1SdWxlCUNoYXRoYW0JMTk5MAkyMDA2CS0JT2N0CVN1bj49MQkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjowMHMJMAlTCi1SdWxlCUNoYXRoYW0JMTk5MAkyMDA3CS0JTWFyCVN1bj49MTUJMjo0NXMJMAlTCi1SdWxlCU5aCTIwMDcJbWF4CS0JU2VwCWxhc3RTdW4JMjowMHMJMTowMAlECi1SdWxlCUNoYXRoYW0JMjAwNwltYXgJLQlTZXAJbGFzdFN1bgkyOjQ1cwkxOjAwCUQKLVJ1bGUJTloJMjAwOAltYXgJLQlBcHIJU3VuPj0xCTI6MDBzCTAJUwotUnVsZQlDaGF0aGFtCTIwMDgJbWF4CS0JQXByCVN1bj49MQkyOjQ1cwkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9BdWNrbGFuZAkxMTozOTowNCAtCUxNVAkxODY4IE5vdiAgMgotCQkJMTE6MzAJTloJTlolc1QJMTk0NiBKYW4gIDEKLQkJCTEyOjAwCU5aCU5aJXNUCi1ab25lIFBhY2lmaWMvQ2hhdGhhbQkxMjoxMzo0OCAtCUxNVAkxOTU3IEphbiAgMQotCQkJMTI6NDUJQ2hhdGhhbQlDSEElc1QKLQotCi0jIEF1Y2tsYW5kIElzCi0jIHVuaW5oYWJpdGVkOyBNYW9yaSBhbmQgTW9yaW9yaSwgY29sb25pYWwgc2V0dGxlcnMsIHBhc3RvcmFsaXN0cywgc2VhbGVycywKLSMgYW5kIHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKLQotIyBDYW1wYmVsbCBJCi0jIG1pbm9yIHdoYWxpbmcgc3RhdGlvbnMgb3BlcmF0ZWQgMTkwOS8xOTE0Ci0jIHNjaWVudGlmaWMgc3RhdGlvbiBvcGVyYXRlZCAxOTQxLzE5OTU7Ci0jIHByZXZpb3VzbHkgd2hhbGVycywgc2VhbGVycywgcGFzdG9yYWxpc3RzLCBhbmQgc2NpZW50aWZpYyBwZXJzb25uZWwgd2ludGVyZWQKLSMgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9BdWNrbGFuZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyBOaXVlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTml1ZQktMTE6MTk6NDAgLQlMTVQJMTkwMQkJIyBBbG9maQotCQkJLTExOjIwCS0JTlVUCTE5NTEJIyBOaXVlIFRpbWUKLQkJCS0xMTozMAktCU5VVAkxOTc4IE9jdCAxCi0JCQktMTE6MDAJLQlOVVQKLQotIyBOb3Jmb2xrCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvTm9yZm9sawkxMToxMTo1MiAtCUxNVAkxOTAxCQkjIEtpbmdzdG9uCi0JCQkxMToxMgktCU5NVAkxOTUxCSMgTm9yZm9sayBNZWFuIFRpbWUKLQkJCTExOjMwCS0JTkZUCQkjIE5vcmZvbGsgVGltZQotCi0jIFBhbGF1IChCZWxhdSkKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9QYWxhdQk4OjU3OjU2IC0JTE1UCTE5MDEJCSMgS29yb3IKLQkJCTk6MDAJLQlQV1QJIyBQYWxhdSBUaW1lCi0KLSMgUGFwdWEgTmV3IEd1aW5lYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BvcnRfTW9yZXNieSA5OjQ4OjQwIC0JTE1UCTE4ODAKLQkJCTk6NDg6MzIJLQlQTU1UCTE4OTUJIyBQb3J0IE1vcmVzYnkgTWVhbiBUaW1lCi0JCQkxMDowMAktCVBHVAkJIyBQYXB1YSBOZXcgR3VpbmVhIFRpbWUKLQotIyBQaXRjYWlybgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL1BpdGNhaXJuCS04OjQwOjIwIC0JTE1UCTE5MDEJCSMgQWRhbXN0b3duCi0JCQktODozMAktCVBOVAkxOTk4IEFwciAyNyAwMDowMAotCQkJLTg6MDAJLQlQU1QJIyBQaXRjYWlybiBTdGFuZGFyZCBUaW1lCi0KLSMgQW1lcmljYW4gU2Ftb2EKLVpvbmUgUGFjaWZpYy9QYWdvX1BhZ28JIDEyOjM3OjEyIC0JTE1UCTE4NzkgSnVsICA1Ci0JCQktMTE6MjI6NDggLQlMTVQJMTkxMQotCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgkjIE49Tm9tZQotCQkJLTExOjAwCS0JQlNUCTE5ODMgTm92IDMwCSMgQj1CZXJpbmcKLQkJCS0xMTowMAktCVNTVAkJCSMgUz1TYW1vYQotCi0jIFNhbW9hCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDktMTAtMTYpOgotIyBXZSBoYXZlIGJlZW4gaW4gY29udGFjdCB3aXRoIHRoZSBnb3Zlcm5tZW50IG9mIFNhbW9hIGFnYWluLCBhbmQgcmVjZWl2ZWQKLSMgdGhlIGZvbGxvd2luZyBpbmZvOgotIwotIyAiQ2FiaW5ldCBoYXMgbm93IGFwcHJvdmVkIERheWxpZ2h0IFNhdmluZyB0byBiZSBlZmZlY3RlZCBuZXh0IHllYXIKLSMgY29tbWVuY2luZyBmcm9tIHRoZSBsYXN0IFN1bmRheSBvZiBTZXB0ZW1iZXIgMjAxMCBhbmQgY29uY2x1ZGUgZmlyc3QKLSMgU3VuZGF5IG9mIEFwcmlsIDIwMTEuIgotIwotIyBCYWNrZ3JvdW5kIGluZm86Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zYW1vYS1kc3QtcGxhbi0yMDA5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvc2Ftb2EtZHN0LXBsYW4tMjAwOS5odG1sCi0jIDwvYT4KLSMKLSMgU2Ftb2EncyBEYXlsaWdodCBTYXZpbmcgVGltZSBBY3QgMjAwOSBpcyBhdmFpbGFibGUgaGVyZSwgYnV0IGRvZXMgbm90Ci0jIGNvbnRhaW4gYW55IGRhdGVzOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxpYW1lbnQuZ292LndzL2RvY3VtZW50cy9hY3RzL0RheWxpZ2h0JTIwU2F2aW5nJTIwQWN0JTIwJTIwMjAwOSUyMCUyOEVuZ2xpc2glMjklMjAtJTIwRmluYWwlMjA3LTctMDkxLnBkZiI+Ci0jIGh0dHA6Ly93d3cucGFybGlhbWVudC5nb3Yud3MvZG9jdW1lbnRzL2FjdHMvRGF5bGlnaHQlMjBTYXZpbmclMjBBY3QlMjAlMjAyMDA5JTIwJTI4RW5nbGlzaCUyOSUyMC0lMjBGaW5hbCUyMDctNy0wOTEucGRmCi0jIDwvYT4KLQotWm9uZSBQYWNpZmljL0FwaWEJIDEyOjMzOjA0IC0JTE1UCTE4NzkgSnVsICA1Ci0JCQktMTE6MjY6NTYgLQlMTVQJMTkxMQotCQkJLTExOjMwCS0JU0FNVAkxOTUwCQkjIFNhbW9hIFRpbWUKLQkJCS0xMTowMAktCVdTVAkyMDEwIFNlcCAyNgotCQkJLTExOjAwCTE6MDAJV1NEVAkyMDExIEFwciAzCi0JCQktMTE6MDAJLQlXU1QKLQotIyBTb2xvbW9uIElzCi0jIGV4Y2x1ZGVzIEJvdWdhaW52aWxsZSwgZm9yIHdoaWNoIHNlZSBQYXB1YSBOZXcgR3VpbmVhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvR3VhZGFsY2FuYWwgMTA6Mzk6NDggLQlMTVQJMTkxMiBPY3QJIyBIb25pYXJhCi0JCQkxMTowMAktCVNCVAkjIFNvbG9tb24gSXMgVGltZQotCi0jIFRva2VsYXUgSXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJUGFjaWZpYy9GYWthb2ZvCS0xMToyNDo1NiAtCUxNVAkxOTAxCi0JCQktMTA6MDAJLQlUS1QJIyBUb2tlbGF1IFRpbWUKLQotIyBUb25nYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVG9uZ2EJMTk5OQlvbmx5CS0JT2N0CSA3CTI6MDBzCTE6MDAJUwotUnVsZQlUb25nYQkyMDAwCW9ubHkJLQlNYXIJMTkJMjowMHMJMAktCi1SdWxlCVRvbmdhCTIwMDAJMjAwMQktCU5vdglTdW4+PTEJMjowMAkxOjAwCVMKLVJ1bGUJVG9uZ2EJMjAwMQkyMDAyCS0JSmFuCWxhc3RTdW4JMjowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgUGFjaWZpYy9Ub25nYXRhcHUJMTI6MTk6MjAgLQlMTVQJMTkwMQotCQkJMTI6MjAJLQlUT1QJMTk0MSAjIFRvbmdhIFRpbWUKLQkJCTEzOjAwCS0JVE9UCTE5OTkKLQkJCTEzOjAwCVRvbmdhCVRPJXNUCi0KLSMgVHV2YWx1Ci0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIFBhY2lmaWMvRnVuYWZ1dGkJMTE6NTY6NTIgLQlMTVQJMTkwMQotCQkJMTI6MDAJLQlUVlQJIyBUdXZhbHUgVGltZQotCi0KLSMgVVMgbWlub3Igb3V0bHlpbmcgaXNsYW5kcwotCi0jIEhvd2xhbmQsIEJha2VyCi0jIEhvd2xhbmQgd2FzIG1pbmVkIGZvciBndWFubyBieSBBbWVyaWNhbiBjb21wYW5pZXMgMTg1Ny0xODc4IGFuZCBCcml0aXNoCi0jIDE4ODYtMTg5MTsgQmFrZXIgd2FzIHNpbWlsYXIgYnV0IGV4YWN0IGRhdGVzIGFyZSBub3Qga25vd24uCi0jIEluaGFiaXRlZCBieSBjaXZpbGlhbnMgMTkzNS0xOTQyOyBVLlMuIG1pbGl0YXJ5IGJhc2VzIDE5NDMtMTk0NDsKLSMgdW5pbmhhYml0ZWQgdGhlcmVhZnRlci4KLSMgSG93bGFuZCBvYnNlcnZlZCBIYXdhaWkgU3RhbmRhcmQgVGltZSAoVVRDLTEwOjMwKSBpbiAxOTM3OwotIyBzZWUgcGFnZSAyMDYgb2YgRWxnZW4gTS4gTG9uZyBhbmQgTWFyaWUgSy4gTG9uZywKLSMgQW1lbGlhIEVhcmhhcnQ6IHRoZSBNeXN0ZXJ5IFNvbHZlZCwgU2ltb24gJiBTY2h1c3RlciAoMjAwMCkuCi0jIFNvIG1vc3QgbGlrZWx5IEhvd2xhbmQgYW5kIEJha2VyIG9ic2VydmVkIEhhd2FpaSBUaW1lIGZyb20gMTkzNQotIyB1bnRpbCB0aGV5IHdlcmUgYWJhbmRvbmVkIGFmdGVyIHRoZSB3YXIuCi0KLSMgSmFydmlzCi0jIE1pbmVkIGZvciBndWFubyBieSBBbWVyaWNhbiBjb21wYW5pZXMgMTg1Ny0xODc5IGFuZCBCcml0aXNoIDE4ODM/LTE4OTE/LgotIyBJbmhhYml0ZWQgYnkgY2l2aWxpYW5zIDE5MzUtMTk0MjsgSUdZIHNjaWVudGlmaWMgYmFzZSAxOTU3LTE5NTg7Ci0jIHVuaW5oYWJpdGVkIHRoZXJlYWZ0ZXIuCi0jIG5vIGluZm9ybWF0aW9uOyB3YXMgcHJvYmFibHkgbGlrZSBQYWNpZmljL0tpcml0aW1hdGkKLQotIyBKb2huc3RvbgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBQYWNpZmljL0pvaG5zdG9uCS0xMDowMAktCUhTVAotCi0jIEtpbmdtYW4KLSMgdW5pbmhhYml0ZWQKLQotIyBNaWR3YXkKLSMKLSMgRnJvbSBNYXJrIEJyYWRlciAoMjAwNS0wMS0yMyk6Ci0jIFtGYWxsYWNpZXMgYW5kIEZhbnRhc2llcyBvZiBBaXIgVHJhbnNwb3J0IEhpc3RvcnksIGJ5IFIuRS5HLiBEYXZpZXMsCi0jIHB1Ymxpc2hlZCAxOTk0IGJ5IFBhbGFkd3IgUHJlc3MsIE1jTGVhbiwgVkEsIFVTQTsgSVNCTiAwLTk2MjY0ODMtNS0zXQotIyByZXByb2R1Y2VkIGEgUGFuIEFtZXJpY2FuIEFpcndheXMgdGltZWFibGVzIGZyb20gMTkzNiwgZm9yIHRoZWlyIHdlZWtseQotIyAiT3JpZW50IEV4cHJlc3MiIGZsaWdodHMgYmV0d2VlbiBTYW4gRnJhbmNpc2NvIGFuZCBNYW5pbGEsIGFuZCBjb25uZWN0aW5nCi0jIGZsaWdodHMgdG8gQ2hpY2FnbyBhbmQgdGhlIFVTIEVhc3QgQ29hc3QuICBBcyBpdCB1c2VzIHNvbWUgdGltZSB6b25lCi0jIGRlc2lnbmF0aW9ucyB0aGF0IEkndmUgbmV2ZXIgc2VlbiBiZWZvcmU6Li4uLgotIyBGcmkuIDY6MzBBIEx2LiBIT05PTE9MVSAoUGVhcmwgSGFyYm9yKSwgSC5JLiAgIEguTC5ULiBBci4gNTozMFAgU3VuLgotIyAgIiAgIDM6MDBQIEFyLiBNSURXQVkgSVNMQU5EIC4gLiAuIC4gLiAuIC4gLiAuIE0uTC5ULiBMdi4gNjowMEEgICIKLSMKLVpvbmUgUGFjaWZpYy9NaWR3YXkJLTExOjQ5OjI4IC0JTE1UCTE5MDEKLQkJCS0xMTowMAktCU5TVAkxOTU2IEp1biAgMwotCQkJLTExOjAwCTE6MDAJTkRUCTE5NTYgU2VwICAyCi0JCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIJIyBOPU5vbWUKLQkJCS0xMTowMAktCUJTVAkxOTgzIE5vdiAzMAkjIEI9QmVyaW5nCi0JCQktMTE6MDAJLQlTU1QJCQkjIFM9U2Ftb2EKLQotIyBQYWxteXJhCi0jIHVuaW5oYWJpdGVkIHNpbmNlIFdvcmxkIFdhciBJSTsgd2FzIHByb2JhYmx5IGxpa2UgUGFjaWZpYy9LaXJpdGltYXRpCi0KLSMgV2FrZQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlQYWNpZmljL1dha2UJMTE6MDY6MjggLQlMTVQJMTkwMQotCQkJMTI6MDAJLQlXQUtUCSMgV2FrZSBUaW1lCi0KLQotIyBWYW51YXR1Ci0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlWYW51YXR1CTE5ODMJb25seQktCVNlcAkyNQkwOjAwCTE6MDAJUwotUnVsZQlWYW51YXR1CTE5ODQJMTk5MQktCU1hcglTdW4+PTIzCTA6MDAJMAktCi1SdWxlCVZhbnVhdHUJMTk4NAlvbmx5CS0JT2N0CTIzCTA6MDAJMTowMAlTCi1SdWxlCVZhbnVhdHUJMTk4NQkxOTkxCS0JU2VwCVN1bj49MjMJMDowMAkxOjAwCVMKLVJ1bGUJVmFudWF0dQkxOTkyCTE5OTMJLQlKYW4JU3VuPj0yMwkwOjAwCTAJLQotUnVsZQlWYW51YXR1CTE5OTIJb25seQktCU9jdAlTdW4+PTIzCTA6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvRWZhdGUJMTE6MTM6MTYgLQlMTVQJMTkxMiBKYW4gMTMJCSMgVmlsYQotCQkJMTE6MDAJVmFudWF0dQlWVSVzVAkjIFZhbnVhdHUgVGltZQotCi0jIFdhbGxpcyBhbmQgRnV0dW5hCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCVBhY2lmaWMvV2FsbGlzCTEyOjE1OjIwIC0JTE1UCTE5MDEKLQkJCTEyOjAwCS0JV0ZUCSMgV2FsbGlzICYgRnV0dW5hIFRpbWUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5PVEVTCi0KLSMgVGhpcyBkYXRhIGlzIGJ5IG5vIG1lYW5zIGF1dGhvcml0YXRpdmU7IGlmIHlvdSB0aGluayB5b3Uga25vdyBiZXR0ZXIsCi0jIGdvIGFoZWFkIGFuZCBlZGl0IHRoZSBmaWxlIChhbmQgcGxlYXNlIHNlbmQgYW55IGNoYW5nZXMgdG8KLSMgdHpAZWxzaWUubmNpLm5paC5nb3YgZm9yIGdlbmVyYWwgdXNlIGluIHRoZSBmdXR1cmUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKLSMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAotIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgotIwotIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCi0jIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydAotIyBBc3NvY2lhdGlvbidzIFN0YW5kYXJkIFNjaGVkdWxlcyBJbmZvcm1hdGlvbiBNYW51YWwgKElBVEEgU1NJTSksCi0jIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCi0jIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgotIwotIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKLSMgZW50cmllcyB0aHJvdWdoIDE5OTAsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgotIwotIyBBbm90aGVyIHNvdXJjZSBvY2Nhc2lvbmFsbHkgdXNlZCBpcyBFZHdhcmQgVy4gV2hpdG1hbiwgV29ybGQgVGltZSBEaWZmZXJlbmNlcywKLSMgV2hpdG1hbiBQdWJsaXNoaW5nIENvLCAyIE5pYWdhcmEgQXYsIEVhbGluZywgTG9uZG9uICh1bmRhdGVkKSwgd2hpY2gKLSMgSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgotIwotIyBBIHJlbGlhYmxlIGFuZCBlbnRlcnRhaW5pbmcgc291cmNlIGFib3V0IHRpbWUgem9uZXMgaXMKLSMgRGVyZWsgSG93c2UsIEdyZWVud2ljaCB0aW1lIGFuZCBsb25naXR1ZGUsIFBoaWxpcCBXaWxzb24gUHVibGlzaGVycyAoMTk5NykuCi0jCi0jIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkIGAqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwotIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgotIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKLSMJCXN0ZCBkc3QKLSMJCUxNVAlMb2NhbCBNZWFuIFRpbWUKLSMJICA4OjAwCVdTVCBXU1QJV2VzdGVybiBBdXN0cmFsaWEKLSMJICA4OjQ1CUNXU1QgQ1dTVCBDZW50cmFsIFdlc3Rlcm4gQXVzdHJhbGlhKgotIwkgIDk6MDAJSlNUCUphcGFuCi0jCSAgOTozMAlDU1QgQ1NUCUNlbnRyYWwgQXVzdHJhbGlhCi0jCSAxMDowMAlFU1QgRVNUCUVhc3Rlcm4gQXVzdHJhbGlhCi0jCSAxMDowMAlDaFNUCUNoYW1vcnJvCi0jCSAxMDozMAlMSFNUIExIU1QgTG9yZCBIb3dlKgotIwkgMTE6MzAJTlpNVCBOWlNUIE5ldyBaZWFsYW5kIHRocm91Z2ggMTk0NQotIwkgMTI6MDAJTlpTVCBOWkRUIE5ldyBaZWFsYW5kIDE5NDYtcHJlc2VudAotIwkgMTI6NDUJQ0hBU1QgQ0hBRFQgQ2hhdGhhbSoKLSMJLTExOjAwCVNTVAlTYW1vYQotIwktMTA6MDAJSFNUCUhhd2FpaQotIwktIDg6MDAJUFNUCVBpdGNhaXJuKgotIwotIyBTZWUgdGhlIGBub3J0aGFtZXJpY2EnIGZpbGUgZm9yIEhhd2FpaS4KLSMgU2VlIHRoZSBgc291dGhhbWVyaWNhJyBmaWxlIGZvciBFYXN0ZXIgSSBhbmQgdGhlIEdhbGFwYWdvcyBJcy4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEF1c3RyYWxpYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMTItMDgpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZHN0X3RpbWVzLnNodG1sIj4KLSMgSW1wbGVtZW50YXRpb24gRGF0ZXMgb2YgRGF5bGlnaHQgU2F2aW5nIFRpbWUgd2l0aGluIEF1c3RyYWxpYQotIyA8L2E+IHN1bW1hcml6ZXMgZGF5bGlnaHQgc2F2aW5nIGlzc3VlcyBpbiBBdXN0cmFsaWEuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDUtMTItMTIpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmxhd2xpbmsubnN3Lmdvdi5hdS9sYXdsaW5rL0NvcnBvcmF0ZS9sbF9hZ2RpbmZvLm5zZi9wYWdlcy9jb21tdW5pdHlfcmVsYXRpb25zX2RheWxpZ2h0X3NhdmluZyI+Ci0jIExhd2xpbmsgTlNXOkRheWxpZ2h0IFNhdmluZyBpbiBOZXcgU291dGggV2FsZXMKLSMgPC9hPiBjb3ZlcnMgTmV3IFNvdXRoIFdhbGVzIGluIHBhcnRpY3VsYXIuCi0KLSMgRnJvbSBKb2huIE1hY2tpbiAoMTk5MS0wMy0wNik6Ci0jIFdlIGluIEF1c3RyYWxpYSBoYXZlIF9uZXZlcl8gcmVmZXJyZWQgdG8gRFNUIGFzIGBkYXlsaWdodCcgdGltZS4KLSMgSXQgaXMgY2FsbGVkIGBzdW1tZXInIHRpbWUuICBOb3cgYnkgYSBoYXBweSBjb2luY2lkZW5jZSwgYHN1bW1lcicKLSMgYW5kIGBzdGFuZGFyZCcgaGFwcGVuIHRvIHN0YXJ0IHdpdGggdGhlIHNhbWUgbGV0dGVyOyBoZW5jZSwgdGhlCi0jIGFiYnJldmlhdGlvbiBkb2VzIF9ub3RfIGNoYW5nZS4uLgotIyBUaGUgbGVnaXNsYXRpb24gZG9lcyBub3QgYWN0dWFsbHkgZGVmaW5lIGFiYnJldmlhdGlvbnMsIGF0IGxlYXN0Ci0jIGluIHRoaXMgU3RhdGUsIGJ1dCB0aGUgYWJicmV2aWF0aW9uIGlzIGp1c3QgY29tbW9ubHkgdGFrZW4gdG8gYmUgdGhlCi0jIGluaXRpYWxzIG9mIHRoZSBwaHJhc2UsIGFuZCB0aGUgbGVnaXNsYXRpb24gaGVyZSB1bmlmb3JtbHkgdXNlcwotIyB0aGUgcGhyYXNlIGBzdW1tZXIgdGltZScgYW5kIGRvZXMgbm90IHVzZSB0aGUgcGhyYXNlIGBkYXlsaWdodAotIyB0aW1lJy4KLSMgQW5ub3VuY2VycyBvbiB0aGUgQ29tbW9ud2VhbHRoIHJhZGlvIG5ldHdvcmssIHRoZSBBQkMgKGZvciBBdXN0cmFsaWFuCi0jIEJyb2FkY2FzdGluZyBDb21taXNzaW9uKSwgdXNlIHRoZSBwaHJhc2VzIGBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUnCi0jIG9yIGBFYXN0ZXJuIFN1bW1lciBUaW1lJy4gIChOb3RlLCB0aG91Z2gsIHRoYXQgYXMgSSBzYXkgaW4gdGhlCi0jIGN1cnJlbnQgYXVzdHJhbGFzaWEgZmlsZSwgdGhlcmUgaXMgcmVhbGx5IG5vIHN1Y2ggdGhpbmcuKSAgQW5ub3VuY2VycwotIyBvbiBpdHMgb3ZlcnNlYXMgc2VydmljZSwgUmFkaW8gQXVzdHJhbGlhLCB1c2UgdGhlIHNhbWUgcGhyYXNlcwotIyBwcmVmaXhlZCBieSB0aGUgd29yZCBgQXVzdHJhbGlhbicgd2hlbiByZWZlcnJpbmcgdG8gbG9jYWwgdGltZXM7Ci0jIHRpbWUgYW5ub3VuY2VtZW50cyBvbiB0aGF0IHNlcnZpY2UsIG5hdHVyYWxseSBlbm91Z2gsIGFyZSBtYWRlIGluIFVUQy4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5Mi0wMy0wOCk6Ci0jIEdpdmVuIHRoZSBhYm92ZSwgd2hhdCdzIGNob3NlbiBmb3IgeWVhci1yb3VuZCB1c2UgaXM6Ci0jCUNTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA5OjMwCi0jCVdTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiA4OjAwCi0jCUVTVAlmb3IgYW55IHBsYWNlIG9wZXJhdGluZyBhdCBhIEdNVE9GRiBvZiAxMDowMAotCi0jIEZyb20gQ2h1Y2sgU29wZXIgKDIwMDYtMDYtMDEpOgotIyBJIHJlY2VudGx5IGZvdW5kIHRoaXMgQXVzdHJhbGlhbiBnb3Zlcm5tZW50IHdlYiBwYWdlIG9uIHRpbWUgem9uZXM6Ci0jIDxodHRwOi8vd3d3LmF1c3RyYWxpYS5nb3YuYXUvYWJvdXQtYXVzdHJhbGlhLTEzdGltZT4KLSMgQW5kIHRoaXMgZ292ZXJubWVudCB3ZWIgcGFnZSBsaXN0cyB0aW1lIHpvbmUgbmFtZXMgYW5kIGFiYnJldmlhdGlvbnM6Ci0jIDxodHRwOi8vd3d3LmJvbS5nb3YuYXUvY2xpbWF0ZS9hdmVyYWdlcy90YWJsZXMvZGF5c2F2dG0uc2h0bWw+Ci0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNC0wNSksIHN1bW1hcml6aW5nIGEgbG9uZyBkaXNjdXNzaW9uIGFib3V0ICJFU1QiCi0jIHZlcnN1cyAiQUVTVCIgZXRjLjoKLSMKLSMgSSBzZWUgdGhlIGZvbGxvd2luZyBwb2ludHMgb2YgZGlzcHV0ZToKLSMKLSMgKiBIb3cgaW1wb3J0YW50IGFyZSB1bmlxdWUgdGltZSB6b25lIGFiYnJldmlhdGlvbnM/Ci0jCi0jICAgSGVyZSBJIHRlbmQgdG8gYWdyZWUgd2l0aCB0aGUgcG9pbnQgKG1vc3QgcmVjZW50bHkgbWFkZSBieSBDaHJpcwotIyAgIE5ld21hbikgdGhhdCB1bmlxdWUgYWJicmV2aWF0aW9ucyBzaG91bGQgbm90IGJlIGVzc2VudGlhbCBmb3IgcHJvcGVyCi0jICAgb3BlcmF0aW9uIG9mIHNvZnR3YXJlLiAgV2UgaGF2ZSBvdGhlciBpbnN0YW5jZXMgb2YgYW1iaWd1aXR5Ci0jICAgKGUuZy4gIklTVCIgZGVub3RpbmcgYm90aCAiSXNyYWVsIFN0YW5kYXJkIFRpbWUiIGFuZCAiSW5kaWFuCi0jICAgU3RhbmRhcmQgVGltZSIpLCBhbmQgdGhleSBhcmUgbm90IGxpa2VseSB0byBnbyBhd2F5IGFueSB0aW1lIHNvb24uCi0jICAgSW4gdGhlIG9sZCBkYXlzLCBzb21lIHNvZnR3YXJlIG1pc3Rha2VubHkgcmVsaWVkIG9uIHVuaXF1ZQotIyAgIGFiYnJldmlhdGlvbnMsIGJ1dCB0aGlzIGlzIGJlY29taW5nIGxlc3MgdHJ1ZSB3aXRoIHRpbWUsIGFuZCBJIGRvbid0Ci0jICAgdGhpbmsgaXQncyB0aGF0IGltcG9ydGFudCB0byBjYXRlciB0byBzdWNoIHNvZnR3YXJlIHRoZXNlIGRheXMuCi0jCi0jICAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGlzIGFub3RoZXIgbW90aXZhdGlvbiBmb3IgdW5hbWJpZ3VvdXMKLSMgICBhYmJyZXZpYXRpb25zOiBpdCBjdXRzIGRvd24gb24gaHVtYW4gY29uZnVzaW9uLiAgVGhpcyBpcwotIyAgIHBhcnRpY3VsYXJseSB0cnVlIGZvciBBdXN0cmFsaWEsIHdoZXJlICJFU1QiIGNhbiBtZWFuIG9uZSB0aGluZyBmb3IKLSMgICB0aW1lIFQgYW5kIGEgZGlmZmVyZW50IHRoaW5nIGZvciB0aW1lIFQgcGx1cyAxIHNlY29uZC4KLSMKLSMgKiBEb2VzIHRoZSByZWxldmFudCBsZWdpc2xhdGlvbiBpbmRpY2F0ZSB3aGljaCBhYmJyZXZpYXRpb25zIHNob3VsZCBiZSB1c2VkPwotIwotIyAgIEhlcmUgSSB0ZW5kIHRvIHRoaW5rIHRoYXQgdGhpbmdzIGFyZSBhIG1lc3MsIGp1c3QgYXMgdGhleSBhcmUgaW4KLSMgICBtYW55IG90aGVyIGNvdW50cmllcy4gIFdlIEFtZXJpY2FucyBhcmUgY3VycmVudGx5IGRpc2FncmVlaW5nIGFib3V0Ci0jICAgd2hpY2ggYWJicmV2aWF0aW9uIHRvIHVzZSBmb3IgdGhlIG5ld2x5IGxlZ2lzbGF0ZWQgQ2hhbW9ycm8gU3RhbmRhcmQKLSMgICBUaW1lLCBmb3IgZXhhbXBsZS4KLSMKLSMgICBQZXJzb25hbGx5LCBJIHdvdWxkIHByZWZlciB0byB1c2UgY29tbW9uIHByYWN0aWNlOyBJIHdvdWxkIGxpa2UgdG8KLSMgICByZWZlciB0byBsZWdpc2xhdGlvbiBvbmx5IGZvciBleGFtcGxlcyBvZiBjb21tb24gcHJhY3RpY2UsIG9yIGFzIGEKLSMgICB0aWVicmVha2VyLgotIwotIyAqIERvIEF1c3RyYWxpYW5zIG1vcmUgb2Z0ZW4gdXNlICJFYXN0ZXJuIERheWxpZ2h0IFRpbWUiIG9yICJFYXN0ZXJuCi0jICAgU3VtbWVyIFRpbWUiPyAgRG8gdGhleSB0eXBpY2FsbHkgcHJlZml4IHRoZSB0aW1lIHpvbmUgbmFtZXMgd2l0aAotIyAgIHRoZSB3b3JkICJBdXN0cmFsaWFuIj8KLSMKLSMgICBNeSBvd24gaW1wcmVzc2lvbiBpcyB0aGF0IGJvdGggIkRheWxpZ2h0IFRpbWUiIGFuZCAiU3VtbWVyIFRpbWUiIGFyZQotIyAgIGNvbW1vbiBhbmQgYXJlIHdpZGVseSB1bmRlcnN0b29kLCBidXQgdGhhdCAiU3VtbWVyIFRpbWUiIGlzIG1vcmUKLSMgICBwb3B1bGFyOyBhbmQgdGhhdCB0aGUgbGVhZGluZyAiQSIgaXMgYWxzbyBjb21tb24gYnV0IGlzIG9taXR0ZWQgbW9yZQotIyAgIG9mdGVuIHRoYW4gbm90LiAgSSBqdXN0IHVzZWQgQWx0YVZpc3RhIGFkdmFuY2VkIHNlYXJjaCBhbmQgZ290IHRoZQotIyAgIGZvbGxvd2luZyBjb3VudCBvZiBwYWdlIGhpdHM6Ci0jCi0jICAgICAxLDEwMyAiRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICA5NzEgIkF1c3RyYWxpYW4gRWFzdGVybiBTdW1tZXIgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICA2MTMgIkVhc3Rlcm4gRGF5bGlnaHQgVGltZSIgQU5EIGRvbWFpbjphdQotIyAgICAgICAxMjcgIkF1c3RyYWxpYW4gRWFzdGVybiBEYXlsaWdodCBUaW1lIiBBTkQgZG9tYWluOmF1Ci0jCi0jICAgSGVyZSAiU3VtbWVyIiBzZWVtcyBxdWl0ZSBhIGJpdCBtb3JlIHBvcHVsYXIgdGhhbiAiRGF5bGlnaHQiLAotIyAgIHBhcnRpY3VsYXJseSB3aGVuIHdlIGtub3cgdGhlIHRpbWUgem9uZSBpcyBBdXN0cmFsaWFuIGFuZCBub3QgVVMsCi0jICAgc2F5LiAgVGhlICJBdXN0cmFsaWFuIiBwcmVmaXggc2VlbXMgdG8gYmUgcG9wdWxhciBmb3IgRWFzdGVybiBTdW1tZXIKLSMgICBUaW1lLCBidXQgdW5wb3B1bGFyIGZvciBFYXN0ZXJuIERheWxpZ2h0IFRpbWUuCi0jCi0jICAgRm9yIGFiYnJldmlhdGlvbnMsIHRvb2xzIGxpa2UgQWx0YVZpc3RhIGFyZSBsZXNzIHVzZWZ1bCBiZWNhdXNlIG9mCi0jICAgYW1iaWd1aXR5LiAgTWFueSBoaXRzIGFyZSBub3QgcmVhbGx5IHRpbWUgem9uZXMsIHVuZm9ydHVuYXRlbHksIGFuZAotIyAgIG1hbnkgaGl0cyBkZW5vdGUgVVMgdGltZSB6b25lcyBhbmQgbm90IEF1c3RyYWxpYW4gb25lcy4gIEJ1dCBoZXJlCi0jICAgYXJlIHRoZSBoaXQgY291bnRzIGFueXdheToKLSMKLSMgICAgIDE2MSwzMDQgIkVTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgIDI1LDE1NiAiRURUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgMTgsMjYzICJBRVNUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgMTAsNDE2ICJBRURUIiBhbmQgZG9tYWluOmF1Ci0jCi0jICAgICAgMTQsNTM4ICJDU1QiIGFuZCBkb21haW46YXUKLSMgICAgICAgNSw3MjggIkNEVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICAgIDE3NiAiQUNTVCIgYW5kIGRvbWFpbjphdQotIyAgICAgICAgICAyOSAiQUNEVCIgYW5kIGRvbWFpbjphdQotIwotIyAgICAgICA3LDUzOSAiV1NUIiBhbmQgZG9tYWluOmF1Ci0jICAgICAgICAgIDY4ICJBV1NUIiBhbmQgZG9tYWluOmF1Ci0jCi0jICAgVGhpcyBkYXRhIHN1Z2dlc3QgdGhhdCBBdXN0cmFsaWFucyB0ZW5kIHRvIG9taXQgdGhlICJBIiBwcmVmaXggaW4KLSMgICBwcmFjdGljZS4gIFRoZSBzaXR1YXRpb24gZm9yICJTVCIgdmVyc3VzICJEVCIgaXMgbGVzcyBjbGVhciwgZ2l2ZW4KLSMgICB0aGUgYW1iaWd1aXRpZXMgaW52b2x2ZWQuCi0jCi0jICogSG93IGRvIEF1c3RyYWxpYW5zIGZlZWwgYWJvdXQgdGhlIGFiYnJldmlhdGlvbnMgaW4gdGhlIHR6IGRhdGFiYXNlPwotIwotIyAgIElmIHlvdSBqdXN0IGNvdW50IEF1c3RyYWxpYW5zIG9uIHRoaXMgbGlzdCwgSSBjb3VudCAyIGluIGZhdm9yIGFuZCAzCi0jICAgYWdhaW5zdC4gIE9uZSBvZiB0aGUgImFnYWluc3QiIHZvdGVzIChEYXZpZCBLZWVnZWwpIGNvdW5zZWxlZCBkZWxheSwKLSMgICBzYXlpbmcgdGhhdCBib3RoIEFFU1QvQUVEVCBhbmQgRVNUL0VTVCBhcmUgd2lkZWx5IHVzZWQgYW5kCi0jICAgdW5kZXJzdG9vZCBpbiBBdXN0cmFsaWEuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NS0xMi0xOSk6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciByZXBvcnQgMjowMCBmb3IgYWxsIGF1dHVtbiBjaGFuZ2VzIGluIEF1c3RyYWxpYSBhbmQgTlouCi0jIE1hcmsgUHJpb3Igd3JpdGVzIHRoYXQgaGlzIG5ld3NwYXBlcgotIyByZXBvcnRzIHRoYXQgTlNXJ3MgZmFsbCAxOTk1IGNoYW5nZSB3aWxsIG9jY3VyIGF0IDI6MDAsCi0jIGJ1dCBSb2JlcnQgRWx6IHNheXMgaXQncyBiZWVuIDM6MDAgaW4gVmljdG9yaWEgc2luY2UgMTk3MAotIyBhbmQgcGVyaGFwcyB0aGUgbmV3c3BhcGVyJ3MgYDI6MDAnIGlzIHJlZmVycmluZyB0byBzdGFuZGFyZCB0aW1lLgotIyBGb3Igbm93IHdlJ2xsIGNvbnRpbnVlIHRvIGFzc3VtZSAyOjAwcyBmb3IgY2hhbmdlcyBzaW5jZSAxOTYwLgotCi0jIEZyb20gRXJpYyBVbGV2aWsgKDE5OTgtMDEtMDUpOgotIwotIyBIZXJlIGFyZSBzb21lIFVSTHMgdG8gQXVzdHJhbGlhbiB0aW1lIGxlZ2lzbGF0aW9uLiBUaGVzZSBVUkxzIGFyZSBzdGFibGUsCi0jIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEgZmlsZS4gVGhlcmUgYXJlIHByb2JhYmx5IG1vcmUKLSMgcmVsZXZhbnQgZW50cmllcyBpbiB0aGlzIGRhdGFiYXNlLgotIwotIyBOU1cgKGluY2x1ZGluZyBMSEkgYW5kIEJyb2tlbiBIaWxsKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5hdXN0bGlpLmVkdS5hdS9hdS9sZWdpcy9uc3cvY29uc29sX2FjdC9zdGExOTg3MTM3L2luZGV4Lmh0bWwiPgotIyBTdGFuZGFyZCBUaW1lIEFjdCAxOTg3ICh1cGRhdGVkIDE5OTUtMDQtMDQpCi0jIDwvYT4KLSMgQUNUCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXVzdGxpaS5lZHUuYXUvYXUvbGVnaXMvYWN0L2NvbnNvbF9hY3Qvc3Rhc3RhMTk3MjI3OS9pbmRleC5odG1sIj4KLSMgU3RhbmRhcmQgVGltZSBhbmQgU3VtbWVyIFRpbWUgQWN0IDE5NzIKLSMgPC9hPgotIyBTQQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmF1c3RsaWkuZWR1LmF1L2F1L2xlZ2lzL3NhL2NvbnNvbF9hY3Qvc3RhMTg5ODEzNy9pbmRleC5odG1sIj4KLSMgU3RhbmRhcmQgVGltZSBBY3QsIDE4OTgKLSMgPC9hPgotCi0jIEZyb20gRGF2aWQgR3Jvc3ogKDIwMDUtMDYtMTMpOgotIyBJdCB3YXMgYW5ub3VuY2VkIGxhc3Qgd2VlayB0aGF0IERheWxpZ2h0IFNhdmluZyB3b3VsZCBiZSBleHRlbmRlZCBieQotIyBvbmUgd2VlayBuZXh0IHllYXIgdG8gYWxsb3cgZm9yIHRoZSAyMDA2IENvbW1vbndlYWx0aCBHYW1lcy4KLSMgRGF5bGlnaHQgU2F2aW5nIGlzIG5vdyB0byBlbmQgZm9yIG5leHQgeWVhciBvbmx5IG9uIHRoZSBmaXJzdCBTdW5kYXkKLSMgaW4gQXByaWwgaW5zdGVhZCBvZiB0aGUgbGFzdCBTdW5kYXkgaW4gTWFyY2guCi0jCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDUtMDYtMTQpOgotIyBJIGRpZCBzb21lIEdvb2dsaW5nIGFuZCBmb3VuZCB0aGF0IGFsbCBvZiB0aG9zZSBzdGF0ZXMgKGFuZCB0ZXJyaXRvcnkpIHBsYW4KLSMgdG8gZXh0ZW5kIERTVCB0b2dldGhlciBpbiAyMDA2LgotIyBBQ1Q6IGh0dHA6Ly93d3cuY21kLmFjdC5nb3YuYXUvbWVkaWFyZWxlYXNlcy9maWxlcmVhZC5jZm0/ZmlsZT04Ni50eHQKLSMgTmV3IFNvdXRoIFdhbGVzOiBodHRwOi8vd3d3LnRoZWNvdXJpZXJtYWlsLm5ld3MuY29tLmF1L2NvbW1vbi9zdG9yeV9wYWdlLzAsNTkzNiwxNTUzODg2OSUyNTVFMTcwMiwwMC5odG1sCi0jIFNvdXRoIEF1c3RyYWxpYTogaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTU1MDMxLTEyNDYsMDAuaHRtbAotIyBUYXNtYW5pYTogaHR0cDovL3d3dy5tZWRpYS50YXMuZ292LmF1L3JlbGVhc2UucGhwP2lkPTE0NzcyCi0jIFZpY3RvcmlhOiBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55dGhpbmcgc2VwYXJhdGUsIGJ1dCB0aGUgb3RoZXIgYXJ0aWNsZXMKLSMgYWxsdWRlIHRvIGl0LgotIyBCdXQgbm90IFF1ZWVuc2xhbmQKLSMgaHR0cDovL3d3dy5uZXdzLmNvbS5hdS9zdG9yeS8wLDEwMTE3LDE1NTY0MDMwLTEyNDgsMDAuaHRtbC4KLQotIyBOb3J0aGVybiBUZXJyaXRvcnkKLQotIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgotIyAjIFRoZSBOT1JUSEVSTiBURVJSSVRPUlkuLiAgWyBDb3VydGVzeSBOLlQuIERlcHQgb2YgdGhlIENoaWVmIE1pbmlzdGVyIF0KLSMgIwkJCQkJWyBOb3YgMTk5MCBdCi0jICMJTi5ULiBoYXZlIG5ldmVyIHV0aWxpc2VkIGFueSBEU1QgZHVlIHRvIHN1Yi10cm9waWNhbC90cm9waWNhbCBsb2NhdGlvbi4KLSMgLi4uCi0jIFpvbmUgICAgICAgIEF1c3RyYWxpYS9Ob3J0aCAgICAgICAgIDk6MzAgICAgLSAgICAgICBDU1QKLQotIyBGcm9tIEJyYWRsZXkgV2hpdGUgKDE5OTEtMDMtMDQpOgotIyBBIHJlY2VudCBleGNlcnB0IGZyb20gYW4gQXVzdHJhbGlhbiBuZXdzcGFwZXIuLi4KLSMgdGhlIE5vcnRoZXJuIFRlcnJpdG9yeSBkb1tlc10gbm90IGhhdmUgZGF5bGlnaHQgc2F2aW5nLgotCi0jIFdlc3Rlcm4gQXVzdHJhbGlhCi0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyAgVGhlIHN0YXRlIG9mIFdFU1RFUk4gQVVTVFJBTElBLi4gIFsgQ291cnRlc3kgVy5BLiBkZXB0IFByZW1pZXIrQ2FiaW5ldCBdCi0jICMJCQkJCQlbIE5vdiAxOTkwIF0KLSMgIwlXLkEuIHN1ZmZlcnMgZnJvbSBhIGdyZWF0IGRlYWwgb2YgcHVibGljIGFuZCBwb2xpdGljYWwgb3Bwb3NpdGlvbiB0bwotIyAjCURTVCBpbiBwcmluY2lwbGUuIEEgYmlsbCBpcyBicm91Z2h0IGJlZm9yZSBwYXJsaWFtZW50IGluIG1vc3QgeWVhcnMsIGJ1dAotIyAjCXVzdWFsbHkgZGVmZWF0ZWQgZWl0aGVyIGluIHRoZSB1cHBlciBob3VzZSwgb3IgaW4gcGFydHkgY2F1Y3VzCi0jICMJYmVmb3JlIHJlYWNoaW5nIHBhcmxpYW1lbnQuCi0jIC4uLgotIyBab25lCUF1c3RyYWxpYS9XZXN0CQk4OjAwCUFXCSVzU1QKLSMgLi4uCi0jIFJ1bGUJQVcJMTk3NAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlBVwkxOTc1CW9ubHkJLQlNYXIJU3VuPj0xCTM6MDAJMAlXCi0jIFJ1bGUJQVcJMTk4Mwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlBVwkxOTg0CW9ubHkJLQlNYXIJU3VuPj0xCTM6MDAJMAlXCi0KLSMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkxLTAzLTA0KToKLSMgQSByZWNlbnQgZXhjZXJwdCBmcm9tIGFuIEF1c3RyYWxpYW4gbmV3c3BhcGVyLi4uCi0jIFdlc3Rlcm4gQXVzdHJhbGlhLi4uZG9bZXNdIG5vdCBoYXZlIGRheWxpZ2h0IHNhdmluZy4KLQotIyBGcm9tIEpvaG4gRC4gTmV3bWFuIHZpYSBCcmFkbGV5IFdoaXRlICgxOTkxLTExLTAyKToKLSMgV2VzdGVybiBBdXN0cmFsaWEgaXMgc3RpbGwgb24gIndpbnRlciB0aW1lIi4gU29tZSBESCBpbiBTeWRuZXkKLSMgcmFuZyBtZSBhdCBob21lIGEgZmV3IGRheXMgYWdvIGF0IDYuMDBhbS4gKEhlIGhhZCBqdXN0IGFycml2ZWQgYXQKLSMgd29yayBhdCA5LjAwYW0uKQotIyBXLkEuIGlzIHN3aXRjaGluZyB0byBTdW1tZXIgVGltZSBvbiBOb3YgMTd0aCBqdXN0IHRvIGNvbmZ1c2UKLSMgZXZlcnlib2R5IGFnYWluLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTkyLTAzLTA4KToKLSMgVGhlIDE5OTIgZW5kaW5nIGRhdGUgdXNlZCBpbiB0aGUgcnVsZXMgaXMgYSBiZXN0IGd1ZXNzOwotIyBpdCBtYXRjaGVzIHdoYXQgd2FzIHVzZWQgaW4gdGhlIHBhc3QuCi0KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib20uZ292LmF1L2ZhcS9mYXFnZW4uaHRtIj4KLSMgVGhlIEF1c3RyYWxpYW4gQnVyZWF1IG9mIE1ldGVvcm9sb2d5IEZBUQotIyA8L2E+ICgxOTk5LTA5LTI3KSB3cml0ZXMgdGhhdCBHaWxlcyBNZXRlb3JvbG9naWNhbCBTdGF0aW9uIHVzZXMKLSMgU291dGggQXVzdHJhbGlhbiB0aW1lIGV2ZW4gdGhvdWdoIGl0J3MgbG9jYXRlZCBpbiBXZXN0ZXJuIEF1c3RyYWxpYS4KLQotIyBRdWVlbnNsYW5kCi0jIEZyb20gR2VvcmdlIFNoZXBoZXJkIHZpYSBTaW1vbiBXb29kaGVhZCB2aWEgUm9iZXJ0IEVseiAoMTk5MS0wMy0wNik6Ci0jICMgICBUaGUgc3RhdGUgb2YgUVVFRU5TTEFORC4uIFsgQ291cnRlc3kgUWxkLiBEZXB0IFByZW1pZXIgRWNvbiZUcmFkZSBEZXZlbCBdCi0jICMJCQkJCQlbIERlYyAxOTkwIF0KLSMgLi4uCi0jIFpvbmUJQXVzdHJhbGlhL1F1ZWVuc2xhbmQJMTA6MDAJQVEJJXNTVAotIyAuLi4KLSMgUnVsZQlBUQkxOTcxCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBSdWxlCUFRCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTM6MDAJMAlFCi0jIFJ1bGUJQVEJMTk4OQltYXgJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBSdWxlCUFRCTE5OTAJbWF4CS0JTWFyCVN1bj49MQkzOjAwCTAJRQotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk4OS0xMi0yNCk6Ci0jICJBdXN0cmFsaWEvUXVlZW5zbGFuZCIgbm93IG9ic2VydmVzIGRheWxpZ2h0IHRpbWUgKGkuZS4gZnJvbQotIyBPY3RvYmVyIDE5ODkpLgotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5MS0wMy0wNCk6Ci0jIEEgcmVjZW50IGV4Y2VycHQgZnJvbSBhbiBBdXN0cmFsaWFuIG5ld3NwYXBlci4uLgotIyAuLi5RdWVlbnNsYW5kLi4uW2hhc10gYWdyZWVkIHRvIGVuZCBkYXlsaWdodCBzYXZpbmcKLSMgYXQgM2FtIHRvbW9ycm93IChNYXJjaCAzKS4uLgotCi0jIEZyb20gSm9obiBNYWNraW4gKDE5OTEtMDMtMDYpOgotIyBJIGNhbiBjZXJ0YWlubHkgY29uZmlybSBmb3IgbXkgcGFydCB0aGF0IERheWxpZ2h0IFNhdmluZyBpbiBOU1cgZGlkIGluIGZhY3QKLSMgZW5kIG9uIFN1bmRheSwgMyBNYXJjaC4gIEkgZG9uJ3Qga25vdyBhdCB3aGF0IGhvdXIsIHRob3VnaC4gIChJdCBzdXJwcmlzZWQKLSMgbWUuKQotCi0jIEZyb20gQnJhZGxleSBXaGl0ZSAoMTk5Mi0wMy0wOCk6Ci0jIC4uLnRoZXJlIHdhcyByZWNlbnRseSBhIHJlZmVyZW5kdW0gaW4gUXVlZW5zbGFuZCB3aGljaCByZXN1bHRlZAotIyBpbiB0aGUgZXhwZXJpbWVudGFsIGRheWxpZ2h0IHNhdmluZyBzeXN0ZW0gYmVpbmcgYWJhbmRvbmVkLiBTbywgLi4uCi0jIC4uLgotIyBSdWxlCVFMRAkxOTg5CTE5OTEJLQlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJRAotIyBSdWxlCVFMRAkxOTkwCTE5OTIJLQlNYXIJU3VuPj0xCTM6MDAJMAlTCi0jIC4uLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTkyLTAzLTA4KToKLSMgVGhlIGNob3NlbiBydWxlcyB0aGUgdW5pb24gb2YgdGhlIDE5NzEvMTk3MiBjaGFuZ2UgYW5kIHRoZSAxOTg5LTE5OTIgY2hhbmdlcy4KLQotIyBGcm9tIENocmlzdG9waGVyIEh1bnQgKDIwMDYtMTEtMjEpLCBhZnRlciBhbiBhZHZhbmNlIHdhcm5pbmcKLSMgZnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMTEtMDEpOgotIyBXQSBhcmUgdHJpYWxpbmcgRFNUIGZvciB0aHJlZSB5ZWFycy4KLSMgPGh0dHA6Ly93d3cucGFybGlhbWVudC53YS5nb3YuYXUvcGFybGlhbWVudC9iaWxscy5uc2YvOUExQjE4MzE0NDQwM0RBNTQ4MjU3MjEyMDAwODhERjEvJEZpbGUvQmlsbDE3NS0xQi5wZGY+Ci0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMi0wNC0wOSk6Ci0jIFRoZSBtb3N0IGludGVyZXN0aW5nIHJlZ2lvbiBJIGhhdmUgZm91bmQgY29uc2lzdHMgb2YgdGhyZWUgdG93bnMgb24gdGhlCi0jIHNvdXRoZXJuIGNvYXN0Li4uLiAgU291dGggQXVzdHJhbGlhIG9ic2VydmVzIGRheWxpZ2h0IHNhdmluZyB0aW1lOyBXZXN0ZXJuCi0jIEF1c3RyYWxpYSBkb2VzIG5vdC4gIFRoZSB0d28gc3RhdGVzIGFyZSBvbmUgYW5kIGEgaGFsZiBob3VycyBhcGFydC4gIFRoZQotIyByZXNpZGVudHMgZGVjaWRlZCB0byBmb3JnZXQgYWJvdXQgdGhpcyBub25zZW5zZSBvZiBjaGFuZ2luZyB0aGUgY2xvY2sgc28KLSMgbXVjaCBhbmQgc2V0IHRoZSBsb2NhbCB0aW1lIDIwIGhvdXJzIGFuZCA0NSBtaW51dGVzIGZyb20gdGhlCi0jIGludGVybmF0aW9uYWwgZGF0ZSBsaW5lLCBvciByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aW1lIG9mIFNvdXRoCi0jIEF1c3RyYWxpYSBhbmQgV2VzdGVybiBBdXN0cmFsaWEuLi4uCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMDQtMDkpOgotIyBUaGlzIGlzIGNvbmZpcm1lZCBieSB0aGUgc2VjdGlvbiBlbnRpdGxlZAotIyAiV2hhdCdzIHRoZSBkZWFsIHdpdGggdGltZSB6b25lcz8/PyIgaW4KLSMgPGh0dHA6Ly93d3cuZWFydGhzY2kudW5pbWVsYi5lZHUuYXUvfmF3YXRraW5zL251bGwuaHRtbD4uCi0jCi0jIEZyb20gQWxleCBMaXZpbmdzdG9uICgyMDA2LTEyLTA3KToKLSMgLi4uIGl0IHdhcyBqdXN0IG9uIGZvdXIgeWVhcnMgYWdvIHRoYXQgSSBkcm92ZSBhbG9uZyB0aGUgRXlyZSBIaWdod2F5LAotIyB3aGljaCBwYXNzZXMgdGhyb3VnaCBlYXN0ZXJuIFdlc3Rlcm4gQXVzdHJhbGlhIGNsb3NlIHRvIHRoZSBzb3V0aGVybgotIyBjb2FzdCBvZiB0aGUgY29udGluZW50LgotIwotIyBJIHBhaWQgcGFydGljdWxhciBhdHRlbnRpb24gdG8gdGhlIHRpbWUga2VwdCB0aGVyZS4gVGhlcmUgY2FuIGJlIG5vCi0jIGRpc3B1dGUgdGhhdCBVVEMrMDg6NDUgd2FzIGNvbnNpZGVyZWQgInRoZSB0aW1lIiBmcm9tIHRoZSBib3JkZXIKLSMgdmlsbGFnZSBqdXN0IGluc2lkZSB0aGUgYm9yZGVyIHdpdGggU291dGggQXVzdHJhbGlhIHRvIGFzIGZhciB3ZXN0Ci0jIGFzIGp1c3QgZWFzdCBvZiBDYWlndW5hLiBUaGVyZSBjYW4gYWxzbyBiZSBubyBkaXNwdXRlIHRoYXQgRXVjbGEgaXMKLSMgdGhlIGxhcmdlc3QgcG9wdWxhdGlvbiBjZW50cmUgaW4gdGhpcyB6b25lLi4uLgotIwotIyBOb3cgdGhhdCBXZXN0ZXJuIEF1c3RyYWxpYSBpcyBvYnNlcnZpbmcgZGF5bGlnaHQgc2F2aW5nLCB0aGUKLSMgcXVlc3Rpb24gYXJvc2Ugd2hldGhlciB0aGlzIHBhcnQgb2YgdGhlIHN0YXRlIHdvdWxkIGZvbGxvdyBzdWl0LiBJCi0jIGp1c3QgY2FsbGVkIHRoZSBib3JkZXIgdmlsbGFnZSBhbmQgY29uZmlybWVkIHRoYXQgaW5kZWVkIHRoZXkgaGF2ZSwKLSMgbWVhbmluZyB0aGF0IHRoZXkgYXJlIG5vdyBvYnNlcnZpbmcgVVRDKzA5OjQ1LgotIwotIyAoMjAwNi0xMi0wOSk6Ci0jIEkgcGVyc29uYWxseSBkb3VidCB0aGF0IGVpdGhlciBleHBlcmltZW50YXRpb24gd2l0aCBkYXlsaWdodCBzYXZpbmcKLSMgaW4gV0Egb3IgaXRzIGludHJvZHVjdGlvbiBpbiBTQSBoYWQgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgZ2VuZXNpcwotIyBvZiB0aGlzIHRpbWUgem9uZS4gIE15IGh1bmNoIGlzIHRoYXQgaXQncyBiZWVuIGFyb3VuZCBzaW5jZSB3ZWxsCi0jIGJlZm9yZSAxOTc1LiAgSSByZW1lbWJlciBzZWVpbmcgaXQgbm90ZWQgb24gcm9hZCBtYXBzIGRlY2FkZXMgYWdvLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMTItMTUpOgotIyBGb3IgbGFjayBvZiBiZXR0ZXIgaW5mbywgYXNzdW1lIHRoZSB0cmFkaXRpb24gZGF0ZXMgYmFjayB0byB0aGUKLSMgaW50cm9kdWN0aW9uIG9mIHN0YW5kYXJkIHRpbWUgaW4gMTg5NS4KLQotCi0jIHNvdXRoZWFzdCBBdXN0cmFsaWEKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6Ci0jIFN0YXJ0aW5nIGF1dHVtbiAyMDA4IFZpY3RvcmlhLCBOU1csIFNvdXRoIEF1c3RyYWxpYSwgVGFzbWFuaWEgYW5kIHRoZSBBQ1QKLSMgZW5kIERTVCB0aGUgZmlyc3QgU3VuZGF5IGluIEFwcmlsIGFuZCBzdGFydCBEU1QgdGhlIGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyLgotIyBodHRwOi8vd3d3LnRoZWFnZS5jb20uYXUvbmV3cy9uYXRpb25hbC9kYXlsaWdodC1zYXZpbmdzLXRvLXNwYW4tc2l4LW1vbnRocy8yMDA3LzA2LzI3LzExODI2MjM5NjY3MDMuaHRtbAotCi0KLSMgU291dGggQXVzdHJhbGlhCi0KLSMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkxLTAzLTA0KToKLSMgQSByZWNlbnQgZXhjZXJwdCBmcm9tIGFuIEF1c3RyYWxpYW4gbmV3c3BhcGVyLi4uCi0jIC4uLlNvdXRoIEF1c3RyYWxpYS4uLltoYXNdIGFncmVlZCB0byBlbmQgZGF5bGlnaHQgc2F2aW5nCi0jIGF0IDNhbSB0b21vcnJvdyAoTWFyY2ggMykuLi4KLQotIyBGcm9tIEdlb3JnZSBTaGVwaGVyZCB2aWEgU2ltb24gV29vZGhlYWQgdmlhIFJvYmVydCBFbHogKDE5OTEtMDMtMDYpOgotIyAjICAgVGhlIHN0YXRlIG9mIFNPVVRIIEFVU1RSQUxJQS4uLi5bIENvdXJ0ZXN5IG9mIFMuQS4gRGVwdCBvZiBMYWJvdXIgXQotIyAjCQkJCQkJWyBOb3YgMTk5MCBdCi0jIC4uLgotIyBab25lCUF1c3RyYWxpYS9Tb3V0aAkJOTozMAlBUwklc1NUCi0jIC4uLgotIyBSdWxlCSBBUwkxOTcxCW1heAktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJIEFTCTE5NzIJMTk4NQktCU1hcglTdW4+PTEJMzowMAkwCUMKLSMgUnVsZQkgQVMJMTk4NgkxOTkwCS0JTWFyCVN1bj49MTUJMzowMAkwCUMKLSMgUnVsZQkgQVMJMTk5MQltYXgJLQlNYXIJU3VuPj0xCTM6MDAJMAlDCi0KLSMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTkyLTAzLTExKToKLSMgUmVjZW50IGNvcnJlc3BvbmRlbmNlIHdpdGggYSBmcmllbmQgaW4gQWRlbGFpZGUKLSMgY29udGFpbmVkIHRoZSBmb2xsb3dpbmcgZXhjaGFuZ2U6ICAiRHVlIHRvIHRoZSBBZGVsYWlkZSBGZXN0aXZhbCwKLSMgU291dGggQXVzdHJhbGlhIGRlbGF5cyBzZXR0aW5nIGJhY2sgb3VyIGNsb2NrcyBmb3IgYSBmZXcgd2Vla3MuIgotCi0jIEZyb20gUm9iZXJ0IEVseiAoMTk5Mi0wMy0xMyk6Ci0jIEkgaGVhcmQgdGhhdCBhcHBhcmVudGx5IChvciBhdCBsZWFzdCwgaXQgYXBwZWFycyB0aGF0KQotIyBTb3V0aCBBdXMgd2lsbCBoYXZlIGFuIGV4dHJhIDMgd2Vla3MgZGF5bGlnaHQgc2F2aW5nIGV2ZXJ5IGV2ZW4KLSMgbnVtYmVyZWQgeWVhciAoZnJvbSAxOTkwKS4gIFRoYXQncyB3aGVuIHRoZSBBZGVsYWlkZSBGZXN0aXZhbAotIyBpcyBvbi4uLgotCi0jIEZyb20gUm9iZXJ0IEVseiAoMTk5Mi0wMy0xNiwgMDA6NTc6MDcgKzEwMDApOgotIyBEU1QgZGlkbid0IGVuZCBpbiBBZGVsYWlkZSB0b2RheSAoeWVzdGVyZGF5KS4uLi4KLSMgQnV0IHdoZXRoZXIgaXQncyAiNHRoIFN1bmRheSIgb3IgIjJuZCBsYXN0IFN1bmRheSIgSSBoYXZlIG5vIGlkZWEgd2hhdGV2ZXIuLi4KLSMgKGl0J3MganVzdCBhcyBsaWtlbHkgdG8gYmUgInRoZSBTdW5kYXkgd2UgcGljayBmb3IgdGhpcyB5ZWFyIi4uLikuCi0KLSMgRnJvbSBCcmFkbGV5IFdoaXRlICgxOTk0LTA0LTExKToKLSMgSWYgU3VuLCAxNSBNYXJjaCwgMTk5MiB3YXMgYXQgKzEwMzAgYXMga3JlIGFzc2VydHMsIGJ1dCB5ZXQgU3VuLCAyMCBNYXJjaCwKLSMgMTk5NCB3YXMgYXQgKzA5MzAgYXMgSm9obiBDb25ub2xseSdzIGN1c3RvbWVyIHNlZW1zIHRvIGFzc2VydCwgdGhlbiBJIGNhbgotIyBvbmx5IGNvbmNsdWRlIHRoYXQgdGhlIGFjdHVhbCBydWxlIGlzIG1vcmUgY29tcGxpY2F0ZWQuLi4uCi0KLSMgRnJvbSBKb2huIFdhcmJ1cnRvbiAoMTk5NC0xMC0wNyk6Ci0jIFRoZSBuZXcgRGF5bGlnaHQgU2F2aW5ncyBkYXRlcyBmb3IgU291dGggQXVzdHJhbGlhIC4uLgotIyB3YXMgZ2F6ZXR0ZWQgaW4gdGhlIEdvdmVybm1lbnQgSGFuc2FyZCBvbiBTZXAgMjYgMTk5NC4uLi4KLSMgc3RhcnQgb24gbGFzdCBTdW5kYXkgaW4gT2N0b2JlciBhbmQgZW5kIGluIGxhc3Qgc3VuZGF5IGluIE1hcmNoLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KLQotIyBUYXNtYW5pYQotCi0jIFRoZSBydWxlcyBmb3IgMTk2NyB0aHJvdWdoIDE5OTEgd2VyZSByZXBvcnRlZCBieSBHZW9yZ2UgU2hlcGhlcmQKLSMgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyAgVGhlIHN0YXRlIG9mIFRBU01BTklBLi4gW0NvdXJ0ZXN5IFRhc21hbmlhbiBEZXB0IG9mIFByZW1pZXIgKyBDYWJpbmV0IF0KLSMgIwkJCQkJWyBOb3YgMTk5MCBdCi0KLSMgRnJvbSBCaWxsIEhhcnQgdmlhIEd1eSBIYXJyaXMgKDE5OTEtMTAtMTApOgotIyBPaCB5ZXMsIHRoZSBuZXcgZGF5bGlnaHQgc2F2aW5ncyBydWxlcyBhcmUgdW5pcXVlbHkgdGFzbWFuaWFuLCB3ZSBoYXZlCi0jIDYgd2Vla3MgYSB5ZWFyIG5vdyB3aGVuIHdlIGFyZSBvdXQgb2Ygc3luYyB3aXRoIHRoZSByZXN0IG9mIEF1c3RyYWxpYQotIyAoYnV0IG5vdGhpbmcgbmV3IGFib3V0IHRoYXQpLgotCi0jIEZyb20gQWxleCBMaXZpbmdzdG9uICgxOTk5LTEwLTA0KToKLSMgSSBoZWFyZCBvbiB0aGUgQUJDIChBdXN0cmFsaWFuIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbikgcmFkaW8gbmV3cyBvbiB0aGUKLSMgKGxvbmcpIHdlZWtlbmQgdGhhdCBUYXNtYW5pYSwgd2hpY2ggdXN1YWxseSBnb2VzIGl0cyBvd24gd2F5IGluIHRoaXMgcmVnYXJkLAotIyBoYXMgZGVjaWRlZCB0byBqb2luIHdpdGggbW9zdCBvZiBOU1csIHRoZSBBQ1QsIGFuZCBtb3N0IG9mIFZpY3RvcmlhCi0jIChBdXN0cmFsaWEpIGFuZCBzdGFydCBkYXlsaWdodCBzYXZpbmcgb24gdGhlIGxhc3QgU3VuZGF5IGluIEF1Z3VzdCBpbiAyMDAwCi0jIGluc3RlYWQgb2YgdGhlIGZpcnN0IFN1bmRheSBpbiBPY3RvYmVyLgotCi0jIFNpbSBBbGFtICgyMDAwLTA3LTAzKSByZXBvcnRlZCBhIGxlZ2FsIGNpdGF0aW9uIGZvciB0aGUgMjAwMC8yMDAxIHJ1bGVzOgotIyBodHRwOi8vd3d3LnRoZWxhdy50YXMuZ292LmF1L2ZyYWd2aWV3LzQyKysxOTY4K0dTM0FARU4rMjAwMDA3MDMwMAotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KLQotIyBWaWN0b3JpYQotCi0jIFRoZSBydWxlcyBmb3IgMTk3MSB0aHJvdWdoIDE5OTEgd2VyZSByZXBvcnRlZCBieSBHZW9yZ2UgU2hlcGhlcmQKLSMgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyAgIFRoZSBzdGF0ZSBvZiBWSUNUT1JJQS4uIFsgQ291cnRlc3kgb2YgVmljLiBEZXB0IG9mIFByZW1pZXIgKyBDYWJpbmV0IF0KLSMgIwkJCQkJCVsgTm92IDE5OTAgXQotCi0jIEZyb20gU2NvdHQgSGFycmluZ3RvbiAoMjAwMS0wOC0yOSk6Ci0jIE9uIEtRRUQncyAiQ2l0eSBBcnRzIGFuZCBMZWN0dXJlcyIgcHJvZ3JhbSBsYXN0IG5pZ2h0IEkgaGVhcmQgYW4KLSMgaW50ZXJlc3Rpbmcgc3RvcnkgYWJvdXQgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLiAgRHIuIEpvaG4gSGVpbGJyb24gd2FzCi0jIGRpc2N1c3NpbmcgaGlzIGJvb2sgIlRoZSBTdW4gaW4gdGhlIENodXJjaDogQ2F0aGVkcmFscyBhcyBTb2xhcgotIyBPYnNlcnZhdG9yaWVzIlsxXSwgYW5kIGluIHBhcnRpY3VsYXIgdGhlIFNocmluZSBvZiBSZW1lbWJyYW5jZVsyXSBsb2NhdGVkCi0jIGluIE1lbGJvdXJuZSwgQXVzdHJhbGlhLgotIwotIyBBcHBhcmVudGx5IHRoZSBzaHJpbmUncyBtYWluIHB1cnBvc2UgaXMgYSBiZWFtIG9mIHN1bmxpZ2h0IHdoaWNoCi0jIGlsbHVtaW5hdGVzIGEgc3BlY2lhbCBzcG90IG9uIHRoZSBmbG9vciBhdCB0aGUgMTF0aCBob3VyIG9mIHRoZSAxMXRoIGRheQotIyBvZiB0aGUgMTF0aCBtb250aCAoUmVtZW1icmFuY2UgRGF5KSBldmVyeSB5ZWFyIGluIG1lbW9yeSBvZiBBdXN0cmFsaWEncwotIyBmYWxsZW4gV1dJIHNvbGRpZXJzLiAgQW5kIGlmIHlvdSBnbyB0aGVyZSBvbiBOb3YuIDExLCBhdCAxMWFtIGxvY2FsIHRpbWUsCi0jIHlvdSB3aWxsIGluZGVlZCBzZWUgdGhlIHN1bmJlYW0gaWxsdW1pbmF0ZSB0aGUgc3BlY2lhbCBzcG90IGF0IHRoZQotIyBleHBlY3RlZCB0aW1lLgotIwotIyBIb3dldmVyLCB0aGF0IGlzIG9ubHkgYmVjYXVzZSBvZiBzb21lIHNwZWNpYWwgbWlycm9yIGNvbnRyYXB0aW9uIHRoYXQgaGFkCi0jIHRvIGJlIGVtcGxveWVkLCBzaW5jZSBkdWUgdG8gZGF5bGlnaHQgc2F2aW5ncyB0aW1lLCB0aGUgdHJ1ZSBzb2xhciB0aW1lIG9mCi0jIHRoZSByZW1lbWJyYW5jZSBtb21lbnQgb2NjdXJzIG9uZSBob3VyIGxhdGVyIChvciBlYXJsaWVyPykuICBQZXJoYXBzCi0jIHNvbWVvbmUgd2l0aCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMganVyeS1yaWcgY2FuIHRlbGwgdXMgbW9yZS4KLSMKLSMgWzFdIGh0dHA6Ly93d3cuaHVwLmhhcnZhcmQuZWR1L2NhdGFsb2cvSEVJU1VOLmh0bWwKLSMgWzJdIGh0dHA6Ly93d3cuc2hyaW5lLm9yZy5hdQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDctMjMpOgotIyBTZWUgInNvdXRoZWFzdCBBdXN0cmFsaWEiIGFib3ZlIGZvciAyMDA4IGFuZCBsYXRlci4KLQotIyBOZXcgU291dGggV2FsZXMKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbjoKLSMgTmV3IFNvdXRoIFdhbGVzIGFuZCBzdWJqdXJpc2RpY3Rpb25zIGhhdmUgdGhlaXIgb3duIGlkZWFzIG9mIGEgZnVuIHRpbWUuCi0jIEJhc2VkIG9uIGxhdyBsaWJyYXJ5IHJlc2VhcmNoIGJ5IEpvaG4gTWFja2luLAotIyB3aG8gbm90ZXM6Ci0jCUluIEF1c3RyYWxpYSwgdGltZSBpcyBub3QgbGVnaXNsYXRlZCBmZWRlcmFsbHksIGJ1dCByYXRoZXIgYnkgdGhlCi0jCWluZGl2aWR1YWwgc3RhdGVzLiAgVGh1cywgd2hpbGUgc3VjaCB0ZXJtcyBhcyBgYEVhc3Rlcm4gU3RhbmRhcmQgVGltZScnCi0jCVtJIG1lYW4sIG9mIGNvdXJzZSwgQXVzdHJhbGlhbiBFU1QsIG5vdCBhbnkgb3RoZXIga2luZF0gYXJlIGluIGNvbW1vbgotIwl1c2UsIF90aGV5IGhhdmUgTk8gUkVBTCBNRUFOSU5HXywgYXMgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gdGhlCi0jCWxlZ2lzbGF0aW9uLiAgVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kLgotIwlJIGhhdmUgcmVzZWFyY2hlZCBOZXcgU291dGggV2FsZXMgdGltZSBvbmx5Li4uCi0KLSMgRnJvbSBFcmljIFVsZXZpayAoMTk5OS0wNS0yNik6Ci0jIERTVCB3aWxsIHN0YXJ0IGluIE5TVyBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgQXVndXN0LCByYXRoZXIgdGhhbiB0aGUgdXN1YWwKLSMgT2N0b2JlciBpbiAyMDAwLiAgW1NlZTogTWF0dGhldyBNb29yZSwKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zbWguY29tLmF1L25ld3MvOTkwNS8yNi9wYWdlb25lL3BhZ2VvbmU0Lmh0bWwiPgotIyBUd28gbW9udGhzIG1vcmUgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4KLSMgU3lkbmV5IE1vcm5pbmcgSGVyYWxkICgxOTk5LTA1LTI2KS5dCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yNyk6Ci0jIFNlZSB0aGUgZm9sbG93aW5nIG9mZmljaWFsIE5TVyBzb3VyY2U6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9kaXIuZ2lzLm5zdy5nb3YuYXUvY2dpLWJpbi9nZW5vYmplY3QvZG9jdW1lbnQvb3RoZXIvZGF5bGlnaHRzYXZpbmcvdGlnR21aIj4KLSMgRGF5bGlnaHQgU2F2aW5nIGluIE5ldyBTb3V0aCBXYWxlcy4KLSMgPC9hPgotIwotIyBOYXJyYWJyaSBTaGlyZSAoTlNXKSBjb3VuY2lsIGhhcyBhbm5vdW5jZWQgaXQgd2lsbCBpZ25vcmUgdGhlIGV4dGVuc2lvbiBvZgotIyBkYXlsaWdodCBzYXZpbmcgbmV4dCB5ZWFyLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL3JlZ2lvbmFscy9uZXdlbmcvbW9udGhseS9yZWdlbmctMjJqdWwxOTk5LTEuaHRtIj4KLSMgTmFycmFicmkgQ291bmNpbCB0byBpZ25vcmUgZGF5bGlnaHQgc2F2aW5nCi0jIDwvYT4gKDE5OTktMDctMjIpLiAgRm9yIG5vdywgd2UnbGwgd2FpdCB0byBzZWUgaWYgdGhpcyByZWFsbHkgaGFwcGVucy4KLSMKLSMgVmljdG9yaWEgd2lsbCBmb2xsb3dpbmcgTlNXLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9sb2NhbC9uZXdzL29seW1waWNzLzE5OTkvMDcvaXRlbTE5OTkwNzI4MTEyMzE0XzEuaHRtIj4KLSMgVmljIHRvIGV4dGVuZCBkYXlsaWdodCBzYXZpbmcKLSMgPC9hPiAoMTk5OS0wNy0yOCkuCi0jCi0jIEhvd2V2ZXIsIFNvdXRoIEF1c3RyYWxpYSByZWplY3RlZCB0aGUgRFNUIHJlcXVlc3QuICBTZWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hYmMubmV0LmF1L25ld3Mvb2x5bXBpY3MvMTk5OS8wNy9pdGVtMTk5OTA3MTkxNTE3NTRfMS5odG0iPgotIyBTb3V0aCBBdXN0cmFsaWEgcmVqZWN0cyBPbHltcGljcyBkYXlsaWdodCBzYXZpbmdzIHJlcXVlc3QKLSMgPC9hPiAoMTk5OS0wNy0xOSkuCi0jCi0jIFF1ZWVuc2xhbmQgYWxzbyB3aWxsIG5vdCBvYnNlcnZlIERTVCBmb3IgdGhlIE9seW1waWNzLiAgU2VlOgotIyA8YSBocmVmPSJodHRwOi8vYWJjLm5ldC5hdS9uZXdzL29seW1waWNzLzE5OTkvMDYvaXRlbTE5OTkwNjAxMTE0NjA4XzEuaHRtIj4KLSMgUWxkIHNheXMgbm8gdG8gZGF5bGlnaHQgc2F2aW5ncyBmb3IgT2x5bXBpY3MKLSMgPC9hPiAoMTk5OS0wNi0wMSksIHdoaWNoIHF1b3RlcyBRdWVlbnNsYW5kIFByZW1pZXIgUGV0ZXIgQmVhdHRpZSBhcyBzYXlpbmcKLSMgYGBMb29rIHlvdSd2ZSBnb3QgdG8gcmVtZW1iZXIgaW4gbXkgZmFtaWx5IHdoZW4gdGhpcyBjYW1lIHVwIGxhc3QgdGltZQotIyBJIHZvdGVkIGZvciBpdCwgbXkgd2lmZSB2b3RlZCBhZ2FpbnN0IGl0IGFuZCBzaGUgc2FpZCB0byBtZSBpdCdzIGFsbCB2ZXJ5Ci0jIHdlbGwgZm9yIHlvdSwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZ2V0dGluZyB0aGUgY2hpbGRyZW4gb3V0IG9mCi0jIGJlZCwgZ2V0dGluZyB0aGVtIHRvIHNjaG9vbCwgZ2V0dGluZyB0aGVtIHRvIHNsZWVwIGF0IG5pZ2h0LgotIyBJJ3ZlIGJlZW4gdGhyb3VnaCBhbGwgdGhpcyBhcmd1bWVudCBkb21lc3RpY2FsbHkuLi5teSB3aWZlIHJ1bGVzLicnCi0jCi0jIEJyb2tlbiBIaWxsIHdpbGwgc3RpY2sgd2l0aCBTb3V0aCBBdXN0cmFsaWFuIHRpbWUgaW4gMjAwMC4gIFNlZToKLSMgPGEgaHJlZj0iaHR0cDovL2FiYy5uZXQuYXUvbmV3cy9yZWdpb25hbHMvYnJva2VuaC9tb250aGx5L3JlZ2Jyb2stMjFqdWwxOTk5LTYuaHRtIj4KLSMgQnJva2VuIEhpbGwgdG8gYmUgYmVoaW5kIHRoZSB0aW1lcwotIyA8L2E+ICgxOTk5LTA3LTIxKS4KLQotIyBJQVRBIFNTSU0gKDE5OTgtMDkpIHNheXMgdGhhdCB0aGUgc3ByaW5nIDIwMDAgY2hhbmdlIGZvciBBdXN0cmFsaWFuCi0jIENhcGl0YWwgVGVycml0b3J5LCBOZXcgU291dGggV2FsZXMgZXhjZXB0IExvcmQgSG93ZSBJc2xhbmQgYW5kIEJyb2tlbgotIyBIaWxsLCBhbmQgVmljdG9yaWEgd2lsbCBiZSBBdWd1c3QgMjcsIHByZXN1bWFibHkgZHVlIHRvIHRoZSBTeWRuZXkgT2x5bXBpY3MuCi0KLSMgRnJvbSBFcmljIFVsZXZpaywgcmVmZXJyaW5nIHRvIFN5ZG5leSdzIFN1biBIZXJhbGQgKDIwMDAtMDgtMTMpLCBwYWdlIDI5OgotIyBUaGUgUXVlZW5zbGFuZCBQcmVtaWVyIFBldGVyIEJlYXR0aWUgaXMgZW5jb3VyYWdpbmcgbm9ydGhlcm4gTlNXCi0jIHRvd25zIHRvIHVzZSBRdWVlbnNsYW5kIHRpbWUuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6Ci0jIFNlZSAic291dGhlYXN0IEF1c3RyYWxpYSIgYWJvdmUgZm9yIDIwMDggYW5kIGxhdGVyLgotCi0jIFlhbmNvd2lubmEKLQotIyBGcm9tIEpvaG4gTWFja2luICgxOTg5LTAxLTA0KToKLSMgYEJyb2tlbiBIaWxsJyBtZWFucyB0aGUgQ291bnR5IG9mIFlhbmNvd2lubmEuCi0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyBZQU5DT1dJTk5BLi4gIFsgQ29uZmlybWF0aW9uIGNvdXJ0ZXN5IG9mIEJyb2tlbiBIaWxsIFBvc3RtYXN0ZXIgXQotIyAjCQkJCQlbIERlYyAxOTkwIF0KLSMgLi4uCi0jICMgWWFuY293aW5uYSB1c2VzIENlbnRyYWwgU3RhbmRhcmQgVGltZSwgZGVzcGl0ZSBbaXRzXSBsb2NhdGlvbiBvbiB0aGUKLSMgIyBOZXcgU291dGggV2FsZXMgc2lkZSBvZiB0aGUgUy5BLiBib3JkZXIuIE1vc3QgYnVzaW5lc3MgYW5kIHNvY2lhbCBkZWFsaW5ncwotIyAjIGFyZSB3aXRoIENTVCB6b25lcywgdGhlcmVmb3JlIENTVCBpcyBsZWdpc2xhdGVkIGJ5IGxvY2FsIGdvdmVybm1lbnQKLSMgIyBhbHRob3VnaCB0aGUgc3dpdGNoIHRvIFN1bW1lciBUaW1lIG9jY3VycyBpbiBsaW5lIHdpdGggTi5TLlcuIFRoZXJlIGhhdmUKLSMgIyBiZWVuIHllYXJzIHdoZW4gdGhpcyBkaWQgbm90IGFwcGx5LCBidXQgdGhlIGhpc3RvcmljYWwgZGF0YSBpcyBub3QKLSMgIyBwcmVzZW50bHkgYXZhaWxhYmxlLgotIyBab25lCUF1c3RyYWxpYS9ZYW5jb3dpbm5hCTk6MzAJIEFZCSVzU1QKLSMgLi4uCi0jIFJ1bGUJIEFZCTE5NzEJMTk4NQktCU9jdAlsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJIEFZCTE5NzIJb25seQktCUZlYglsYXN0U3VuCTM6MDAJMAlDCi0jIFtmb2xsb3dlZCBieSBvdGhlciBSdWxlc10KLQotIyBMb3JkIEhvd2UgSXNsYW5kCi0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgTEhJLi4uCQlbIENvdXJ0ZXN5IG9mIFBhdWxpbmUgVmFuIFdpbnNlbiBdCi0jCQkJCQlbIERlYyAxOTkwIF0KLSMgTG9yZCBIb3dlIElzbGFuZCBpcyBsb2NhdGVkIG9mZiB0aGUgTmV3IFNvdXRoIFdhbGVzIGNvYXN0LCBhbmQgaXMgaGFsZiBhbgotIyBob3VyIGFoZWFkIG9mIE5TVyB0aW1lLgotCi0jIEZyb20gSmFtZXMgTG9uZXJnYW4sIFNlY3JldGFyeSwgTG9yZCBIb3dlIElzbGFuZCBCb2FyZCAoMjAwMC0wMS0yNyk6Ci0jIExvcmQgSG93ZSBJc2xhbmQgc3VtbWVyIHRpbWUgaW4gMjAwMC8yMDAxIHdpbGwgY29tbWVuY2Ugb24gdGhlIHNhbWUKLSMgZGF0ZSBhcyB0aGUgcmVzdCBvZiBOU1cgKGkuZS4gMjAwMC0wOC0yNykuICBGb3IgeW91ciBpbmZvcm1hdGlvbiB0aGUKLSMgTG9yZCBIb3dlIElzbGFuZCBCb2FyZCAoY29udHJvbGxpbmcgYXV0aG9yaXR5IGZvciB0aGUgSXNsYW5kKSBpcwotIyBzZWVraW5nIHRoZSBjb21tdW5pdHkncyB2aWV3cyBvbiB2YXJpb3VzIG9wdGlvbnMgZm9yIHN1bW1lciB0aW1lCi0jIGFycmFuZ2VtZW50cyBvbiB0aGUgSXNsYW5kLCBlLmcuIGFkdmFuY2UgY2xvY2tzIGJ5IDEgZnVsbCBob3VyCi0jIGluc3RlYWQgb2Ygb25seSAzMCBtaW51dGVzLiAgRGVwZW5kYW50IG9uIHRoZSB3aXNoZXMgb2YgcmVzaWRlbnRzCi0jIHRoZSBCb2FyZCBtYXkgYXBwcm9hY2ggdGhlIE5TVyBnb3Zlcm5tZW50IHRvIGNoYW5nZSB0aGUgZXhpc3RpbmcKLSMgYXJyYW5nZW1lbnRzLiAgVGhlIHN0YXJ0aW5nIGRhdGUgZm9yIHN1bW1lciB0aW1lIG9uIHRoZSBJc2xhbmQgd2lsbAotIyBob3dldmVyIGFsd2F5cyBjb2luY2lkZSB3aXRoIHRoZSByZXN0IG9mIE5TVy4KLQotIyBGcm9tIEphbWVzIExvbmVyZ2FuLCBTZWNyZXRhcnksIExvcmQgSG93ZSBJc2xhbmQgQm9hcmQgKDIwMDAtMTAtMjUpOgotIyBMb3JkIEhvd2UgSXNsYW5kIGFkdmFuY2VzIGNsb2NrcyBieSAzMCBtaW51dGVzIGR1cmluZyBEU1QgaW4gTlNXIGFuZCByZXRhcmRzCi0jIGNsb2NrcyBieSAzMCBtaW51dGVzIHdoZW4gRFNUIGZpbmlzaGVzLiBTaW5jZSBEU1Qgd2FzIG1vc3QgcmVjZW50bHkKLSMgaW50cm9kdWNlZCBpbiBOU1csIHRoZSAiY2hhbmdlb3ZlciIgdGltZSBvbiB0aGUgSXNsYW5kIGhhcyBiZWVuIDAyOjAwIGFzCi0jIHNob3duIG9uIGNsb2NrcyBvbiBMSEkuIEkgZ3Vlc3MgdGhpcyBtZWFucyB0aGF0IGZvciAzMCBtaW51dGVzIGF0IHRoZSBzdGFydAotIyBvZiBEU1QsIExISSBpcyBhY3R1YWxseSAxIGhvdXIgYWhlYWQgb2YgdGhlIHJlc3Qgb2YgTlNXLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBGb3IgTG9yZCBIb3dlIGRhdGVzIHdlIHVzZSBTaGFua3MgJiBQb3R0ZW5nZXIgdGhyb3VnaCAxOTg5LCBhbmQKLSMgTG9uZXJnYW4gdGhlcmVhZnRlci4gIEZvciB0aW1lcyB3ZSB1c2UgTG9uZXJnYW4uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wNy0yMyk6Ci0jIFNlZSAic291dGhlYXN0IEF1c3RyYWxpYSIgYWJvdmUgZm9yIDIwMDggYW5kIGxhdGVyLgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA5LTA0LTI4KToKLSMgQWNjb3JkaW5nIHRvIHRoZSBvZmZpY2lhbCBwcmVzcyByZWxlYXNlLCBTb3V0aCBBdXN0cmFsaWEncyBleHRlbmRlZCBkYXlsaWdodCAKLSMgc2F2aW5nIHBlcmlvZCB3aWxsIGNvbnRpbnVlIHdpdGggdGhlIHNhbWUgcnVsZXMgYXMgdXNlZCBkdXJpbmcgdGhlIDIwMDgtMjAwOSAKLSMgc3VtbWVyIChzb3V0aGVybiBoZW1pc3BoZXJlKS4KLSMgCi0jIEZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYWZld29yay5zYS5nb3YuYXUvdXBsb2FkZWRfZmlsZXMvRGF5bGlnaHREYXRlc1NldC5wZGYiPgotIyBodHRwOi8vd3d3LnNhZmV3b3JrLnNhLmdvdi5hdS91cGxvYWRlZF9maWxlcy9EYXlsaWdodERhdGVzU2V0LnBkZgotIyA8L2E+Ci0jIFRoZSBleHRlbmRlZCBkYXlsaWdodCBzYXZpbmcgcGVyaW9kIHRoYXQgU291dGggQXVzdHJhbGlhIGhhcyBiZWVuIHRyaWFsbGluZyAKLSMgZm9yIG92ZXIgdGhlIGxhc3QgeWVhciBpcyBub3cgc2V0IHRvIGJlIG9uZ29pbmcuCi0jIERheWxpZ2h0IHNhdmluZyB3aWxsIGNvbnRpbnVlIHRvIHN0YXJ0IG9uIHRoZSBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciBlYWNoIAotIyB5ZWFyIGFuZCBmaW5pc2ggb24gdGhlIGZpcnN0IFN1bmRheSBpbiBBcHJpbCB0aGUgZm9sbG93aW5nIHllYXIuCi0jIEluZHVzdHJpYWwgUmVsYXRpb25zIE1pbmlzdGVyLCBQYXVsIENhaWNhLCBzYXlzIHRoaXMgcHJvdmlkZXMgU291dGggQXVzdHJhbGlhIAotIyB3aXRoIGEgY29uc2lzdGVudCBoYWxmIGhvdXIgdGltZSBkaWZmZXJlbmNlIHdpdGggTlNXLCBWaWN0b3JpYSwgVGFzbWFuaWEgYW5kIAotIyB0aGUgQUNUIGZvciBhbGwgNTIgd2Vla3Mgb2YgdGhlIHllYXIuLi4KLSMgCi0jIFdlIGhhdmUgYSB3cmFwLXVwIGhlcmU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbCI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9zb3V0aC1hdXN0cmFsaWEtZXh0ZW5kcy1kc3QuaHRtbAotIyA8L2E+Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTmV3IFplYWxhbmQKLQotIyBGcm9tIE1hcmsgRGF2aWVzICgxOTkwLTEwLTAzKToKLSMgdGhlIDE5ODkvOTAgeWVhciB3YXMgYSB0cmlhbCBvZiBhbiBleHRlbmRlZCAiZGF5bGlnaHQgc2F2aW5nIiBwZXJpb2QuCi0jIFRoaXMgdHJpYWwgd2FzIGRlZW1lZCBzdWNjZXNzZnVsIGFuZCB0aGUgZXh0ZW5kZWQgcGVyaW9kIGFkb3B0ZWQgZm9yCi0jIHN1YnNlcXVlbnQgeWVhcnMgKHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgZnVydGhlciB3ZWVrIGF0IHRoZSBzdGFydCkuCi0jIHNvdXJjZSAtLSBwaG9uZSBjYWxsIHRvIE1pbmlzdHJ5IG9mIEludGVybmFsIEFmZmFpcnMgSGVhZCBPZmZpY2UuCi0KLSMgRnJvbSBHZW9yZ2UgU2hlcGhlcmQgdmlhIFNpbW9uIFdvb2RoZWFkIHZpYSBSb2JlcnQgRWx6ICgxOTkxLTAzLTA2KToKLSMgIyBUaGUgQ291bnRyeSBvZiBOZXcgWmVhbGFuZCAgIChBdXN0cmFsaWEncyBlYXN0IGlzbGFuZCAtKSBHZWUgdGhleSBoYXRlIHRoYXQhCi0jICMJCQkJICAgb3IgaXMgQXVzdHJhbGlhIHRoZSB3ZXN0IGlzbGFuZCBvZiBOLlouCi0jICMJWyBjb3VydGVzeSBvZiBHZW9mZiBUcmliYmxlLi4gQXVja2xhbmQgTi5aLiBdCi0jICMJCQkJWyBOb3YgMTk5MCBdCi0jIC4uLgotIyBSdWxlCU5aICAgICAgMTk3NCAgICAxOTg4CS0JT2N0CWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgUnVsZQlOWgkxOTg5CW1heAktCU9jdAlTdW4+PTEJMjowMAkxOjAwCUQKLSMgUnVsZQlOWiAgICAgIDE5NzUgICAgMTk4OQktCU1hcglTdW4+PTEJMzowMAkwCVMKLSMgUnVsZQlOWgkxOTkwCW1heAktCU1hcglsYXN0U3VuCTM6MDAJMAlTCi0jIC4uLgotIyBab25lCU5aCQkJMTI6MDAJTloJCU5aJXNUCSMgTmV3IFplYWxhbmQKLSMgWm9uZQlOWi1DSEFUCQkJMTI6NDUJLQkJTlotQ0hBVCAjIENoYXRoYW0gSXNsYW5kCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTItMDMtMDgpOgotIyBUaGUgY2hvc2VuIHJ1bGVzIHVzZSB0aGUgRGF2aWVzIE9jdG9iZXIgOCB2YWx1ZXMgZm9yIHRoZSBzdGFydCBvZiBEU1QgaW4gMTk4OQotIyByYXRoZXIgdGhhbiB0aGUgT2N0b2JlciAxIHZhbHVlLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTUtMTItMTkpOwotIyBTaGFuayAmIFBvdHRlbmdlciByZXBvcnQgMjowMCBmb3IgYWxsIGF1dHVtbiBjaGFuZ2VzIGluIEF1c3RyYWxpYSBhbmQgTlouCi0jIFJvYmVydCBVemdhbGlzIHdyaXRlcyB0aGF0IHRoZSBOZXcgWmVhbGFuZCBEYXlsaWdodAotIyBTYXZpbmdzIFRpbWUgT3JkZXIgaW4gQ291bmNpbCBkYXRlZCAxOTkwLTA2LTE4IHNwZWNpZmllcyAyOjAwIHN0YW5kYXJkCi0jIHRpbWUgb24gYm90aCB0aGUgZmlyc3QgU3VuZGF5IGluIE9jdG9iZXIgYW5kIHRoZSB0aGlyZCBTdW5kYXkgaW4gTWFyY2guCi0jIEFzIHdpdGggQXVzdHJhbGlhLCB3ZSdsbCBhc3N1bWUgdGhlIHRyYWRpdGlvbiBpcyAyOjAwcywgbm90IDI6MDAuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBUaGUgRGVwYXJ0bWVudCBvZiBJbnRlcm5hbCBBZmZhaXJzIChESUEpIG1haW50YWlucyBhIGJyaWVmIGhpc3RvcnksCi0jIGFzIGRvZXMgQ2Fyb2wgU3F1aXJlczsgc2VlIHR6LWxpbmsuaHRtIGZvciB0aGUgZnVsbCByZWZlcmVuY2VzLgotIyBVc2UgdGhlc2Ugc291cmNlcyBpbiBwcmVmZXJlbmNlIHRvIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMKLSMgRm9yIENoYXRoYW0sIElBVEEgU1NJTSAoMTk5MS8xOTk5KSBnaXZlcyB0aGUgTlogcnVsZXMgYnV0IHdpdGgKLSMgdHJhbnNpdGlvbnMgYXQgMjo0NSBsb2NhbCBzdGFuZGFyZCB0aW1lOyB0aGlzIGNvbmZpcm1zIHRoYXQgQ2hhdGhhbQotIyBpcyBhbHdheXMgZXhhY3RseSA0NSBtaW51dGVzIGFoZWFkIG9mIEF1Y2tsYW5kLgotCi0jIEZyb20gQ29saW4gU2hhcnBsZXMgKDIwMDctMDQtMzApOgotIyBEU1Qgd2lsbCBub3cgc3RhcnQgb24gdGhlIGxhc3QgU3VuZGF5IGluIFNlcHRlbWJlciwgYW5kIGVuZCBvbiB0aGUKLSMgZmlyc3QgU3VuZGF5IGluIEFwcmlsLiAgVGhlIGNoYW5nZXMgdGFrZSBlZmZlY3QgdGhpcyB5ZWFyLCBtZWFuaW5nCi0jIHRoYXQgRFNUIHdpbGwgYmVnaW4gb24gMjAwNy0wOS0zMCAyMDA4LTA0LTA2LgotIyBodHRwOi8vd3d3LmRpYS5nb3Z0Lm56L2RpYXdlYnNpdGUubnNmL3dwZ19VUkwvU2VydmljZXMtRGF5bGlnaHQtU2F2aW5nLURheWxpZ2h0LXNhdmluZy10by1iZS1leHRlbmRlZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyBGaWppCi0KLSMgSG93c2Ugd3JpdGVzIChwIDE1MykgdGhhdCBpbiAxODc5IHRoZSBCcml0aXNoIGdvdmVybm9yIG9mIEZpamkKLSMgZW5hY3RlZCBhbiBvcmRpbmFuY2Ugc3RhbmRhcmRpemluZyB0aGUgaXNsYW5kcyBvbiBBbnRpcG9kZWFuIFRpbWUKLSMgaW5zdGVhZCBvZiB0aGUgQW1lcmljYW4gc3lzdGVtICh3aGljaCB3YXMgb25lIGRheSBiZWhpbmQpLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTgtMTAtMDgpOgotIyBGaWppIHdpbGwgaW50cm9kdWNlIERTVCBlZmZlY3RpdmUgMDIwMCBsb2NhbCB0aW1lLCAxOTk4LTExLTAxCi0jIHVudGlsIDAzMDAgbG9jYWwgdGltZSAxOTk5LTAyLTI4LiAgRWFjaCB5ZWFyIHRoZSBEU1QgcGVyaW9kIHdpbGwKLSMgYmUgZnJvbSB0aGUgZmlyc3QgU3VuZGF5IGluIE5vdmVtYmVyIHVudGlsIHRoZSBsYXN0IFN1bmRheSBpbiBGZWJydWFyeS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTAxLTA4KToKLSMgSUFUQSBTU0lNICgxOTk5LTA5KSBzYXlzIERTVCBlbmRzIDAxMDAgbG9jYWwgdGltZS4gIEdvIHdpdGggTWNEb3cuCi0KLSMgRnJvbSB0aGUgQkJDIFdvcmxkIFNlcnZpY2UgKDE5OTgtMTAtMzEgMTE6MzIgVVRDKToKLSMgVGhlIEZpamlpYW4gZ292ZXJubWVudCBzYXlzIHRoZSBtYWluIHJlYXNvbnMgZm9yIHRoZSB0aW1lIGNoYW5nZSBpcyB0bwotIyBpbXByb3ZlIHByb2R1Y3Rpdml0eSBhbmQgcmVkdWNlIHJvYWQgYWNjaWRlbnRzLiAgQnV0IGNvcnJlc3BvbmRlbnRzIHNheSBpdAotIyBhbHNvIGhvcGVzIHRoZSBtb3ZlIHdpbGwgYm9vc3QgRmlqaSdzIGFiaWxpdHkgdG8gY29tcGV0ZSB3aXRoIG90aGVyIHBhY2lmaWMKLSMgaXNsYW5kcyBpbiB0aGUgZWZmb3J0IHRvIGF0dHJhY3QgdG91cmlzdHMgdG8gd2l0bmVzcyB0aGUgZGF3bmluZyBvZiB0aGUgbmV3Ci0jIG1pbGxlbml1bS4KLQotIyBodHRwOi8vd3d3LmZpamkuZ292LmZqL3ByZXNzLzIwMDBfMDkvMjAwMF8wOV8xMy0wNS5zaHRtbCAoMjAwMC0wOS0xMykKLSMgcmVwb3J0cyB0aGF0IEZpamkgaGFzIGRpc2NvbnRpbnVlZCBEU1QuCi0KLSMgSm9obnN0b24KLQotIyBKb2huc3RvbiBkYXRhIGlzIGZyb20gdXNubzE5OTUuCi0KLQotIyBLaXJpYmF0aQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMDEtMjIpOgotIyBUb2RheSdzIF9XYWxsIFN0cmVldCBKb3VybmFsXyAocGFnZSAxKSByZXBvcnRzIHRoYXQgS2lyaWJhdGkKLSMgYGBkZWNsYXJlZCBpdCB0aGUgc2FtZSBkYXkgdGhyb3VnaHQgdGhlIGNvdW50cnkgYXMgb2YgSmFuLiAxLCAxOTk1JycKLSMgYXMgcGFydCBvZiB0aGUgY29tcGV0aXRpb24gdG8gYmUgZmlyc3QgaW50byB0aGUgMjFzdCBjZW50dXJ5LgotCi0KLSMgS3dhamFsZWluCi0KLSMgSW4gY29tcC5yaXNrcyAxNC44NyAoMjYgQXVndXN0IDE5OTMpLCBQZXRlciBOZXVtYW5uIHdyaXRlczoKLSMgSSB3b25kZXIgd2hhdCBoYXBwZW5lZCBpbiBLd2FqYWxlaW4sIHdoZXJlIHRoZXJlIHdhcyBOTyBGcmlkYXksCi0jIDE5OTMtMDgtMjAuICBUaHVyc2RheSBuaWdodCBhdCBtaWRuaWdodCBLd2FqYWxlaW4gc3dpdGNoZWQgc2lkZXMgd2l0aAotIyByZXNwZWN0IHRvIHRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSwgdG8gcmVqb2luIGl0cyBmZWxsb3cgaXNsYW5kcywKLSMgZ29pbmcgZnJvbSAxMTo1OSBwLm0uIFRodXJzZGF5IHRvIDEyOjAwIG0uIFNhdHVyZGF5IGluIGEgYmxpbmsuCi0KLQotIyBOIE1hcmlhbmEgSXMsIEd1YW0KLQotIyBIb3dzZSB3cml0ZXMgKHAgMTUzKSBgYFRoZSBTcGFuaWFyZHMsIG9uIHRoZSBvdGhlciBoYW5kLCByZWFjaGVkIHRoZQotIyBQaGlsaXBwaW5lcyBhbmQgdGhlIExhZHJvbmVzIGZyb20gQW1lcmljYSwnJyBhbmQgaW1wbGllcyB0aGF0IHRoZSBMYWRyb25lcwotIyAobm93IGNhbGxlZCB0aGUgTWFyaWFuYXMpIGtlcHQgQW1lcmljYW4gZGF0ZSBmb3IgcXVpdGUgc29tZSB0aW1lLgotIyBGb3Igbm93LCB3ZSBhc3N1bWUgdGhlIExhZHJvbmVzIHN3aXRjaGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIFBoaWxpcHBpbmVzOwotIyBzZWUgQXNpYS9NYW5pbGEuCi0KLSMgVVMgUHVibGljIExhdyAxMDYtNTY0ICgyMDAwLTEyLTIzKSBtYWRlIFVUQysxMCB0aGUgb2ZmaWNpYWwgc3RhbmRhcmQgdGltZSwKLSMgdW5kZXIgdGhlIG5hbWUgIkNoYW1vcnJvIFN0YW5kYXJkIFRpbWUiLiAgVGhlcmUgaXMgbm8gb2ZmaWNpYWwgYWJicmV2aWF0aW9uLAotIyBidXQgQ29uZ3Jlc3NtYW4gUm9iZXJ0IEEuIFVuZGVyd29vZCwgYXV0aG9yIG9mIHRoZSBiaWxsIHRoYXQgYmVjYW1lIGxhdywKLSMgd3JvdGUgaW4gYSBwcmVzcyByZWxlYXNlICgyMDAwLTEyLTI3KSB0aGF0IGhlIHdpbGwgc2VlayB0aGUgdXNlIG9mICJDaFNUIi4KLQotCi0jIE1pY3JvbmVzaWEKLQotIyBBbGFuIEV1Z2VuZSBEYXZpcyB3cml0ZXMgKDE5OTYtMDMtMTYpLAotIyBgYEkgYW0gY2VydGFpbiwgaGF2aW5nIGxpdmVkIHRoZXJlIGZvciB0aGUgcGFzdCBkZWNhZGUsIHRoYXQgIlRydWsiCi0jIChub3cgcHJvcGVybHkga25vd24gYXMgQ2h1dWspIC4uLiBpcyBpbiB0aGUgdGltZSB6b25lIEdNVCsxMC4nJwotIwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBUcnVrIHN3aXRjaGVkIGZyb20gVVRDKzEwIHRvIFVUQysxMQotIyBvbiAxOTc4LTEwLTAxOyBpZ25vcmUgdGhpcyBmb3Igbm93LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTAtMjkpOgotIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIFZpc2l0b3JzIEJvYXJkIHdyaXRlcyBpbgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmZzbWdvdi5vcmcvaW5mby9jbG9ja3MuaHRtbCI+Ci0jIFRoZSBGZWRlcmF0ZWQgU3RhdGVzIG9mIE1pY3JvbmVzaWEgLSBWaXNpdG9yIEluZm9ybWF0aW9uCi0jIDwvYT4gKDE5OTktMDEtMjYpCi0jIHRoYXQgVHJ1ayBhbmQgWWFwIGFyZSBVVEMrMTAsIGFuZCBQb25hcGUgYW5kIEtvc3JhZSBhcmUgVVRDKzExLgotIyBXZSBkb24ndCBrbm93IHdoZW4gS29zcmFlIHN3aXRjaGVkIGZyb20gVVRDKzEyOyBhc3N1bWUgSmFudWFyeSAxIGZvciBub3cuCi0KLQotIyBNaWR3YXkKLQotIyBGcm9tIENoYXJsZXMgVCBPJ0Nvbm5vciwgS01USCBESiAoMTk1NiksCi0jIHF1b3RlZCBpbiB0aGUgS1RNSCBzZWN0aW9uIG9mIHRoZSBSYWRpbyBIZXJpdGFnZSBDb2xsZWN0aW9uCi0jIDxodHRwOi8vcmFkaW9keC5jb20vc3BkeHIvS01USC5odG0+ICgyMDAyLTEyLTMxKToKLSMgRm9yIHRoZSBwYXN0IHR3byBtb250aHMgd2UndmUgYmVlbiBvbiB3aGF0IGlzIGtub3duIGFzIERheWxpZ2h0Ci0jIFNhdmluZyBUaW1lLiAgVGhpcyB0aW1lIGhhcyBwdXQgdXMgb24gYWlyIGF0IDVhbSBpbiB0aGUgbW9ybmluZywKLSMgeW91ciB0aW1lIGRvd24gdGhlcmUgaW4gTmV3IFplYWxhbmQuICBTdGFydGluZyBTZXB0ZW1iZXIgMiwgMTk1NgotIyB3ZSdsbCBhZ2FpbiBnbyBiYWNrIHRvIFN0YW5kYXJkIFRpbWUuICBUaGlzJ2xsIG1lYW4gdGhhdCB3ZSdsbCBnbyB0bwotIyBhaXIgYXQgNmFtIHlvdXIgdGltZS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0yMyk6Ci0jIFdlIGRvbid0IGtub3cgdGhlIGRhdGUgb2YgdGhhdCBxdW90ZSwgYnV0IHdlJ2xsIGd1ZXNzIHRoZXkKLSMgc3RhcnRlZCBEU1Qgb24gSnVuZSAzLiAgUG9zc2libHkgRFNUIHdhcyBvYnNlcnZlZCBvdGhlciB5ZWFycwotIyBpbiBNaWR3YXksIGJ1dCB3ZSBoYXZlIG5vIHJlY29yZCBvZiBpdC4KLQotCi0jIFBpdGNhaXJuCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMTk5OS0xMS0wOCk6Ci0jIEEgUHJvY2xhbWF0aW9uIHdhcyBzaWduZWQgYnkgdGhlIEdvdmVybm9yIG9mIFBpdGNhaXJuIG9uIHRoZSAyN3RoIE1hcmNoIDE5OTgKLSMgd2l0aCByZWdhcmQgdG8gUGl0Y2Fpcm4gU3RhbmRhcmQgVGltZS4gIFRoZSBQcm9jbGFtYXRpb24gaXMgYXMgZm9sbG93cy4KLSMKLSMJVGhlIGxvY2FsIHRpbWUgZm9yIGdlbmVyYWwgcHVycG9zZXMgaW4gdGhlIElzbGFuZHMgc2hhbGwgYmUKLSMJQ28tb3JkaW5hdGVkIFVuaXZlcnNhbCB0aW1lIG1pbnVzIDggaG91cnMgYW5kIHNoYWxsIGJlIGtub3duCi0jCWFzIFBpdGNhaXJuIFN0YW5kYXJkIFRpbWUuCi0jCi0jIC4uLiBJIGhhdmUgYWxzbyBzZWVuIFBpdGNhaXJuIGxpc3RlZCBhcyBVVEMgbWludXMgOSBob3VycyBpbiBzZXZlcmFsCi0jIHJlZmVyZW5jZXMsIGFuZCBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGlzIHdhcyBhbiBlcnJvciBpbiBpbnRlcnByZXRhdGlvbgotIyBzb21laG93IGluIGxpZ2h0IG9mIHRoaXMgcHJvY2xhbWF0aW9uLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDkpOgotIyBUaGUgUHJvY2xhbWF0aW9uIHJlZ2FyZGluZyBQaXRjYWlybiB0aW1lIGNhbWUgaW50byBlZmZlY3Qgb24gMjcgQXByaWwgMTk5OAotIyAuLi4gYXQgbWlkbmlnaHQuCi0KLSMgRnJvbSBIb3dpZSBQaGVscHMgKDE5OTktMTEtMTApLCB3aG8gdGFsa2VkIHRvIGEgUGl0Y2Fpcm5lciB2aWEgc2hvcnR3YXZlOgotIyBCZXR0eSBDaHJpc3RpYW4gdG9sZCBtZSB5ZXN0ZXJkYXkgdGhhdCB0aGVpciBsb2NhbCB0aW1lIGlzIHRoZSBzYW1lIGFzCi0jIFBhY2lmaWMgU3RhbmRhcmQgVGltZS4gVGhleSB1c2VkIHRvIGJlIDEvMiBob3VyIGRpZmZlcmVudCBmcm9tIHVzIGhlcmUgaW4KLSMgU2FjcmFtZW50byBidXQgaXQgd2FzIGNoYW5nZWQgYSBjb3VwbGUgb2YgeWVhcnMgYWdvLgotCi0KLSMgU2Ftb2EKLQotIyBIb3dzZSB3cml0ZXMgKHAgMTUzLCBjaXRpbmcgcCAxMCBvZiB0aGUgMTg4My0xMS0xOCBOZXcgWW9yayBIZXJhbGQpCi0jIHRoYXQgaW4gMTg3OSB0aGUgS2luZyBvZiBTYW1vYSBkZWNpZGVkIHRvIGNoYW5nZQotIyBgYHRoZSBkYXRlIGluIGhpcyBraW5nZG9tIGZyb20gdGhlIEFudGlwb2RlYW4gdG8gdGhlIEFtZXJpY2FuIHN5c3RlbSwKLSMgb3JkYWluaW5nIC0tIGJ5IGEgbWFzdGVycGllY2Ugb2YgZGlwbG9tYXRpYyBmbGF0dGVyeSAtLSB0aGF0Ci0jIHRoZSBGb3VydGggb2YgSnVseSBzaG91bGQgYmUgY2VsZWJyYXRlZCB0d2ljZSBpbiB0aGF0IHllYXIuJycKLQotCi0jIFRvbmdhCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wMS0yMik6Ci0jIFRvZGF5J3MgX1dhbGwgU3RyZWV0IEpvdXJuYWxfIChwIDEpIHJlcG9ydHMgdGhhdCBgYFRvbmdhIGhhcyBiZWVuIHBsb3R0aW5nCi0jIHRvIHNuZWFrIGFoZWFkIG9mIFtOZXcgWmVhbGFuZGVyc10gYnkgaW50cm9kdWNpbmcgZGF5bGlnaHQtc2F2aW5nIHRpbWUuJycKLSMgU2luY2UgS2lyaWJhdGkgaGFzIG1vdmVkIHRoZSBEYXRlIExpbmUgaXQncyBub3QgY2xlYXIgd2hhdCBUb25nYSB3aWxsIGRvLgotCi0jIERvbiBNdW5kZWxsIHdyaXRlcyBpbiB0aGUgMTk5Ny0wMi0yMCBUb25nYSBDaHJvbmljbGUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50b25nYXRhcHUubmV0LnRvL3RvbmdhL2hvbWVsYW5kL3RpbWViZWdpbnMuaHRtIj4KLSMgSG93IFRvbmdhIGJlY2FtZSBgVGhlIExhbmQgd2hlcmUgVGltZSBCZWdpbnMnCi0jIDwvYT46Ci0KLSMgVW50aWwgMTk0MSBUb25nYSBtYWludGFpbmVkIGEgc3RhbmRhcmQgdGltZSA1MCBtaW51dGVzIGFoZWFkIG9mIE5aU1QKLSMgMTIgaG91cnMgYW5kIDIwIG1pbnV0ZXMgYWhlYWQgb2YgR01ULiAgV2hlbiBOZXcgWmVhbGFuZCBhZGp1c3RlZCBpdHMKLSMgc3RhbmRhcmQgdGltZSBpbiAxOTQwcywgVG9uZ2EgaGFkIHRoZSBjaG9pY2Ugb2Ygc3VidHJhY3RpbmcgZnJvbSBpdHMKLSMgbG9jYWwgdGltZSB0byBjb21lIG9uIHRoZSBzYW1lIHN0YW5kYXJkIHRpbWUgYXMgTmV3IFplYWxhbmQgb3Igb2YKLSMgYWR2YW5jaW5nIGl0cyB0aW1lIHRvIG1haW50YWluIHRoZSBkaWZmZXJlbnRpYWwgb2YgMTMgZGVncmVlcwotIyAoYXBwcm94aW1hdGVseSA1MCBtaW51dGVzIGFoZWFkIG9mIE5ldyBaZWFsYW5kIHRpbWUpLgotIwotIyBCZWNhdXNlIEhpcyBNYWplc3R5IEtpbmcgVGF1ZmEnYWhhdSBUdXBvdSBJViwgdGhlbiBDcm93biBQcmluY2UKLSMgVHVuZ2ksIHByZWZlcnJlZCB0byBlbnN1cmUgVG9uZ2EncyB0aXRsZSBhcyB0aGUgbGFuZCB3aGVyZSB0aW1lCi0jIGJlZ2lucywgdGhlIExlZ2lzbGF0aXZlIEFzc2VtYmx5IGFwcHJvdmVkIHRoZSBsYXR0ZXIgY2hhbmdlLgotIwotIyBCdXQgc29tZSBvZiB0aGUgb2xkZXIsIG1vcmUgY29uc2VydmF0aXZlIG1lbWJlcnMgZnJvbSB0aGUgb3V0ZXIKLSMgaXNsYW5kcyBvYmplY3RlZC4gIklmIGF0IG1pZG5pZ2h0IG9uIERlYy4gMzEsIHdlIG1vdmUgYWhlYWQgNDAKLSMgbWludXRlcywgYXMgeW91ciBSb3lhbCBIaWdobmVzcyB3aXNoZXMsIHdoYXQgYmVjb21lcyBvZiB0aGUgNDAKLSMgbWludXRlcyB3ZSBoYXZlIGxvc3Q/IgotIwotIyBUaGUgQ3Jvd24gUHJpbmNlLCBwcmVzZW50ZWQgYW4gdW5hbnN3ZXJhYmxlIGFyZ3VtZW50OiAiUmVtZW1iZXIgdGhhdAotIyBvbiB0aGUgV29ybGQgRGF5IG9mIFByYXllciwgeW91IHdvdWxkIGJlIHRoZSBmaXJzdCBwZW9wbGUgb24gRWFydGgKLSMgdG8gc2F5IHlvdXIgcHJheWVycyBpbiB0aGUgbW9ybmluZy4iCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIHRyYW5zaXRpb24gd2FzIG9uIDE5NjgtMTAtMDE7IGdvIHdpdGggTXVuZGVsbC4KLQotIyBGcm9tIEVyaWMgVWxldmlrICgxOTk5LTA1LTAzKToKLSMgVG9uZ2EncyBkaXJlY3RvciBvZiB0b3VyaXNtLCB3aG8gaXMgYWxzbyBzZWNyZXRhcnkgb2YgdGhlIE5hdGlvbmFsIE1pbGxlbml1bQotIyBDb21taXR0ZWUsIGhhcyBhIHBsYW4gdG8gZ2V0IFRvbmdhIGJhY2sgaW4gZnJvbnQuCi0jIEhlIGhhcyBwcm9wb3NlZCBhIG9uZS1vZmYgbW92ZSB0byB0cm9waWNhbCBkYXlsaWdodCBzYXZpbmcgZm9yIFRvbmdhIGZyb20KLSMgT2N0b2JlciB0byBNYXJjaCwgd2hpY2ggaGFzIHdvbiBhcHByb3ZhbCBpbiBwcmluY2lwbGUgZnJvbSB0aGUgVG9uZ2FuCi0jIEdvdmVybm1lbnQuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgotIyAqIFRvbmdhIHdpbGwgaW50cm9kdWNlIERTVCBpbiBOb3ZlbWJlcgotIwotIyBJIHdhcyBnaXZlbiB0aGlzIGxpbmsgYnkgSm9obiBMZXR0czoKLSMgPGEgaHJlZj0iaHR0cDovL25ld3MuYmJjLmNvLnVrL2hpL2VuZ2xpc2gvd29ybGQvYXNpYS1wYWNpZmljL25ld3NpZF80MjQwMDAvNDI0NzY0LnN0bSI+Ci0jIGh0dHA6Ly9uZXdzLmJiYy5jby51ay9oaS9lbmdsaXNoL3dvcmxkL2FzaWEtcGFjaWZpYy9uZXdzaWRfNDI0MDAwLzQyNDc2NC5zdG0KLSMgPC9hPgotIwotIyBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBmaW5kIGV4YWN0IGRhdGVzIGZvciB0aGUgdHJhbnNpdGlvbiBpbiBOb3ZlbWJlcgotIyB5ZXQuIEJ5IHJlYWRpbmcgdGhpcyBhcnRpY2xlIGl0IHNlZW1zIGxpa2UgRmlqaSB3aWxsIGJlIDE0IGhvdXJzIGFoZWFkCi0jIG9mIFVUQyBhcyB3ZWxsLCBidXQgYXMgZmFyIGFzIEkga25vdyBGaWppIHdpbGwgb25seSBiZSAxMyBob3VycyBhaGVhZAotIyAoMTIgKyAxIGhvdXIgRFNUKS4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMTk5OS0wOS0yMCk6Ci0jIEFjY29yZGluZyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL3NlcHQxNzk5Lmh0bWwKLSMgPC9hPjoKLSMgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSB3aWxsIHRha2UgZWZmZWN0IG9uIE9jdC4gMiB0aHJvdWdoIEFwcmlsIDE1LCAyMDAwCi0jIGFuZCBhbm51YWxseSB0aGVyZWFmdGVyIGZyb20gdGhlIGZpcnN0IFNhdHVyZGF5IGluIE9jdG9iZXIgdGhyb3VnaCB0aGUKLSMgdGhpcmQgU2F0dXJkYXkgb2YgQXByaWwuICBVbmRlciB0aGUgc3lzdGVtIGFwcHJvdmVkIGJ5IFByaXZ5IENvdW5jaWwgb24KLSMgU2VwdC4gMTAsIGNsb2NrcyBtdXN0IGJlIHR1cm5lZCBhaGVhZCBvbmUgaG91ciBvbiB0aGUgb3BlbmluZyBkYXkgYW5kCi0jIHNldCBiYWNrIGFuIGhvdXIgb24gdGhlIGNsb3NpbmcgZGF0ZS4iCi0jIEFsYXMsIG5vIGluZGljYXRpb24gb2YgdGhlIHRpbWUgb2YgZGF5LgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTAtMDYpOgotIyBUb25nYSBzdGFydGVkIGl0cyBEYXlsaWdodCBTYXZpbmcgb24gU2F0dXJkYXkgbW9ybmluZyBPY3RvYmVyIDJuZCBhdCAwMjAwYW0uCi0jIERheWxpZ2h0IFNhdmluZyBlbmRzIG9uIEFwcmlsIDE2IGF0IDAzMDBhbSB3aGljaCBpcyBTdW5kYXkgbW9ybmluZy4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwMC0xMC0zMSk6Ci0jIEJhY2sgaW4gTWFyY2ggSSBmb3VuZCBhIG5vdGljZSBvbiB0aGUgd2Vic2l0ZSBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbQotIyB0aGF0IFRvbmdhIGNoYW5nZWQgYmFjayB0byBzdGFuZGFyZCB0aW1lIG9uZSBtb250aCBlYXJseSwgb24gTWFyY2ggMTkKLSMgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0ZWQgZGF0ZSBBcHJpbCAxNi4gVW5mb3J0dW5hdGVseSwgdGhlIGFydGljbGUKLSMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBvbiB0aGUgc2l0ZSwgYW5kIEkgZGlkIG5vdCBtYWtlIGEgY29weSBvZiB0aGUKLSMgdGV4dCwgYW5kIEkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcmVwb3J0IGl0IGhlcmUuCi0jIChPcmlnaW5hbCBVUkwgd2FzOiBodHRwOi8vd3d3LnRvbmdhb25saW5lLmNvbS9uZXdzL21hcmNoMTYyMDAwLmh0bSApCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMC0xMi0wMSk6Ci0jIFRvbmdhIGlzIG9ic2VydmluZyBEU1QgYXMgb2YgMjAwMC0xMS0wNCBhbmQgd2lsbCBzdG9wIG9uIDIwMDEtMDEtMjcuCi0KLSMgRnJvbSBTaW9uZSBNb2FsYS1NYWZpICgyMDAxLTA5LTIwKSB2aWEgUml2ZXMgTWNEb3c6Ci0jIEF0IDI6MDBhbSBvbiB0aGUgZmlyc3QgU3VuZGF5IG9mIE5vdmVtYmVyLCB0aGUgc3RhbmRhcmQgdGltZSBpbiB0aGUgS2luZ2RvbQotIyBzaGFsbCBiZSBtb3ZlZCBmb3J3YXJkIGJ5IG9uZSBob3VyIHRvIDM6MDBhbS4gIEF0IDI6MDBhbSBvbiB0aGUgbGFzdCBTdW5kYXkKLSMgb2YgSmFudWFyeSB0aGUgc3RhbmRhcmQgdGltZSBpbiB0aGUgS2luZ2RvbSBzaGFsbCBiZSBtb3ZlZCBiYWNrd2FyZCBieSBvbmUKLSMgaG91ciB0byAxOjAwYW0uCi0KLSMgRnJvbSBQdWx1ICdBbmF1ICgyMDAyLTExLTA1KToKLSMgVGhlIGxhdyB3YXMgZm9yIDMgeWVhcnMsIHN1cHBvc2VkbHkgdG8gZ2V0IHJlbmV3ZWQuICBJdCB3YXNuJ3QuCi0KLQotIyBXYWtlCi0KLSMgRnJvbSBWZXJuaWNlIEFuZGVyc29uLCBQZXJzb25hbCBTZWNyZXRhcnkgdG8gUGhpbGlwIEplc3N1cCwKLSMgVVMgQW1iYXNzYWRvciBBdCBMYXJnZSAob3JhbCBoaXN0b3J5IGludGVydmlldywgMTk3MS0wMi0wMik6Ci0jCi0jIFNhdHVyZGF5LCB0aGUgMTR0aCBbb2YgT2N0b2JlciwgMTk1MF0gLS0gLi4uICBUaGUgdGltZSB3YXMgYWxsIHRoZQotIyBtb3JlIGNvbmZ1c2luZyBhdCB0aGF0IHBvaW50LCBiZWNhdXNlIHdlIGhhZCBjcm9zc2VkIHRoZQotIyBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSwgdGh1cyBnZXR0aW5nIHR3byBTdW5kYXlzLiAgRnVydGhlcm1vcmUsIHdlCi0jIGRpc2NvdmVyZWQgdGhhdCBXYWtlIElzbGFuZCBoYWQgdHdvIGhvdXJzIG9mIGRheWxpZ2h0IHNhdmluZyB0aW1lCi0jIG1ha2luZyBjYWxjdWxhdGlvbiBvZiB0aW1lIGluIFdhc2hpbmd0b24gZGlmZmljdWx0IGlmIG5vdCBhbG1vc3QKLSMgaW1wb3NzaWJsZS4KLSMKLSMgaHR0cDovL3d3dy50cnVtYW5saWJyYXJ5Lm9yZy93YWtlL21lZXRpbmcuaHRtCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMy0yMyk6Ci0jIFdlIGhhdmUgbm8gb3RoZXIgcmVwb3J0IG9mIERTVCBpbiBXYWtlIElzbGFuZCwgc28gb21pdCB0aGlzIGluZm8gZm9yIG5vdy4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZQotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDAtMDEtMDMpOgotIwotIyBUaGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUgaXMgbm90IGRlZmluZWQgYnkgYW55IGludGVybmF0aW9uYWwgc3RhbmRhcmQsCi0jIGNvbnZlbnRpb24sIG9yIHRyZWF0eS4gIE1hcG1ha2VycyBhcmUgZnJlZSB0byBkcmF3IGl0IGFzIHRoZXkgcGxlYXNlLgotIyBSZXB1dGFibGUgbWFwbWFrZXJzIHdpbGwgc2ltcGx5IGVuc3VyZSB0aGF0IGV2ZXJ5IHBvaW50IG9mIGxhbmQgYXBwZWFycyBvbgotIyB0aGUgY29ycmVjdCBzaWRlIG9mIHRoZSBJREwsIGFjY29yZGluZyB0byB0aGUgZGF0ZSBsZWdhbGx5IG9ic2VydmVkIHRoZXJlLgotIwotIyBXaGVuIEtpcmliYXRpIGFkb3B0ZWQgYSB1bmlmb3JtIGRhdGUgaW4gMTk5NSwgdGhlcmVieSBtb3ZpbmcgdGhlIFBob2VuaXggYW5kCi0jIExpbmUgSXNsYW5kcyB0byB0aGUgd2VzdCBzaWRlIG9mIHRoZSBJREwgKG9yLCBpZiB5b3UgcHJlZmVyLCBtb3ZpbmcgdGhlIElETAotIyB0byB0aGUgZWFzdCBzaWRlIG9mIHRoZSBQaG9lbml4IGFuZCBMaW5lIElzbGFuZHMpLCBJIHN1cHBvc2UgdGhhdCBtb3N0Ci0jIG1hcG1ha2VycyByZWRyZXcgdGhlIElETCBmb2xsb3dpbmcgdGhlIGJvdW5kYXJ5IG9mIEtpcmliYXRpLiAgRXZlbiB0aGF0IGxpbmUKLSMgaGFzIGEgcmF0aGVyIGFyYml0cmFyeSBuYXR1cmUuICBUaGUgc3RyYWlnaHQtbGluZSBib3VuZGFyaWVzIGJldHdlZW4gUGFjaWZpYwotIyBpc2xhbmQgbmF0aW9ucyB0aGF0IGFyZSBzaG93biBvbiBtYW55IG1hcHMgYXJlIGJhc2VkIG9uIGFuIGludGVybmF0aW9uYWwKLSMgY29udmVudGlvbiwgYnV0IGFyZSBub3QgbGVnYWxseSBiaW5kaW5nIG5hdGlvbmFsIGJvcmRlcnMuLi4uIFRoZSBkYXRlIGlzCi0jIGdvdmVybmVkIGJ5IHRoZSBJREw7IHRoZXJlZm9yZSwgZXZlbiBvbiB0aGUgaGlnaCBzZWFzLCB0aGVyZSBtYXkgYmUgc29tZQotIyBwbGFjZXMgYXMgbGF0ZSBhcyBmb3VydGVlbiBob3VycyBsYXRlciB0aGFuIFVUQy4gIEFuZCwgc2luY2UgdGhlIElETCBpcyBub3QKLSMgYW4gaW50ZXJuYXRpb25hbCBzdGFuZGFyZCwgdGhlcmUgYXJlIHNvbWUgcGxhY2VzIG9uIHRoZSBoaWdoIHNlYXMgd2hlcmUgdGhlCi0jIGNvcnJlY3QgZGF0ZSBpcyBhbWJpZ3VvdXMuCi0KLSMgRnJvbSBXaWtpcGVkaWEgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGltZV96b25lPiAoMjAwNS0wOC0zMSk6Ci0jIEJlZm9yZSAxOTIwLCBhbGwgc2hpcHMga2VwdCBsb2NhbCBhcHBhcmVudCB0aW1lIG9uIHRoZSBoaWdoIHNlYXMgYnkgc2V0dGluZwotIyB0aGVpciBjbG9ja3MgYXQgbmlnaHQgb3IgYXQgdGhlIG1vcm5pbmcgc2lnaHQgc28gdGhhdCwgZ2l2ZW4gdGhlIHNoaXAncwotIyBzcGVlZCBhbmQgZGlyZWN0aW9uLCBpdCB3b3VsZCBiZSAxMiBvJ2Nsb2NrIHdoZW4gdGhlIFN1biBjcm9zc2VkIHRoZSBzaGlwJ3MKLSMgbWVyaWRpYW4gKDEyIG8nY2xvY2sgPSBsb2NhbCBhcHBhcmVudCBub29uKS4gIER1cmluZyAxOTE3LCBhdCB0aGUKLSMgQW5nbG8tRnJlbmNoIENvbmZlcmVuY2Ugb24gVGltZS1rZWVwaW5nIGF0IFNlYSwgaXQgd2FzIHJlY29tbWVuZGVkIHRoYXQgYWxsCi0jIHNoaXBzLCBib3RoIG1pbGl0YXJ5IGFuZCBjaXZpbGlhbiwgc2hvdWxkIGFkb3B0IGhvdXJseSBzdGFuZGFyZCB0aW1lIHpvbmVzCi0jIG9uIHRoZSBoaWdoIHNlYXMuICBXaGVuZXZlciBhIHNoaXAgd2FzIHdpdGhpbiB0aGUgdGVycml0b3JpYWwgd2F0ZXJzIG9mIGFueQotIyBuYXRpb24gaXQgd291bGQgdXNlIHRoYXQgbmF0aW9uJ3Mgc3RhbmRhcmQgdGltZS4gIFRoZSBjYXB0YWluIHdhcyBwZXJtaXR0ZWQKLSMgdG8gY2hhbmdlIGhpcyBzaGlwJ3MgY2xvY2tzIGF0IGEgdGltZSBvZiBoaXMgY2hvaWNlIGZvbGxvd2luZyBoaXMgc2hpcCdzCi0jIGVudHJ5IGludG8gYW5vdGhlciB6b25lIHRpbWUtLWhlIG9mdGVuIGNob3NlIG1pZG5pZ2h0LiAgVGhlc2Ugem9uZXMgd2VyZQotIyBhZG9wdGVkIGJ5IGFsbCBtYWpvciBmbGVldHMgYmV0d2VlbiAxOTIwIGFuZCAxOTI1IGJ1dCBub3QgYnkgbWFueQotIyBpbmRlcGVuZGVudCBtZXJjaGFudCBzaGlwcyB1bnRpbCBXb3JsZCBXYXIgSUkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCwgdXNpbmcgcmVmZXJlbmNlcyBzdWdnZXN0ZWQgYnkgT3NjYXIgdmFuIFZsaWptZW4KLSMgKDIwMDUtMDMtMjApOgotIwotIyBUaGUgQW1lcmljYW4gUHJhY3RpY2FsIE5hdmlnYXRvciAoMjAwMikKLSMgPGh0dHA6Ly9wb2xsdXgubnNzLm5pbWEubWlsL3B1YnMvcHVic19qX2Fwbl9zZWN0aW9ucy5odG1sP3JpZD0xODc+Ci0jIHRhbGtzIG9ubHkgYWJvdXQgdGhlIDE4MC1kZWdyZWUgbWVyaWRpYW4gd2l0aCByZXNwZWN0IHRvIHNoaXBzIGluCi0jIGludGVybmF0aW9uYWwgd2F0ZXJzOyBpdCBpZ25vcmVzIHRoZSBpbnRlcm5hdGlvbmFsIGRhdGUgbGluZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2JhY2t3YXJkIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvYmFja3dhcmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjk1YTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvYmFja3dhcmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotIyA8cHJlPgotIyBAKCMpYmFja3dhcmQJOC45Ci0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIFRoaXMgZmlsZSBwcm92aWRlcyBsaW5rcyBiZXR3ZWVuIGN1cnJlbnQgbmFtZXMgZm9yIHRpbWUgem9uZXMKLSMgYW5kIHRoZWlyIG9sZCBuYW1lcy4gIE1hbnkgbmFtZXMgY2hhbmdlZCBpbiBsYXRlIDE5OTMuCi0KLUxpbmsJQWZyaWNhL0FzbWFyYQkJQWZyaWNhL0FzbWVyYQotTGluawlBZnJpY2EvQmFtYWtvCQlBZnJpY2EvVGltYnVrdHUKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvQ2F0YW1hcmNhCUFtZXJpY2EvQXJnZW50aW5hL0NvbW9kUml2YWRhdmlhCi1MaW5rCUFtZXJpY2EvQWRhawkJQW1lcmljYS9BdGthCi1MaW5rCUFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcwlBbWVyaWNhL0J1ZW5vc19BaXJlcwotTGluawlBbWVyaWNhL0FyZ2VudGluYS9DYXRhbWFyY2EJQW1lcmljYS9DYXRhbWFyY2EKLUxpbmsJQW1lcmljYS9BdGlrb2thbglBbWVyaWNhL0NvcmFsX0hhcmJvdXIKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvQ29yZG9iYQlBbWVyaWNhL0NvcmRvYmEKLUxpbmsJQW1lcmljYS9UaWp1YW5hCQlBbWVyaWNhL0Vuc2VuYWRhCi1MaW5rCUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJQW1lcmljYS9Gb3J0X1dheW5lCi1MaW5rCUFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMJQW1lcmljYS9JbmRpYW5hcG9saXMKLUxpbmsJQW1lcmljYS9BcmdlbnRpbmEvSnVqdXkJQW1lcmljYS9KdWp1eQotTGluawlBbWVyaWNhL0luZGlhbmEvS25veAlBbWVyaWNhL0tub3hfSU4KLUxpbmsJQW1lcmljYS9LZW50dWNreS9Mb3Vpc3ZpbGxlCUFtZXJpY2EvTG91aXN2aWxsZQotTGluawlBbWVyaWNhL0FyZ2VudGluYS9NZW5kb3phCUFtZXJpY2EvTWVuZG96YQotTGluawlBbWVyaWNhL1Jpb19CcmFuY28JQW1lcmljYS9Qb3J0b19BY3JlCi1MaW5rCUFtZXJpY2EvQXJnZW50aW5hL0NvcmRvYmEJQW1lcmljYS9Sb3NhcmlvCi1MaW5rCUFtZXJpY2EvU3RfVGhvbWFzCUFtZXJpY2EvVmlyZ2luCi1MaW5rCUFzaWEvQXNoZ2FiYXQJCUFzaWEvQXNoa2hhYmFkCi1MaW5rCUFzaWEvQ2hvbmdxaW5nCQlBc2lhL0NodW5na2luZwotTGluawlBc2lhL0RoYWthCQlBc2lhL0RhY2NhCi1MaW5rCUFzaWEvS2F0aG1hbmR1CQlBc2lhL0thdG1hbmR1Ci1MaW5rCUFzaWEvS29sa2F0YQkJQXNpYS9DYWxjdXR0YQotTGluawlBc2lhL01hY2F1CQlBc2lhL01hY2FvCi1MaW5rCUFzaWEvSmVydXNhbGVtCQlBc2lhL1RlbF9Bdml2Ci1MaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KLUxpbmsJQXNpYS9UaGltcGh1CQlBc2lhL1RoaW1idQotTGluawlBc2lhL01ha2Fzc2FyCQlBc2lhL1VqdW5nX1BhbmRhbmcKLUxpbmsJQXNpYS9VbGFhbmJhYXRhcglBc2lhL1VsYW5fQmF0b3IKLUxpbmsJQXRsYW50aWMvRmFyb2UJCUF0bGFudGljL0ZhZXJvZQotTGluawlFdXJvcGUvT3NsbwkJQXRsYW50aWMvSmFuX01heWVuCi1MaW5rCUF1c3RyYWxpYS9TeWRuZXkJQXVzdHJhbGlhL0FDVAotTGluawlBdXN0cmFsaWEvU3lkbmV5CUF1c3RyYWxpYS9DYW5iZXJyYQotTGluawlBdXN0cmFsaWEvTG9yZF9Ib3dlCUF1c3RyYWxpYS9MSEkKLUxpbmsJQXVzdHJhbGlhL1N5ZG5leQlBdXN0cmFsaWEvTlNXCi1MaW5rCUF1c3RyYWxpYS9EYXJ3aW4JQXVzdHJhbGlhL05vcnRoCi1MaW5rCUF1c3RyYWxpYS9CcmlzYmFuZQlBdXN0cmFsaWEvUXVlZW5zbGFuZAotTGluawlBdXN0cmFsaWEvQWRlbGFpZGUJQXVzdHJhbGlhL1NvdXRoCi1MaW5rCUF1c3RyYWxpYS9Ib2JhcnQJQXVzdHJhbGlhL1Rhc21hbmlhCi1MaW5rCUF1c3RyYWxpYS9NZWxib3VybmUJQXVzdHJhbGlhL1ZpY3RvcmlhCi1MaW5rCUF1c3RyYWxpYS9QZXJ0aAkJQXVzdHJhbGlhL1dlc3QKLUxpbmsJQXVzdHJhbGlhL0Jyb2tlbl9IaWxsCUF1c3RyYWxpYS9ZYW5jb3dpbm5hCi1MaW5rCUFtZXJpY2EvUmlvX0JyYW5jbwlCcmF6aWwvQWNyZQotTGluawlBbWVyaWNhL05vcm9uaGEJCUJyYXppbC9EZU5vcm9uaGEKLUxpbmsJQW1lcmljYS9TYW9fUGF1bG8JQnJhemlsL0Vhc3QKLUxpbmsJQW1lcmljYS9NYW5hdXMJCUJyYXppbC9XZXN0Ci1MaW5rCUFtZXJpY2EvSGFsaWZheAkJQ2FuYWRhL0F0bGFudGljCi1MaW5rCUFtZXJpY2EvV2lubmlwZWcJQ2FuYWRhL0NlbnRyYWwKLUxpbmsJQW1lcmljYS9SZWdpbmEJCUNhbmFkYS9FYXN0LVNhc2thdGNoZXdhbgotTGluawlBbWVyaWNhL1Rvcm9udG8JCUNhbmFkYS9FYXN0ZXJuCi1MaW5rCUFtZXJpY2EvRWRtb250b24JQ2FuYWRhL01vdW50YWluCi1MaW5rCUFtZXJpY2EvU3RfSm9obnMJQ2FuYWRhL05ld2ZvdW5kbGFuZAotTGluawlBbWVyaWNhL1ZhbmNvdXZlcglDYW5hZGEvUGFjaWZpYwotTGluawlBbWVyaWNhL1JlZ2luYQkJQ2FuYWRhL1Nhc2thdGNoZXdhbgotTGluawlBbWVyaWNhL1doaXRlaG9yc2UJQ2FuYWRhL1l1a29uCi1MaW5rCUFtZXJpY2EvU2FudGlhZ28JQ2hpbGUvQ29udGluZW50YWwKLUxpbmsJUGFjaWZpYy9FYXN0ZXIJCUNoaWxlL0Vhc3RlcklzbGFuZAotTGluawlBbWVyaWNhL0hhdmFuYQkJQ3ViYQotTGluawlBZnJpY2EvQ2Fpcm8JCUVneXB0Ci1MaW5rCUV1cm9wZS9EdWJsaW4JCUVpcmUKLUxpbmsJRXVyb3BlL0xvbmRvbgkJRXVyb3BlL0JlbGZhc3QKLUxpbmsJRXVyb3BlL0NoaXNpbmF1CQlFdXJvcGUvVGlyYXNwb2wKLUxpbmsJRXVyb3BlL0xvbmRvbgkJR0IKLUxpbmsJRXVyb3BlL0xvbmRvbgkJR0ItRWlyZQotTGluawlFdGMvR01UCQkJR01UKzAKLUxpbmsJRXRjL0dNVAkJCUdNVC0wCi1MaW5rCUV0Yy9HTVQJCQlHTVQwCi1MaW5rCUV0Yy9HTVQJCQlHcmVlbndpY2gKLUxpbmsJQXNpYS9Ib25nX0tvbmcJCUhvbmdrb25nCi1MaW5rCUF0bGFudGljL1JleWtqYXZpawlJY2VsYW5kCi1MaW5rCUFzaWEvVGVocmFuCQlJcmFuCi1MaW5rCUFzaWEvSmVydXNhbGVtCQlJc3JhZWwKLUxpbmsJQW1lcmljYS9KYW1haWNhCQlKYW1haWNhCi1MaW5rCUFzaWEvVG9reW8JCUphcGFuCi1MaW5rCVBhY2lmaWMvS3dhamFsZWluCUt3YWphbGVpbgotTGluawlBZnJpY2EvVHJpcG9saQkJTGlieWEKLUxpbmsJQW1lcmljYS9UaWp1YW5hCQlNZXhpY28vQmFqYU5vcnRlCi1MaW5rCUFtZXJpY2EvTWF6YXRsYW4JTWV4aWNvL0JhamFTdXIKLUxpbmsJQW1lcmljYS9NZXhpY29fQ2l0eQlNZXhpY28vR2VuZXJhbAotTGluawlQYWNpZmljL0F1Y2tsYW5kCU5aCi1MaW5rCVBhY2lmaWMvQ2hhdGhhbQkJTlotQ0hBVAotTGluawlBbWVyaWNhL0RlbnZlcgkJTmF2YWpvCi1MaW5rCUFzaWEvU2hhbmdoYWkJCVBSQwotTGluawlQYWNpZmljL1BhZ29fUGFnbwlQYWNpZmljL1NhbW9hCi1MaW5rCVBhY2lmaWMvQ2h1dWsJCVBhY2lmaWMvWWFwCi1MaW5rCVBhY2lmaWMvQ2h1dWsJCVBhY2lmaWMvVHJ1awotTGluawlQYWNpZmljL1BvaG5wZWkJCVBhY2lmaWMvUG9uYXBlCi1MaW5rCUV1cm9wZS9XYXJzYXcJCVBvbGFuZAotTGluawlFdXJvcGUvTGlzYm9uCQlQb3J0dWdhbAotTGluawlBc2lhL1RhaXBlaQkJUk9DCi1MaW5rCUFzaWEvU2VvdWwJCVJPSwotTGluawlBc2lhL1NpbmdhcG9yZQkJU2luZ2Fwb3JlCi1MaW5rCUV1cm9wZS9Jc3RhbmJ1bAkJVHVya2V5Ci1MaW5rCUV0Yy9VQ1QJCQlVQ1QKLUxpbmsJQW1lcmljYS9BbmNob3JhZ2UJVVMvQWxhc2thCi1MaW5rCUFtZXJpY2EvQWRhawkJVVMvQWxldXRpYW4KLUxpbmsJQW1lcmljYS9QaG9lbml4CQlVUy9Bcml6b25hCi1MaW5rCUFtZXJpY2EvQ2hpY2FnbwkJVVMvQ2VudHJhbAotTGluawlBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzCVVTL0Vhc3QtSW5kaWFuYQotTGluawlBbWVyaWNhL05ld19Zb3JrCVVTL0Vhc3Rlcm4KLUxpbmsJUGFjaWZpYy9Ib25vbHVsdQlVUy9IYXdhaWkKLUxpbmsJQW1lcmljYS9JbmRpYW5hL0tub3gJVVMvSW5kaWFuYS1TdGFya2UKLUxpbmsJQW1lcmljYS9EZXRyb2l0CQlVUy9NaWNoaWdhbgotTGluawlBbWVyaWNhL0RlbnZlcgkJVVMvTW91bnRhaW4KLUxpbmsJQW1lcmljYS9Mb3NfQW5nZWxlcwlVUy9QYWNpZmljCi1MaW5rCVBhY2lmaWMvUGFnb19QYWdvCVVTL1NhbW9hCi1MaW5rCUV0Yy9VVEMJCQlVVEMKLUxpbmsJRXRjL1VUQwkJCVVuaXZlcnNhbAotTGluawlFdXJvcGUvTW9zY293CQlXLVNVCi1MaW5rCUV0Yy9VVEMJCQladWx1CmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9ldGNldGVyYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2V0Y2V0ZXJhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzkzNjgyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2V0Y2V0ZXJhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIyA8cHJlPgotIyBAKCMpZXRjZXRlcmEJOC4yCi0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIFRoZXNlIGVudHJpZXMgYXJlIG1vc3RseSBwcmVzZW50IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHNvIHRoYXQKLSMgcGVvcGxlIGluIGFyZWFzIG5vdCBvdGhlcndpc2UgY292ZXJlZCBieSB0aGUgdHogZmlsZXMgY291bGQgInppYyAtbCIKLSMgdG8gYSB0aW1lIHpvbmUgdGhhdCB3YXMgcmlnaHQgZm9yIHRoZWlyIGFyZWEuICBUaGVzZSBkYXlzLCB0aGUKLSMgdHogZmlsZXMgY292ZXIgYWxtb3N0IGFsbCB0aGUgaW5oYWJpdGVkIHdvcmxkLCBhbmQgdGhlIG9ubHkgcHJhY3RpY2FsCi0jIG5lZWQgbm93IGZvciB0aGUgZW50cmllcyB0aGF0IGFyZSBub3Qgb24gVVRDIGFyZSBmb3Igc2hpcHMgYXQgc2VhCi0jIHRoYXQgY2Fubm90IHVzZSBQT1NJWCBUWiBzZXR0aW5ncy4KLQotWm9uZQlFdGMvR01UCQkwCS0JR01UCi1ab25lCUV0Yy9VVEMJCTAJLQlVVEMKLVpvbmUJRXRjL1VDVAkJMAktCVVDVAotCi0jIFRoZSBmb2xsb3dpbmcgbGluayB1c2VzIG9sZGVyIG5hbWluZyBjb252ZW50aW9ucywKLSMgYnV0IGl0IGJlbG9uZ3MgaGVyZSwgbm90IGluIHRoZSBmaWxlIGBiYWNrd2FyZCcsCi0jIGFzIGZ1bmN0aW9ucyBsaWtlIGdtdGltZSBsb2FkIHRoZSAiR01UIiBmaWxlIHRvIGhhbmRsZSBsZWFwIHNlY29uZHMgcHJvcGVybHkuCi0jIFdlIHdhbnQgdGhpcyB0byB3b3JrIGV2ZW4gb24gaW5zdGFsbGF0aW9ucyB0aGF0IG9taXQgdGhlIG90aGVyIG9sZGVyIG5hbWVzLgotTGluawlFdGMvR01UCQkJCUdNVAotCi1MaW5rCUV0Yy9VVEMJCQkJRXRjL1VuaXZlcnNhbAotTGluawlFdGMvVVRDCQkJCUV0Yy9adWx1Ci0KLUxpbmsJRXRjL0dNVAkJCQlFdGMvR3JlZW53aWNoCi1MaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVC0wCi1MaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVCswCi1MaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVDAKLQotIyBXZSB1c2UgUE9TSVgtc3R5bGUgc2lnbnMgaW4gdGhlIFpvbmUgbmFtZXMgYW5kIHRoZSBvdXRwdXQgYWJicmV2aWF0aW9ucywKLSMgZXZlbiB0aG91Z2ggdGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBtYW55IHBlb3BsZSBleHBlY3QuCi0jIFBPU0lYIGhhcyBwb3NpdGl2ZSBzaWducyB3ZXN0IG9mIEdyZWVud2ljaCwgYnV0IG1hbnkgcGVvcGxlIGV4cGVjdAotIyBwb3NpdGl2ZSBzaWducyBlYXN0IG9mIEdyZWVud2ljaC4gIEZvciBleGFtcGxlLCBUWj0nRXRjL0dNVCs0JyB1c2VzCi0jIHRoZSBhYmJyZXZpYXRpb24gIkdNVCs0IiBhbmQgY29ycmVzcG9uZHMgdG8gNCBob3VycyBiZWhpbmQgVVRDCi0jIChpLmUuIHdlc3Qgb2YgR3JlZW53aWNoKSBldmVuIHRob3VnaCBtYW55IHBlb3BsZSB3b3VsZCBleHBlY3QgaXQgdG8KLSMgbWVhbiA0IGhvdXJzIGFoZWFkIG9mIFVUQyAoaS5lLiBlYXN0IG9mIEdyZWVud2ljaCkuCi0jCi0jIEluIHRoZSBkcmFmdCA1IG9mIFBPU0lYIDEwMDMuMS0yMDB4LCB0aGUgYW5nbGUgYnJhY2tldCBub3RhdGlvbgotIyAod2hpY2ggaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHR6IGNvZGUpIGFsbG93cyBmb3IKLSMgVFo9JzxHTVQtND4rNCc7IGlmIHlvdSB3YW50IHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIGNvbmZvcm1pbmcgdG8KLSMgSVNPIDg2MDEgeW91IGNhbiB1c2UgVFo9JzwtMDQwMD4rNCcuICBUaHVzIHRoZSBjb21tb25seS1leHBlY3RlZAotIyBvZmZzZXQgaXMga2VwdCB3aXRoaW4gdGhlIGFuZ2xlIGJyYWNrZXQgKGFuZCBpcyB1c2VkIGZvciBkaXNwbGF5KQotIyB3aGlsZSB0aGUgUE9TSVggc2lnbiBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXQgKGFuZCBpcyB1c2VkCi0jIGZvciBjYWxjdWxhdGlvbikuCi0jCi0jIERvIG5vdCB1c2UgYSBUWiBzZXR0aW5nIGxpa2UgVFo9J0dNVCs0Jywgd2hpY2ggaXMgZm91ciBob3VycyBiZWhpbmQKLSMgR01UIGJ1dCB1c2VzIHRoZSBjb21wbGV0ZWx5IG1pc2xlYWRpbmcgYWJicmV2aWF0aW9uICJHTVQiLgotCi0jIEVhcmxpZXIgaW5jYXJuYXRpb25zIG9mIHRoaXMgcGFja2FnZSB3ZXJlIG5vdCBQT1NJWC1jb21wbGlhbnQsCi0jIGFuZCBoYWQgbGluZXMgc3VjaCBhcwotIwkJWm9uZQlHTVQtMTIJCS0xMgktCUdNVC0xMjAwCi0jIFdlIGRpZCBub3Qgd2FudCB0aGluZ3MgdG8gY2hhbmdlIHF1aWV0bHkgaWYgc29tZW9uZSBhY2N1c3RvbWVkIHRvIHRoZSBvbGQKLSMgd2F5IGRvZXMgYQotIwkJemljIC1sIEdNVC0xMgotIyBzbyB3ZSBtb3ZlZCB0aGUgbmFtZXMgaW50byB0aGUgRXRjIHN1YmRpcmVjdG9yeS4KLQotWm9uZQlFdGMvR01ULTE0CTE0CS0JR01ULTE0CSMgMTQgaG91cnMgYWhlYWQgb2YgR01UCi1ab25lCUV0Yy9HTVQtMTMJMTMJLQlHTVQtMTMKLVpvbmUJRXRjL0dNVC0xMgkxMgktCUdNVC0xMgotWm9uZQlFdGMvR01ULTExCTExCS0JR01ULTExCi1ab25lCUV0Yy9HTVQtMTAJMTAJLQlHTVQtMTAKLVpvbmUJRXRjL0dNVC05CTkJLQlHTVQtOQotWm9uZQlFdGMvR01ULTgJOAktCUdNVC04Ci1ab25lCUV0Yy9HTVQtNwk3CS0JR01ULTcKLVpvbmUJRXRjL0dNVC02CTYJLQlHTVQtNgotWm9uZQlFdGMvR01ULTUJNQktCUdNVC01Ci1ab25lCUV0Yy9HTVQtNAk0CS0JR01ULTQKLVpvbmUJRXRjL0dNVC0zCTMJLQlHTVQtMwotWm9uZQlFdGMvR01ULTIJMgktCUdNVC0yCi1ab25lCUV0Yy9HTVQtMQkxCS0JR01ULTEKLVpvbmUJRXRjL0dNVCsxCS0xCS0JR01UKzEKLVpvbmUJRXRjL0dNVCsyCS0yCS0JR01UKzIKLVpvbmUJRXRjL0dNVCszCS0zCS0JR01UKzMKLVpvbmUJRXRjL0dNVCs0CS00CS0JR01UKzQKLVpvbmUJRXRjL0dNVCs1CS01CS0JR01UKzUKLVpvbmUJRXRjL0dNVCs2CS02CS0JR01UKzYKLVpvbmUJRXRjL0dNVCs3CS03CS0JR01UKzcKLVpvbmUJRXRjL0dNVCs4CS04CS0JR01UKzgKLVpvbmUJRXRjL0dNVCs5CS05CS0JR01UKzkKLVpvbmUJRXRjL0dNVCsxMAktMTAJLQlHTVQrMTAKLVpvbmUJRXRjL0dNVCsxMQktMTEJLQlHTVQrMTEKLVpvbmUJRXRjL0dNVCsxMgktMTIJLQlHTVQrMTIKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2V1cm9wZSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2V1cm9wZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhNmQ4Zi4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway9ldXJvcGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNzI0ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKWV1cm9wZQk4LjI3Ci0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkxLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgT3RoZXIgc291cmNlcyBvY2Nhc2lvbmFsbHkgdXNlZCBpbmNsdWRlOgotIwotIwlFZHdhcmQgVy4gV2hpdG1hbiwgV29ybGQgVGltZSBEaWZmZXJlbmNlcywKLSMJV2hpdG1hbiBQdWJsaXNoaW5nIENvLCAyIE5pYWdhcmEgQXYsIEVhbGluZywgTG9uZG9uICh1bmRhdGVkKSwKLSMJd2hpY2ggSSBmb3VuZCBpbiB0aGUgVUNMQSBsaWJyYXJ5LgotIwotIwk8YSBocmVmPSJodHRwOi8vd3d3LnBldHRzd29vZHZpbGxhZ2UuY28udWsvRGF5bGlnaHRfU2F2aW5nc19XaWxsaWFtX1dpbGxldHQucGRmIj4KLSMJV2lsbGlhbSBXaWxsZXR0LCBUaGUgV2FzdGUgb2YgRGF5bGlnaHQsIDE5dGggZWRpdGlvbgotIwk8L2E+ICgxOTE0LTAzKQotIwotIwlCcmF6aWwncyBEZXBhcnRhbWVudG8gU2VydmljbyBkYSBIb3JhIChEU0gpLAotIwk8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ISVNUSFYuaHRtIj4KLSMJSGlzdG9yeSBvZiBTdW1tZXIgVGltZQotIwk8L2E+ICgxOTk4LTA5LTIxLCBpbiBQb3J0dWd1ZXNlKQotCi0jCi0jIEkgaW52ZW50ZWQgdGhlIGFiYnJldmlhdGlvbnMgbWFya2VkIGAqJyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOwotIyB0aGUgcmVzdCBhcmUgZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoaXMgZmlsZSwgb3IgZnJvbSBvdGhlciBzb3VyY2VzLgotIyBDb3JyZWN0aW9ucyBhcmUgd2VsY29tZSEKLSMgICAgICAgICAgICAgICAgICAgc3RkIGRzdCAgMmRzdAotIyAgICAgICAgICAgICAgICAgICBMTVQgICAgICAgICAgIExvY2FsIE1lYW4gVGltZQotIyAgICAgICAtNDowMCAgICAgICBBU1QgQURUICAgICAgIEF0bGFudGljCi0jICAgICAgIC0zOjAwICAgICAgIFdHVCBXR1NUICAgICAgV2VzdGVybiBHcmVlbmxhbmQqCi0jICAgICAgIC0xOjAwICAgICAgIEVHVCBFR1NUICAgICAgRWFzdGVybiBHcmVlbmxhbmQqCi0jICAgICAgICAwOjAwICAgICAgIEdNVCBCU1QgIEJEU1QgR3JlZW53aWNoLCBCcml0aXNoIFN1bW1lcgotIyAgICAgICAgMDowMCAgICAgICBHTVQgSVNUICAgICAgIEdyZWVud2ljaCwgSXJpc2ggU3VtbWVyCi0jICAgICAgICAwOjAwICAgICAgIFdFVCBXRVNUIFdFTVQgV2VzdGVybiBFdXJvcGUKLSMgICAgICAgIDA6MTk6MzIuMTMgQU1UIE5TVCAgICAgICBBbXN0ZXJkYW0sIE5ldGhlcmxhbmRzIFN1bW1lciAoMTgzNS0xOTM3KSoKLSMgICAgICAgIDA6MjAgICAgICAgTkVUIE5FU1QgICAgICBOZXRoZXJsYW5kcyAoMTkzNy0xOTQwKSoKLSMgICAgICAgIDE6MDAgICAgICAgQ0VUIENFU1QgQ0VNVCBDZW50cmFsIEV1cm9wZQotIyAgICAgICAgMTowMDoxNCAgICBTRVQgICAgICAgICAgIFN3ZWRpc2ggKDE4NzktMTg5OSkqCi0jICAgICAgICAyOjAwICAgICAgIEVFVCBFRVNUICAgICAgRWFzdGVybiBFdXJvcGUKLSMgICAgICAgIDM6MDAgICAgICAgTVNLIE1TRCAgICAgICBNb3Njb3cKLSMKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzLCBlc3BlY2lhbGx5IGluIEJyaXRhaW4sCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgotCi0jIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk0LTEyLTA0KSwKLSMgVGhlIG9yaWdpbmFsIHNpeCBbRVUgbWVtYmVyc106IEJlbGdpdW0sIEZyYW5jZSwgKFdlc3QpIEdlcm1hbnksIEl0YWx5LAotIyBMdXhlbWJvdXJnLCB0aGUgTmV0aGVybGFuZHMuCi0jIFBsdXMsIGZyb20gMSBKYW4gNzM6IERlbm1hcmssIElyZWxhbmQsIFVuaXRlZCBLaW5nZG9tLgotIyBQbHVzLCBmcm9tIDEgSmFuIDgxOiBHcmVlY2UuCi0jIFBsdXMsIGZyb20gMSBKYW4gODY6IFNwYWluLCBQb3J0dWdhbC4KLSMgUGx1cywgZnJvbSAxIEphbiA5NTogQXVzdHJpYSwgRmlubGFuZCwgU3dlZGVuLiAoTm9yd2F5IG5lZ290aWF0ZWQgdGVybXMgZm9yCi0jIGVudHJ5IGJ1dCBpbiBhIHJlZmVyZW5kdW0gb24gMjggTm92IDk0IHRoZSBwZW9wbGUgdm90ZWQgTm8gYnkgNTIuMiUgdG8gNDcuOCUKLSMgb24gYSB0dXJub3V0IG9mIDg4LjYlLiBUaGlzIHdhcyBhbG1vc3QgdGhlIHNhbWUgcmVzdWx0IGFzIE5vcndheSdzIHByZXZpb3VzCi0jIHJlZmVyZW5kdW0gaW4gMTk3MiwgdGhleSBhcmUgdGhlIG9ubHkgY291bnRyeSB0byBoYXZlIHNhaWQgTm8gdHdpY2UuCi0jIFJlZmVyZW5kdW1zIGluIHRoZSBvdGhlciB0aHJlZSBjb3VudHJpZXMgdm90ZWQgWWVzLikKLSMgLi4uCi0jIEVzdG9uaWEgLi4uIHVzZXMgRVUgZGF0ZXMgYnV0IG5vdCBhdCAwMTowMCBHTVQsIHRoZXkgdXNlIG1pZG5pZ2h0IEdNVC4KLSMgSSBkb24ndCB0aGluayB0aGV5IGtub3cgeWV0IHdoYXQgdGhleSB3aWxsIGRvIGZyb20gMTk5NiBvbndhcmRzLgotIyAuLi4KLSMgVGhlcmUgc2hvdWxkbid0IGJlIGFueSBbY3VycmVudCBtZW1iZXJzIHdobyBhcmUgbm90IHVzaW5nIEVVIHJ1bGVzXS4KLSMgQSBEaXJlY3RpdmUgaGFzIHRoZSBmb3JjZSBvZiBsYXcsIG1lbWJlciBzdGF0ZXMgYXJlIG9ibGlnZWQgdG8gZW5hY3QKLSMgbmF0aW9uYWwgbGF3IHRvIGltcGxlbWVudCBpdC4gVGhlIG9ubHkgY29udGVudGlvdXMgaXNzdWUgd2FzIHRoZQotIyBkaWZmZXJlbnQgZW5kIGRhdGUgZm9yIHRoZSBVSyBhbmQgSXJlbGFuZCwgYW5kIHRoaXMgd2FzIGFsd2F5cyBhbGxvd2VkCi0jIGluIHRoZSBEaXJlY3RpdmUuCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEJyaXRhaW4gKFVuaXRlZCBLaW5nZG9tKSBhbmQgSXJlbGFuZCAoRWlyZSkKLQotIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5NC0wNy0wNik6Ci0jCi0jIE9uIDE3IEphbiAxOTk0IHRoZSBJbmRlcGVuZGVudCwgYSBVSyBxdWFsaXR5IG5ld3NwYXBlciwgaGFkIGEgcGllY2UgYWJvdXQKLSMgaGlzdG9yaWNhbCB2aXN0YXMgYWxvbmcgdGhlIFRoYW1lcyBpbiB3ZXN0IExvbmRvbi4gVGhlcmUgd2FzIGEgcGhvdG8KLSMgYW5kIGEgc2tldGNoIG1hcCBzaG93aW5nIHNvbWUgb2YgdGhlIHNpZ2h0bGluZXMgaW52b2x2ZWQuIE9uZSBwYXJhZ3JhcGgKLSMgb2YgdGhlIHRleHQgc2FpZDoKLSMKLSMgYEFuIG9sZCBzdG9uZSBvYmVsaXNrIG1hcmtpbmcgYSBmb3Jnb3R0ZW4gdGVycmVzdHJpYWwgbWVyaWRpYW4gc3RhbmRzCi0jIGJlc2lkZSB0aGUgcml2ZXIgYXQgS2V3LiBJbiB0aGUgMTh0aCBjZW50dXJ5LCBiZWZvcmUgdGltZSBhbmQgbG9uZ2l0dWRlCi0jIHdhcyBzdGFuZGFyZGlzZWQgYnkgdGhlIFJveWFsIE9ic2VydmF0b3J5IGluIEdyZWVud2ljaCwgc2Nob2xhcnMgb2JzZXJ2ZWQKLSMgdGhpcyBzdG9uZSBhbmQgdGhlIG1vdmVtZW50IG9mIHN0YXJzIGZyb20gS2V3IE9ic2VydmF0b3J5IG5lYXJieS4gVGhleQotIyBtYWRlIHRoZWlyIGNhbGN1bGF0aW9ucyBhbmQgc2V0IHRoZSB0aW1lIGZvciB0aGUgSG9yc2UgR3VhcmRzIGFuZCBQYXJsaWFtZW50LAotIyBidXQgbm93IHRoZSBzdG9uZSBpcyBvYnNjdXJlZCBieSBzY3J1Yndvb2QgYW5kIGNhbiBvbmx5IGJlIHNlZW4gYnkgd2Fsa2luZwotIyBhbG9uZyB0aGUgdG93cGF0aCB3aXRoaW4gYSBmZXcgeWFyZHMgb2YgaXQuJwotIwotIyBJIGhhdmUgYSBvbmUgaW5jaCB0byBvbmUgbWlsZSBtYXAgb2YgTG9uZG9uIGFuZCBteSBlc3RpbWF0ZSBvZiB0aGUgc3RvbmUncwotIyBwb3NpdGlvbiBpcyA1MSBkZWcuIDI4JyAzMCIgTiwgMCBkZWcuIDE4JyA0NSIgVy4gVGhlIGxvbmdpdHVkZSBzaG91bGQKLSMgYmUgd2l0aGluIGFib3V0ICstMiIuIFRoZSBPcmRuYW5jZSBTdXJ2ZXkgZ3JpZCByZWZlcmVuY2UgaXMgVFExNzI3NjEuCi0jCi0jIFtUaGlzIHlpZWxkcyBHTVRPRkYgPSAtMDowMToxNSBmb3IgTG9uZG9uIExNVCBpbiB0aGUgMTh0aCBjZW50dXJ5Ll0KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTkzLTExLTE4KToKLSMKLSMgSG93c2Ugd3JpdGVzIHRoYXQgQnJpdGFpbiB3YXMgdGhlIGZpcnN0IGNvdW50cnkgdG8gdXNlIHN0YW5kYXJkIHRpbWUuCi0jIFRoZSByYWlsd2F5cyBjYXJlZCBtb3N0IGFib3V0IHRoZSBpbmNvbnNpc3RlbmNpZXMgb2YgbG9jYWwgbWVhbiB0aW1lLAotIyBhbmQgaXQgd2FzIHRoZXkgd2hvIGZvcmNlZCBhIHVuaWZvcm0gdGltZSBvbiB0aGUgY291bnRyeS4KLSMgVGhlIG9yaWdpbmFsIGlkZWEgd2FzIGNyZWRpdGVkIHRvIERyLiBXaWxsaWFtIEh5ZGUgV29sbGFzdG9uICgxNzY2LTE4MjgpCi0jIGFuZCB3YXMgcG9wdWxhcml6ZWQgYnkgQWJyYWhhbSBGb2xsZXR0IE9zbGVyICgxODA4LTE5MDMpLgotIyBUaGUgZmlyc3QgcmFpbHdheSB0byBhZG9wdCBMb25kb24gdGltZSB3YXMgdGhlIEdyZWF0IFdlc3Rlcm4gUmFpbHdheQotIyBpbiBOb3ZlbWJlciAxODQwOyBvdGhlciByYWlsd2F5cyBmb2xsb3dlZCBzdWl0LCBhbmQgYnkgMTg0NyBtb3N0Ci0jICh0aG91Z2ggbm90IGFsbCkgcmFpbHdheXMgdXNlZCBMb25kb24gdGltZS4gIE9uIDE4NDctMDktMjIgdGhlCi0jIFJhaWx3YXkgQ2xlYXJpbmcgSG91c2UsIGFuIGluZHVzdHJ5IHN0YW5kYXJkcyBib2R5LCByZWNvbW1lbmRlZCB0aGF0IEdNVCBiZQotIyBhZG9wdGVkIGF0IGFsbCBzdGF0aW9ucyBhcyBzb29uIGFzIHRoZSBHZW5lcmFsIFBvc3QgT2ZmaWNlIHBlcm1pdHRlZCBpdC4KLSMgVGhlIHRyYW5zaXRpb24gb2NjdXJyZWQgb24gMTItMDEgZm9yIHRoZSBMJk5XLCB0aGUgQ2FsZWRvbmlhbiwKLSMgYW5kIHByZXN1bWFibHkgb3RoZXIgcmFpbHdheXM7IHRoZSBKYW51YXJ5IDE4NDggQnJhZHNoYXcncyBsaXN0cyBtYW55Ci0jIHJhaWx3YXlzIGFzIHVzaW5nIEdNVC4gIEJ5IDE4NTUgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcHVibGljCi0jIGNsb2NrcyBpbiBCcml0YWluIHdlcmUgc2V0IHRvIEdNVCAodGhvdWdoIHNvbWUsIGxpa2UgdGhlIGdyZWF0IGNsb2NrCi0jIG9uIFRvbSBUb3dlciBhdCBDaHJpc3QgQ2h1cmNoLCBPeGZvcmQsIHdlcmUgZml0dGVkIHdpdGggdHdvIG1pbnV0ZSBoYW5kcywKLSMgb25lIGZvciBsb2NhbCB0aW1lIGFuZCBvbmUgZm9yIEdNVCkuICBUaGUgbGFzdCBtYWpvciBob2xkb3V0IHdhcyB0aGUgbGVnYWwKLSMgc3lzdGVtLCB3aGljaCBzdHViYm9ybmx5IHN0dWNrIHRvIGxvY2FsIHRpbWUgZm9yIG1hbnkgeWVhcnMsIGxlYWRpbmcKLSMgdG8gb2RkaXRpZXMgbGlrZSBwb2xscyBvcGVuaW5nIGF0IDA4OjEzIGFuZCBjbG9zaW5nIGF0IDE2OjEzLgotIyBUaGUgbGVnYWwgc3lzdGVtIGZpbmFsbHkgc3dpdGNoZWQgdG8gR01UIHdoZW4gdGhlIFN0YXR1dGVzIChEZWZpbml0aW9uCi0jIG9mIFRpbWUpIEFjdCB0b29rIGVmZmVjdDsgaXQgcmVjZWl2ZWQgdGhlIFJveWFsIEFzc2VudCBvbiAxODgwLTA4LTAyLgotIwotIyBJbiB0aGUgdGFibGVzIGJlbG93LCB3ZSBjb25kZW5zZSB0aGlzIGNvbXBsaWNhdGVkIHN0b3J5IGludG8gYSBzaW5nbGUKLSMgdHJhbnNpdGlvbiBkYXRlIGZvciBMb25kb24sIG5hbWVseSAxODQ3LTEyLTAxLiAgV2UgZG9uJ3Qga25vdyBhcyBtdWNoCi0jIGFib3V0IER1Ymxpbiwgc28gd2UgdXNlIDE4ODAtMDgtMDIsIHRoZSBsZWdhbCB0cmFuc2l0aW9uIHRpbWUuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wOS0yNyk6Ci0jIFN1bW1lciBUaW1lIHdhcyBmaXJzdCBzZXJpb3VzbHkgcHJvcG9zZWQgYnkgV2lsbGlhbSBXaWxsZXR0ICgxODU3LTE5MTUpLAotIyBhIExvbmRvbiBidWlsZGVyIGFuZCBtZW1iZXIgb2YgdGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5Ci0jIHdobyBjaXJjdWxhdGVkIGEgcGFtcGhsZXQgYGBUaGUgV2FzdGUgb2YgRGF5bGlnaHQnJyAoMTkwNykKLSMgdGhhdCBwcm9wb3NlZCBhZHZhbmNpbmcgY2xvY2tzIDIwIG1pbnV0ZXMgb24gZWFjaCBvZiBmb3VyIFN1bmRheXMgaW4gQXByaWwsCi0jIGFuZCByZXRhcmRpbmcgdGhlbSBieSB0aGUgc2FtZSBhbW91bnQgb24gZm91ciBTdW5kYXlzIGluIFNlcHRlbWJlci4KLSMgQSBiaWxsIHdhcyBkcmFmdGVkIGluIDE5MDkgYW5kIGludHJvZHVjZWQgaW4gUGFybGlhbWVudCBzZXZlcmFsIHRpbWVzLAotIyBidXQgaXQgbWV0IHdpdGggcmlkaWN1bGUgYW5kIG9wcG9zaXRpb24sIGVzcGVjaWFsbHkgZnJvbSBmYXJtaW5nIGludGVyZXN0cy4KLSMgTGF0ZXIgZWRpdGlvbnMgb2YgdGhlIHBhbXBobGV0IHByb3Bvc2VkIG9uZS1ob3VyIHN1bW1lciB0aW1lLCBhbmQKLSMgaXQgd2FzIGV2ZW50dWFsbHkgYWRvcHRlZCBhcyBhIHdhcnRpbWUgbWVhc3VyZSBpbiAxOTE2LgotIyBTZWU6IFN1bW1lciBUaW1lIEFycml2ZXMgRWFybHksIFRoZSBUaW1lcyAoMjAwMC0wNS0xOCkuCi0jIEEgbW9udW1lbnQgdG8gV2lsbGV0dCB3YXMgdW52ZWlsZWQgb24gMTkyNy0wNS0yMSwgaW4gYW4gb3BlbiBzcGFjZSBpbgotIyBhIDQ1LWFjcmUgd29vZCBuZWFyIENoaXNsZWh1cnN0LCBLZW50IHRoYXQgd2FzIHB1cmNoYXNlZCBieSBwb3B1bGFyCi0jIHN1YnNjcmlwdGlvbiBhbmQgb3BlbiB0byB0aGUgcHVibGljLiAgT24gdGhlIHNvdXRoIGZhY2Ugb2YgdGhlIG1vbm9saXRoLAotIyBkZXNpZ25lZCBieSBHLiBXLiBNaWxsZXIsIGlzIHRoZSB0aGUgV2lsbGlhbSBXaWxsZXR0IE1lbW9yaWFsIFN1bmRpYWwsCi0jIHdoaWNoIGlzIHBlcm1hbmVudGx5IHNldCB0byBTdW1tZXIgVGltZS4KLQotIyBGcm9tIFdpbnN0b24gQ2h1cmNoaWxsICgxOTM0LTA0LTI4KToKLSMgSXQgaXMgb25lIG9mIHRoZSBwYXJhZG94ZXMgb2YgaGlzdG9yeSB0aGF0IHdlIHNob3VsZCBvd2UgdGhlIGJvb24gb2YKLSMgc3VtbWVyIHRpbWUsIHdoaWNoIGdpdmVzIGV2ZXJ5IHllYXIgdG8gdGhlIHBlb3BsZSBvZiB0aGlzIGNvdW50cnkKLSMgYmV0d2VlbiAxNjAgYW5kIDE3MCBob3VycyBtb3JlIGRheWxpZ2h0IGxlaXN1cmUsIHRvIGEgd2FyIHdoaWNoCi0jIHBsdW5nZWQgRXVyb3BlIGludG8gZGFya25lc3MgZm9yIGZvdXIgeWVhcnMsIGFuZCBzaG9vayB0aGUKLSMgZm91bmRhdGlvbnMgb2YgY2l2aWxpemF0aW9uIHRocm91Z2hvdXQgdGhlIHdvcmxkLgotIwktLSA8YSBocmVmPSJodHRwOi8vd3d3LndpbnN0b25jaHVyY2hpbGwub3JnL2ZoMTE0d2lsbGV0dC5odG0iPgotIwkiQSBTaWxlbnQgVG9hc3QgdG8gV2lsbGlhbSBXaWxsZXR0IiwgUGljdG9yaWFsIFdlZWtseQotIwk8L2E+Ci0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wOS0wMyk6Ci0jIFRoZSBPRUQgU3VwcGxlbWVudCBzYXlzIHRoYXQgdGhlIEVuZ2xpc2ggb3JpZ2luYWxseSBzYWlkIGBgRGF5bGlnaHQgU2F2aW5nJycKLSMgd2hlbiB0aGV5IHdlcmUgZGViYXRpbmcgdGhlIGFkb3B0aW9uIG9mIERTVCBpbiAxOTA4OyBidXQgYnkgMTkxNiB0aGlzCi0jIHRlcm0gYXBwZWFycyBvbmx5IGluIHF1b3RlcyB0YWtlbiBmcm9tIERTVCdzIG9wcG9uZW50cywgd2hlcmVhcyB0aGUKLSMgcHJvcG9uZW50cyAod2hvIGV2ZW50dWFsbHkgd29uIHRoZSBhcmd1bWVudCkgYXJlIHF1b3RlZCBhcyB1c2luZyBgYFN1bW1lcicnLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTg5LTAxLTE5KToKLSMKLSMgQSBzb3VyY2UgYXQgdGhlIEJyaXRpc2ggSW5mb3JtYXRpb24gT2ZmaWNlIGluIE5ldyBZb3JrIGF2ZXJzIHRoYXQgaXQncwotIyBrbm93biBhcyAiQnJpdGlzaCIgU3VtbWVyIFRpbWUgaW4gYWxsIHBhcnRzIG9mIHRoZSBVbml0ZWQgS2luZ2RvbS4KLQotIyBEYXRlOiA0IEphbiA4OSAwODo1NzoyNSBHTVQgKFdlZCkKLSMgRnJvbTogSm9uYXRoYW4gTGVmZmxlcgotIyBbQnJpdGlzaCBTdW1tZXIgVGltZV0gaXMgZml4ZWQgYW5udWFsbHkgYnkgQWN0IG9mIFBhcmxpYW1lbnQuCi0jIElmIHlvdSBjYW4gcHJlZGljdCB3aGF0IFBhcmxpYW1lbnQgd2lsbCBkbywgeW91IHNob3VsZCBiZSBpbgotIyBwb2xpdGljcyBtYWtpbmcgYSBmb3J0dW5lLCBub3QgY29tcHV0aW5nLgotCi0jIEZyb20gQ2hyaXMgQ2FycmllciAoMTk5Ni0wNi0xNCk6Ci0jIEkgcmVtZW1iZXIgcmVhZGluZyBpbiB2YXJpb3VzIHdhcnRpbWUgaXNzdWVzIG9mIHRoZSBMb25kb24gVGltZXMgdGhlCi0jIGFjcm9ueW0gQkRTVCBmb3IgQnJpdGlzaCBEb3VibGUgU3VtbWVyIFRpbWUuICBMb29rIGZvciB0aGUgcHVibGlzaGVkCi0jIHRpbWUgb2Ygc3VucmlzZSBhbmQgc3Vuc2V0IGluIFRoZSBUaW1lcywgd2hlbiBCRFNUIHdhcyBpbiBlZmZlY3QsIGFuZAotIyBpZiB5b3UgZmluZCBhIHpvbmUgcmVmZXJlbmNlIGl0IHdpbGwgc2F5LCAiQWxsIHRpbWVzIEIuRC5TLlQuIgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgxOTk5LTA5LTAyKToKLSMgLi4uIHNvbWUgbWlsaXRhcnkgY2FibGVzIChXTyAyMTkvNDEwMCAtIHRoaXMgaXMgYSBjb3B5IGZyb20gdGhlCi0jIG1haW4gU0hBRUYgYXJjaGl2ZXMgaGVsZCBpbiB0aGUgVVMgTmF0aW9uYWwgQXJjaGl2ZXMsIFNIQUVGLzUyNTIvOC81MTYpCi0jIGFncmVlIHRoYXQgdGhlIHVzYWdlIGlzIEJEU1QgKHRoaXMgYXBwZWFycyBpbiBhIG1lc3NhZ2UgZGF0ZWQgMTcgRmViIDE5NDUpLgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgyMDAwLTEwLTAzKToKLSMgT24gMTh0aCBBcHJpbCAxOTQxLCBTaXIgU3RlcGhlbiBUYWxsZW50cyBvZiB0aGUgQkJDIHdyb3RlIHRvIFNpcgotIyBBbGV4YW5kZXIgTWF4d2VsbCBvZiB0aGUgSG9tZSBPZmZpY2UgYXNraW5nIHdoZXRoZXIgdGhlcmUgd2FzIGFueQotIyBvZmZpY2lhbCBkZXNpZ25hdGlvbjsgdGhlIHJlcGx5IG9mIHRoZSAyMXN0IHdhcyB0aGF0IHRoZXJlIHdhc24ndAotIyBidXQgaGUgY291bGRuJ3QgdGhpbmsgb2YgYW55dGhpbmcgYmV0dGVyIHRoYW4gdGhlICJEb3VibGUgQnJpdGlzaAotIyBTdW1tZXIgVGltZSIgdGhhdCB0aGUgQkJDIGhhZCBiZWVuIHVzaW5nIGluZm9ybWFsbHkuCi0jIGh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvYmJjLTE5NDEwNDE4LnBuZwotIyBodHRwOi8vc3R1ZGVudC5jdXN1LmNhbS5hYy51ay9+anNtMjgvYnJpdGlzaC10aW1lL2hvLTE5NDEwNDIxLnBuZwotCi0jIEZyb20gU2lyIEFsZXhhbmRlciBNYXh3ZWxsIGluIHRoZSBhYm92ZS1tZW50aW9uZWQgbGV0dGVyICgxOTQxLTA0LTIxKToKLSMgW05dbyBvZmZpY2lhbCBkZXNpZ25hdGlvbiBoYXMgYXMgZmFyIGFzIEkga25vdyBiZWVuIGFkb3B0ZWQgZm9yIHRoZSB0aW1lCi0jIHdoaWNoIGlzIHRvIGJlIGludHJvZHVjZWQgaW4gTWF5Li4uLgotIyBJIGNhbm5vdCB0aGluayBvZiBhbnl0aGluZyBiZXR0ZXIgdGhhbiAiRG91YmxlIEJyaXRpc2ggU3VtbWVyIFRpbWUiCi0jIHdoaWNoIGNvdWxkIG5vdCBiZSBzYWlkIHRvIHJ1biBjb3VudGVyIHRvIGFueSBvZmZpY2lhbCBkZXNjcmlwdGlvbi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTEwLTAyKToKLSMgSG93c2Ugd3JpdGVzIChwIDE1NykgYERCU1QnIHRvbywgYnV0IGBCRFNUJyBzZWVtcyB0byBoYXZlIGJlZW4gY29tbW9uCi0jIGFuZCBmb2xsb3dzIHRoZSBtb3JlIHVzdWFsIGNvbnZlbnRpb24gb2YgcHV0dGluZyB0aGUgbG9jYXRpb24gbmFtZSBmaXJzdCwKLSMgc28gd2UgdXNlIGBCRFNUJy4KLQotIyBQZXRlciBJbGlldmUgKDE5OTgtMDQtMTkpIGRlc2NyaWJlZCBhdCBsZW5ndGgKLSMgdGhlIGhpc3Rvcnkgb2Ygc3VtbWVyIHRpbWUgbGVnaXNsYXRpb24gaW4gdGhlIFVuaXRlZCBLaW5nZG9tLgotIyBTaW5jZSAxOTk4IEpvc2VwaCBTLiBNeWVycyBoYXMgYmVlbiB1cGRhdGluZwotIyBhbmQgZXh0ZW5kaW5nIHRoaXMgbGlzdCwgd2hpY2ggY2FuIGJlIGZvdW5kIGluCi0jIDxhIGhyZWY9Imh0dHA6Ly9zdHVkZW50LmN1c3UuY2FtLmFjLnVrL35qc20yOC9icml0aXNoLXRpbWUvIj4KLSMgSGlzdG9yeSBvZiBsZWdhbCB0aW1lIGluIEJyaXRhaW4KLSMgPC9hPgotCi0jIEZyb20gSm9zZXBoIFMuIE15ZXJzICgxOTk4LTAxLTA2KToKLSMKLSMgVGhlIGxlZ2FsIHRpbWUgaW4gdGhlIFVLIG91dHNpZGUgb2Ygc3VtbWVyIHRpbWUgaXMgZGVmaW5pdGVseSBHTVQsIG5vdCBVVEM7Ci0jIHNlZSBMb3JkIFRhbmxhdydzIHNwZWVjaAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxpYW1lbnQudGhlLXN0YXRpb25lcnktb2ZmaWNlLmNvLnVrL3BhL2xkMTk5Njk3L2xkaGFuc3JkL3Bkdm4vbGRzOTcvdGV4dC83MDYxMS0yMC5odG0jNzA2MTEtMjBfaGVhZDAiPgotIyAoTG9yZHMgSGFuc2FyZCAxMSBKdW5lIDE5OTcgY29sdW1ucyA5NjQgdG8gOTc2KQotIyA8L2E+LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIwotIyBGb3IgbGFjayBvZiBvdGhlciBkYXRhLCBmb2xsb3cgU2hhbmtzICYgUG90dGVuZ2VyIGZvciBFaXJlIGluIDE5NDAtMTk0OC4KLSMKLSMgR2l2ZW4gSWxpZXZlIGFuZCBNeWVycydzIGRhdGEsIHRoZSBmb2xsb3dpbmcgY2xhaW1zIGJ5IFNoYW5rcyAmIFBvdHRlbmdlcgotIyBhcmUgaW5jb3JyZWN0OgotIyAgICAgKiBXYWxlcyBkaWQgbm90IHN3aXRjaCBmcm9tIEdNVCB0byBkYXlsaWdodCBzYXZpbmcgdGltZSB1bnRpbAotIwkxOTIxIEFwciAzLCB3aGVuIHRoZXkgYmVnYW4gdG8gY29uZm9ybSB3aXRoIHRoZSByZXN0IG9mIEdyZWF0IEJyaXRhaW4uCi0jIEFjdHVhbGx5LCBXYWxlcyB3YXMgaWRlbnRpY2FsIGFmdGVyIDE4ODAuCi0jICAgICAqIEVpcmUgaGFkIHR3byB0cmFuc2l0aW9ucyBvbiAxOTE2IE9jdCAxLgotIyBJdCBhY3R1YWxseSBqdXN0IGhhZCBvbmUgdHJhbnNpdGlvbi4KLSMgICAgICogTm9ydGhlcm4gSXJlbGFuZCB1c2VkIHNpbmdsZSBkYXlsaWdodCBzYXZpbmcgdGltZSB0aHJvdWdob3V0IFdXIElJLgotIyBBY3R1YWxseSwgaXQgY29uZm9ybWVkIHRvIEJyaXRhaW4uCi0jICAgICAqIEdCLUVpcmUgY2hhbmdlZCBzdGFuZGFyZCB0aW1lIHRvIDEgaG91ciBhaGVhZCBvZiBHTVQgb24gMTk2OC0wMi0xOC4KLSMgQWN0dWFsbHksIHRoYXQgZGF0ZSBzYXcgdGhlIHVzdWFsIHN3aXRjaCB0byBzdW1tZXIgdGltZS4KLSMgU3RhbmRhcmQgdGltZSB3YXMgbm90IGNoYW5nZWQgdW50aWwgMTk2OC0xMC0yNyAodGhlIGNsb2NrcyBkaWRuJ3QgY2hhbmdlKS4KLSMKLSMgSGVyZSBpcyBhbm90aGVyIGluY29ycmVjdCBjbGFpbSBieSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jICAgICAqIEplcnNleSwgR3Vlcm5zZXksIGFuZCB0aGUgSXNsZSBvZiBNYW4gZGlkIG5vdCBzd2l0Y2ggZnJvbSBHTVQKLSMJdG8gZGF5bGlnaHQgc2F2aW5nIHRpbWUgdW50aWwgMTkyMSBBcHIgMywgd2hlbiB0aGV5IGJlZ2FuIHRvCi0jCWNvbmZvcm0gd2l0aCBHcmVhdCBCcml0YWluLgotIyBTLlIuJk8uIDE5MTYsIE5vLiAzODIgYW5kIEhPIDQ1LzEwODExLzMxMjM2NCAocXVvdGVkIGFib3ZlKSBzYXkgb3RoZXJ3aXNlLgotIwotIyBUaGUgZm9sbG93aW5nIGNsYWltIGJ5IFNoYW5rcyAmIFBvdHRlbmdlciBpcyBwb3NzaWJsZSB0aG91Z2ggZG91YnRmdWw7Ci0jIHdlJ2xsIGlnbm9yZSBpdCBmb3Igbm93LgotIyAgICAgKiBEdWJsaW4ncyAxOTcxLTEwLTMxIHN3aXRjaCB3YXMgYXQgMDI6MDAsIGV2ZW4gdGhvdWdoIExvbmRvbidzIHdhcyAwMzowMC4KLSMKLSMKLSMgV2hpdG1hbiBzYXlzIER1YmxpbiBNZWFuIFRpbWUgd2FzIC0wOjI1OjIxLCB3aGljaCBpcyBtb3JlIHByZWNpc2UgdGhhbgotIyBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jIFBlcmhhcHMgdGhpcyB3YXMgRHVuc2luayBPYnNlcnZhdG9yeSBUaW1lLCBhcyBEdW5zaW5rIE9ic2VydmF0b3J5Ci0jICg4IGttIE5XIG9mIER1YmxpbidzIGNlbnRlcikgc2VlbWluZ2x5IHdhcyB0byBEdWJsaW4gYXMgR3JlZW53aWNoIHdhcwotIyB0byBMb25kb24uICBGb3IgZXhhbXBsZToKLSMKLSMgICAiVGltZWJhbGwgb24gdGhlIGJhbGxhc3Qgb2ZmaWNlIGlzIGRvd24uICBEdW5zaW5rIHRpbWUuIgotIyAgIC0tIEphbWVzIEpveWNlLCBVbHlzc2VzCi0KLSMgRnJvbSBKb3NlcGggUy4gTXllcnMgKDIwMDUtMDEtMjYpOgotIyBJcmlzaCBsYXdzIGFyZSBhdmFpbGFibGUgb25saW5lIGF0IHd3dy5pcmlzaHN0YXR1dGVib29rLmllLiAgVGhlc2UgaW5jbHVkZQotIyB2YXJpb3VzIHJlbGF0aW5nIHRvIGxlZ2FsIHRpbWUsIGZvciBleGFtcGxlOgotIwotIyBaWkExM1kxOTIzLmh0bWwgWlpBMTJZMTkyNC5odG1sIFpaQThZMTkyNS5odG1sIFpaU0lWMjBQRzEyNjcuaHRtbAotIwotIyBaWlNJNzFZMTk0Ny5odG1sIFpaU0kxMjhZMTk0OC5odG1sIFpaU0kyM1kxOTQ5Lmh0bWwgWlpTSTQxWTE5NTAuaHRtbAotIyBaWlNJMjdZMTk1MS5odG1sIFpaU0k3M1kxOTUyLmh0bWwKLSMKLSMgWlpTSTExWTE5NjEuaHRtbCBaWlNJMjMyWTE5NjEuaHRtbCBaWlNJMTgyWTE5NjIuaHRtbAotIyBaWlNJMTY3WTE5NjMuaHRtbCBaWlNJMjU3WTE5NjQuaHRtbCBaWlNJMTk4WTE5NjcuaHRtbAotIyBaWkEyM1kxOTY4Lmh0bWwgWlpBMTdZMTk3MS5odG1sCi0jCi0jIFpaU0k2N1kxOTgxLmh0bWwgWlpTSTIxMlkxOTgyLmh0bWwgWlpTSTQ1WTE5ODYuaHRtbAotIyBaWlNJMjY0WTE5ODguaHRtbCBaWlNJNTJZMTk5MC5odG1sIFpaU0kzNzFZMTk5Mi5odG1sCi0jIFpaU0kzOTVZMTk5NC5odG1sIFpaU0k0ODRZMTk5Ny5odG1sIFpaU0k1MDZZMjAwMS5odG1sCi0jCi0jIFtUaGVzZSBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZSByb290LCBlLmcuLCB0aGUgZmlyc3QgaXMKLSMgPGh0dHA6Ly93d3cuaXJpc2hzdGF0dXRlYm9vay5pZS9aWkExM1kxOTIzLmh0bWw+Ll0KLSMKLSMgKFRoZXNlIGFyZSB0aG9zZSBJIGZvdW5kLCBidXQgdGhlcmUgY291bGQgYmUgbW9yZS4gIEluIGFueSBjYXNlIHRoZXNlCi0jIHNob3VsZCBhbGxvdyB2YXJpb3VzIHVwZGF0ZXMgdG8gdGhlIGNvbW1lbnRzIGluIHRoZSBldXJvcGUgZmlsZSB0byBjb3ZlcgotIyB0aGUgbGF3cyBhcHBsaWNhYmxlIGluIElyZWxhbmQuKQotIwotIyAoTm90ZSB0aGF0IHRoZSB0aW1lIGluIHRoZSBSZXB1YmxpYyBvZiBJcmVsYW5kIHNpbmNlIDE5NjggaGFzIGJlZW4gZGVmaW5lZAotIyBpbiB0ZXJtcyBvZiBzdGFuZGFyZCB0aW1lIGJlaW5nIEdNVCsxIHdpdGggYSBwZXJpb2Qgb2Ygd2ludGVyIHRpbWUgd2hlbiBpdAotIyBpcyBHTVQsIHJhdGhlciB0aGFuIHN0YW5kYXJkIHRpbWUgYmVpbmcgR01UIHdpdGggYSBwZXJpb2Qgb2Ygc3VtbWVyIHRpbWUKLSMgYmVpbmcgR01UKzEuKQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMjgpOgotIyBDbGl2ZSBGZWF0aGVyICg8bmV3czo4NTk4NDU3MDYuMjYwNDMuMEBvZmZpY2UuZGVtb24ubmV0PiwgMTk5Ny0wMy0zMSkKLSMgcmVwb3J0cyB0aGF0IEZvbGtlc3RvbmUgKENoZXJpdG9uKSBTaHV0dGxlIFRlcm1pbmFsIHVzZXMgQ29uY2Vzc2lvbiBUaW1lCi0jIChDVCksIGVxdWl2YWxlbnQgdG8gRnJlbmNoIGNpdmlsIHRpbWUuCi0jIEp1bGlhbiBIaWxsICg8bmV3czozNjExODEyOC41QTE0QHZpcmdpbi5uZXQ+LCAxOTk4LTA5LTMwKSByZXBvcnRzIHRoYXQKLSMgdHJhaW5zIGJldHdlZW4gRG9sbGFuZHMgTW9vciAodGhlIGZyZWlnaHQgZmFjaWxpdHkgbmV4dCBkb29yKQotIyBhbmQgRnJldGh1biBydW4gaW4gQ1QuCi0jIE15IGFkbWl0dGVkbHkgdW5pbmZvcm1lZCBndWVzcyBpcyB0aGF0IHRoZSB0ZXJtaW5hbCBoYXMgdHdvIGF1dGhvcml0aWVzLAotIyB0aGUgRnJlbmNoIGNvbmNlc3Npb24gb3BlcmF0b3JzIGFuZCB0aGUgQnJpdGlzaCBjaXZpbCBhdXRob3JpdGllcywKLSMgYW5kIHRoYXQgdGhlIHRpbWUgZGVwZW5kcyBvbiB3aG8geW91J3JlIHRhbGtpbmcgdG8uCi0jIElmLCBzYXksIHRoZSBCcml0aXNoIHBvbGljZSB3ZXJlIGNhbGxlZCB0byB0aGUgc3RhdGlvbiBmb3Igc29tZSByZWFzb24sCi0jIEkgd291bGQgZXhwZWN0IHRoZSBvZmZpY2lhbCBwb2xpY2UgcmVwb3J0IHRvIHVzZSBHTVQvQlNUIGFuZCBub3QgQ0VUL0NFU1QuCi0jIFRoaXMgaXMgYSBib3JkZXJsaW5lIGNhc2UsIGJ1dCBmb3Igbm93IGxldCdzIHN0aWNrIHRvIEdNVC9CU1QuCi0KLSMgRnJvbSBhbiBhbm9ueW1vdXMgY29udHJpYnV0b3IgKDE5OTYtMDYtMDIpOgotIyBUaGUgbGF3IGdvdmVybmluZyB0aW1lIGluIElyZWxhbmQgaXMgdW5kZXIgU3RhdHV0b3J5IEluc3RydW1lbnQgU0kgMzk1Lzk0LAotIyB3aGljaCBnaXZlcyBmb3JjZSB0byBFdXJvcGVhbiBVbmlvbiA3dGggQ291bmNpbCBEaXJlY3RpdmUgIyA5NC8yMS9FQy4KLSMgVW5kZXIgdGhpcyBkaXJlY3RpdmUsIHRoZSBNaW5pc3RlciBmb3IgSnVzdGljZSBpbiBJcmVsYW5kIG1ha2VzIGFwcHJvcHJpYXRlCi0jIHJlZ3VsYXRpb25zLiBJIHNwb2tlIHRoaXMgbW9ybmluZyB3aXRoIHRoZSBTZWNyZXRhcnkgb2YgdGhlIERlcGFydG1lbnQgb2YKLSMgSnVzdGljZSAodGVsICszNTMgMSA2NzggOTcxMSkgd2hvIGNvbmZpcm1lZCB0byBtZSB0aGF0IHRoZSBjb3JyZWN0IG5hbWUgaXMKLSMgIklyaXNoIFN1bW1lciBUaW1lIiwgYWJicmV2aWF0ZWQgdG8gIklTVCIuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIFN1bW1lciBUaW1lIEFjdCwgMTkxNgotUnVsZQlHQi1FaXJlCTE5MTYJb25seQktCU1heQkyMQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MTYJb25seQktCU9jdAkgMQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MTcsIE5vLiAzNTgKLVJ1bGUJR0ItRWlyZQkxOTE3CW9ubHkJLQlBcHIJIDgJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTE3CW9ubHkJLQlTZXAJMTcJMjowMHMJMAlHTVQKLSMgUy5SLiZPLiAxOTE4LCBOby4gMjc0Ci1SdWxlCUdCLUVpcmUJMTkxOAlvbmx5CS0JTWFyCTI0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkxOAlvbmx5CS0JU2VwCTMwCTI6MDBzCTAJR01UCi0jIFMuUi4mTy4gMTkxOSwgTm8uIDI5NwotUnVsZQlHQi1FaXJlCTE5MTkJb25seQktCU1hcgkzMAkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MTkJb25seQktCVNlcAkyOQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MjAsIE5vLiA0NTgKLVJ1bGUJR0ItRWlyZQkxOTIwCW9ubHkJLQlNYXIJMjgJMjowMHMJMTowMAlCU1QKLSMgUy5SLiZPLiAxOTIwLCBOby4gMTg0NAotUnVsZQlHQi1FaXJlCTE5MjAJb25seQktCU9jdAkyNQkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5MjEsIE5vLiAzNjMKLVJ1bGUJR0ItRWlyZQkxOTIxCW9ubHkJLQlBcHIJIDMJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTIxCW9ubHkJLQlPY3QJIDMJMjowMHMJMAlHTVQKLSMgUy5SLiZPLiAxOTIyLCBOby4gMjY0Ci1SdWxlCUdCLUVpcmUJMTkyMglvbmx5CS0JTWFyCTI2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkyMglvbmx5CS0JT2N0CSA4CTI6MDBzCTAJR01UCi0jIFRoZSBTdW1tZXIgVGltZSBBY3QsIDE5MjIKLVJ1bGUJR0ItRWlyZQkxOTIzCW9ubHkJLQlBcHIJU3VuPj0xNgkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjMJMTkyNAktCVNlcAlTdW4+PTE2CTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTkyNAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjUJMTkyNgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi0jIFRoZSBTdW1tZXIgVGltZSBBY3QsIDE5MjUKLVJ1bGUJR0ItRWlyZQkxOTI1CTE5MzgJLQlPY3QJU3VuPj0yCTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTkyNwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MjgJMTkyOQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzMAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzEJMTkzMgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzMwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzQJb25seQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzNQlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzYJMTkzNwktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTkzOAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5MzkJb25seQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTkzOSwgTm8uIDEzNzkKLVJ1bGUJR0ItRWlyZQkxOTM5CW9ubHkJLQlOb3YJU3VuPj0xNgkyOjAwcwkwCUdNVAotIyBTLlIuJk8uIDE5NDAsIE5vLiAxNzIgYW5kIE5vLiAxODgzCi1SdWxlCUdCLUVpcmUJMTk0MAlvbmx5CS0JRmViCVN1bj49MjMJMjowMHMJMTowMAlCU1QKLSMgUy5SLiZPLiAxOTQxLCBOby4gNDc2Ci1SdWxlCUdCLUVpcmUJMTk0MQlvbmx5CS0JTWF5CVN1bj49MgkxOjAwcwkyOjAwCUJEU1QKLVJ1bGUJR0ItRWlyZQkxOTQxCTE5NDMJLQlBdWcJU3VuPj05CTE6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTk0MiwgTm8uIDUwNgotUnVsZQlHQi1FaXJlCTE5NDIJMTk0NAktCUFwcglTdW4+PTIJMTowMHMJMjowMAlCRFNUCi0jIFMuUi4mTy4gMTk0NCwgTm8uIDkzMgotUnVsZQlHQi1FaXJlCTE5NDQJb25seQktCVNlcAlTdW4+PTE2CTE6MDBzCTE6MDAJQlNUCi0jIFMuUi4mTy4gMTk0NSwgTm8uIDMxMgotUnVsZQlHQi1FaXJlCTE5NDUJb25seQktCUFwcglNb24+PTIJMTowMHMJMjowMAlCRFNUCi1SdWxlCUdCLUVpcmUJMTk0NQlvbmx5CS0JSnVsCVN1bj49OQkxOjAwcwkxOjAwCUJTVAotIyBTLlIuJk8uIDE5NDUsIE5vLiAxMjA4Ci1SdWxlCUdCLUVpcmUJMTk0NQkxOTQ2CS0JT2N0CVN1bj49MgkyOjAwcwkwCUdNVAotUnVsZQlHQi1FaXJlCTE5NDYJb25seQktCUFwcglTdW4+PTkJMjowMHMJMTowMAlCU1QKLSMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTk0NwotUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCU1hcgkxNgkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NDcJb25seQktCUFwcgkxMwkxOjAwcwkyOjAwCUJEU1QKLVJ1bGUJR0ItRWlyZQkxOTQ3CW9ubHkJLQlBdWcJMTAJMTowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTQ3CW9ubHkJLQlOb3YJIDIJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NDggKFMuSS4gMTk0OC80OTUpCi1SdWxlCUdCLUVpcmUJMTk0OAlvbmx5CS0JTWFyCTE0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk0OAlvbmx5CS0JT2N0CTMxCTI6MDBzCTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTQ5IChTLkkuIDE5NDkvMzczKQotUnVsZQlHQi1FaXJlCTE5NDkJb25seQktCUFwcgkgMwkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NDkJb25seQktCU9jdAkzMAkyOjAwcwkwCUdNVAotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk1MCAoUy5JLiAxOTUwLzUxOCkKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NTEgKFMuSS4gMTk1MS80MzApCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTUyIChTLkkuIDE5NTIvNDUxKQotUnVsZQlHQi1FaXJlCTE5NTAJMTk1MgktCUFwcglTdW4+PTE0CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk1MAkxOTUyCS0JT2N0CVN1bj49MjEJMjowMHMJMAlHTVQKLSMgcmV2ZXJ0IHRvIHRoZSBydWxlcyBvZiB0aGUgU3VtbWVyIFRpbWUgQWN0LCAxOTI1Ci1SdWxlCUdCLUVpcmUJMTk1Mwlvbmx5CS0JQXByCVN1bj49MTYJMjowMHMJMTowMAlCU1QKLVJ1bGUJR0ItRWlyZQkxOTUzCTE5NjAJLQlPY3QJU3VuPj0yCTI6MDBzCTAJR01UCi1SdWxlCUdCLUVpcmUJMTk1NAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NTUJMTk1NgktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk1Nwlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotUnVsZQlHQi1FaXJlCTE5NTgJMTk1OQktCUFwcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk2MAlvbmx5CS0JQXByCVN1bj49OQkyOjAwcwkxOjAwCUJTVAotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2MSAoUy5JLiAxOTYxLzcxKQotIyBTdW1tZXIgVGltZSAoMTk2MikgT3JkZXIsIDE5NjEgKFMuSS4gMTk2MS8yNDY1KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2MyAoUy5JLiAxOTYzLzgxKQotUnVsZQlHQi1FaXJlCTE5NjEJMTk2MwktCU1hcglsYXN0U3VuCTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk2MQkxOTY4CS0JT2N0CVN1bj49MjMJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgKDE5NjQpIE9yZGVyLCAxOTYzIChTLkkuIDE5NjMvMjEwMSkKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NjQgKFMuSS4gMTk2NC8xMjAxKQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk2NyAoUy5JLiAxOTY3LzExNDgpCi1SdWxlCUdCLUVpcmUJMTk2NAkxOTY3CS0JTWFyCVN1bj49MTkJMjowMHMJMTowMAlCU1QKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5NjggKFMuSS4gMTk2OC8xMTcpCi1SdWxlCUdCLUVpcmUJMTk2OAlvbmx5CS0JRmViCTE4CTI6MDBzCTE6MDAJQlNUCi0jIFRoZSBCcml0aXNoIFN0YW5kYXJkIFRpbWUgQWN0LCAxOTY4Ci0jCShubyBzdW1tZXIgdGltZSkKLSMgVGhlIFN1bW1lciBUaW1lIEFjdCwgMTk3MgotUnVsZQlHQi1FaXJlCTE5NzIJMTk4MAktCU1hcglTdW4+PTE2CTI6MDBzCTE6MDAJQlNUCi1SdWxlCUdCLUVpcmUJMTk3MgkxOTgwCS0JT2N0CVN1bj49MjMJMjowMHMJMAlHTVQKLSMgU3VtbWVyIFRpbWUgT3JkZXIsIDE5ODAgKFMuSS4gMTk4MC8xMDg5KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk4MiAoUy5JLiAxOTgyLzE2NzMpCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTg2IChTLkkuIDE5ODYvMjIzKQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk4OCAoUy5JLiAxOTg4LzkzMSkKLVJ1bGUJR0ItRWlyZQkxOTgxCTE5OTUJLQlNYXIJbGFzdFN1bgkxOjAwdQkxOjAwCUJTVAotUnVsZQlHQi1FaXJlIDE5ODEJMTk4OQktCU9jdAlTdW4+PTIzCTE6MDB1CTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyLCAxOTg5IChTLkkuIDE5ODkvOTg1KQotIyBTdW1tZXIgVGltZSBPcmRlciwgMTk5MiAoUy5JLiAxOTkyLzE3MjkpCi0jIFN1bW1lciBUaW1lIE9yZGVyIDE5OTQgKFMuSS4gMTk5NC8yNzk4KQotUnVsZQlHQi1FaXJlIDE5OTAJMTk5NQktCU9jdAlTdW4+PTIyCTE6MDB1CTAJR01UCi0jIFN1bW1lciBUaW1lIE9yZGVyIDE5OTcgKFMuSS4gMTk5Ny8yOTgyKQotIyBTZWUgRVUgZm9yIHJ1bGVzIHN0YXJ0aW5nIGluIDE5OTYuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0xvbmRvbgktMDowMToxNSAtCUxNVAkxODQ3IERlYyAgMSAwOjAwcwotCQkJIDA6MDAJR0ItRWlyZQklcwkxOTY4IE9jdCAyNwotCQkJIDE6MDAJLQlCU1QJMTk3MSBPY3QgMzEgMjowMHUKLQkJCSAwOjAwCUdCLUVpcmUJJXMJMTk5NgotCQkJIDA6MDAJRVUJR01UL0JTVAotTGluawlFdXJvcGUvTG9uZG9uCUV1cm9wZS9KZXJzZXkKLUxpbmsJRXVyb3BlL0xvbmRvbglFdXJvcGUvR3Vlcm5zZXkKLUxpbmsJRXVyb3BlL0xvbmRvbglFdXJvcGUvSXNsZV9vZl9NYW4KLVpvbmUJRXVyb3BlL0R1YmxpbgktMDoyNTowMCAtCUxNVAkxODgwIEF1ZyAgMgotCQkJLTA6MjU6MjEgLQlETVQJMTkxNiBNYXkgMjEgMjowMAotCQkJLTA6MjU6MjEgMTowMAlJU1QJMTkxNiBPY3QgIDEgMjowMHMKLQkJCSAwOjAwCUdCLUVpcmUJJXMJMTkyMSBEZWMgIDYgIyBpbmRlcGVuZGVuY2UKLQkJCSAwOjAwCUdCLUVpcmUJR01UL0lTVAkxOTQwIEZlYiAyNSAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ2IE9jdCAgNiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ3IE1hciAxNiAyOjAwCi0JCQkgMDowMAkxOjAwCUlTVAkxOTQ3IE5vdiAgMiAyOjAwCi0JCQkgMDowMAktCUdNVAkxOTQ4IEFwciAxOCAyOjAwCi0JCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk2OCBPY3QgMjcKLQkJCSAxOjAwCS0JSVNUCTE5NzEgT2N0IDMxIDI6MDB1Ci0JCQkgMDowMAlHQi1FaXJlCUdNVC9JU1QJMTk5NgotCQkJIDA6MDAJRVUJR01UL0lTVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRXVyb3BlCi0KLSMgRVUgcnVsZXMgYXJlIGZvciB0aGUgRXVyb3BlYW4gVW5pb24sIHByZXZpb3VzbHkga25vd24gYXMgdGhlIEVDLCBFRUMsCi0jIENvbW1vbiBNYXJrZXQsIGV0Yy4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRVUJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMTowMHUJMTowMAlTCi1SdWxlCUVVCTE5NzcJb25seQktCVNlcAlsYXN0U3VuCSAxOjAwdQkwCS0KLVJ1bGUJRVUJMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwdQkwCS0KLVJ1bGUJRVUJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDE6MDB1CTAJLQotUnVsZQlFVQkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAxOjAwdQkxOjAwCVMKLVJ1bGUJRVUJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMTowMHUJMAktCi0jIFRoZSBtb3N0IHJlY2VudCBkaXJlY3RpdmUgY292ZXJzIHRoZSB5ZWFycyBzdGFydGluZyBpbiAyMDAyLiAgU2VlOgotIyA8YT0iaHR0cDovL2V1ci1sZXguZXVyb3BhLmV1L0xleFVyaVNlcnYvTGV4VXJpU2Vydi5kbz91cmk9Q0VMRVg6MzIwMDBMMDA4NDpFTjpOT1QiPgotIyBEaXJlY3RpdmUgMjAwMC84NC9FQyBvZiB0aGUgRXVyb3BlYW4gUGFybGlhbWVudCBhbmQgb2YgdGhlIENvdW5jaWwKLSMgb2YgMTkgSmFudWFyeSAyMDAxIG9uIHN1bW1lci10aW1lIGFycmFuZ2VtZW50cy4KLSMgPC9hPgotCi0jIFctRXVyIGRpZmZlcnMgZnJvbSBFVSBvbmx5IGluIHRoYXQgVy1FdXIgdXNlcyBzdGFuZGFyZCB0aW1lLgotUnVsZQlXLUV1cgkxOTc3CTE5ODAJLQlBcHIJU3VuPj0xCSAxOjAwcwkxOjAwCVMKLVJ1bGUJVy1FdXIJMTk3Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDE6MDBzCTAJLQotUnVsZQlXLUV1cgkxOTc4CW9ubHkJLQlPY3QJIDEJIDE6MDBzCTAJLQotUnVsZQlXLUV1cgkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMTowMHMJMAktCi1SdWxlCVctRXVyCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDE6MDBzCTE6MDAJUwotUnVsZQlXLUV1cgkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAxOjAwcwkwCS0KLQotIyBPbGRlciBDLUV1ciBydWxlcyBhcmUgZm9yIGNvbnZlbmllbmNlIGluIHRoZSB0YWJsZXMuCi0jIEZyb20gMTk3NyBvbiwgQy1FdXIgZGlmZmVycyBmcm9tIEVVIG9ubHkgaW4gdGhhdCBDLUV1ciB1c2VzIHN0YW5kYXJkIHRpbWUuCi1SdWxlCUMtRXVyCTE5MTYJb25seQktCUFwcgkzMAkyMzowMAkxOjAwCVMKLVJ1bGUJQy1FdXIJMTkxNglvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQotUnVsZQlDLUV1cgkxOTE3CTE5MTgJLQlBcHIJTW9uPj0xNQkgMjowMHMJMTowMAlTCi1SdWxlCUMtRXVyCTE5MTcJMTkxOAktCVNlcAlNb24+PTE1CSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk0MAlvbmx5CS0JQXByCSAxCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQy1FdXIJMTk0Mglvbmx5CS0JTm92CSAyCSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk0Mwlvbmx5CS0JTWFyCTI5CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQy1FdXIJMTk0Mwlvbmx5CS0JT2N0CSA0CSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk0NAkxOTQ1CS0JQXByCU1vbj49MQkgMjowMHMJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTk0NCBPY3QgNzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUMtRXVyCTE5NDQJb25seQktCU9jdAkgMgkgMjowMHMJMAktCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA4LTA3LTEzKToKLSMKLSMgSSBmb3VuZCB3aGF0IGlzIHByb2JhYmx5IGEgdHlwbyBvZiAyOjAwIHdoaWNoIHNob3VsZCBwZXJoYXBzIGJlIDI6MDBzCi0jIGluIHRoZSBDLUV1ciBydWxlIGZyb20gdHogZGF0YWJhc2UgdmVyc2lvbiAyMDA4ZCAodGhpcyBwYXJ0IHdhcwotIyBjb3JyZWN0ZWQgaW4gdmVyc2lvbiAyMDA4ZCkuIFRoZSBjaXJjdW1zdGFuY2lhbCBldmlkZW5jZSBpcyBzaW1wbHkgdGhlCi0jIHR6IGRhdGFiYXNlIGl0c2VsZiwgYXMgc2VlbiBiZWxvdzoKLSMKLSMgWm9uZSBFdXJvcGUvUGFyaXMgMDowOToyMSAtIExNVCAxODkxIE1hciAxNSAgMDowMQotIyAgICAwOjAwIEZyYW5jZSBXRSVzVCAxOTQ1IFNlcCAxNiAgMzowMAotIwotIyBab25lIEV1cm9wZS9Nb25hY28gMDoyOTozMiAtIExNVCAxODkxIE1hciAxNQotIyAgICAwOjAwIEZyYW5jZSBXRSVzVCAxOTQ1IFNlcCAxNiAzOjAwCi0jCi0jIFpvbmUgRXVyb3BlL0JlbGdyYWRlIDE6MjI6MDAgLSBMTVQgMTg4NAotIyAgICAxOjAwIDE6MDAgQ0VTVCAxOTQ1IFNlcCAxNiAgMjowMHMKLSMKLSMgUnVsZSBGcmFuY2UgMTk0NSBvbmx5IC0gU2VwIDE2ICAzOjAwIDAgLQotIyBSdWxlIEJlbGdpdW0gMTk0NSBvbmx5IC0gU2VwIDE2ICAyOjAwcyAwIC0KLSMgUnVsZSBOZXRoIDE5NDUgb25seSAtIFNlcCAxNiAyOjAwcyAwIC0KLSMKLSMgVGhlIHJ1bGUgbGluZSB0byBiZSBjaGFuZ2VkIGlzOgotIwotIyBSdWxlIEMtRXVyIDE5NDUgb25seSAtIFNlcCAxNiAgMjowMCAwIC0KLSMKLSMgSXQgc2VlbXMgdGhhdCBQYXJpcywgTW9uYWNvLCBSdWxlIEZyYW5jZSwgUnVsZSBCZWxnaXVtIGFsbCBhZ3JlZSBvbgotIyAyOjAwIHN0YW5kYXJkIHRpbWUsIGUuZy4gMzowMCBsb2NhbCB0aW1lLiAgSG93ZXZlciB0aGVyZSBhcmUgbm8KLSMgY291bnRyaWVzIHRoYXQgdXNlIEMtRXVyIHJ1bGVzIGluIFNlcHRlbWJlciAxOTQ1LCBzbyB0aGUgb25seSBpdGVtcwotIyBhZmZlY3RlZCBhcmUgYXBwYXJlbnRseSB0aGVzZSBmaWN0aWNpb3VzIHpvbmVzIHRoYXQgdHJhbnNsYXRlcyBhY3JvbnltcwotIyBDRVQgYW5kIE1FVDoKLSMKLSMgWm9uZSBDRVQgIDE6MDAgQy1FdXIgQ0Ulc1QKLSMgWm9uZSBNRVQgIDE6MDAgQy1FdXIgTUUlc1QKLSMKLSMgSXQgdGhpcyBpcyByaWdodCB0aGVuIHRoZSBjb3JyZWN0ZWQgdmVyc2lvbiB3b3VsZCBsb29rIGxpa2U6Ci0jCi0jIFJ1bGUgQy1FdXIgMTk0NSBvbmx5IC0gU2VwIDE2ICAyOjAwcyAwIC0KLSMKLSMgQSBzbWFsbCBzdGVwIGZvciBtYW5raW5kIHRob3VnaCA4LSkKLVJ1bGUJQy1FdXIJMTk0NQlvbmx5CS0JU2VwCTE2CSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk3NwkxOTgwCS0JQXByCVN1bj49MQkgMjowMHMJMTowMAlTCi1SdWxlCUMtRXVyCTE5NzcJb25seQktCVNlcAlsYXN0U3VuCSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk3OAlvbmx5CS0JT2N0CSAxCSAyOjAwcwkwCS0KLVJ1bGUJQy1FdXIJMTk3OQkxOTk1CS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZQlDLUV1cgkxOTgxCW1heAktCU1hcglsYXN0U3VuCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQy1FdXIJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMjowMHMJMAktCi0KLSMgRS1FdXIgZGlmZmVycyBmcm9tIEVVIG9ubHkgaW4gdGhhdCBFLUV1ciBzd2l0Y2hlcyBhdCBtaWRuaWdodCBsb2NhbCB0aW1lLgotUnVsZQlFLUV1cgkxOTc3CTE5ODAJLQlBcHIJU3VuPj0xCSAwOjAwCTE6MDAJUwotUnVsZQlFLUV1cgkxOTc3CW9ubHkJLQlTZXAJbGFzdFN1bgkgMDowMAkwCS0KLVJ1bGUJRS1FdXIJMTk3OAlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQotUnVsZQlFLUV1cgkxOTc5CTE5OTUJLQlTZXAJbGFzdFN1bgkgMDowMAkwCS0KLVJ1bGUJRS1FdXIJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMDowMAkxOjAwCVMKLVJ1bGUJRS1FdXIJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMDowMAkwCS0KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUnVzc2lhCTE5MTcJb25seQktCUp1bAkgMQkyMzowMAkxOjAwCU1TVAkjIE1vc2NvdyBTdW1tZXIgVGltZQotUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JRGVjCTI4CSAwOjAwCTAJTU1UCSMgTW9zY293IE1lYW4gVGltZQotUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JTWF5CTMxCTIyOjAwCTI6MDAJTURTVAkjIE1vc2NvdyBEb3VibGUgU3VtbWVyIFRpbWUKLVJ1bGUJUnVzc2lhCTE5MTgJb25seQktCVNlcAkxNgkgMTowMAkxOjAwCU1TVAotUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JTWF5CTMxCTIzOjAwCTI6MDAJTURTVAotUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JSnVsCSAxCSAyOjAwCTE6MDAJUwotUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JQXVnCTE2CSAwOjAwCTAJLQotUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JRmViCTE0CTIzOjAwCTE6MDAJUwotUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JTWFyCTIwCTIzOjAwCTI6MDAJTSAjIE1pZHN1bW1lcgotUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JU2VwCSAxCSAwOjAwCTE6MDAJUwotUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQotIyBBY3QgTm8uOTI1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiB0aGUgVVNTUiAoMTk4MC0xMC0yNCk6Ci1SdWxlCVJ1c3NpYQkxOTgxCTE5ODQJLQlBcHIJIDEJIDA6MDAJMTowMAlTCi1SdWxlCVJ1c3NpYQkxOTgxCTE5ODMJLQlPY3QJIDEJIDA6MDAJMAktCi0jIEFjdCBOby45Njcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIHRoZSBVU1NSICgxOTg0LTA5LTEzKSwgcmVwZWF0ZWQgaW4KLSMgQWN0IE5vLjIyNyBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgdGhlIFVTU1IgKDE5ODktMDMtMTQpOgotUnVsZQlSdXNzaWEJMTk4NAkxOTkxCS0JU2VwCWxhc3RTdW4JIDI6MDBzCTAJLQotUnVsZQlSdXNzaWEJMTk4NQkxOTkxCS0JTWFyCWxhc3RTdW4JIDI6MDBzCTE6MDAJUwotIwotUnVsZQlSdXNzaWEJMTk5Mglvbmx5CS0JTWFyCWxhc3RTYXQJIDIzOjAwCTE6MDAJUwotUnVsZQlSdXNzaWEJMTk5Mglvbmx5CS0JU2VwCWxhc3RTYXQJIDIzOjAwCTAJLQotUnVsZQlSdXNzaWEJMTk5MwltYXgJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlCVJ1c3NpYQkxOTkzCTE5OTUJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCi1SdWxlCVJ1c3NpYQkxOTk2CW1heAktCU9jdAlsYXN0U3VuCSAyOjAwcwkwCS0KLQotIyBUaGVzZSBhcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucy4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlXRVQJCTA6MDAJRVUJV0Ulc1QKLVpvbmUJQ0VUCQkxOjAwCUMtRXVyCUNFJXNUCi1ab25lCU1FVAkJMTowMAlDLUV1cglNRSVzVAotWm9uZQlFRVQJCTI6MDAJRVUJRUUlc1QKLQotIyBQcmV2aW91cyBlZGl0aW9ucyBvZiB0aGlzIGRhdGFiYXNlIHVzZWQgYWJicmV2aWF0aW9ucyBsaWtlIE1FVCBEU1QKLSMgZm9yIENlbnRyYWwgRXVyb3BlYW4gU3VtbWVyIFRpbWUsIGJ1dCB0aGlzIGRpZG4ndCBhZ3JlZSB3aXRoIGNvbW1vbiB1c2FnZS4KLQotIyBGcm9tIE1hcmt1cyBLdWhuICgxOTk2LTA3LTEyKToKLSMgVGhlIG9mZmljaWFsIEdlcm1hbiBuYW1lcyAuLi4gYXJlCi0jCi0jCU1pdHRlbGV1cm9wYWVpc2NoZSBaZWl0IChNRVopICAgICAgICAgPSBVVEMrMDE6MDAKLSMJTWl0dGVsZXVyb3BhZWlzY2hlIFNvbW1lcnplaXQgKE1FU1opICA9IFVUQyswMjowMAotIwotIyBhcyBkZWZpbmVkIGluIHRoZSBHZXJtYW4gVGltZSBBY3QgKEdlc2V0eiB1ZWJlciBkaWUgWmVpdGJlc3RpbW11bmcgKFplaXRHKSwKLSMgMTk3OC0wNy0yNSwgQnVuZGVzZ2VzZXR6YmxhdHQsIEphaHJnYW5nIDE5NzgsIFRlaWwgSSwgUy4gMTExMC0xMTExKS4uLi4KLSMgSSB3cm90ZSAuLi4gdG8gdGhlIEdlcm1hbiBGZWRlcmFsIFBoeXNpY2FsLVRlY2huaWNhbCBJbnN0aXR1dGlvbgotIwotIwlQaHlzaWthbGlzY2gtVGVjaG5pc2NoZSBCdW5kZXNhbnN0YWx0IChQVEIpCi0jCUxhYm9yYXRvcml1bSA0LjQxICJaZWl0ZWluaGVpdCIKLSMJUG9zdGZhY2ggMzM0NQotIwlELTM4MDIzIEJyYXVuc2Nod2VpZwotIwlwaG9uZTogKzQ5IDUzMSA1OTItMAotIwotIyAuLi4gSSByZWNlaXZlZCB0b2RheSBhbiBhbnN3ZXIgbGV0dGVyIGZyb20gRHIuIFBldGVyIEhldHplbCwgaGVhZCBvZiB0aGUgUFRCCi0jIGRlcGFydG1lbnQgZm9yIHRpbWUgYW5kIGZyZXF1ZW5jeSB0cmFuc21pc3Npb24uICBIZSBleHBsYWluZWQgdGhhdCB0aGUKLSMgUFRCIHRyYW5zbGF0ZXMgTUVaIGFuZCBNRVNaIGludG8gRW5nbGlzaCBhcwotIwotIwlDZW50cmFsIEV1cm9wZWFuIFRpbWUgKENFVCkgICAgICAgICA9IFVUQyswMTowMAotIwlDZW50cmFsIEV1cm9wZWFuIFN1bW1lciBUaW1lIChDRVNUKSA9IFVUQyswMjowMAotCi0KLSMgQWxiYW5pYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQWxiYW5pYQkxOTQwCW9ubHkJLQlKdW4JMTYJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTQyCW9ubHkJLQlOb3YJIDIJMzowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTQzCW9ubHkJLQlNYXIJMjkJMjowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTQzCW9ubHkJLQlBcHIJMTAJMzowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc0CW9ubHkJLQlNYXkJIDQJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc0CW9ubHkJLQlPY3QJIDIJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc1CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc1CW9ubHkJLQlPY3QJIDIJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc2CW9ubHkJLQlNYXkJIDIJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc2CW9ubHkJLQlPY3QJIDMJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc3CW9ubHkJLQlNYXkJIDgJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc3CW9ubHkJLQlPY3QJIDIJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc4CW9ubHkJLQlNYXkJIDYJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc4CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTc5CW9ubHkJLQlNYXkJIDUJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTc5CW9ubHkJLQlTZXAJMzAJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTgwCW9ubHkJLQlNYXkJIDMJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTgwCW9ubHkJLQlPY3QJIDQJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTgxCW9ubHkJLQlBcHIJMjYJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTgxCW9ubHkJLQlTZXAJMjcJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTgyCW9ubHkJLQlNYXkJIDIJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTgyCW9ubHkJLQlPY3QJIDMJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTgzCW9ubHkJLQlBcHIJMTgJMDowMAkxOjAwCVMKLVJ1bGUJQWxiYW5pYQkxOTgzCW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJQWxiYW5pYQkxOTg0CW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1RpcmFuZQkxOjE5OjIwIC0JTE1UCTE5MTQKLQkJCTE6MDAJLQlDRVQJMTk0MCBKdW4gMTYKLQkJCTE6MDAJQWxiYW5pYQlDRSVzVAkxOTg0IEp1bAotCQkJMTowMAlFVQlDRSVzVAotCi0jIEFuZG9ycmEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0FuZG9ycmEJMDowNjowNCAtCUxNVAkxOTAxCi0JCQkwOjAwCS0JV0VUCTE5NDYgU2VwIDMwCi0JCQkxOjAwCS0JQ0VUCTE5ODUgTWFyIDMxIDI6MDAKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBBdXN0cmlhCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6IFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5MTgtMDYtMTYgYW5kCi0jIDE5NDUtMTEtMTgsIGJ1dCB0aGUgQXVzdHJpYW4gRmVkZXJhbCBPZmZpY2Ugb2YgTWV0cm9sb2d5IGFuZAotIyBTdXJ2ZXlpbmcgKEJFVikgZ2l2ZXMgMTkxOC0wOS0xNiBhbmQgZm9yIFZpZW5uYSBnaXZlcyB0aGUgImFsbGVnZWQiCi0jIGRhdGUgb2YgMTk0NS0wNC0xMiB3aXRoIG5vIHRpbWUuICBGb3IgdGhlIDE5ODAtMDQtMDYgdHJhbnNpdGlvbgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwMjowMCwgdGhlIEJFViAwMDowMC4gIEdvIHdpdGggdGhlIEJFViwKLSMgYW5kIGd1ZXNzIDAyOjAwIGZvciAxOTQ1LTA0LTEyLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBdXN0cmlhCTE5MjAJb25seQktCUFwcgkgNQkyOjAwcwkxOjAwCVMKLVJ1bGUJQXVzdHJpYQkxOTIwCW9ubHkJLQlTZXAJMTMJMjowMHMJMAktCi1SdWxlCUF1c3RyaWEJMTk0Nglvbmx5CS0JQXByCTE0CTI6MDBzCTE6MDAJUwotUnVsZQlBdXN0cmlhCTE5NDYJMTk0OAktCU9jdAlTdW4+PTEJMjowMHMJMAktCi1SdWxlCUF1c3RyaWEJMTk0Nwlvbmx5CS0JQXByCSA2CTI6MDBzCTE6MDAJUwotUnVsZQlBdXN0cmlhCTE5NDgJb25seQktCUFwcgkxOAkyOjAwcwkxOjAwCVMKLVJ1bGUJQXVzdHJpYQkxOTgwCW9ubHkJLQlBcHIJIDYJMDowMAkxOjAwCVMKLVJ1bGUJQXVzdHJpYQkxOTgwCW9ubHkJLQlTZXAJMjgJMDowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1ZpZW5uYQkxOjA1OjIwIC0JTE1UCTE4OTMgQXByCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5MjAKLQkJCTE6MDAJQXVzdHJpYQlDRSVzVAkxOTQwIEFwciAgMSAyOjAwcwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwcwotCQkJMTowMAkxOjAwCUNFU1QJMTk0NSBBcHIgMTIgMjowMHMKLQkJCTE6MDAJLQlDRVQJMTk0NgotCQkJMTowMAlBdXN0cmlhCUNFJXNUCTE5ODEKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBCZWxhcnVzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9NaW5zawkxOjUwOjE2IC0JTE1UCTE4ODAKLQkJCTE6NTAJLQlNTVQJMTkyNCBNYXkgMiAjIE1pbnNrIE1lYW4gVGltZQotCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQotCQkJMzowMAktCU1TSwkxOTQxIEp1biAyOAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEp1bCAgMwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkyOjAwCTE6MDAJRUVTVAkxOTkxIFNlcCAyOSAyOjAwcwotCQkJMjowMAktCUVFVAkxOTkyIE1hciAyOSAwOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk5MiBTZXAgMjcgMDowMHMKLQkJCTI6MDAJUnVzc2lhCUVFJXNUCi0KLSMgQmVsZ2l1bQotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk3LTA3LTAyKToKLSMgRW50cmllcyBmcm9tIDE5MTggdGhyb3VnaCAxOTkxIGFyZSB0YWtlbiBmcm9tOgotIwlBbm51YWlyZSBkZSBMJ09ic2VydmF0b2lyZSBSb3lhbCBkZSBCZWxnaXF1ZSwKLSMJQXZlbnVlIENpcmN1bGFpcmUsIDMsIEItMTE4MCBCUlVYRUxMRVMsIENMVklJZSBhbm5lZSwgMTk5MQotIwkoSW1wcmltZXJpZSBIQVlFWiwgcy5wLnIubC4sIFJ1ZSBGaW4sIDQsIDEwODAgQlJVWEVMTEVTLCBNQ01YQyksCi0jCXBwIDgtOS4KLSMgTE1UIGJlZm9yZSAxODkyIHdhcyAwOjE3OjMwLCBhY2NvcmRpbmcgdG8gdGhlIG9mZmljaWFsIGpvdXJuYWwgb2YgQmVsZ2l1bToKLSMJTW9uaXRldXIgQmVsZ2UsIFNhbWVkaSAzMCBBdnJpbCAxODkyLCBOLjEyMS4KLSMgVGhhbmtzIHRvIFBhc2NhbCBEZWxtb2l0aWUgZm9yIHRoZXNlIHJlZmVyZW5jZXMuCi0jIFRoZSAxOTE4IHJ1bGVzIGFyZSBsaXN0ZWQgZm9yIGNvbXBsZXRlbmVzczsgdGhleSBhcHBseSB0byB1bm9jY3VwaWVkIEJlbGdpdW0uCi0jIEFzc3VtZSBCcnVzc2VscyBzd2l0Y2hlZCB0byBXRVQgaW4gMTkxOCB3aGVuIHRoZSBhcm1pc3RpY2UgdG9vayBlZmZlY3QuCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlCZWxnaXVtCTE5MTgJb25seQktCU1hcgkgOQkgMDowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkxOAkxOTE5CS0JT2N0CVNhdD49MQkyMzowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTkxOQlvbmx5CS0JTWFyCSAxCTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTIwCW9ubHkJLQlGZWIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MjAJb25seQktCU9jdAkyMwkyMzowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTkyMQlvbmx5CS0JTWFyCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTIxCW9ubHkJLQlPY3QJMjUJMjM6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5MjIJb25seQktCU1hcgkyNQkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyMgkxOTI3CS0JT2N0CVNhdD49MQkyMzowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTkyMwlvbmx5CS0JQXByCTIxCTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTI0CW9ubHkJLQlNYXIJMjkJMjM6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MjUJb25seQktCUFwcgkgNAkyMzowMHMJMTowMAlTCi0jIERTSCB3cml0ZXMgdGhhdCBhIHJveWFsIGRlY3JlZSBvZiAxOTI2LTAyLTIyIHNwZWNpZmllZCB0aGUgU3VuIGZvbGxvd2luZyAzcmQKLSMgU2F0IGluIEFwciAoZXhjZXB0IGlmIGl0J3MgRWFzdGVyLCBpbiB3aGljaCBjYXNlIGl0J3Mgb25lIFN1bmRheSBlYXJsaWVyKSwKLSMgdG8gU3VuIGZvbGxvd2luZyAxc3QgU2F0IGluIE9jdCwgYW5kIHRoYXQgYSByb3lhbCBkZWNyZWUgb2YgMTkyOC0wOS0xNQotIyBjaGFuZ2VkIHRoZSB0cmFuc2l0aW9uIHRpbWVzIHRvIDAyOjAwIEdNVC4KLVJ1bGUJQmVsZ2l1bQkxOTI2CW9ubHkJLQlBcHIJMTcJMjM6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MjcJb25seQktCUFwcgkgOQkyMzowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkyOAlvbmx5CS0JQXByCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTI4CTE5MzgJLQlPY3QJU3VuPj0yCSAyOjAwcwkwCS0KLVJ1bGUJQmVsZ2l1bQkxOTI5CW9ubHkJLQlBcHIJMjEJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzAJb25seQktCUFwcgkxMwkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzMQlvbmx5CS0JQXByCTE5CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTMyCW9ubHkJLQlBcHIJIDMJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzMJb25seQktCU1hcgkyNgkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzNAlvbmx5CS0JQXByCSA4CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTM1CW9ubHkJLQlNYXIJMzEJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzYJb25seQktCUFwcgkxOQkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzNwlvbmx5CS0JQXByCSA0CSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTM4CW9ubHkJLQlNYXIJMjcJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5MzkJb25seQktCUFwcgkxNgkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTkzOQlvbmx5CS0JTm92CTE5CSAyOjAwcwkwCS0KLVJ1bGUJQmVsZ2l1bQkxOTQwCW9ubHkJLQlGZWIJMjUJIDI6MDBzCTE6MDAJUwotUnVsZQlCZWxnaXVtCTE5NDQJb25seQktCVNlcAkxNwkgMjowMHMJMAktCi1SdWxlCUJlbGdpdW0JMTk0NQlvbmx5CS0JQXByCSAyCSAyOjAwcwkxOjAwCVMKLVJ1bGUJQmVsZ2l1bQkxOTQ1CW9ubHkJLQlTZXAJMTYJIDI6MDBzCTAJLQotUnVsZQlCZWxnaXVtCTE5NDYJb25seQktCU1heQkxOQkgMjowMHMJMTowMAlTCi1SdWxlCUJlbGdpdW0JMTk0Nglvbmx5CS0JT2N0CSA3CSAyOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0JydXNzZWxzCTA6MTc6MzAgLQlMTVQJMTg4MAotCQkJMDoxNzozMAktCUJNVAkxODkyIE1heSAgMSAxMjowMCAjIEJydXNzZWxzIE1UCi0JCQkwOjAwCS0JV0VUCTE5MTQgTm92ICA4Ci0JCQkxOjAwCS0JQ0VUCTE5MTYgTWF5ICAxICAwOjAwCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTggTm92IDExIDExOjAwdQotCQkJMDowMAlCZWxnaXVtCVdFJXNUCTE5NDAgTWF5IDIwICAyOjAwcwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAgMwotCQkJMTowMAlCZWxnaXVtCUNFJXNUCTE5NzcKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBCb3NuaWEgYW5kIEhlcnplZ292aW5hCi0jIHNlZSBTZXJiaWEKLQotIyBCdWxnYXJpYQotIwotIyBGcm9tIFBsYW1lbiBTaW1lbm92IHZpYSBTdGVmZmVuIFRob3JzZW4gKDE5OTktMDktMDkpOgotIyBBIGRvY3VtZW50IG9mIEdvdmVybm1lbnQgb2YgQnVsZ2FyaWEgKE5vLjk0LzE5OTcpIHNheXM6Ci0jIEVFVCAtLT4gRUVURFNUIGlzIGluIDAzOjAwIExvY2FsIHRpbWUgaW4gbGFzdCBTdW5kYXkgb2YgTWFyY2ggLi4uCi0jIEVFVERTVCAtLT4gRUVUIGlzIGluIDA0OjAwIExvY2FsIHRpbWUgaW4gbGFzdCBTdW5kYXkgb2YgT2N0b2JlcgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQnVsZwkxOTc5CW9ubHkJLQlNYXIJMzEJMjM6MDAJMTowMAlTCi1SdWxlCUJ1bGcJMTk3OQlvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQotUnVsZQlCdWxnCTE5ODAJMTk4MgktCUFwcglTYXQ+PTEJMjM6MDAJMTowMAlTCi1SdWxlCUJ1bGcJMTk4MAlvbmx5CS0JU2VwCTI5CSAxOjAwCTAJLQotUnVsZQlCdWxnCTE5ODEJb25seQktCVNlcAkyNwkgMjowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1NvZmlhCTE6MzM6MTYgLQlMTVQJMTg4MAotCQkJMTo1Njo1NgktCUlNVAkxODk0IE5vdiAzMCAjIElzdGFuYnVsIE1UPwotCQkJMjowMAktCUVFVAkxOTQyIE5vdiAgMiAgMzowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkxOjAwCS0JQ0VUCTE5NDUgQXByIDIgMzowMAotCQkJMjowMAktCUVFVAkxOTc5IE1hciAzMSAyMzowMAotCQkJMjowMAlCdWxnCUVFJXNUCTE5ODIgU2VwIDI2ICAyOjAwCi0JCQkyOjAwCUMtRXVyCUVFJXNUCTE5OTEKLQkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NwotCQkJMjowMAlFVQlFRSVzVAotCi0jIENyb2F0aWEKLSMgc2VlIFNlcmJpYQotCi0jIEN5cHJ1cwotIyBQbGVhc2Ugc2VlIHRoZSBgYXNpYScgZmlsZSBmb3IgQXNpYS9OaWNvc2lhLgotCi0jIEN6ZWNoIFJlcHVibGljCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDemVjaAkxOTQ1CW9ubHkJLQlBcHIJIDgJMjowMHMJMTowMAlTCi1SdWxlCUN6ZWNoCTE5NDUJb25seQktCU5vdgkxOAkyOjAwcwkwCS0KLVJ1bGUJQ3plY2gJMTk0Nglvbmx5CS0JTWF5CSA2CTI6MDBzCTE6MDAJUwotUnVsZQlDemVjaAkxOTQ2CTE5NDkJLQlPY3QJU3VuPj0xCTI6MDBzCTAJLQotUnVsZQlDemVjaAkxOTQ3CW9ubHkJLQlBcHIJMjAJMjowMHMJMTowMAlTCi1SdWxlCUN6ZWNoCTE5NDgJb25seQktCUFwcgkxOAkyOjAwcwkxOjAwCVMKLVJ1bGUJQ3plY2gJMTk0OQlvbmx5CS0JQXByCSA5CTI6MDBzCTE6MDAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvUHJhZ3VlCTA6NTc6NDQgLQlMTVQJMTg1MAotCQkJMDo1Nzo0NAktCVBNVAkxODkxIE9jdCAgICAgIyBQcmFndWUgTWVhbiBUaW1lCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgU2VwIDE3IDI6MDBzCi0JCQkxOjAwCUN6ZWNoCUNFJXNUCTE5NzkKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBEZW5tYXJrLCBGYXJvZSBJc2xhbmRzLCBhbmQgR3JlZW5sYW5kCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDUtMDQtMjYpOgotIyBodHRwOi8vd3d3Lmh1bS5hYXUuZGsvfnBvZS90aWQvdGluZS9EYW5za1RpZC5odG0gc2F5cyB0aGF0IHRoZSBsYXcKLSMgW2ludHJvZHVjaW5nIHN0YW5kYXJkIHRpbWVdIHdhcyBpbiBlZmZlY3QgZnJvbSAxODk0LTAxLTAxLi4uLgotIyBUaGUgcGFnZSBodHRwOi8vd3d3LnJldHNpbmZvLmRrL19HRVRET0NJXy9BQ0NOL0ExODkzMDAwODMzMC1SRUdMCi0jIGNvbmZpcm1zIHRoaXMsIGFuZCBzdGF0ZXMgdGhhdCB0aGUgbGF3IHdhcyBwdXQgZm9ydGggMTg5My0wMy0yOS4KLSMKLSMgVGhlIEVVIHRyZWF0eSB3aXRoIGVmZmVjdCBmcm9tIDE5NzM6Ci0jIGh0dHA6Ly93d3cucmV0c2luZm8uZGsvX0dFVERPQ0lfL0FDQ04vQTE5NzIyMTEwMDMwLVJFR0wKLSMKLSMgVGhpcyBwcm92b2tlZCBhIG5ldyBsYXcgZnJvbSAxOTc0IHRvIG1ha2UgcG9zc2libGUgc3VtbWVyIHRpbWUgY2hhbmdlcwotIyBpbiBzdWJzZXF1ZW5ldCBkZWNyZWVzIHdpdGggdGhlIGxhdwotIyBodHRwOi8vd3d3LnJldHNpbmZvLmRrL19HRVRET0NJXy9BQ0NOL0ExOTc0MDAyMjMzMC1SRUdMCi0jCi0jIEl0IHNlZW1zIGhvd2V2ZXIgdGhhdCBubyBkZWNyZWUgd2FzIHNldCBmb3J3YXJkIHVudGlsIDE5ODAuICBJIGhhdmUKLSMgbm90IGZvdW5kIGFueSBkZWNyZWUsIGJ1dCBpbiBhbm90aGVyIHJlbGF0ZWQgbGF3LCB0aGUgZWZmZWN0aW5nIERTVAotIyBjaGFuZ2VzIGFyZSBzdGF0ZWQgZXhwbGljaXRseSB0byBiZSBmcm9tIDE5ODAtMDQtMDYgYXQgMDI6MDAgdG8KLSMgMTk4MC0wOS0yOCBhdCAwMjowMC4gIElmIHRoaXMgaXMgdHJ1ZSwgdGhpcyBkaWZmZXJzIHNsaWdodGx5IGZyb20KLSMgdGhlIEVVIHJ1bGUgaW4gdGhhdCBEU1QgcnVucyB0byAwMjowMCwgbm90IDAzOjAwLiAgV2UgZG9uJ3Qga25vdwotIyB3aGVuIERlbm1hcmsgYmVnYW4gdXNpbmcgdGhlIEVVIHJ1bGUgY29ycmVjdGx5LCBidXQgd2UgaGF2ZSBvbmx5Ci0jIGNvbmZpcm1hdGlvbiBvZiB0aGUgMTk4MC10aW1lLCBzbyBJIHByZXN1bWUgaXQgd2FzIGNvcnJlY3QgaW4gMTk4MToKLSMgVGhlIGxhdyBpcyBhYm91dCB0aGUgbWFuYWdlbWVudCBvZiB0aGUgZXh0cmEgaG91ciwgY29uY2VybmluZwotIyB3b3JraW5nIGhvdXJzIHJlcG9ydGVkIGFuZCBlZmZlY3Qgb24gb2JsaWdhdG9yeS1yZXN0IHJ1bGVzICh3aGljaAotIyB3YXMgc3VzcGVuZGVkIG9uIHRoYXQgbmlnaHQpOgotIyBodHRwOi8vd3d3LnJldHNpbmZvLmRrL19HRVRET0NJXy9BQ0NOL0MxOTgwMTEyMDU1NC1SRUdMCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDUtMDYtMTEpOgotIyBUaGUgSGVybmluZyBGb2xrZWJsYWQgKDE5ODAtMDktMjYpIHJlcG9ydGVkIHRoYXQgdGhlIG5pZ2h0IGJldHdlZW4KLSMgU2F0dXJkYXkgYW5kIFN1bmRheSB0aGUgY2xvY2sgaXMgc2V0IGJhY2sgZnJvbSB0aHJlZSB0byB0d28uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wNi0xMSk6Ci0jIEhlbmNlIHRoZSAiMDI6MDAiIG9mIHRoZSAxOTgwIGxhdyByZWZlcnMgdG8gc3RhbmRhcmQgdGltZSwgbm90Ci0jIHdhbGwtY2xvY2sgdGltZSwgYW5kIHNvIHRoZSBFVSBydWxlcyB3ZXJlIGluIGVmZmVjdCBpbiAxOTgwLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlEZW5tYXJrCTE5MTYJb25seQktCU1heQkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJRGVubWFyawkxOTE2CW9ubHkJLQlTZXAJMzAJMjM6MDAJMAktCi1SdWxlCURlbm1hcmsJMTk0MAlvbmx5CS0JTWF5CTE1CSAwOjAwCTE6MDAJUwotUnVsZQlEZW5tYXJrCTE5NDUJb25seQktCUFwcgkgMgkgMjowMHMJMTowMAlTCi1SdWxlCURlbm1hcmsJMTk0NQlvbmx5CS0JQXVnCTE1CSAyOjAwcwkwCS0KLVJ1bGUJRGVubWFyawkxOTQ2CW9ubHkJLQlNYXkJIDEJIDI6MDBzCTE6MDAJUwotUnVsZQlEZW5tYXJrCTE5NDYJb25seQktCVNlcAkgMQkgMjowMHMJMAktCi1SdWxlCURlbm1hcmsJMTk0Nwlvbmx5CS0JTWF5CSA0CSAyOjAwcwkxOjAwCVMKLVJ1bGUJRGVubWFyawkxOTQ3CW9ubHkJLQlBdWcJMTAJIDI6MDBzCTAJLQotUnVsZQlEZW5tYXJrCTE5NDgJb25seQktCU1heQkgOQkgMjowMHMJMTowMAlTCi1SdWxlCURlbm1hcmsJMTk0OAlvbmx5CS0JQXVnCSA4CSAyOjAwcwkwCS0KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgRXVyb3BlL0NvcGVuaGFnZW4JIDA6NTA6MjAgLQlMTVQJMTg5MAotCQkJIDA6NTA6MjAgLQlDTVQJMTg5NCBKYW4gIDEgIyBDb3BlbmhhZ2VuIE1UCi0JCQkgMTowMAlEZW5tYXJrCUNFJXNUCTE5NDIgTm92ICAyIDI6MDBzCi0JCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwCi0JCQkgMTowMAlEZW5tYXJrCUNFJXNUCTE5ODAKLQkJCSAxOjAwCUVVCUNFJXNUCi1ab25lIEF0bGFudGljL0Zhcm9lCS0wOjI3OjA0IC0JTE1UCTE5MDggSmFuIDExCSMgVG9yc2hhdm4KLQkJCSAwOjAwCS0JV0VUCTE5ODEKLQkJCSAwOjAwCUVVCVdFJXNUCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDQtMTAtMzEpOgotIyBEdXJpbmcgV29ybGQgV2FyIElJLCBHZXJtYW55IG1haW50YWluZWQgc2VjcmV0IG1hbm5lZCB3ZWF0aGVyIHN0YXRpb25zIGluCi0jIEVhc3QgR3JlZW5sYW5kIGFuZCBGcmFueiBKb3NlZiBMYW5kLCBidXQgd2UgZG9uJ3Qga25vdyB0aGVpciB0aW1lIHpvbmVzLgotIyBNeSBzb3VyY2UgZm9yIHRoaXMgaXMgV2lsaGVsbSBEZWdlJ3MgYm9vayBtZW50aW9uZWQgdW5kZXIgU3ZhbGJhcmQuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBHcmVlbmxhbmQgam9pbmVkIHRoZSBFVSBhcyBwYXJ0IG9mIERlbm1hcmssIG9idGFpbmVkIGhvbWUgcnVsZSBvbiAxOTc5LTA1LTAxLAotIyBhbmQgbGVmdCB0aGUgRVUgb24gMTk4NS0wMi0wMS4gIEl0IHRoZXJlZm9yZSBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIEVVCi0jIHJ1bGVzIGF0IGxlYXN0IHRocm91Z2ggMTk4NC4gIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgU2NvcmVzYnlzdW5kIGFuZCBHb2R0aGFiCi0jIHVzZWQgQy1FdXIgcnVsZXMgYWZ0ZXIgMTk4MCwgYnV0IElBVEEgU1NJTSAoMTk5MS8xOTk2KSBzYXlzIHRoZXkgdXNlIEVVCi0jIHJ1bGVzIHNpbmNlIGF0IGxlYXN0IDE5OTEuICBBc3N1bWUgRVUgcnVsZXMgc2luY2UgMTk4MC4KLQotIyBGcm9tIEd3aWxsaW4gTGF3ICgyMDAxLTA2LTA2KSwgY2l0aW5nCi0jIDxodHRwOi8vd3d3LnN0YXRrYXJ0Lm5vL2Vmcy9lZnNoZWZ0ZXIvMjAwMS9lZnM1LTIwMDEucGRmPiAoMjAwMS0wMy0xNSksCi0jIGFuZCB3aXRoIHRyYW5zbGF0aW9ucyBjb3JyZWN0ZWQgYnkgU3RlZmZlbiBUaG9yc2VuOgotIwotIyBHcmVlbmxhbmQgaGFzIGZvdXIgbG9jYWwgdGltZXMsIGFuZCB0aGUgcmVsYXRpb24gdG8gVVRDCi0jIGlzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRpbWUgbGluZToKLSMKLSMgVGhlIG1pbGl0YXJ5IHpvbmUgbmVhciBUaHVsZQlVVEMtNAotIyBTdGFuZGFyZCBHcmVlbmxhbmQgdGltZQlVVEMtMwotIyBTY29yZXNieXN1bmQJCQlVVEMtMQotIyBEYW5tYXJrc2hhdm4JCQlVVEMKLSMKLSMgSW4gdGhlIG1pbGl0YXJ5IGFyZWEgbmVhciBUaHVsZSBhbmQgaW4gRGFubWFya3NoYXZuIERTVCB3aWxsIG5vdCBiZQotIyBpbnRyb2R1Y2VkLgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDEtMTEtMDEpOgotIwotIyBJIGNvcnJlc3BvbmQgcmVndWxhcmx5IHdpdGggdGhlIERhbnNrIFBvbGFyY2VudGVyLCBhbmQgd3JvdGUgdGhlbSBhdAotIyB0aGUgdGltZSB0byBjbGFyaWZ5IHRoZSBzaXR1YXRpb24gaW4gVGh1bGUuICBVbmZvcnR1bmF0ZWx5LCBJIGhhdmUKLSMgbm90IGhlYXJkIGJhY2sgZnJvbSB0aGVtIHJlZ2FyZGluZyBteSByZWNlbnQgbGV0dGVyLiAgW0J1dCBJIGhhdmUKLSMgaW5mbyBmcm9tIGVhcmxpZXIgY29ycmVzcG9uZGVuY2UuXQotIwotIyBBY2NvcmRpbmcgdG8gdGhlIGNlbnRlciwgYSB2ZXJ5IHNtYWxsIGxvY2FsIHRpbWUgem9uZSBhcm91bmQgVGh1bGUKLSMgQWlyIEJhc2Uga2VlcHMgdGhlIHRpbWUgYWNjb3JkaW5nIHRvIFVUQy00LCBpbXBsZW1lbnRpbmcgZGF5bGlnaHQKLSMgc2F2aW5ncyB1c2luZyBOb3J0aCBBbWVyaWNhIHJ1bGVzLCBjaGFuZ2luZyB0aGUgdGltZSBhdCAwMjowMCBsb2NhbCB0aW1lLi4uLgotIwotIyBUaGUgZWFzdCBjb2FzdCBvZiBHcmVlbmxhbmQgbm9ydGggb2YgdGhlIGNvbW11bml0eSBvZiBTY29yZXNieXN1bmQKLSMgdXNlcyBVVEMgaW4gdGhlIHNhbWUgd2F5IGFzIGluIEljZWxhbmQsIHllYXIgcm91bmQsIHdpdGggbm8gZHN0LgotIyBUaGVyZSBhcmUganVzdCBhIGZldyBzdGF0aW9ucyBvbiB0aGlzIGNvYXN0LCBpbmNsdWRpbmcgdGhlCi0jIERhbm1hcmtzaGF2biBJQ0FPIHdlYXRoZXIgc3RhdGlvbiBtZW50aW9uZWQgaW4geW91ciBTZXB0ZW1iZXIgMjl0aAotIyBlbWFpbC4gIFRoZSBvdGhlciBzdGF0aW9ucyBhcmUgdHdvIHNsZWRnZSBwYXRyb2wgc3RhdGlvbnMgaW4KLSMgTWVzdGVyc3ZpZyBhbmQgRGFuZWJvcmcsIHRoZSBhaXIgZm9yY2UgYmFzZSBhdCBTdGF0aW9uIE5vcmQsIGFuZCB0aGUKLSMgRFBDIHJlc2VhcmNoIHN0YXRpb24gYXQgWmFja2VuYmVyZy4KLSMKLSMgU2NvcmVzYnlzdW5kIGFuZCB0d28gc21hbGwgdmlsbGFnZXMgbmVhcmJ5IGtlZXAgdGltZSBVVEMtMSBhbmQgdXNlCi0jIHRoZSBzYW1lIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBwZXJpb2QgYXMgaW4gV2VzdCBHcmVlbmxhbmQgKEdvZHRoYWIpLgotIwotIyBUaGUgcmVzdCBvZiBHcmVlbmxhbmQsIGluY2x1ZGluZyBHb2R0aGFiICh0aGlzIGFyZWEsIGFsdGhvdWdoIGl0Ci0jIGluY2x1ZGVzIGNlbnRyYWwgR3JlZW5sYW5kLCBpcyBrbm93biBhcyB3ZXN0IEdyZWVubGFuZCksIGtlZXBzIHRpbWUKLSMgVVRDLTMsIHdpdGggZGF5bGlnaHQgc2F2aW5ncyBtZXRob2RzIGFjY29yZGluZyB0byBFdXJvcGVhbiBydWxlcy4KLSMKLSMgSXQgaXMgY29tbW9uIHByb2NlZHVyZSB0byB1c2UgVVRDIDAgaW4gdGhlIHdpbGRlcm5lc3Mgb2YgRWFzdCBhbmQKLSMgTm9ydGggR3JlZW5sYW5kLCBiZWNhdXNlIGl0IGlzIG1haW5seSBJY2VsYW5kaWMgYWlyY3JhZnQgb3BlcmF0b3JzCi0jIG1haW50YWluaW5nIHRyYWZmaWMgaW4gdGhlc2UgYXJlYXMuICBIb3dldmVyLCB0aGUgb2ZmaWNpYWwgc3RhdHVzIG9mCi0jIHRoaXMgYXJlYSBpcyB0aGF0IGl0IHN0aWNrcyB3aXRoIEdvZHRoYWIgdGltZS4gIFRoaXMgYXJlYSBtaWdodCBiZQotIyBjb25zaWRlcmVkIGEgZHVhbCB0aW1lIHpvbmUgaW4gc29tZSByZXNwZWN0cyBiZWNhdXNlIG9mIHRoaXMuCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0xMS0xOSk6Ci0jIEkgaGVhcmQgYmFjayBmcm9tIHNvbWVvbmUgc3RhdGlvbmVkIGF0IFRodWxlOyB0aGUgdGltZSBjaGFuZ2UgdG9vayBwbGFjZQotIyB0aGVyZSBhdCAyOjAwIEFNLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBGcm9tIDE5OTcgb24gdGhlIENJQSBtYXAgc2hvd3MgRGFubWFya3NoYXZuIG9uIEdNVDsKLSMgdGhlIDE5OTUgbWFwIGFzIGxpa2UgR29kdGhhYi4KLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGFzc3VtZSB0aGV5IHdlcmUgbGlrZSBHb2R0aGFiIGJlZm9yZSAxOTk2LgotIyBzdGFydGthcnQubm8gc2F5cyBUaHVsZSBkb2VzIG5vdCBvYnNlcnZlIERTVCwgYnV0IHRoaXMgaXMgY2xlYXJseSBhbiBlcnJvciwKLSMgc28gZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIFRodWxlIHRyYW5zaXRpb25zIHVudGlsIHRoaXMgeWVhci4KLSMgRm9yIDIwMDcgb24gYXNzdW1lIFRodWxlIHdpbGwgc3RheSBpbiBzeW5jIHdpdGggVVMgRFNUIHJ1bGVzLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVGh1bGUJMTk5MQkxOTkyCS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJVGh1bGUJMTk5MQkxOTkyCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJVGh1bGUJMTk5MwkyMDA2CS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAotUnVsZQlUaHVsZQkxOTkzCTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUaHVsZQkyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkxOjAwCUQKLVJ1bGUJVGh1bGUJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvRGFubWFya3NoYXZuIC0xOjE0OjQwIC0JTE1UCTE5MTYgSnVsIDI4Ci0JCQktMzowMAktCVdHVAkxOTgwIEFwciAgNiAyOjAwCi0JCQktMzowMAlFVQlXRyVzVAkxOTk2Ci0JCQkwOjAwCS0JR01UCi1ab25lIEFtZXJpY2EvU2NvcmVzYnlzdW5kIC0xOjI3OjUyIC0JTE1UCTE5MTYgSnVsIDI4ICMgSXR0b3Fxb3J0b29ybWlpdAotCQkJLTI6MDAJLQlDR1QJMTk4MCBBcHIgIDYgMjowMAotCQkJLTI6MDAJQy1FdXIJQ0clc1QJMTk4MSBNYXIgMjkKLQkJCS0xOjAwCUVVCUVHJXNUCi1ab25lIEFtZXJpY2EvR29kdGhhYgktMzoyNjo1NiAtCUxNVAkxOTE2IEp1bCAyOCAjIE51dWsKLQkJCS0zOjAwCS0JV0dUCTE5ODAgQXByICA2IDI6MDAKLQkJCS0zOjAwCUVVCVdHJXNUCi1ab25lIEFtZXJpY2EvVGh1bGUJLTQ6MzU6MDggLQlMTVQJMTkxNiBKdWwgMjggIyBQaXR1ZmZpayBhaXIgYmFzZQotCQkJLTQ6MDAJVGh1bGUJQSVzVAotCi0jIEVzdG9uaWEKLSMgRnJvbSBQZXRlciBJbGlldmUgKDE5OTQtMTAtMTUpOgotIyBBIHJlbGF0aXZlIGluIFRhbGxpbm4gY29uZmlybXMgdGhlIGFjY3VyYWN5IG9mIHRoZSBkYXRhIGZvciAxOTg5IG9ud2FyZHMKLSMgW3Rocm91Z2ggMTk5NF0gYW5kIGdpdmVzIHRoZSBsZWdhbCBhdXRob3JpdHkgZm9yIGl0LAotIyBhIHJlZ3VsYXRpb24gb2YgdGhlIEdvdmVybm1lbnQgb2YgRXN0b25pYSwgTm8uIDExMSBvZiAxOTg5Li4uLgotIwotIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5Ni0xMC0yOCk6Ci0jIFtJQVRBIFNTSU0gKDE5OTIvMTk5NikgY2xhaW1zIHRoYXQgdGhlIEJhbHRpYyByZXB1YmxpY3Mgc3dpdGNoIGF0IDAxOjAwcywKLSMgYnV0IGEgcmVsYXRpdmUgY29uZmlybXMgdGhhdCBFc3RvbmlhIHN0aWxsIHN3aXRjaGVzIGF0IDAyOjAwcywgd3JpdGluZzpdCi0jIGBgSSBkbyBub3QgW2tub3ddIGV4YWN0bHkgYnV0IHRoZXJlIGFyZSBzb21lIGxpdHRsZSBkaWZmZXJlbnQKLSMgKGNvbmZ1c2luZykgcnVsZXMgZm9yIEludGVybmF0aW9uYWwgQWlyIGFuZCBSYWlsd2F5IFRyYW5zcG9ydCBTY2hlZHVsZXMKLSMgY29udmVyc2lvbiBpbiBTdW5kYXkgY29ubmVjdGVkIHdpdGggZW5kIG9mIHN1bW1lciB0aW1lIGluIEVzdG9uaWEuLi4uCi0jIEEgZGlzY3Vzc2lvbiBpcyBydW5uaW5nIGFib3V0IHRoZSBzdW1tZXIgdGltZSBlZmZpY2llbmN5IGFuZCBlZmZlY3Qgb24KLSMgaHVtYW4gcGh5c2lvbG9neS4gIEl0IHNlZW1zIHRoYXQgRXN0b25pYSBtYXliZSB3aWxsIG5vdCBjaGFuZ2UgdG8KLSMgc3VtbWVyIHRpbWUgbmV4dCBzcHJpbmcuJycKLQotIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5OC0xMS0wNCksIGhlYXZpbHkgZWRpdGVkOgotIyA8YSBocmVmPSJodHRwOi8vdHJpcC5yay5lZS9jZ2ktYmluL3Rodz8ke0JBU0V9PWFrdCYke09PSFRNTH09cnRkJlRBPTE5OTgmVE89MSZBTj0xMzkwIj4KLSMgVGhlIDE5OTgtMDktMjIgRXN0b25pYW4gdGltZSBsYXcKLSMgPC9hPgotIyByZWZlcnMgdG8gdGhlIEVpZ2h0aCBEaXJlY3RpdmUgYW5kIGNpdGVzIHRoZSBhc3NvY2lhdGlvbiBhZ3JlZW1lbnQgYmV0d2VlbgotIyB0aGUgRVUgYW5kIEVzdG9uaWEsIHJhdGlmaWVkIGJ5IHRoZSBFc3RvbmlhbiBsYXcgKFJUIElJIDE5OTUsIDIyLS0yNywgMTIwKS4KLSMKLSMgSSBhbHNvIGFza2VkIFtteSByZWxhdGl2ZV0gd2hldGhlciB0aGV5IHVzZSBhbnkgc3RhbmRhcmQgYWJicmV2aWF0aW9uCi0jIGZvciB0aGVpciBzdGFuZGFyZCBhbmQgc3VtbWVyIHRpbWVzLiBIZSBzYXlzIG5vLCB0aGV5IHVzZSAic3V2ZWFlZyIKLSMgKHN1bW1lciB0aW1lKSBhbmQgInRhbHZlYWVnIiAod2ludGVyIHRpbWUpLgotCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5iYWx0aWN0aW1lcy5jb20vIj5UaGUgQmFsdGljIFRpbWVzPC9hPiAoMTk5OS0wOS0wOSkKLSMgdmlhIFN0ZWZmZW4gVGhvcnNlbjoKLSMgVGhpcyB5ZWFyIHdpbGwgbWFyayB0aGUgbGFzdCB0aW1lIEVzdG9uaWEgc2hpZnRzIHRvIHN1bW1lciB0aW1lLAotIyBhIGNvdW5jaWwgb2YgdGhlIHJ1bGluZyBjb2FsaXRpb24gYW5ub3VuY2VkIFNlcHQuIDYuLi4uCi0jIEJ1dCB3aGF0IHRoaXMgY291bGQgbWVhbiBmb3IgRXN0b25pYSdzIGNoYW5jZXMgb2Ygam9pbmluZyB0aGUgRXVyb3BlYW4KLSMgVW5pb24gYXJlIHN0aWxsIHVuY2xlYXIuICBJbiAxOTk0LCB0aGUgRVUgZGVjbGFyZWQgc3VtbWVyIHRpbWUgY29tcHVsc29yeQotIyBmb3IgYWxsIG1lbWJlciBzdGF0ZXMgdW50aWwgMjAwMS4gIEJydXNzZWxzIGhhcyB5ZXQgdG8gZGVjaWRlIHdoYXQgdG8gZG8KLSMgYWZ0ZXIgdGhhdC4KLQotIyBGcm9tIE1hcnQgT3J1YWFzICgyMDAwLTAxLTI5KToKLSMgUmVndWxhdGlvbiBuby4gMzAxICgxOTk5LTEwLTEyKSBvYnNvbGV0ZXMgcHJldmlvdXMgcmVndWxhdGlvbgotIyBuby4gMjA2ICgxOTk4LTA5LTIyKSBhbmQgdGh1cyBzdGlja3MgRXN0b25pYSB0byArMDI6MDAgR01UIGZvciBhbGwKLSMgdGhlIHllYXIgcm91bmQuICBUaGUgcmVndWxhdGlvbiBpcyBlZmZlY3RpdmUgMTk5OS0xMS0wMS4KLQotIyBGcm9tIFRvb21hcyBTb29tZSAoMjAwMi0wMi0yMSk6Ci0jIFRoZSBFc3RvbmlhbiBnb3Zlcm5tZW50IGhhcyBjaGFuZ2VkIG9uY2UgYWdhaW4gdGltZXpvbmUgcG9saXRpY3MuCi0jIE5vdyB3ZSBhcmUgdXNpbmcgYWdhaW4gRVUgcnVsZXMuCi0jCi0jIEZyb20gVXJtZXQgSmFhbmVzICgyMDAyLTAzLTI4KToKLSMgVGhlIGxlZ2lzbGF0aXZlIHJlZmVyZW5jZSBpcyBHb3Zlcm5tZW50IGRlY3JlZSBOby4gODQgb24gMjAwMi0wMi0yMS4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvVGFsbGlubgkxOjM5OjAwCS0JTE1UCTE4ODAKLQkJCTE6Mzk6MDAJLQlUTVQJMTkxOCBGZWIgIyBUYWxsaW5uIE1lYW4gVGltZQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTE5IEp1bAotCQkJMTozOTowMAktCVRNVAkxOTIxIE1heQotCQkJMjowMAktCUVFVAkxOTQwIEF1ZyAgNgotCQkJMzowMAktCU1TSwkxOTQxIFNlcCAxNQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IFNlcCAyMgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTg5IE1hciAyNiAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk4OSBTZXAgMjQgMjowMHMKLQkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5OCBTZXAgMjIKLQkJCTI6MDAJRVUJRUUlc1QJMTk5OSBOb3YgIDEKLQkJCTI6MDAJLQlFRVQJMjAwMiBGZWIgMjEKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBGaW5sYW5kCi0KLSMgRnJvbSBIYW5udSBTdHJhbmcgKDE5OTQtMDktMjUgMDY6MDM6MzcgVVRDKToKLSMgV2VsbCwgaGVyZSBpbiBIZWxzaW5raSB3ZSdyZSBqdXN0IGNoYW5naW5nIGZyb20gc3VtbWVyIHRpbWUgdG8gcmVndWxhciBvbmUsCi0jIGFuZCBpdCdzIHN1cHBvc2VkIHRvIGNoYW5nZSBhdCA0YW0uLi4KLQotIyBGcm9tIEphbm5lIFNuYWJiICgyMDEwLTA3MTUpOgotIwotIyBJIG5vdGljZWQgdGhhdCB0aGUgRmlubGFuZCBkYXRhIGlzIG5vdCBhY2N1cmF0ZSBmb3IgeWVhcnMgMTk4MSBhbmQgMTk4Mi4KLSMgRHVyaW5nIHRoZXNlIHR3byBmaXJzdCB0cmlhbCB5ZWFycyB0aGUgRFNUIGFkanVzdG1lbnQgd2FzIG1hZGUgb25lIGhvdXIKLSMgZWFybGllciB0aGFuIGluIGZvcnRoY29taW5nIHllYXJzLiBTdGFydGluZyAxOTgzIHRoZSBhZGp1c3RtZW50IHdhcyBtYWRlCi0jIGFjY29yZGluZyB0byB0aGUgY2VudHJhbCBFdXJvcGVhbiBzdGFuZGFyZHMuCi0jCi0jIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiBIZWlra2kgT2phOiBBaWtha2lyamEgMjAwNywgcHVibGlzaGVkIGJ5IFRoZSBBbG1hbmFjCi0jIE9mZmljZSBvZiBVbml2ZXJzaXR5IG9mIEhlbHNpbmtpLCBJU0JOIDk1Mi0xMC0zMjIxLTksIGF2YWlsYWJsZSBvbmxpbmUgKGluCi0jIEZpbm5pc2gpIGF0Ci0jCi0jIDxhIGhyZWY9Imh0dHA6Ly9hbG1hbmFra2EuaGVsc2lua2kuZmkvYWlrYWtpcmphL0Fpa2FraXJqYTIwMDdrb2tvbmFhbi5wZGYiPgotIyBodHRwOi8vYWxtYW5ha2thLmhlbHNpbmtpLmZpL2Fpa2FraXJqYS9BaWtha2lyamEyMDA3a29rb25hYW4ucGRmCi0jIDwvYT4KLSMKLSMgUGFnZSAxMDUgKDU2IGluIFBERiB2ZXJzaW9uKSBoYXMgYSBoYW5keSB0YWJsZSBvZiBhbGwgcGFzdCBkYXlsaWdodCBzYXZpbmdzCi0jIHRyYW5zaXRpb25zLiBJdCBpcyBlYXN5IGVub3VnaCB0byBpbnRlcnByZXQgd2l0aG91dCBGaW5uaXNoIHNraWxscy4KLSMKLSMgVGhpcyBpcyBhbHNvIGNvbmZpcm1lZCBieSBGaW5uaXNoIEJyb2FkY2FzdGluZyBDb21wYW55J3MgYXJjaGl2ZSBhdDoKLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy55bGUuZmkvZWxhdmFhcmtpc3RvLz9zPXMmZz0xJmFnPTUmdD0mYT0zNDAxIj4KLSMgaHR0cDovL3d3dy55bGUuZmkvZWxhdmFhcmtpc3RvLz9zPXMmZz0xJmFnPTUmdD0mYT0zNDAxCi0jIDwvYT4KLSMKLSMgVGhlIG5ld3MgY2xpcCBmcm9tIDE5ODEgc2F5cyB0aGF0ICJ0aGUgdGltZSBiZXR3ZWVuIDIgYW5kIDMgbydjbG9jayBkb2VzIG5vdAotIyBleGlzdCB0b25pZ2h0LiIKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRmlubGFuZAkxOTQyCW9ubHkJLQlBcHIJMwkwOjAwCTE6MDAJUwotUnVsZQlGaW5sYW5kCTE5NDIJb25seQktCU9jdAkzCTA6MDAJMAktCi1SdWxlCUZpbmxhbmQJMTk4MQkxOTgyCS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCVMKLVJ1bGUJRmlubGFuZAkxOTgxCTE5ODIJLQlTZXAJbGFzdFN1bgkzOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvSGVsc2lua2kJMTozOTo1MiAtCUxNVAkxODc4IE1heSAzMQotCQkJMTozOTo1MgktCUhNVAkxOTIxIE1heSAgICAjIEhlbHNpbmtpIE1lYW4gVGltZQotCQkJMjowMAlGaW5sYW5kCUVFJXNUCTE5ODMKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBBYWxhbmQgSXMKLUxpbmsJRXVyb3BlL0hlbHNpbmtpCUV1cm9wZS9NYXJpZWhhbW4KLQotCi0jIEZyYW5jZQotCi0jIEZyb20gQ2lybyBEaXNjZXBvbG8gKDIwMDAtMTItMjApOgotIwotIyBIZW5yaSBMZSBDb3JyZSwgUmVnaW1lcyBIb3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgRWRpdGlvbnMKLSMgVHJhZGl0aW9ubmVsbGVzIC0gUGFyaXMgMiBib29rcywgMTk5MwotIwotIyBHYWJyaWVsLCBUcmFpdGUgZGUgbCdoZXVyZSBkYW5zIGxlIG1vbmRlLCBHdXkgVHJlZGFuaWVsIGVkaXRldXIsCi0jIFBhcmlzLCAxOTkxCi0jCi0jIEZyYW5jb2lzZSBHYXVxdWVsaW4sIFByb2JsZW1lcyBkZSBsJ2hldXJlIHJlc29sdXMgZW4gYXN0cm9sb2dpZSwKLSMgR3V5IHRyZWRhbmllbCwgUGFyaXMgMTk4NwotCi0KLSMKLSMgU2hhbmsgJiBQb3R0ZW5nZXIgc2VlbSB0byB1c2UgYDI0OjAwJyBhbWJpZ3VvdXNseTsgcmVzb2x2ZSBpdCB3aXRoIFdoaXRtYW4uCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlGcmFuY2UJMTkxNglvbmx5CS0JSnVuCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MTYJMTkxOQktCU9jdAlTdW4+PTEJMjM6MDBzCTAJLQotUnVsZQlGcmFuY2UJMTkxNwlvbmx5CS0JTWFyCTI0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MTgJb25seQktCU1hcgkgOQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTE5CW9ubHkJLQlNYXIJIDEJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyMAlvbmx5CS0JRmViCTE0CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MjAJb25seQktCU9jdAkyMwkyMzowMHMJMAktCi1SdWxlCUZyYW5jZQkxOTIxCW9ubHkJLQlNYXIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyMQlvbmx5CS0JT2N0CTI1CTIzOjAwcwkwCS0KLVJ1bGUJRnJhbmNlCTE5MjIJb25seQktCU1hcgkyNQkyMzowMHMJMTowMAlTCi0jIERTSCB3cml0ZXMgdGhhdCBhIGxhdyBvZiAxOTIzLTA1LTI0IHNwZWNpZmllZCAzcmQgU2F0IGluIEFwciBhdCAyMzowMCB0byAxc3QKLSMgU2F0IGluIE9jdCBhdCAyNDowMDsgYW5kIHRoYXQgaW4gMTkzMCwgYmVjYXVzZSBvZiBFYXN0ZXIsIHRoZSB0cmFuc2l0aW9ucwotIyB3ZXJlIEFwciAxMiBhbmQgT2N0IDUuICBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJRnJhbmNlCTE5MjIJMTkzOAktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlGcmFuY2UJMTkyMwlvbmx5CS0JTWF5CTI2CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MjQJb25seQktCU1hcgkyOQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTI1CW9ubHkJLQlBcHIJIDQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MjcJb25seQktCUFwcgkgOQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkyOQlvbmx5CS0JQXByCTIwCTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzAJb25seQktCUFwcgkxMgkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTMxCW9ubHkJLQlBcHIJMTgJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzMglvbmx5CS0JQXByCSAyCTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzMJb25seQktCU1hcgkyNQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTM0CW9ubHkJLQlBcHIJIDcJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzNQlvbmx5CS0JTWFyCTMwCTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzYJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTM3CW9ubHkJLQlBcHIJIDMJMjM6MDBzCTE6MDAJUwotUnVsZQlGcmFuY2UJMTkzOAlvbmx5CS0JTWFyCTI2CTIzOjAwcwkxOjAwCVMKLVJ1bGUJRnJhbmNlCTE5MzkJb25seQktCUFwcgkxNQkyMzowMHMJMTowMAlTCi1SdWxlCUZyYW5jZQkxOTM5CW9ubHkJLQlOb3YJMTgJMjM6MDBzCTAJLQotUnVsZQlGcmFuY2UJMTk0MAlvbmx5CS0JRmViCTI1CSAyOjAwCTE6MDAJUwotIyBUaGUgRnJlbmNoIHJ1bGVzIGZvciAxOTQxLTE5NDQgd2VyZSBub3QgdXNlZCBpbiBQYXJpcywgYnV0IFNoYW5rcyAmIFBvdHRlbmdlcgotIyB3cml0ZSB0aGF0IHRoZXkgd2VyZSB1c2VkIGluIE1vbmFjbyBhbmQgaW4gbWFueSBGcmVuY2ggbG9jYXRpb25zLgotIyBMZSBDb3JyZSB3cml0ZXMgdGhhdCB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIGZyZWUgem9uZSB3YXMgQXJuZWd1eSwgT3J0aGV6LAotIyBNb250LWRlLU1hcnNhbiwgQmF6YXMsIExhbmdvbiwgTGFtb3R0ZS1Nb250cmF2ZWwsIE1hcm91aWwsIExhCi0jIFJvY2hlZm91Y2F1bHQsIENoYW1wYWduZS1Nb3V0b24sIExhIFJvY2hlLVBvc2F5LCBMYSBIYXllLURlY2FydGVzLAotIyBMb2NoZXMsIE1vbnRyaWNoYXJkLCBWaWVyem9uLCBCb3VyZ2VzLCBNb3VsaW5zLCBEaWdvaW4sCi0jIFBhcmF5LWxlLU1vbmlhbCwgTW9udGNlYXUtbGVzLU1pbmVzLCBDaGFsb25zLXN1ci1TYW9uZSwgQXJib2lzLAotIyBEb2xlLCBNb3JleiwgU3QtQ2xhdWRlLCBhbmQgQ29sbG9nbmVzIChIYXV0ZS1TYXZpb2UpLgotUnVsZQlGcmFuY2UJMTk0MQlvbmx5CS0JTWF5CSA1CSAwOjAwCTI6MDAJTSAjIE1pZHN1bW1lcgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoaXMgdHJhbnNpdGlvbiBvY2N1cnJlZCBhdCBPY3QgNiAxOjAwLAotIyBidXQgZ28gd2l0aCBEZW5pcyBFeGNvZmZpZXIgKDE5OTctMTItMTIpLAotIyB3aG8gcXVvdGVzIHRoZSBFcGhlbWVyaWRlcyBBc3Ryb25vbWlxdWVzIGZvciAxOTk4IGZyb20gQnVyZWF1IGRlcyBMb25naXR1ZGVzCi0jIGFzIHNheWluZyA1LzEwLzQxIDIyaFVULgotUnVsZQlGcmFuY2UJMTk0MQlvbmx5CS0JT2N0CSA2CSAwOjAwCTE6MDAJUwotUnVsZQlGcmFuY2UJMTk0Mglvbmx5CS0JTWFyCSA5CSAwOjAwCTI6MDAJTQotUnVsZQlGcmFuY2UJMTk0Mglvbmx5CS0JTm92CSAyCSAzOjAwCTE6MDAJUwotUnVsZQlGcmFuY2UJMTk0Mwlvbmx5CS0JTWFyCTI5CSAyOjAwCTI6MDAJTQotUnVsZQlGcmFuY2UJMTk0Mwlvbmx5CS0JT2N0CSA0CSAzOjAwCTE6MDAJUwotUnVsZQlGcmFuY2UJMTk0NAlvbmx5CS0JQXByCSAzCSAyOjAwCTI6MDAJTQotUnVsZQlGcmFuY2UJMTk0NAlvbmx5CS0JT2N0CSA4CSAxOjAwCTE6MDAJUwotUnVsZQlGcmFuY2UJMTk0NQlvbmx5CS0JQXByCSAyCSAyOjAwCTI6MDAJTQotUnVsZQlGcmFuY2UJMTk0NQlvbmx5CS0JU2VwCTE2CSAzOjAwCTAJLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSBNYXIgMjggMjowMCBhbmQgU2VwIDI2IDM6MDA7Ci0jIGdvIHdpdGggRXhjb2ZmaWVyJ3MgMjgvMy83NiAwaFVUIGFuZCAyNS85Lzc2IDIzaFVULgotUnVsZQlGcmFuY2UJMTk3Nglvbmx5CS0JTWFyCTI4CSAxOjAwCTE6MDAJUwotUnVsZQlGcmFuY2UJMTk3Nglvbmx5CS0JU2VwCTI2CSAxOjAwCTAJLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAwOjA5OjIwIGZvciBQYXJpcyBNZWFuIFRpbWUsIGFuZCBXaGl0bWFuIDA6MDk6MDUsCi0jIGJ1dCBIb3dzZSBxdW90ZXMgdGhlIGFjdHVhbCBGcmVuY2ggbGVnaXNsYXRpb24gYXMgc2F5aW5nIDA6MDk6MjEuCi0jIEdvIHdpdGggSG93c2UuICBIb3dzZSB3cml0ZXMgdGhhdCB0aGUgdGltZSBpbiBGcmFuY2Ugd2FzIG9mZmljaWFsbHkgYmFzZWQKLSMgb24gUE1ULTA6MDk6MjEgdW50aWwgMTk3OC0wOC0wOSwgd2hlbiB0aGUgdGltZSBiYXNlIGZpbmFsbHkgc3dpdGNoZWQgdG8gVVRDLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvUGFyaXMJMDowOToyMSAtCUxNVAkxODkxIE1hciAxNSAgMDowMQotCQkJMDowOToyMQktCVBNVAkxOTExIE1hciAxMSAgMDowMSAgIyBQYXJpcyBNVAotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTQwIEp1biAxNCAwOjAwOyBnbyB3aXRoIEV4Y29mZmllciBhbmQgTGUgQ29ycmUuCi0JCQkwOjAwCUZyYW5jZQlXRSVzVAkxOTQwIEp1biAxNCAyMzowMAotIyBMZSBDb3JyZSBzYXlzIFBhcmlzIHN0dWNrIHdpdGggb2NjdXBpZWQtRnJhbmNlIHRpbWUgYWZ0ZXIgdGhlIGxpYmVyYXRpb247Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZyAyNQotCQkJMDowMAlGcmFuY2UJV0Ulc1QJMTk0NSBTZXAgMTYgIDM6MDAKLQkJCTE6MDAJRnJhbmNlCUNFJXNUCTE5NzcKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBHZXJtYW55Ci0KLSMgRnJvbSBNYXJrdXMgS3VobiAoMTk5OC0wOS0yOSk6Ci0jIFRoZSBHZXJtYW4gdGltZSB6b25lIHdlYiBzaXRlIGJ5IHRoZSBQaHlzaWthbGlzY2gtVGVjaG5pc2NoZQotIyBCdW5kZXNhbnN0YWx0IGNvbnRhaW5zIERTVCBpbmZvcm1hdGlvbiBiYWNrIHRvIDE5MTYuCi0jIFtTZWUgdHotbGluay5odG0gZm9yIHRoZSBVUkwuXQotCi0jIEZyb20gSm9lcmcgU2NoaWxsaW5nICgyMDAyLTEwLTIzKToKLSMgSW4gMTk0NSwgQmVybGluIHdhcyBzd2l0Y2hlZCB0byBNb3Njb3cgU3VtbWVyIHRpbWUgKEdNVCs0KSBieQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRobS5kZS9sZW1vL2h0bWwvYmlvZ3JhZmllbi9CZXJzYXJpbk5pa29sYWkvIj4KLSMgR2VuZXJhbCBbTmlrb2xhaV0gQmVyc2FyaW48L2E+LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDMtMDMtMDgpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmIj4KLSMgaHR0cDovL3d3dy5wYXJsYW1lbnQtYmVybGluLmRlL3Bkcy1mcmFrdGlvbi5uc2YvNzI3NDU5MTI3YzhiNjZlZTg1MjU2NjIzMDA0NTkwOTkvZGVmYzc3Y2I3ODRmMTgwYWMxMjU2YzJiMDAzMDI3NGIvJEZJTEUvYmVyc2FyaW50LnBkZgotIyA8L2E+Ci0jIHNheXMgdGhhdCBCZXJzYXJpbiBpc3N1ZWQgYW4gb3JkZXIgdG8gdXNlIE1vc2NvdyB0aW1lIG9uIE1heSAyMC4KLSMgSG93ZXZlciwgTW9zY293IGRpZCBub3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgaW4gMTk0NSwgc28KLSMgdGhpcyB3YXMgZXF1aXZhbGVudCB0byBDRU1UIChHTVQrMyksIG5vdCBHTVQrNC4KLQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlHZXJtYW55CTE5NDYJb25seQktCUFwcgkxNAkyOjAwcwkxOjAwCVMKLVJ1bGUJR2VybWFueQkxOTQ2CW9ubHkJLQlPY3QJIDcJMjowMHMJMAktCi1SdWxlCUdlcm1hbnkJMTk0NwkxOTQ5CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KLSMgaHR0cDovL3d3dy5wdGIuZGUvZGUvb3JnLzQvNDQvNDQxL3NhbHQuaHRtIHNheXMgdGhlIGZvbGxvd2luZyB0cmFuc2l0aW9uCi0jIG9jY3VycmVkIGF0IDM6MDAgTUVaLCBub3QgdGhlIDI6MDAgTUVaIGdpdmVuIGluIFNoYW5rcyAmIFBvdHRlbmdlci4KLSMgR28gd2l0aCB0aGUgUFRCLgotUnVsZQlHZXJtYW55CTE5NDcJb25seQktCUFwcgkgNgkzOjAwcwkxOjAwCVMKLVJ1bGUJR2VybWFueQkxOTQ3CW9ubHkJLQlNYXkJMTEJMjowMHMJMjowMAlNCi1SdWxlCUdlcm1hbnkJMTk0Nwlvbmx5CS0JSnVuCTI5CTM6MDAJMTowMAlTCi1SdWxlCUdlcm1hbnkJMTk0OAlvbmx5CS0JQXByCTE4CTI6MDBzCTE6MDAJUwotUnVsZQlHZXJtYW55CTE5NDkJb25seQktCUFwcgkxMAkyOjAwcwkxOjAwCVMKLQotUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCU1heQkyNAkyOjAwCTI6MDAJTSAjIE1pZHN1bW1lcgotUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCVNlcAkyNAkzOjAwCTE6MDAJUwotUnVsZSBTb3ZpZXRab25lCTE5NDUJb25seQktCU5vdgkxOAkyOjAwcwkwCS0KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvQmVybGluCTA6NTM6MjggLQlMTVQJMTg5MyBBcHIKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBNYXkgMjQgMjowMAotCQkJMTowMCBTb3ZpZXRab25lCUNFJXNUCTE5NDYKLQkJCTE6MDAJR2VybWFueQlDRSVzVAkxOTgwCi0JCQkxOjAwCUVVCUNFJXNUCi0KLSMgR2VvcmdpYQotIyBQbGVhc2Ugc2VlIHRoZSAiYXNpYSIgZmlsZSBmb3IgQXNpYS9UYmlsaXNpLgotIyBIZXJvZG90dXMgKEhpc3RvcmllcywgSVYuNDUpIHNheXMgR2VvcmdpYSBub3J0aCBvZiB0aGUgUGhhc2lzIChub3cgUmlvbmkpCi0jIGlzIGluIEV1cm9wZS4gIE91ciByZWZlcmVuY2UgbG9jYXRpb24gVGJpbGlzaSBpcyBpbiB0aGUgQXNpYW4gcGFydC4KLQotIyBHaWJyYWx0YXIKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgRXVyb3BlL0dpYnJhbHRhcgktMDoyMToyNCAtCUxNVAkxODgwIEF1ZyAgMiAwOjAwcwotCQkJMDowMAlHQi1FaXJlCSVzCTE5NTcgQXByIDE0IDI6MDAKLQkJCTE6MDAJLQlDRVQJMTk4MgotCQkJMTowMAlFVQlDRSVzVAotCi0jIEdyZWVjZQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgV2hpdG1hbiBnaXZlcyAxOTMyIEp1bCA1IC0gTm92IDE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlHcmVlY2UJMTkzMglvbmx5CS0JSnVsCSA3CTA6MDAJMTowMAlTCi1SdWxlCUdyZWVjZQkxOTMyCW9ubHkJLQlTZXAJIDEJMDowMAkwCS0KLSMgV2hpdG1hbiBnaXZlcyAxOTQxIEFwciAyNSAtID87IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlHcmVlY2UJMTk0MQlvbmx5CS0JQXByCSA3CTA6MDAJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTk0MiBGZWIgMiAtID87IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlHcmVlY2UJMTk0Mglvbmx5CS0JTm92CSAyCTM6MDAJMAktCi1SdWxlCUdyZWVjZQkxOTQzCW9ubHkJLQlNYXIJMzAJMDowMAkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5NDMJb25seQktCU9jdAkgNAkwOjAwCTAJLQotIyBXaGl0bWFuIGdpdmVzIDE5NDQgT2N0IDMgLSBPY3QgMzE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlHcmVlY2UJMTk1Mglvbmx5CS0JSnVsCSAxCTA6MDAJMTowMAlTCi1SdWxlCUdyZWVjZQkxOTUyCW9ubHkJLQlOb3YJIDIJMDowMAkwCS0KLVJ1bGUJR3JlZWNlCTE5NzUJb25seQktCUFwcgkxMgkwOjAwcwkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5NzUJb25seQktCU5vdgkyNgkwOjAwcwkwCS0KLVJ1bGUJR3JlZWNlCTE5NzYJb25seQktCUFwcgkxMQkyOjAwcwkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5NzYJb25seQktCU9jdAkxMAkyOjAwcwkwCS0KLVJ1bGUJR3JlZWNlCTE5NzcJMTk3OAktCUFwcglTdW4+PTEJMjowMHMJMTowMAlTCi1SdWxlCUdyZWVjZQkxOTc3CW9ubHkJLQlTZXAJMjYJMjowMHMJMAktCi1SdWxlCUdyZWVjZQkxOTc4CW9ubHkJLQlTZXAJMjQJNDowMAkwCS0KLVJ1bGUJR3JlZWNlCTE5NzkJb25seQktCUFwcgkgMQk5OjAwCTE6MDAJUwotUnVsZQlHcmVlY2UJMTk3OQlvbmx5CS0JU2VwCTI5CTI6MDAJMAktCi1SdWxlCUdyZWVjZQkxOTgwCW9ubHkJLQlBcHIJIDEJMDowMAkxOjAwCVMKLVJ1bGUJR3JlZWNlCTE5ODAJb25seQktCVNlcAkyOAkwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvQXRoZW5zCTE6MzQ6NTIgLQlMTVQJMTg5NSBTZXAgMTQKLQkJCTE6MzQ6NTIJLQlBTVQJMTkxNiBKdWwgMjggMDowMSAgICAgIyBBdGhlbnMgTVQKLQkJCTI6MDAJR3JlZWNlCUVFJXNUCTE5NDEgQXByIDMwCi0JCQkxOjAwCUdyZWVjZQlDRSVzVAkxOTQ0IEFwciAgNAotCQkJMjowMAlHcmVlY2UJRUUlc1QJMTk4MQotCQkJIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IGl0IHN3aXRjaGVkIHRvIEMtRXVyIGluIDE5ODE7Ci0JCQkjIGdvIHdpdGggRVUgaW5zdGVhZCwgc2luY2UgR3JlZWNlIGpvaW5lZCBpdCBvbiBKYW4gMS4KLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBIdW5nYXJ5Ci0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlIdW5nYXJ5CTE5MTgJb25seQktCUFwcgkgMQkgMzowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTE4CW9ubHkJLQlTZXAJMjkJIDM6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTkxOQlvbmx5CS0JQXByCTE1CSAzOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5MTkJb25seQktCVNlcAkxNQkgMzowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTIwCW9ubHkJLQlBcHIJIDUJIDM6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTkyMAlvbmx5CS0JU2VwCTMwCSAzOjAwCTAJLQotUnVsZQlIdW5nYXJ5CTE5NDUJb25seQktCU1heQkgMQkyMzowMAkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTQ1CW9ubHkJLQlOb3YJIDMJIDA6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTk0Nglvbmx5CS0JTWFyCTMxCSAyOjAwcwkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTQ2CTE5NDkJLQlPY3QJU3VuPj0xCSAyOjAwcwkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTQ3CTE5NDkJLQlBcHIJU3VuPj00CSAyOjAwcwkxOjAwCVMKLVJ1bGUJSHVuZ2FyeQkxOTUwCW9ubHkJLQlBcHIJMTcJIDI6MDBzCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NTAJb25seQktCU9jdAkyMwkgMjowMHMJMAktCi1SdWxlCUh1bmdhcnkJMTk1NAkxOTU1CS0JTWF5CTIzCSAwOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NTQJMTk1NQktCU9jdAkgMwkgMDowMAkwCS0KLVJ1bGUJSHVuZ2FyeQkxOTU2CW9ubHkJLQlKdW4JU3VuPj0xCSAwOjAwCTE6MDAJUwotUnVsZQlIdW5nYXJ5CTE5NTYJb25seQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQotUnVsZQlIdW5nYXJ5CTE5NTcJb25seQktCUp1bglTdW4+PTEJIDE6MDAJMTowMAlTCi1SdWxlCUh1bmdhcnkJMTk1Nwlvbmx5CS0JU2VwCWxhc3RTdW4JIDM6MDAJMAktCi1SdWxlCUh1bmdhcnkJMTk4MAlvbmx5CS0JQXByCSA2CSAxOjAwCTE6MDAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvQnVkYXBlc3QJMToxNjoyMCAtCUxNVAkxODkwIE9jdAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTE4Ci0JCQkxOjAwCUh1bmdhcnkJQ0Ulc1QJMTk0MSBBcHIgIDYgIDI6MDAKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NQotCQkJMTowMAlIdW5nYXJ5CUNFJXNUCTE5ODAgU2VwIDI4ICAyOjAwcwotCQkJMTowMAlFVQlDRSVzVAotCi0jIEljZWxhbmQKLSMKLSMgRnJvbSBBZGFtIERhdmlkICgxOTkzLTExLTA2KToKLSMgVGhlIG5hbWUgb2YgdGhlIHRpbWV6b25lIGluIEljZWxhbmQgZm9yIHN5c3RlbSAvIG1haWwgLyBuZXdzIHB1cnBvc2VzIGlzIEdNVC4KLSMKLSMgKDE5OTMtMTItMDUpOgotIyBUaGlzIG1hdGVyaWFsIGlzIHBhcmFwaHJhc2VkIGZyb20gdGhlIDE5ODggZWRpdGlvbiBvZiB0aGUgVW5pdmVyc2l0eSBvZgotIyBJY2VsYW5kIEFsbWFuYWsuCi0jCi0jIEZyb20gSmFudWFyeSAxc3QsIDE5MDggdGhlIHdob2xlIG9mIEljZWxhbmQgd2FzIHN0YW5kYXJkaXNlZCBhdCAxIGhvdXIKLSMgYmVoaW5kIEdNVC4gUHJldmlvdXNseSwgbG9jYWwgbWVhbiBzb2xhciB0aW1lIHdhcyB1c2VkIGluIGRpZmZlcmVudCBwYXJ0cwotIyBvZiBJY2VsYW5kLCB0aGUgYWxtYW5hayBoYWQgYmVlbiBiYXNlZCBvbiBSZXlramF2aWsgbWVhbiBzb2xhciB0aW1lIHdoaWNoCi0jIHdhcyAxIGhvdXIgYW5kIDI4IG1pbnV0ZXMgYmVoaW5kIEdNVC4KLSMKLSMgImZpcnN0IGRheSBvZiB3aW50ZXIiIHJlZmVycmVkIHRvIFtiZWxvd10gbWVhbnMgdGhlIGZpcnN0IGRheSBvZiB0aGUgMjYgd2Vla3MKLSMgb2Ygd2ludGVyLCBhY2NvcmRpbmcgdG8gdGhlIG9sZCBpY2VsYW5kaWMgY2FsZW5kYXIgdGhhdCBkYXRlcyBiYWNrIHRvIHRoZQotIyB0aW1lIHRoZSBub3JzZW1lbiBmaXJzdCBzZXR0bGVkIEljZWxhbmQuICBUaGUgZmlyc3QgZGF5IG9mIHdpbnRlciBpcyBhbHdheXMKLSMgU2F0dXJkYXksIGJ1dCBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBKdWxpYW4gb3IgR3JlZ29yaWFuIGNhbGVuZGFycy4KLSMKLSMgKDE5OTMtMTItMTApOgotIyBJIGhhdmUgYSByZWZlcmVuY2UgZnJvbSB0aGUgT3hmb3JkIEljZWxhbmRpYy1FbmdsaXNoIGRpY3Rpb25hcnkgZm9yIHRoZQotIyBiZWdpbm5pbmcgb2Ygd2ludGVyLCB3aGljaCB0aWVzIGl0IHRvIHRoZSBlY2NsZXNpYXN0aWNhbCBjYWxlbmRhciAoYW5kIHRodXMKLSMgdG8gdGhlIGp1bGlhbi9ncmVnb3JpYW4gY2FsZW5kYXIpIG92ZXIgdGhlIHBlcmlvZCBpbiBxdWVzdGlvbi4KLSMJdGhlIHdpbnRlciBiZWdpbnMgb24gdGhlIFNhdHVyZGF5IG5leHQgYmVmb3JlIFN0LiBMdWtlJ3MgZGF5Ci0jCShvbGQgc3R5bGUpLCBvciBvbiBTdC4gTHVrZSdzIGRheSwgaWYgYSBTYXR1cmRheS4KLSMgU3QuIEx1a2UncyBkYXkgb3VnaHQgdG8gYmUgdHJhY2VhYmxlIGZyb20gZWNjbGVzaWFzdGljYWwgc291cmNlcy4gIm9sZCBzdHlsZSIKLSMgbWlnaHQgYmUgYSByZWZlcmVuY2UgdG8gdGhlIEp1bGlhbiBjYWxlbmRhciBhcyBvcHBvc2VkIHRvIEdyZWdvcmlhbiwgb3IgaXQKLSMgbWlnaHQgbWVhbiBzb21ldGhpbmcgZWxzZSAoPz8/KS4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFRoZSBJY2VsYW5kIEFsbWFuYWssIFNoYW5rcyAmIFBvdHRlbmdlciwgYW5kIFdoaXRtYW4gZGlzYWdyZWUgb24gbWFueSBwb2ludHMuCi0jIFdlIGdvIHdpdGggdGhlIEFsbWFuYWssIGV4Y2VwdCBmb3Igb25lIGNsYWltIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLCBuYW1lbHkKLSMgdGhhdCBSZXlrYXZpayB3YXMgMjFXNTcgZnJvbSAxODM3IHRvIDE5MDgsIGxvY2FsIG1lYW4gdGltZSBiZWZvcmUgdGhhdC4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUljZWxhbmQJMTkxNwkxOTE4CS0JRmViCTE5CTIzOjAwCTE6MDAJUwotUnVsZQlJY2VsYW5kCTE5MTcJb25seQktCU9jdAkyMQkgMTowMAkwCS0KLVJ1bGUJSWNlbGFuZAkxOTE4CW9ubHkJLQlOb3YJMTYJIDE6MDAJMAktCi1SdWxlCUljZWxhbmQJMTkzOQlvbmx5CS0JQXByCTI5CTIzOjAwCTE6MDAJUwotUnVsZQlJY2VsYW5kCTE5MzkJb25seQktCU5vdgkyOQkgMjowMAkwCS0KLVJ1bGUJSWNlbGFuZAkxOTQwCW9ubHkJLQlGZWIJMjUJIDI6MDAJMTowMAlTCi1SdWxlCUljZWxhbmQJMTk0MAlvbmx5CS0JTm92CSAzCSAyOjAwCTAJLQotUnVsZQlJY2VsYW5kCTE5NDEJb25seQktCU1hcgkgMgkgMTowMHMJMTowMAlTCi1SdWxlCUljZWxhbmQJMTk0MQlvbmx5CS0JTm92CSAyCSAxOjAwcwkwCS0KLVJ1bGUJSWNlbGFuZAkxOTQyCW9ubHkJLQlNYXIJIDgJIDE6MDBzCTE6MDAJUwotUnVsZQlJY2VsYW5kCTE5NDIJb25seQktCU9jdAkyNQkgMTowMHMJMAktCi0jIDE5NDMtMTk0NiAtIGZpcnN0IFN1bmRheSBpbiBNYXJjaCB1bnRpbCBmaXJzdCBTdW5kYXkgaW4gd2ludGVyCi1SdWxlCUljZWxhbmQJMTk0MwkxOTQ2CS0JTWFyCVN1bj49MQkgMTowMHMJMTowMAlTCi1SdWxlCUljZWxhbmQJMTk0MwkxOTQ4CS0JT2N0CVN1bj49MjIJIDE6MDBzCTAJLQotIyAxOTQ3LTE5NjcgLSBmaXJzdCBTdW5kYXkgaW4gQXByaWwgdW50aWwgZmlyc3QgU3VuZGF5IGluIHdpbnRlcgotUnVsZQlJY2VsYW5kCTE5NDcJMTk2NwktCUFwcglTdW4+PTEJIDE6MDBzCTE6MDAJUwotIyAxOTQ5IE9jdCB0cmFuc2l0aW9uIGRlbGF5ZWQgYnkgMSB3ZWVrCi1SdWxlCUljZWxhbmQJMTk0OQlvbmx5CS0JT2N0CTMwCSAxOjAwcwkwCS0KLVJ1bGUJSWNlbGFuZAkxOTUwCTE5NjYJLQlPY3QJU3VuPj0yMgkgMTowMHMJMAktCi1SdWxlCUljZWxhbmQJMTk2Nwlvbmx5CS0JT2N0CTI5CSAxOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvUmV5a2phdmlrCS0xOjI3OjI0IC0JTE1UCTE4MzcKLQkJCS0xOjI3OjQ4IC0JUk1UCTE5MDggIyBSZXlramF2aWsgTWVhbiBUaW1lPwotCQkJLTE6MDAJSWNlbGFuZAlJUyVzVAkxOTY4IEFwciA3IDE6MDBzCi0JCQkgMDowMAktCUdNVAotCi0jIEl0YWx5Ci0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDYpOgotIyBTaWNpbHkgYW5kIFNhcmRpbmlhIGVhY2ggaGFkIHRoZWlyIG93biB0aW1lIHpvbmVzIGZyb20gMTg2NiB0byAxODkzLAotIyBjYWxsZWQgUGFsZXJtbyBUaW1lICgrMDA6NTM6MjgpIGFuZCBDYWdsaWFyaSBUaW1lICgrMDA6MzY6MzIpLgotIyBEdXJpbmcgV29ybGQgV2FyIElJLCBHZXJtYW4tY29udHJvbGxlZCBJdGFseSB1c2VkIEdlcm1hbiB0aW1lLgotIyBCdXQgdGhlc2UgZXZlbnRzIGFsbCBvY2N1cnJlZCBiZWZvcmUgdGhlIDE5NzAgY3V0b2ZmLAotIyBzbyByZWNvcmQgb25seSB0aGUgdGltZSBpbiBSb21lLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgRm9yIEl0YWxpYW4gRFNUIHdlIGhhdmUgdGhyZWUgc291cmNlczogU2hhbmtzICYgUG90dGVuZ2VyLCBXaGl0bWFuLCBhbmQKLSMgRi4gUG9sbGFzdHJpCi0jIDxhIGhyZWY9Imh0dHA6Ly90b2kuaXJpdGkuY25yLml0L3VrL2llbml0bHQuaHRtbCI+Ci0jIERheS1saWdodCBTYXZpbmcgVGltZSBpbiBJdGFseSAoMjAwNi0wMi0wMykKLSMgPC9hPgotIyAoYEZQJyBiZWxvdyksIHRha2VuIGZyb20gYW4gSXRhbGlhbiBOYXRpb25hbCBFbGVjdHJvdGVjaG5pY2FsIEluc3RpdHV0ZQotIyBwdWJsaWNhdGlvbi4gV2hlbiB0aGUgdGhyZWUgc291cmNlcyBkaXNhZ3JlZSwgZ3Vlc3Mgd2hvJ3MgcmlnaHQsIGFzIGZvbGxvd3M6Ci0jCi0jIHllYXIJRlAJU2hhbmtzJlAuIChTKQlXaGl0bWFuIChXKQlHbyB3aXRoOgotIyAxOTE2CTA2LTAzCTA2LTAzIDI0OjAwCTA2LTAzIDAwOjAwCUZQICYgVwotIwkwOS0zMAkwOS0zMCAyNDowMAkwOS0zMCAwMTowMAlGUDsgZ3Vlc3MgMjQ6MDBzCi0jIDE5MTcJMDQtMDEJMDMtMzEgMjQ6MDAJMDMtMzEgMDA6MDAJRlAgJiBTCi0jCTA5LTMwCTA5LTI5IDI0OjAwCTA5LTMwIDAxOjAwCUZQICYgVwotIyAxOTE4CTAzLTA5CTAzLTA5IDI0OjAwCTAzLTA5IDAwOjAwCUZQICYgUwotIwkxMC0wNgkxMC0wNSAyNDowMAkxMC0wNiAwMTowMAlGUCAmIFcKLSMgMTkxOQkwMy0wMQkwMy0wMSAyNDowMAkwMy0wMSAwMDowMAlGUCAmIFMKLSMJMTAtMDQJMTAtMDQgMjQ6MDAJMTAtMDQgMDE6MDAJRlA7IGd1ZXNzIDI0OjAwcwotIyAxOTIwCTAzLTIwCTAzLTIwIDI0OjAwCTAzLTIwIDAwOjAwCUZQICYgUwotIwkwOS0xOAkwOS0xOCAyNDowMAkxMC0wMSAwMTowMAlGUDsgZ3Vlc3MgMjQ6MDBzCi0jIDE5NDQJMDQtMDIJMDQtMDMgMDI6MDAJCQlTIChzZWUgQy1FdXIpCi0jCTA5LTE2CTEwLTAyIDAzOjAwCQkJRlA7IGd1ZXNzIDI0OjAwcwotIyAxOTQ1CTA5LTE0CTA5LTE2IDI0OjAwCQkJRlA7IGd1ZXNzIDI0OjAwcwotIyAxOTcwCTA1LTIxCTA1LTMxIDAwOjAwCQkJUwotIwkwOS0yMAkwOS0yNyAwMDowMAkJCVMKLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUl0YWx5CTE5MTYJb25seQktCUp1bgkgMwkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTE3CW9ubHkJLQlBcHIJIDEJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5MTcJb25seQktCVNlcAkzMAkwOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTkxOAlvbmx5CS0JTWFyCTEwCTA6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTE4CTE5MTkJLQlPY3QJU3VuPj0xCTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTE5CW9ubHkJLQlNYXIJIDIJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5MjAJb25seQktCU1hcgkyMQkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTkyMAlvbmx5CS0JU2VwCTE5CTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTQwCW9ubHkJLQlKdW4JMTUJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NDQJb25seQktCVNlcAkxNwkwOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTk0NQlvbmx5CS0JQXByCSAyCTI6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NDUJb25seQktCVNlcAkxNQkwOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTk0Nglvbmx5CS0JTWFyCTE3CTI6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTQ2CW9ubHkJLQlPY3QJIDYJMjowMHMJMAktCi1SdWxlCUl0YWx5CTE5NDcJb25seQktCU1hcgkxNgkwOjAwcwkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk0Nwlvbmx5CS0JT2N0CSA1CTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTQ4CW9ubHkJLQlGZWIJMjkJMjowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NDgJb25seQktCU9jdAkgMwkyOjAwcwkwCS0KLVJ1bGUJSXRhbHkJMTk2NgkxOTY4CS0JTWF5CVN1bj49MjIJMDowMAkxOjAwCVMKLVJ1bGUJSXRhbHkJMTk2NgkxOTY5CS0JU2VwCVN1bj49MjIJMDowMAkwCS0KLVJ1bGUJSXRhbHkJMTk2OQlvbmx5CS0JSnVuCSAxCTA6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzAJb25seQktCU1heQkzMQkwOjAwCTE6MDAJUwotUnVsZQlJdGFseQkxOTcwCW9ubHkJLQlTZXAJbGFzdFN1bgkwOjAwCTAJLQotUnVsZQlJdGFseQkxOTcxCTE5NzIJLQlNYXkJU3VuPj0yMgkwOjAwCTE6MDAJUwotUnVsZQlJdGFseQkxOTcxCW9ubHkJLQlTZXAJbGFzdFN1bgkxOjAwCTAJLQotUnVsZQlJdGFseQkxOTcyCW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJSXRhbHkJMTk3Mwlvbmx5CS0JSnVuCSAzCTA6MDAJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzMJMTk3NAktCVNlcAlsYXN0U3VuCTA6MDAJMAktCi1SdWxlCUl0YWx5CTE5NzQJb25seQktCU1heQkyNgkwOjAwCTE6MDAJUwotUnVsZQlJdGFseQkxOTc1CW9ubHkJLQlKdW4JIDEJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzUJMTk3NwktCVNlcAlsYXN0U3VuCTA6MDBzCTAJLQotUnVsZQlJdGFseQkxOTc2CW9ubHkJLQlNYXkJMzAJMDowMHMJMTowMAlTCi1SdWxlCUl0YWx5CTE5NzcJMTk3OQktCU1heQlTdW4+PTIyCTA6MDBzCTE6MDAJUwotUnVsZQlJdGFseQkxOTc4CW9ubHkJLQlPY3QJIDEJMDowMHMJMAktCi1SdWxlCUl0YWx5CTE5NzkJb25seQktCVNlcAkzMAkwOjAwcwkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1JvbWUJMDo0OTo1NiAtCUxNVAkxODY2IFNlcCAyMgotCQkJMDo0OTo1NgktCVJNVAkxODkzIE5vdiAgMSAwOjAwcyAjIFJvbWUgTWVhbgotCQkJMTowMAlJdGFseQlDRSVzVAkxOTQyIE5vdiAgMiAyOjAwcwotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEp1bAotCQkJMTowMAlJdGFseQlDRSVzVAkxOTgwCi0JCQkxOjAwCUVVCUNFJXNUCi0KLUxpbmsJRXVyb3BlL1JvbWUJRXVyb3BlL1ZhdGljYW4KLUxpbmsJRXVyb3BlL1JvbWUJRXVyb3BlL1Nhbl9NYXJpbm8KLQotIyBMYXR2aWEKLQotIyBGcm9tIExpZW5lIEthbmVwZSAoMTk5OC0wOS0xNyk6Ci0KLSMgSSBhc2tlZCBhYm91dCB0aGlzIG1hdHRlciBTY2llbnRpZmljIFNlY3JldGFyeSBvZiB0aGUgSW5zdGl0dXRlIG9mIEFzdHJvbm9teQotIyBvZiBUaGUgVW5pdmVyc2l0eSBvZiBMYXR2aWEgRHIuIHBhZWQgTXIuIElsZ29uaXMgVmlsa3MuIEkgYWxzbyBzZWFyY2hlZCB0aGUKLSMgY29ycmVjdCBkYXRhIGluIGp1cmlkaWNhbCBhY3RzIGFuZCBJIGZvdW5kIHNvbWUganVyaWRpY2FsIGRvY3VtZW50cyBhYm91dAotIyBjaGFuZ2VzIGluIHRoZSBjb3VudGluZyBvZiB0aW1lIGluIExhdHZpYSBmcm9tIDE5ODEuLi4uCi0jCi0jIEFjdCBOby4zNSBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgTGF0dmlhbiBTU1Igb2YgMTk4MS0wMS0yMiAuLi4KLSMgYWNjb3JkaW5nIHRvIHRoZSBBY3QgTm8uOTI1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBVU1NSIG9mIDE5ODAtMTAtMjQKLSMgLi4uOiBhbGwgeWVhciByb3VuZCB0aGUgdGltZSBvZiAybmQgdGltZSB6b25lICsgMSBob3VyLCBpbiBhZGRpdGlvbiB0dXJuaW5nCi0jIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGZvcndhcmQgb24gMSBBcHJpbCBhdCAwMDowMCAoR01UIDMxIE1hcmNoIDIxOjAwKQotIyBhbmQgMSBob3VyIGJhY2t3YXJkIG9uIHRoZSAxIE9jdG9iZXIgYXQgMDA6MDAgKEdNVCAzMCBTZXB0ZW1iZXIgMjA6MDApLgotIwotIyBBY3QgTm8uNTkyIG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBMYXR2aWFuIFNTUiBvZiAxOTg0LTA5LTI0IC4uLgotIyBhY2NvcmRpbmcgdG8gdGhlIEFjdCBOby45Njcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIFVTU1Igb2YgMTk4NC0wOS0xMwotIyAuLi46IGFsbCB5ZWFyIHJvdW5kIHRoZSB0aW1lIG9mIDJuZCB0aW1lIHpvbmUgKyAxIGhvdXIsIGluIGFkZGl0aW9uIHR1cm5pbmcKLSMgdGhlIGhhbmRzIG9mIHRoZSBjbG9jayAxIGhvdXIgZm9yd2FyZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgTWFyY2ggYXQgMDI6MDAKLSMgKEdNVCAyMzowMCBvbiB0aGUgcHJldmlvdXMgZGF5KSBhbmQgMSBob3VyIGJhY2t3YXJkIG9uIHRoZSBsYXN0IFN1bmRheSBvZgotIyBTZXB0ZW1iZXIgYXQgMDM6MDAgKEdNVCAyMzowMCBvbiB0aGUgcHJldmlvdXMgZGF5KS4KLSMKLSMgQWN0IE5vLjgxIG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiBMYXR2aWFuIFNTUiBvZiAxOTg5LTAzLTIyIC4uLgotIyBhY2NvcmRpbmcgdG8gdGhlIEFjdCBOby4yMjcgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzIG9mIFVTU1Igb2YgMTk4OS0wMy0xNAotIyAuLi46IHNpbmNlIHRoZSBsYXN0IFN1bmRheSBvZiBNYXJjaCAxOTg5IGluIExpdGh1YW5pYW4gU1NSLCBMYXR2aWFuIFNTUiwKLSMgRXN0b25pYW4gU1NSIGFuZCBLYWxpbmluZ3JhZCByZWdpb24gb2YgUnVzc2lhbiBGZWRlcmF0aW9uIGFsbCB5ZWFyIHJvdW5kIHRoZQotIyB0aW1lIG9mIDJuZCB0aW1lIHpvbmUgKE1vc2NvdyB0aW1lIG1pbnVzIG9uZSBob3VyKS4gT24gdGhlIHRlcnJpdG9yeSBvZiBMYXR2aWEKLSMgdHJhbnNpdGlvbiB0byBzdW1tZXIgdGltZSBpcyBwZXJmb3JtZWQgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE1hcmNoIGF0IDAyOjAwCi0jIChHTVQgMDA6MDApLCB0dXJuaW5nIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGZvcndhcmQuICBUaGUgZW5kIG9mCi0jIGRheWxpZ2h0IHNhdmluZyB0aW1lIGlzIHBlcmZvcm1lZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyIGF0IDAzOjAwCi0jIChHTVQgMDA6MDApLCB0dXJuaW5nIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2sgMSBob3VyIGJhY2t3YXJkLiBFeGNlcHRpb24gaXMKLSMgMTk4OS0wMy0yNiwgd2hlbiB3ZSBtdXN0IG5vdCB0dXJuIHRoZSBoYW5kcyBvZiB0aGUgY2xvY2suLi4uCi0jCi0jIFRoZSBSZWd1bGF0aW9ucyBvZiB0aGUgQ2FiaW5ldCBvZiBNaW5pc3RlcnMgb2YgdGhlIFJlcHVibGljIG9mIExhdHZpYSBvZgotIyAxOTk3LTAxLTIxIG9uIHRyYW5zaXRpb24gdG8gU3VtbWVyIHRpbWUgLi4uIGVzdGFibGlzaGVkIHRoZSBzYW1lIG9yZGVyIG9mCi0jIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBzZXR0aW5ncyBhcyBpbiB0aGUgU3RhdGVzIG9mIHRoZSBFdXJvcGVhbiBVbmlvbi4KLQotIyBGcm9tIEFuZHJlaSBJdmFub3YgKDIwMDAtMDMtMDYpOgotIyBUaGlzIHllYXIgTGF0dmlhIHdpbGwgbm90IHN3aXRjaCB0byBEYXlsaWdodCBTYXZpbmdzIFRpbWUgKGFzIHNwZWNpZmllZCBpbgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lmx2LWxhaWtzLmx2L3d3d3Jha3N0aS8yMDAwLzA3MTA3Mi92ZDQuaHRtIj4KLSMgVGhlIFJlZ3VsYXRpb25zIG9mIHRoZSBDYWJpbmV0IG9mIE1pbmlzdGVycyBvZiB0aGUgUmVwLiBvZiBMYXR2aWEgb2YKLSMgMjktRmViLTIwMDAgKCM3OSk8L2E+LCBpbiBMYXR2aWFuIGZvciBzdWJzY3JpYmVycyBvbmx5KS4KLQotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJmZXJsLm9yZy9uZXdzbGluZS8yMDAxLzAxLzMtQ0VFL2NlZS0wMzAxMDEuaHRtbCI+Ci0jIEZyb20gUkZFL1JMIE5ld3NsaW5lICgyMDAxLTAxLTAzKSwgbm90ZWQgYWZ0ZXIgYSBoZWFkcy11cCBieSBSaXZlcyBNY0RvdzoKLSMgPC9hPgotIyBUaGUgTGF0dmlhbiBnb3Zlcm5tZW50IG9uIDIgSmFudWFyeSBkZWNpZGVkIHRoYXQgdGhlIGNvdW50cnkgd2lsbAotIyBpbnN0aXR1dGUgZGF5bGlnaHQtc2F2aW5nIHRpbWUgdGhpcyBzcHJpbmcsIExFVEEgcmVwb3J0ZWQuCi0jIExhc3QgRmVicnVhcnkgdGhlIHRocmVlIEJhbHRpYyBzdGF0ZXMgZGVjaWRlZCBub3QgdG8gdHVybiBiYWNrIHRoZWlyCi0jIGNsb2NrcyBvbmUgaG91ciBpbiB0aGUgc3ByaW5nLi4uLgotIyBNaW5pc3RlciBvZiBFY29ub215IEFpZ2FycyBLYWx2aXRpcyBub3RlZCB0aGF0IExhdHZpYSBoYWQgdG9vIGZldwotIyBkYXlsaWdodCBob3VycyBhbmQgdGh1cyBkZWNpZGVkIHRvIGNvbXBseSB3aXRoIGEgZHJhZnQgRXVyb3BlYW4KLSMgQ29tbWlzc2lvbiBkaXJlY3RpdmUgdGhhdCBwcm92aWRlcyBmb3IgaW5zdGl0dXRpbmcgZGF5bGlnaHQtc2F2aW5nCi0jIHRpbWUgaW4gRVUgY291bnRyaWVzIGJldHdlZW4gMjAwMiBhbmQgMjAwNi4gVGhlIExhdHZpYW4gZ292ZXJubWVudAotIyB1cmdlZCBMaXRodWFuaWEgYW5kIEVzdG9uaWEgdG8gYWRvcHQgYSBzaW1pbGFyIHRpbWUgcG9saWN5LCBidXQgaXQKLSMgYXBwZWFycyB0aGF0IHRoZXkgd2lsbCBub3QgZG8gc28uLi4uCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi1SdWxlCUxhdHZpYQkxOTg5CTE5OTYJLQlTZXAJbGFzdFN1bgkgMjowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9SaWdhCTE6MzY6MjQJLQlMTVQJMTg4MAotCQkJMTozNjoyNAktCVJNVAkxOTE4IEFwciAxNSAyOjAwICNSaWdhIE1lYW4gVGltZQotCQkJMTozNjoyNAkxOjAwCUxTVAkxOTE4IFNlcCAxNiAzOjAwICNMYXR2aWFuIFN1bW1lcgotCQkJMTozNjoyNAktCVJNVAkxOTE5IEFwciAgMSAyOjAwCi0JCQkxOjM2OjI0CTE6MDAJTFNUCTE5MTkgTWF5IDIyIDM6MDAKLQkJCTE6MzY6MjQJLQlSTVQJMTkyNiBNYXkgMTEKLQkJCTI6MDAJLQlFRVQJMTk0MCBBdWcgIDUKLQkJCTM6MDAJLQlNU0sJMTk0MSBKdWwKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBPY3QgMTMKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgbGFzdFN1biAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk4OSBTZXAgbGFzdFN1biAyOjAwcwotCQkJMjowMAlMYXR2aWEJRUUlc1QJMTk5NyBKYW4gMjEKLQkJCTI6MDAJRVUJRUUlc1QJMjAwMCBGZWIgMjkKLQkJCTI6MDAJLQlFRVQJMjAwMSBKYW4gIDIKLQkJCTI6MDAJRVUJRUUlc1QKLQotIyBMaWVjaHRlbnN0ZWluCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9WYWR1egkwOjM4OjA0IC0JTE1UCTE4OTQgSnVuCi0JCQkxOjAwCS0JQ0VUCTE5ODEKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBMaXRodWFuaWEKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTExLTIyKToKLSMgSUFUQSBTU0lNICgxOTkyLzE5OTYpIHNheXMgTGl0aHVhbmlhIHVzZXMgVy1FdXIgcnVsZXMsIGJ1dCBzaW5jZSBpdCBpcwotIyBrbm93biB0byBiZSB3cm9uZyBhYm91dCBFc3RvbmlhIGFuZCBMYXR2aWEsIGFzc3VtZSBpdCdzIHdyb25nIGhlcmUgdG9vLgotCi0jIEZyb20gTWFyaXVzIEdlZG1pbmFzICgxOTk4LTA4LTA3KToKLSMgSSB3b3VsZCBsaWtlIHRvIGluZm9ybSB0aGF0IGluIHRoaXMgeWVhciBMaXRodWFuaWFuIHRpbWUgem9uZQotIyAoRXVyb3BlL1ZpbG5pdXMpIHdhcyBjaGFuZ2VkLgotCi0jIEZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5lbHRhLmx0LyI+RUxUQTwvYT4gTm8uIDk3MiAoMjU4MikgKDE5OTktMDktMjkpLAotIyB2aWEgU3RlZmZlbiBUaG9yc2VuOgotIyBMaXRodWFuaWEgaGFzIHNoaWZ0ZWQgYmFjayB0byB0aGUgc2Vjb25kIHRpbWUgem9uZSAoR01UIHBsdXMgdHdvIGhvdXJzKQotIyB0byBiZSB2YWxpZCBoZXJlIHN0YXJ0aW5nIGZyb20gT2N0b2JlciAzMSwKLSMgYXMgZGVjaWRlZCBieSB0aGUgbmF0aW9uYWwgZ292ZXJubWVudCBvbiBXZWRuZXNkYXkuLi4uCi0jIFRoZSBMaXRodWFuaWFuIGdvdmVybm1lbnQgYWxzbyBhbm5vdW5jZWQgcGxhbnMgdG8gY29uc2lkZXIgYQotIyBtb3Rpb24gdG8gZ2l2ZSB1cCBzaGlmdGluZyB0byBzdW1tZXIgdGltZSBpbiBzcHJpbmcsIGFzIGl0IHdhcwotIyBhbHJlYWR5IGRvbmUgYnkgRXN0b25pYS4KLQotIyBGcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnRvdXJpc20ubHQvaW5mb3JtYS9mZi5odG0iPgotIyBGYWN0IEZpbGUsIExpdGh1YW5pYW4gU3RhdGUgRGVwYXJ0bWVudCBvZiBUb3VyaXNtCi0jIDwvYT4gKDIwMDAtMDMtMjcpOiBMb2NhbCB0aW1lIGlzIEdNVCsyIGhvdXJzIC4uLiwgbm8gZGF5bGlnaHQgc2F2aW5nLgotCi0jIEZyb20gYSB1c2VyIHZpYSBLbGF1cyBNYXJ0ZW4gKDIwMDMtMDItMDcpOgotIyBBcyBhIGNhbmRpZGF0ZSBmb3IgbWVtYmVyc2hpcCBvZiB0aGUgRXVyb3BlYW4gVW5pb24sIExpdGh1YW5pYSB3aWxsCi0jIG9ic2VydmUgU3VtbWVyIFRpbWUgaW4gMjAwMywgY2hhbmdpbmcgaXRzIGNsb2NrcyBhdCB0aGUgdGltZXMgbGFpZAotIyBkb3duIGluIEVVIERpcmVjdGl2ZSAyMDAwLzg0IG9mIDE5LkkuMDEgKGkuZS4gYXQgdGhlIHNhbWUgdGltZXMgYXMgaXRzCi0jIG5laWdoYm91ciBMYXR2aWEpLiBUaGUgdGV4dCBvZiB0aGUgTGl0aHVhbmlhbiBnb3Zlcm5tZW50IE9yZGVyIG9mCi0jIDcuWEkuMDIgdG8gdGhpcyBlZmZlY3QgY2FuIGJlIGZvdW5kIGF0Ci0jIGh0dHA6Ly93d3cubHJ2ay5sdC9udXQvMTEvbjE3NDkuaHRtCi0KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvVmlsbml1cwkxOjQxOjE2CS0JTE1UCTE4ODAKLQkJCTE6MjQ6MDAJLQlXTVQJMTkxNwkgICAgIyBXYXJzYXcgTWVhbiBUaW1lCi0JCQkxOjM1OjM2CS0JS01UCTE5MTkgT2N0IDEwICMgS2F1bmFzIE1lYW4gVGltZQotCQkJMTowMAktCUNFVAkxOTIwIEp1bCAxMgotCQkJMjowMAktCUVFVAkxOTIwIE9jdCAgOQotCQkJMTowMAktCUNFVAkxOTQwIEF1ZyAgMwotCQkJMzowMAktCU1TSwkxOTQxIEp1biAyNAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IEF1ZwotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMjowMAkxOjAwCUVFU1QJMTk5MSBTZXAgMjkgMjowMHMKLQkJCTI6MDAJQy1FdXIJRUUlc1QJMTk5OAotCQkJMjowMAktCUVFVAkxOTk4IE1hciAyOSAxOjAwdQotCQkJMTowMAlFVQlDRSVzVAkxOTk5IE9jdCAzMSAxOjAwdQotCQkJMjowMAktCUVFVAkyMDAzIEphbiAgMQotCQkJMjowMAlFVQlFRSVzVAotCi0jIEx1eGVtYm91cmcKLSMgV2hpdG1hbiBkaXNhZ3JlZXMgd2l0aCBtb3N0IG9mIHRoZXNlIGRhdGVzIGluIG1pbm9yIHdheXM7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTHV4CTE5MTYJb25seQktCU1heQkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MTYJb25seQktCU9jdAkgMQkgMTowMAkwCS0KLVJ1bGUJTHV4CTE5MTcJb25seQktCUFwcgkyOAkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MTcJb25seQktCVNlcAkxNwkgMTowMAkwCS0KLVJ1bGUJTHV4CTE5MTgJb25seQktCUFwcglNb24+PTE1CSAyOjAwcwkxOjAwCVMKLVJ1bGUJTHV4CTE5MTgJb25seQktCVNlcAlNb24+PTE1CSAyOjAwcwkwCS0KLVJ1bGUJTHV4CTE5MTkJb25seQktCU1hcgkgMQkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MTkJb25seQktCU9jdAkgNQkgMzowMAkwCS0KLVJ1bGUJTHV4CTE5MjAJb25seQktCUZlYgkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjAJb25seQktCU9jdAkyNAkgMjowMAkwCS0KLVJ1bGUJTHV4CTE5MjEJb25seQktCU1hcgkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjEJb25seQktCU9jdAkyNgkgMjowMAkwCS0KLVJ1bGUJTHV4CTE5MjIJb25seQktCU1hcgkyNQkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjIJb25seQktCU9jdAlTdW4+PTIJIDE6MDAJMAktCi1SdWxlCUx1eAkxOTIzCW9ubHkJLQlBcHIJMjEJMjM6MDAJMTowMAlTCi1SdWxlCUx1eAkxOTIzCW9ubHkJLQlPY3QJU3VuPj0yCSAyOjAwCTAJLQotUnVsZQlMdXgJMTkyNAlvbmx5CS0JTWFyCTI5CTIzOjAwCTE6MDAJUwotUnVsZQlMdXgJMTkyNAkxOTI4CS0JT2N0CVN1bj49MgkgMTowMAkwCS0KLVJ1bGUJTHV4CTE5MjUJb25seQktCUFwcgkgNQkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjYJb25seQktCUFwcgkxNwkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjcJb25seQktCUFwcgkgOQkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjgJb25seQktCUFwcgkxNAkyMzowMAkxOjAwCVMKLVJ1bGUJTHV4CTE5MjkJb25seQktCUFwcgkyMAkyMzowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgRXVyb3BlL0x1eGVtYm91cmcJMDoyNDozNiAtCUxNVAkxOTA0IEp1bgotCQkJMTowMAlMdXgJQ0Ulc1QJMTkxOCBOb3YgMjUKLQkJCTA6MDAJTHV4CVdFJXNUCTE5MjkgT2N0ICA2IDI6MDBzCi0JCQkwOjAwCUJlbGdpdW0JV0Ulc1QJMTk0MCBNYXkgMTQgMzowMAotCQkJMTowMAlDLUV1cglXRSVzVAkxOTQ0IFNlcCAxOCAzOjAwCi0JCQkxOjAwCUJlbGdpdW0JQ0Ulc1QJMTk3NwotCQkJMTowMAlFVQlDRSVzVAotCi0jIE1hY2Vkb25pYQotIyBzZWUgU2VyYmlhCi0KLSMgTWFsdGEKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU1hbHRhCTE5NzMJb25seQktCU1hcgkzMQkwOjAwcwkxOjAwCVMKLVJ1bGUJTWFsdGEJMTk3Mwlvbmx5CS0JU2VwCTI5CTA6MDBzCTAJLQotUnVsZQlNYWx0YQkxOTc0CW9ubHkJLQlBcHIJMjEJMDowMHMJMTowMAlTCi1SdWxlCU1hbHRhCTE5NzQJb25seQktCVNlcAkxNgkwOjAwcwkwCS0KLVJ1bGUJTWFsdGEJMTk3NQkxOTc5CS0JQXByCVN1bj49MTUJMjowMAkxOjAwCVMKLVJ1bGUJTWFsdGEJMTk3NQkxOTgwCS0JU2VwCVN1bj49MTUJMjowMAkwCS0KLVJ1bGUJTWFsdGEJMTk4MAlvbmx5CS0JTWFyCTMxCTI6MDAJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9NYWx0YQkwOjU4OjA0IC0JTE1UCTE4OTMgTm92ICAyIDA6MDBzICMgVmFsbGV0dGEKLQkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk0MiBOb3YgIDIgMjowMHMKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NSBBcHIgIDIgMjowMHMKLQkJCTE6MDAJSXRhbHkJQ0Ulc1QJMTk3MyBNYXIgMzEKLQkJCTE6MDAJTWFsdGEJQ0Ulc1QJMTk4MQotCQkJMTowMAlFVQlDRSVzVAotCi0jIE1vbGRvdmEKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZGF0YWJhc2UgZm9sbG93ZWQgU2hhbmtzICYgUG90dGVuZ2VyLCB3aG8gd3JpdGUKLSMgdGhhdCBUaXJhc3BvbCBzd2l0Y2hlZCB0byBNb3Njb3cgdGltZSBvbiAxOTkyLTAxLTE5IGF0IDAyOjAwLgotIyBIb3dldmVyLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGFuIGVycm9yLCBhcyBNb2xkb3ZhIGRlY2xhcmVkIGluZGVwZW5kZW5jZQotIyBvbiAxOTkxLTA4LTI3ICh0aGUgMTk5Mi0wMS0xOSBkYXRlIGlzIHRoYXQgb2YgYSBSdXNzaWFuIGRlY3JlZSkuCi0jIEluIGVhcmx5IDE5OTIgdGhlcmUgd2FzIGxhcmdlLXNjYWxlIGludGVyZXRobmljIHZpb2xlbmNlIGluIHRoZSBhcmVhCi0jIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBSdXNzb3Bob25lcyBjb250aW51ZWQgdG8gb2JzZXJ2ZSBNb3Njb3cgdGltZS4KLSMgQnV0IFt0d28gcGVvcGxlXSBzZXBhcmF0ZWx5IHJlcG9ydGVkIHZpYQotIyBKZXNwZXIgTm9yZ2FhcmQgdGhhdCBhcyBvZiAyMDAxLTAxLTI0IFRpcmFzcG9sIHdhcyBsaWtlIENoaXNpbmF1LgotIyBUaGUgVGlyYXNwb2wgZW50cnkgaGFzIHRoZXJlZm9yZSBiZWVuIHJlbW92ZWQgZm9yIG5vdy4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvQ2hpc2luYXUJMTo1NToyMCAtCUxNVAkxODgwCi0JCQkxOjU1CS0JQ01UCTE5MTggRmViIDE1ICMgQ2hpc2luYXUgTVQKLQkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQgIyBCdWNoYXJlc3QgTVQKLQkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTQwIEF1ZyAxNQotCQkJMjowMAkxOjAwCUVFU1QJMTk0MSBKdWwgMTcKLQkJCTE6MDAJQy1FdXIJQ0Ulc1QJMTk0NCBBdWcgMjQKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkwIE1heSA2Ci0JCQkyOjAwCS0JRUVUCTE5OTEKLQkJCTI6MDAJUnVzc2lhCUVFJXNUCTE5OTIKLQkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NwotIyBTZWUgUm9tYW5pYSBjb21tZW50YXJ5IGZvciB0aGUgZ3Vlc3NlZCAxOTk3IHRyYW5zaXRpb24gdG8gRVUgcnVsZXMuCi0JCQkyOjAwCUVVCUVFJXNUCi0KLSMgTW9uYWNvCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDA6MDk6MjAgZm9yIFBhcmlzIE1lYW4gVGltZTsgZ28gd2l0aCBIb3dzZSdzCi0jIG1vcmUgcHJlY2lzZSAwOjA5OjIxLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvTW9uYWNvCTA6Mjk6MzIgLQlMTVQJMTg5MSBNYXIgMTUKLQkJCTA6MDk6MjEJLQlQTVQJMTkxMSBNYXIgMTEgICAgIyBQYXJpcyBNZWFuIFRpbWUKLQkJCTA6MDAJRnJhbmNlCVdFJXNUCTE5NDUgU2VwIDE2IDM6MDAKLQkJCTE6MDAJRnJhbmNlCUNFJXNUCTE5NzcKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBNb250ZW5lZ3JvCi0jIHNlZSBTZXJiaWEKLQotIyBOZXRoZXJsYW5kcwotCi0jIEhvd3NlIHdyaXRlcyB0aGF0IHRoZSBOZXRoZXJsYW5kcycgcmFpbHdheXMgdXNlZCBHTVQgYmV0d2VlbiAxODkyIGFuZCAxOTQwLAotIyBidXQgZm9yIG90aGVyIHB1cnBvc2VzIHRoZSBOZXRoZXJsYW5kcyB1c2VkIEFtc3RlcmRhbSBtZWFuIHRpbWUuCi0KLSMgSG93ZXZlciwgUm9iZXJ0IEguIHZhbiBHZW50IHdyaXRlcyAoMjAwMS0wNC0wMSk6Ci0jIEhvd3NlJ3Mgc3RhdGVtZW50IGlzIG9ubHkgY29ycmVjdCB1cCB0byAxOTA5LiBGcm9tIDE5MDktMDUtMDEgKDAwOjAwOjAwCi0jIEFtc3RlcmRhbSBtZWFuIHRpbWUpIG9ud2FyZHMsIHRoZSB3aG9sZSBvZiB0aGUgTmV0aGVybGFuZHMgKGluY2x1ZGluZwotIyB0aGUgRHV0Y2ggcmFpbHdheXMpIHdhcyByZXF1aXJlZCBieSBsYXcgdG8gb2JzZXJ2ZSBBbXN0ZXJkYW0gbWVhbiB0aW1lCi0jICgxOSBtaW51dGVzIDMyLjEzIHNlY29uZHMgYWhlYWQgb2YgR01UKS4gVGhpcyBoYWQgYWxyZWFkeSBiZWVuIHRoZQotIyBjb21tb24gcHJhY3RpY2UgKGV4Y2VwdCBmb3IgdGhlIHJhaWx3YXlzKSBmb3IgbWFueSBkZWNhZGVzIGJ1dCBpdCB3YXMKLSMgbm90IHVudGlsIDE5MDkgd2hlbiB0aGUgRHV0Y2ggZ292ZXJubWVudCBmaW5hbGx5IGRlZmluZWQgdGhpcyBieSBsYXcuCi0jIE9uIDE5MzctMDctMDEgdGhpcyB3YXMgY2hhbmdlZCB0byAyMCBtaW51dGVzIChleGFjdGx5KSBhaGVhZCBvZiBHTVQgYW5kCi0jIHdhcyBnZW5lcmFsbHkga25vd24gYXMgRHV0Y2ggVGltZSAoIk5lZGVybGFuZHNlIFRpamQiKS4KLSMKLSMgKDIwMDEtMDQtMDgpOgotIyAxODkyLTA1LTAxIHdhcyB0aGUgZGF0ZSB3aGVuIHRoZSBEdXRjaCByYWlsd2F5cyB3ZXJlIGJ5IGxhdyByZXF1aXJlZCB0bwotIyBvYnNlcnZlIEdNVCB3aGlsZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBOZXRoZXJsYW5kcyBhZGhlcmVkIHRvIHRoZSBjb21tb24KLSMgcHJhY3RpY2Ugb2YgZm9sbG93aW5nIEFtc3RlcmRhbSBtZWFuIHRpbWUuCi0jCi0jICgyMDAxLTA0LTA5KToKLSMgSW4gMTgzNSB0aGUgYXV0aG9yaXRpZXMgb2YgdGhlIHByb3ZpbmNlIG9mIE5vcnRoIEhvbGxhbmQgcmVxdWVzdGVkIHRoZQotIyBtdW5pY2lwYWwgYXV0aG9yaXRpZXMgb2YgdGhlIHRvd25zIGFuZCBjaXRpZXMgaW4gdGhlIHByb3ZpbmNlIHRvIG9ic2VydmUKLSMgQW1zdGVyZGFtIG1lYW4gdGltZSBidXQgSSBkbyBub3Qga25vdyBpbiBob3cgbWFueSBjYXNlcyB0aGlzIHJlcXVlc3Qgd2FzCi0jIGFjdHVhbGx5IGZvbGxvd2VkLgotIwotIyBGcm9tIDE4NTIgb253YXJkcyB0aGUgRHV0Y2ggdGVsZWdyYXBoIG9mZmljZXMgd2VyZSBieSBsYXcgcmVxdWlyZWQgdG8KLSMgb2JzZXJ2ZSBBbXN0ZXJkYW0gbWVhbiB0aW1lLiBBcyB0aGUgdGltZSBzaWduYWxzIGZyb20gdGhlIG9ic2VydmF0b3J5IG9mCi0jIExlaWRlbiB3ZXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgdGhlIHRlbGVncmFwaCBzeXN0ZW0sIEkgYXNzdW1lIHRoYXQgbW9zdAotIyBwbGFjZXMgbGlua2VkIHVwIHdpdGggdGhlIHRlbGVncmFwaCAoYW5kIHJhaWx3YXkpIHN5c3RlbSBhdXRvbWF0aWNhbGx5Ci0jIGFkb3B0ZWQgQW1zdGVyZGFtIG1lYW4gdGltZS4KLSMKLSMgQWx0aG91Z2ggdGhlIGVhcmx5IER1dGNoIHJhaWx3YXkgY29tcGFuaWVzIGluaXRpYWxseSBvYnNlcnZlZCBhIHZhcmlldHkKLSMgb2YgdGltZXMsIG1vc3Qgb2YgdGhlbSBoYWQgYWRvcHRlZCBBbXN0ZXJkYW0gbWVhbiB0aW1lIGJ5IDE4NTggYnV0IGl0Ci0jIHdhcyBub3QgdW50aWwgMTg2NiB3aGVuIHRoZXkgd2VyZSBhbGwgcmVxdWlyZWQgYnkgbGF3IHRvIG9ic2VydmUKLSMgQW1zdGVyZGFtIG1lYW4gdGltZS4KLQotIyBUaGUgZGF0YSBiZWZvcmUgMTk0NSBhcmUgdGFrZW4gZnJvbQotIyA8aHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC93ZXR0aWpkL3dldHRpamQuaHRtPi4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTmV0aAkxOTE2CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCU5TVAkjIE5ldGhlcmxhbmRzIFN1bW1lciBUaW1lCi1SdWxlCU5ldGgJMTkxNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlBTVQJIyBBbXN0ZXJkYW0gTWVhbiBUaW1lCi1SdWxlCU5ldGgJMTkxNwlvbmx5CS0JQXByCTE2CTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkxNwlvbmx5CS0JU2VwCTE3CTI6MDBzCTAJQU1UCi1SdWxlCU5ldGgJMTkxOAkxOTIxCS0JQXByCU1vbj49MQkyOjAwcwkxOjAwCU5TVAotUnVsZQlOZXRoCTE5MTgJMTkyMQktCVNlcAlsYXN0TW9uCTI6MDBzCTAJQU1UCi1SdWxlCU5ldGgJMTkyMglvbmx5CS0JTWFyCWxhc3RTdW4JMjowMHMJMTowMAlOU1QKLVJ1bGUJTmV0aAkxOTIyCTE5MzYJLQlPY3QJU3VuPj0yCTI6MDBzCTAJQU1UCi1SdWxlCU5ldGgJMTkyMwlvbmx5CS0JSnVuCUZyaT49MQkyOjAwcwkxOjAwCU5TVAotUnVsZQlOZXRoCTE5MjQJb25seQktCU1hcglsYXN0U3VuCTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkyNQlvbmx5CS0JSnVuCUZyaT49MQkyOjAwcwkxOjAwCU5TVAotIyBGcm9tIDE5MjYgdGhyb3VnaCAxOTM5IERTVCBiZWdhbiAwNS0xNSwgZXhjZXB0IHRoYXQgaXQgd2FzIGRlbGF5ZWQgYnkgYSB3ZWVrCi0jIGluIHllYXJzIHdoZW4gMDUtMTUgZmVsbCBpbiB0aGUgUGVudGVjb3N0IHdlZWtlbmQuCi1SdWxlCU5ldGgJMTkyNgkxOTMxCS0JTWF5CTE1CTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkzMglvbmx5CS0JTWF5CTIyCTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkzMwkxOTM2CS0JTWF5CTE1CTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkzNwlvbmx5CS0JTWF5CTIyCTI6MDBzCTE6MDAJTlNUCi1SdWxlCU5ldGgJMTkzNwlvbmx5CS0JSnVsCSAxCTA6MDAJMTowMAlTCi1SdWxlCU5ldGgJMTkzNwkxOTM5CS0JT2N0CVN1bj49MgkyOjAwcwkwCS0KLVJ1bGUJTmV0aAkxOTM4CTE5MzkJLQlNYXkJMTUJMjowMHMJMTowMAlTCi1SdWxlCU5ldGgJMTk0NQlvbmx5CS0JQXByCSAyCTI6MDBzCTE6MDAJUwotUnVsZQlOZXRoCTE5NDUJb25seQktCVNlcAkxNgkyOjAwcwkwCS0KLSMKLSMgQW1zdGVyZGFtIE1lYW4gVGltZSB3YXMgKzAwOjE5OjMyLjEzIGV4YWN0bHksIGJ1dCB0aGUgLjEzIGlzIG9taXR0ZWQKLSMgYmVsb3cgYmVjYXVzZSB0aGUgY3VycmVudCBmb3JtYXQgcmVxdWlyZXMgR01UT0ZGIHRvIGJlIGFuIGludGVnZXIuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEV1cm9wZS9BbXN0ZXJkYW0JMDoxOTozMiAtCUxNVAkxODM1Ci0JCQkwOjE5OjMyCU5ldGgJJXMJMTkzNyBKdWwgIDEKLQkJCTA6MjAJTmV0aAlORSVzVAkxOTQwIE1heSAxNiAwOjAwICMgRHV0Y2ggVGltZQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAyOjAwCi0JCQkxOjAwCU5ldGgJQ0Ulc1QJMTk3NwotCQkJMTowMAlFVQlDRSVzVAotCi0jIE5vcndheQotIyBodHRwOi8vbWV0Lm5vL21ldC9tZXRfbGV4L3FfdS9zb21tZXJ0aWQuaHRtbCAoMjAwNC0wMSkgYWdyZWVzIHdpdGggU2hhbmtzICYKLSMgUG90dGVuZ2VyLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTm9yd2F5CTE5MTYJb25seQktCU1heQkyMgkxOjAwCTE6MDAJUwotUnVsZQlOb3J3YXkJMTkxNglvbmx5CS0JU2VwCTMwCTA6MDAJMAktCi1SdWxlCU5vcndheQkxOTQ1CW9ubHkJLQlBcHIJIDIJMjowMHMJMTowMAlTCi1SdWxlCU5vcndheQkxOTQ1CW9ubHkJLQlPY3QJIDEJMjowMHMJMAktCi1SdWxlCU5vcndheQkxOTU5CTE5NjQJLQlNYXIJU3VuPj0xNQkyOjAwcwkxOjAwCVMKLVJ1bGUJTm9yd2F5CTE5NTkJMTk2NQktCVNlcAlTdW4+PTE1CTI6MDBzCTAJLQotUnVsZQlOb3J3YXkJMTk2NQlvbmx5CS0JQXByCTI1CTI6MDBzCTE6MDAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvT3NsbwkwOjQzOjAwIC0JTE1UCTE4OTUgSmFuICAxCi0JCQkxOjAwCU5vcndheQlDRSVzVAkxOTQwIEF1ZyAxMCAyMzowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1IEFwciAgMiAgMjowMAotCQkJMTowMAlOb3J3YXkJQ0Ulc1QJMTk4MAotCQkJMTowMAlFVQlDRSVzVAotCi0jIFN2YWxiYXJkICYgSmFuIE1heWVuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDEtMDUtMDEpOgotIyBBbHRob3VnaCBJIGNvdWxkIG5vdCBmaW5kIGl0IGV4cGxpY2l0bHksIGl0IHNlZW1zIHRoYXQgSmFuIE1heWVuIGFuZAotIyBTdmFsYmFyZCBoYXZlIGJlZW4gdXNpbmcgdGhlIHNhbWUgdGltZSBhcyBOb3J3YXkgYXQgbGVhc3Qgc2luY2UgdGhlCi0jIHRpbWUgdGhleSB3ZXJlIGRlY2xhcmVkIGFzIHBhcnRzIG9mIE5vcndheS4gIFN2YWxiYXJkIHdhcyBkZWNsYXJlZAotIyBhcyBhIHBhcnQgb2YgTm9yd2F5IGJ5IGxhdyBvZiAxOTI1LTA3LTE3IG5vIDExLCBzZWN0aW9uIDQgYW5kIEphbgotIyBNYXllbiBieSBsYXcgb2YgMTkzMC0wMi0yNyBubyAyLCBzZWN0aW9uIDIuIChGcm9tCi0jIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTkyNTA3MTctMDExLmh0bWwgYW5kCi0jIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTkzMDAyMjctMDAyLmh0bWwpLiAgVGhlIGxhdy9yZWd1bGF0aW9uCi0jIGZvciBub3JtYWwvc3RhbmRhcmQgdGltZSBpbiBOb3J3YXkgaXMgZnJvbSAxODk0LTA2LTI5IG5vIDEgKGNhbWUKLSMgaW50byBvcGVyYXRpb24gb24gMTg5NS0wMS0wMSkgYW5kIFN2YWxiYXJkL0phbiBNYXllbiBzZWVtIHRvIGJlIGEKLSMgcGFydCBvZiB0aGlzIGxhdyBzaW5jZSAxOTI1LzE5MzAuIChGcm9tCi0jIGh0dHA6Ly93d3cubG92ZGF0YS5uby9hbGwvbmwtMTg5NDA2MjktMDAxLmh0bWwgKSBJIGhhdmUgbm90IGJlZW4KLSMgYWJsZSB0byBmaW5kIGlmIEphbiBNYXllbiB1c2VkIGEgZGlmZmVyZW50IHRpbWUgem9uZSAoZS5nLiAtMDEwMCkKLSMgYmVmb3JlIDE5MzAuIEphbiBNYXllbiBoYXMgb25seSBiZWVuICJpbmhhYml0YXRlZCIgc2luY2UgMTkyMSBieQotIyBOb3J3ZWdpYW4gbWV0ZW9yb2xvZ2lzdHMgYW5kIG1heWJlIHVzZWQgdGhlIHNhbWUgdGltZSBhcyBOb3J3YXkgZXZlcgotIyBzaW5jZSAxOTIxLiAgU3ZhbGJhcmQgKEFyY3RpYy9Mb25neWVhcmJ5ZW4pIGhhcyBiZWVuIGluaGFiaXRlZCBzaW5jZQotIyBiZWZvcmUgMTg5NSwgYW5kIHRoZXJlZm9yZSBwcm9iYWJseSBjaGFuZ2VkIHRoZSBsb2NhbCB0aW1lIHNvbWV3aGVyZQotIyBiZXR3ZWVuIDE4OTUgYW5kIDE5MjUgKGluY2x1c2l2ZSkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wNS0wMSk6Ci0jCi0jIEFjdHVhbGx5LCBKYW4gTWF5ZW4gd2FzIG5ldmVyIG9jY3VwaWVkIGJ5IEdlcm1hbnkgZHVyaW5nIFdvcmxkIFdhciBJSSwKLSMgc28gaXQgbXVzdCBoYXZlIGRpdmVyZ2VkIGZyb20gT3NsbyB0aW1lIGR1cmluZyB0aGUgd2FyLCBhcyBPc2xvIHdhcwotIyBrZWVwaW5nIEJlcmxpbiB0aW1lLgotIwotIyA8aHR0cDovL2hvbWUubm8ubmV0L2phbm1heWVuL2hpc3RvcnkuaHRtPiBzYXlzIHRoYXQgdGhlIG1ldGVvcm9sb2dpc3RzCi0jIGJ1cm5lZCBkb3duIHRoZWlyIHN0YXRpb24gaW4gMTk0MCBhbmQgbGVmdCB0aGUgaXNsYW5kLCBidXQgcmV0dXJuZWQgaW4KLSMgMTk0MSB3aXRoIGEgc21hbGwgTm9yd2VnaWFuIGdhcnJpc29uIGFuZCBjb250aW51ZWQgb3BlcmF0aW9ucyBkZXNwaXRlCi0jIGZyZXF1ZW50IGFpciB0dGFja3MgZnJvbSBHZXJtYW5zLiAgSW4gMTk0MyB0aGUgQW1lcmljYW5zIGVzdGFibGlzaGVkIGEKLSMgcmFkaW9sb2NhdGluZyBzdGF0aW9uIG9uIHRoZSBpc2xhbmQsIGNhbGxlZCAiQXRsYW50aWMgQ2l0eSIuICBQb3NzaWJseQotIyB0aGUgVVRDIG9mZnNldCBjaGFuZ2VkIGR1cmluZyB0aGUgd2FyLCBidXQgSSB0aGluayBpdCB1bmxpa2VseSB0aGF0Ci0jIEphbiBNYXllbiB1c2VkIEdlcm1hbiBkYXlsaWdodC1zYXZpbmcgcnVsZXMuCi0jCi0jIFN2YWxiYXJkIGlzIG1vcmUgY29tcGxpY2F0ZWQsIGFzIGl0IHdhcyByYWlkZWQgaW4gQXVndXN0IDE5NDEgYnkgYW4KLSMgQWxsaWVkIHBhcnR5IHRoYXQgZXZhY3VhdGVkIHRoZSBjaXZpbGlhbiBwb3B1bGF0aW9uIHRvIEVuZ2xhbmQgKHNheXMKLSMgPGh0dHA6Ly93d3cuYmFydGxlYnkuY29tLzY1L3N2L1N2YWxiYXJkLmh0bWw+KS4gIFRoZSBTdmFsYmFyZCBGQVEKLSMgPGh0dHA6Ly93d3cuc3ZhbGJhcmQuY29tL1N2YWxiYXJkRkFRLmh0bWw+IHNheXMgdGhhdCB0aGUgR2VybWFucyB3ZXJlCi0jIGV4cGVsbGVkIG9uIDE5NDItMDUtMTQuICBIb3dldmVyLCBzbWFsbCBwYXJ0aWVzIG9mIEdlcm1hbnMgZGlkIHJldHVybiwKLSMgYW5kIGFjY29yZGluZyB0byBXaWxoZWxtIERlZ2UncyBib29rICJXYXIgTm9ydGggb2YgODAiICgxOTU0KQotIyA8aHR0cDovL3d3dy51Y2FsZ2FyeS5jYS9Vb2ZDL2RlcGFydG1lbnRzL1VQLzEtNTUyMzgvMS01NTIzOC0xMTAtMi5odG1sPgotIyB0aGUgR2VybWFuIGFybWVkIGZvcmNlcyBhdCB0aGUgU3ZhbGJhcmQgd2VhdGhlciBzdGF0aW9uIGNvZGUtbmFtZWQKLSMgSGF1ZGVnZW4gZGlkIG5vdCBzdXJyZW5kZXIgdG8gdGhlIEFsbGllcyB1bnRpbCBTZXB0ZW1iZXIgMTk0NS4KLSMKLSMgQWxsIHRoZXNlIGV2ZW50cyBwcmVkYXRlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLiAgVW5sZXNzIHdlIGNhbgotIyBjb21lIHVwIHdpdGggbW9yZSBkZWZpbml0aXZlIGluZm8gYWJvdXQgdGhlIHRpbWVrZWVwaW5nIGR1cmluZyB0aGUKLSMgd2FyIHllYXJzIGl0J3MgcHJvYmFibHkgYmVzdCBqdXN0IGRvIGRvIHRoZSBmb2xsb3dpbmcgZm9yIG5vdzoKLUxpbmsJRXVyb3BlL09zbG8JQXJjdGljL0xvbmd5ZWFyYnllbgotCi0jIFBvbGFuZAotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUG9sYW5kCTE5MTgJMTkxOQktCVNlcAkxNgkyOjAwcwkwCS0KLVJ1bGUJUG9sYW5kCTE5MTkJb25seQktCUFwcgkxNQkyOjAwcwkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NDQJb25seQktCUFwcgkgMwkyOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTQ0IE5vdiAzMDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvbGFuZAkxOTQ0CW9ubHkJLQlPY3QJIDQJMjowMAkwCS0KLSMgRm9yIDE5NDQtMTk0OCBXaGl0bWFuIGdpdmVzIHRoZSBwcmV2aW91cyBkYXk7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb2xhbmQJMTk0NQlvbmx5CS0JQXByCTI5CTA6MDAJMTowMAlTCi1SdWxlCVBvbGFuZAkxOTQ1CW9ubHkJLQlOb3YJIDEJMDowMAkwCS0KLSMgRm9yIDE5NDYgb24gdGhlIHNvdXJjZSBpcyBLYXppbWllcnogQm9ya293c2tpLAotIyBUb3J1biBDZW50ZXIgZm9yIEFzdHJvbm9teSwgRGVwdC4gb2YgUmFkaW8gQXN0cm9ub215LCBOaWNvbGF1cyBDb3Blcm5pY3VzIFUuLAotIyA8aHR0cDovL3d3dy5hc3Ryby51bmkudG9ydW4ucGwvfmtiL0FydHlrdWx5L1UtUEEvQ3phczIuaHRtI3R0aF90QWIxPgotIyBUaGFua3MgdG8gUHJ6ZW15c2xhdyBBdWd1c3R5bmlhayAoMjAwNS0wNS0yOCkgZm9yIHRoaXMgcmVmZXJlbmNlLgotIyBIZSBhbHNvIGdpdmVzIHRoZXNlIGZ1cnRoZXIgcmVmZXJlbmNlczoKLSMgTW9uIFBvbCBuciAxMywgcG96IDE2MiAoMTk5NSkgPGh0dHA6Ly93d3cuYWJjLmNvbS5wbC9zZXJ3aXMvbXAvMTk5NS8wMTYyLmh0bT4KLSMgRHJ1ayBuciAyMTgwICgyMDAzKSA8aHR0cDovL3d3dy5zZW5hdC5nb3YucGwvazUvZG9rL3Nlam0vMDUzLzIxODAucGRmPgotUnVsZQlQb2xhbmQJMTk0Nglvbmx5CS0JQXByCTE0CTA6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk0Nglvbmx5CS0JT2N0CSA3CTI6MDBzCTAJLQotUnVsZQlQb2xhbmQJMTk0Nwlvbmx5CS0JTWF5CSA0CTI6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk0NwkxOTQ5CS0JT2N0CVN1bj49MQkyOjAwcwkwCS0KLVJ1bGUJUG9sYW5kCTE5NDgJb25seQktCUFwcgkxOAkyOjAwcwkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NDkJb25seQktCUFwcgkxMAkyOjAwcwkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NTcJb25seQktCUp1bgkgMgkxOjAwcwkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NTcJMTk1OAktCVNlcAlsYXN0U3VuCTE6MDBzCTAJLQotUnVsZQlQb2xhbmQJMTk1OAlvbmx5CS0JTWFyCTMwCTE6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk1OQlvbmx5CS0JTWF5CTMxCTE6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk1OQkxOTYxCS0JT2N0CVN1bj49MQkxOjAwcwkwCS0KLVJ1bGUJUG9sYW5kCTE5NjAJb25seQktCUFwcgkgMwkxOjAwcwkxOjAwCVMKLVJ1bGUJUG9sYW5kCTE5NjEJMTk2NAktCU1heQlsYXN0U3VuCTE6MDBzCTE6MDAJUwotUnVsZQlQb2xhbmQJMTk2MgkxOTY0CS0JU2VwCWxhc3RTdW4JMTowMHMJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9XYXJzYXcJMToyNDowMCAtCUxNVAkxODgwCi0JCQkxOjI0OjAwCS0JV01UCTE5MTUgQXVnICA1ICAgIyBXYXJzYXcgTWVhbiBUaW1lCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5MTggU2VwIDE2IDM6MDAKLQkJCTI6MDAJUG9sYW5kCUVFJXNUCTE5MjIgSnVuCi0JCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTQwIEp1biAyMyAyOjAwCi0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgT2N0Ci0JCQkxOjAwCVBvbGFuZAlDRSVzVAkxOTc3Ci0JCQkxOjAwCVctRXVyCUNFJXNUCTE5ODgKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBQb3J0dWdhbAotIwotIyBGcm9tIFJ1aSBQZWRybyBTYWxndWVpcm8gKDE5OTItMTEtMTIpOgotIyBQb3J0dWdhbCBoYXMgcmVjZW50bHkgKFNlcHRlbWJlciwgMjcpIGNoYW5nZWQgdGltZXpvbmUKLSMgKGZyb20gV0VUIHRvIE1FVCBvciBDRVQpIHRvIGhhcm1vbml6ZSB3aXRoIEVFQy4KLSMKLSMgTWFydGluIEJydWNrbWFubiAoMTk5Ni0wMi0yOSkgcmVwb3J0cyB2aWEgUGV0ZXIgSWxpZXZlCi0jIHRoYXQgUG9ydHVnYWwgaXMgcmV2ZXJ0aW5nIHRvIDA6MDAgYnkgbm90IG1vdmluZyBpdHMgY2xvY2tzIHRoaXMgc3ByaW5nLgotIyBUaGUgbmV3IFByaW1lIE1pbmlzdGVyIHdhcyBmZWQgdXAgd2l0aCBnZXR0aW5nIHVwIGluIHRoZSBkYXJrIGluIHRoZSB3aW50ZXIuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTYtMTEtMTIpOgotIyBJQVRBIFNTSU0gKDE5OTEtMDkpIHJlcG9ydHMgc2V2ZXJhbCAxOTkxLTA5IGFuZCAxOTkyLTA5IHRyYW5zaXRpb25zCi0jIGF0IDAyOjAwdSwgbm90IDAxOjAwdS4gIEFzc3VtZSB0aGF0IHRoZXNlIGFyZSB0eXBvcy4KLSMgSUFUQSBTU0lNICgxOTkxLzE5OTIpIHJlcG9ydHMgdGhhdCB0aGUgQXpvcmVzIHdlcmUgYXQgLTE6MDAuCi0jIElBVEEgU1NJTSAoMTk5My0wMikgc2F5cyArMDowMDsgbGF0ZXIgaXNzdWVzICh0aHJvdWdoIDE5OTYtMDkpIHNheSAtMTowMC4KLSMgR3Vlc3MgdGhhdCB0aGUgQXpvcmVzIGNoYW5nZWQgdG8gRVUgcnVsZXMgaW4gMTk5MiAoc2luY2UgdGhhdCdzIHdoZW4gUG9ydHVnYWwKLSMgaGFybW9uaXplZCB3aXRoIHRoZSBFVSksIGFuZCB0aGF0IHRoZXkgc3RheWVkICswOjAwIHRoYXQgd2ludGVyLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLSMgRFNIIHdyaXRlcyB0aGF0IGRlc3BpdGUgRGVjcmVlIDEsNDY5ICgxOTE1KSwgdGhlIGNoYW5nZSB0byB0aGUgY2xvY2tzIHdhcyBub3QKLSMgZG9uZSBldmVyeSB5ZWFyLCBkZXBlbmRpbmcgb24gd2hhdCBTcGFpbiBkaWQsIGJlY2F1c2Ugb2YgcmFpbHJvYWQgc2NoZWR1bGVzLgotIyBHbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9ydAkxOTE2CW9ubHkJLQlKdW4JMTcJMjM6MDAJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTkxNiBPY3QgMzE7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb3J0CTE5MTYJb25seQktCU5vdgkgMQkgMTowMAkwCS0KLVJ1bGUJUG9ydAkxOTE3CW9ubHkJLQlGZWIJMjgJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MTcJMTkyMQktCU9jdAkxNAkyMzowMHMJMAktCi1SdWxlCVBvcnQJMTkxOAlvbmx5CS0JTWFyCSAxCTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTE5CW9ubHkJLQlGZWIJMjgJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MjAJb25seQktCUZlYgkyOQkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkyMQlvbmx5CS0JRmViCTI4CTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTI0CW9ubHkJLQlBcHIJMTYJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MjQJb25seQktCU9jdAkxNAkyMzowMHMJMAktCi1SdWxlCVBvcnQJMTkyNglvbmx5CS0JQXByCTE3CTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTI2CTE5MjkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MjgJb25seQktCUFwcgkxNAkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkyOQlvbmx5CS0JQXByCTIwCTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTMxCW9ubHkJLQlBcHIJMTgJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MzEgT2N0IDg7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQb3J0CTE5MzEJMTkzMgktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlQb3J0CTE5MzIJb25seQktCUFwcgkgMgkyMzowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTkzNAlvbmx5CS0JQXByCSA3CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTM0IE9jdCA1OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9ydAkxOTM0CTE5MzgJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGdpdmUgMTkzNSBBcHIgMzA7IGdvIHdpdGggV2hpdG1hbi4KLVJ1bGUJUG9ydAkxOTM1CW9ubHkJLQlNYXIJMzAJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MzYJb25seQktCUFwcgkxOAkyMzowMHMJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTkzNyBBcHIgMjsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvcnQJMTkzNwlvbmx5CS0JQXByCSAzCTIzOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTM4CW9ubHkJLQlNYXIJMjYJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5MzkJb25seQktCUFwcgkxNQkyMzowMHMJMTowMAlTCi0jIFdoaXRtYW4gZ2l2ZXMgMTkzOSBPY3QgNzsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBvcnQJMTkzOQlvbmx5CS0JTm92CTE4CTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTQwCW9ubHkJLQlGZWIJMjQJMjM6MDBzCTE6MDAJUwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgZ2l2ZSAxOTQwIE9jdCA3OyBnbyB3aXRoIFdoaXRtYW4uCi1SdWxlCVBvcnQJMTk0MAkxOTQxCS0JT2N0CSA1CTIzOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTQxCW9ubHkJLQlBcHIJIDUJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NDIJMTk0NQktCU1hcglTYXQ+PTgJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NDIJb25seQktCUFwcgkyNQkyMjowMHMJMjowMAlNICMgTWlkc3VtbWVyCi1SdWxlCVBvcnQJMTk0Mglvbmx5CS0JQXVnCTE1CTIyOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTQyCTE5NDUJLQlPY3QJU2F0Pj0yNAkyMzowMHMJMAktCi1SdWxlCVBvcnQJMTk0Mwlvbmx5CS0JQXByCTE3CTIyOjAwcwkyOjAwCU0KLVJ1bGUJUG9ydAkxOTQzCTE5NDUJLQlBdWcJU2F0Pj0yNQkyMjowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk0NAkxOTQ1CS0JQXByCVNhdD49MjEJMjI6MDBzCTI6MDAJTQotUnVsZQlQb3J0CTE5NDYJb25seQktCUFwcglTYXQ+PTEJMjM6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NDYJb25seQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlQb3J0CTE5NDcJMTk0OQktCUFwcglTdW4+PTEJIDI6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NDcJMTk0OQktCU9jdAlTdW4+PTEJIDI6MDBzCTAJLQotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IERTVCB3YXMgb2JzZXJ2ZWQgaW4gMTk1MDsgZ28gd2l0aCBXaGl0bWFuLgotIyBXaGl0bWFuIGdpdmVzIE9jdCBsYXN0U3VuIGZvciAxOTUyIG9uOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJUG9ydAkxOTUxCTE5NjUJLQlBcHIJU3VuPj0xCSAyOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTUxCTE5NjUJLQlPY3QJU3VuPj0xCSAyOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTc3CW9ubHkJLQlNYXIJMjcJIDA6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5NzcJb25seQktCVNlcAkyNQkgMDowMHMJMAktCi1SdWxlCVBvcnQJMTk3OAkxOTc5CS0JQXByCVN1bj49MQkgMDowMHMJMTowMAlTCi1SdWxlCVBvcnQJMTk3OAlvbmx5CS0JT2N0CSAxCSAwOjAwcwkwCS0KLVJ1bGUJUG9ydAkxOTc5CTE5ODIJLQlTZXAJbGFzdFN1bgkgMTowMHMJMAktCi1SdWxlCVBvcnQJMTk4MAlvbmx5CS0JTWFyCWxhc3RTdW4JIDA6MDBzCTE6MDAJUwotUnVsZQlQb3J0CTE5ODEJMTk4MgktCU1hcglsYXN0U3VuCSAxOjAwcwkxOjAwCVMKLVJ1bGUJUG9ydAkxOTgzCW9ubHkJLQlNYXIJbGFzdFN1bgkgMjowMHMJMTowMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhlIHRyYW5zaXRpb24gZnJvbSBMTVQgdG8gV0VUIG9jY3VycmVkIDE5MTEtMDUtMjQ7Ci0jIFdpbGxldHQgc2F5cyAxOTEyLTAxLTAxLiAgR28gd2l0aCBXaWxsZXR0LgotWm9uZQlFdXJvcGUvTGlzYm9uCS0wOjM2OjMyIC0JTE1UCTE4ODQKLQkJCS0wOjM2OjMyIC0JTE1UCTE5MTIgSmFuICAxICAjIExpc2JvbiBNZWFuIFRpbWUKLQkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk2NiBBcHIgIDMgMjowMAotCQkJIDE6MDAJLQlDRVQJMTk3NiBTZXAgMjYgMTowMAotCQkJIDA6MDAJUG9ydAlXRSVzVAkxOTgzIFNlcCAyNSAxOjAwcwotCQkJIDA6MDAJVy1FdXIJV0Ulc1QJMTk5MiBTZXAgMjcgMTowMHMKLQkJCSAxOjAwCUVVCUNFJXNUCTE5OTYgTWFyIDMxIDE6MDB1Ci0JCQkgMDowMAlFVQlXRSVzVAotWm9uZSBBdGxhbnRpYy9Bem9yZXMJLTE6NDI6NDAgLQlMTVQJMTg4NAkJIyBQb250YSBEZWxnYWRhCi0JCQktMTo1NDozMiAtCUhNVAkxOTExIE1heSAyNCAgIyBIb3J0YSBNZWFuIFRpbWUKLQkJCS0yOjAwCVBvcnQJQVpPJXNUCTE5NjYgQXByICAzIDI6MDAgIyBBem9yZXMgVGltZQotCQkJLTE6MDAJUG9ydAlBWk8lc1QJMTk4MyBTZXAgMjUgMTowMHMKLQkJCS0xOjAwCVctRXVyCUFaTyVzVAkxOTkyIFNlcCAyNyAxOjAwcwotCQkJIDA6MDAJRVUJV0Ulc1QJMTk5MyBNYXIgMjggMTowMHUKLQkJCS0xOjAwCUVVCUFaTyVzVAotWm9uZSBBdGxhbnRpYy9NYWRlaXJhCS0xOjA3OjM2IC0JTE1UCTE4ODQJCSMgRnVuY2hhbAotCQkJLTE6MDc6MzYgLQlGTVQJMTkxMSBNYXkgMjQgICMgRnVuY2hhbCBNZWFuIFRpbWUKLQkJCS0xOjAwCVBvcnQJTUFEJXNUCTE5NjYgQXByICAzIDI6MDAgIyBNYWRlaXJhIFRpbWUKLQkJCSAwOjAwCVBvcnQJV0Ulc1QJMTk4MyBTZXAgMjUgMTowMHMKLQkJCSAwOjAwCUVVCVdFJXNUCi0KLSMgUm9tYW5pYQotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTA3KToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5uaW5lb2Nsb2NrLnJvL1BPTC8xNzc4cG9sLmh0bWwiPgotIyBOaW5lIE8nY2xvY2s8L2E+ICgxOTk4LTEwLTIzKSByZXBvcnRzIHRoYXQgdGhlIHN3aXRjaCBvY2N1cnJlZCBhdAotIyAwNDowMCBsb2NhbCB0aW1lIGluIGZhbGwgMTk5OC4gIEZvciBsYWNrIG9mIGJldHRlciBpbmZvLAotIyBhc3N1bWUgdGhhdCBSb21hbmlhIGFuZCBNb2xkb3ZhIHN3aXRjaGVkIHRvIEVVIHJ1bGVzIGluIDE5OTcsCi0jIHRoZSBzYW1lIHllYXIgYXMgQnVsZ2FyaWEuCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlSb21hbmlhCTE5MzIJb25seQktCU1heQkyMQkgMDowMHMJMTowMAlTCi1SdWxlCVJvbWFuaWEJMTkzMgkxOTM5CS0JT2N0CVN1bj49MQkgMDowMHMJMAktCi1SdWxlCVJvbWFuaWEJMTkzMwkxOTM5CS0JQXByCVN1bj49MgkgMDowMHMJMTowMAlTCi1SdWxlCVJvbWFuaWEJMTk3OQlvbmx5CS0JTWF5CTI3CSAwOjAwCTE6MDAJUwotUnVsZQlSb21hbmlhCTE5NzkJb25seQktCVNlcAlsYXN0U3VuCSAwOjAwCTAJLQotUnVsZQlSb21hbmlhCTE5ODAJb25seQktCUFwcgkgNQkyMzowMAkxOjAwCVMKLVJ1bGUJUm9tYW5pYQkxOTgwCW9ubHkJLQlTZXAJbGFzdFN1bgkgMTowMAkwCS0KLVJ1bGUJUm9tYW5pYQkxOTkxCTE5OTMJLQlNYXIJbGFzdFN1bgkgMDowMHMJMTowMAlTCi1SdWxlCVJvbWFuaWEJMTk5MQkxOTkzCS0JU2VwCWxhc3RTdW4JIDA6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvQnVjaGFyZXN0CTE6NDQ6MjQgLQlMTVQJMTg5MSBPY3QKLQkJCTE6NDQ6MjQJLQlCTVQJMTkzMSBKdWwgMjQJIyBCdWNoYXJlc3QgTVQKLQkJCTI6MDAJUm9tYW5pYQlFRSVzVAkxOTgxIE1hciAyOSAyOjAwcwotCQkJMjowMAlDLUV1cglFRSVzVAkxOTkxCi0JCQkyOjAwCVJvbWFuaWEJRUUlc1QJMTk5NAotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk3Ci0JCQkyOjAwCUVVCUVFJXNUCi0KLSMgUnVzc2lhCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIEV4Y2VwdCBmb3IgTW9zY293IGFmdGVyIDE5MTktMDctMDEsIEkgaW52ZW50ZWQgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zLgotIyBNb3Njb3cgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgYWZ0ZXIgMTkxOS0wNy0wMSwgYW5kIE1vc2NvdyBydWxlcyBhZnRlciAxOTkxLAotIyBhcmUgZnJvbSBBbmRyZXkgQS4gQ2hlcm5vdi4gIFRoZSByZXN0IGlzIGZyb20gU2hhbmtzICYgUG90dGVuZ2VyLAotIyBleGNlcHQgd2UgZm9sbG93IENoZXJub3YncyByZXBvcnQgdGhhdCAxOTkyIERTVCB0cmFuc2l0aW9ucyB3ZXJlIFNhdAotIyAyMzowMCwgbm90IFN1biAwMjowMHMuCi0jCi0jIEZyb20gU3RhbmlzbGF3IEEuIEt1emlrb3dza2kgKDE5OTQtMDYtMjkpOgotIyBCdXQgbm93IGl0IGlzIHNvbWUgbW9udGhzIHNpbmNlIE5vdm9zaWJpcnNrIGlzIDMgaG91cnMgYWhlYWQgb2YgTW9zY293IQotIyBJIGRvIG5vdCBrbm93IHdoeSB0aGV5IGhhdmUgZGVjaWRlZCB0byBtYWtlIHRoaXMgY2hhbmdlOwotIyBhcyBmYXIgYXMgSSByZW1lbWJlciBpdCB3YXMgZG9uZSBleGFjdGx5IGR1cmluZyB3aW50ZXItPnN1bW1lciBzd2l0Y2hpbmcKLSMgc28gd2UgKE5vdm9zaWJpcnNrKSBzaW1wbHkgZGlkIG5vdCBzd2l0Y2guCi0jCi0jIEZyb20gQW5kcmV5IEEuIENoZXJub3YgKDE5OTYtMTAtMDQpOgotIyBgTVNLJyBhbmQgYE1TRCcgd2VyZSBib3JuIGFuZCB1c2VkIGluaXRpYWxseSBvbiBNb3Njb3cgY29tcHV0ZXJzIHdpdGgKLSMgVU5JWC1saWtlIE9TZXMgYnkgc2V2ZXJhbCBkZXZlbG9wZXIgZ3JvdXBzIChlLmcuIERlbW9zIGdyb3VwLCBLaWFlIGdyb3VwKS4uLi4KLSMgVGhlIG5leHQgc3RlcCB3YXMgdGhlIFVVQ1AgbmV0d29yaywgdGhlIFJlbGNvbSBwcmVkZWNlc3NvcgotIyAodXNlZCBtYWlubHkgZm9yIG1haWwpLCBhbmQgTVNLL01TRCB3YXMgYWN0aXZlbHkgdXNlZCB0aGVyZS4KLSMKLSMgRnJvbSBDaHJpcyBDYXJyaWVyICgxOTk2LTEwLTMwKToKLSMgQWNjb3JkaW5nIHRvIGEgZnJpZW5kIG9mIG1pbmUgd2hvIHJvZGUgdGhlIFRyYW5zLVNpYmVyaWFuIFJhaWxyb2FkIGZyb20KLSMgTW9zY293IHRvIElya3V0c2sgaW4gMTk5NSwgcHVibGljIGFpciBhbmQgcmFpbCB0cmFuc3BvcnQgaW4gUnVzc2lhIC4uLgotIyBzdGlsbCBmb2xsb3dzIE1vc2NvdyB0aW1lLCBubyBtYXR0ZXIgd2hlcmUgaW4gUnVzc2lhIGl0IGlzIGxvY2F0ZWQuCi0jCi0jIEZvciBHcm96bnksIENoZWNobnlhLCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgc3RvcnkgZnJvbQotIyBKb2huIERhbmlzemV3c2tpLCAiU2NhdmVuZ2VycyBpbiB0aGUgUnViYmxlIiwgTG9zIEFuZ2VsZXMgVGltZXMgKDIwMDEtMDItMDcpOgotIyBOZXdzLS1vZnRlbiBmYWxzZS0taXMgc3ByZWFkIGJ5IHdvcmQgb2YgbW91dGguICBBIHJ1bW9yIHRoYXQgaXQgd2FzCi0jIHRpbWUgdG8gbW92ZSB0aGUgY2xvY2tzIGJhY2sgcHV0IHRoaXMgd2hvbGUgY2l0eSBvdXQgb2Ygc3luYyB3aXRoCi0jIHRoZSByZXN0IG9mIFJ1c3NpYSBmb3IgdHdvIHdlZWtzLS1ldmVuIHNvbGRpZXJzIHN0YXRpb25lZCBoZXJlIGJlZ2FuCi0jIGVuZm9yY2luZyBjdXJmZXcgYXQgdGhlIHdyb25nIHRpbWUuCi0jCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDYtMDUpOgotIyBUaGVyZSdzIGNvbnNpZGVyYWJsZSBldmlkZW5jZSB0aGF0IFNha2hhbGluIElzbGFuZCB1c2VkIHRvIGJlIGluCi0jIFVUQysxMSwgYW5kIGhhcyBjaGFuZ2VkIHRvIFVUQysxMCwgaW4gdGhpcyBkZWNhZGUuICBJIHN0YXJ0IHdpdGggdGhlCi0jIFNTSU0sIHdoaWNoIGxpc3RlZCBZdXpobm8tU2FraGFsaW5zayBpbiB6b25lIFJVMTAgYWxvbmcgd2l0aCBNYWdhZGFuCi0jIHVudGlsIEZlYnJ1YXJ5IDE5OTcsIGFuZCB0aGVuIGluIFJVOSB3aXRoIEtoYWJhcm92c2sgYW5kIFZsYWRpdm9zdG9rCi0jIHNpbmNlIFNlcHRlbWJlciAxOTk3Li4uLiAgQWx0aG91Z2ggdGhlIEt1cmlsIElzbGFuZHMgYXJlCi0jIGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBTYWtoYWxpbiBvYmxhc3QnLCB0aGV5IGFwcGVhciB0byBoYXZlCi0jIHJlbWFpbmVkIG9uIFVUQysxMSBhbG9uZyB3aXRoIE1hZ2FkYW4uCi0jCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi0jCi0jIEthbGluaW5ncmFkc2theWEgb2JsYXN0Jy4KLVpvbmUgRXVyb3BlL0thbGluaW5ncmFkCSAxOjIyOjAwIC0JTE1UCTE4OTMgQXByCi0JCQkgMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkgMjowMAlQb2xhbmQJQ0Ulc1QJMTk0NgotCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSAyOjAwCVJ1c3NpYQlFRSVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBSZXNwdWJsaWthIEFkeWdleWEsIEFya2hhbmdlbCdza2F5YSBvYmxhc3QnLAotIyBCZWxnb3JvZHNrYXlhIG9ibGFzdCcsIEJyeWFuc2theWEgb2JsYXN0JywgVmxhZGltaXJza2F5YSBvYmxhc3QnLAotIyBWb2xvZ29kc2theWEgb2JsYXN0JywgVm9yb25lemhza2F5YSBvYmxhc3QnLAotIyBSZXNwdWJsaWthIERhZ2VzdGFuLCBJdmFub3Zza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIEluZ3VzaGV0aXlhLAotIyBLYWJhcmJpbm8tQmFsa2Fyc2theWEgUmVzcHVibGlrYSwgUmVzcHVibGlrYSBLYWxteWtpeWEsCi0jIEthbHl6aHNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgS2FyYWNoYWV2by1DaGVya2Vzc2l5YSwKLSMgUmVzcHVibGlrYSBLYXJlbGl5YSwgUmVzcHVibGlrYSBLb21pLAotIyBLb3N0cm9tc2theWEgb2JsYXN0JywgS3Jhc25vZGFyc2tpaiBrcmFqLCBLdXJza2F5YSBvYmxhc3QnLAotIyBMZW5pbmdyYWRza2F5YSBvYmxhc3QnLCBMaXBldHNrYXlhIG9ibGFzdCcsIFJlc3B1Ymxpa2EgTWFyaWogRWwsCi0jIFJlc3B1Ymxpa2EgTW9yZG92aXlhLCBNb3NrdmEsIE1vc2tvdnNrYXlhIG9ibGFzdCcsCi0jIE11cm1hbnNrYXlhIG9ibGFzdCcsIE5lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLAotIyBOaXpoZWdvcm9kc2theWEgb2JsYXN0JywgTm92Z29yb2Rza2F5YSBvYmxhc3QnLCBPcmxvdnNrYXlhIG9ibGFzdCcsCi0jIFBlbnplbnNrYXlhIG9ibGFzdCcsIFBza292c2theWEgb2JsYXN0JywgUm9zdG92c2theWEgb2JsYXN0JywKLSMgUnlhemFuc2theWEgb2JsYXN0JywgU2Fua3QtUGV0ZXJidXJnLAotIyBSZXNwdWJsaWthIFNldmVybmF5YSBPc2V0aXlhLCBTbW9sZW5za2F5YSBvYmxhc3QnLAotIyBTdGF2cm9wb2wnc2tpaiBrcmFqLCBUYW1ib3Zza2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIFRhdGFyc3RhbiwKLSMgVHZlcnNrYXlhIG9ibGFzdCcsIFR5bCdza2F5YSBvYmxhc3QnLCBVbCd5YW5vdnNrYXlhIG9ibGFzdCcsCi0jIENoZWNoZW5za2F5YSBSZXNwdWJsaWthLCBDaHV2YXNoc2theWEgb2JsYXN0JywKLSMgWWFyb3NsYXZza2F5YSBvYmxhc3QnCi1ab25lIEV1cm9wZS9Nb3Njb3cJIDI6MzA6MjAgLQlMTVQJMTg4MAotCQkJIDI6MzAJLQlNTVQJMTkxNiBKdWwgIDMgIyBNb3Njb3cgTWVhbiBUaW1lCi0JCQkgMjozMDo0OCBSdXNzaWEJJXMJMTkxOSBKdWwgIDEgMjowMAotCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTkyMiBPY3QKLQkJCSAyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCi0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJTVNLL01TRAotIwotIyBBc3RyYWtoYW5za2F5YSBvYmxhc3QnLCBLaXJvdnNrYXlhIG9ibGFzdCcsIFNhcmF0b3Zza2F5YSBvYmxhc3QnLAotIyBWb2xnb2dyYWRza2F5YSBvYmxhc3QnLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBLaXJvdiBpcyBzdGlsbCBhdCArMDQwMAotIyBidXQgV2lraXBlZGlhICgyMDA2LTA1LTA5KSBzYXlzICswMzAwLiAgUGVyaGFwcyBpdCBzd2l0Y2hlZCBhZnRlciB0aGUKLSMgb3RoZXJzPyAgQnV0IHdlIGhhdmUgbm8gZGF0YS4KLVpvbmUgRXVyb3BlL1ZvbGdvZ3JhZAkgMjo1Nzo0MCAtCUxNVAkxOTIwIEphbiAgMwotCQkJIDM6MDAJLQlUU0FUCTE5MjUgQXByICA2ICMgVHNhcml0c3luIFRpbWUKLQkJCSAzOjAwCS0JU1RBVAkxOTMwIEp1biAyMSAjIFN0YWxpbmdyYWQgVGltZQotCQkJIDQ6MDAJLQlTVEFUCTE5NjEgTm92IDExCi0JCQkgNDowMAlSdXNzaWEJVk9MJXNUCTE5ODkgTWFyIDI2IDI6MDBzICMgVm9sZ29ncmFkIFQKLQkJCSAzOjAwCVJ1c3NpYQlWT0wlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA0OjAwCS0JVk9MVAkxOTkyIE1hciAyOSAyOjAwcwotCQkJIDM6MDAJUnVzc2lhCVZPTCVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBTYW1hcnNrYXlhIG9ibGFzdCcsIFVkbXlydHNrYXlhIHJlc3B1Ymxpa2EKLVpvbmUgRXVyb3BlL1NhbWFyYQkgMzoyMDozNiAtCUxNVAkxOTE5IEp1bCAgMSAyOjAwCi0JCQkgMzowMAktCVNBTVQJMTkzMCBKdW4gMjEKLQkJCSA0OjAwCS0JU0FNVAkxOTM1IEphbiAyNwotCQkJIDQ6MDAJUnVzc2lhCUtVWSVzVAkxOTg5IE1hciAyNiAyOjAwcyAjIEt1eWJ5c2hldgotCQkJIDM6MDAJUnVzc2lhCUtVWSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCUtVWSVzVAkxOTkxIFNlcCAyOSAyOjAwcwotCQkJIDM6MDAJLQlLVVlUCTE5OTEgT2N0IDIwIDM6MDAKLQkJCSA0OjAwCVJ1c3NpYQlTQU0lc1QJMjAxMCBNYXIgMjggMjowMHMgIyBTYW1hcmEgVGltZQotCQkJIDM6MDAJUnVzc2lhCVNBTSVzVAotCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIFJlc3B1Ymxpa2EgQmFzaGtvcnRvc3RhbiwgS29taS1QZXJteWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLAotIyBLdXJnYW5za2F5YSBvYmxhc3QnLCBPcmVuYnVyZ3NrYXlhIG9ibGFzdCcsIFBlcm1za2F5YSBvYmxhc3QnLAotIyBTdmVyZGxvdnNrYXlhIG9ibGFzdCcsIFR5dW1lbnNrYXlhIG9ibGFzdCcsCi0jIEtoYW50eS1NYW5za2lqc2tpaiBhdnRvbm9tbnlqIG9rcnVnLCBDaGVseWFiaW5za2F5YSBvYmxhc3QnLAotIyBZYW1hbG8tTmVuZXRza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvWWVrYXRlcmluYnVyZwkgNDowMjoyNCAtCUxNVAkxOTE5IEp1bCAxNSA0OjAwCi0JCQkgNDowMAktCVNWRVQJMTkzMCBKdW4gMjEgIyBTdmVyZGxvdnNrIFRpbWUKLQkJCSA1OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA0OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA1OjAwCVJ1c3NpYQlZRUslc1QJIyBZZWthdGVyaW5idXJnIFRpbWUKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgUmVzcHVibGlrYSBBbHRhaiwgQWx0YWpza2lqIGtyYWosIE9tc2theWEgb2JsYXN0Jy4KLVpvbmUgQXNpYS9PbXNrCQkgNDo1MzozNiAtCUxNVAkxOTE5IE5vdiAxNAotCQkJIDU6MDAJLQlPTVNUCTE5MzAgSnVuIDIxICMgT21zayBUSW1lCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkgNTowMAlSdXNzaWEJT01TJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJT01TJXNUCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDgtMTkpOiBJJ20gZ3Vlc3NpbmcgYWJvdXQgVG9tc2sgaGVyZTsgaXQncwotIyBub3QgY2xlYXIgd2hlbiBpdCBzd2l0Y2hlZCBmcm9tICs3IHRvICs2LgotIyBOb3Zvc2liaXJza2F5YSBvYmxhc3QnLCBUb21za2F5YSBvYmxhc3QnLgotWm9uZSBBc2lhL05vdm9zaWJpcnNrCSA1OjMxOjQwIC0JTE1UCTE5MTkgRGVjIDE0IDY6MDAKLQkJCSA2OjAwCS0JTk9WVAkxOTMwIEp1biAyMSAjIE5vdm9zaWJpcnNrIFRpbWUKLQkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlOT1Ylc1QJMTk5MyBNYXkgMjMgIyBzYXkgU2hhbmtzICYgUC4KLQkJCSA2OjAwCVJ1c3NpYQlOT1Ylc1QKLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0xMC0xMyk6Ci0jIEtlbWVyb3ZvIG9ibGFzdCcgKEtlbWVyb3ZvIHJlZ2lvbikgaW4gUnVzc2lhIHdpbGwgY2hhbmdlIGN1cnJlbnQgdGltZSB6b25lIG9uCi0jIE1hcmNoIDI4LCAyMDEwOgotIyBmcm9tIGN1cnJlbnQgUnVzc2lhIFpvbmUgNiAtIEtyYXNub3lhcnNrIFRpbWUgWm9uZSAoS1JBKSBVVEMgKzA3MDAKLSMgdG8gUnVzc2lhIFpvbmUgNSAtIE5vdm9zaWJpcnNrIFRpbWUgWm9uZSAoTk9WKSBVVEMgKzA2MDAKLSMKLSMgVGhpcyBpcyBhY2NvcmRpbmcgdG8gR292ZXJubWVudCBvZiBSdXNzaWEgZGVjcmVlICMgNzQwLCBvbiBTZXB0ZW1iZXIKLSMgMTQsIDIwMDkgIkFwcGxpY2F0aW9uIGluIHRoZSB0ZXJyaXRvcnkgb2YgdGhlIEtlbWVyb3ZvIHJlZ2lvbiB0aGUgRmlmdGgKLSMgdGltZSB6b25lLiIgKCJSdXNzaWEgWm9uZSA1IiBvciBvbGQgIlVTU1IgWm9uZSA1IiBpcyBHTVQgKzA2MDApCi0jCi0jIFJ1c3NpYW4gR292ZXJubWVudCB3ZWIgc2l0ZSAoUnVzc2lhbiBsYW5ndWFnZSkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3Zlcm5tZW50LnJ1L2NvbnRlbnQvZ292ZXJubWVudGFjdGl2aXR5L3JmZ292ZXJubWVudGRlY2lzaW9ucy9hcmNoaXYiPgotIyBodHRwOi8vd3d3LmdvdmVybm1lbnQucnUvY29udGVudC9nb3Zlcm5tZW50YWN0aXZpdHkvcmZnb3Zlcm5tZW50ZGVjaXNpb25zL2FyY2hpdmUvMjAwOS8wOS8xNC85OTE2MzMuaHRtCi0jIDwvYT4KLSMgb3IgUnVzc2lhbi1FbmdsaXNoIHRyYW5zbGF0aW9uIGJ5IFdvcmxkVGltZVpvbmUuY29tIHdpdGggcmVmZXJlbmNlCi0jIG1hcCB0byBsb2NhbCByZWdpb24gYW5kIG5ldyBSdXNzaWEgVGltZSBab25lIG1hcCBhZnRlciBNYXJjaCAyOCwgMjAxMAotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTAzLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX3J1c3NpYTAzLmh0bWwKLSMgPC9hPgotIwotIyBUaHVzLCB3aGVuIFJ1c3NpYSB3aWxsIHN3aXRjaCB0byBEU1Qgb24gdGhlIG5pZ2h0IG9mIE1hcmNoIDI4LCAyMDEwCi0jIEtlbWVyb3ZvIHJlZ2lvbiAoS2VtZXJvdm8gb2JsYXN0Jykgd2lsbCBub3QgY2hhbmdlIHRoZSBjbG9jay4KLSMKLSMgQXMgYSByZXN1bHQsIEtlbWVyb3ZvIG9ibGFzdCcgd2lsbCBiZSBpbiB0aGUgc2FtZSB0aW1lIHpvbmUgYXMKLSMgTm92b3NpYmlyc2ssIE9tc2ssIFRvbXNrLCBCYXJuYXVsIGFuZCBBbHRhaSBSZXB1YmxpYy4KLQotWm9uZSBBc2lhL05vdm9rdXpuZXRzawkgNTo0ODo0OCAtCU5NVAkxOTIwIEphbiAgNgotCQkJIDY6MDAJLQlLUkFUCTE5MzAgSnVuIDIxICMgS3Jhc25veWFyc2sgVGltZQotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCUtSQSVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkyMDEwIE1hciAyOCAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCU5PViVzVCAjIE5vdm9zaWJpcnNrL05vdm9rdXpuZXRzayBUaW1lCi0KLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgS3Jhc25veWFyc2tpaiBrcmFqLAotIyBUYWpteXJza2lqIChEb2xnYW5vLU5lbmV0c2tpaikgYXZ0b25vbW55aiBva3J1ZywKLSMgUmVzcHVibGlrYSBUdXZhLCBSZXNwdWJsaWthIEtoYWthc2l5YSwgRXZlbmtpanNraWogYXZ0b25vbW55aiBva3J1Zy4KLVpvbmUgQXNpYS9LcmFzbm95YXJzawkgNjoxMToyMCAtCUxNVAkxOTIwIEphbiAgNgotCQkJIDY6MDAJLQlLUkFUCTE5MzAgSnVuIDIxICMgS3Jhc25veWFyc2sgVGltZQotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCUtSQSVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBSZXNwdWJsaWthIEJ1cnlhdGl5YSwgSXJrdXRza2F5YSBvYmxhc3QnLAotIyBVc3QnLU9yZHluc2tpaiBCdXJ5YXRza2lqIGF2dG9ub21ueWogb2tydWcuCi1ab25lIEFzaWEvSXJrdXRzawkgNjo1NzoyMCAtCUxNVAkxODgwCi0JCQkgNjo1NzoyMCAtCUlNVAkxOTIwIEphbiAyNSAjIElya3V0c2sgTWVhbiBUaW1lCi0JCQkgNzowMAktCUlSS1QJMTkzMCBKdW4gMjEgIyBJcmt1dHNrIFRpbWUKLQkJCSA4OjAwCVJ1c3NpYQlJUkslc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQlJUkslc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCSA4OjAwCVJ1c3NpYQlJUkslc1QKLSMKLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwMy0xMC0xOCk6IFtUaGlzIHJlZ2lvbiBjb25zaXN0cyBvZl0KLSMgQWdpbnNraWogQnVyeWF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnLCBBbXVyc2theWEgb2JsYXN0JywKLSMgW3BhcnRzIG9mXSBSZXNwdWJsaWthIFNha2hhIChZYWt1dGl5YSksIENoaXRpbnNrYXlhIG9ibGFzdCcuCi0KLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6Ci0jIC4uLnNvbWUgcmVnaW9ucyBvZiBSVXNzaWEgd2VyZSBtZXJnZWQgd2l0aCBvdGhlcnMgc2luY2UgMjAwNS4uLgotIyBTb21lIG5hbWVzIHdlcmUgY2hhbmdlZCwgbm8gYmlnIGRlYWwsIGV4Y2VwdCBmb3Igb25lIGluc3RhbmNlOiBhIG5ldyBuYW1lLgotIyBZQUsvWUFLU1Q6IFVUQys5IFphYmFqa2FsJ3NraWoga3Jhai4KLQotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKLSMgVGhlIFNha2hhIGRpc3RyaWN0cyBhcmU6IEFsZGFuc2tpaiwgQW1naW5za2lqLCBBbmFiYXJza2lqLAotIyBWZXJraG5ldmlseXVqc2tpaiwgVmlseXVqc2tpaiwgR29ybnlqLAotIyBaaGlnYW5za2lqLCBLb2J5YWpza2lqLCBMZW5za2lqLCBNZWdpbm8tS2FuZ2FsYXNza2lqLCBNaXJuaW5za2lqLAotIyBOYW1za2lqLCBOeXVyYmluc2tpaiwgT2xlbnlva3NraWosIE9seW9rbWluc2tpaiwKLSMgU3VudGFyc2tpaiwgVGF0dGluc2tpaiwgVXN0Jy1BbGRhbnNraWosIEtoYW5nYWxhc3NraWosCi0jIENodXJhcGNoaW5za2lqLCBFdmVuby1CeXRhbnRhanNraWogTmF0c2lvbmFsJ25pai4KLQotWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NDAgLQlMTVQJMTkxOSBEZWMgMTUKLQkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAzLTEwLTE4KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBFdnJlanNrYXlhIGF2dG9ub21uYXlhIG9ibGFzdCcsIEtoYWJhcm92c2tpaiBrcmFqLCBQcmltb3Jza2lqIGtyYWosCi0jIFtwYXJ0cyBvZl0gUmVzcHVibGlrYSBTYWtoYSAoWWFrdXRpeWEpLgotCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgotIyBUaGUgU2FraGEgZGlzdHJpY3RzIGFyZTogQnVsdW5za2lqLCBWZXJraG95YW5za2lqLCBUb21wb25za2lqLCBVc3QnLU1hanNraWosCi0jIFVzdCctWWFuc2tpai4KLVpvbmUgQXNpYS9WbGFkaXZvc3RvawkgODo0Nzo0NCAtCUxNVAkxOTIyIE5vdiAxNQotCQkJIDk6MDAJLQlWTEFUCTE5MzAgSnVuIDIxICMgVmxhZGl2b3N0b2sgVGltZQotCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCVZMQSVzU1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTEwOjAwCVJ1c3NpYQlWTEElc1QKLSMKLSMgU2FraGFsaW5za2F5YSBvYmxhc3QnLgotIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBZdXpobm8tU2FraGFsaW5zaywgYnV0IHRoYXQncyB0b28gbG9uZy4KLVpvbmUgQXNpYS9TYWtoYWxpbgkgOTozMDo0OCAtCUxNVAkxOTA1IEF1ZyAyMwotCQkJIDk6MDAJLQlDSlQJMTkzOAotCQkJIDk6MDAJLQlKU1QJMTk0NSBBdWcgMjUKLQkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5MSBNYXIgMzEgMjowMHMgIyBTYWtoYWxpbiBULgotCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCVNBSyVzVAkxOTk3IE1hciBsYXN0U3VuIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJU0FLJXNUCi0jCi0jIEZyb20gT3NjYXIgdmFuIFZsaWptZW4gKDIwMDMtMTAtMTgpOiBbVGhpcyByZWdpb24gY29uc2lzdHMgb2ZdCi0jIE1hZ2FkYW5za2F5YSBvYmxhc3QnLCBSZXNwdWJsaWthIFNha2hhIChZYWt1dGl5YSkuCi0jIFByb2JhYmx5IGFsc286IEt1cmlsIElzbGFuZHMuCi0KLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6Ci0jIFRoZSBTYWtoYSBkaXN0cmljdHMgYXJlOiBBYnlqc2tpaiwgQWxsYWlraG92c2tpaiwgVmVya2hoaG5la29seW1za2lqLCBNb21za2lqLAotIyBOaXpobmVrb2x5bXNraWosIE9qbXlha29uc2tpaiwgU3JlZG5la29seW1za2lqLgotWm9uZSBBc2lhL01hZ2FkYW4JMTA6MDM6MTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAotIwotIyBGcm9tIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KTogW1RoaXMgcmVnaW9uIGNvbnNpc3RzIG9mXQotIyBLYW1jaGF0c2theWEgb2JsYXN0JywgS29yeWFrc2tpaiBhdnRvbm9tbnlqIG9rcnVnLgotIwotIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNraSwgYnV0IHRoYXQncyB0b28gbG9uZy4KLVpvbmUgQXNpYS9LYW1jaGF0a2EJMTA6MzQ6MzYgLQlMTVQJMTkyMiBOb3YgMTAKLQkJCTExOjAwCS0JUEVUVAkxOTMwIEp1biAyMSAjIFAtSyBUaW1lCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJUEVUJXNUCTE5OTIgSmFuIDE5IDI6MDBzCi0JCQkxMjowMAlSdXNzaWEJUEVUJXNUCTIwMTAgTWFyIDI4IDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJUEVUJXNUCi0jCi0jIENodWtvdHNraWogYXZ0b25vbW55aiBva3J1ZwotWm9uZSBBc2lhL0FuYWR5cgkxMTo0OTo1NiAtCUxNVAkxOTI0IE1heSAgMgotCQkJMTI6MDAJLQlBTkFUCTE5MzAgSnVuIDIxICMgQW5hZHlyIFRpbWUKLQkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgMDowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMTk5MiBKYW4gMTkgMjowMHMKLQkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMjAxMCBNYXIgMjggMjowMHMKLQkJCTExOjAwCVJ1c3NpYQlBTkElc1QKLQotIyBTZXJiaWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL0JlbGdyYWRlCTE6MjI6MDAJLQlMTVQJMTg4NAotCQkJMTowMAktCUNFVAkxOTQxIEFwciAxOCAyMzowMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ1Ci0JCQkxOjAwCS0JQ0VUCTE5NDUgTWF5IDggMjowMHMKLQkJCTE6MDAJMTowMAlDRVNUCTE5NDUgU2VwIDE2ICAyOjAwcwotIyBNZXRvZCBLb3plbGogcmVwb3J0cyB0aGF0IHRoZSBsZWdhbCBkYXRlIG9mCi0jIHRyYW5zaXRpb24gdG8gRVUgcnVsZXMgd2FzIDE5ODItMTEtMjcsIGZvciBhbGwgb2YgWXVnb3NsYXZpYSBhdCB0aGUgdGltZS4KLSMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGdpdmUgYXMgbXVjaCBkZXRhaWwsIHNvIGdvIHdpdGggS296ZWxqLgotCQkJMTowMAktCUNFVAkxOTgyIE5vdiAyNwotCQkJMTowMAlFVQlDRSVzVAotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL0xqdWJsamFuYQkjIFNsb3ZlbmlhCi1MaW5rIEV1cm9wZS9CZWxncmFkZSBFdXJvcGUvUG9kZ29yaWNhCSMgTW9udGVuZWdybwotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1NhcmFqZXZvCSMgQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1Nrb3BqZQkjIE1hY2Vkb25pYQotTGluayBFdXJvcGUvQmVsZ3JhZGUgRXVyb3BlL1phZ3JlYgkjIENyb2F0aWEKLQotIyBTbG92YWtpYQotTGluayBFdXJvcGUvUHJhZ3VlIEV1cm9wZS9CcmF0aXNsYXZhCi0KLSMgU2xvdmVuaWEKLSMgc2VlIFNlcmJpYQotCi0jIFNwYWluCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBGb3IgMTkxNy0xOTE5IFdoaXRtYW4gZ2l2ZXMgQXByIFNhdD49MSAtIE9jdCBTYXQ+PTE7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTE3CW9ubHkJLQlNYXkJIDUJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTE3CTE5MTkJLQlPY3QJIDYJMjM6MDBzCTAJLQotUnVsZQlTcGFpbgkxOTE4CW9ubHkJLQlBcHIJMTUJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTE5CW9ubHkJLQlBcHIJIDUJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MjEgRmViIDI4IC0gT2N0IDE0OyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJU3BhaW4JMTkyNAlvbmx5CS0JQXByCTE2CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBnaXZlcyAxOTI0IE9jdCAxNDsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNwYWluCTE5MjQJb25seQktCU9jdAkgNAkyMzowMHMJMAktCi1SdWxlCVNwYWluCTE5MjYJb25seQktCUFwcgkxNwkyMzowMHMJMTowMAlTCi0jIFdoaXRtYW4gc2F5cyBubyBEU1QgaW4gMTkyOTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVNwYWluCTE5MjYJMTkyOQktCU9jdAlTYXQ+PTEJMjM6MDBzCTAJLQotUnVsZQlTcGFpbgkxOTI3CW9ubHkJLQlBcHIJIDkJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTI4CW9ubHkJLQlBcHIJMTQJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTI5CW9ubHkJLQlBcHIJMjAJMjM6MDBzCTE6MDAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MzcgSnVuIDE2LCAxOTM4IEFwciAxNiwgMTk0MCBBcHIgMTM7Ci0jIGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTM3CW9ubHkJLQlNYXkJMjIJMjM6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTM3CTE5MzkJLQlPY3QJU2F0Pj0xCTIzOjAwcwkwCS0KLVJ1bGUJU3BhaW4JMTkzOAlvbmx5CS0JTWFyCTIyCTIzOjAwcwkxOjAwCVMKLVJ1bGUJU3BhaW4JMTkzOQlvbmx5CS0JQXByCTE1CTIzOjAwcwkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk0MAlvbmx5CS0JTWFyCTE2CTIzOjAwcwkxOjAwCVMKLSMgV2hpdG1hbiBzYXlzIG5vIERTVCAxOTQyLTE5NDU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlNYXkJIDIJMjI6MDBzCTI6MDAJTSAjIE1pZHN1bW1lcgotUnVsZQlTcGFpbgkxOTQyCW9ubHkJLQlTZXAJIDEJMjI6MDBzCTE6MDAJUwotUnVsZQlTcGFpbgkxOTQzCTE5NDYJLQlBcHIJU2F0Pj0xMwkyMjowMHMJMjowMAlNCi1SdWxlCVNwYWluCTE5NDMJb25seQktCU9jdAkgMwkyMjowMHMJMTowMAlTCi1SdWxlCVNwYWluCTE5NDQJb25seQktCU9jdAkxMAkyMjowMHMJMTowMAlTCi1SdWxlCVNwYWluCTE5NDUJb25seQktCVNlcAkzMAkgMTowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk0Nglvbmx5CS0JU2VwCTMwCSAwOjAwCTAJLQotUnVsZQlTcGFpbgkxOTQ5CW9ubHkJLQlBcHIJMzAJMjM6MDAJMTowMAlTCi1SdWxlCVNwYWluCTE5NDkJb25seQktCVNlcAkzMAkgMTowMAkwCS0KLVJ1bGUJU3BhaW4JMTk3NAkxOTc1CS0JQXByCVNhdD49MTMJMjM6MDAJMTowMAlTCi1SdWxlCVNwYWluCTE5NzQJMTk3NQktCU9jdAlTdW4+PTEJIDE6MDAJMAktCi1SdWxlCVNwYWluCTE5NzYJb25seQktCU1hcgkyNwkyMzowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk3NgkxOTc3CS0JU2VwCWxhc3RTdW4JIDE6MDAJMAktCi1SdWxlCVNwYWluCTE5NzcJMTk3OAktCUFwcgkgMgkyMzowMAkxOjAwCVMKLVJ1bGUJU3BhaW4JMTk3OAlvbmx5CS0JT2N0CSAxCSAxOjAwCTAJLQotIyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFyZSBjb3BpZWQgZnJvbSBNb3JvY2NvIGZyb20gMTk2NyB0aHJvdWdoIDE5NzguCi1SdWxlIFNwYWluQWZyaWNhIDE5NjcJb25seQktCUp1bgkgMwkxMjowMAkxOjAwCVMKLVJ1bGUgU3BhaW5BZnJpY2EgMTk2Nwlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQotUnVsZSBTcGFpbkFmcmljYSAxOTc0CW9ubHkJLQlKdW4JMjQJIDA6MDAJMTowMAlTCi1SdWxlIFNwYWluQWZyaWNhIDE5NzQJb25seQktCVNlcAkgMQkgMDowMAkwCS0KLVJ1bGUgU3BhaW5BZnJpY2EgMTk3NgkxOTc3CS0JTWF5CSAxCSAwOjAwCTE6MDAJUwotUnVsZSBTcGFpbkFmcmljYSAxOTc2CW9ubHkJLQlBdWcJIDEJIDA6MDAJMAktCi1SdWxlIFNwYWluQWZyaWNhIDE5NzcJb25seQktCVNlcAkyOAkgMDowMAkwCS0KLVJ1bGUgU3BhaW5BZnJpY2EgMTk3OAlvbmx5CS0JSnVuCSAxCSAwOjAwCTE6MDAJUwotUnVsZSBTcGFpbkFmcmljYSAxOTc4CW9ubHkJLQlBdWcJIDQJIDA6MDAJMAktCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUV1cm9wZS9NYWRyaWQJLTA6MTQ6NDQgLQlMTVQJMTkwMSBKYW4gIDEgIDA6MDBzCi0JCQkgMDowMAlTcGFpbglXRSVzVAkxOTQ2IFNlcCAzMAotCQkJIDE6MDAJU3BhaW4JQ0Ulc1QJMTk3OQotCQkJIDE6MDAJRVUJQ0Ulc1QKLVpvbmUJQWZyaWNhL0NldXRhCS0wOjIxOjE2IC0JTE1UCTE5MDEKLQkJCSAwOjAwCS0JV0VUCTE5MTggTWF5ICA2IDIzOjAwCi0JCQkgMDowMAkxOjAwCVdFU1QJMTkxOCBPY3QgIDcgMjM6MDAKLQkJCSAwOjAwCS0JV0VUCTE5MjQKLQkJCSAwOjAwCVNwYWluCVdFJXNUCTE5MjkKLQkJCSAwOjAwIFNwYWluQWZyaWNhIFdFJXNUIDE5ODQgTWFyIDE2Ci0JCQkgMTowMAktCUNFVAkxOTg2Ci0JCQkgMTowMAlFVQlDRSVzVAotWm9uZQlBdGxhbnRpYy9DYW5hcnkJLTE6MDE6MzYgLQlMTVQJMTkyMiBNYXIgIyBMYXMgUGFsbWFzIGRlIEdyYW4gQy4KLQkJCS0xOjAwCS0JQ0FOVAkxOTQ2IFNlcCAzMCAxOjAwICMgQ2FuYXJpZXMgVGltZQotCQkJIDA6MDAJLQlXRVQJMTk4MCBBcHIgIDYgMDowMHMKLQkJCSAwOjAwCTE6MDAJV0VTVAkxOTgwIFNlcCAyOCAwOjAwcwotCQkJIDA6MDAJRVUJV0Ulc1QKLSMgSUFUQSBTU0lNICgxOTk2LTA5KSBzYXlzIHRoZSBDYW5hcmllcyBzd2l0Y2ggYXQgMjowMHUsIG5vdCAxOjAwdS4KLSMgSWdub3JlIHRoaXMgZm9yIG5vdywgYXMgdGhlIENhbmFyaWVzIGFyZSBwYXJ0IG9mIHRoZSBFVS4KLQotIyBTd2VkZW4KLQotIyBGcm9tIEl2YW4gTmlsc3NvbiAoMjAwMS0wNC0xMyksIHN1cGVyc2VkaW5nIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMKLSMgVGhlIGxhdyAiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTg3OCwgbm8gMTQiIGFib3V0IHN0YW5kYXJkIHRpbWUgaW4gMTg3OToKLSMgRnJvbSB0aGUgYmVnaW5uaW5nIG9mIDE4NzkgKHRoYXQgaXMgMDEtMDEgMDA6MDApIHRoZSB0aW1lIGZvciBhbGwKLSMgcGxhY2VzIGluIHRoZSBjb3VudHJ5IGlzICJ0aGUgbWVhbiBzb2xhciB0aW1lIGZvciB0aGUgbWVyaWRpYW4gYXQKLSMgdGhyZWUgZGVncmVlcywgb3IgdHdlbHZlIG1pbnV0ZXMgb2YgdGltZSwgdG8gdGhlIHdlc3Qgb2YgdGhlCi0jIG1lcmlkaWFuIG9mIHRoZSBPYnNlcnZhdG9yeSBvZiBTdG9ja2hvbG0iLiAgVGhlIGxhdyBpcyBkYXRlZCAxODc4LTA1LTMxLgotIwotIyBUaGUgb2JzZXJ2YXRvcnkgYXQgdGhhdCB0aW1lIGhhZCB0aGUgbWVyaWRpYW4gMTggZGVncmVlcyAwMycgMzAiCi0jIGVhc3Rlcm4gbG9uZ2l0dWRlID0gMDE6MTI6MTQgaW4gdGltZS4gIExlc3MgMTIgbWludXRlcyBnaXZlcyB0aGUKLSMgbmF0aW9uYWwgc3RhbmRhcmQgdGltZSBhcyAwMTowMDoxNCBhaGVhZCBvZiBHTVQuLi4uCi0jCi0jIEFib3V0IHRoZSBiZWdpbm5pbmcgb2YgQ0VUIGluIFN3ZWRlbi4gVGhlIGxhd3RleHQgKCJTdmVuc2sKLSMgZm9yZmF0dG5pbmdzc2FtbGluZyAxODk5LCBubyA0NCIpIHN0YXRlcywgdGhhdCAiZnJvbSB0aGUgYmVnaW5uaW5nCi0jIG9mIDE5MDAuLi4gLi4uIHRoZSBzYW1lIGFzIHRoZSBtZWFuIHNvbGFyIHRpbWUgZm9yIHRoZSBtZXJpZGlhbiBhdAotIyB0aGUgZGlzdGFuY2Ugb2Ygb25lIGhvdXIgb2YgdGltZSBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgRW5nbGlzaAotIyBvYnNlcnZhdG9yeSBhdCBHcmVlbndpY2gsIG9yIGF0IDEyIG1pbnV0ZXMgMTQgc2Vjb25kcyB0byB0aGUgd2VzdAotIyBmcm9tIHRoZSBtZXJpZGlhbiBvZiB0aGUgT2JzZXJ2YXRvcnkgb2YgU3RvY2tob2xtIi4gVGhlIGxhdyBpcyBkYXRlZAotIyAxODk5LTA2LTE2LiAgSW4gc2hvcnQ6IEF0IDE5MDAtMDEtMDEgMDA6MDA6MDAgdGhlIG5ldyBzdGFuZGFyZCB0aW1lCi0jIGluIFN3ZWRlbiBpcyAwMTowMDowMCBhaGVhZCBvZiBHTVQuCi0jCi0jIDE5MTY6IFRoZSBsYXd0ZXh0ICgiU3ZlbnNrIGZvcmZhdHRuaW5nc3NhbWxpbmcgMTkxNiwgbm8gMTI0Iikgc3RhdGVzCi0jIHRoYXQgIjE5MTYtMDUtMTUgaXMgY29uc2lkZXJlZCB0byBiZWdpbiBvbmUgaG91ciBlYXJsaWVyIi4gSXQgaXMKLSMgcHJldHR5IG9idmlvdXMgdGhhdCBhdCAwNS0xNCAyMzowMCB0aGUgY2xvY2tzIGFyZSBzZXQgdG8gMDUtMTUgMDA6MDAuLi4uCi0jIEZ1cnRoZXIgdGhlIGxhdyBzYXlzLCB0aGF0ICIxOTE2LTA5LTMwIGlzIGNvbnNpZGVyZWQgdG8gZW5kIG9uZSBob3VyIGxhdGVyIi4KLSMKLSMgVGhlIGxhd3MgcmVndWxhdGluZyBbRFNUXSBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzaXRlIG9mIHRoZSBTd2VkaXNoCi0jIFBhcmxpYW1lbnQgYmVnaW5uaW5nIHdpdGggMTk4NSAtIHRoZSBsYXdzIHJlZ3VsYXRpbmcgMTk4MC8xOTg0IGFyZQotIyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaXRlICh0byBteSBrbm93bGVkZ2UgdGhleSBhcmUgb25seSBhdmFpbGFibGUKLSMgaW4gU3dlZGlzaCk6IDxodHRwOi8vd3d3LnJpa3NkYWdlbi5zZS9lbmdsaXNoL3dvcmsvc2ZzdC5hc3A+ICh0eXBlCi0jICJzb21tYXJ0aWQiIHdpdGhvdXQgdGhlIHF1b3RlcyBpbiB0aGUgZmllbGQgIkZyaXRleHQiIGFuZCB0aGVuIGNsaWNrCi0jIHRoZSBTb2stYnV0dG9uKS4KLSMKLSMgKDIwMDEtMDUtMTMpOgotIwotIyBJIGhhdmUgbm93IGZvdW5kIGEgbmV3c3BhcGVyIHN0YXRpbmcgdGhhdCBhdCAxOTE2LTEwLTAxIDAxOjAwCi0jIHN1bW1lcnRpbWUgdGhlIGNodXJjaC1jbG9ja3MgZXRjIHdlcmUgc2V0IGJhY2sgb25lIGhvdXIgdG8gc2hvdwotIyAxOTE2LTEwLTAxIDAwOjAwIHN0YW5kYXJkIHRpbWUuICBUaGUgYXJ0aWNsZSBhbHNvIHJlcG9ydHMgdGhhdCBzb21lCi0jIHBlb3BsZSB0aG91Z2h0IHRoZSBzd2l0Y2ggdG8gc3RhbmRhcmQgdGltZSB3b3VsZCB0YWtlIHBsYWNlIGFscmVhZHkKLSMgYXQgMTkxNi0xMC0wMSAwMDowMCBzdW1tZXIgdGltZSwgYnV0IHRoZXkgaGFkIHRvIHdhaXQgZm9yIGFub3RoZXIKLSMgaG91ciBiZWZvcmUgdGhlIGV2ZW50IHRvb2sgcGxhY2UuCi0jCi0jIFNvdXJjZTogVGhlIG5ld3NwYXBlciAiRGFnZW5zIE55aGV0ZXIiLCAxOTE2LTEwLTAxLCBwYWdlIDcgdXBwZXIgbGVmdC4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBFdXJvcGUvU3RvY2tob2xtCTE6MTI6MTIgLQlMTVQJMTg3OSBKYW4gIDEKLQkJCTE6MDA6MTQJLQlTRVQJMTkwMCBKYW4gIDEJIyBTd2VkaXNoIFRpbWUKLQkJCTE6MDAJLQlDRVQJMTkxNiBNYXkgMTQgMjM6MDAKLQkJCTE6MDAJMTowMAlDRVNUCTE5MTYgT2N0ICAxIDAxOjAwCi0JCQkxOjAwCS0JQ0VUCTE5ODAKLQkJCTE6MDAJRVUJQ0Ulc1QKLQotIyBTd2l0emVybGFuZAotIyBGcm9tIEhvd3NlOgotIyBCeSB0aGUgZW5kIG9mIHRoZSAxOHRoIGNlbnR1cnkgY2xvY2tzIGFuZCB3YXRjaGVzIGJlY2FtZSBjb21tb25wbGFjZQotIyBhbmQgdGhlaXIgcGVyZm9ybWFuY2UgaW1wcm92ZWQgZW5vcm1vdXNseS4gIENvbW11bml0aWVzIGJlZ2FuIHRvIGtlZXAKLSMgbWVhbiB0aW1lIGluIHByZWZlcmVuY2UgdG8gYXBwYXJlbnQgdGltZSAtLSBHZW5ldmEgZnJvbSAxNzgwIC4uLi4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIEZyb20gV2hpdG1hbiAod2hvIHdyaXRlcyBgYE1pZG5pZ2h0PycnKToKLSMgUnVsZQlTd2lzcwkxOTQwCW9ubHkJLQlOb3YJIDIJMDowMAkxOjAwCVMKLSMgUnVsZQlTd2lzcwkxOTQwCW9ubHkJLQlEZWMJMzEJMDowMAkwCS0KLSMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXI6Ci0jIFJ1bGUJU3dpc3MJMTk0MQkxOTQyCS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJUwotIyBSdWxlCVN3aXNzCTE5NDEJMTk0MgktCU9jdAlTdW4+PTEJMDowMAkwCS0KLQotIyBGcm9tIEFsb2lzIFRyZWluZGwgKDIwMDgtMTItMTcpOgotIyBJIGhhdmUgcmVzZWFyY2hlZCB0aGUgRFNUIHVzYWdlIGluIFN3aXR6ZXJsYW5kIGR1cmluZyB0aGUgMTk0MGllcy4KLSMKLSMgQXMgSSB3cm90ZSBpbiBhbiBlYXJsaWVyIG1lc3NhZ2UsIEkgc3VzcGVjdGVkIHRoZSBjdXJyZW50IHR6ZGF0YSB2YWx1ZXMKLSMgdG8gYmUgd3JvbmcuIFRoaXMgaXMgbm93IHZlcmlmaWVkLgotIwotIyBJIGhhdmUgZm91bmQgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBydWxpbmcgYnkgdGhlIFN3aXNzIEZlZGVyYWwKLSMgZ292ZXJubWVudCwgaW4gJ0VpZGdlbltvXXNzaXNjaGUgR2VzZXR6ZXNzYW1tbHVuZyAxOTQxIGFuZCAxOTQyJyAoU3dpc3MKLSMgZmVkZXJhbCBsYXcgY29sbGVjdGlvbikuLi4KLSMKLSMgRFNUIGJlZ2FuIG9uIE1vbmRheSA1IE1heSAxOTQxLCAxOjAwIGFtIGJ5IHNoaWZ0aW5nIHRoZSBjbG9ja3MgdG8gMjowMCBhbQotIyBEU1QgZW5kZWQgb24gTW9uZGF5IDYgT2N0IDE5NDEsIDI6MDAgYW0gYnkgc2hpZnRpbmcgdGhlIGNsb2NrcyB0byAxOjAwIGFtLgotIwotIyBEU1QgYmVnYW4gb24gTW9uZGF5LCA0IE1heSAxOTQyIGF0IDAxOjAwIGFtCi0jIERTVCBlbmRlZCBvbiBNb25kYXksIDUgT2N0IDE5NDIgYXQgMDI6MDAgYW0KLSMKLSMgVGhlcmUgd2FzIG5vIERTVCBpbiAxOTQwLCBJIGhhdmUgY2hlY2tlZCB0aGUgbGF3IGNvbGxlY3Rpb24gY2FyZWZ1bGx5LgotIyBJdCBpcyBhbHNvIGluZGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSAxOTQyIGVudHJ5IGluIHRoZSBsYXcKLSMgY29sbGVjdGlvbiBwb2ludHMgYmFjayB0byAxOTQxIGFzIGEgcmVmZXJlbmNlLCBidXQgbm8gcmVmZXJlbmNlIHRvIGFueQotIyBvdGhlciB5ZWFycyBhcmUgbWFkZS4KLSMKLSMgTmV3c3BhcGVyIGFydGljbGVzIEkgaGF2ZSByZWFkIGluIHRoZSBhcmNoaXZlcyBvbiA2IE1heSAxOTQxIHJlcG9ydGVkCi0jIGFib3V0IHRoZSBpbnRyb2R1Y3Rpb24gb2YgRFNUIChTb21tZXJ6ZWl0IGluIEdlcm1hbikgZHVyaW5nIHRoZSBwcmV2aW91cwotIyBuaWdodCBhcyBhbiBhYnNvbHV0ZSBub3ZlbHR5LCBiZWNhdXNlIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoYXQgc3VjaAotIyBhIHRoaW5nIGhhZCBoYXBwZW5lZCBpbiBTd2l0emVybGFuZC4KLSMKLSMgSSBoYXZlIGFsc28gY2hlY2tlZCAxOTE2LCBiZWNhdXNlIG9uZSBib29rIHNvdXJjZSAoR2FicmllbCwgVHJhaXRlIGRlCi0jIGwnaGV1cmUgZGFucyBsZSBtb25kZSkgY2xhaW1zIHRoYXQgU3dpdHplcmxhbmQgaGFkIERTVCBpbiAxOTE2LiBUaGlzIGlzCi0jIGZhbHNlLCBubyBvZmZpY2lhbCBkb2N1bWVudCBjb3VsZCBiZSBmb3VuZC4gUHJvYmFibHkgR2FicmllbCBnb3QgbWlzbGVkCi0jIGJ5IHJlZmVyZW5jZXMgdG8gR2VybWFueSwgd2hpY2ggaW50cm9kdWNlZCBEU1QgaW4gMTkxNiBmb3IgdGhlIGZpcnN0IHRpbWUuCi0jCi0jIFRoZSB0emRhdGEgcnVsZXMgZm9yIFN3aXR6ZXJsYW5kIG11c3QgYmUgY2hhbmdlZCB0bzoKLSMgUnVsZSAgU3dpc3MgICAxOTQxICAgIDE5NDIgICAgLSAgICAgICBNYXkgICAgIE1vbj49MSAgMTowMCAgICAxOjAwICAgIFMKLSMgUnVsZSAgU3dpc3MgICAxOTQxICAgIDE5NDIgICAgLSAgICAgICBPY3QgICAgIE1vbj49MSAgMjowMCAgICAwICAgICAgIC0KLSMKLSMgVGhlIDE5NDAgcnVsZXMgbXVzdCBiZSBkZWxldGVkLgotIwotIyBPbmUgZnVydGhlciBkZXRhaWwgZm9yIFN3aXR6ZXJsYW5kLCB3aGljaCBpcyBwcm9iYWJseSBvdXQgb2Ygc2NvcGUgZm9yCi0jIG1vc3QgdXNlcnMgb2YgdHpkYXRhOgotIyBUaGUgem9uZSBmaWxlCi0jIFpvbmUgICAgRXVyb3BlL1p1cmljaCAgIDA6MzQ6MDggLSAgICAgICBMTVQgICAgIDE4NDggU2VwIDEyCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAwOjI5OjQ0IC0gICAgICAgQk1UICAgICAxODk0IEp1biAjQmVybiBNZWFuIFRpbWUKLSMgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MDAgICAgU3dpc3MgICBDRSVzVCAgIDE5ODEKLSMgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MDAgICAgRVUgICAgICBDRSVzVAotIyBkZXNjcmliZXMgYWxsIG9mIFN3aXR6ZXJsYW5kIGNvcnJlY3RseSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi0jIHRoZSBDYW50b25lIEdlbmV2ZSAoR2VuZXZhLCBHZW5mKS4gQmV0d2VlbiAxODQ4IGFuZCAxODk0IEdlbmV2ZSBkaWQgbm90Ci0jIGZvbGxvdyBCZXJuIE1lYW4gVGltZSBidXQga2VwdCBpdHMgb3duIGxvY2FsIG1lYW4gdGltZS4KLSMgVG8gcmVwcmVzZW50IHRoaXMsIGFuIGV4dHJhIHpvbmUgd291bGQgYmUgbmVlZGVkLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlTd2lzcwkxOTQxCTE5NDIJLQlNYXkJTW9uPj0xCTE6MDAJMTowMAlTCi1SdWxlCVN3aXNzCTE5NDEJMTk0MgktCU9jdAlNb24+PTEJMjowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJRXVyb3BlL1p1cmljaAkwOjM0OjA4IC0JTE1UCTE4NDggU2VwIDEyCi0JCQkwOjI5OjQ0CS0JQk1UCTE4OTQgSnVuICMgQmVybiBNZWFuIFRpbWUKLQkJCTE6MDAJU3dpc3MJQ0Ulc1QJMTk4MQotCQkJMTowMAlFVQlDRSVzVAotCi0jIFR1cmtleQotCi0jIEZyb20gQW1hciBEZXZlZ293ZGEgKDIwMDctMDEtMDMpOgotIyBUaGUgdGltZSB6b25lIHJ1bGVzIGZvciBJc3RhbmJ1bCwgVHVya2V5IGhhdmUgbm90IGJlZW4gY2hhbmdlZCBmb3IgeWVhcnMgbm93LgotIyAuLi4gVGhlIGxhdGVzdCBydWxlcyBhcmUgYXZhaWxhYmxlIGF0IC0KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vd29ybGRjbG9jay90aW1lem9uZS5odG1sP249MTA3Ci0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTAxLTAzKToKLSMgSSBoYXZlIGJlZW4gYWJsZSB0byBmaW5kIHByZXNzIHJlY29yZHMgYmFjayB0byAxOTk2IHdoaWNoIGFsbCBzYXkgdGhhdAotIyBEU1Qgc3RhcnRlZCAwMTowMCBsb2NhbCB0aW1lIGFuZCBlbmQgYXQgMDI6MDAgbG9jYWwgdGltZS4gIEkgYW0gbm90IHN1cmUKLSMgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhhdC4gIE9uZSBleGFtcGxlIGZvciBlYWNoIHllYXIgZnJvbSAxOTk2IHRvIDIwMDE6Ci0jIGh0dHA6Ly9uZXdzcG90LmJ5ZWdtLmdvdi50ci9hcnNpdi8xOTk2LzIxL040Lmh0bQotIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk3LzAzLzk3WDAzWDI1LlRYVAotIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk4LzAzLzk4WDAzWDAyLkhUTQotIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzk5LzEwLzk5WDEwWDI2LkhUTSMlMjAxNgotIyBodHRwOi8vd3d3LmJ5ZWdtLmdvdi50ci9ZQVlJTkxBUklNSVovQ0hSL0lORzIwMDAvMDMvMDBYMDNYMDYuSFRNIyUyMDIxCi0jIGh0dHA6Ly93d3cuYnllZ20uZ292LnRyL1lBWUlOTEFSSU1JWi9DSFIvSU5HMjAwMS8wMy8yM3gwM3gwMS5IVE0jJTIwMjcKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0wMS0wMyk6Ci0jIFByZWZlciB0aGUgYWJvdmUgc291cmNlIHRvIFNoYW5rcyAmIFBvdHRlbmdlciBmb3IgdGltZSBzdGFtcHMgYWZ0ZXIgMTk5MC4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNy0wMy0wOSk6Ci0jIFN0YXJ0aW5nIDIwMDcgdGhvdWdoLCBpdCBzZWVtcyB0aGF0IHRoZXkgYXJlIGFkb3B0aW5nIEVVJ3MgMTowMCBVVEMKLSMgc3RhcnQvZW5kIHRpbWUsIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHBhZ2UgKDIwMDctMDMtMDcpOgotIyBodHRwOi8vd3d3Lm50dm1zbmJjLmNvbS9uZXdzLzQwMjAyOS5hc3AKLSMgVGhlIG9mZmljaWFsIGRvY3VtZW50IGlzIGxvY2F0ZWQgaGVyZSAtIGl0IGlzIGluIFR1cmtpc2guLi46Ci0jIGh0dHA6Ly9yZWdhLmJhc2Jha2FubGlrLmdvdi50ci9lc2tpbGVyLzIwMDcvMDMvMjAwNzAzMDctNy5odG0KLSMgSSB3YXMgYWJsZSB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBzZWVtaW5nbHkgb2ZmaWNpYWwgZG9jdW1lbnQKLSMgKG9uIGEgbm9uLWdvdmVybm1lbnQgc2VydmVyIHRob3VnaCkgZGVzY3JpYmluZyBkYXRlcyBiZXR3ZWVuIDIwMDIgYW5kIDIwMDY6Ci0jIGh0dHA6Ly93d3cuYWxvbWFsaXllLmNvbS9ia2tfMjAwMl8zNzY5Lmh0bQotCi0jIEZyb20gU3VlIFdpbGxpYW1zICgyMDA4LTA4LTExKToKLSMgSSBzcG90dGVkIHRoaXMgbmV3cyBhcnRpY2xlIGFib3V0IGEgcG90ZW50aWFsIGNoYW5nZSBpbiBUdXJrZXkuCi0jCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaHVycml5ZXQuY29tLnRyL2VuZ2xpc2gvZG9tZXN0aWMvOTYyNjE3NC5hc3A/c2NyPTEiPgotIyBodHRwOi8vd3d3Lmh1cnJpeWV0LmNvbS50ci9lbmdsaXNoL2RvbWVzdGljLzk2MjYxNzQuYXNwP3Njcj0xCi0jIDwvYT4KLQotIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwOC0wOC0yMCk6Ci0jIFRoaXMgYXJ0aWNsZSBzYXlzIHRoYXQgYXJvdW5kIHRoZSBlbmQgb2YgTWFyY2ggMjAxMSwgVHVya2V5IHdhbnRzIHRvCi0jIGFkanVzdCB0aGUgY2xvY2tzIGZvcndhcmQgYnkgMS8yIGhvdXIgYW5kIHN0YXkgdGhhdCB3YXkgcGVybWFuZW50bHkuCi0jIFRoZSBhcnRpY2xlIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBjaGFuZ2UgaW4gdGltZXpvbmUgb2Zmc2V0IGluIGFkZGl0aW9uCi0jIHRvIHN0b3BwaW5nIG9ic2VydmFuY2Ugb2YgRFNULgotIyBUaGlzIHByb3Bvc2FsIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuCi0jCi0jIFJlYWQgbW9yZSBoZXJlLi4uCi0jCi0jIFR1cmtleSB0byBhYmFuZG9uIGRheWxpZ2h0IHNhdmluZyB0aW1lIGluIDIwMTEKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy50dXJraXNoZGFpbHluZXdzLmNvbS50ci9hcnRpY2xlLnBocD9lbmV3c2lkPTExMjk4OSI+Ci0jIGh0dHA6Ly93d3cudHVya2lzaGRhaWx5bmV3cy5jb20udHIvYXJ0aWNsZS5waHA/ZW5ld3NpZD0xMTI5ODkKLSMgPC9hPgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUdXJrZXkJMTkxNglvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTE2CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5MjAJb25seQktCU1hcgkyOAkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTkyMAlvbmx5CS0JT2N0CTI1CTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTIxCW9ubHkJLQlBcHIJIDMJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5MjEJb25seQktCU9jdAkgMwkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTkyMglvbmx5CS0JTWFyCTI2CTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTIyCW9ubHkJLQlPY3QJIDgJMDowMAkwCS0KLSMgV2hpdG1hbiBnaXZlcyAxOTIzIEFwciAyOCAtIFNlcCAxNiBhbmQgbm8gRFNUIGluIDE5MjQtMTkyNTsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVR1cmtleQkxOTI0CW9ubHkJLQlNYXkJMTMJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5MjQJMTkyNQktCU9jdAkgMQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTkyNQlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTQwCW9ubHkJLQlKdW4JMzAJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NDAJb25seQktCU9jdAkgNQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk0MAlvbmx5CS0JRGVjCSAxCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTQxCW9ubHkJLQlTZXAJMjEJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NDIJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJUwotIyBXaGl0bWFuIG9taXRzIHRoZSBuZXh0IHR3byB0cmFuc2l0aW9uIGFuZCBnaXZlcyAxOTQ1IE9jdCAxOwotIyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJVHVya2V5CTE5NDIJb25seQktCU5vdgkgMQkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk0NQlvbmx5CS0JQXByCSAyCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTQ1CW9ubHkJLQlPY3QJIDgJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NDYJb25seQktCUp1bgkgMQkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk0Nglvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTQ3CTE5NDgJLQlBcHIJU3VuPj0xNgkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk0NwkxOTUwCS0JT2N0CVN1bj49MgkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk0OQlvbmx5CS0JQXByCTEwCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTUwCW9ubHkJLQlBcHIJMTkJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NTEJb25seQktCUFwcgkyMgkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk1MQlvbmx5CS0JT2N0CSA4CTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTYyCW9ubHkJLQlKdWwJMTUJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NjIJb25seQktCU9jdAkgOAkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk2NAlvbmx5CS0JTWF5CTE1CTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTY0CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NzAJMTk3MgktCU1heQlTdW4+PTIJMDowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NzAJMTk3MgktCU9jdAlTdW4+PTIJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NzMJb25seQktCUp1bgkgMwkxOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk3Mwlvbmx5CS0JTm92CSA0CTM6MDAJMAktCi1SdWxlCVR1cmtleQkxOTc0CW9ubHkJLQlNYXIJMzEJMjowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NzQJb25seQktCU5vdgkgMwk1OjAwCTAJLQotUnVsZQlUdXJrZXkJMTk3NQlvbmx5CS0JTWFyCTMwCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTc1CTE5NzYJLQlPY3QJbGFzdFN1bgkwOjAwCTAJLQotUnVsZQlUdXJrZXkJMTk3Nglvbmx5CS0JSnVuCSAxCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTc3CTE5NzgJLQlBcHIJU3VuPj0xCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTc3CW9ubHkJLQlPY3QJMTYJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5NzkJMTk4MAktCUFwcglTdW4+PTEJMzowMAkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5NzkJMTk4MgktCU9jdAlNb24+PTExCTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTgxCTE5ODIJLQlNYXIJbGFzdFN1bgkzOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk4Mwlvbmx5CS0JSnVsCTMxCTA6MDAJMTowMAlTCi1SdWxlCVR1cmtleQkxOTgzCW9ubHkJLQlPY3QJIDIJMDowMAkwCS0KLVJ1bGUJVHVya2V5CTE5ODUJb25seQktCUFwcgkyMAkwOjAwCTE6MDAJUwotUnVsZQlUdXJrZXkJMTk4NQlvbmx5CS0JU2VwCTI4CTA6MDAJMAktCi1SdWxlCVR1cmtleQkxOTg2CTE5OTAJLQlNYXIJbGFzdFN1bgkyOjAwcwkxOjAwCVMKLVJ1bGUJVHVya2V5CTE5ODYJMTk5MAktCVNlcAlsYXN0U3VuCTI6MDBzCTAJLQotUnVsZQlUdXJrZXkJMTk5MQkyMDA2CS0JTWFyCWxhc3RTdW4JMTowMHMJMTowMAlTCi1SdWxlCVR1cmtleQkxOTkxCTE5OTUJLQlTZXAJbGFzdFN1bgkxOjAwcwkwCS0KLVJ1bGUJVHVya2V5CTE5OTYJMjAwNgktCU9jdAlsYXN0U3VuCTE6MDBzCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlFdXJvcGUvSXN0YW5idWwJMTo1NTo1MiAtCUxNVAkxODgwCi0JCQkxOjU2OjU2CS0JSU1UCTE5MTAgT2N0ICMgSXN0YW5idWwgTWVhbiBUaW1lPwotCQkJMjowMAlUdXJrZXkJRUUlc1QJMTk3OCBPY3QgMTUKLQkJCTM6MDAJVHVya2V5CVRSJXNUCTE5ODUgQXByIDIwICMgVHVya2V5IFRpbWUKLQkJCTI6MDAJVHVya2V5CUVFJXNUCTIwMDcKLQkJCTI6MDAJRVUJRUUlc1QKLUxpbmsJRXVyb3BlL0lzdGFuYnVsCUFzaWEvSXN0YW5idWwJIyBJc3RhbmJ1bCBpcyBpbiBib3RoIGNvbnRpbmVudHMuCi0KLSMgVWtyYWluZQotIwotIyBGcm9tIElnb3IgS2FycG92LCB3aG8gd29ya3MgZm9yIHRoZSBVa3JhbmlhbiBNaW5pc3RyeSBvZiBKdXN0aWNlLAotIyB2aWEgR2FycmV0dCBXb2xsbWFuICgyMDAzLTAxLTI3KToKLSMgQlRXLCBJJ3ZlIGZvdW5kIHRoZSBvZmZpY2lhbCBkb2N1bWVudCBvbiB0aGlzIG1hdHRlci4gSXQncyBnb3Zlcm1lbnQKLSMgcmVndWxhdGlvbnMgbnVtYmVyIDUwOSwgTWF5IDEzLCAxOTk2LiBJbiBteSBwb29yIHRyYW5zbGF0aW9uIGl0IHNheXM6Ci0jICJUaW1lIGluIFVrcmFpbmUgaXMgc2V0IHRvIHNlY29uZCB0aW1lem9uZSAoS2lldiB0aW1lKS4gRWFjaCBsYXN0IFN1bmRheQotIyBvZiBNYXJjaCBhdCAzYW0gdGhlIHRpbWUgaXMgY2hhbmdpbmcgdG8gNGFtIGFuZCBlYWNoIGxhc3QgU3VuZGF5IG9mCi0jIE9jdG9iZXIgdGhlIHRpbWUgYXQgNGFtIGlzIGNoYW5naW5nIHRvIDNhbSIKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIyBNb3N0IG9mIFVrcmFpbmUgc2luY2UgMTk3MCBoYXMgYmVlbiBsaWtlIEtpZXYuCi0jICJLeWl2IiBpcyB0aGUgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZSBVa3JhaW5pYW4gbmFtZSwgYnV0Ci0jICJLaWV2IiBpcyBtb3JlIGNvbW1vbiBpbiBFbmdsaXNoLgotWm9uZSBFdXJvcGUvS2lldgkyOjAyOjA0IC0JTE1UCTE4ODAKLQkJCTI6MDI6MDQJLQlLTVQJMTkyNCBNYXkgIDIgIyBLaWV2IE1lYW4gVGltZQotCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQotCQkJMzowMAktCU1TSwkxOTQxIFNlcCAyMAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE5vdiAgNgotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCi0JCQkzOjAwCS0JTVNLCTE5OTAgSnVsICAxIDI6MDAKLQkJCTI6MDAJLQlFRVQJMTk5MgotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1Ci0JCQkyOjAwCUVVCUVFJXNUCi0jIFJ1dGhlbmlhIHVzZWQgQ0VUIDE5OTAvMTk5MS4KLSMgIlV6aGhvcm9kIiBpcyB0aGUgdHJhbnNsaXRlcmF0aW9uIG9mIHRoZSBVa3JhaW5pYW4gbmFtZSwgYnV0Ci0jICJVemhnb3JvZCIgaXMgbW9yZSBjb21tb24gaW4gRW5nbGlzaC4KLVpvbmUgRXVyb3BlL1V6aGdvcm9kCTE6Mjk6MTIgLQlMTVQJMTg5MCBPY3QKLQkJCTE6MDAJLQlDRVQJMTk0MAotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQ0IE9jdAotCQkJMTowMAkxOjAwCUNFU1QJMTk0NCBPY3QgMjYKLQkJCTE6MDAJLQlDRVQJMTk0NSBKdW4gMjkKLQkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAotCQkJMzowMAktCU1TSwkxOTkwIEp1bCAgMSAyOjAwCi0JCQkxOjAwCS0JQ0VUCTE5OTEgTWFyIDMxIDM6MDAKLQkJCTI6MDAJLQlFRVQJMTk5MgotCQkJMjowMAlFLUV1cglFRSVzVAkxOTk1Ci0JCQkyOjAwCUVVCUVFJXNUCi0jIFphcG9yb3poJ3llIGFuZCBlYXN0ZXJuIEx1Z2Fuc2sgb2JsYXN0cyBvYnNlcnZlZCBEU1QgMTk5MC8xOTkxLgotIyAiWmFwb3JpemhpYSIgaXMgdGhlIHRyYW5zbGl0ZXJhdGlvbiBvZiB0aGUgVWtyYWluaWFuIG5hbWUsIGJ1dAotIyAiWmFwb3JvemgneWUiIGlzIG1vcmUgY29tbW9uIGluIEVuZ2xpc2guICBVc2UgdGhlIGNvbW1vbiBFbmdsaXNoCi0jIHNwZWxsaW5nLCBleGNlcHQgb21pdCB0aGUgYXBvc3Ryb3BoZSBhcyBpdCBpcyBub3QgYWxsb3dlZCBpbgotIyBwb3J0YWJsZSBQb3NpeCBmaWxlIG5hbWVzLgotWm9uZSBFdXJvcGUvWmFwb3Jvemh5ZQkyOjIwOjQwIC0JTE1UCTE4ODAKLQkJCTI6MjAJLQlDVVQJMTkyNCBNYXkgIDIgIyBDZW50cmFsIFVrcmFpbmUgVAotCQkJMjowMAktCUVFVAkxOTMwIEp1biAyMQotCQkJMzowMAktCU1TSwkxOTQxIEF1ZyAyNQotCQkJMTowMAlDLUV1cglDRSVzVAkxOTQzIE9jdCAyNQotCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAyOjAwCi0JCQkyOjAwCUUtRXVyCUVFJXNUCTE5OTUKLQkJCTI6MDAJRVUJRUUlc1QKLSMgQ2VudHJhbCBDcmltZWEgdXNlZCBNb3Njb3cgdGltZSAxOTk0LzE5OTcuCi1ab25lIEV1cm9wZS9TaW1mZXJvcG9sCTI6MTY6MjQgLQlMTVQJMTg4MAotCQkJMjoxNgktCVNNVAkxOTI0IE1heSAgMiAjIFNpbWZlcm9wb2wgTWVhbiBUCi0JCQkyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCi0JCQkzOjAwCS0JTVNLCTE5NDEgTm92Ci0JCQkxOjAwCUMtRXVyCUNFJXNUCTE5NDQgQXByIDEzCi0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTAKLQkJCTM6MDAJLQlNU0sJMTk5MCBKdWwgIDEgMjowMAotCQkJMjowMAktCUVFVAkxOTkyCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBUaGUgX0Vjb25vbWlzdF8gKDE5OTQtMDUtMjgsIHAgNDUpIHJlcG9ydHMgdGhhdCBjZW50cmFsIENyaW1lYSBzd2l0Y2hlZAotIyBmcm9tIEtpZXYgdG8gTW9zY293IHRpbWUgc29tZXRpbWUgYWZ0ZXIgdGhlIEphbnVhcnkgMTk5NCBlbGVjdGlvbnMuCi0jIFNoYW5rcyAoMTk5OSkgc2F5cyBgYGRhdGUgb2YgY2hhbmdlIHVuY2VydGFpbicnLCBidXQgaW1wbGllcyB0aGF0IGl0IGhhcHBlbmVkCi0jIHNvbWV0aW1lIGJldHdlZW4gdGhlIDE5OTQgRFNUIHN3aXRjaGVzLiAgU2hhbmtzICYgUG90dGVuZ2VyIHNpbXBseSBzYXkKLSMgMTk5NC0wOS0yNSAwMzowMCwgYnV0IHRoYXQgY2FuJ3QgYmUgcmlnaHQuICBGb3Igbm93LCBndWVzcyBpdAotIyBjaGFuZ2VkIGluIE1heS4KLQkJCTI6MDAJRS1FdXIJRUUlc1QJMTk5NCBNYXkKLSMgRnJvbSBJQVRBIFNTSU0gKDE5OTQvMTk5NyksIHdoaWNoIGFsc28gc2F5cyB0aGF0IEtlcmNoIGlzIHN0aWxsIGxpa2UgS2lldi4KLQkJCTM6MDAJRS1FdXIJTVNLL01TRAkxOTk2IE1hciAzMSAzOjAwcwotCQkJMzowMAkxOjAwCU1TRAkxOTk2IE9jdCAyNyAzOjAwcwotIyBJQVRBIFNTSU0gKDE5OTctMDkpIHNheXMgQ3JpbWVhIHN3aXRjaGVkIHRvIEVFVC9FRVNULgotIyBBc3N1bWUgaXQgaGFwcGVuZWQgaW4gTWFyY2ggYnkgbm90IGNoYW5naW5nIHRoZSBjbG9ja3MuCi0JCQkzOjAwCVJ1c3NpYQlNU0svTVNECTE5OTcKLQkJCTM6MDAJLQlNU0sJMTk5NyBNYXIgbGFzdFN1biAxOjAwdQotCQkJMjowMAlFVQlFRSVzVAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgT25lIHNvdXJjZSBzaG93cyB0aGF0IEJ1bGdhcmlhLCBDeXBydXMsIEZpbmxhbmQsIGFuZCBHcmVlY2Ugb2JzZXJ2ZSBEU1QgZnJvbQotIyB0aGUgbGFzdCBTdW5kYXkgaW4gTWFyY2ggdG8gdGhlIGxhc3QgU3VuZGF5IGluIFNlcHRlbWJlciBpbiAxOTg2LgotIyBUaGUgc291cmNlIHNob3dzIFJvbWFuaWEgY2hhbmdpbmcgYSBkYXkgbGF0ZXIgdGhhbiBldmVyeWJvZHkgZWxzZS4KLSMKLSMgQWNjb3JkaW5nIHRvIEJlcm5hcmQgU2llbG9mZidzIHNvdXJjZSwgUG9sYW5kIGlzIGluIHRoZSBNRVQgdGltZSB6b25lIGJ1dAotIyB1c2VzIHRoZSBXRSBEU1QgcnVsZXMuICBUaGUgV2VzdGVybiBVU1NSIHVzZXMgRUVUKzEgYW5kIE1FIERTVCBydWxlcy4KLSMgQmVybmFyZCBTaWVsb2ZmJ3Mgc291cmNlIGNsYWltcyBSb21hbmlhIHN3aXRjaGVzIG9uIHRoZSBzYW1lIGRheSwgYnV0IGF0Ci0jIDAwOjAwIHN0YW5kYXJkIHRpbWUgKGkuZS4sIDAxOjAwIERTVCkuICBJdCBhbHNvIGNsYWltcyB0aGF0IFR1cmtleQotIyBzd2l0Y2hlcyBvbiB0aGUgc2FtZSBkYXksIGJ1dCBzd2l0Y2hlcyBvbiBhdCAwMTowMCBzdGFuZGFyZCB0aW1lCi0jIGFuZCBvZmYgYXQgMDA6MDAgc3RhbmRhcmQgdGltZSAoaS5lLiwgMDE6MDAgRFNUKQotCi0jIC4uLgotIyBEYXRlOiBXZWQsIDI4IEphbiA4NyAxNjo1NjoyNyAtMDEwMAotIyBGcm9tOiBUb20gSG9mbWFubgotIyAuLi4KLSMKLSMgLi4udGhlIEV1cm9wZWFuIHRpbWUgcnVsZXMgYXJlLi4uc3RhbmRhcmRpemVkIHNpbmNlIDE5ODEsIHdoZW4KLSMgbW9zdCBFdXJvcGVhbiBjb3VuW3RyXWllcyBzdGFydGVkIERTVC4gIEJlZm9yZSB0aGF0IHllYXIsIG9ubHkKLSMgYSBmZXcgY291bnRyaWVzIChVSywgRnJhbmNlLCBJdGFseSkgaGFkIERTVCwgZWFjaCBhY2NvcmRpbmcKLSMgdG8gb3duIG5hdGlvbmFsIHJ1bGVzLiAgSW4gMTk4MSwgaG93ZXZlciwgRFNUIHN0YXJ0ZWQgb24KLSMgJ0FwciBmaXJzdFN1bicsIGFuZCBub3Qgb24gJ01hciBsYXN0U3VuJyBhcyBpbiB0aGUgZm9sbG93aW5nCi0jIHllYXJzLi4uCi0jIEJ1dCBhbHNvIHNpbmNlIDE5ODEgdGhlcmUgYXJlIHNvbWUgbW9yZSBuYXRpb25hbCBleGNlcHRpb25zCi0jIHRoYW4gbGlzdGVkIGluICdldXJvcGUnOiBTd2l0emVybGFuZCwgZm9yIGV4YW1wbGUsIGpvaW5lZCBEU1QKLSMgb25lIHllYXIgbGF0ZXIsIERlbm1hcmsgZW5kZWQgRFNUIG9uICdPY3QgMScgaW5zdGVhZCBvZiAnU2VwCi0jIGxhc3RTdW4nIGluIDE5ODEtLS1JIGRvbid0IGtub3cgaG93IHRoZXkgaGFuZGxlIG5vdy4KLSMKLSMgRmluYWxseSwgRFNUIGlzdCBhbHdheXMgZnJvbSAnQXByIDEnIHRvICdPY3QgMScgaW4gdGhlCi0jIFNvdmlldCBVbmlvbiAoYXMgZmFyIGFzIEkga25vdykuCi0jCi0jIFRvbSBIb2ZtYW5uLCBTY2llbnRpZmljIENvbXB1dGVyIENlbnRlciwgQ0lCQS1HRUlHWSBBRywKLSMgNDAwMiBCYXNsZSwgU3dpdHplcmxhbmQKLSMgLi4uCi0KLSMgLi4uCi0jIERhdGU6IFdlZCwgNCBGZWIgODcgMjI6MzU6MjIgKzAxMDAKLSMgRnJvbTogRGlrIFQuIFdpbnRlcgotIyAuLi4KLSMKLSMgVGhlIGluZm9ybWF0aW9uIGZyb20gVG9tIEhvZm1hbm4gaXMgKGFzIGZhciBhcyBJIGtub3cpIG5vdCBlbnRpcmVseSBjb3JyZWN0LgotIyBBZnRlciBhIHJlcXVlc3QgZnJvbSBjaG9uZ28gYXQgYW1kYWhsIEkgdHJpZWQgdG8gcmV0cmlldmUgYWxsIGluZm9ybWF0aW9uCi0jIGFib3V0IERTVCBpbiBFdXJvcGUuICBJIHdhcyBhYmxlIHRvIGZpbmQgYWxsIGZyb20gYWJvdXQgMTk2OS4KLSMKLSMgLi4uc3RhbmRhcmRpemF0aW9uIG9uIERTVCBpbiBFdXJvcGUgc3RhcnRlZCBpbiBhYm91dCAxOTc3IHdpdGggc3dpdGNoZXMgb24KLSMgZmlyc3QgU3VuZGF5IGluIEFwcmlsIGFuZCBsYXN0IFN1bmRheSBpbiBTZXB0ZW1iZXIuLi4KLSMgSW4gMTk4MSBVSyBqb2luZWQgRXVyb3BlIGluc29mYXIgdGhhdAotIyB0aGUgc3RhcnRpbmcgZGF5IGZvciBib3RoIHNoaWZ0ZWQgdG8gbGFzdCBTdW5kYXkgaW4gTWFyY2guICBBbmQgZnJvbSAxOTgyCi0jIHRoZSB3aG9sZSBvZiBFdXJvcGUgdXNlZCBEU1QsIHdpdGggc3dpdGNoIGRhdGVzIEFwcmlsIDEgYW5kIE9jdG9iZXIgMSBpbgotIyB0aGUgU292W2ldZXQgVW5pb24uICBJbiAxOTg1IHRoZSBTVSByZXZlcnRlZCB0byBzdGFuZGFyZCBFdXJvcGVbYV1uIHN3aXRjaAotIyBkYXRlcy4uLgotIwotIyBJdCBzaG91bGQgYWxzbyBiZSByZW1lbWJlcmVkIHRoYXQgdGltZS16b25lcyBhcmUgbm90IGNvbnN0YW50czsgZS5nLgotIyBQb3J0dWdhbCBzd2l0Y2hlZCBpbiAxOTc2IGZyb20gTUVUIChvciBDRVQpIHRvIFdFVCB3aXRoIERTVC4uLgotIyBOb3RlIGFsc28gdGhhdCB0aG91Z2ggdGhlcmUgd2VyZSBydWxlcyBmb3Igc3dpdGNoIGRhdGVzIG5vdAotIyBhbGwgY291bnRyaWVzIGFiaWRlZCB0byB0aGVzZSBkYXRlcywgYW5kIG1hbnkgaW5kaXZpZHVhbCBkZXZpYXRpb25zCi0jIG9jY3VycmVkLCB0aG91Z2ggbm90IHNpbmNlIDE5ODIgSSBiZWxpZXZlLiAgQW5vdGhlciBub3RlOiBpdCBpcyBhbHdheXMKLSMgYXNzdW1lZCB0aGF0IERTVCBpcyAxIGhvdXIgYWhlYWQgb2Ygbm9ybWFsIHRpbWUsIHRoaXMgbmVlZCBub3QgYmUgdGhlCi0jIGNhc2U7IGF0IGxlYXN0IGluIHRoZSBOZXRoZXJsYW5kcyB0aGVyZSBoYXZlIGJlZW4gdGltZXMgd2hlbiBEU1Qgd2FzIDIgaG91cnMKLSMgaW4gYWR2YW5jZSBvZiBub3JtYWwgdGltZS4KLSMKLSMgLi4uCi0jIGRpayB0LiB3aW50ZXIsIGN3aSwgYW1zdGVyZGFtLCBuZWRlcmxhbmQKLSMgLi4uCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgLi4uCi0jIEdyZWVjZTogTGFzdCBTdW5kYXkgaW4gQXByaWwgdG8gbGFzdCBTdW5kYXkgaW4gU2VwdGVtYmVyIChpZmZ5IG9uIGRhdGVzKS4KLSMgU2luY2UgMTk3OC4gIENoYW5nZSBhdCBtaWRuaWdodC4KLSMgLi4uCi0jIE1vbmFjbzogaGFzIHNhbWUgRFNUIGFzIEZyYW5jZS4KLSMgLi4uCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9mYWN0b3J5IGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvZmFjdG9yeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0Y2NjMC4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway9mYWN0b3J5CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyA8cHJlPgotIyBAKCMpZmFjdG9yeQk4LjIKLSMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKLSMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCi0KLSMgRm9yIGNvbXBhbmllcyB3aG8gZG9uJ3Qgd2FudCB0byBwdXQgdGltZSB6b25lIHNwZWNpZmljYXRpb24gaW4KLSMgdGhlaXIgaW5zdGFsbGF0aW9uIHByb2NlZHVyZXMuICBXaGVuIHVzZXJzIHJ1biBkYXRlLCB0aGV5J2xsIGdldCB0aGUgbWVzc2FnZS4KLSMgQWxzbyB1c2VmdWwgZm9yIHRoZSAiY29tcC5zb3VyY2VzIiB2ZXJzaW9uLgotCi0jIFpvbmUJTkFNRQlHTVRPRkYJUlVMRVMJRk9STUFUCi1ab25lCUZhY3RvcnkJMAktICJMb2NhbCB0aW1lIHpvbmUgbXVzdCBiZSBzZXQtLXNlZSB6aWMgbWFudWFsIHBhZ2UiCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9pc28zMTY2LnRhYiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2lzbzMxNjYudGFiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGEyNTkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL2lzbzMxNjYudGFiCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKWlzbzMxNjYudGFiCTguNgotIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgotIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KLSMgSVNPIDMxNjYgYWxwaGEtMiBjb3VudHJ5IGNvZGVzCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDktMjcpOgotIwotIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29sdW1uczoKLSMgMS4gIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUsIGN1cnJlbnQgYXMgb2YKLSMgICAgIElTTyAzMTY2LTEgTmV3c2xldHRlciBWSS0xICgyMDA3LTA5LTIxKS4gIFNlZToKLSMgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaXNvLm9yZy9pc28vZW4vcHJvZHMtc2VydmljZXMvaXNvMzE2Nm1hL2luZGV4Lmh0bWwiPgotIyAgICAgSVNPIDMxNjYgTWFpbnRlbmFuY2UgYWdlbmN5IChJU08gMzE2Ni9NQSkKLSMgICAgIDwvYT4uCi0jIDIuICBUaGUgdXN1YWwgRW5nbGlzaCBuYW1lIGZvciB0aGUgY291bnRyeSwKLSMgICAgIGNob3NlbiBzbyB0aGF0IGFscGhhYmV0aWMgc29ydGluZyBvZiBzdWJzZXRzIHByb2R1Y2VzIGhlbHBmdWwgbGlzdHMuCi0jICAgICBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgRW5nbGlzaCBuYW1lIGluIHRoZSBJU08gMzE2NiB0YWJsZXMuCi0jCi0jIENvbHVtbnMgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSB0YWIuCi0jIFRoZSB0YWJsZSBpcyBzb3J0ZWQgYnkgY291bnRyeSBjb2RlLgotIwotIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgIycgYXJlIGNvbW1lbnRzLgotIwotI2NvdW50cnktCi0jY29kZQljb3VudHJ5IG5hbWUKLUFECUFuZG9ycmEKLUFFCVVuaXRlZCBBcmFiIEVtaXJhdGVzCi1BRglBZmdoYW5pc3RhbgotQUcJQW50aWd1YSAmIEJhcmJ1ZGEKLUFJCUFuZ3VpbGxhCi1BTAlBbGJhbmlhCi1BTQlBcm1lbmlhCi1BTglOZXRoZXJsYW5kcyBBbnRpbGxlcwotQU8JQW5nb2xhCi1BUQlBbnRhcmN0aWNhCi1BUglBcmdlbnRpbmEKLUFTCVNhbW9hIChBbWVyaWNhbikKLUFUCUF1c3RyaWEKLUFVCUF1c3RyYWxpYQotQVcJQXJ1YmEKLUFYCUFhbGFuZCBJc2xhbmRzCi1BWglBemVyYmFpamFuCi1CQQlCb3NuaWEgJiBIZXJ6ZWdvdmluYQotQkIJQmFyYmFkb3MKLUJECUJhbmdsYWRlc2gKLUJFCUJlbGdpdW0KLUJGCUJ1cmtpbmEgRmFzbwotQkcJQnVsZ2FyaWEKLUJICUJhaHJhaW4KLUJJCUJ1cnVuZGkKLUJKCUJlbmluCi1CTAlTdCBCYXJ0aGVsZW15Ci1CTQlCZXJtdWRhCi1CTglCcnVuZWkKLUJPCUJvbGl2aWEKLUJSCUJyYXppbAotQlMJQmFoYW1hcwotQlQJQmh1dGFuCi1CVglCb3V2ZXQgSXNsYW5kCi1CVwlCb3Rzd2FuYQotQlkJQmVsYXJ1cwotQloJQmVsaXplCi1DQQlDYW5hZGEKLUNDCUNvY29zIChLZWVsaW5nKSBJc2xhbmRzCi1DRAlDb25nbyAoRGVtLiBSZXAuKQotQ0YJQ2VudHJhbCBBZnJpY2FuIFJlcC4KLUNHCUNvbmdvIChSZXAuKQotQ0gJU3dpdHplcmxhbmQKLUNJCUNvdGUgZCdJdm9pcmUKLUNLCUNvb2sgSXNsYW5kcwotQ0wJQ2hpbGUKLUNNCUNhbWVyb29uCi1DTglDaGluYQotQ08JQ29sb21iaWEKLUNSCUNvc3RhIFJpY2EKLUNVCUN1YmEKLUNWCUNhcGUgVmVyZGUKLUNYCUNocmlzdG1hcyBJc2xhbmQKLUNZCUN5cHJ1cwotQ1oJQ3plY2ggUmVwdWJsaWMKLURFCUdlcm1hbnkKLURKCURqaWJvdXRpCi1ESwlEZW5tYXJrCi1ETQlEb21pbmljYQotRE8JRG9taW5pY2FuIFJlcHVibGljCi1EWglBbGdlcmlhCi1FQwlFY3VhZG9yCi1FRQlFc3RvbmlhCi1FRwlFZ3lwdAotRUgJV2VzdGVybiBTYWhhcmEKLUVSCUVyaXRyZWEKLUVTCVNwYWluCi1FVAlFdGhpb3BpYQotRkkJRmlubGFuZAotRkoJRmlqaQotRksJRmFsa2xhbmQgSXNsYW5kcwotRk0JTWljcm9uZXNpYQotRk8JRmFyb2UgSXNsYW5kcwotRlIJRnJhbmNlCi1HQQlHYWJvbgotR0IJQnJpdGFpbiAoVUspCi1HRAlHcmVuYWRhCi1HRQlHZW9yZ2lhCi1HRglGcmVuY2ggR3VpYW5hCi1HRwlHdWVybnNleQotR0gJR2hhbmEKLUdJCUdpYnJhbHRhcgotR0wJR3JlZW5sYW5kCi1HTQlHYW1iaWEKLUdOCUd1aW5lYQotR1AJR3VhZGVsb3VwZQotR1EJRXF1YXRvcmlhbCBHdWluZWEKLUdSCUdyZWVjZQotR1MJU291dGggR2VvcmdpYSAmIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzCi1HVAlHdWF0ZW1hbGEKLUdVCUd1YW0KLUdXCUd1aW5lYS1CaXNzYXUKLUdZCUd1eWFuYQotSEsJSG9uZyBLb25nCi1ITQlIZWFyZCBJc2xhbmQgJiBNY0RvbmFsZCBJc2xhbmRzCi1ITglIb25kdXJhcwotSFIJQ3JvYXRpYQotSFQJSGFpdGkKLUhVCUh1bmdhcnkKLUlECUluZG9uZXNpYQotSUUJSXJlbGFuZAotSUwJSXNyYWVsCi1JTQlJc2xlIG9mIE1hbgotSU4JSW5kaWEKLUlPCUJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeQotSVEJSXJhcQotSVIJSXJhbgotSVMJSWNlbGFuZAotSVQJSXRhbHkKLUpFCUplcnNleQotSk0JSmFtYWljYQotSk8JSm9yZGFuCi1KUAlKYXBhbgotS0UJS2VueWEKLUtHCUt5cmd5enN0YW4KLUtICUNhbWJvZGlhCi1LSQlLaXJpYmF0aQotS00JQ29tb3JvcwotS04JU3QgS2l0dHMgJiBOZXZpcwotS1AJS29yZWEgKE5vcnRoKQotS1IJS29yZWEgKFNvdXRoKQotS1cJS3V3YWl0Ci1LWQlDYXltYW4gSXNsYW5kcwotS1oJS2F6YWtoc3RhbgotTEEJTGFvcwotTEIJTGViYW5vbgotTEMJU3QgTHVjaWEKLUxJCUxpZWNodGVuc3RlaW4KLUxLCVNyaSBMYW5rYQotTFIJTGliZXJpYQotTFMJTGVzb3RobwotTFQJTGl0aHVhbmlhCi1MVQlMdXhlbWJvdXJnCi1MVglMYXR2aWEKLUxZCUxpYnlhCi1NQQlNb3JvY2NvCi1NQwlNb25hY28KLU1ECU1vbGRvdmEKLU1FCU1vbnRlbmVncm8KLU1GCVN0IE1hcnRpbiAoRnJlbmNoIHBhcnQpCi1NRwlNYWRhZ2FzY2FyCi1NSAlNYXJzaGFsbCBJc2xhbmRzCi1NSwlNYWNlZG9uaWEKLU1MCU1hbGkKLU1NCU15YW5tYXIgKEJ1cm1hKQotTU4JTW9uZ29saWEKLU1PCU1hY2F1Ci1NUAlOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMKLU1RCU1hcnRpbmlxdWUKLU1SCU1hdXJpdGFuaWEKLU1TCU1vbnRzZXJyYXQKLU1UCU1hbHRhCi1NVQlNYXVyaXRpdXMKLU1WCU1hbGRpdmVzCi1NVwlNYWxhd2kKLU1YCU1leGljbwotTVkJTWFsYXlzaWEKLU1aCU1vemFtYmlxdWUKLU5BCU5hbWliaWEKLU5DCU5ldyBDYWxlZG9uaWEKLU5FCU5pZ2VyCi1ORglOb3Jmb2xrIElzbGFuZAotTkcJTmlnZXJpYQotTkkJTmljYXJhZ3VhCi1OTAlOZXRoZXJsYW5kcwotTk8JTm9yd2F5Ci1OUAlOZXBhbAotTlIJTmF1cnUKLU5VCU5pdWUKLU5aCU5ldyBaZWFsYW5kCi1PTQlPbWFuCi1QQQlQYW5hbWEKLVBFCVBlcnUKLVBGCUZyZW5jaCBQb2x5bmVzaWEKLVBHCVBhcHVhIE5ldyBHdWluZWEKLVBICVBoaWxpcHBpbmVzCi1QSwlQYWtpc3RhbgotUEwJUG9sYW5kCi1QTQlTdCBQaWVycmUgJiBNaXF1ZWxvbgotUE4JUGl0Y2Fpcm4KLVBSCVB1ZXJ0byBSaWNvCi1QUwlQYWxlc3RpbmUKLVBUCVBvcnR1Z2FsCi1QVwlQYWxhdQotUFkJUGFyYWd1YXkKLVFBCVFhdGFyCi1SRQlSZXVuaW9uCi1STwlSb21hbmlhCi1SUwlTZXJiaWEKLVJVCVJ1c3NpYQotUlcJUndhbmRhCi1TQQlTYXVkaSBBcmFiaWEKLVNCCVNvbG9tb24gSXNsYW5kcwotU0MJU2V5Y2hlbGxlcwotU0QJU3VkYW4KLVNFCVN3ZWRlbgotU0cJU2luZ2Fwb3JlCi1TSAlTdCBIZWxlbmEKLVNJCVNsb3ZlbmlhCi1TSglTdmFsYmFyZCAmIEphbiBNYXllbgotU0sJU2xvdmFraWEKLVNMCVNpZXJyYSBMZW9uZQotU00JU2FuIE1hcmlubwotU04JU2VuZWdhbAotU08JU29tYWxpYQotU1IJU3VyaW5hbWUKLVNUCVNhbyBUb21lICYgUHJpbmNpcGUKLVNWCUVsIFNhbHZhZG9yCi1TWQlTeXJpYQotU1oJU3dhemlsYW5kCi1UQwlUdXJrcyAmIENhaWNvcyBJcwotVEQJQ2hhZAotVEYJRnJlbmNoIFNvdXRoZXJuICYgQW50YXJjdGljIExhbmRzCi1URwlUb2dvCi1USAlUaGFpbGFuZAotVEoJVGFqaWtpc3RhbgotVEsJVG9rZWxhdQotVEwJRWFzdCBUaW1vcgotVE0JVHVya21lbmlzdGFuCi1UTglUdW5pc2lhCi1UTwlUb25nYQotVFIJVHVya2V5Ci1UVAlUcmluaWRhZCAmIFRvYmFnbwotVFYJVHV2YWx1Ci1UVwlUYWl3YW4KLVRaCVRhbnphbmlhCi1VQQlVa3JhaW5lCi1VRwlVZ2FuZGEKLVVNCVVTIG1pbm9yIG91dGx5aW5nIGlzbGFuZHMKLVVTCVVuaXRlZCBTdGF0ZXMKLVVZCVVydWd1YXkKLVVaCVV6YmVraXN0YW4KLVZBCVZhdGljYW4gQ2l0eQotVkMJU3QgVmluY2VudAotVkUJVmVuZXp1ZWxhCi1WRwlWaXJnaW4gSXNsYW5kcyAoVUspCi1WSQlWaXJnaW4gSXNsYW5kcyAoVVMpCi1WTglWaWV0bmFtCi1WVQlWYW51YXR1Ci1XRglXYWxsaXMgJiBGdXR1bmEKLVdTCVNhbW9hICh3ZXN0ZXJuKQotWUUJWWVtZW4KLVlUCU1heW90dGUKLVpBCVNvdXRoIEFmcmljYQotWk0JWmFtYmlhCi1aVwlaaW1iYWJ3ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvbGVhcHNlY29uZHMgYi90b29scy96b25laW5mby90emRhdGEyMDEway9sZWFwc2Vjb25kcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwMTg1Yy4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway9sZWFwc2Vjb25kcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKWxlYXBzZWNvbmRzCTguMTAKLSMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKLSMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCi0KLSMgQWxsb3dhbmNlIGZvciBsZWFwc2Vjb25kcyBhZGRlZCB0byBlYWNoIHRpbWV6b25lIGZpbGUuCi0KLSMgVGhlIEludGVybmF0aW9uYWwgRWFydGggUm90YXRpb24gU2VydmljZSBwZXJpb2RpY2FsbHkgdXNlcyBsZWFwIHNlY29uZHMKLSMgdG8ga2VlcCBVVEMgdG8gd2l0aGluIDAuOSBzIG9mIFVUMQotIyAod2hpY2ggbWVhc3VyZXMgdGhlIHRydWUgYW5ndWxhciBvcmllbnRhdGlvbiBvZiB0aGUgZWFydGggaW4gc3BhY2UpOyBzZWUKLSMgVGVycnkgSiBRdWlubiwgVGhlIEJJUE0gYW5kIHRoZSBhY2N1cmF0ZSBtZWFzdXJlIG9mIHRpbWUsCi0jIFByb2MgSUVFRSA3OSwgNyAoSnVseSAxOTkxKSwgODk0LTkwNS4KLSMgVGhlcmUgd2VyZSBubyBsZWFwIHNlY29uZHMgYmVmb3JlIDE5NzIsIGJlY2F1c2UgdGhlIG9mZmljaWFsIG1lY2hhbmlzbQotIyBhY2NvdW50aW5nIGZvciB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiBhdG9taWMgdGltZSBhbmQgdGhlIGVhcnRoJ3Mgcm90YXRpb24KLSMgZGlkIG5vdCBleGlzdCB1bnRpbCB0aGUgZWFybHkgMTk3MHMuCi0KLSMgVGhlIGNvcnJlY3Rpb24gKCsgb3IgLSkgaXMgbWFkZSBhdCB0aGUgZ2l2ZW4gdGltZSwgc28gbGluZXMKLSMgd2lsbCB0eXBpY2FsbHkgbG9vayBsaWtlOgotIwlMZWFwCVlFQVIJTU9OCURBWQkyMzo1OTo2MAkrCVIvUwotIyBvcgotIwlMZWFwCVlFQVIJTU9OCURBWQkyMzo1OTo1OQktCVIvUwotCi0jIElmIHRoZSBsZWFwc2Vjb25kIGlzIFJvbGxpbmcgKFIpIHRoZSBnaXZlbiB0aW1lIGlzIGxvY2FsIHRpbWUKLSMgSWYgdGhlIGxlYXBzZWNvbmQgaXMgU3RhdGlvbmFyeSAoUykgdGhlIGdpdmVuIHRpbWUgaXMgVVRDCi0KLSMgTGVhcAlZRUFSCU1PTlRICURBWQlISDpNTTpTUwlDT1JSCVIvUwotTGVhcAkxOTcyCUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3MglEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5NzMJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTc0CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3NQlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5NzYJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTc3CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk3OAlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5NzkJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTgxCUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk4MglKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTE5ODMJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTg1CUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk4NwlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5ODkJRGVjCTMxCTIzOjU5OjYwCSsJUwotTGVhcAkxOTkwCURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMTk5MglKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTE5OTMJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTk0CUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMTk5NQlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTE5OTcJSnVuCTMwCTIzOjU5OjYwCSsJUwotTGVhcAkxOTk4CURlYwkzMQkyMzo1OTo2MAkrCVMKLUxlYXAJMjAwNQlEZWMJMzEJMjM6NTk6NjAJKwlTCi1MZWFwCTIwMDgJRGVjCTMxCTIzOjU5OjYwCSsJUwotCi0jIElOVEVSTkFUSU9OQUwgRUFSVEggUk9UQVRJT04gQU5EIFJFRkVSRU5DRSBTWVNURU1TIFNFUlZJQ0UgKElFUlMpCi0jCi0jIFNFUlZJQ0UgSU5URVJOQVRJT05BTCBERSBMQSBST1RBVElPTiBURVJSRVNUUkUgRVQgREVTIFNZU1RFTUVTIERFIFJFRkVSRU5DRQotIwotIyBTRVJWSUNFIERFIExBIFJPVEFUSU9OIFRFUlJFU1RSRQotIyBPQlNFUlZBVE9JUkUgREUgUEFSSVMKLSMgNjEsIEF2LiBkZSBsJ09ic2VydmF0b2lyZSA3NTAxNCBQQVJJUyAoRnJhbmNlKQotIyBUZWwuICAgICAgOiAzMyAoMCkgMSA0MCA1MSAyMiAyNgotIyBGQVggICAgICAgOiAzMyAoMCkgMSA0MCA1MSAyMiA5MQotIyBJbnRlcm5ldCAgOiBzZXJ2aWNlcy5pZXJzQG9ic3BtLmZyCi0jCi0jIFBhcmlzLCAxNCBKdWx5IDIwMTAKLSMKLSMgQnVsbGV0aW4gQyA0MAotIwotIyBUbyBhdXRob3JpdGllcyByZXNwb25zaWJsZQotIyBmb3IgdGhlIG1lYXN1cmVtZW50IGFuZAotIyBkaXN0cmlidXRpb24gb2YgdGltZQotIwotIyBJTkZPUk1BVElPTiBPTiBVVEMgLSBUQUkKLSMKLSMgTk8gcG9zaXRpdmUgbGVhcCBzZWNvbmQgd2lsbCBiZSBpbnRyb2R1Y2VkIGF0IHRoZSBlbmQgb2YgRGVjZW1iZXIgMjAxMC4KLSMgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSBVVEMgYW5kIHRoZQotIyBJbnRlcm5hdGlvbmFsIEF0b21pYyBUaW1lIFRBSSBpcyA6Ci0jCi0jIGZyb20gMjAwOSBKYW51YXJ5IDEsIDBoIFVUQywgdW50aWwgZnVydGhlciBub3RpY2UgOiBVVEMtVEFJID0gLTM0IHMKLSMKLSMgTGVhcCBzZWNvbmRzIGNhbiBiZSBpbnRyb2R1Y2VkIGluIFVUQyBhdCB0aGUgZW5kIG9mIHRoZSBtb250aHMgb2YgRGVjZW1iZXIKLSMgb3IgSnVuZSwgIGRlcGVuZGluZyBvbiB0aGUgZXZvbHV0aW9uIG9mIFVUMS1UQUkuIEJ1bGxldGluIEMgaXMgbWFpbGVkIGV2ZXJ5Ci0jIHNpeCBtb250aHMsIGVpdGhlciB0byBhbm5vdW5jZSBhIHRpbWUgc3RlcCBpbiBVVEMsIG9yIHRvIGNvbmZpcm0gdGhhdCB0aGVyZQotIyB3aWxsIGJlIG5vIHRpbWUgc3RlcCBhdCB0aGUgbmV4dCBwb3NzaWJsZSBkYXRlLgotIwotIyBEYW5pZWwgR0FNQklTCi0jIERpcmVjdG9yCi0jIEVhcnRoIE9yaWVudGF0aW9uIENlbnRlciBvZiBJRVJTCi0jIE9ic2VydmF0b2lyZSBkZSBQYXJpcywgRnJhbmNlCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9ub3J0aGFtZXJpY2EgYi90b29scy96b25laW5mby90emRhdGEyMDEway9ub3J0aGFtZXJpY2EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmQwNjQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvbm9ydGhhbWVyaWNhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5NyArMCwwIEBACi0jIDxwcmU+Ci0jIEAoIylub3J0aGFtZXJpY2EJOC4zNAotIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgotIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KLQotIyBhbHNvIGluY2x1ZGVzIENlbnRyYWwgQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTAzLTIyKToKLSMgQSByZWxpYWJsZSBhbmQgZW50ZXJ0YWluaW5nIHNvdXJjZSBhYm91dCB0aW1lIHpvbmVzIGlzCi0jIERlcmVrIEhvd3NlLCBHcmVlbndpY2ggdGltZSBhbmQgbG9uZ2l0dWRlLCBQaGlsaXAgV2lsc29uIFB1Ymxpc2hlcnMgKDE5OTcpLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVW5pdGVkIFN0YXRlcwotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMzEpOgotIyBIb3dzZSB3cml0ZXMgKHBwIDEyMS0xMjUpIHRoYXQgdGltZSB6b25lcyB3ZXJlIGludmVudGVkIGJ5Ci0jIFByb2Zlc3NvciBDaGFybGVzIEZlcmRpbmFuZCBEb3dkICgxODI1LTE5MDQpLAotIyBQcmluY2lwYWwgb2YgVGVtcGxlIEdyb3ZlIExhZGllcycgU2VtaW5hcnkgKFNhcmF0b2dhIFNwcmluZ3MsIE5ZKS4KLSMgSGlzIHBhbXBobGV0IGBgQSBTeXN0ZW0gb2YgTmF0aW9uYWwgVGltZSBmb3IgUmFpbHJvYWRzJycgKDE4NzApCi0jIHdhcyB0aGUgcmVzdWx0IG9mIGhpcyBwcm9wb3NhbHMgYXQgdGhlIENvbnZlbnRpb24gb2YgUmFpbHJvYWQgVHJ1bmsgTGluZXMKLSMgaW4gTmV3IFlvcmsgQ2l0eSAoMTg2OS0xMCkuICBIaXMgMTg3MCBwcm9wb3NhbCB3YXMgYmFzZWQgb24gV2FzaGluZ3RvbiwgREMsCi0jIGJ1dCBpbiAxODcyLTA1IGhlIG1vdmVkIHRoZSBwcm9wb3NlZCBvcmlnaW4gdG8gR3JlZW53aWNoLgotIyBIaXMgcHJvcG9zYWwgd2FzIGFkb3B0ZWQgYnkgdGhlIHJhaWxyb2FkcyBvbiAxODgzLTExLTE4IGF0IDEyOjAwLAotIyBhbmQgdGhlIG1vc3Qgb2YgdGhlIGNvdW50cnkgc29vbiBmb2xsb3dlZCBzdWl0LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDUtMDQtMTYpOgotIyBUaGF0IDE4ODMgdHJhbnNpdGlvbiBvY2N1cnJlZCBhdCAxMjowMCBuZXcgdGltZSwgbm90IGF0IDEyOjAwIG9sZCB0aW1lLgotIyBTZWUgcCA0NiBvZiBEYXZpZCBQcmVyYXUsIFNlaXplIHRoZSBkYXlsaWdodCwgVGh1bmRlcidzIE1vdXRoIFByZXNzICgyMDA1KS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBpbiB0aGUgVVMgaXMKLSMgVGhvbWFzIEcuIFNoYW5rcywgVGhlIEFtZXJpY2FuIEF0bGFzICg1dGggZWRpdGlvbiksCi0jIFNhbiBEaWVnbzogQUNTIFB1YmxpY2F0aW9ucywgSW5jLiAoMTk5MSkuCi0jIE1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgZXJyYXRhIHNoZWV0OyB0aGUgYm9vayBpcyBzb21ld2hhdCB1c2VsZXNzIHdpdGhvdXQgaXQuCi0jIEl0IGlzIHRoZSBzb3VyY2UgZm9yIG1vc3Qgb2YgdGhlIHByZS0xOTkxIFVTIGVudHJpZXMgYmVsb3cuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMS0wMy0wNik6Ci0jIERheWxpZ2h0IFNhdmluZyBUaW1lIHdhcyBmaXJzdCBzdWdnZXN0ZWQgYXMgYSBqb2tlIGJ5IEJlbmphbWluIEZyYW5rbGluCi0jIGluIGhpcyB3aGltc2ljYWwgZXNzYXkgYGBBbiBFY29ub21pY2FsIFByb2plY3QgZm9yIERpbWluaXNoaW5nIHRoZSBDb3N0Ci0jIG9mIExpZ2h0JycgcHVibGlzaGVkIGluIHRoZSBKb3VybmFsIGRlIFBhcmlzICgxNzg0LTA0LTI2KS4KLSMgTm90IGV2ZXJ5b25lIGlzIGhhcHB5IHdpdGggdGhlIHJlc3VsdHM6Ci0jCi0jCUkgZG9uJ3QgcmVhbGx5IGNhcmUgaG93IHRpbWUgaXMgcmVja29uZWQgc28gbG9uZyBhcyB0aGVyZSBpcyBzb21lCi0jCWFncmVlbWVudCBhYm91dCBpdCwgYnV0IEkgb2JqZWN0IHRvIGJlaW5nIHRvbGQgdGhhdCBJIGFtIHNhdmluZwotIwlkYXlsaWdodCB3aGVuIG15IHJlYXNvbiB0ZWxscyBtZSB0aGF0IEkgYW0gZG9pbmcgbm90aGluZyBvZiB0aGUga2luZC4KLSMJSSBldmVuIG9iamVjdCB0byB0aGUgaW1wbGljYXRpb24gdGhhdCBJIGFtIHdhc3Rpbmcgc29tZXRoaW5nCi0jCXZhbHVhYmxlIGlmIEkgc3RheSBpbiBiZWQgYWZ0ZXIgdGhlIHN1biBoYXMgcmlzZW4uICBBcyBhbiBhZG1pcmVyCi0jCW9mIG1vb25saWdodCBJIHJlc2VudCB0aGUgYm9zc3kgaW5zaXN0ZW5jZSBvZiB0aG9zZSB3aG8gd2FudCB0bwotIwlyZWR1Y2UgbXkgdGltZSBmb3IgZW5qb3lpbmcgaXQuICBBdCB0aGUgYmFjayBvZiB0aGUgRGF5bGlnaHQgU2F2aW5nCi0jCXNjaGVtZSBJIGRldGVjdCB0aGUgYm9ueSwgYmx1ZS1maW5nZXJlZCBoYW5kIG9mIFB1cml0YW5pc20sIGVhZ2VyCi0jCXRvIHB1c2ggcGVvcGxlIGludG8gYmVkIGVhcmxpZXIsIGFuZCBnZXQgdGhlbSB1cCBlYXJsaWVyLCB0byBtYWtlCi0jCXRoZW0gaGVhbHRoeSwgd2VhbHRoeSBhbmQgd2lzZSBpbiBzcGl0ZSBvZiB0aGVtc2VsdmVzLgotIwotIwktLSBSb2JlcnRzb24gRGF2aWVzLCBUaGUgZGlhcnkgb2YgU2FtdWVsIE1hcmNoYmFua3MsCi0jCSAgIENsYXJrZSwgSXJ3aW4gKDE5NDcpLCBYSVgsIFN1bmRheQotIwotIyBGb3IgbW9yZSBhYm91dCB0aGUgZmlyc3QgdGVuIHllYXJzIG9mIERTVCBpbiB0aGUgVW5pdGVkIFN0YXRlcywgc2VlCi0jIFJvYmVydCBHYXJsYW5kJ3MgPGEgaHJlZj0iaHR0cDovL3d3dy5jbHBnaC5vcmcvZXhoaWJpdC9kc3QuaHRtbCI+Ci0jIFRlbiB5ZWFycyBvZiBkYXlsaWdodCBzYXZpbmcgZnJvbSB0aGUgUGl0dHNidXJnaCBzdGFuZHBvaW50Ci0jIChDYXJuZWdpZSBMaWJyYXJ5IG9mIFBpdHRzYnVyZ2gsIDE5MjcpPC9hPi4KLSMKLSMgU2hhbmtzIHNheXMgdGhhdCBEU1Qgd2FzIGNhbGxlZCAiV2FyIFRpbWUiIGluIHRoZSBVUyBpbiAxOTE4IGFuZCAxOTE5LgotIyBIb3dldmVyLCBEU1Qgd2FzIGltcG9zZWQgYnkgdGhlIFN0YW5kYXJkIFRpbWUgQWN0IG9mIDE5MTgsIHdoaWNoCi0jIHdhcyB0aGUgZmlyc3QgbmF0aW9ud2lkZSBsZWdhbCB0aW1lIHN0YW5kYXJkLCBhbmQgYXBwYXJlbnRseQotIyB0aW1lIHdhcyBqdXN0IGNhbGxlZCAiU3RhbmRhcmQgVGltZSIgb3IgIkRheWxpZ2h0IFNhdmluZyBUaW1lIi4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbjoKLSMgVVMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZW5kZWQgb24gdGhlIGxhc3QgU3VuZGF5IG9mICpPY3RvYmVyKiBpbiAxOTc0LgotIyBTZWUsIGZvciBleGFtcGxlLCB0aGUgZnJvbnQgcGFnZSBvZiB0aGUgU2F0dXJkYXksIDE5NzQtMTAtMjYKLSMgYW5kIFN1bmRheSwgMTk3NC0xMC0yNyBlZGl0aW9ucyBvZiB0aGUgV2FzaGluZ3RvbiBQb3N0LgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uOgotIyBCZWZvcmUgdGhlIFVuaWZvcm0gVGltZSBBY3Qgb2YgMTk2NiB0b29rIGVmZmVjdCBpbiAxOTY3LCBvYnNlcnZhbmNlIG9mCi0jIERheWxpZ2h0IFNhdmluZyBUaW1lIGluIHRoZSBVUyB3YXMgYnkgbG9jYWwgb3B0aW9uLCBleGNlcHQgZHVyaW5nIHdhcnRpbWUuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDAtMDktMjUpOgotIyBMYXN0IG5pZ2h0IEkgaGVhcmQgcGFydCBvZiBhIHJlYnJvYWRjYXN0IG9mIGEgMTk0NSBBcmNoIE9ib2xlciByYWRpbyBkcmFtYS4KLSMgSW4gdGhlIGludHJvZHVjdGlvbiwgT2JvbGVyIHNwb2tlIG9mICJFYXN0ZXJuIFBlYWNlIFRpbWUuIgotIyBBbiBBbHRhVmlzdGEgc2VhcmNoIHR1cm5lZCB1cAotIyA8YSBocmVmPSJodHRwOi8vcm93YXl0b24ub3JnL3Jocy9oc3RhdWc0NS5odG1sIj46Ci0jICJXaGVuIHRoZSB0aW1lIGlzIGFubm91bmNlZCBvdmVyIHRoZSByYWRpbyBub3csIGl0IGlzICdFYXN0ZXJuIFBlYWNlCi0jIFRpbWUnIGluc3RlYWQgb2YgdGhlIG9sZCBmYW1pbGlhciAnRWFzdGVybiBXYXIgVGltZS4nICBQZWFjZSBpcyB3b25kZXJmdWwuIgotIyA8L2E+IChBdWd1c3QgMTk0NSkgYnkgd2F5IG9mIGNvbmZpcm1hdGlvbi4KLQotIyBGcm9tIEpvc2VwaCBHYWxsYW50IGNpdGluZwotIyBHZW9yZ2UgSC4gRG91Z2xhcywgX1RoZSBFYXJseSBEYXlzIG9mIFJhZGlvIEJyb2FkY2FzdGluZ18gKDE5ODcpOgotIyBBdCA3IFAuTS4gKEVhc3Rlcm4gV2FyIFRpbWUpIFtvbiAxOTQ1LTA4LTE0XSwgdGhlIG5ldHdvcmtzIHdlcmUgc2V0Ci0jIHRvIHN3aXRjaCB0byBMb25kb24gZm9yIEF0dGxlZSdzIGFkZHJlc3MsIGJ1dCB0aGUgQW1lcmljYW4gcGVvcGxlCi0jIG5ldmVyIGdvdCB0byBoZWFyIGhpcyBzcGVlY2ggbGl2ZS4gQWNjb3JkaW5nIHRvIG9uZSBwcmVzcyBhY2NvdW50LAotIyBDQlMnIEJvYiBUcm91dCB3YXMgZmlyc3QgdG8gYW5ub3VuY2UgdGhlIHdvcmQgb2YgSmFwYW4ncyBzdXJyZW5kZXIsCi0jIGJ1dCBhIGZldyBzZWNvbmRzIGxhdGVyLCBOQkMsIEFCQyBhbmQgTXV0dWFsIGFsc28gZmxhc2hlZCB0aGUgd29yZAotIyBvZiBzdXJyZW5kZXIsIGFsbCBvZiB3aG9tIGludGVycnVwdGluZyB0aGUgYmVsbHMgb2YgQmlnIEJlbiBpbgotIyBMb25kb24gd2hpY2ggd2VyZSB0byBwcmVjZWRlIE1yLiBBdHRsZWUncyBzcGVlY2guCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wMi0wOSk6IEl0IHdhcyBSb2JlcnQgU3QgSm9obiwgbm90IEJvYiBUcm91dC4gIEZyb20KLSMgTXlybmEgT2xpdmVyJ3Mgb2JpdHVhcnkgb2YgU3QgSm9obiBvbiBwYWdlIEIxNiBvZiB0b2RheSdzIExvcyBBbmdlbGVzIFRpbWVzOgotIwotIyAuLi4gYSB3YXItd2VhcnkgVS5TLiBjbHVuZyB0byByYWRpb3MsIGF3YWl0aW5nIHdvcmQgb2YgSmFwYW4ncyBzdXJyZW5kZXIuCi0jIEFueSBhbm5vdW5jZW1lbnQgZnJvbSBBc2lhIHdvdWxkIHJlYWNoIFN0LiBKb2huJ3MgTmV3IFlvcmsgbmV3c3Jvb20gb24gYQotIyB3aXJlIHNlcnZpY2UgdGVsZXR5cGUgbWFjaGluZSwgd2hpY2ggaGFkIHByZXNjcmliZWQgc2lnbmFscyBmb3IgbWFqb3IgbmV3cy4KLSMgQXNzb2NpYXRlZCBQcmVzcywgZm9yIGV4YW1wbGUsIHdvdWxkIHJpbmcgZml2ZSBiZWxscyBiZWZvcmUgc3Bld2luZyBvdXQKLSMgdHlwZWQgY29weSBvZiBhbiBpbXBvcnRhbnQgc3RvcnksIGFuZCAxMCBiZWxscyBmb3IgbmV3cyAib2YgdHJhbnNjZW5kZW50YWwKLSMgaW1wb3J0YW5jZS4iCi0jCi0jIE9uIEF1Zy4gMTQsIHN0YWxsaW5nIHdoaWxlIHRhbGtpbmcgc3RlYWRpbHkgaW50byB0aGUgTkJDIG5ldHdvcmtzJyBvcGVuCi0jIG1pY3JvcGhvbmUsIFN0LiBKb2huIGhlYXJkIGZpdmUgYmVsbHMgYW5kIHdhaXRlZCBvbmx5IHRvIGhlYXIgYSBzaXh0aCBiZWxsLAotIyBiZWZvcmUgYW5ub3VuY2luZyBjb25maWRlbnRseTogIkxhZGllcyBhbmQgZ2VudGxlbWVuLCBXb3JsZCBXYXIgSUkgaXMgb3Zlci4KLSMgVGhlIEphcGFuZXNlIGhhdmUgYWdyZWVkIHRvIG91ciBzdXJyZW5kZXIgdGVybXMuIgotIwotIyBIZSBoYWQgc2NvcmVkIGEgMjAtc2Vjb25kIHNjb29wIG9uIG90aGVyIGJyb2FkY2FzdGVycy4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwNS0wOC0yMik6Ci0jIFBhdWwgaGFzIGJlZW4gY2FyZWZ1bCB0byB1c2UgdGhlICJVUyIgcnVsZXMgb25seSBpbiB0aG9zZSBsb2NhdGlvbnMKLSMgdGhhdCBhcmUgcGFydCBvZiB0aGUgVW5pdGVkIFN0YXRlczsgdGhpcyByZWZsZWN0cyB0aGUgcmVhbCBzY29wZSBvZgotIyBVLlMuIGdvdmVybm1lbnQgYWN0aW9uLiAgU28gZXZlbiB0aG91Z2ggdGhlICJVUyIgcnVsZXMgaGF2ZSBjaGFuZ2VkCi0jIGluIHRoZSBsYXRlc3QgcmVsZWFzZSwgb3RoZXIgY291bnRyaWVzIHdvbid0IGJlIGFmZmVjdGVkLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlVUwkxOTE4CTE5MTkJLQlNYXIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlVUwkxOTE4CTE5MTkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlVUwkxOTQyCW9ubHkJLQlGZWIJOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlVUwkxOTQ1CW9ubHkJLQlBdWcJMTQJMjM6MDB1CTE6MDAJUCAjIFBlYWNlCi1SdWxlCVVTCTE5NDUJb25seQktCVNlcAkzMAkyOjAwCTAJUwotUnVsZQlVUwkxOTY3CTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlVUwkxOTY3CTE5NzMJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlVUwkxOTc0CW9ubHkJLQlKYW4JNgkyOjAwCTE6MDAJRAotUnVsZQlVUwkxOTc1CW9ubHkJLQlGZWIJMjMJMjowMAkxOjAwCUQKLVJ1bGUJVVMJMTk3NgkxOTg2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJVVMJMTk4NwkyMDA2CS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAotUnVsZQlVUwkyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkxOjAwCUQKLVJ1bGUJVVMJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24sIDIwMDUtMTItMTkKLSMgV2UgZ2VuZXJhdGUgdGhlIGZpbGVzIHNwZWNpZmllZCBiZWxvdyB0byBndWFyZCBhZ2FpbnN0IG9sZCBmaWxlcyB3aXRoCi0jIG9ic29sZXRlIGluZm9ybWF0aW9uIGJlaW5nIGxlZnQgaW4gdGhlIHRpbWUgem9uZSBiaW5hcnkgZGlyZWN0b3J5LgotIyBXZSBsaW1pdCB0aGUgbGlzdCB0byBuYW1lcyB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YKLSMgdGhpcyB0aW1lIHpvbmUgcGFja2FnZS4KLSMgV2UgZG8gdGhlc2UgYXMgc2VwYXJhdGUgWm9uZXMgcmF0aGVyIHRoYW4gYXMgTGlua3MgdG8gYXZvaWQgcHJvYmxlbXMgaWYKLSMgYSBwYXJ0aWN1bGFyIHBsYWNlIGNoYW5nZXMgd2hldGhlciBpdCBvYnNlcnZlcyBEU1QuCi0jIFdlIHB1dCB0aGVzZSBzcGVjaWZpY2F0aW9ucyBoZXJlIGluIHRoZSBub3J0aGFtZXJpY2EgZmlsZSBib3RoIHRvCi0jIGluY3JlYXNlIHRoZSBjaGFuY2VzIHRoYXQgdGhleSdsbCBhY3R1YWxseSBnZXQgY29tcGlsZWQgYW5kIHRvCi0jIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGxpY2F0ZSB0aGUgVVMgcnVsZXMgaW4gYW5vdGhlciBmaWxlLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUVTVAkJIC01OjAwCS0JRVNUCi1ab25lCU1TVAkJIC03OjAwCS0JTVNUCi1ab25lCUhTVAkJLTEwOjAwCS0JSFNUCi1ab25lCUVTVDVFRFQJCSAtNTowMAlVUwlFJXNUCi1ab25lCUNTVDZDRFQJCSAtNjowMAlVUwlDJXNUCi1ab25lCU1TVDdNRFQJCSAtNzowMAlVUwlNJXNUCi1ab25lCVBTVDhQRFQJCSAtODowMAlVUwlQJXNUCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgLi4uQWxhc2thIChhbmQgSGF3YWlpKSBoYWQgdGhlIHRpbWV6b25lIG5hbWVzIGNoYW5nZWQgaW4gMTk2Ny4KLSMgICAgb2xkCQkJIG5ldwotIyAgICBQYWNpZmljIFN0YW5kYXJkIFRpbWUoUFNUKSAgLXNhbWUtCi0jICAgIFl1a29uIFN0YW5kYXJkIFRpbWUoWVNUKSAgICAtc2FtZS0KLSMgICAgQ2VudHJhbCBBbGFza2EgUy5ULiAoQ0FUKSAgIEFsYXNrYS1IYXdhaWkgU3RbYW5dZGFyZCBUaW1lIChBSFNUKQotIyAgICBOb21lIFN0YW5kYXJkIFRpbWUgKE5UKSAgICAgQmVyaW5nIFN0YW5kYXJkIFRpbWUgKEJTVCkKLSMKLSMgLi4uQWxhc2thJ3MgdGltZXpvbmUgbGluZXMgd2VyZSByZWRyYXduIGluIDE5ODMgdG8gZ2l2ZSBvbmx5IDIgdHouCi0jICAgIFRoZSBZU1Qgem9uZSBub3cgY292ZXJzIG5lYXJseSBhbGwgb2YgdGhlIHN0YXRlLCBBSFNUIGp1c3QgcGFydAotIyAgICBvZiB0aGUgQWxldXRpYW4gaXNsYW5kcy4gICBObyBEU1QuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5NS0xMi0xOSk6Ci0jIFRoZSB0YWJsZXMgYmVsb3cgdXNlIGBOU1QnLCBub3QgYE5UJywgZm9yIE5vbWUgU3RhbmRhcmQgVGltZS4KLSMgSSBpbnZlbnRlZCBgQ0FXVCcgZm9yIENlbnRyYWwgQWxhc2thIFdhciBUaW1lLgotCi0jIEZyb20gVS4gUy4gTmF2YWwgT2JzZXJ2YXRvcnkgKDE5ODktMDEtMTkpOgotIyBVU0EgIEVBU1RFUk4gICAgICAgNSBIICBCRUhJTkQgVVRDICAgIE5FVyBZT1JLLCBXQVNISU5HVE9OCi0jIFVTQSAgRUFTVEVSTiAgICAgICA0IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKLSMgVVNBICBDRU5UUkFMICAgICAgIDYgSCAgQkVISU5EIFVUQyAgICBDSElDQUdPLCBIT1VTVE9OCi0jIFVTQSAgQ0VOVFJBTCAgICAgICA1IEggIEJFSElORCBVVEMgICAgQVBSIDMgLSBPQ1QgMzAKLSMgVVNBICBNT1VOVEFJTiAgICAgIDcgSCAgQkVISU5EIFVUQyAgICBERU5WRVIKLSMgVVNBICBNT1VOVEFJTiAgICAgIDYgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAotIyBVU0EgIFBBQ0lGSUMgICAgICAgOCBIICBCRUhJTkQgVVRDICAgIEwuQS4sIFNBTiBGUkFOQ0lTQ08KLSMgVVNBICBQQUNJRklDICAgICAgIDcgSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMAotIyBVU0EgIEFMQVNLQSBTVEQgICAgOSBIICBCRUhJTkQgVVRDICAgIE1PU1QgT0YgQUxBU0tBICAgICAoQUtTVCkKLSMgVVNBICBBTEFTS0EgU1REICAgIDggSCAgQkVISU5EIFVUQyAgICBBUFIgMyAtIE9DVCAzMCAoQUtEVCkKLSMgVVNBICBBTEVVVElBTiAgICAgMTAgSCAgQkVISU5EIFVUQyAgICBJU0xBTkRTIFdFU1QgT0YgMTcwVwotIyBVU0EgIC0gIiAtICAgICAgICAgOSBIICBCRUhJTkQgVVRDICAgIEFQUiAzIC0gT0NUIDMwCi0jIFVTQSAgSEFXQUlJICAgICAgIDEwIEggIEJFSElORCBVVEMKLSMgVVNBICBCRVJJTkcgICAgICAgMTEgSCAgQkVISU5EIFVUQyAgICBTQU1PQSwgTUlEV0FZCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5ODktMDEtMjEpOgotIyBUaGUgYWJvdmUgZGF0ZXMgYXJlIGZvciAxOTg4LgotIyBOb3RlIHRoZSAiQUtTVCIgYW5kICJBS0RUIiBhYmJyZXZpYXRpb25zLCB0aGUgY2xhaW0gdGhhdCB0aGVyZSdzCi0jIG5vIERTVCBpbiBTYW1vYSwgYW5kIHRoZSBjbGFpbSB0aGF0IHRoZXJlIGlzIERTVCBpbiBBbGFza2EgYW5kIHRoZQotIyBBbGV1dGlhbnMuCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5ODgtMDItMTMpOgotIyBMZWdhbCBzdGFuZGFyZCB0aW1lIHpvbmUgbmFtZXMsIGZyb20gVW5pdGVkIFN0YXRlcyBDb2RlICgxOTgyIEVkaXRpb24gYW5kCi0jIFN1cHBsZW1lbnQgSUlJKSwgVGl0bGUgMTUsIENoYXB0ZXIgNiwgU2VjdGlvbiAyNjAgYW5kIGZvcndhcmQuICBGaXJzdCwgbmFtZXMKLSMgdXAgdG8gMTk2Ny0wNC0wMSAod2hlbiBtb3N0IHByb3Zpc2lvbnMgb2YgdGhlIFVuaWZvcm0gVGltZSBBY3Qgb2YgMTk2NgotIyB0b29rIGVmZmVjdCksIGFzIGV4cGxhaW5lZCBpbiBzZWN0aW9ucyAyNjMgYW5kIDI2MToKLSMJKG5vbmUpCi0jCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgZWFzdGVybiB0aW1lCi0jCVVuaXRlZCBTdGF0ZXMgc3RhbmRhcmQgbW91bnRhaW4gdGltZQotIwlVbml0ZWQgU3RhdGVzIHN0YW5kYXJkIGNlbnRyYWwgdGltZQotIwlVbml0ZWQgU3RhdGVzIHN0YW5kYXJkIFBhY2lmaWMgdGltZQotIwkobm9uZSkKLSMJVW5pdGVkIFN0YXRlcyBzdGFuZGFyZCBBbGFza2EgdGltZQotIwkobm9uZSkKLSMgTmV4dCwgbmFtZXMgZnJvbSAxOTY3LTA0LTAxIHVudGlsIDE5ODMtMTEtMzAgKHRoZSBkYXRlIGZvcgotIyBwdWJsaWMgbGF3IDk4LTE4MSk6Ci0jCUF0bGFudGljIHN0YW5kYXJkIHRpbWUKLSMJZWFzdGVybiBzdGFuZGFyZCB0aW1lCi0jCWNlbnRyYWwgc3RhbmRhcmQgdGltZQotIwltb3VudGFpbiBzdGFuZGFyZCB0aW1lCi0jCVBhY2lmaWMgc3RhbmRhcmQgdGltZQotIwlZdWtvbiBzdGFuZGFyZCB0aW1lCi0jCUFsYXNrYS1IYXdhaWkgc3RhbmRhcmQgdGltZQotIwlCZXJpbmcgc3RhbmRhcmQgdGltZQotIyBBbmQgYWZ0ZXIgMTk4My0xMS0zMDoKLSMJQXRsYW50aWMgc3RhbmRhcmQgdGltZQotIwllYXN0ZXJuIHN0YW5kYXJkIHRpbWUKLSMJY2VudHJhbCBzdGFuZGFyZCB0aW1lCi0jCW1vdW50YWluIHN0YW5kYXJkIHRpbWUKLSMJUGFjaWZpYyBzdGFuZGFyZCB0aW1lCi0jCUFsYXNrYSBzdGFuZGFyZCB0aW1lCi0jCUhhd2FpaS1BbGV1dGlhbiBzdGFuZGFyZCB0aW1lCi0jCVNhbW9hIHN0YW5kYXJkIHRpbWUKLSMgVGhlIGxhdyBkb2Vzbid0IGdpdmUgYWJicmV2aWF0aW9ucy4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMC0wMS0wOCksIGZvbGxvd2luZyBhIGhlYWRzLXVwIGZyb20gUml2ZXMgTWNEb3c6Ci0jIFB1YmxpYyBsYXcgMTA2LTU2NCAoMjAwMC0xMi0yMykgaW50cm9kdWNlZCB0aGUgYWJicmV2aWF0aW9uCi0jICJDaGFtb3JybyBTdGFuZGFyZCBUaW1lIiBmb3IgdGltZSBpbiBHdWFtIGFuZCB0aGUgTm9ydGhlcm4gTWFyaWFuYXMuCi0jIFNlZSB0aGUgZmlsZSAiYXVzdHJhbGFzaWEiLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uLCAyMDA1LTA4LTA5Ci0jIFRoZSBmb2xsb3dpbmcgd2FzIHNpZ25lZCBpbnRvIGxhdyBvbiAyMDA1LTA4LTA4LgotIwotIyBILlIuIDYsIEVuZXJneSBQb2xpY3kgQWN0IG9mIDIwMDUsIFNFQy4gMTEwLiBEQVlMSUdIVCBTQVZJTkdTLgotIyAgIChhKSBBbWVuZG1lbnQtIFNlY3Rpb24gMyhhKSBvZiB0aGUgVW5pZm9ybSBUaW1lIEFjdCBvZiAxOTY2ICgxNQotIyAgIFUuUy5DLiAyNjBhKGEpKSBpcyBhbWVuZGVkLS0KLSMgICAgICgxKSBieSBzdHJpa2luZyBgZmlyc3QgU3VuZGF5IG9mIEFwcmlsJyBhbmQgaW5zZXJ0aW5nIGBzZWNvbmQKLSMgICAgIFN1bmRheSBvZiBNYXJjaCc7IGFuZAotIyAgICAgKDIpIGJ5IHN0cmlraW5nIGBsYXN0IFN1bmRheSBvZiBPY3RvYmVyJyBhbmQgaW5zZXJ0aW5nIGBmaXJzdAotIyAgICAgU3VuZGF5IG9mIE5vdmVtYmVyJy4KLSMgICAoYikgRWZmZWN0aXZlIERhdGUtIFN1YnNlY3Rpb24gKGEpIHNoYWxsIHRha2UgZWZmZWN0IDEgeWVhciBhZnRlciB0aGUKLSMgICBkYXRlIG9mIGVuYWN0bWVudCBvZiB0aGlzIEFjdCBvciBNYXJjaCAxLCAyMDA3LCB3aGljaGV2ZXIgaXMgbGF0ZXIuCi0jICAgKGMpIFJlcG9ydCB0byBDb25ncmVzcy0gTm90IGxhdGVyIHRoYW4gOSBtb250aHMgYWZ0ZXIgdGhlIGVmZmVjdGl2ZQotIyAgIGRhdGUgc3RhdGVkIGluIHN1YnNlY3Rpb24gKGIpLCB0aGUgU2VjcmV0YXJ5IHNoYWxsIHJlcG9ydCB0byBDb25ncmVzcwotIyAgIG9uIHRoZSBpbXBhY3Qgb2YgdGhpcyBzZWN0aW9uIG9uIGVuZXJneSBjb25zdW1wdGlvbiBpbiB0aGUgVW5pdGVkCi0jICAgU3RhdGVzLgotIyAgIChkKSBSaWdodCB0byBSZXZlcnQtIENvbmdyZXNzIHJldGFpbnMgdGhlIHJpZ2h0IHRvIHJldmVydCB0aGUKLSMgICBEYXlsaWdodCBTYXZpbmcgVGltZSBiYWNrIHRvIHRoZSAyMDA1IHRpbWUgc2NoZWR1bGVzIG9uY2UgdGhlCi0jICAgRGVwYXJ0bWVudCBzdHVkeSBpcyBjb21wbGV0ZS4KLQotIyBVUyBlYXN0ZXJuIHRpbWUsIHJlcHJlc2VudGVkIGJ5IE5ldyBZb3JrCi0KLSMgQ29ubmVjdGljdXQsIERlbGF3YXJlLCBEaXN0cmljdCBvZiBDb2x1bWJpYSwgbW9zdCBvZiBGbG9yaWRhLAotIyBHZW9yZ2lhLCBzb3V0aGVhc3QgSW5kaWFuYSAoRGVhcmJvcm4gYW5kIE9oaW8gY291bnRpZXMpLCBlYXN0ZXJuIEtlbnR1Y2t5Ci0jIChleGNlcHQgQW1lcmljYS9LZW50dWNreS9Mb3Vpc3ZpbGxlIGJlbG93KSwgTWFpbmUsIE1hcnlsYW5kLCBNYXNzYWNodXNldHRzLAotIyBOZXcgSGFtcHNoaXJlLCBOZXcgSmVyc2V5LCBOZXcgWW9yaywgTm9ydGggQ2Fyb2xpbmEsIE9oaW8sCi0jIFBlbm5zeWx2YW5pYSwgUmhvZGUgSXNsYW5kLCBTb3V0aCBDYXJvbGluYSwgZWFzdGVybiBUZW5uZXNzZWUsCi0jIFZlcm1vbnQsIFZpcmdpbmlhLCBXZXN0IFZpcmdpbmlhCi0KLSMgRnJvbSBEYXZlIENhbnRvciAoMjAwNC0xMS0wMik6Ci0jIEVhcmx5IHRoaXMgc3VtbWVyIEkgaGFkIHRoZSBvY2Nhc2lvbiB0byB2aXNpdCB0aGUgTW91bnQgV2FzaGluZ3RvbgotIyBPYnNlcnZhdG9yeSB3ZWF0aGVyIHN0YXRpb24gYXRvcCAob2YgY291cnNlISkgTW91bnQgV2FzaGluZ3RvbiBbLCBOSF0uLi4uCi0jIE9uZSBvZiB0aGUgc3RhZmYgbWVtYmVycyBzYWlkIHRoYXQgdGhlIHN0YXRpb24gd2FzIG9uIEVhc3Rlcm4gU3RhbmRhcmQgVGltZQotIyBhbmQgZGlkbid0IGNoYW5nZSB0aGVpciBjbG9ja3MgZm9yIERheWxpZ2h0IFNhdmluZyAuLi4gc28gdGhhdCB0aGVpcgotIyByZXBvcnRzIHdpbGwgYWx3YXlzIGhhdmUgdGltZXMgd2hpY2ggYXJlIDUgaG91cnMgYmVoaW5kIFVUQy4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA4LTI2KToKLSMgQWNjb3JkaW5nIHRvIHRvZGF5J3MgSHVudHN2aWxsZSBUaW1lcwotIyA8aHR0cDovL3d3dy5hbC5jb20vbmV3cy9odW50c3ZpbGxldGltZXMvaW5kZXguc3NmPy9iYXNlL25ld3MvMTEyNTA0Nzc4MzIyODMyMC54bWwmY29sbD0xPgotIyBhIGZldyB0b3ducyBvbiBBbGFiYW1hJ3MgImVhc3Rlcm4gYm9yZGVyIHdpdGggR2VvcmdpYSwgc3VjaCBhcyBQaGVuaXggQ2l0eQotIyBpbiBSdXNzZWxsIENvdW50eSwgTGFuZXR0IGluIENoYW1iZXJzIENvdW50eSBhbmQgc29tZSB0b3ducyBpbiBMZWUgQ291bnR5LAotIyBzZXQgdGhlaXIgd2F0Y2hlcyBhbmQgY2xvY2tzIG9uIEVhc3Rlcm4gdGltZS4iICBJdCBxdW90ZXMgSC5ILiAiQnViYmEiCi0jIFJvYmVydHMsIGNpdHkgYWRtaW5pc3RyYXRvciBpbiBQaGVuaXggQ2l0eS4gYXMgc2F5aW5nICJXZSBhcmUgaW4gdGhlIENlbnRyYWwKLSMgdGltZSB6b25lLCBidXQgd2UgZG8gZ28gYnkgdGhlIEVhc3Rlcm4gdGltZSB6b25lIGJlY2F1c2Ugc28gbWFueSBwZW9wbGUgd29yawotIyBpbiBDb2x1bWJ1cy4iCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlOWUMJMTkyMAlvbmx5CS0JTWFyCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJTllDCTE5MjAJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU5ZQwkxOTIxCTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlOWUMJMTkyMQkxOTU0CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTllDCTE5NTUJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTmV3X1lvcmsJLTQ6NTY6MDIgLQlMTVQJMTg4MyBOb3YgMTggMTI6MDM6NTgKLQkJCS01OjAwCVVTCUUlc1QJMTkyMAotCQkJLTU6MDAJTllDCUUlc1QJMTk0MgotCQkJLTU6MDAJVVMJRSVzVAkxOTQ2Ci0JCQktNTowMAlOWUMJRSVzVAkxOTY3Ci0JCQktNTowMAlVUwlFJXNUCi0KLSMgVVMgY2VudHJhbCB0aW1lLCByZXByZXNlbnRlZCBieSBDaGljYWdvCi0KLSMgQWxhYmFtYSwgQXJrYW5zYXMsIEZsb3JpZGEgcGFuaGFuZGxlIChCYXksIENhbGhvdW4sIEVzY2FtYmlhLAotIyBHdWxmLCBIb2xtZXMsIEphY2tzb24sIE9rYWxvb3NhLCBTYW50YSBSb3NhLCBXYWx0b24sIGFuZAotIyBXYXNoaW5ndG9uIGNvdW50aWVzKSwgSWxsaW5vaXMsIHdlc3Rlcm4gSW5kaWFuYQotIyAoR2lic29uLCBKYXNwZXIsIExha2UsIExhUG9ydGUsIE5ld3RvbiwgUG9ydGVyLCBQb3NleSwgU3BlbmNlciwKLSMgVmFuZGVyYnVyZ2gsIGFuZCBXYXJyaWNrIGNvdW50aWVzKSwgSW93YSwgbW9zdCBvZiBLYW5zYXMsIHdlc3Rlcm4KLSMgS2VudHVja3ksIExvdWlzaWFuYSwgTWlubmVzb3RhLCBNaXNzaXNzaXBwaSwgTWlzc291cmksIGVhc3Rlcm4KLSMgTmVicmFza2EsIGVhc3Rlcm4gTm9ydGggRGFrb3RhLCBPa2xhaG9tYSwgZWFzdGVybiBTb3V0aCBEYWtvdGEsCi0jIHdlc3Rlcm4gVGVubmVzc2VlLCBtb3N0IG9mIFRleGFzLCBXaXNjb25zaW4KLQotIyBGcm9tIExhcnJ5IE0uIFNtaXRoICgyMDA2LTA0LTI2KSByZSBXaXNjb25zaW46Ci0jIGh0dHA6Ly93d3cubGVnaXMuc3RhdGUud2kudXMvc3RhdHV0ZXMvU3RhdDAxNzUucGRmIC4uLgotIyBpcyBjdXJyZW50bHkgZW5mb3JjZWQgYXQgdGhlIDAxOjAwIHRpbWUgb2YgY2hhbmdlLiAgQmVjYXVzZSB0aGUgbG9jYWwKLSMgImJhciB0aW1lIiBpbiB0aGUgc3RhdGUgY29ycmVzcG9uZHMgdG8gMDI6MDAsIGEgbnVtYmVyIG9mIGNpdGF0aW9ucwotIyBhcmUgaXNzdWVkIGZvciB0aGUgInNhbGUgb2YgY2xhc3MgJ0InIGFsY29ob2wgYWZ0ZXIgcHJvaGliaXRlZAotIyBob3VycyIgd2l0aGluIHRoZSBkZXZpYXRlZCBob3VyIG9mIHRoaXMgY2hhbmdlIGV2ZXJ5IHllYXIuLi4uCi0jCi0jIEZyb20gRG91Z2xhcyBSLiBCb21iZXJnICgyMDA3LTAzLTEyKToKLSMgV2lzY29uc2luIGhhcyBlbmFjdGVkIChuZWFybHkgZWxldmVudGgtaG91cikgbGVnaXNsYXRpb24gdG8gZ2V0IFdJCi0jIFN0YXR1ZSAxNzUgY2xvc2VyIGluIHN5bmNoIHdpdGggdGhlIFVTIENvbmdyZXNzJyBpbnRlbnQuLi4uCi0jIGh0dHA6Ly93d3cubGVnaXMuc3RhdGUud2kudXMvMjAwNy9kYXRhL2FjdHMvMDdBY3QzLnBkZgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJQ2hpY2FnbwkxOTIwCW9ubHkJLQlKdW4JMTMJMjowMAkxOjAwCUQKLVJ1bGUJQ2hpY2FnbwkxOTIwCTE5MjEJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlDaGljYWdvCTE5MjEJb25seQktCU1hcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUNoaWNhZ28JMTkyMgkxOTY2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJQ2hpY2FnbwkxOTIyCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlDaGljYWdvCTE5NTUJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvQ2hpY2FnbwktNTo1MDozNiAtCUxNVAkxODgzIE5vdiAxOCAxMjowOToyNAotCQkJLTY6MDAJVVMJQyVzVAkxOTIwCi0JCQktNjowMAlDaGljYWdvCUMlc1QJMTkzNiBNYXIgIDEgMjowMAotCQkJLTU6MDAJLQlFU1QJMTkzNiBOb3YgMTUgMjowMAotCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NDIKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAJQ2hpY2FnbwlDJXNUCTE5NjcKLQkJCS02OjAwCVVTCUMlc1QKLSMgT2xpdmVyIENvdW50eSwgTkQgc3dpdGNoZWQgZnJvbSBtb3VudGFpbiB0byBjZW50cmFsIHRpbWUgb24gMTk5Mi0xMC0yNS4KLVpvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvQ2VudGVyIC02OjQ1OjEyIC0gTE1UCTE4ODMgTm92IDE4IDEyOjE0OjQ4Ci0JCQktNzowMAlVUwlNJXNUCTE5OTIgT2N0IDI1IDAyOjAwCi0JCQktNjowMAlVUwlDJXNUCi0jIE1vcnRvbiBDb3VudHksIE5ELCBzd2l0Y2hlZCBmcm9tIG1vdW50YWluIHRvIGNlbnRyYWwgdGltZSBvbgotIyAyMDAzLTEwLTI2LCBleGNlcHQgZm9yIHRoZSBhcmVhIGFyb3VuZCBNYW5kYW4gd2hpY2ggd2FzIGFscmVhZHkgY2VudHJhbCB0aW1lLgotIyBTZWUgPGh0dHA6Ly9kbXNlcy5kb3QuZ292L2RvY2ltYWdlcy9wNjMvMTM1ODE4LnBkZj4uCi0jIE9mZmljaWFsbHkgdGhpcyBzd2l0Y2ggYWxzbyBpbmNsdWRlZCBwYXJ0IG9mIFNpb3V4IENvdW50eSwgYW5kCi0jIEpvbmVzLCBNZWxsZXR0ZSwgYW5kIFRvZGQgQ291bnRpZXMgaW4gU291dGggRGFrb3RhOwotIyBidXQgaW4gcHJhY3RpY2UgdGhlc2Ugb3RoZXIgY291bnRpZXMgd2VyZSBhbHJlYWR5IG9ic2VydmluZyBjZW50cmFsIHRpbWUuCi0jIFNlZSA8aHR0cDovL3d3dy5lcGEuZ292L2ZlZHJnc3RyL0VQQS1JTVBBQ1QvMjAwMy9PY3RvYmVyL0RheS0yOC9pMjcwNTYuaHRtPi4KLVpvbmUgQW1lcmljYS9Ob3J0aF9EYWtvdGEvTmV3X1NhbGVtIC02OjQ1OjM5IC0gTE1UIDE4ODMgTm92IDE4IDEyOjE0OjIxCi0JCQktNzowMAlVUwlNJXNUCTIwMDMgT2N0IDI2IDAyOjAwCi0JCQktNjowMAlVUwlDJXNUCi0KLSMgVVMgbW91bnRhaW4gdGltZSwgcmVwcmVzZW50ZWQgYnkgRGVudmVyCi0jCi0jIENvbG9yYWRvLCBmYXIgd2VzdGVybiBLYW5zYXMsIE1vbnRhbmEsIHdlc3Rlcm4KLSMgTmVicmFza2EsIE5ldmFkYSBib3JkZXIgKEphY2twb3QsIE93eWhlZSwgYW5kIE1vdW50YWluIENpdHkpLAotIyBOZXcgTWV4aWNvLCBzb3V0aHdlc3Rlcm4gTm9ydGggRGFrb3RhLAotIyB3ZXN0ZXJuIFNvdXRoIERha290YSwgZmFyIHdlc3Rlcm4gVGV4YXMgKEVsIFBhc28gQ291bnR5LCBIdWRzcGV0aCBDb3VudHksCi0jIGFuZCBQaW5lIFNwcmluZ3MgYW5kIE5pY2tlbCBDcmVlayBpbiBDdWxiZXJzb24gQ291bnR5KSwgVXRhaCwgV3lvbWluZwotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCURlbnZlcgkxOTIwCTE5MjEJLQlNYXIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlEZW52ZXIJMTkyMAlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRGVudmVyCTE5MjEJb25seQktCU1heQkyMgkyOjAwCTAJUwotUnVsZQlEZW52ZXIJMTk2NQkxOTY2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJRGVudmVyCTE5NjUJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvRGVudmVyCS02OjU5OjU2IC0JTE1UCTE4ODMgTm92IDE4IDEyOjAwOjA0Ci0JCQktNzowMAlVUwlNJXNUCTE5MjAKLQkJCS03OjAwCURlbnZlcglNJXNUCTE5NDIKLQkJCS03OjAwCVVTCU0lc1QJMTk0NgotCQkJLTc6MDAJRGVudmVyCU0lc1QJMTk2NwotCQkJLTc6MDAJVVMJTSVzVAotCi0jIFVTIFBhY2lmaWMgdGltZSwgcmVwcmVzZW50ZWQgYnkgTG9zIEFuZ2VsZXMKLSMKLSMgQ2FsaWZvcm5pYSwgbm9ydGhlcm4gSWRhaG8gKEJlbmV3YWgsIEJvbm5lciwgQm91bmRhcnksIENsZWFyd2F0ZXIsCi0jIElkYWhvLCBLb290ZW5haSwgTGF0YWgsIExld2lzLCBOZXogUGVyY2UsIGFuZCBTaG9zaG9uZSBjb3VudGllcywKLSMgYW5kIHRoZSBub3J0aGVybiB0aHJlZS1xdWFydGVycyBvZiBJZGFobyBjb3VudHkpLAotIyBtb3N0IG9mIE5ldmFkYSwgbW9zdCBvZiBPcmVnb24sIGFuZCBXYXNoaW5ndG9uCi0jCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJQ0EJMTk0OAlvbmx5CS0JTWFyCTE0CTI6MDAJMTowMAlECi1SdWxlCUNBCTE5NDkJb25seQktCUphbgkgMQkyOjAwCTAJUwotUnVsZQlDQQkxOTUwCTE5NjYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlDQQkxOTUwCTE5NjEJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlDQQkxOTYyCTE5NjYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0xvc19BbmdlbGVzIC03OjUyOjU4IC0JTE1UCTE4ODMgTm92IDE4IDEyOjA3OjAyCi0JCQktODowMAlVUwlQJXNUCTE5NDYKLQkJCS04OjAwCUNBCVAlc1QJMTk2NwotCQkJLTg6MDAJVVMJUCVzVAotCi0jIEFsYXNrYQotIyBBSyVzVCBpcyB0aGUgbW9kZXJuIGFiYnJldmlhdGlvbiBmb3IgLTk6MDAgcGVyIFVTTk8uCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDUtMzApOgotIyBIb3dzZSB3cml0ZXMgdGhhdCBBbGFza2Egc3dpdGNoZWQgZnJvbSB0aGUgSnVsaWFuIHRvIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsCi0jIGFuZCBmcm9tIGVhc3Qtb2YtR01UIHRvIHdlc3Qtb2YtR01UIGRheXMsIHdoZW4gdGhlIFVTIGJvdWdodCBpdCBmcm9tIFJ1c3NpYS4KLSMgVGhpcyB3YXMgb24gMTg2Ny0xMC0xOCwgYSBGcmlkYXk7IHRoZSBwcmV2aW91cyBkYXkgd2FzIDE4NjctMTAtMDYgSnVsaWFuLAotIyBhbHNvIGEgRnJpZGF5LiAgSW5jbHVkZSBvbmx5IHRoZSB0aW1lIHpvbmUgcGFydCBvZiB0aGlzIHRyYW5zaXRpb24sCi0jIGlnbm9yaW5nIHRoZSBzd2l0Y2ggZnJvbSBKdWxpYW4gdG8gR3JlZ29yaWFuLCBzaW5jZSB3ZSBjYW4ndCByZXByZXNlbnQKLSMgdGhlIEp1bGlhbiBjYWxlbmRhci4KLSMKLSMgQXMgZmFyIGFzIHdlIGtub3csIG5vbmUgb2YgdGhlIGV4YWN0IGxvY2F0aW9ucyBtZW50aW9uZWQgYmVsb3cgd2VyZQotIyBwZXJtYW5lbnRseSBpbmhhYml0ZWQgaW4gMTg2NyBieSBhbnlvbmUgdXNpbmcgZWl0aGVyIGNhbGVuZGFyLgotIyAoWWFrdXRhdCB3YXMgY29sb25pemVkIGJ5IHRoZSBSdXNzaWFucyBpbiAxNzk5LCBidXQgdGhlIHNldHRsZW1lbnQKLSMgd2FzIGRlc3Ryb3llZCBpbiAxODA1IGJ5IGEgWWFrdXRhdC1rb24gd2FyIHBhcnR5LikgIEhvd2V2ZXIsIHRoZXJlCi0jIHdlcmUgbmVhcmJ5IGluaGFiaXRhbnRzIGluIHNvbWUgY2FzZXMgYW5kIGZvciBvdXIgcHVycG9zZXMgcGVyaGFwcwotIyBpdCdzIGJlc3QgdG8gc2ltcGx5IHVzZSB0aGUgb2ZmaWNpYWwgdHJhbnNpdGlvbi4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9KdW5lYXUJIDE1OjAyOjE5IC0JTE1UCTE4NjcgT2N0IDE4Ci0JCQkgLTg6NTc6NDEgLQlMTVQJMTkwMCBBdWcgMjAgMTI6MDAKLQkJCSAtODowMAktCVBTVAkxOTQyCi0JCQkgLTg6MDAJVVMJUCVzVAkxOTQ2Ci0JCQkgLTg6MDAJLQlQU1QJMTk2OQotCQkJIC04OjAwCVVTCVAlc1QJMTk4MyBPY3QgMzAgMjowMAotCQkJIC05OjAwCVVTCVklc1QJMTk4MyBOb3YgMzAKLQkJCSAtOTowMAlVUwlBSyVzVAotWm9uZSBBbWVyaWNhL1lha3V0YXQJIDE0OjQxOjA1IC0JTE1UCTE4NjcgT2N0IDE4Ci0JCQkgLTk6MTg6NTUgLQlMTVQJMTkwMCBBdWcgMjAgMTI6MDAKLQkJCSAtOTowMAktCVlTVAkxOTQyCi0JCQkgLTk6MDAJVVMJWSVzVAkxOTQ2Ci0JCQkgLTk6MDAJLQlZU1QJMTk2OQotCQkJIC05OjAwCVVTCVklc1QJMTk4MyBOb3YgMzAKLQkJCSAtOTowMAlVUwlBSyVzVAotWm9uZSBBbWVyaWNhL0FuY2hvcmFnZQkgMTQ6MDA6MjQgLQlMTVQJMTg2NyBPY3QgMTgKLQkJCSAtOTo1OTozNiAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAotCQkJLTEwOjAwCS0JQ0FUCTE5NDIKLQkJCS0xMDowMAlVUwlDQVQvQ0FXVCAxOTQ1IEF1ZyAxNCAyMzowMHUKLQkJCS0xMDowMAlVUwlDQVQvQ0FQVCAxOTQ2ICMgUGVhY2UKLQkJCS0xMDowMAktCUNBVAkxOTY3IEFwcgotCQkJLTEwOjAwCS0JQUhTVAkxOTY5Ci0JCQktMTA6MDAJVVMJQUglc1QJMTk4MyBPY3QgMzAgMjowMAotCQkJIC05OjAwCVVTCVklc1QJMTk4MyBOb3YgMzAKLQkJCSAtOTowMAlVUwlBSyVzVAotWm9uZSBBbWVyaWNhL05vbWUJIDEyOjU4OjIxIC0JTE1UCTE4NjcgT2N0IDE4Ci0JCQktMTE6MDE6MzggLQlMTVQJMTkwMCBBdWcgMjAgMTI6MDAKLQkJCS0xMTowMAktCU5TVAkxOTQyCi0JCQktMTE6MDAJVVMJTiVzVAkxOTQ2Ci0JCQktMTE6MDAJLQlOU1QJMTk2NyBBcHIKLQkJCS0xMTowMAktCUJTVAkxOTY5Ci0JCQktMTE6MDAJVVMJQiVzVAkxOTgzIE9jdCAzMCAyOjAwCi0JCQkgLTk6MDAJVVMJWSVzVAkxOTgzIE5vdiAzMAotCQkJIC05OjAwCVVTCUFLJXNUCi1ab25lIEFtZXJpY2EvQWRhawkgMTI6MTM6MjEgLQlMTVQJMTg2NyBPY3QgMTgKLQkJCS0xMTo0NjozOCAtCUxNVAkxOTAwIEF1ZyAyMCAxMjowMAotCQkJLTExOjAwCS0JTlNUCTE5NDIKLQkJCS0xMTowMAlVUwlOJXNUCTE5NDYKLQkJCS0xMTowMAktCU5TVAkxOTY3IEFwcgotCQkJLTExOjAwCS0JQlNUCTE5NjkKLQkJCS0xMTowMAlVUwlCJXNUCTE5ODMgT2N0IDMwIDI6MDAKLQkJCS0xMDowMAlVUwlBSCVzVAkxOTgzIE5vdiAzMAotCQkJLTEwOjAwCVVTCUhBJXNUCi0jIFRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgZG9uJ3QgcXVpdGUgbWFrZSBvdXIgMTk3MCBjdXRvZmYuCi0jCi0jIFNoYW5rcyB3cml0ZXMgdGhhdCBwYXJ0IG9mIHNvdXRod2VzdCBBbGFza2EgKGUuZy4gQW5pYWspCi0jIHN3aXRjaGVkIGZyb20gLTExOjAwIHRvIC0xMDowMCBvbiAxOTY4LTA5LTIyIGF0IDAyOjAwLAotIyBhbmQgYW5vdGhlciBwYXJ0IChlLmcuIEFraWFrKSBtYWRlIHRoZSBzYW1lIHN3aXRjaCBmaXZlIHdlZWtzIGxhdGVyLgotIwotIyBGcm9tIERhdmlkIEZsYXRlciAoMjAwNC0xMS0wOSk6Ci0jIEluIGUtbWFpbCwgMjAwNC0xMS0wMiwgUmF5IEh1ZHNvbiwgaGlzdG9yaWFuL2xpYWlzb24gdG8gdGhlIFVuYWxhc2thCi0jIEhpc3RvcmljIFByZXNlcnZhdGlvbiBDb21taXNzaW9uLCBwcm92aWRlZCB0aGlzIGluZm9ybWF0aW9uLCB3aGljaAotIyBzdWdnZXN0cyB0aGF0IFVuYWxhc2thIGRldmlhdGVkIGZyb20gc3RhdHV0b3J5IHRpbWUgZnJvbSBlYXJseSAxOTY3Ci0jIHBvc3NpYmx5IHVudGlsIDE5ODM6Ci0jCi0jICBNaW51dGVzIG9mIHRoZSBVbmFsYXNrYSBDaXR5IENvdW5jaWwgTWVldGluZywgSmFudWFyeSAxMCwgMTk2NzoKLSMgICJFeGNlcHQgZm9yIFN0LiBQYXVsIGFuZCBBa3V0YW4sIFVuYWxhc2thIGlzIHRoZSBvbmx5IGltcG9ydGFudAotIyAgbG9jYXRpb24gbm90IG9uIEFsYXNrYSBTdGFuZGFyZCBUaW1lLiAgVGhlIGZvbGxvd2luZyByZXNvbHV0aW9uIHdhcwotIyAgbWFkZSBieSBXaWxsaWFtIFJvYmluc29uIGFuZCBzZWNvbmRlZCBieSBIZW5yeSBTd2Fuc29uOiAgQmUgaXQKLSMgIHJlc29sdmVkIHRoYXQgdGhlIENpdHkgb2YgVW5hbGFza2EgaGVyZWJ5IGdvZXMgdG8gQWxhc2thIFN0YW5kYXJkCi0jICBUaW1lIGFzIG9mIG1pZG5pZ2h0IEZyaWRheSwgSmFudWFyeSAxMywgMTk2NyAoMSBBLk0uIFNhdHVyZGF5LAotIyAgSmFudWFyeSAxNCwgQWxhc2thIFN0YW5kYXJkIFRpbWUuKSAgVGhpcyByZXNvbHV0aW9uIHdhcyBwYXNzZWQgd2l0aAotIyAgdGhyZWUgdm90ZXMgZm9yIGFuZCBvbmUgYWdhaW5zdC4iCi0KLSMgSGF3YWlpCi0jCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uOgotIyBBbmQgdGhlbiB0aGVyZSdzIEhhd2FpaS4KLSMgRFNUIHdhcyBvYnNlcnZlZCBmb3Igb25lIGRheSBpbiAxOTMzOwotIyBzdGFuZGFyZCB0aW1lIHdhcyBjaGFuZ2VkIGJ5IGhhbGYgYW4gaG91ciBpbiAxOTQ3OwotIyBpdCdzIGFsd2F5cyBzdGFuZGFyZCBhcyBvZiAxOTg2LgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0OgotIyBTaGFua3Mgc2F5cyB0aGUgMTkzMyBleHBlcmltZW50IGxhc3RlZCBmb3IgdGhyZWUgd2Vla3MuICBHbyB3aXRoIFNoYW5rcy4KLSMKLVpvbmUgUGFjaWZpYy9Ib25vbHVsdQktMTA6MzE6MjYgLQlMTVQJMTkwMCBKYW4gIDEgMTI6MDAKLQkJCS0xMDozMAktCUhTVAkxOTMzIEFwciAzMCAyOjAwCi0JCQktMTA6MzAJMTowMAlIRFQJMTkzMyBNYXkgMjEgMjowMAotCQkJLTEwOjMwCVVTCUglc1QJMTk0NyBKdW4gIDggMjowMAotCQkJLTEwOjAwCS0JSFNUCi0KLSMgTm93IHdlIHR1cm4gdG8gVVMgYXJlYXMgdGhhdCBoYXZlIGRpdmVyZ2VkIGZyb20gdGhlIGNvbnNlbnN1cyBzaW5jZSAxOTcwLgotCi0jIEFyaXpvbmEgbW9zdGx5IHVzZXMgTVNULgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMjApOgotIwotIyBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3Qgb2YgdGhpcyBwYXJhZ3JhcGggaXMgZGVyaXZlZCBmcm9tIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3LmRsYXByLmxpYi5hei51cy9saW5rcy9kYXlsaWdodC5odG0iPgotIyBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZWIgcGFnZSAoMjAwMi0wMS0yMyk8L2E+IG1haW50YWluZWQgYnkgdGhlCi0jIEFyaXpvbmEgU3RhdGUgTGlicmFyeSwgQXJjaGl2ZXMgYW5kIFB1YmxpYyBSZWNvcmRzLgotIyBCZXR3ZWVuIDE5NDQtMDEtMDEgYW5kIDE5NDQtMDQtMDEgdGhlIFN0YXRlIG9mIEFyaXpvbmEgdXNlZCBzdGFuZGFyZAotIyB0aW1lLCBidXQgYnkgZmVkZXJhbCBsYXcgcmFpbHJvYWRzLCBhaXJsaW5lcywgYnVzIGxpbmVzLCBtaWxpdGFyeQotIyBwZXJzb25uZWwsIGFuZCBzb21lIGVuZ2FnZWQgaW4gaW50ZXJzdGF0ZSBjb21tZXJjZSBjb250aW51ZWQgdG8KLSMgb2JzZXJ2ZSB3YXIgKGkuZS4sIGRheWxpZ2h0IHNhdmluZykgdGltZS4gIFRoZSAxOTQ0LTAzLTE3IFBob2VuaXgKLSMgR2F6ZXR0ZSBzYXlzIHRoYXQgd2FzIHRoZSBkYXRlIHRoZSBsYXcgY2hhbmdlZCwgYW5kIHRoYXQgMDQtMDEgd2FzCi0jIHRoZSBkYXRlIHRoZSBzdGF0ZSdzIGNsb2NrcyB3b3VsZCBjaGFuZ2UuICBJbiAxOTQ1IHRoZSBTdGF0ZSBvZgotIyBBcml6b25hIHVzZWQgc3RhbmRhcmQgdGltZSBhbGwgeWVhciwgYWdhaW4gd2l0aCBleGNlcHRpb25zIG9ubHkgYXMKLSMgbWFuZGF0ZWQgYnkgZmVkZXJhbCBsYXcuICBBcml6b25hIG9ic2VydmVkIERTVCBpbiAxOTY3LCBidXQgQXJpem9uYQotIyBMYXdzIDE5NjgsIGNoLiAxODMgKGVmZmVjdGl2ZSAxOTY4LTAzLTIxKSByZXBlYWxlZCBEU1QuCi0jCi0jIFNoYW5rcyBzYXlzIHRoZSAxOTQ0IGV4cGVyaW1lbnQgY2FtZSB0byBhbiBlbmQgb24gMTk0NC0wMy0xNy4KLSMgR28gd2l0aCB0aGUgQXJpem9uYSBTdGF0ZSBMaWJyYXJ5IGluc3RlYWQuCi0KLVpvbmUgQW1lcmljYS9QaG9lbml4CS03OjI4OjE4IC0JTE1UCTE4ODMgTm92IDE4IDExOjMxOjQyCi0JCQktNzowMAlVUwlNJXNUCTE5NDQgSmFuICAxIDAwOjAxCi0JCQktNzowMAktCU1TVAkxOTQ0IEFwciAgMSAwMDowMQotCQkJLTc6MDAJVVMJTSVzVAkxOTQ0IE9jdCAgMSAwMDowMQotCQkJLTc6MDAJLQlNU1QJMTk2NwotCQkJLTc6MDAJVVMJTSVzVAkxOTY4IE1hciAyMQotCQkJLTc6MDAJLQlNU1QKLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5ODgtMDItMTMpOgotIyBBIHdyaXRlciBmcm9tIHRoZSBJbnRlciBUcmliYWwgQ291bmNpbCBvZiBBcml6b25hLCBJbmMuLAotIyBub3RlcyBpbiBwcml2YXRlIGNvcnJlc3BvbmRlbmNlIGRhdGVkIDE5ODctMTItMjggdGhhdCAiUHJlc2VudGx5LCBvbmx5IHRoZQotIyBOYXZham8gTmF0aW9uIHBhcnRpY2lwYXRlcyBpbiB0aGUgRGF5bGlnaHQgU2F2aW5nIFRpbWUgcG9saWN5LCBkdWUgdG8gaXRzCi0jIGxhcmdlIHNpemUgYW5kIGxvY2F0aW9uIGluIHRocmVlIHN0YXRlcy4iICAoVGhlICJvbmx5IiBtZWFucyB0aGF0IG90aGVyCi0jIHRyaWJhbCBuYXRpb25zIGRvbid0IHVzZSBEU1QuKQotCi1MaW5rIEFtZXJpY2EvRGVudmVyIEFtZXJpY2EvU2hpcHJvY2sKLQotIyBTb3V0aGVybiBJZGFobyAoQWRhLCBBZGFtcywgQmFubm9jaywgQmVhciBMYWtlLCBCaW5naGFtLCBCbGFpbmUsCi0jIEJvaXNlLCBCb25uZXZpbGxlLCBCdXR0ZSwgQ2FtYXMsIENhbnlvbiwgQ2FyaWJvdSwgQ2Fzc2lhLCBDbGFyaywKLSMgQ3VzdGVyLCBFbG1vcmUsIEZyYW5rbGluLCBGcmVtb250LCBHZW0sIEdvb2RpbmcsIEplZmZlcnNvbiwgSmVyb21lLAotIyBMZW1oaSwgTGluY29sbiwgTWFkaXNvbiwgTWluaWRva2EsIE9uZWlkYSwgT3d5aGVlLCBQYXlldHRlLCBQb3dlciwKLSMgVGV0b24sIFR3aW4gRmFsbHMsIFZhbGxleSwgV2FzaGluZ3RvbiBjb3VudGllcywgYW5kIHRoZSBzb3V0aGVybgotIyBxdWFydGVyIG9mIElkYWhvIGNvdW50eSkgYW5kIGVhc3Rlcm4gT3JlZ29uIChtb3N0IG9mIE1hbGhldXIgQ291bnR5KQotIyBzd2l0Y2hlZCBmb3VyIHdlZWtzIGxhdGUgaW4gMTk3NC4KLSMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Cb2lzZQktNzo0NDo0OSAtCUxNVAkxODgzIE5vdiAxOCAxMjoxNToxMQotCQkJLTg6MDAJVVMJUCVzVAkxOTIzIE1heSAxMyAyOjAwCi0JCQktNzowMAlVUwlNJXNUCTE5NzQKLQkJCS03OjAwCS0JTVNUCTE5NzQgRmViICAzIDI6MDAKLQkJCS03OjAwCVVTCU0lc1QKLQotIyBJbmRpYW5hCi0jCi0jIEZvciBhIG1hcCBvZiBJbmRpYW5hJ3MgdGltZSB6b25lIHJlZ2lvbnMsIHNlZToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5tY2NzYy5lZHUvdGltZS5odG1sIj4KLSMgV2hhdCB0aW1lIGlzIGl0IGluIEluZGlhbmE/Ci0jIDwvYT4gKDIwMDYtMDMtMDEpCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDgtMTcpOgotIyBTaW5jZSAxOTcwLCBtb3N0IG9mIEluZGlhbmEgaGFzIGJlZW4gbGlrZSBBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzLAotIyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKLSMKLSMgLSBHaWJzb24sIEphc3BlciwgTGFrZSwgTGFQb3J0ZSwgTmV3dG9uLCBQb3J0ZXIsIFBvc2V5LCBTcGVuY2VyLAotIyAgIFZhbmRlbmJ1cmdoLCBhbmQgV2FycmljayBjb3VudGllcyBoYXZlIGJlZW4gbGlrZSBBbWVyaWNhL0NoaWNhZ28uCi0jCi0jIC0gRGVhcmJvcm4gYW5kIE9oaW8gY291bnRpZXMgaGF2ZSBiZWVuIGxpa2UgQW1lcmljYS9OZXdfWW9yay4KLSMKLSMgLSBDbGFyaywgRmxveWQsIGFuZCBIYXJyaXNvbiBjb3VudGllcyBoYXZlIGJlZW4gbGlrZQotIyAgIEFtZXJpY2EvS2VudHVja3kvTG91aXN2aWxsZS4KLSMKLSMgLSBDcmF3Zm9yZCwgRGF2aWVzcywgRHVib2lzLCBLbm94LCBNYXJ0aW4sIFBlcnJ5LCBQaWtlLCBQdWxhc2tpLCBTdGFya2UsCi0jICAgYW5kIFN3aXR6ZXJsYW5kIGNvdW50aWVzIGhhdmUgdGhlaXIgb3duIHRpbWUgem9uZSBoaXN0b3JpZXMgYXMgbm90ZWQgYmVsb3cuCi0jCi0jIFNoYW5rcyBwYXJ0aXRpb25lZCBJbmRpYW5hIGludG8gMzQ1IHJlZ2lvbnMsIGVhY2ggd2l0aCBpdHMgb3duIHRpbWUgaGlzdG9yeSwKLSMgYW5kIHdyb3RlIGBgRXZlbiBuZXdzcGFwZXIgcmVwb3J0cyBwcmVzZW50IGNvbnRyYWRpY3RvcnkgaW5mb3JtYXRpb24uJycKLSMgVGhvc2UgSG9vc2llcnMhICBTdWNoIGEgZmxpZ2h0eSBhbmQgY2hhbmdlYWJsZSBwZW9wbGUhCi0jIEZvcnR1bmF0ZWx5LCBtb3N0IG9mIHRoZSBjb21wbGV4aXR5IG9jY3VycmVkIGJlZm9yZSBvdXIgY3V0b2ZmIGRhdGUgb2YgMTk3MC4KLSMKLSMgT3RoZXIgdGhhbiBJbmRpYW5hcG9saXMsIHRoZSBJbmRpYW5hIHBsYWNlIG5hbWVzIGFyZSBzbyBub25kZXNjcmlwdAotIyB0aGF0IHRoZXkgd291bGQgYmUgYW1iaWd1b3VzIGlmIHdlIGxlZnQgdGhlbSBhdCB0aGUgYEFtZXJpY2EnIGxldmVsLgotIyBTbyB3ZSByZWx1Y3RhbnRseSBwdXQgdGhlbSBhbGwgaW4gYSBzdWJkaXJlY3RvcnkgYEFtZXJpY2EvSW5kaWFuYScuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNS0wOC0xNik6Ci0jIGh0dHA6Ly93d3cubWNjc2MuZWR1L3RpbWUuaHRtbCBzYXlzIHRoYXQgSW5kaWFuYSB3aWxsIHVzZSBEU1Qgc3RhcnRpbmcgMjAwNi4KLQotIyBGcm9tIE5hdGhhbiBTdHJhdHRvbiBUcmVhZHdheSAoMjAwNi0wMy0zMCk6Ci0jIGh0dHA6Ly93d3cuZG90Lmdvdi9hZmZhaXJzL2RvdDA0MDYuaHRtIFszNzA1IEJdCi0jIEZyb20gRGVib3JhaCBHb2xkc21pdGggKDIwMDYtMDEtMTgpOgotIyBodHRwOi8vZG1zZXMuZG90Lmdvdi9kb2NpbWFnZXMvcGRmOTUvMzgyMzI5X3dlYi5wZGYgWzIuOSBNQl0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMS0yMCk6Ci0jIEl0IHNheXMgIkRPVCBpcyByZWxvY2F0aW5nIHRoZSB0aW1lIHpvbmUgYm91bmRhcnkgaW4gSW5kaWFuYSB0byBtb3ZlIFN0YXJrZSwKLSMgUHVsYXNraSwgS25veCwgRGF2aWVzcywgTWFydGluLCBQaWtlLCBEdWJvaXMsIGFuZCBQZXJyeSBDb3VudGllcyBmcm9tIHRoZQotIyBFYXN0ZXJuIFRpbWUgWm9uZSB0byB0aGUgQ2VudHJhbCBUaW1lIFpvbmUuLi4uIFRoZSBlZmZlY3RpdmUgZGF0ZSBvZgotIyB0aGlzIHJ1bGUgaXMgMjpPTyBhLm0uIEVTVCBTdW5kYXksIEFwcmlsIDIsIDIwMDYsIHdoaWNoIGlzIHRoZQotIyBjaGFuZ2VvdmVyIGRhdGUgZnJvbSBzdGFuZGFyZCB0aW1lIHRvIERheWxpZ2h0IFNhdmluZyBUaW1lLiIKLSMgU3RyaWN0bHkgc3BlYWtpbmcsIHRoaXMgbWVhbnMgdGhlIGFmZmVjdGVkIGNvdW50aWVzIHdpbGwgY2hhbmdlIHRoZWlyCi0jIGNsb2NrcyB0d2ljZSB0aGF0IG5pZ2h0LCBidXQgdGhpcyBvYnZpb3VzbHkgaXMgaW4gZXJyb3IuICBUaGUgaW50ZW50Ci0jIGlzIHRoYXQgMDE6NTk6NTkgRVNUIGJlIGZvbGxvd2VkIGJ5IDAyOjAwOjAwIENEVC4KLQotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA3LTAyLTEwKToKLSMgVGhlIEFzc29jaWF0ZWQgUHJlc3MgaGFzIGJlZW4gcmVwb3J0aW5nIHRoYXQgUHVsYXNraSBDb3VudHksIEluZGlhbmEgaXMKLSMgZ29pbmcgdG8gc3dpdGNoIGZyb20gQ2VudHJhbCB0byBFYXN0ZXJuIFRpbWUgb24gTWFyY2ggMTEsIDIwMDcuLi4uCi0jIGh0dHA6Ly93d3cuaW5keXN0YXIuY29tL2FwcHMvcGJjcy5kbGwvYXJ0aWNsZT9BSUQ9LzIwMDcwMjA3L0xPQ0FMMTkwMTA4LzcwMjA3MDUyNC8wL0xPQ0FMCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZSBJbmRpYW5hcG9saXMgMTk0MQlvbmx5CS0JSnVuCTIyCTI6MDAJMTowMAlECi1SdWxlIEluZGlhbmFwb2xpcyAxOTQxCTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBJbmRpYW5hcG9saXMgMTk0NgkxOTU0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL0luZGlhbmFwb2xpcyAtNTo0NDozOCAtIExNVCAxODgzIE5vdiAxOCAxMjoxNToyMgotCQkJLTY6MDAJVVMJQyVzVAkxOTIwCi0JCQktNjowMCBJbmRpYW5hcG9saXMgQyVzVAkxOTQyCi0JCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIEluZGlhbmFwb2xpcyBDJXNUCTE5NTUgQXByIDI0IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NTcgU2VwIDI5IDI6MDAKLQkJCS02OjAwCS0JQ1NUCTE5NTggQXByIDI3IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjkKLQkJCS01OjAwCVVTCUUlc1QJMTk3MQotCQkJLTU6MDAJLQlFU1QJMjAwNgotCQkJLTU6MDAJVVMJRSVzVAotIwotIyBFYXN0ZXJuIENyYXdmb3JkIENvdW50eSwgSW5kaWFuYSwgbGVmdCBpdHMgY2xvY2tzIGFsb25lIGluIDE5NzQsCi0jIGFzIHdlbGwgYXMgZnJvbSAxOTc2IHRocm91Z2ggMjAwNS4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUgotUnVsZQlNYXJlbmdvCTE5NTEJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU1hcmVuZ28JMTk1MQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTWFyZW5nbwkxOTU0CTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlNYXJlbmdvCTE5NTQJMTk2MAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9NYXJlbmdvIC01OjQ1OjIzIC0JTE1UCTE4ODMgTm92IDE4IDEyOjE0OjM3Ci0JCQktNjowMAlVUwlDJXNUCTE5NTEKLQkJCS02OjAwCU1hcmVuZ28JQyVzVAkxOTYxIEFwciAzMCAyOjAwCi0JCQktNTowMAktCUVTVAkxOTY5Ci0JCQktNTowMAlVUwlFJXNUCTE5NzQgSmFuICA2IDI6MDAKLQkJCS02OjAwCTE6MDAJQ0RUCTE5NzQgT2N0IDI3IDI6MDAKLQkJCS01OjAwCVVTCUUlc1QJMTk3NgotCQkJLTU6MDAJLQlFU1QJMjAwNgotCQkJLTU6MDAJVVMJRSVzVAotIwotIyBEYXZpZXNzLCBEdWJvaXMsIEtub3gsIGFuZCBNYXJ0aW4gQ291bnRpZXMsIEluZGlhbmEsCi0jIHN3aXRjaGVkIGZyb20gZWFzdGVybiB0byBjZW50cmFsIHRpbWUgaW4gQXByaWwgMjAwNiwgdGhlbiBzd2l0Y2hlZCBiYWNrCi0jIGluIE5vdmVtYmVyIDIwMDcuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUgVmluY2VubmVzCTE5NDYJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlIFZpbmNlbm5lcwkxOTQ2CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBWaW5jZW5uZXMJMTk1MwkxOTU0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgVmluY2VubmVzCTE5NTMJMTk1OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIFZpbmNlbm5lcwkxOTU1CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUgVmluY2VubmVzCTE5NTYJMTk2MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlIFZpbmNlbm5lcwkxOTYwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBWaW5jZW5uZXMJMTk2MQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgVmluY2VubmVzCTE5NjIJMTk2MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9WaW5jZW5uZXMgLTU6NTA6MDcgLSBMTVQJMTg4MyBOb3YgMTggMTI6MDk6NTMKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAgVmluY2VubmVzCUMlc1QJMTk2NCBBcHIgMjYgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTcxCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCTIwMDcgTm92ICA0IDI6MDAKLQkJCS01OjAwCVVTCUUlc1QKLSMKLSMgUGVycnkgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluIEFwcmlsIDIwMDYuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUgUGVycnkJMTk0Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgUGVycnkJMTk0Nglvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgUGVycnkJMTk1MwkxOTU0CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgUGVycnkJMTk1MwkxOTU5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgUGVycnkJMTk1NQlvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlECi1SdWxlIFBlcnJ5CTE5NTYJMTk2MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlIFBlcnJ5CTE5NjAJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIFBlcnJ5CTE5NjEJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlIFBlcnJ5CTE5NjIJMTk2MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvSW5kaWFuYS9UZWxsX0NpdHkgLTU6NDc6MDMgLSBMTVQJMTg4MyBOb3YgMTggMTI6MTI6NTcKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAgUGVycnkJQyVzVAkxOTY0IEFwciAyNiAyOjAwCi0JCQktNTowMAktCUVTVAkxOTY5Ci0JCQktNTowMAlVUwlFJXNUCTE5NzEKLQkJCS01OjAwCS0JRVNUCTIwMDYgQXByICAyIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QKLSMKLSMgUGlrZSBDb3VudHksIEluZGlhbmEgbW92ZWQgZnJvbSBjZW50cmFsIHRvIGVhc3Rlcm4gdGltZSBpbiAxOTc3LAotIyB0aGVuIHN3aXRjaGVkIGJhY2sgaW4gMjAwNiwgdGhlbiBzd2l0Y2hlZCBiYWNrIGFnYWluIGluIDIwMDcuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJUGlrZQkxOTU1CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUJUGlrZQkxOTU1CTE5NjAJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlQaWtlCTE5NTYJMTk2NAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVBpa2UJMTk2MQkxOTY0CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL1BldGVyc2J1cmcgLTU6NDk6MDcgLSBMTVQJMTg4MyBOb3YgMTggMTI6MTA6NTMKLQkJCS02OjAwCVVTCUMlc1QJMTk1NQotCQkJLTY6MDAJUGlrZQlDJXNUCTE5NjUgQXByIDI1IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjYgT2N0IDMwIDI6MDAKLQkJCS02OjAwCVVTCUMlc1QJMTk3NyBPY3QgMzAgMjowMAotCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkyMDA3IE5vdiAgNCAyOjAwCi0JCQktNTowMAlVUwlFJXNUCi0jCi0jIFN0YXJrZSBDb3VudHksIEluZGlhbmEgbW92ZWQgZnJvbSBjZW50cmFsIHRvIGVhc3Rlcm4gdGltZSBpbiAxOTkxLAotIyB0aGVuIHN3aXRjaGVkIGJhY2sgaW4gMjAwNi4KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTEtMTAtMjgpOgotIyBBbiBhcnRpY2xlIG9uIHBhZ2UgQTMgb2YgdGhlIFN1bmRheSwgMTk5MS0xMC0yNyBXYXNoaW5ndG9uIFBvc3QKLSMgbm90ZXMgdGhhdCBTdGFya2UgQ291bnR5IHN3aXRjaGVkIGZyb20gQ2VudHJhbCB0aW1lIHRvIEVhc3Rlcm4gdGltZSBhcyBvZgotIyAxOTkxLTEwLTI3LgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCVN0YXJrZQkxOTQ3CTE5NjEJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlTdGFya2UJMTk0NwkxOTU0CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3RhcmtlCTE5NTUJMTk1NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN0YXJrZQkxOTU3CTE5NTgJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlTdGFya2UJMTk1OQkxOTYxCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL0tub3ggLTU6NDY6MzAgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTM6MzAKLQkJCS02OjAwCVVTCUMlc1QJMTk0NwotCQkJLTY6MDAJU3RhcmtlCUMlc1QJMTk2MiBBcHIgMjkgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2MyBPY3QgMjcgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkxOTkxIE9jdCAyNyAyOjAwCi0JCQktNTowMAktCUVTVAkyMDA2IEFwciAgMiAyOjAwCi0JCQktNjowMAlVUwlDJXNUCi0jCi0jIFB1bGFza2kgQ291bnR5LCBJbmRpYW5hLCBzd2l0Y2hlZCBmcm9tIGVhc3Rlcm4gdG8gY2VudHJhbCB0aW1lIGluCi0jIEFwcmlsIDIwMDYgYW5kIHRoZW4gc3dpdGNoZWQgYmFjayBpbiBNYXJjaCAyMDA3LgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCVB1bGFza2kJMTk0NgkxOTYwCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJUHVsYXNraQkxOTQ2CTE5NTQJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlQdWxhc2tpCTE5NTUJMTk1NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVB1bGFza2kJMTk1NwkxOTYwCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9JbmRpYW5hL1dpbmFtYWMgLTU6NDY6MjUgLSBMTVQJMTg4MyBOb3YgMTggMTI6MTM6MzUKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAJUHVsYXNraQlDJXNUCTE5NjEgQXByIDMwIDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjkKLQkJCS01OjAwCVVTCUUlc1QJMTk3MQotCQkJLTU6MDAJLQlFU1QJMjAwNiBBcHIgIDIgMjowMAotCQkJLTY6MDAJVVMJQyVzVAkyMDA3IE1hciAxMSAyOjAwCi0JCQktNTowMAlVUwlFJXNUCi0jCi0jIFN3aXR6ZXJsYW5kIENvdW50eSwgSW5kaWFuYSwgZGlkIG5vdCBvYnNlcnZlIERTVCBmcm9tIDE5NzMgdGhyb3VnaCAyMDA1LgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0luZGlhbmEvVmV2YXkgLTU6NDA6MTYgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTk6NDQKLQkJCS02OjAwCVVTCUMlc1QJMTk1NCBBcHIgMjUgMjowMAotCQkJLTU6MDAJLQlFU1QJMTk2OQotCQkJLTU6MDAJVVMJRSVzVAkxOTczCi0JCQktNTowMAktCUVTVAkyMDA2Ci0JCQktNTowMAlVUwlFJXNUCi0KLSMgUGFydCBvZiBLZW50dWNreSBsZWZ0IGl0cyBjbG9ja3MgYWxvbmUgaW4gMTk3NC4KLSMgVGhpcyBhbHNvIGluY2x1ZGVzIENsYXJrLCBGbG95ZCwgYW5kIEhhcnJpc29uIGNvdW50aWVzIGluIEluZGlhbmEuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUgTG91aXN2aWxsZQkxOTIxCW9ubHkJLQlNYXkJMQkyOjAwCTE6MDAJRAotUnVsZSBMb3Vpc3ZpbGxlCTE5MjEJb25seQktCVNlcAkxCTI6MDAJMAlTCi1SdWxlIExvdWlzdmlsbGUJMTk0MQkxOTYxCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgTG91aXN2aWxsZQkxOTQxCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBMb3Vpc3ZpbGxlCTE5NDYJb25seQktCUp1bgkyCTI6MDAJMAlTCi1SdWxlIExvdWlzdmlsbGUJMTk1MAkxOTU1CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUgTG91aXN2aWxsZQkxOTU2CTE5NjAJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUgLTU6NDM6MDIgLQlMTVQJMTg4MyBOb3YgMTggMTI6MTY6NTgKLQkJCS02OjAwCVVTCUMlc1QJMTkyMQotCQkJLTY6MDAgTG91aXN2aWxsZSBDJXNUCTE5NDIKLQkJCS02OjAwCVVTCUMlc1QJMTk0NgotCQkJLTY6MDAgTG91aXN2aWxsZSBDJXNUCTE5NjEgSnVsIDIzIDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NjgKLQkJCS01OjAwCVVTCUUlc1QJMTk3NCBKYW4gIDYgMjowMAotCQkJLTY6MDAJMTowMAlDRFQJMTk3NCBPY3QgMjcgMjowMAotCQkJLTU6MDAJVVMJRSVzVAotIwotIyBXYXluZSBDb3VudHksIEtlbnR1Y2t5Ci0jCi0jIEZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYWtlLWN1bWJlcmxhbmQuY29tL2xpZmUvYXJjaGl2ZS9uZXdzOTkwMTI5dGltZS5zaHRtbCI+Ci0jIExha2UgQ3VtYmVybGFuZCBMSUZFCi0jIDwvYT4gKDE5OTktMDEtMjkpIHZpYSBXS1lNLTEwMS43OgotIyBDbGludG9uIENvdW50eSBoYXMgam9pbmVkIFdheW5lIENvdW50eSBpbiBhc2tpbmcgdGhlIERvVCB0byBjaGFuZ2UgZnJvbQotIyB0aGUgQ2VudHJhbCB0byB0aGUgRWFzdGVybiB0aW1lIHpvbmUuLi4uICBUaGUgV2F5bmUgQ291bnR5IGdvdmVybm1lbnQgbWFkZQotIyB0aGUgc2FtZSByZXF1ZXN0IGluIERlY2VtYmVyLiAgQW5kIHdoaWxlIFJ1c3NlbGwgQ291bnR5IG9mZmljaWFscyBoYXZlIG5vdAotIyB0YWtlbiBhY3Rpb24sIHRoZSBtYWpvcml0eSBvZiByZXNwb25kZW50cyB0byBhIHBvbGwgY29uZHVjdGVkIHRoZXJlIGluCi0jIEF1Z3VzdCBpbmRpY2F0ZWQgdGhleSB3b3VsZCBsaWtlIHRvIGNoYW5nZSB0byAiZmFzdCB0aW1lIiBhbHNvLgotIyBUaGUgdGhyZWUgTGFrZSBDdW1iZXJsYW5kIGNvdW50aWVzIGFyZSB0aGUgZmFydGhlc3QgZWFzdCBvZiBhbnkgVS5TLgotIyBsb2NhdGlvbiBpbiB0aGUgQ2VudHJhbCB0aW1lIHpvbmUuCi0jCi0jIEZyb20gUmljaCBXYWxlcyAoMjAwMC0wOC0yOSk6Ci0jIEFmdGVyIHByb2xvbmdlZCBkZWJhdGUsIGFuZCBkZXNwaXRlIGNvbnRpbnVpbmcgZGVlcCBkaWZmZXJlbmNlcyBvZiBvcGluaW9uLAotIyBXYXluZSBDb3VudHkgKGNlbnRyYWwgS2VudHVja3kpIGlzIHN3aXRjaGluZyBmcm9tIENlbnRyYWwgKC0wNjAwKSB0byBFYXN0ZXJuCi0jICgtMDUwMCkgdGltZS4gIFRoZXkgd29uJ3QgImZhbGwgYmFjayIgdGhpcyB5ZWFyLiAgU2VlIFNhcmEgU2hpcGxleSwKLSMgVGhlIGRpZmZlcmVuY2UgYW4gaG91ciBtYWtlcywgTmFuZG8gVGltZXMgKDIwMDAtMDgtMjkgMTU6MzMgLTA0MDApLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA3LTE2KToKLSMgVGhlIGZpbmFsIHJ1bGUgd2FzIHB1Ymxpc2hlZCBpbiB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTIwMDBfcmVnaXN0ZXImZG9jaWQ9ZnIxN2F1MDAtMjIiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY1LCAxNjAgKDIwMDAtMDgtMTcpLCBwYWdlIDUwMTU0LTUwMTU4LgotIyA8L2E+Ci0jCi1ab25lIEFtZXJpY2EvS2VudHVja3kvTW9udGljZWxsbyAtNTozOToyNCAtIExNVAkxODgzIE5vdiAxOCAxMjoyMDozNgotCQkJLTY6MDAJVVMJQyVzVAkxOTQ2Ci0JCQktNjowMAktCUNTVAkxOTY4Ci0JCQktNjowMAlVUwlDJXNUCTIwMDAgT2N0IDI5ICAyOjAwCi0JCQktNTowMAlVUwlFJXNUCi0KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTA4LTMwKToKLSMgSGVyZSAuLi4gYXJlIGFsbCB0aGUgY2hhbmdlcyBpbiB0aGUgVVMgc2luY2UgMTk4NS4KLSMgS2Vhcm55IENvdW50eSwgS1MgKHB1dCBhbGwgb2YgY291bnR5IG9uIGNlbnRyYWw7Ci0jCXByZXZpb3VzbHkgc3BsaXQgYmV0d2VlbiBNU1QgYW5kIENTVCkgLi4uIDE5OTAtMTAKLSMgU3RhcmtlIENvdW50eSwgSU4gKGZyb20gQ1NUIHRvIEVTVCkgLi4uIDE5OTEtMTAKLSMgT2xpdmVyIENvdW50eSwgTkQgKGZyb20gTVNUIHRvIENTVCkgLi4uIDE5OTItMTAKLSMgV2VzdCBXZW5kb3ZlciwgTlYgKGZyb20gUFNUIFRPIE1TVCkgLi4uIDE5OTktMTAKLSMgV2F5bmUgQ291bnR5LCBLWSAoZnJvbSBDU1QgdG8gRVNUKSAuLi4gMjAwMC0xMAotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTA3LTE3KToKLSMgV2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgbGluZSB1c2VkIHRvIGJlIHdpdGhpbiBLZWFybnkgQ291bnR5LCBLUywKLSMgc28gb21pdCB0aGF0IGNoYW5nZSBmb3Igbm93LgotIyBTZWUgQW1lcmljYS9JbmRpYW5hL0tub3ggZm9yIHRoZSBTdGFya2UgQ291bnR5LCBJTiBjaGFuZ2UuCi0jIFNlZSBBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIgZm9yIHRoZSBPbGl2ZXIgQ291bnR5LCBORCBjaGFuZ2UuCi0jIFdlc3QgV2VuZG92ZXIsIE5WIG9mZmljaWFsbHkgc3dpdGNoZWQgZnJvbSBQYWNpZmljIHRvIG1vdW50YWluIHRpbWUgb24KLSMgMTk5OS0xMC0zMS4gIFNlZSB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL2Zyd2ViZ2F0ZS5hY2Nlc3MuZ3BvLmdvdi9jZ2ktYmluL2dldGRvYy5jZ2k/ZGJuYW1lPTE5OTlfcmVnaXN0ZXImZG9jaWQ9ZnIyMW9jOTktMTUiPgotIyBGZWRlcmFsIFJlZ2lzdGVyIDY0LCAyMDMgKDE5OTktMTAtMjEpLCBwYWdlIDU2NzA1LTU2NzA3LgotIyA8L2E+Ci0jIEhvd2V2ZXIsIHRoZSBGZWRlcmFsIFJlZ2lzdGVyIHNheXMgdGhhdCBXZXN0IFdlbmRvdmVyIGFscmVhZHkgb3BlcmF0ZWQKLSMgb24gbW91bnRhaW4gdGltZSwgYW5kIHRoZSBydWxlIG1lcmVseSBtYWRlIHRoaXMgb2ZmaWNpYWw7Ci0jIGhlbmNlIGEgc2VwYXJhdGUgdHogZW50cnkgaXMgbm90IG5lZWRlZC4KLQotIyBNaWNoaWdhbgotIwotIyBGcm9tIEJvYiBEZXZpbmUgKDE5ODgtMDEtMjgpOgotIyBNaWNoaWdhbiBkaWRuJ3Qgb2JzZXJ2ZSBEU1QgZnJvbSAxOTY4IHRvIDE5NzMuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMDMtMzEpOgotIyBTaGFua3Mgd3JpdGVzIHRoYXQgTWljaGlnYW4gc3RhcnRlZCB1c2luZyBzdGFuZGFyZCB0aW1lIG9uIDE4ODUtMDktMTgsCi0jIGJ1dCBIb3dzZSB3cml0ZXMgKHBwIDEyNC0xMjUsIHJlZmVycmluZyB0byBQb3B1bGFyIEFzdHJvbm9teSwgMTkwMS0wMSkKLSMgdGhhdCBEZXRyb2l0IGtlcHQKLSMKLSMJbG9jYWwgdGltZSB1bnRpbCAxOTAwIHdoZW4gdGhlIENpdHkgQ291bmNpbCBkZWNyZWVkIHRoYXQgY2xvY2tzIHNob3VsZAotIwliZSBwdXQgYmFjayB0d2VudHktZWlnaHQgbWludXRlcyB0byBDZW50cmFsIFN0YW5kYXJkIFRpbWUuICBIYWxmIHRoZQotIwljaXR5IG9iZXllZCwgaGFsZiByZWZ1c2VkLiAgQWZ0ZXIgY29uc2lkZXJhYmxlIGRlYmF0ZSwgdGhlIGRlY2lzaW9uCi0jCXdhcyByZXNjaW5kZWQgYW5kIHRoZSBjaXR5IHJldmVydGVkIHRvIFN1biB0aW1lLiAgQSBkZXJpc2l2ZSBvZmZlciB0bwotIwllcmVjdCBhIHN1bmRpYWwgaW4gZnJvbnQgb2YgdGhlIGNpdHkgaGFsbCB3YXMgcmVmZXJyZWQgdG8gdGhlCi0jCUNvbW1pdHRlZSBvbiBTZXdlcnMuICBUaGVuLCBpbiAxOTA1LCBDZW50cmFsIHRpbWUgd2FzIGFkb3B0ZWQKLSMJYnkgY2l0eSB2b3RlLgotIwotIyBUaGlzIHN0b3J5IGlzIHRvbyBlbnRlcnRhaW5pbmcgdG8gYmUgZmFsc2UsIHNvIGdvIHdpdGggSG93c2Ugb3ZlciBTaGFua3MuCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDYpOgotIyBHYXJsYW5kICgxOTI3KSB3cml0ZXMgYGBDbGV2ZWxhbmQgYW5kIERldHJvaXQgYWR2YW5jZWQgdGhlaXIgY2xvY2tzCi0jIG9uZSBob3VyIGluIDE5MTQuJycgIFRoaXMgY2hhbmdlIGlzIG5vdCBpbiBTaGFua3MuICBXZSBoYXZlIG5vIG1vcmUKLSMgaW5mbywgc28gb21pdCB0aGlzIGZvciBub3cuCi0jCi0jIE1vc3Qgb2YgTWljaGlnYW4gb2JzZXJ2ZWQgRFNUIGZyb20gMTk3MyBvbiwgYnV0IHdhcyBhIGJpdCBsYXRlIGluIDE5NzUuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJRGV0cm9pdAkxOTQ4CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlEZXRyb2l0CTE5NDgJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCURldHJvaXQJMTk2Nwlvbmx5CS0JSnVuCTE0CTI6MDAJMTowMAlECi1SdWxlCURldHJvaXQJMTk2Nwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9EZXRyb2l0CS01OjMyOjExIC0JTE1UCTE5MDUKLQkJCS02OjAwCS0JQ1NUCTE5MTUgTWF5IDE1IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NDIKLQkJCS01OjAwCVVTCUUlc1QJMTk0NgotCQkJLTU6MDAJRGV0cm9pdAlFJXNUCTE5NzMKLQkJCS01OjAwCVVTCUUlc1QJMTk3NQotCQkJLTU6MDAJLQlFU1QJMTk3NSBBcHIgMjcgMjowMAotCQkJLTU6MDAJVVMJRSVzVAotIwotIyBEaWNraW5zb24sIEdvZ2ViaWMsIElyb24sIGFuZCBNZW5vbWluZWUgQ291bnRpZXMsIE1pY2hpZ2FuLAotIyBzd2l0Y2hlZCBmcm9tIEVTVCB0byBDU1QvQ0RUIGluIDE5NzMuCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUgTWVub21pbmVlCTE5NDYJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlIE1lbm9taW5lZQkxOTQ2CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZSBNZW5vbWluZWUJMTk2Nglvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUgTWVub21pbmVlCTE5NjYJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvTWVub21pbmVlCS01OjUwOjI3IC0JTE1UCTE4ODUgU2VwIDE4IDEyOjAwCi0JCQktNjowMAlVUwlDJXNUCTE5NDYKLQkJCS02OjAwIE1lbm9taW5lZQlDJXNUCTE5NjkgQXByIDI3IDI6MDAKLQkJCS01OjAwCS0JRVNUCTE5NzMgQXByIDI5IDI6MDAKLQkJCS02OjAwCVVTCUMlc1QKLQotIyBOYXZhc3NhCi0jIGFkbWluaXN0ZXJlZCBieSB0aGUgVVMgRmlzaCBhbmQgV2lsZGxpZmUgU2VydmljZQotIyBjbGFpbWVkIGJ5IFVTIHVuZGVyIHRoZSBwcm92aXNpb25zIG9mIHRoZSAxODU2IEd1YW5vIElzbGFuZHMgQWN0Ci0jIGFsc28gY2xhaW1lZCBieSBIYWl0aQotIyBvY2N1cGllZCAxODU3LzE5MDAgYnkgdGhlIE5hdmFzc2EgUGhvc3BoYXRlIENvCi0jIFVTIGxpZ2h0aG91c2UgMTkxNy8xOTk2LTA5Ci0jIGN1cnJlbnRseSB1bmluaGFiaXRlZAotIyBzZWUgTWFyayBGaW5lbWFuLCBgYEFuIElzbGUgUmljaCBpbiBHdWFubyBhbmQgRGlzY29yZCcnLAotIyBfTG9zIEFuZ2VsZXMgVGltZXNfICgxOTk4LTExLTEwKSwgQTEsIEExMDsgaXQgY2l0ZXMKLSMgSmltbXkgU2thZ2dzLCBfVGhlIEdyZWF0IEd1YW5vIFJ1c2hfICgxOTk0KS4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBBIGdvb2Qgc291cmNlIGZvciB0aW1lIHpvbmUgaGlzdG9yaWNhbCBkYXRhIG91dHNpZGUgdGhlIFUuUy4gaXMKLSMgVGhvbWFzIEcuIFNoYW5rcyBhbmQgUmlxdWUgUG90dGVuZ2VyLCBUaGUgSW50ZXJuYXRpb25hbCBBdGxhcyAoNnRoIGVkaXRpb24pLAotIyBTYW4gRGllZ286IEFDUyBQdWJsaWNhdGlvbnMsIEluYy4gKDIwMDMpLgotIwotIyBHd2lsbGltIExhdyB3cml0ZXMgdGhhdCBhIGdvb2Qgc291cmNlCi0jIGZvciByZWNlbnQgdGltZSB6b25lIGRhdGEgaXMgdGhlIEludGVybmF0aW9uYWwgQWlyIFRyYW5zcG9ydAotIyBBc3NvY2lhdGlvbidzIFN0YW5kYXJkIFNjaGVkdWxlcyBJbmZvcm1hdGlvbiBNYW51YWwgKElBVEEgU1NJTSksCi0jIHB1Ymxpc2hlZCBzZW1pYW5udWFsbHkuICBMYXcgc2VudCBpbiBzZXZlcmFsIGhlbHBmdWwgc3VtbWFyaWVzCi0jIG9mIHRoZSBJQVRBJ3MgZGF0YSBhZnRlciAxOTkwLgotIwotIyBFeGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkLCBTaGFua3MgJiBQb3R0ZW5nZXIgaXMgdGhlIHNvdXJjZSBmb3IKLSMgZW50cmllcyB0aHJvdWdoIDE5OTAsIGFuZCBJQVRBIFNTSU0gaXMgdGhlIHNvdXJjZSBmb3IgZW50cmllcyBhZnRlcndhcmRzLgotIwotIyBPdGhlciBzb3VyY2VzIG9jY2FzaW9uYWxseSB1c2VkIGluY2x1ZGU6Ci0jCi0jCUVkd2FyZCBXLiBXaGl0bWFuLCBXb3JsZCBUaW1lIERpZmZlcmVuY2VzLAotIwlXaGl0bWFuIFB1Ymxpc2hpbmcgQ28sIDIgTmlhZ2FyYSBBdiwgRWFsaW5nLCBMb25kb24gKHVuZGF0ZWQpLAotIwl3aGljaCBJIGZvdW5kIGluIHRoZSBVQ0xBIGxpYnJhcnkuCi0jCi0jCTxhIGhyZWY9Imh0dHA6Ly93d3cucGV0dHN3b29kdmlsbGFnZS5jby51ay9EYXlsaWdodF9TYXZpbmdzX1dpbGxpYW1fV2lsbGV0dC5wZGYiPgotIwlXaWxsaWFtIFdpbGxldHQsIFRoZSBXYXN0ZSBvZiBEYXlsaWdodCwgMTl0aCBlZGl0aW9uCi0jCTwvYT4gKDE5MTQtMDMpCi0jCi0jIFNlZSB0aGUgYGV1cm9wZScgZmlsZSBmb3IgR3JlZW5sYW5kLgotCi0jIENhbmFkYQotCi0jIEZyb20gQWxhaW4gTGFCb250PGUnPiAoMTk5NC0xMS0xNCk6Ci0jIEkgcG9zdCBoZXJlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBzdGFuZGFyZGl6ZWQgaW4gQ2FuYWRhCi0jIGZvciBib3RoIEVuZ2xpc2ggYW5kIEZyZW5jaCBpbiB0aGUgQ0FOL0NTQS1aMjM0LjQtODkgc3RhbmRhcmQuLi4uCi0jCi0jCVVUQwlTdGFuZGFyZCB0aW1lCURheWxpZ2h0IHNhdmluZ3MgdGltZQotIwlvZmZzZXQJRnJlbmNoCUVuZ2xpc2gJRnJlbmNoCUVuZ2xpc2gKLSMJLTI6MzAJLQktCUhBVAlORFQKLSMJLTMJLQktCUhBQQlBRFQKLSMJLTM6MzAJSE5UCU5TVAktCS0KLSMJLTQJSE5BCUFTVAlIQUUJRURUCi0jCS01CUhORQlFU1QJSEFDCUNEVAotIwktNglITkMJQ1NUCUhBUglNRFQKLSMJLTcJSE5SCU1TVAlIQVAJUERUCi0jCS04CUhOUAlQU1QJSEFZCVlEVAotIwktOQlITlkJWVNUCS0JLQotIwotIwlITjogSGV1cmUgTm9ybWFsZQlTVDogU3RhbmRhcmQgVGltZQotIwlIQTogSGV1cmUgQXZhbmM8ZSc+ZQlEVDogRGF5bGlnaHQgc2F2aW5nIFRpbWUKLSMKLSMJQTogZGUgbCdBdGxhbnRpcXVlCUF0bGFudGljCi0jCUM6IGR1IENlbnRyZQkJQ2VudHJhbAotIwlFOiBkZSBsJ0VzdAkJRWFzdGVybgotIwlNOgkJCU1vdW50YWluCi0jCU46CQkJTmV3Zm91bmRsYW5kCi0jCVA6IGR1IFBhY2lmaXF1ZQkJUGFjaWZpYwotIwlSOiBkZXMgUm9jaGV1c2VzCi0jCVQ6IGRlIFRlcnJlLU5ldXZlCi0jCVk6IGR1IFl1a29uCQlZdWtvbgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk0LTExLTIyKToKLSMgQWxhcywgdGhpcyBzb3J0IG9mIHRoaW5nIG11c3QgYmUgaGFuZGxlZCBieSBsb2NhbGl6YXRpb24gc29mdHdhcmUuCi0KLSMgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZSBkYXRhIGZvciBDYW5hZGEgYXJlIGFsbCBmcm9tIFNoYW5rcwotIyAmIFBvdHRlbmdlci4KLQotIyBGcm9tIENocmlzIFdhbHRvbiAoMjAwNi0wNC0wMSwgMjAwNi0wNC0yNSwgMjAwNi0wNi0yNiwgMjAwNy0wMS0zMSwKLSMgMjAwNy0wMy0wMSk6Ci0jIFRoZSBCcml0aXNoIENvbHVtYmlhIGdvdmVybm1lbnQgYW5ub3VuY2VkIHllc3RlcmRheSB0aGF0IGl0IHdpbGwKLSMgYWRqdXN0IGRheWxpZ2h0IHNhdmluZ3MgbmV4dCB5ZWFyIHRvIGFsaWduIHdpdGggY2hhbmdlcyBpbiB0aGUKLSMgVS5TLiBhbmQgdGhlIHJlc3Qgb2YgQ2FuYWRhLi4uLgotIyBodHRwOi8vd3d3Mi5uZXdzLmdvdi5iYy5jYS9uZXdzX3JlbGVhc2VzXzIwMDUtMjAwOS8yMDA2QUcwMDE0LTAwMDMzMC5odG0KLSMgLi4uCi0jIE5vdmEgU2NvdGlhCi0jIERheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgYmUgZXh0ZW5kZWQgYnkgZm91ciB3ZWVrcyBzdGFydGluZyBpbiAyMDA3Li4uLgotIyBodHRwOi8vd3d3Lmdvdi5ucy5jYS9qdXN0L3JlZ3VsYXRpb25zL3JnMi8yMDA2L21hMTIwNi5wZGYKLSMKLSMgW0ZvciBOZXcgQnJ1bnN3aWNrXSB0aGUgbmV3IGxlZ2lzbGF0aW9uIGRpY3RhdGVzIHRoYXQgdGhlIHRpbWUgY2hhbmdlIGlzIHRvCi0jIGJlIGRvbmUgYXQgMDI6MDAgaW5zdGVhZCBvZiAwMDowMS4KLSMgaHR0cDovL3d3dy5nbmIuY2EvMDA2Mi9hY3RzL0JCQS0yMDA2L0NoYXAtMTkucGRmCi0jIC4uLgotIyBNYW5pdG9iYSBoYXMgdHJhZGl0aW9uYWxseSBjaGFuZ2VkIHRoZSBjbG9jayBldmVyeSBmYWxsIGF0IDAzOjAwLgotIyBBcyBvZiAyMDA2LCB0aGUgdHJhbnNpdGlvbiBpcyB0byB0YWtlIHBsYWNlIG9uZSBob3VyIGVhcmxpZXIgYXQgMDI6MDAuCi0jIGh0dHA6Ly93ZWIyLmdvdi5tYi5jYS9sYXdzL3N0YXR1dGVzL2Njc20vbzAzMGUucGhwCi0jIC4uLgotIyBbQWxiZXJ0YSwgT250YXJpbywgUXVlYmVjXSB3aWxsIGZvbGxvdyBVUyBydWxlcy4KLSMgaHR0cDovL3d3dy5xcC5nb3YuYWIuY2EvZG9jdW1lbnRzL3NwcmluZy9DSDAzXzA2LkNGTQotIyBodHRwOi8vd3d3LmUtbGF3cy5nb3Yub24uY2EvREJMYXdzL1NvdXJjZS9SZWdzL0VuZ2xpc2gvMjAwNi9SMDYxMTFfZS5odG0KLSMgaHR0cDovL3d3dzIucHVibGljYXRpb25zZHVxdWViZWMuZ291di5xYy5jYS9keW5hbWljU2VhcmNoL3RlbGVjaGFyZ2UucGhwP3R5cGU9NSZmaWxlPTIwMDZDMzlBLlBERgotIyAuLi4KLSMgUC5FLkkuIHdpbGwgZm9sbG93IFVTIHJ1bGVzLi4uLgotIyBodHRwOi8vd3d3LmFzc2VtYmx5LnBlLmNhL2JpbGxzL3BkZl9jaGFwdGVyLzYyLzMvY2hhcHRlci00MS5wZGYKLSMgLi4uCi0jIFByb3ZpbmNlIG9mIE5ld2ZvdW5kbGFuZCBhbmQgTGFicmFkb3IuLi4uCi0jIGh0dHA6Ly93d3cuaG9hLmdvdi5ubC5jYS9ob2EvYmlsbHMvQmlsbDA2MzQuaHRtCi0jIC4uLgotIyBZdWtvbgotIyBodHRwOi8vd3d3Lmdvdi55ay5jYS9sZWdpc2xhdGlvbi9yZWdzL29pYzIwMDZfMTI3LnBkZgotIyAuLi4KLSMgTi5XLlQuIHdpbGwgZm9sbG93IFVTIHJ1bGVzLiAgV2hvZXZlciBtYWludGFpbnMgdGhlIGdvdmVybm1lbnQgd2ViIHNpdGUKLSMgZG9lcyBub3Qgc2VlbSB0byBiZWxpZXZlIGluIGJvb2ttYXJrcy4gIFRvIHNlZSB0aGUgbmV3cyByZWxlYXNlLCBjbGljayB0aGUKLSMgZm9sbG93aW5nIGxpbmsgYW5kIHNlYXJjaCBmb3IgIkRheWxpZ2h0IFNhdmluZ3MgVGltZSBDaGFuZ2UiLiAgUHJlc3MgdGhlCi0jICJEYXlsaWdodCBTYXZpbmdzIFRpbWUgQ2hhbmdlIiBsaW5rOyBpdCB3aWxsIGZpcmUgb2ZmIGEgcG9wdXAgdXNpbmcKLSMgSmF2YVNjcmlwdC4KLSMgaHR0cDovL3d3dy5leGVjLmdvdi5udC5jYS9jdXJyZW50bmV3cy9jdXJyZW50UFIuYXNwP21vZGU9YXJjaGl2ZQotIyAuLi4KLSMgTnVuYXZ1dAotIyBBbiBhbWVuZG1lbnQgdG8gdGhlIEludGVycHJldGF0aW9uIEFjdCB3YXMgcmVnaXN0ZXJlZCBvbiBGZWJydWFyeSAxOS8yMDA3Li4uLgotIyBodHRwOi8vYWN0aW9uLmF0dGF2aWsuY2EvaG9tZS9qdXN0aWNlLWduL2F0dGFjaC8yMDA3L2dhejAycGFydDIucGRmCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNC0yNSk6Ci0jIEguIERhdmlkIE1hdHRoZXdzIGFuZCBNYXJ5IFZpbmNlbnQncyBtYXAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwIj4KLSMgIkl0J3MgYWJvdXQgVElNRSIsIF9DYW5hZGlhbiBHZW9ncmFwaGljXyAoU2VwdGVtYmVyLU9jdG9iZXIgMTk5OCkKLSMgPC9hPiBjb250YWlucyBkZXRhaWxlZCBib3VuZGFyaWVzIGZvciByZWdpb25zIG9ic2VydmluZyBub25zdGFuZGFyZAotIyB0aW1lIGFuZCBkYXlsaWdodCBzYXZpbmcgdGltZSBhcnJhbmdlbWVudHMgaW4gQ2FuYWRhIGNpcmNhIDE5OTguCi0jCi0jIElOTVMsIHRoZSBJbnN0aXR1dGUgZm9yIE5hdGlvbmFsIE1lYXN1cmVtZW50IFN0YW5kYXJkcyBpbiBPdHRhd2EsIGhhcyA8YQotIyBocmVmPSJodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2VuL3RpbWVfc2VydmljZXMvZGF5bGlnaHRfc2F2aW5nX2UucGhwIj4KLSMgaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgYW5kIGRheWxpZ2h0IHNhdmluZyB0aW1lIHpvbmVzIGluIENhbmFkYS4KLSMgPC9hPiAodXBkYXRlZCBwZXJpb2RpY2FsbHkpLgotIyBJdHMgdW5vZmZpY2lhbCBpbmZvcm1hdGlvbiBpcyBvZnRlbiB0YWtlbiBmcm9tIE1hdHRoZXdzIGFuZCBWaW5jZW50LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDYtMjcpOgotIyBGb3Igbm93LCBhc3N1bWUgYWxsIG9mIERTVC1vYnNlcnZpbmcgQ2FuYWRhIHdpbGwgZmFsbCBpbnRvIGxpbmUgd2l0aCB0aGUKLSMgbmV3IFVTIERTVCBydWxlcywKLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ2FuYWRhCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlDYW5hZGEJMTkxOAlvbmx5CS0JT2N0CTMxCTI6MDAJMAlTCi1SdWxlCUNhbmFkYQkxOTQyCW9ubHkJLQlGZWIJIDkJMjowMAkxOjAwCVcgIyBXYXIKLVJ1bGUJQ2FuYWRhCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJQ2FuYWRhCTE5NDUJb25seQktCVNlcAkzMAkyOjAwCTAJUwotUnVsZQlDYW5hZGEJMTk3NAkxOTg2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJQ2FuYWRhCTE5NzQJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUNhbmFkYQkxOTg3CTIwMDYJLQlBcHIJU3VuPj0xCTI6MDAJMTowMAlECi1SdWxlCUNhbmFkYQkyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkxOjAwCUQKLVJ1bGUJQ2FuYWRhCTIwMDcJbWF4CS0JTm92CVN1bj49MQkyOjAwCTAJUwotCi0KLSMgTmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvcgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBMYWJyYWRvciBzaG91bGQgdXNlIE5TVC9ORFQsCi0jIGJ1dCB0aGUgb25seSBwYXJ0IG9mIExhYnJhZG9yIHRoYXQgZm9sbG93cyB0aGUgcnVsZXMgaXMgdGhlCi0jIHNvdXRoZWFzdCBjb3JuZXIsIGluY2x1ZGluZyBQb3J0IEhvcGUgU2ltcHNvbiBhbmQgTWFyeSdzIEhhcmJvdXIsCi0jIGJ1dCBleGNsdWRpbmcsIHNheSwgQmxhY2sgVGlja2xlLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlTdEpvaG5zCTE5MTcJb25seQktCUFwcgkgOAkyOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5MTcJb25seQktCVNlcAkxNwkyOjAwCTAJUwotIyBXaGl0bWFuIGdpdmVzIDE5MTkgQXByIDUgYW5kIDE5MjAgQXByIDU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTdEpvaG5zCTE5MTkJb25seQktCU1heQkgNQkyMzowMAkxOjAwCUQKLVJ1bGUJU3RKb2hucwkxOTE5CW9ubHkJLQlBdWcJMTIJMjM6MDAJMAlTCi0jIEZvciAxOTMxLTE5MzUgV2hpdG1hbiBnaXZlcyBBcHIgc2FtZSBkYXRlOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJU3RKb2hucwkxOTIwCTE5MzUJLQlNYXkJU3VuPj0xCTIzOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5MjAJMTkzNQktCU9jdAlsYXN0U3VuCTIzOjAwCTAJUwotIyBGb3IgMTkzNi0xOTQxIFdoaXRtYW4gZ2l2ZXMgTWF5IFN1bj49OCBhbmQgT2N0IFN1bj49MTsgZ28gd2l0aCBTaGFua3MgJgotIyBQb3R0ZW5nZXIuCi1SdWxlCVN0Sm9obnMJMTkzNgkxOTQxCS0JTWF5CU1vbj49OQkwOjAwCTE6MDAJRAotUnVsZQlTdEpvaG5zCTE5MzYJMTk0MQktCU9jdAlNb24+PTIJMDowMAkwCVMKLSMgV2hpdG1hbiBnaXZlcyB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb25zOgotIyAxOTQyIDAzLTAxLzEyLTMxLCAxOTQzIDA1LTMwLzA5LTA1LCAxOTQ0IDA3LTEwLzA5LTAyLCAxOTQ1IDAxLTAxLzEwLTA3Ci0jIGJ1dCBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlciBhbmQgYXNzdW1lIHRoZXkgdXNlZCBDYW5hZGlhbiBydWxlcy4KLSMgRm9yIDE5NDYtOSBXaGl0bWFuIGdpdmVzIE1heSA1LDQsOSwxIC0gT2N0IDEsNSwzLDIsIGFuZCBmb3IgMTk1MCBoZSBnaXZlcwotIyBBcHIgMzAgLSBTZXAgMjQ7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlTdEpvaG5zCTE5NDYJMTk1MAktCU1heQlTdW4+PTgJMjowMAkxOjAwCUQKLVJ1bGUJU3RKb2hucwkxOTQ2CTE5NTAJLQlPY3QJU3VuPj0yCTI6MDAJMAlTCi1SdWxlCVN0Sm9obnMJMTk1MQkxOTg2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3RKb2hucwkxOTUxCTE5NTkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlTdEpvaG5zCTE5NjAJMTk4NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgotIyBJTk1TICgyMDAwLTA5LTEyKSBzYXlzIHRoYXQsIHNpbmNlIDE5ODggYXQgbGVhc3QsIE5ld2ZvdW5kbGFuZCBzd2l0Y2hlcwotIyBhdCAwMDowMSBsb2NhbCB0aW1lLiAgRm9yIG5vdywgYXNzdW1lIGl0IHN0YXJ0ZWQgaW4gMTk4Ny4KLVJ1bGUJU3RKb2hucwkxOTg3CW9ubHkJLQlBcHIJU3VuPj0xCTA6MDEJMTowMAlECi1SdWxlCVN0Sm9obnMJMTk4NwkyMDA2CS0JT2N0CWxhc3RTdW4JMDowMQkwCVMKLVJ1bGUJU3RKb2hucwkxOTg4CW9ubHkJLQlBcHIJU3VuPj0xCTA6MDEJMjowMAlERAotUnVsZQlTdEpvaG5zCTE5ODkJMjAwNgktCUFwcglTdW4+PTEJMDowMQkxOjAwCUQKLVJ1bGUJU3RKb2hucwkyMDA3CW1heAktCU1hcglTdW4+PTgJMDowMQkxOjAwCUQKLVJ1bGUJU3RKb2hucwkyMDA3CW1heAktCU5vdglTdW4+PTEJMDowMQkwCVMKLSMKLSMgU3QgSm9obidzIGhhcyBhbiBhcG9zdHJvcGhlLCBidXQgUG9zaXggZmlsZSBuYW1lcyBjYW4ndCBoYXZlIGFwb3N0cm9waGVzLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1N0X0pvaG5zCS0zOjMwOjUyIC0JTE1UCTE4ODQKLQkJCS0zOjMwOjUyIFN0Sm9obnMgTiVzVAkxOTE4Ci0JCQktMzozMDo1MiBDYW5hZGEJTiVzVAkxOTE5Ci0JCQktMzozMDo1MiBTdEpvaG5zIE4lc1QJMTkzNSBNYXIgMzAKLQkJCS0zOjMwCVN0Sm9obnMJTiVzVAkxOTQyIE1heSAxMQotCQkJLTM6MzAJQ2FuYWRhCU4lc1QJMTk0NgotCQkJLTM6MzAJU3RKb2hucwlOJXNUCi0KLSMgbW9zdCBvZiBlYXN0IExhYnJhZG9yCi0KLSMgVGhlIG5hbWUgYEhhcHB5IFZhbGxleS1Hb29zZSBCYXknIGlzIHRvbyBsb25nOyB1c2UgYEdvb3NlIEJheScuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvR29vc2VfQmF5CS00OjAxOjQwIC0JTE1UCTE4ODQgIyBIYXBweSBWYWxsZXktR29vc2UgQmF5Ci0JCQktMzozMDo1MiAtCU5TVAkxOTE4Ci0JCQktMzozMDo1MiBDYW5hZGEgTiVzVAkxOTE5Ci0JCQktMzozMDo1MiAtCU5TVAkxOTM1IE1hciAzMAotCQkJLTM6MzAJLQlOU1QJMTkzNgotCQkJLTM6MzAJU3RKb2hucwlOJXNUCTE5NDIgTWF5IDExCi0JCQktMzozMAlDYW5hZGEJTiVzVAkxOTQ2Ci0JCQktMzozMAlTdEpvaG5zCU4lc1QJMTk2NiBNYXIgMTUgMjowMAotCQkJLTQ6MDAJU3RKb2hucwlBJXNUCi0KLQotIyB3ZXN0IExhYnJhZG9yLCBOb3ZhIFNjb3RpYSwgUHJpbmNlIEVkd2FyZCBJCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IHNpbmNlIDE5NzAgbW9zdCBvZiB0aGlzIHJlZ2lvbiBoYXMgYmVlbiBsaWtlCi0jIEhhbGlmYXguICBNYW55IGxvY2FsZXMgZGlkIG5vdCBvYnNlcnZlIHBlYWNldGltZSBEU1QgdW50aWwgMTk3MjsKLSMgR2xhY2UgQmF5LCBOUyBpcyB0aGUgbGFyZ2VzdCB0aGF0IHdlIGtub3cgb2YuCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBhbHNvIHdyaXRlIHRoYXQgTGl2ZXJwb29sLCBOUyB3YXMgdGhlIG9ubHkgdG93bgotIyBpbiBDYW5hZGEgdG8gb2JzZXJ2ZSBEU1QgaW4gMTk3MSBidXQgbm90IDE5NzA7IGZvciBub3cgd2UnbGwgYXNzdW1lCi0jIHRoaXMgaXMgYSB0eXBvLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlIYWxpZmF4CTE5MTYJb25seQktCUFwcgkgMQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MTYJb25seQktCU9jdAkgMQkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjAJb25seQktCU1heQkgOQkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjAJb25seQktCUF1ZwkyOQkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjEJb25seQktCU1heQkgNgkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjEJMTkyMgktCVNlcAkgNQkwOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5MjIJb25seQktCUFwcgkzMAkwOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5MjMJMTkyNQktCU1heQlTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTIzCW9ubHkJLQlTZXAJIDQJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI0CW9ubHkJLQlTZXAJMTUJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI1CW9ubHkJLQlTZXAJMjgJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI2CW9ubHkJLQlNYXkJMTYJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTI2CW9ubHkJLQlTZXAJMTMJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI3CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTI3CW9ubHkJLQlTZXAJMjYJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTI4CTE5MzEJLQlNYXkJU3VuPj04CTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkyOAlvbmx5CS0JU2VwCSA5CTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkyOQlvbmx5CS0JU2VwCSAzCTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkzMAlvbmx5CS0JU2VwCTE1CTA6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTkzMQkxOTMyCS0JU2VwCU1vbj49MjQJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTMyCW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTMzCW9ubHkJLQlBcHIJMzAJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTMzCW9ubHkJLQlPY3QJIDIJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTM0CW9ubHkJLQlNYXkJMjAJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTM0CW9ubHkJLQlTZXAJMTYJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTM1CW9ubHkJLQlKdW4JIDIJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTM1CW9ubHkJLQlTZXAJMzAJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTM2CW9ubHkJLQlKdW4JIDEJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTM2CW9ubHkJLQlTZXAJMTQJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTM3CTE5MzgJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTkzNwkxOTQxCS0JU2VwCU1vbj49MjQJMDowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTM5CW9ubHkJLQlNYXkJMjgJMDowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTQwCTE5NDEJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTk0NgkxOTQ5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTQ2CTE5NDkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlIYWxpZmF4CTE5NTEJMTk1NAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUhhbGlmYXgJMTk1MQkxOTU0CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJSGFsaWZheAkxOTU2CTE5NTkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlIYWxpZmF4CTE5NTYJMTk1OQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUhhbGlmYXgJMTk2MgkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJSGFsaWZheAkxOTYyCTE5NzMJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0hhbGlmYXgJLTQ6MTQ6MjQgLQlMTVQJMTkwMiBKdW4gMTUKLQkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTE4Ci0JCQktNDowMAlDYW5hZGEJQSVzVAkxOTE5Ci0JCQktNDowMAlIYWxpZmF4CUElc1QJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NDYKLQkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTc0Ci0JCQktNDowMAlDYW5hZGEJQSVzVAotWm9uZSBBbWVyaWNhL0dsYWNlX0JheQktMzo1OTo0OCAtCUxNVAkxOTAyIEp1biAxNQotCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTk1MwotCQkJLTQ6MDAJSGFsaWZheAlBJXNUCTE5NTQKLQkJCS00OjAwCS0JQVNUCTE5NzIKLQkJCS00OjAwCUhhbGlmYXgJQSVzVAkxOTc0Ci0JCQktNDowMAlDYW5hZGEJQSVzVAotCi0jIE5ldyBCcnVuc3dpY2sKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAxLTMxKToKLSMgVGhlIFRpbWUgRGVmaW5pdGlvbiBBY3QgPGh0dHA6Ly93d3cuZ25iLmNhLzAwNjIvUERGLWFjdHMvdC0wNi5wZGY+Ci0jIHNheXMgdGhleSBjaGFuZ2VkIGF0IDAwOjAxIHRocm91Z2ggMjAwNiwgYW5kCi0jIDxodHRwOi8vd3d3LmNhbmxpaS5vcmcvbmIvbGF3cy9zdGEvdC02LzIwMDMwMTI3L3dob2xlLmh0bWw+IG1ha2VzIGl0Ci0jIGNsZWFyIHRoYXQgdGhpcyB3YXMgdGhlIGNhc2Ugc2luY2UgYXQgbGVhc3QgMTk5My4KLSMgRm9yIG5vdywgYXNzdW1lIGl0IHN0YXJ0ZWQgaW4gMTk5My4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJTW9uY3RvbgkxOTMzCTE5MzUJLQlKdW4JU3VuPj04CTE6MDAJMTowMAlECi1SdWxlCU1vbmN0b24JMTkzMwkxOTM1CS0JU2VwCVN1bj49OAkxOjAwCTAJUwotUnVsZQlNb25jdG9uCTE5MzYJMTkzOAktCUp1bglTdW4+PTEJMTowMAkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTM2CTE5MzgJLQlTZXAJU3VuPj0xCTE6MDAJMAlTCi1SdWxlCU1vbmN0b24JMTkzOQlvbmx5CS0JTWF5CTI3CTE6MDAJMTowMAlECi1SdWxlCU1vbmN0b24JMTkzOQkxOTQxCS0JU2VwCVNhdD49MjEJMTowMAkwCVMKLVJ1bGUJTW9uY3RvbgkxOTQwCW9ubHkJLQlNYXkJMTkJMTowMAkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTQxCW9ubHkJLQlNYXkJIDQJMTowMAkxOjAwCUQKLVJ1bGUJTW9uY3RvbgkxOTQ2CTE5NzIJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlNb25jdG9uCTE5NDYJMTk1NgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU1vbmN0b24JMTk1NwkxOTcyCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTW9uY3RvbgkxOTkzCTIwMDYJLQlBcHIJU3VuPj0xCTA6MDEJMTowMAlECi1SdWxlCU1vbmN0b24JMTk5MwkyMDA2CS0JT2N0CWxhc3RTdW4JMDowMQkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Nb25jdG9uCS00OjE5OjA4IC0JTE1UCTE4ODMgRGVjICA5Ci0JCQktNTowMAktCUVTVAkxOTAyIEp1biAxNQotCQkJLTQ6MDAJQ2FuYWRhCUElc1QJMTkzMwotCQkJLTQ6MDAJTW9uY3RvbglBJXNUCTE5NDIKLQkJCS00OjAwCUNhbmFkYQlBJXNUCTE5NDYKLQkJCS00OjAwCU1vbmN0b24JQSVzVAkxOTczCi0JCQktNDowMAlDYW5hZGEJQSVzVAkxOTkzCi0JCQktNDowMAlNb25jdG9uCUElc1QJMjAwNwotCQkJLTQ6MDAJQ2FuYWRhCUElc1QKLQotIyBRdWViZWMKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA3LTA5KToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgc2luY2UgMTk3MCBtb3N0IG9mIFF1ZWJlYyBoYXMgYmVlbgotIyBsaWtlIE1vbnRyZWFsLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDYtMjcpOgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgYWxzbyB3cml0ZSB0aGF0IFF1ZWJlYyBlYXN0IG9mIHRoZSAtNjMKLSMgbWVyaWRpYW4gaXMgc3VwcG9zZWQgdG8gb2JzZXJ2ZSBBU1QsIGJ1dCByZXNpZGVudHMgYXMgZmFyIGVhc3QgYXMKLSMgTmF0YXNocXVhbiB1c2UgRVNUL0VEVCwgYW5kIHJlc2lkZW50cyBlYXN0IG9mIE5hdGFzaHF1YW4gdXNlIEFTVC4KLSMgSW4gIk9mZmljaWFsIHRpbWUgaW4gUXVlYmVjIiB0aGUgUXVlYmVjIGRlcGFydG1lbnQgb2YganVzdGljZSB3cml0ZXMgaW4KLSMgaHR0cDovL3d3dy5qdXN0aWNlLmdvdXYucWMuY2EvZW5nbGlzaC9wdWJsaWNhdGlvbnMvZ2VuZXJhbGUvdGVtcHMtcmVnbC0xLWEuaHRtCi0jIHRoYXQgIlRoZSByZXNpZGVudHMgb2YgdGhlIE11bmljaXBhbGl0eSBvZiB0aGUKLSMgQ290ZS1Ob3JkLWR1LUdvbGZlLVNhaW50LUxhdXJlbnQgYW5kIHRoZSBtdW5pY2lwYWxpdGllcyBvZiBTYWludC1BdWd1c3RpbiwKLSMgQm9ubmUtRXNwZXJhbmNlIGFuZCBCbGFuYy1TYWJsb24gYXBwbHkgdGhlIE9mZmljaWFsIFRpbWUgQWN0IGFzIGl0IGlzCi0jIHdyaXR0ZW4gYW5kIHVzZSBBdGxhbnRpYyBzdGFuZGFyZCB0aW1lIGFsbCB5ZWFyIHJvdW5kLiBUaGUgc2FtZSBhcHBsaWVzIHRvCi0jIHRoZSByZXNpZGVudHMgb2YgdGhlIE5hdGl2ZSBmYWNpbGl0aWVzIGFsb25nIHRoZSBsb3dlciBOb3J0aCBTaG9yZS4iCi0jIDxodHRwOi8vd3d3LmFzc25hdC5xYy5jYS9lbmcvMzdsZWdpc2xhdHVyZTIvUHJvamV0cy1sb2kvUHVibGljcy8wNi1hMDAyLmh0bT4KLSMgc2F5cyB0aGlzIGNvbW1vbiBwcmFjdGljZSB3YXMgY29kaWZpZWQgaW50byBsYXcgYXMgb2YgMjAwNy4KLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm8sIGd1ZXNzIHRoaXMgcHJhY3RpY2UgYmVnYW4gYXJvdW5kIDE5NzAsIGNvbnRyYSB0bwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd2hvIGhhdmUgdGhpcyByZWdpb24gb2JzZXJ2aW5nIEFTVC9BRFQuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU1vbnQJMTkxNwlvbmx5CS0JTWFyCTI1CTI6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkxNwlvbmx5CS0JQXByCTI0CTA6MDAJMAlTCi1SdWxlCU1vbnQJMTkxOQlvbmx5CS0JTWFyCTMxCTI6MzAJMTowMAlECi1SdWxlCU1vbnQJMTkxOQlvbmx5CS0JT2N0CTI1CTI6MzAJMAlTCi1SdWxlCU1vbnQJMTkyMAlvbmx5CS0JTWF5CSAyCTI6MzAJMTowMAlECi1SdWxlCU1vbnQJMTkyMAkxOTIyCS0JT2N0CVN1bj49MQkyOjMwCTAJUwotUnVsZQlNb250CTE5MjEJb25seQktCU1heQkgMQkyOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MjIJb25seQktCUFwcgkzMAkyOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MjQJb25seQktCU1heQkxNwkyOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MjQJMTkyNgktCVNlcAlsYXN0U3VuCTI6MzAJMAlTCi1SdWxlCU1vbnQJMTkyNQkxOTI2CS0JTWF5CVN1bj49MQkyOjAwCTE6MDAJRAotIyBUaGUgMTkyNy10by0xOTM3IHJ1bGVzIGNhbiBiZSBleHByZXNzZWQgbW9yZSBzaW1wbHkgYXMKLSMgUnVsZQlNb250CTE5MjcJMTkzNwktCUFwcglsYXN0U2F0CTI0OjAwCTE6MDAJRAotIyBSdWxlCU1vbnQJMTkyNwkxOTM3CS0JU2VwCWxhc3RTYXQJMjQ6MDAJMAlTCi0jIFRoZSBydWxlcyBiZWxvdyBhdm9pZCB1c2Ugb2YgMjQ6MDAKLSMgKHdoaWNoIHByZS0xOTk4IHZlcnNpb25zIG9mIHppYyBjYW5ub3QgaGFuZGxlKS4KLVJ1bGUJTW9udAkxOTI3CW9ubHkJLQlNYXkJMQkwOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MjcJMTkzMgktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCi1SdWxlCU1vbnQJMTkyOAkxOTMxCS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJTW9udAkxOTMyCW9ubHkJLQlNYXkJMQkwOjAwCTE6MDAJRAotUnVsZQlNb250CTE5MzMJMTk0MAktCUFwcglsYXN0U3VuCTA6MDAJMTowMAlECi1SdWxlCU1vbnQJMTkzMwlvbmx5CS0JT2N0CTEJMDowMAkwCVMKLVJ1bGUJTW9udAkxOTM0CTE5MzkJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwotUnVsZQlNb250CTE5NDYJMTk3MwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU1vbnQJMTk0NQkxOTQ4CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTW9udAkxOTQ5CTE5NTAJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlNb250CTE5NTEJMTk1NgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU1vbnQJMTk1NwkxOTczCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0JsYW5jLVNhYmxvbiAtMzo0ODoyOCAtCUxNVAkxODg0Ci0JCQktNDowMAlDYW5hZGEJQSVzVAkxOTcwCi0JCQktNDowMAktCUFTVAotWm9uZSBBbWVyaWNhL01vbnRyZWFsCS00OjU0OjE2IC0JTE1UCTE4ODQKLQkJCS01OjAwCU1vbnQJRSVzVAkxOTE4Ci0JCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5Ci0JCQktNTowMAlNb250CUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKLQkJCS01OjAwCU1vbnQJRSVzVAkxOTc0Ci0JCQktNTowMAlDYW5hZGEJRSVzVAotCi0KLSMgT250YXJpbwotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDctMDkpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgT250YXJpbyBoYXMgYmVlbiBsaWtlCi0jIFRvcm9udG8uCi0jIFRodW5kZXIgQmF5IHNraXBwZWQgRFNUIGluIDE5NzMuCi0jIE1hbnkgc21hbGxlciBsb2NhbGVzIGRpZCBub3Qgb2JzZXJ2ZSBwZWFjZXRpbWUgRFNUIHVudGlsIDE5NzQ7Ci0jIE5pcGlnb24gKEVTVCkgYW5kIFJhaW55IFJpdmVyIChDU1QpIGFyZSB0aGUgbGFyZ2VzdCB0aGF0IHdlIGtub3cgb2YuCi0jIEZhciB3ZXN0IE9udGFyaW8gaXMgbGlrZSBXaW5uaXBlZzsgZmFyIGVhc3QgUXVlYmVjIGlzIGxpa2UgSGFsaWZheC4KLQotIyBGcm9tIE1hcmsgQnJhZGVyICgyMDAzLTA3LTI2KToKLSMgW0FjY29yZGluZyB0byB0aGUgVG9yb250byBTdGFyXSBPcmlsbGlhLCBPbnRhcmlvLCBhZG9wdGVkIERTVAotIyBlZmZlY3RpdmUgU2F0dXJkYXksIDE5MTItMDYtMjIsIDIyOjAwOyB0aGUgYXJ0aWNsZSBtZW50aW9ucyB0aGF0Ci0jIFBvcnQgQXJ0aHVyIChub3cgcGFydCBvZiBUaHVuZGVyIEJheSwgT250YXJpbykgYXMgd2VsbCBhcyBNb29zZSBKYXcKLSMgaGF2ZSBhbHJlYWR5IGRvbmUgc28uICBJbiBPcmlsbGlhIERTVCB3YXMgdG8gcnVuIHVudGlsIFNhdHVyZGF5LAotIyAxOTEyLTA4LTMxIChubyB0aW1lIG1lbnRpb25lZCksIGJ1dCBpdCB3YXMgbWV0IHdpdGggY29uc2lkZXJhYmxlCi0jIGhvc3RpbGl0eSBmcm9tIGNlcnRhaW4gc2VnbWVudHMgb2YgdGhlIHB1YmxpYywgYW5kIHdhcyByZXZva2VkIGFmdGVyCi0jIG9ubHkgdHdvIHdlZWtzIC0tIEkgY29waWVkIGl0IGFzIFNhdHVyZGF5LCAxOTEyLTA3LTA3LCAyMjowMCwgYnV0Ci0jIHByZXN1bWFibHkgdGhhdCBzaG91bGQgYmUgLTA3LTA2LiAgKDE5MTItMDYtMTksIC0wNy0xMjsgYWxzbyBsZXR0ZXJzCi0jIGVhcmxpZXIgaW4gSnVuZSkuCi0jCi0jIEtlbm9yYSwgT250YXJpbywgd2FzIHRvIGFiYW5kb24gRFNUIG9uIDE5MTQtMDYtMDEgKC0wNS0yMSkuCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ny0xMC0xNyk6Ci0jIE1hcmsgQnJhZGVyIHdyaXRlcyB0aGF0IGFuIGFydGljbGUgaW4gdGhlIDE5OTctMTAtMTQgVG9yb250byBTdGFyCi0jIHNheXMgdGhhdCBBdGlrb2thbiwgT250YXJpbyBjdXJyZW50bHkgZG9lcyBub3Qgb2JzZXJ2ZSBEU1QsCi0jIGJ1dCB3aWxsIHZvdGUgb24gMTEtMTAgd2hldGhlciB0byB1c2UgRVNUL0VEVC4KLSMgSGUgYWxzbyB3cml0ZXMgdGhhdCB0aGUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb3Yub24uY2EvTUJTL2VuZ2xpc2gvcHVibGljYXRpb25zL3N0YXRyZWdzL2NvbnR0ZXh0Lmh0bWwiPgotIyBPbnRhcmlvIFRpbWUgQWN0ICgxOTkwLCBDaGFwdGVyIFQuOSkKLSMgPC9hPgotIyBzYXlzIHRoYXQgT250YXJpbyBlYXN0IG9mIDkwVyB1c2VzIEVTVC9FRFQsIGFuZCB3ZXN0IG9mIDkwVyB1c2VzIENTVC9DRFQuCi0jIE9mZmljaWFsbHkgQXRpa29rYW4gaXMgdGhlcmVmb3JlIG9uIENTVC9DRFQsIGFuZCBtb3N0IGxpa2VseSB0aGlzIHJlcG9ydAotIyBjb25jZXJucyBhIG5vbi1vZmZpY2lhbCB0aW1lIG9ic2VydmVkIGFzIGEgbWF0dGVyIG9mIGxvY2FsIHByYWN0aWNlLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAwLTEwLTAyKToKLSMgTWF0dGhld3MgYW5kIFZpbmNlbnQgKDE5OTgpIHdyaXRlIHRoYXQgQXRpa29rYW4sIFBpY2tsZSBMYWtlLCBhbmQKLSMgTmV3IE9zbmFidXJnaCBvYnNlcnZlIENTVCBhbGwgeWVhciwgdGhhdCBCaWcgVHJvdXQgTGFrZSBvYnNlcnZlcwotIyBDU1QvQ0RULCBhbmQgdGhhdCBVcHNhbGEgYW5kIFNoZWJhbmRvd2FuIG9ic2VydmUgRVNUL0VEVCwgYWxsIGluCi0jIHZpb2xhdGlvbiBvZiB0aGUgb2ZmaWNpYWwgT250YXJpbyBydWxlcy4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wNy0wOSk6Ci0jIENocmlzIFdhbHRvbiAoMjAwNi0wNy0wNikgbWVudGlvbmVkIGFuIGFydGljbGUgYnkgU3RlcGhhbmllIE1hY0xlbGxhbiBpbiB0aGUKLSMgMjAwNS0wNy0yMSBDaHJvbmljbGUtSm91cm5hbCwgd2hpY2ggc2FpZDoKLSMKLSMJVGhlIGNsb2NrcyBpbiBBdGlrb2thbiBzdGF5IHNldCBvbiBzdGFuZGFyZCB0aW1lIHllYXItcm91bmQuCi0jCVRoaXMgbWVhbnMgdGhleSBzcGVuZCBhYm91dCBoYWxmIHRoZSB0aW1lIG9uIGNlbnRyYWwgdGltZSBhbmQKLSMJdGhlIG90aGVyIGhhbGYgb24gZWFzdGVybiB0aW1lLgotIwotIwlGb3IgdGhlIG1vc3QgcGFydCwgdGhlIHN5c3RlbSB3b3JrcywgTWF5b3IgRGVubmlzIEJyb3duIHNhaWQuCi0jCi0jCSJUaGUgbWFqb3JpdHkgb2YgYnVzaW5lc3NlcyBpbiBBdGlrb2thbiBkZWFsIG1vcmUgd2l0aCBFYXN0ZXJuCi0jCUNhbmFkYSwgYnV0IHRoZXJlIGFyZSBzb21lIHRoYXQgZGVhbCB3aXRoIFdlc3Rlcm4gQ2FuYWRhLCIgaGUKLSMJc2FpZC4gICJJIGRvbid0IHNlZSBhbnkgY2hhbmdlcyBoYXBwZW5pbmcgaGVyZS4iCi0jCi0jIFdhbHRvbiBhbHNvIHdyaXRlcyAiU3VwcG9zZWRseSBQaWNrbGUgTGFrZSBhbmQgTWlzaGtlZWdvZ2FtYW5nCi0jIFtOZXcgT3NuYWJ1cmdoXSBmb2xsb3cgdGhlIHNhbWUgcHJhY3RpY2UuIgotCi0jIEZyb20gR2FycnkgTWNLaW5ub24gKDIwMDYtMDctMTQpIHZpYSBDaHJpcyBXYWx0b246Ci0jIEkgY2hhdHRlZCB3aXRoIGEgbWVtYmVyIG9mIG15IGJvYXJkIHdobyBoYXMgYW4gb3V0c3RhbmRpbmcgbWVtb3J5Ci0jIGFuZCBhIGxvbmcgaGlzdG9yeSBpbiBBdGlrb2thbiAoYW5kIGluIHRoZSB0ZWxlY29tIGluZHVzdHJ5KSBhbmQgaGUKLSMgY2FuIHNheSBmb3IgY2VydGFpbiB0aGF0IEF0aWtva2FuIGhhcyBiZWVuIHByYWN0aWNpbmcgdGhlIGN1cnJlbnQKLSMgdGltZSBrZWVwaW5nIHNpbmNlIDE5NTIsIGF0IGxlYXN0LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDctMTcpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgQXRpa29rYW4gaGFzIGFncmVlZCB3aXRoIFJhaW55IFJpdmVyCi0jIGV2ZXIgc2luY2Ugc3RhbmRhcmQgdGltZSB3YXMgaW50cm9kdWNlZCwgYnV0IHRoZSBpbmZvcm1hdGlvbiBmcm9tCi0jIE1jS2lubm9uIHNvdW5kcyBtb3JlIGF1dGhvcml0YXRpdmUuICBGb3Igbm93LCBhc3N1bWUgdGhhdCBBdGlrb2thbgotIyBzd2l0Y2hlZCB0byBFU1QgaW1tZWRpYXRlbHkgYWZ0ZXIgV1dJSSBlcmEgZGF5bGlnaHQgc2F2aW5nIHRpbWUKLSMgZW5kZWQuICBUaGlzIG1hdGNoZXMgdGhlIG9sZCAobGVzcy1wb3B1bG91cykgQW1lcmljYS9Db3JhbF9IYXJib3VyCi0jIGVudHJ5IHNpbmNlIG91ciBjdXRvZmYgZGF0ZSBvZiAxOTcwLCBzbyB3ZSBjYW4gbW92ZQotIyBBbWVyaWNhL0NvcmFsX0hhcmJvdXIgdG8gdGhlICdiYWNrd2FyZCcgZmlsZS4KLQotIyBGcm9tIE1hcmsgQnJhZGVyICgyMDEwLTAzLTA2KToKLSMKLSMgQ3VycmVudGx5IHRoZSBkYXRhYmFzZSBoYXM6Ci0jCi0jICMgT250YXJpbwotIwotIyAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDctMDkpOgotIyAjIFNoYW5rcyAmIFBvdHRlbmdlciB3cml0ZSB0aGF0IHNpbmNlIDE5NzAgbW9zdCBvZiBPbnRhcmlvIGhhcyBiZWVuIGxpa2UKLSMgIyBUb3JvbnRvLgotIyAjIFRodW5kZXIgQmF5IHNraXBwZWQgRFNUIGluIDE5NzMuCi0jICMgTWFueSBzbWFsbGVyIGxvY2FsZXMgZGlkIG5vdCBvYnNlcnZlIHBlYWNldGltZSBEU1QgdW50aWwgMTk3NDsKLSMgIyBOaXBpZ29uIChFU1QpIGFuZCBSYWlueSBSaXZlciAoQ1NUKSBhcmUgdGhlIGxhcmdlc3QgdGhhdCB3ZSBrbm93IG9mLgotIwotIyBJbiB0aGUgKFRvcm9udG8pIEdsb2JlIGFuZCBNYWlsIGZvciBTYXR1cmRheSwgMTk1NS0wOS0yNCwgaW4gdGhlIGJvdHRvbQotIyByaWdodCBjb3JuZXIgb2YgcGFnZSAxLCBpdCBzYXlzIHRoYXQgVG9yb250byB3aWxsIHJldHVybiB0byBzdGFuZGFyZAotIyB0aW1lIGF0IDIgYW0gU3VuZGF5IG1vcm5pbmcgKHdoaWNoIGFncmVlcyB3aXRoIHRoZSBkYXRhYmFzZSksIGFuZCB0aGF0OgotIwotIyAgICAgVGhlIG9uZS1ob3VyIHNldGJhY2sgd2lsbCBnbyBpbnRvIGVmZmVjdCB0aHJvdWdob3V0IG1vc3Qgb2YgT250YXJpbywKLSMgICAgIGV4Y2VwdCBpbiBhcmVhcyBsaWtlIFdpbmRzb3Igd2hpY2ggcmVtYWlucyBvbiBzdGFuZGFyZCB0aW1lIGFsbCB5ZWFyLgotIwotIyBXaW5kc29yIGlzLCBvZiBjb3Vyc2UsIGEgbG90IGxhcmdlciB0aGFuIE5pcGlnb24uCi0jCi0jIEkgb25seSBjYW1lIGFjcm9zcyB0aGlzIGluY2lkZW50YWxseS4gIEkgZG9uJ3Qga25vdyBpZiBXaW5kc29yIGJlZ2FuCi0jIG9ic2VydmluZyBEU1Qgd2hlbiBEZXRyb2l0IGRpZCwgb3IgaW4gMTk3NCwgb3Igb24gc29tZSBvdGhlciBkYXRlLgotIwotIyBCeSB0aGUgd2F5LCB0aGUgYXJ0aWNsZSBjb250aW51ZXMgYnkgbm90aW5nIHRoYXQ6Ci0jCi0jICAgICBTb21lIGNpdGllcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBoYXZlIHB1c2hlZCB0aGUgZGVhZGxpbmUgYmFjawotIyAgICAgdGhyZWUgd2Vla3MgYW5kIHdpbGwgY2hhbmdlIG92ZXIgZnJvbSBkYXlsaWdodCBzYXZpbmcgaW4gT2N0b2Jlci4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wNy0xNyk6Ci0jCi0jICJTdGFuZGFyZCBUaW1lIGFuZCBUaW1lIFpvbmVzIGluIENhbmFkYSIgYXBwZWFyZWQgaW4KLSMgVGhlIEpvdXJuYWwgb2YgVGhlIFJveWFsIEFzdHJvbm9taWNhbCBTb2NpZXR5IG9mIENhbmFkYSwKLSMgdm9sdW1lIDI2LCBudW1iZXIgMiAoRmVicnVhcnkgMTkzMikgYW5kLCBhcyBvZiAyMDEwLTA3LTE3LAotIyB3YXMgYXZhaWxhYmxlIGF0Ci0jIDxhIGhyZWY9Imh0dHA6Ly9hZHNhYnMuaGFydmFyZC5lZHUvZnVsbC8xOTMySlJBU0MuLjI2Li4uNDlTIj4KLSMgaHR0cDovL2Fkc2Ficy5oYXJ2YXJkLmVkdS9mdWxsLzE5MzJKUkFTQy4uMjYuLi40OVMKLSMgPC9hPgotIwotIyBJdCBpbmNsdWRlcyB0aGUgdGV4dCBiZWxvdyAoc3RhcnRpbmcgb24gcGFnZSA1Nyk6Ci0jCi0jICAgQSBsaXN0IG9mIHRoZSBwbGFjZXMgaW4gQ2FuYWRhIHVzaW5nIGRheWxpZ2h0IHNhdmluZyB0aW1lIHdvdWxkCi0jIHJlcXVpcmUgeWVhcmx5IHJldmlzaW9uLiBGcm9tIGluZm9ybWF0aW9uIGtpbmRseSBmdXJuaXNoZWQgYnkKLSMgdGhlIHByb3ZpbmNpYWwgZ292ZXJubWVudHMgYW5kIGJ5IHRoZSBwb3N0bWFzdGVycyBpbiBtYW55IGNpdGllcwotIyBhbmQgdG93bnMsIGl0IGlzIGZvdW5kIHRoYXQgdGhlIGZvbGxvd2luZyBwbGFjZXMgdXNlZCBkYXlsaWdodCBzYXYtCi0jIGluZyBpbiAxOTMwLiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm92aW5jZSBvZiBRdWViZWMgaXMgZGVmaW5pdGUsCi0jIGZvciB0aGUgb3RoZXIgcHJvdmluY2VzIG9ubHkgYXBwcm94aW1hdGU6Ci0jCi0jIAlQcm92aW5jZQlEYXlsaWdodCBzYXZpbmcgdGltZSB1c2VkCi0jIFByaW5jZSBFZHdhcmQgSXNsYW5kCU5vdCB1c2VkLgotIyBOb3ZhIFNjb3RpYQkJSW4gSGFsaWZheCBvbmx5LgotIyBOZXcgQnJ1bnN3aWNrCQlJbiBTdC4gSm9obiBvbmx5LgotIyBRdWViZWMJCUluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOgotIyAJCQlNb250cmVhbAlMYWNoaW5lCi0jIAkJCVF1ZWJlYwkJTW9udC1Sb3lhbAotIyAJCQlMZXZpcwkJSWJlcnZpbGxlCi0jIAkJCVN0LiBMYW1iZXJ0CUNhcCBkZSBsYSBNYWRlbGVpbmUKLSMgCQkJVmVyZHVuCQlMb3JldHRldmlsbGUKLSMgCQkJV2VzdG1vdW50CVJpY2htb25kCi0jIAkJCU91dHJlbW9udAlTdC4gSmVyb21lCi0jIAkJCUxvbmd1ZXVpbAlHcmVlbmZpZWxkIFBhcmsKLSMgCQkJQXJ2aWRhCQlXYXRlcmxvbwotIyAJCQlDaGFtYmx5LUNhbnRvbglCZWF1bGlldQotIyAJCQlNZWxib3VybmUJTGEgVHVxdWUKLSMgCQkJU3QuIFRoZW9waGlsZQlCdWNraW5naGFtCi0jIE9udGFyaW8JCVVzZWQgZ2VuZXJhbGx5IGluIHRoZSBjaXRpZXMgYW5kIHRvd25zIGFsb25nCi0jIAkJCXRoZSBzb3V0aGVybHkgcGFydCBvZiB0aGUgcHJvdmluY2UuIE5vdAotIyAJCQl1c2VkIGluIHRoZSBub3J0aHdlc3RlcmxoeSBwYXJ0LgotIyBNYW5pdG9iYQkJTm90IHVzZWQuCi0jIFNhc2thdGNoZXdhbgkJSW4gUmVnaW5hIG9ubHkuCi0jIEFsYmVydGEJCU5vdCB1c2VkLgotIyBCcml0aXNoIENvbHVtYmlhCU5vdCB1c2VkLgotIwotIyAgIFdpdGggc29tZSBleGNlcHRpb25zLCB0aGUgdXNlIG9mIGRheWxpZ2h0IHNhdmluZyBtYXkgYmUgc2FpZCB0byBiZSBsaW1pdGVkCi0jIHRvIHRob3NlIGNpdGllcyBhbmQgdG93bnMgbHlpbmcgYmV0d2VlbiBRdWViZWMgY2l0eSBhbmQgV2luZHNvciwgT250LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlUb3JvbnRvCTE5MTkJb25seQktCU1hcgkzMAkyMzozMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTE5CW9ubHkJLQlPY3QJMjYJMDowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlNYXkJIDIJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTIwCW9ubHkJLQlTZXAJMjYJMDowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlNYXkJMTUJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTIxCW9ubHkJLQlTZXAJMTUJMjowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTIyCTE5MjMJLQlNYXkJU3VuPj04CTI6MDAJMTowMAlECi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkyMy0wOS0xOTsgYXNzdW1lIGl0J3MgYSB0eXBvIGFuZCB0aGF0ICItMTYiCi0jIHdhcyBtZWFudC4KLVJ1bGUJVG9yb250bwkxOTIyCTE5MjYJLQlTZXAJU3VuPj0xNQkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5MjQJMTkyNwktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKLSMgVGhlIDE5MjctdG8tMTkzOSBydWxlcyBjYW4gYmUgZXhwcmVzc2VkIG1vcmUgc2ltcGx5IGFzCi0jIFJ1bGUJVG9yb250bwkxOTI3CTE5MzcJLQlTZXAJU3VuPj0yNQkyOjAwCTAJUwotIyBSdWxlCVRvcm9udG8JMTkyOAkxOTM3CS0JQXByCVN1bj49MjUJMjowMAkxOjAwCUQKLSMgUnVsZQlUb3JvbnRvCTE5MzgJMTk0MAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi0jIFJ1bGUJVG9yb250bwkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotIyBUaGUgcnVsZXMgYmVsb3cgYXZvaWQgdXNlIG9mIFN1bj49MjUKLSMgKHdoaWNoIHByZS0yMDA0IHZlcnNpb25zIG9mIHppYyBjYW5ub3QgaGFuZGxlKS4KLVJ1bGUJVG9yb250bwkxOTI3CTE5MzIJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5MjgJMTkzMQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRvcm9udG8JMTkzMglvbmx5CS0JTWF5CTEJMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTMzCTE5NDAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlUb3JvbnRvCTE5MzMJb25seQktCU9jdAkxCTI6MDAJMAlTCi1SdWxlCVRvcm9udG8JMTkzNAkxOTM5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJVG9yb250bwkxOTQ1CTE5NDYJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NDYJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVRvcm9udG8JMTk0NwkxOTQ5CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTQ3CTE5NDgJLQlTZXAJbGFzdFN1bgkwOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NDkJb25seQktCU5vdglsYXN0U3VuCTA6MDAJMAlTCi1SdWxlCVRvcm9udG8JMTk1MAkxOTczCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJVG9yb250bwkxOTUwCW9ubHkJLQlOb3YJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlUb3JvbnRvCTE5NTEJMTk1NgktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgVG9yb250byBlbmRlZCBEU1QgYSB3ZWVrIGVhcmx5IGluIDE5NzEsCi0jIG5hbWVseSBvbiAxOTcxLTEwLTI0LCBidXQgTWFyayBCcmFkZXIgd3JvdGUgKDIwMDMtMDUtMzEpIHRoYXQgdGhpcwotIyBpcyB3cm9uZywgYW5kIHRoYXQgaGUgaGFkIGNvbmZpcm1lZCBpdCBieSBjaGVja2luZyB0aGUgMTk3MS0xMC0zMAotIyBUb3JvbnRvIFN0YXIsIHdoaWNoIHNhaWQgdGhhdCBEU1Qgd2FzIGVuZGluZyAxOTcxLTEwLTMxIGFzIHVzdWFsLgotUnVsZQlUb3JvbnRvCTE5NTcJMTk3MwktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwMy0wNy0yNyk6Ci0jIFdpbGxldHQgKDE5MTQtMDMpIHdyaXRlcyAocC4gMTcpICJJbiB0aGUgQ2l0aWVzIG9mIEZvcnQgV2lsbGlhbSwgYW5kCi0jIFBvcnQgQXJ0aHVyLCBPbnRhcmlvLCB0aGUgcHJpbmNpcGxlIG9mIHRoZSBCaWxsIGhhcyBiZWVuIGluCi0jIG9wZXJhdGlvbiBmb3IgdGhlIHBhc3QgdGhyZWUgeWVhcnMsIGFuZCBpbiB0aGUgQ2l0eSBvZiBNb29zZSBKYXcsCi0jIFNhc2thdGNoZXdhbiwgZm9yIG9uZSB5ZWFyLiIKLQotIyBGcm9tIERhdmlkIEJyeWFuIHZpYSBUb3J5IFRyb25ydWQsIERpcmVjdG9yL0N1cmF0b3IsCi0jIFRodW5kZXIgQmF5IE11c2V1bSAoMjAwMy0xMS0xMik6Ci0jIFRoZXJlIGlzIHNvbWUgc3VnZ2VzdGlvbiwgaG93ZXZlciwgdGhhdCwgYnktbGF3IG9yIG5vdCwgZGF5bGlnaHQKLSMgc2F2aW5ncyB0aW1lIHdhcyBiZWluZyBwcmFjdGljZWQgaW4gRm9ydCBXaWxsaWFtIGFuZCBQb3J0IEFydGh1cgotIyBiZWZvcmUgMTkwOS4uLi4gW0ldbiAxOTEwLCB0aGUgbGluZSBiZXR3ZWVuIHRoZSBFYXN0ZXJuIGFuZCBDZW50cmFsCi0jIFRpbWUgWm9uZXMgd2FzIHBlcm1hbmVudGx5IG1vdmVkIGFib3V0IHR3byBodW5kcmVkIG1pbGVzIHdlc3QgdG8KLSMgaW5jbHVkZSB0aGUgVGh1bmRlciBCYXkgYXJlYS4uLi4gIFdoZW4gQ2FuYWRhIGFkb3B0ZWQgZGF5bGlnaHQKLSMgc2F2aW5ncyB0aW1lIGluIDE5MTYsIEZvcnQgV2lsbGlhbSBhbmQgUG9ydCBBcnRodXIsIGhhdmluZyBkb25lIHNvCi0jIGFscmVhZHksIGRpZCBub3QgY2hhbmdlIHRoZWlyIGNsb2Nrcy4uLi4gIER1cmluZyB0aGUgU2Vjb25kIFdvcmxkCi0jIFdhciwuLi4gW3RdaGUgY2l0aWVzIGFncmVlZCB0byBpbXBsZW1lbnQgRFNUIGR1cmluZyB0aGUgc3VtbWVyCi0jIG1vbnRocyBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgd2FyIHllYXJzLgotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvVG9yb250bwktNToxNzozMiAtCUxNVAkxODk1Ci0JCQktNTowMAlDYW5hZGEJRSVzVAkxOTE5Ci0JCQktNTowMAlUb3JvbnRvCUUlc1QJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NDYKLQkJCS01OjAwCVRvcm9udG8JRSVzVAkxOTc0Ci0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL1RodW5kZXJfQmF5IC01OjU3OjAwIC0JTE1UCTE4OTUKLQkJCS02OjAwCS0JQ1NUCTE5MTAKLQkJCS01OjAwCS0JRVNUCTE5NDIKLQkJCS01OjAwCUNhbmFkYQlFJXNUCTE5NzAKLQkJCS01OjAwCU1vbnQJRSVzVAkxOTczCi0JCQktNTowMAktCUVTVAkxOTc0Ci0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL05pcGlnb24JLTU6NTM6MDQgLQlMTVQJMTg5NQotCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk0MCBTZXAgMjkKLQkJCS01OjAwCTE6MDAJRURUCTE5NDIgRmViICA5IDI6MDBzCi0JCQktNTowMAlDYW5hZGEJRSVzVAotWm9uZSBBbWVyaWNhL1JhaW55X1JpdmVyIC02OjE4OjE2IC0JTE1UCTE4OTUKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDAgU2VwIDI5Ci0JCQktNjowMAkxOjAwCUNEVAkxOTQyIEZlYiAgOSAyOjAwcwotCQkJLTY6MDAJQ2FuYWRhCUMlc1QKLVpvbmUgQW1lcmljYS9BdGlrb2thbgktNjowNjoyOCAtCUxNVAkxODk1Ci0JCQktNjowMAlDYW5hZGEJQyVzVAkxOTQwIFNlcCAyOQotCQkJLTY6MDAJMTowMAlDRFQJMTk0MiBGZWIgIDkgMjowMHMKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTE5NDUgU2VwIDMwIDI6MDAKLQkJCS01OjAwCS0JRVNUCi0KLQotIyBNYW5pdG9iYQotCi0jIEZyb20gUm9iIERvdWdsYXMgKDIwMDYtMDQtMDYpOgotIyB0aGUgb2xkIE1hbml0b2JhIFRpbWUgQWN0IC0gYXMgYW1lbmRlZCBieSBCaWxsIDIsIGFzc2VudGVkIHRvCi0jIE1hcmNoIDI3LCAxOTg3IC4uLiBzYWlkIC4uLgotIyAiYmV0d2VlbiB0d28gbydjbG9jayBDZW50cmFsIFN0YW5kYXJkIFRpbWUgaW4gdGhlIG1vcm5pbmcgb2YKLSMgdGhlIGZpcnN0IFN1bmRheSBvZiBBcHJpbCBvZiBlYWNoIHllYXIgYW5kIHR3byBvJ2Nsb2NrIENlbnRyYWwKLSMgU3RhbmRhcmQgVGltZSBpbiB0aGUgbW9ybmluZyBvZiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2JlciBuZXh0Ci0jIGZvbGxvd2luZywgb25lIGhvdXIgaW4gYWR2YW5jZSBvZiBDZW50cmFsIFN0YW5kYXJkIFRpbWUuIi4uLgotIyBJIGJlbGlldmUgdGhhdCB0aGUgRW5nbGlzaCBsZWdpc2xhdGlvbiBbb2YgdGhlIG9sZCB0aW1lIGFjdF0gaGFkID0KLSMgYmVlbiBhc3NlbnRlZCB0byAoTWFyY2ggMjIsIDE5NjcpLi4uLgotIyBBbHNvLCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhlcmUgd2FzIG5vIG9yZGVyLWluLWNvdW5jaWwgdmFyeWluZwotIyB0aGUgdGltZSBvZiBEYXlsaWdodCBTYXZpbmcgVGltZSBmb3IgMjAwNSBhbmQgc28gdGhlIHByb3Zpc2lvbnMgb2YKLSMgdGhlIDE5ODcgdmVyc2lvbiB3b3VsZCBhcHBseSAtIHRoZSBjaGFuZ2VvdmVyIHdhcyBhdCAyOjAwIENlbnRyYWwKLSMgU3RhbmRhcmQgVGltZSAoaS5lLiBub3QgdW50aWwgMzowMCBDZW50cmFsIERheWxpZ2h0IFRpbWUpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDQtMTApOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IE1hbml0b2JhIHN3aXRjaGVkIGF0IDAyOjAwIChub3QgMDI6MDBzKQotIyBzdGFydGluZyAxOTY2LiAgU2luY2UgMDI6MDBzIGlzIGNsZWFybHkgY29ycmVjdCBmb3IgMTk2NyBvbiwgYXNzdW1lCi0jIGl0IHdhcyBhbHNvIDAyOjAwcyBpbiAxOTY2LgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlXaW5uCTE5MTYJb25seQktCUFwcgkyMwkwOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MTYJb25seQktCVNlcAkxNwkwOjAwCTAJUwotUnVsZQlXaW5uCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlXaW5uCTE5MzcJb25seQktCU1heQkxNgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5MzcJb25seQktCVNlcAkyNgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlXaW5uCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJV2lubgkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDYJb25seQktCU1heQkxMgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NDcJMTk0OQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVdpbm4JMTk0NwkxOTQ5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJV2lubgkxOTUwCW9ubHkJLQlNYXkJIDEJMjowMAkxOjAwCUQKLVJ1bGUJV2lubgkxOTUwCW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJV2lubgkxOTUxCTE5NjAJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlXaW5uCTE5NTEJMTk1OAktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVdpbm4JMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJV2lubgkxOTYwCW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlXaW5uCTE5NjMJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVdpbm4JMTk2Mwlvbmx5CS0JU2VwCTIyCTI6MDAJMAlTCi1SdWxlCVdpbm4JMTk2NgkxOTg2CS0JQXByCWxhc3RTdW4JMjowMHMJMTowMAlECi1SdWxlCVdpbm4JMTk2NgkyMDA1CS0JT2N0CWxhc3RTdW4JMjowMHMJMAlTCi1SdWxlCVdpbm4JMTk4NwkyMDA1CS0JQXByCVN1bj49MQkyOjAwcwkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9XaW5uaXBlZwktNjoyODozNiAtCUxNVAkxODg3IEp1bCAxNgotCQkJLTY6MDAJV2lubglDJXNUCTIwMDYKLQkJCS02OjAwCUNhbmFkYQlDJXNUCi0KLQotIyBTYXNrYXRjaGV3YW4KLQotIyBGcm9tIE1hcmsgQnJhZGVyICgyMDAzLTA3LTI2KToKLSMgVGhlIGZpcnN0IGFjdHVhbCBhZG9wdGlvbiBvZiBEU1QgaW4gQ2FuYWRhIHdhcyBhdCB0aGUgbXVuaWNpcGFsCi0jIGxldmVsLiAgQXMgdGhlIFtUb3JvbnRvXSBTdGFyIHB1dCBpdCAoMTkxMi0wNi0wNyksICJXaGlsZSBwZW9wbGUKLSMgZWxzZXdoZXJlIGhhdmUgbG9uZyBiZWVuIHRhbGtpbmcgb2YgbGVnaXNsYXRpb24gdG8gc2F2ZSBkYXlsaWdodCwKLSMgdGhlIGNpdHkgb2YgTW9vc2UgSmF3IFtTYXNrYXRjaGV3YW5dIGhhcyBhY3RlZCBvbiBpdHMgb3duIGhvb2suIgotIyBEU1QgaW4gTW9vc2UgSmF3IGJlZ2FuIG9uIFNhdHVyZGF5LCAxOTEyLTA2LTAxIChubyB0aW1lIG1lbnRpb25lZDoKLSMgcHJlc3VtYWJseSBsYXRlIGV2ZW5pbmcsIGFzIGJlbG93KSwgYW5kIHdvdWxkIHJ1biB1bnRpbCAidGhlIGVuZCBvZgotIyB0aGUgc3VtbWVyIi4gIFRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIG11bmljaXBhbCB0aW1lIGFuZCByYWlscm9hZAotIyB0aW1lIHdhcyBub3RlZC4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAzLTA3LTI3KToKLSMgV2lsbGV0dCAoMTkxNC0wMykgbm90ZXMgdGhhdCBEU1QgImhhcyBiZWVuIGluIG9wZXJhdGlvbiAuLi4gaW4gdGhlCi0jIENpdHkgb2YgTW9vc2UgSmF3LCBTYXNrYXRjaGV3YW4sIGZvciBvbmUgeWVhci4iCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0wMy0yMik6Ci0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgdGhhdCBzaW5jZSAxOTcwIHRoaXMgcmVnaW9uIGhhcyBtb3N0bHkgYmVlbiBhcyBSZWdpbmEuCi0jIFNvbWUgd2VzdGVybiB0b3ducyAoZS5nLiBTd2lmdCBDdXJyZW50KSBzd2l0Y2hlZCBmcm9tIE1TVC9NRFQgdG8gQ1NUIGluIDE5NzIuCi0jIE90aGVyIHdlc3Rlcm4gdG93bnMgKGUuZy4gTGxveWRtaW5zdGVyKSBhcmUgbGlrZSBFZG1vbnRvbi4KLSMgTWF0dGhld3MgYW5kIFZpbmNlbnQgKDE5OTgpIHdyaXRlIHRoYXQgRGVuYXJlIEJlYWNoIGFuZCBDcmVpZ2h0b24KLSMgYXJlIGxpa2UgV2lubmlwZWcsIGluIHZpb2xhdGlvbiBvZiBTYXNrYXRjaGV3YW4gbGF3LgotCi0jIEZyb20gVy4gSm9uZXMgKDE5OTItMTEtMDYpOgotIyBUaGUuIC4gLmJlbG93IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIEkgZ290IGZyb20gb3VyIGxhdyBsaWJyYXJ5LCB0aGUKLSMgcHJvdmluY2lhbCBhcmNoaXZlcywgYW5kIHRoZSBwcm92aW5jaWFsIENvbW11bml0eSBTZXJ2aWNlcyBkZXBhcnRtZW50LgotIyBBIHByZWNpc2UgaGlzdG9yeSB3b3VsZCByZXF1aXJlIGRpZ2dpbmcgdGhyb3VnaCBuZXdzcGFwZXIgYXJjaGl2ZXMsIGFuZAotIyBzaW5jZSB5b3UgZGlkbid0IHNheSB3aGF0IHlvdSB3YW50ZWQsIEkgZGlkbid0IGJvdGhlci4KLSMKLSMgU2Fza2F0Y2hld2FuIGlzIHNwbGl0IGJ5IGEgdGltZSB6b25lIG1lcmlkaWFuICgxMDVXKSBhbmQgb3ZlciB0aGUgeWVhcnMKLSMgdGhlIGJvdW5kYXJ5IGJlY2FtZSBwcmV0dHkgcmFnZ2VkIGFzIGNvbW11bml0aWVzIG5lYXIgaXQgcmVldmFsdWF0ZWQKLSMgdGhlaXIgYWZmaWxpYXRpb25zIGluIG9uZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLiAgSW4gMTk2NSBhIHByb3ZpbmNpYWwKLSMgcmVmZXJlbmR1bSBmYXZvdXJlZCBsZWdpc2xhdGluZyBjb21tb24gdGltZSBwcmFjdGljZXMuCi0jCi0jIE9uIDE1IEFwcmlsIDE5NjYgdGhlIFRpbWUgQWN0IChjLiBULTE0LCBSZXZpc2VkIFN0YXR1dGVzIG9mCi0jIFNhc2thdGNoZXdhbiAxOTc4KSB3YXMgcHJvY2xhaW1lZCwgYW5kIGVzdGFibGlzaGVkIHRoYXQgdGhlIGVhc3Rlcm4KLSMgcGFydCBvZiBTYXNrYXRjaGV3YW4gd291bGQgdXNlIENTVCB5ZWFyIHJvdW5kLCB0aGF0IGRpc3RyaWN0cyBpbgotIyBub3J0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkIGJ5IGRlZmF1bHQgZm9sbG93IENTVCBidXQgY291bGQgb3B0IHRvCi0jIGZvbGxvdyBNb3VudGFpbiBUaW1lIHJ1bGVzICh0aHVzIDEgaG91ciBkaWZmZXJlbmNlIGluIHRoZSB3aW50ZXIgYW5kCi0jIHplcm8gaW4gdGhlIHN1bW1lciksIGFuZCB0aGF0IGRpc3RyaWN0cyBpbiBzb3V0aHdlc3QgU2Fza2F0Y2hld2FuIHdvdWxkCi0jIGJ5IGRlZmF1bHQgZm9sbG93IE1UIGJ1dCBjb3VsZCBvcHQgdG8gZm9sbG93IENTVC4KLSMKLSMgSXQgdG9vayBhIGZldyB5ZWFycyBmb3IgdGhlIGR1c3QgdG8gc2V0dGxlIChJIGtub3cgb25lIHN0b3J5IG9mIGEgdG93bgotIyBvbiBvbmUgdGltZSB6b25lIGhhdmluZyBpdHMgc2Nob29sIGluIGFub3RoZXIsIHN1Y2ggdGhhdCBhIG1vbSBoYWQgdG8KLSMgc2VydmUgaGVyIGZhbWlseSBsdW5jaCBpbiB0d28gc2hpZnRzKSwgYnV0IHByZXNlbnRseSBpdCBzZWVtcyB0aGF0IG9ubHkKLSMgYSBmZXcgdG93bnMgb24gdGhlIGJvcmRlciB3aXRoIEFsYmVydGEgKGUuZy4gTGxveWRtaW5zdGVyKSBmb2xsb3cgTVQKLSMgcnVsZXMgYW55IG1vcmU7IGFsbCBvdGhlciBkaXN0cmljdHMgYXBwZWFyIHRvIGhhdmUgdXNlZCBDU1QgeWVhciByb3VuZAotIyBzaW5jZSBzb21ldGltZSBpbiB0aGUgMTk2MHMuCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDYtMDYtMjYpOgotIyBUaGUgU2Fza2F0Y2hld2FuIHRpbWUgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk5NiBpcyBhYm91dCAzMCBwYWdlcwotIyBsb25nIGFuZCByYXRoZXIgcGFpbmZ1bCB0byByZWFkLgotIyBodHRwOi8vd3d3LnFwLmdvdi5zay5jYS9kb2N1bWVudHMvRW5nbGlzaC9TdGF0dXRlcy9TdGF0dXRlcy9UMTQucGRmCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVJlZ2luYQkxOTE4CW9ubHkJLQlBcHIJMTQJMjowMAkxOjAwCUQKLVJ1bGUJUmVnaW5hCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTkzMAkxOTM0CS0JT2N0CVN1bj49MQkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzNwkxOTQxCS0JQXByCVN1bj49OAkwOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTkzNwlvbmx5CS0JT2N0CVN1bj49OAkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzOAlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTkzOQkxOTQxCS0JT2N0CVN1bj49OAkwOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0Mglvbmx5CS0JRmViCSA5CTI6MDAJMTowMAlXICMgV2FyCi1SdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlBdWcJMTQJMjM6MDB1CTE6MDAJUCAjIFBlYWNlCi1SdWxlCVJlZ2luYQkxOTQ1CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTk0Nglvbmx5CS0JT2N0CVN1bj49OAkyOjAwCTAJUwotUnVsZQlSZWdpbmEJMTk0NwkxOTU3CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJUmVnaW5hCTE5NDcJMTk1NwktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVJlZ2luYQkxOTU5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlSZWdpbmEJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMKLVJ1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3dpZnQJMTk1Nwlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3dpZnQJMTk1OQkxOTYxCS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJU3dpZnQJMTk1OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3dpZnQJMTk2MAkxOTYxCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9SZWdpbmEJLTY6NTg6MzYgLQlMTVQJMTkwNSBTZXAKLQkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NjAgQXByIGxhc3RTdW4gMjowMAotCQkJLTY6MDAJLQlDU1QKLVpvbmUgQW1lcmljYS9Td2lmdF9DdXJyZW50IC03OjExOjIwIC0JTE1UCTE5MDUgU2VwCi0JCQktNzowMAlDYW5hZGEJTSVzVAkxOTQ2IEFwciBsYXN0U3VuIDI6MDAKLQkJCS03OjAwCVJlZ2luYQlNJXNUCTE5NTAKLQkJCS03OjAwCVN3aWZ0CU0lc1QJMTk3MiBBcHIgbGFzdFN1biAyOjAwCi0JCQktNjowMAktCUNTVAotCi0KLSMgQWxiZXJ0YQotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlFZG0JMTkxOAkxOTE5CS0JQXByCVN1bj49OAkyOjAwCTE6MDAJRAotUnVsZQlFZG0JMTkxOAlvbmx5CS0JT2N0CTMxCTI6MDAJMAlTCi1SdWxlCUVkbQkxOTE5CW9ubHkJLQlNYXkJMjcJMjowMAkwCVMKLVJ1bGUJRWRtCTE5MjAJMTkyMwktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTIwCW9ubHkJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlFZG0JMTkyMQkxOTIzCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlFZG0JMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQotUnVsZQlFZG0JMTk0NQlvbmx5CS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NDcJb25seQktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTQ3CW9ubHkJLQlTZXAJbGFzdFN1bgkyOjAwCTAJUwotUnVsZQlFZG0JMTk2Nwlvbmx5CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJRWRtCTE5NjcJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUVkbQkxOTY5CW9ubHkJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlFZG0JMTk2OQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJRWRtCTE5NzIJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCUVkbQkxOTcyCTIwMDYJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0VkbW9udG9uCS03OjMzOjUyIC0JTE1UCTE5MDYgU2VwCi0JCQktNzowMAlFZG0JTSVzVAkxOTg3Ci0JCQktNzowMAlDYW5hZGEJTSVzVAotCi0KLSMgQnJpdGlzaCBDb2x1bWJpYQotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBzaW5jZSAxOTcwIG1vc3Qgb2YgdGhpcyByZWdpb24gaGFzCi0jIGJlZW4gbGlrZSBWYW5jb3V2ZXIuCi0jIERhd3NvbiBDcmVlayB1c2VzIE1TVC4gIE11Y2ggb2YgZWFzdCBCQyBpcyBsaWtlIEVkbW9udG9uLgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgd3JpdGUgdGhhdCBDcmVzdG9uIGlzIGxpa2UgRGF3c29uIENyZWVrLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlWYW5jCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlWYW5jCTE5MTgJb25seQktCU9jdAkzMQkyOjAwCTAJUwotUnVsZQlWYW5jCTE5NDIJb25seQktCUZlYgkgOQkyOjAwCTE6MDAJVyAjIFdhcgotUnVsZQlWYW5jCTE5NDUJb25seQktCUF1ZwkxNAkyMzowMHUJMTowMAlQICMgUGVhY2UKLVJ1bGUJVmFuYwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJVmFuYwkxOTQ2CTE5ODYJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlWYW5jCTE5NDYJb25seQktCU9jdAkxMwkyOjAwCTAJUwotUnVsZQlWYW5jCTE5NDcJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVZhbmMJMTk2MgkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9WYW5jb3V2ZXIJLTg6MTI6MjggLQlMTVQJMTg4NAotCQkJLTg6MDAJVmFuYwlQJXNUCTE5ODcKLQkJCS04OjAwCUNhbmFkYQlQJXNUCi1ab25lIEFtZXJpY2EvRGF3c29uX0NyZWVrIC04OjAwOjU2IC0JTE1UCTE4ODQKLQkJCS04OjAwCUNhbmFkYQlQJXNUCTE5NDcKLQkJCS04OjAwCVZhbmMJUCVzVAkxOTcyIEF1ZyAzMCAyOjAwCi0JCQktNzowMAktCU1TVAotCi0KLSMgTm9ydGh3ZXN0IFRlcnJpdG9yaWVzLCBOdW5hdnV0LCBZdWtvbgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBEYXdzb24gc3dpdGNoZWQgdG8gUFNUIGluIDE5NzMuICBJbnV2aWsgc3dpdGNoZWQgdG8gTVNUIGluIDE5NzkuCi0jIE1hdGhldyBFbmdsYW5kZXIgKDE5OTYtMTAtMDcpIGdpdmVzIHRoZSBmb2xsb3dpbmcgcmVmczoKLSMJKiAxOTY3LiBQYXJhZ3JhcGggMjgoMzQpKGcpIG9mIHRoZSBJbnRlcnByZXRhdGlvbiBBY3QsIFMuQy4gMTk2Ny02OCwKLSMJYy4gNyBkZWZpbmVzIFl1a29uIHN0YW5kYXJkIHRpbWUgYXMgVVRDLTkuICBUaGlzIGlzIHN0aWxsIHZhbGlkOwotIwlzZWUgSW50ZXJwcmV0YXRpb24gQWN0LCBSLlMuQy4gMTk4NSwgYy4gSS0yMSwgcy4gMzUoMSkuCi0jCSogQy5PLiAxOTczLzIxNCBzd2l0Y2hlZCBZdWtvbiB0byBQU1Qgb24gMTk3My0xMC0yOCAwMDowMC4KLSMJKiBPLkkuQy4gMTk4MC8wMiBlc3RhYmxpc2hlZCBEU1QuCi0jCSogTy5JLkMuIDE5ODcvMDU2IGNoYW5nZWQgRFNUIHRvIEFwciBmaXJzdFN1biAyOjAwIHRvIE9jdCBsYXN0U3VuIDI6MDAuCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgWXVrb24ncyAxOTczLTEwLTI4IHN3aXRjaCB3YXMgYXQgMjowMDsgZ28KLSMgd2l0aCBFbmdsYW5kZXIuCi0jIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA2LTA2LTI2KToKLSMgSGVyZSBpcyBhIGxpbmsgdG8gdGhlIG9sZCBkYXlsaWdodCBzYXZpbmcgcG9ydGlvbiBvZiB0aGUgaW50ZXJwcmV0YXRpb24KLSMgYWN0IHdoaWNoIHdhcyBsYXN0IHVwZGF0ZWQgaW4gMTk4NzoKLSMgaHR0cDovL3d3dy5nb3YueWsuY2EvbGVnaXNsYXRpb24vcmVncy9vaWMxOTg3XzA1Ni5wZGYKLQotIyBGcm9tIFJpdmVzIE1jRG93ICgxOTk5LTA5LTA0KToKLSMgTnVuYXZ1dCAuLi4gbW92ZWQgLi4uIHRvIGluY29ycG9yYXRlIHRoZSB3aG9sZSB0ZXJyaXRvcnkgaW50byBvbmUgdGltZSB6b25lLgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vbnVuYXZ1dC9udnQ5MDkwM18xMy5odG1sIj4KLSMgTnVuYXZ1dCBtb3ZlcyB0byBzaW5nbGUgdGltZSB6b25lIE9jdC4gMzEKLSMgPC9hPgotIwotIyBGcm9tIEFudG9pbmUgTGVjYSAoMTk5OS0wOS0wNik6Ci0jIFdlIHRoZW4gbmVlZCB0byBjcmVhdGUgYSBuZXcgdGltZXpvbmUgZm9yIHRoZSBLaXRpa21lb3QgcmVnaW9uIG9mIE51bmF2dXQKLSMgdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBZZWxsb3drbmlmZSByZWdpb24uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5OS0wOS0yMCk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuYXZ1dC5jb20vYmFzaWNmYWN0cy9lbmdsaXNoL2Jhc2ljZmFjdHNfMXRlcnJpdG9yeS5odG1sIj4KLSMgQmFzaWMgRmFjdHM6IFRoZSBOZXcgVGVycml0b3J5Ci0jIDwvYT4gKDE5OTkpIHJlcG9ydHMgdGhhdCBQYW5nbmlydHVuZyBvcGVyYXRlcyBvbiBlYXN0ZXJuIHRpbWUsCi0jIGFuZCB0aGF0IENvcmFsIEhhcmJvdXIgZG9lcyBub3Qgb2JzZXJ2ZSBEU1QuICBXZSBkb24ndCBrbm93IHdoZW4KLSMgUGFuZ25pcnR1bmcgc3dpdGNoZWQgdG8gZWFzdGVybiB0aW1lOyB3ZSdsbCBndWVzcyAxOTk1LgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTktMTEtMDgpOgotIyBPbiBPY3RvYmVyIDMxLCB3aGVuIHRoZSByZXN0IG9mIE51bmF2dXQgd2VudCB0byBDZW50cmFsIHRpbWUsCi0jIFBhbmduaXJ0dW5nIHdvYmJsZWQuICBIZXJlIGlzIHRoZSByZXN1bHQgb2YgdGhlaXIgd29iYmxlOgotIwotIyBUaGUgZm9sbG93aW5nIGJ1c2luZXNzZXMgYW5kIG9yZ2FuaXphdGlvbnMgaW4gUGFuZ25pcnR1bmcgdXNlIENlbnRyYWwgVGltZToKLSMKLSMJRmlyc3QgQWlyLCBQb3dlciBDb3JwLCBOdW5hdnV0IENvbnN0cnVjdGlvbiwgSGVhbHRoIENlbnRlciwgUkNNUCwKLSMJRWFzdGVybiBBcmN0aWMgTmF0aW9uYWwgUGFya3MsIEEgJiBEIFNwZWNpYWxpc3QKLSMKLSMgVGhlIGZvbGxvd2luZyBidXNpbmVzc2VzIGFuZCBvcmdhbml6YXRpb25zIGluIFBhbmduaXJ0dW5nIHVzZSBFYXN0ZXJuIFRpbWU6Ci0jCi0jCUhhbWxldCBvZmZpY2UsIEFsbCBvdGhlciBidXNpbmVzc2VzLCBCb3RoIHNjaG9vbHMsIEFpcnBvcnQgb3BlcmF0b3IKLSMKLSMgVGhpcyBoYXMgbWFkZSBmb3IgYW4gaW50ZXJlc3Rpbmcgc2l0dWF0aW9uIHRoZXJlLCB3aGljaCB3YXJyYW50ZWQgdGhlIG5ld3MuCi0jIE5vIG9uZSB0aGVyZSB0aGF0IEkgc3Bva2Ugd2l0aCBzZWVtcyBjb25jZXJuZWQsIG9yIGhhcyBwbGFucyB0bwotIyBjaGFuZ2UgdGhlIGxvY2FsIG1ldGhvZHMgb2Yga2VlcGluZyB0aW1lLCBhcyBpdCBldmlkZW50bHkgZG9lcyBub3QKLSMgcmVhbGx5IGludGVyZmVyZSB3aXRoIGFueSBhY3Rpdml0aWVzIG9yIG1ha2UgdGhpbmdzIGRpZmZpY3VsdCBsb2NhbGx5LgotIyBUaGV5IHBsYW4gdG8gY2VsZWJyYXRlIE5ldyBZZWFyJ3MgdHVybi1vdmVyIHR3aWNlLCBvbmUgaG91ciBhcGFydCwKLSMgc28gaXQgYXBwZWFycyB0aGF0IHRoZSBzaXR1YXRpb24gd2lsbCBsYXN0IGF0IGxlYXN0IHRoYXQgbG9uZy4KLSMgVGhlIE51bmF2dXQgSW50ZXJnb3Zlcm5tZW50YWwgQWZmYWlycyBob3BlcyB0aGF0IHRoZXkgd2lsbCAiY29tZSB0bwotIyB0aGVpciBzZW5zZXMiLCBidXQgdGhlIGxvY2FscyBldmlkZW50bHkgZG9uJ3Qgc2VlIGFueSBwcm9ibGVtIHdpdGgKLSMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWZmYWlycy4KLQotIyBGcm9tIE1pY2hhZWxhIFJvZHJpZ3VlLCB3cml0aW5nIGluIHRoZQotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm51bmF0c2lhcS5jb20vYXJjaGl2ZXMvbnVuYXZ1dDk5MTEzMC9udnQ5MTExOV8xNy5odG1sIj4KLSMgTnVuYXRzaWFxIE5ld3MgKDE5OTktMTEtMTkpPC9hPjoKLSMgQ2x5ZGUgUml2ZXIsIFBhbmduaXJ0dW5nIGFuZCBTYW5pa2lsdWFxIG5vdyBvcGVyYXRlIHdpdGggdHdvIHRpbWUgem9uZXMsCi0jIGNlbnRyYWwgLSBvciBOdW5hdnV0IHRpbWUgLSBmb3IgZ292ZXJubWVudCBvZmZpY2VzLCBhbmQgZWFzdGVybiB0aW1lCi0jIGZvciBtdW5pY2lwYWwgb2ZmaWNlcyBhbmQgc2Nob29scy4uLi4gIElnbG9vbGlrIFt3YXMgc2ltaWxhciBidXQgdGhlbl0KLSMgbWFkZSB0aGUgc3dpdGNoIHRvIGNlbnRyYWwgdGltZSBvbiBTYXR1cmRheSwgTm92LiA2LgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTAtMDIpOgotIyBNYXR0aGV3cyBhbmQgVmluY2VudCAoMTk5OCkgc2F5IHRoZSBmb2xsb3dpbmcsIGJ1dCB3ZSBsYWNrIGhpc3RvcmllcwotIyBmb3IgdGhlc2UgcG90ZW50aWFsIG5ldyBab25lcy4KLSMKLSMgVGhlIENhbmFkaWFuIEZvcmNlcyBzdGF0aW9uIGF0IEFsZXJ0IHVzZXMgRWFzdGVybiBUaW1lIHdoaWxlIHRoZQotIyBoYW5kZnVsIG9mIHJlc2lkZW50cyBhdCB0aGUgRXVyZWthIHdlYXRoZXIgc3RhdGlvbiBbaW4gdGhlIENlbnRyYWwKLSMgem9uZV0gc2tpcCBkYXlsaWdodCBzYXZpbmdzLiAgQmFmZmluIElzbGFuZCwgd2hpY2ggaXMgY3Jvc3NlZCBieSB0aGUKLSMgQ2VudHJhbCwgRWFzdGVybiBhbmQgQXRsYW50aWMgVGltZSB6b25lcyBvbmx5IHVzZXMgRWFzdGVybiBUaW1lLgotIyBHam9hIEhhdmVuLCBUYWxveW9hayBhbmQgUGVsbHkgQmF5IGFsbCB1c2UgTW91bnRhaW4gaW5zdGVhZCBvZgotIyBDZW50cmFsIFRpbWUgYW5kIFNvdXRoYW1wdG9uIElzbGFuZCBbaW4gdGhlIENlbnRyYWwgem9uZV0gaXMgbm90Ci0jIHJlcXVpcmVkIHRvIHVzZSBkYXlsaWdodCBzYXZpbmdzLgotCi0jIEZyb20KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5udW5hdHNpYXEuY29tL2FyY2hpdmVzL251bmF2dXQwMDExMzAvbnZ0MjExMTBfMDIuaHRtbCI+Ci0jIE51bmF2dXQgbm93IGhhcyB0d28gdGltZSB6b25lcwotIyA8L2E+ICgyMDAwLTExLTEwKToKLSMgVGhlIE51bmF2dXQgZ292ZXJubWVudCB3b3VsZCBhbGxvdyBpdHMgZW1wbG95ZWVzIGluIEt1Z2x1a3R1ayBhbmQKLSMgQ2FtYnJpZGdlIEJheSB0byBvcGVyYXRlIG9uIGNlbnRyYWwgdGltZSB5ZWFyLXJvdW5kLCBwdXR0aW5nIHRoZW0KLSMgb25lIGhvdXIgYmVoaW5kIHRoZSByZXN0IG9mIE51bmF2dXQgZm9yIHNpeCBtb250aHMgZHVyaW5nIHRoZSB3aW50ZXIuCi0jIEF0IHRoZSBlbmQgb2YgT2N0b2JlciB0aGUgdHdvIGNvbW11bml0aWVzIGhhZCByZWJlbGxlZCBhZ2FpbnN0Ci0jIE51bmF2dXQncyB1bmlmaWVkIHRpbWUgem9uZSwgcmVmdXNpbmcgdG8gc2hpZnQgdG8gZWFzdGVybiB0aW1lIHdpdGgKLSMgdGhlIHJlc3Qgb2YgdGhlIHRlcnJpdG9yeSBmb3IgdGhlIHdpbnRlci4gIENhbWJyaWRnZSBCYXkgcmVtYWluZWQgb24KLSMgY2VudHJhbCB0aW1lLCB3aGlsZSBLdWdsdWt0dWssIGV2ZW4gZmFydGhlciB3ZXN0LCByZXZlcnRlZCB0bwotIyBtb3VudGFpbiB0aW1lLCB3aGljaCB0aGV5IGhhZCB1c2VkIGJlZm9yZSB0aGUgYWR2ZW50IG9mIE51bmF2dXQncwotIyB1bmlmaWVkIHRpbWUgem9uZSBpbiAxOTk5LgotIwotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTAxLTIwKSwgcXVvdGluZyB0aGUgTnVuYXZ1dCBnb3Zlcm5tZW50OgotIyBUaGUgcHJlY2VkaW5nIGRlY2lzaW9uIGNhbWUgaW50byBlZmZlY3QgYXQgbWlkbmlnaHQsIFNhdHVyZGF5IE5vdiA0LCAyMDAwLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgotIyBMZXQncyBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIG9mZmljaWFsIHRpbWVzIGZvciBub3cuCi0KLSMgRnJvbSBSaXZlcyBNY0RvdyAoMjAwMS0wMy0wNyk6Ci0jIFRoZSBwcmVtaWVyIG9mIE51bmF2dXQgaGFzIGlzc3VlZCBhIG1pbmlzdGVyaWFsIHN0YXRlbWVudCBhZHZpc2luZwotIyB0aGF0IGVmZmVjdGl2ZSAyMDAxLTA0LTAxLCB0aGUgdGVycml0b3J5IG9mIE51bmF2dXQgd2lsbCByZXZlcnQKLSMgYmFjayB0byB0aHJlZSB0aW1lIHpvbmVzIChtb3VudGFpbiwgY2VudHJhbCwgYW5kIGVhc3Rlcm4pLiAgT2YgdGhlCi0jIGNpdGllcyBpbiBOdW5hdnV0LCBDb3JhbCBIYXJib3IgaXMgdGhlIG9ubHkgb25lIHRoYXQgSSBrbm93IG9mIHRoYXQKLSMgaGFzIHNhaWQgaXQgd2lsbCBub3Qgb2JzZXJ2ZSBkc3QsIHN0YXlpbmcgb24gRVNUIHllYXIgcm91bmQuICBJJ20KLSMgY2hlY2tpbmcgZm9yIG1vcmUgaW5mbywgYW5kIHdpbGwgZ2V0IGJhY2sgdG8geW91IGlmIEkgY29tZSB1cCB3aXRoCi0jIG1vcmUuCi0jIFtBbHNvIHNlZSA8aHR0cDovL3d3dy5udW5hdHNpYXEuY29tL251bmF2dXQvbnZ0MTAzMDlfMDYuaHRtbD4gKDIwMDEtMDMtMDkpLl0KLQotIyBGcm9tIEd3aWxsaW0gTGF3ICgyMDA1LTA1LTIxKToKLSMgQWNjb3JkaW5nIHRvIG1hcHMgYXQKLSMgaHR0cDovL2lubXMtaWVubS5ucmMtY25yYy5nYy5jYS9pbWFnZXMvdGltZV9zZXJ2aWNlcy9UWjAxU1dFLmpwZwotIyBodHRwOi8vaW5tcy1pZW5tLm5yYy1jbnJjLmdjLmNhL2ltYWdlcy90aW1lX3NlcnZpY2VzL1RaMDFTU0UuanBnCi0jIChib3RoIGRhdGVkIDIwMDMpLCBhbmQKLSMgaHR0cDovL3d3dy5jYW5hZGlhbmdlb2dyYXBoaWMuY2EvTWFnYXppbmUvU085OC9nZW9tYXAuYXNwCi0jIChmcm9tIGEgMTk5OCBDYW5hZGlhbiBHZW9ncmFwaGljIGFydGljbGUpLCB0aGUgZGUgZmFjdG8gYW5kIGRlIGp1cmUgdGltZQotIyBmb3IgU291dGhhbXB0b24gSXNsYW5kIChhdCB0aGUgbm9ydGggZW5kIG9mIEh1ZHNvbiBCYXkpIGlzIFVUQy01IGFsbCB5ZWFyCi0jIHJvdW5kLiAgVXNpbmcgR29vZ2xlLCBpdCdzIGVhc3kgdG8gZmluZCBvdGhlciB3ZWJzaXRlcyB0aGF0IGNvbmZpcm0gdGhpcy4KLSMgSSB3YXNuJ3QgYWJsZSB0byBmaW5kIGhvdyBmYXIgYmFjayB0aGlzIHRpbWUgcmVnaW1lbiBnb2VzLCBidXQgc2luY2UgaXQKLSMgcHJlZGF0ZXMgdGhlIGNyZWF0aW9uIG9mIE51bmF2dXQsIGl0IHByb2JhYmx5IGdvZXMgYmFjayBtYW55IHllYXJzLi4uLgotIyBUaGUgSW51a3RpdHV0IG5hbWUgb2YgQ29yYWwgSGFyYm91ciBpcyBTYWxsaXQsIGJ1dCBpdCdzIHJhcmVseSB1c2VkLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA3LTI2KToKLSMgRm9yIGxhY2sgb2YgYmV0dGVyIGluZm9ybWF0aW9uLCBhc3N1bWUgdGhhdCBTb3V0aGFtcHRvbiBJc2xhbmQgb2JzZXJ2ZWQKLSMgZGF5bGlnaHQgc2F2aW5nIG9ubHkgZHVyaW5nIHdhcnRpbWUuCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMDEpOgotIyAuLi4gdGhlIGNvbW11bml0eSBvZiBSZXNvbHV0ZSAobG9jYXRlZCBvbiBDb3Jud2FsbGlzIElzbGFuZCBpbgotIyBOdW5hdnV0KSBtb3ZlZCBmcm9tIENlbnRyYWwgVGltZSB0byBFYXN0ZXJuIFRpbWUgbGFzdCBOb3ZlbWJlci4KLSMgQmFzaWNhbGx5IHRoZSBjb21tdW5pdHkgZGlkIG5vdCBjaGFuZ2UgaXRzIGNsb2NrcyBhdCB0aGUgZW5kIG9mCi0jIGRheWxpZ2h0IHNhdmluZy4uLi4KLSMgaHR0cDovL3d3dy5ubnNsLmNvbS9mcmFtZXMvbmV3c3BhcGVycy8yMDA2LTExL25vdjEzXzA2bm9uZS5odG1sCi0KLSMgRnJvbSBDaHJpcyBXYWx0b24gKDIwMDctMDMtMTQpOgotIyBUb2RheSBJIHBob25lZCB0aGUgImhhbWxldCBvZmZpY2UiIHRvIGZpbmQgb3V0IHdoYXQgUmVzb2x1dGUgd2FzIGRvaW5nIHdpdGgKLSMgaXRzIGNsb2Nrcy4KLSMKLSMgVGhlIGluZGl2aWR1YWwgdGhhdCBhbnN3ZXJlZCB0aGUgcGhvbmUgY29uZmlybWVkIHRoYXQgdGhlIGNsb2NrcyBkaWQgbm90Ci0jIG1vdmUgYXQgdGhlIGVuZCBvZiBkYXlsaWdodCBzYXZpbmcgb24gT2N0b2JlciAyOS8yMDA2LiAgSGUgYWxzbyB0b2xkIG1lIHRoYXQKLSMgdGhlIGNsb2NrcyBkaWQgbm90IG1vdmUgdGhpcyBwYXN0IHdlZWtlbmQgKE1hcmNoIDExLzIwMDcpLi4uLgotCi0jIEZyb20gQ2hyaXMgV2FsdG9uICgyMDA4LTExLTEzKToKLSMgLi4udGhlIHJlc2lkZW50cyBvZiBSZXNvbHV0ZSBiZWxpZXZlIHRoYXQgdGhleSBhcmUgY2hhbmdpbmcgInRpbWUgem9uZXMiCi0jIHR3aWNlIGEgeWVhci4gIEluIHdpbnRlciBtb250aHMsIGxvY2FsIHRpbWUgaXMgcXVhbGlmaWVkIHdpdGggIkVhc3Rlcm4KLSMgVGltZSIgd2hpY2ggaXMgcmVhbGx5ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgKFVUQy01KSIuICBJbiBzdW1tZXIKLSMgbW9udGhzLCBsb2NhbCB0aW1lIGlzIHF1YWxpZmllZCB3aXRoICJDZW50cmFsIFRpbWUiIHdoaWNoIGlzIHJlYWxseQotIyAiQ2VudHJhbCBEYXlsaWdodCBUaW1lIChVVEMtNSkiLi4uCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5UX1lLCTE5MTgJb25seQktCUFwcgkxNAkyOjAwCTE6MDAJRAotUnVsZQlOVF9ZSwkxOTE4CW9ubHkJLQlPY3QJMjcJMjowMAkwCVMKLVJ1bGUJTlRfWUsJMTkxOQlvbmx5CS0JTWF5CTI1CTI6MDAJMTowMAlECi1SdWxlCU5UX1lLCTE5MTkJb25seQktCU5vdgkgMQkwOjAwCTAJUwotUnVsZQlOVF9ZSwkxOTQyCW9ubHkJLQlGZWIJIDkJMjowMAkxOjAwCVcgIyBXYXIKLVJ1bGUJTlRfWUsJMTk0NQlvbmx5CS0JQXVnCTE0CTIzOjAwdQkxOjAwCVAgIyBQZWFjZQotUnVsZQlOVF9ZSwkxOTQ1CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJTlRfWUsJMTk2NQlvbmx5CS0JQXByCWxhc3RTdW4JMDowMAkyOjAwCURECi1SdWxlCU5UX1lLCTE5NjUJb25seQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU5UX1lLCTE5ODAJMTk4NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCU5UX1lLCTE5ODAJMjAwNgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU5UX1lLCTE5ODcJMjAwNgktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgYWthIFBhbm5pcXR1dXEKLVpvbmUgQW1lcmljYS9QYW5nbmlydHVuZyAwCS0Jenp6CTE5MjEgIyB0cmFkaW5nIHBvc3QgZXN0LgotCQkJLTQ6MDAJTlRfWUsJQSVzVAkxOTk1IEFwciBTdW4+PTEgMjowMAotCQkJLTU6MDAJQ2FuYWRhCUUlc1QJMTk5OSBPY3QgMzEgMjowMAotCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMjAwMCBPY3QgMjkgMjowMAotCQkJLTU6MDAJQ2FuYWRhCUUlc1QKLSMgZm9ybWVybHkgRnJvYmlzaGVyIEJheQotWm9uZSBBbWVyaWNhL0lxYWx1aXQJMAktCXp6egkxOTQyIEF1ZyAjIEZyb2Jpc2hlciBCYXkgZXN0LgotCQkJLTU6MDAJTlRfWUsJRSVzVAkxOTk5IE9jdCAzMSAyOjAwCi0JCQktNjowMAlDYW5hZGEJQyVzVAkyMDAwIE9jdCAyOSAyOjAwCi0JCQktNTowMAlDYW5hZGEJRSVzVAotIyBha2EgUWF1c3VpdHR1cQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUmVzb2x1dGUgMjAwNgltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlFUwotUnVsZQlSZXNvbHV0ZSAyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkwCUNECi1ab25lIEFtZXJpY2EvUmVzb2x1dGUJMAktCXp6egkxOTQ3IEF1ZyAzMSAjIFJlc29sdXRlIGZvdW5kZWQKLQkJCS02OjAwCU5UX1lLCUMlc1QJMjAwMCBPY3QgMjkgMjowMAotCQkJLTU6MDAJLQlFU1QJMjAwMSBBcHIgIDEgMzowMAotCQkJLTY6MDAJQ2FuYWRhCUMlc1QJMjAwNiBPY3QgMjkgMjowMAotCQkJLTU6MDAJUmVzb2x1dGUJJXNUCi0jIGFrYSBLYW5naXFpbmlxCi1ab25lIEFtZXJpY2EvUmFua2luX0lubGV0IDAJLQl6enoJMTk1NyAjIFJhbmtpbiBJbmxldCBmb3VuZGVkCi0JCQktNjowMAlOVF9ZSwlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDEgQXByICAxIDM6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCi0jIGFrYSBJcWFsdWt0dXV0dGlhcQotWm9uZSBBbWVyaWNhL0NhbWJyaWRnZV9CYXkgMAktCXp6egkxOTIwICMgdHJhZGluZyBwb3N0IGVzdC4/Ci0JCQktNzowMAlOVF9ZSwlNJXNUCTE5OTkgT2N0IDMxIDI6MDAKLQkJCS02OjAwCUNhbmFkYQlDJXNUCTIwMDAgT2N0IDI5IDI6MDAKLQkJCS01OjAwCS0JRVNUCTIwMDAgTm92ICA1IDA6MDAKLQkJCS02OjAwCS0JQ1NUCTIwMDEgQXByICAxIDM6MDAKLQkJCS03OjAwCUNhbmFkYQlNJXNUCi1ab25lIEFtZXJpY2EvWWVsbG93a25pZmUgMAktCXp6egkxOTM1ICMgWWVsbG93a25pZmUgZm91bmRlZD8KLQkJCS03OjAwCU5UX1lLCU0lc1QJMTk4MAotCQkJLTc6MDAJQ2FuYWRhCU0lc1QKLVpvbmUgQW1lcmljYS9JbnV2aWsJMAktCXp6egkxOTUzICMgSW51dmlrIGZvdW5kZWQKLQkJCS04OjAwCU5UX1lLCVAlc1QJMTk3OSBBcHIgbGFzdFN1biAyOjAwCi0JCQktNzowMAlOVF9ZSwlNJXNUCTE5ODAKLQkJCS03OjAwCUNhbmFkYQlNJXNUCi1ab25lIEFtZXJpY2EvV2hpdGVob3JzZQktOTowMDoxMiAtCUxNVAkxOTAwIEF1ZyAyMAotCQkJLTk6MDAJTlRfWUsJWSVzVAkxOTY2IEp1bCAxIDI6MDAKLQkJCS04OjAwCU5UX1lLCVAlc1QJMTk4MAotCQkJLTg6MDAJQ2FuYWRhCVAlc1QKLVpvbmUgQW1lcmljYS9EYXdzb24JLTk6MTc6NDAgLQlMTVQJMTkwMCBBdWcgMjAKLQkJCS05OjAwCU5UX1lLCVklc1QJMTk3MyBPY3QgMjggMDowMAotCQkJLTg6MDAJTlRfWUsJUCVzVAkxOTgwCi0JCQktODowMAlDYW5hZGEJUCVzVAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNZXhpY28KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKLSMgVGhlIEludmVzdGlnYXRpb24gYW5kIEFuYWx5c2lzIFNlcnZpY2Ugb2YgdGhlCi0jIE1leGljYW4gTGlicmFyeSBvZiBDb25ncmVzcyAoTUxvQykgaGFzIHB1Ymxpc2hlZCBhCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2RkaGN1LmdvYi5teC9iaWJsaW90L3B1YmxpY2EvaW52ZXlhbmEvcG9saXNvYy9ob3J2ZXIvIj4KLSMgaGlzdG9yeSBvZiBNZXhpY2FuIGxvY2FsIHRpbWUgKGluIFNwYW5pc2gpCi0jIDwvYT4uCi0jCi0jIEhlcmUgYXJlIHRoZSBkaXNjcmVwYW5jaWVzIGJldHdlZW4gU2hhbmtzICYgUG90dGVuZ2VyIChTJlApIGFuZCB0aGUgTUxvQy4KLSMgKEluIGFsbCBjYXNlcyB3ZSBnbyB3aXRoIHRoZSBNTG9DLikKLSMgUyZQIHJlcG9ydCB0aGF0IEJhamEgd2FzIGF0IC04OjAwIGluIDE5MjIvMTkyMy4KLSMgUyZQIHNheSB0aGUgMTkzMCB0cmFuc2l0aW9uIGluIEJhamEgd2FzIDE5MzAtMTEtMTYuCi0jIFMmUCByZXBvcnQgbm8gRFNUIGR1cmluZyBzdW1tZXIgMTkzMS4KLSMgUyZQIHJlcG9ydCBhIHRyYW5zaXRpb24gYXQgMTkzMi0wMy0zMCAyMzowMCwgbm90IDE5MzItMDQtMDEuCi0KLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwMS0wMi0yMCk6Ci0jIFRoZXJlIGFyZSBzb21lIG90aGVyIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiB0aGUgRGVjcmVlcyBwYWdlIGFuZCB0aGUKLSMgdHogZGF0YWJhc2UuICBJIHRoaW5rIHRoZXkgY2FuIGJlc3QgYmUgZXhwbGFpbmVkIGJ5IHN1cHBvc2luZyB0aGF0Ci0jIHRoZSByZXNlYXJjaGVycyB3aG8gcHJlcGFyZWQgdGhlIERlY3JlZXMgcGFnZSBmYWlsZWQgdG8gZmluZCBzb21lIG9mCi0jIHRoZSByZWxldmFudCBkb2N1bWVudHMuCi0KLSMgRnJvbSBBbGFuIFBlcnJ5ICgxOTk2LTAyLTE1KToKLSMgQSBndXkgZnJvbSBvdXIgTWV4aWNvIHN1YnNpZGlhcnkgZmluYWxseSBmb3VuZCB0aGUgUHJlc2lkZW50aWFsIERlY3JlZQotIyBvdXRsaW5pbmcgdGhlIHRpbWV6b25lIGNoYW5nZXMgaW4gTWV4aWNvLgotIwotIyAtLS0tLS0tLS0tLS0tIEJlZ2luIEZvcndhcmRlZCBNZXNzYWdlIC0tLS0tLS0tLS0tLS0KLSMKLSMgSSBmaW5hbGx5IGdvdCBteSBoYW5kcyBvbiB0aGUgT2ZmaWNpYWwgUHJlc2lkZW50aWFsIERlY3JlZSB0aGF0IHNldHMgdXAgdGhlCi0jIHJ1bGVzIGZvciB0aGUgRFNUIGNoYW5nZXMuIFRoZSBydWxlcyBhcmU6Ci0jCi0jIDEuIFRoZSBjb3VudHJ5IGlzIGRpdmlkZWQgaW4gMyB0aW1lem9uZXM6Ci0jICAgIC0gQmFqYSBDYWxpZm9ybmlhIE5vcnRlICh0aGUgTWV4aWNvL0JhamFOb3J0ZSBUWikKLSMgICAgLSBCYWphIENhbGlmb3JuaWEgU3VyLCBOYXlhcml0LCBTaW5hbG9hIGFuZCBTb25vcmEgKHRoZSBNZXhpY28vQmFqYVN1ciBUWikKLSMgICAgLSBUaGUgcmVzdCBvZiB0aGUgY291bnRyeSAodGhlIE1leGljby9HZW5lcmFsIFRaKQotIwotIyAyLiBGcm9tIHRoZSBmaXJzdCBTdW5kYXkgaW4gQXByaWwgYXQgMjowMCBBTSB0byB0aGUgbGFzdCBTdW5kYXkgaW4gT2N0b2JlcgotIyAgICBhdCAyOjAwIEFNLCB0aGUgdGltZXMgaW4gZWFjaCB6b25lIGFyZSBhcyBmb2xsb3dzOgotIyAgICBCYWphTm9ydGU6IEdNVCs3Ci0jICAgIEJhamFTdXI6ICAgR01UKzYKLSMgICAgR2VuZXJhbDogICBHTVQrNQotIwotIyAzLiBUaGUgcmVzdCBvZiB0aGUgeWVhciwgdGhlIHRpbWVzIGFyZSBhcyBmb2xsb3dzOgotIyAgICBCYWphTm9ydGU6IEdNVCs4Ci0jICAgIEJhamFTdXI6ICAgR01UKzcKLSMgICAgR2VuZXJhbDogICBHTVQrNgotIwotIyBUaGUgRGVjcmVlIHdhcyBwdWJsaXNoZWQgaW4gTWV4aWNvJ3MgT2ZmaWNpYWwgTmV3c3BhcGVyIG9uIEphbnVhcnkgNHRoLgotIwotIyAtLS0tLS0tLS0tLS0tLSBFbmQgRm9yd2FyZGVkIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMTk5Ni0wNi0xMik6Ci0jIEZvciBhbiBFbmdsaXNoIHRyYW5zbGF0aW9uIG9mIHRoZSBkZWNyZWUsIHNlZQotIyA8YSBocmVmPSJodHRwOi8vbWV4aWNvLXRyYXZlbC5jb20vZXh0cmEvdGltZXpvbmVfZW5nLmh0bWwiPgotIyBgYERpYXJpbyBPZmljaWFsOiBUaW1lIFpvbmUgQ2hhbmdlb3ZlcicnICgxOTk2LTAxLTA0KS4KLSMgPC9hPgotCi0jIEZyb20gUml2ZXMgTWNEb3cgKDE5OTgtMTAtMDgpOgotIyBUaGUgU3RhdGUgb2YgUXVpbnRhbmEgUm9vIGhhcyByZXZlcnRlZCBiYWNrIHRvIGNlbnRyYWwgU1REIGFuZCBEU1QgdGltZXMKLSMgKGkuZS4gVVRDIC0wNjAwIGFuZCAtMDUwMCBhcyBvZiAxOTk4LTA4LTAyKS4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTAxLTEwKToKLSMgRWZmZWN0aXZlIEFwcmlsIDQsIDE5OTkgYXQgMjowMCBBTSBsb2NhbCB0aW1lLCBTb25vcmEgY2hhbmdlZCB0byB0aGUgdGltZQotIyB6b25lIDUgaG91cnMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUsIGFuZCB3aWxsIG5vdCBvYnNlcnZlIGRheWxpZ2h0Ci0jIHNhdmluZ3MgdGltZSBzbyBhcyB0byBzdGF5IG9uIHRoZSBzYW1lIHRpbWUgem9uZSBhcyB0aGUgc291dGhlcm4gcGFydCBvZgotIyBBcml6b25hIHllYXIgcm91bmQuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQsIHRyYW5zbGF0aW5nCi0jIDxodHRwOi8vd3d3LnJlZm9ybWEuY29tL25hY2lvbmFsL2FydGljdWxvLzA2NDMyNy8+ICgyMDAxLTAxLTE3KToKLSMgSW4gT2F4YWNhLCB0aGUgNTUuMDAwIHRlYWNoZXJzIGZyb20gdGhlIFNlY3Rpb24gMjIgb2YgdGhlIE5hdGlvbmFsCi0jIFN5bmRpY2F0ZSBvZiBFZHVjYXRpb24gV29ya2VycywgcmVmdXNlIHRvIGFwcGx5IGRheWxpZ2h0IHNhdmluZyBlYWNoCi0jIHllYXIsIHNvIHRoYXQgdGhlIG1vcmUgdGhhbiAxMCwwMDAgc2Nob29scyB3b3JrIGF0IG5vcm1hbCBob3VyIHRoZQotIyB3aG9sZSB5ZWFyLgotCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDEtMDEtMTkpOgotIyA8aHR0cDovL3d3dy5yZWZvcm1hLmNvbS9uZWdvY2lvc195X2RpbmVyby9hcnRpY3Vsby8wNjQ0ODEvPiAuLi4gc2F5cwotIyAodHJhbnNsYXRlZCk6Li4uCi0jIEphbnVhcnkgMTcsIDIwMDAgLSBUaGUgRW5lcmd5IFNlY3JldGFyeSwgRXJuZXN0byBNYXJ0ZW5zLCBhbm5vdW5jZWQKLSMgdGhhdCBTdW1tZXIgVGltZSB3aWxsIGJlIHJlZHVjZWQgZnJvbSBzZXZlbiB0byBmaXZlIG1vbnRocywgc3RhcnRpbmcKLSMgdGhpcyB5ZWFyLi4uLgotIyA8aHR0cDovL3d3dy5wdWJsaWNvLmNvbS5teC9zY3JpcHRzL3RleHRvMy5hc3A/YWN0aW9uPXBhZ2luYSZwYWc9MjEmcG9zPXAmc2VjYz1uYWNpJmRhdGU9MDEvMTcvMjAwMT4KLSMgW3RyYW5zbGF0ZWRdLCBzYXlzICJzdW1tZXIgdGltZSB3aWxsIC4uLiB0YWtlIGVmZmVjdCBvbiB0aGUgZmlyc3QgU3VuZGF5Ci0jIGluIE1heSwgYW5kIGVuZCBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgU2VwdGVtYmVyLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDAxLTAxLTI1KToKLSMgVGhlIDIwMDEtMDEtMjQgdHJhZGl0aW9uYWwgV2FzaGluZ3RvbiBQb3N0IGNvbnRhaW5lZCB0aGUgcGFnZSBvbmUKLSMgc3RvcnkgIlRpbWVseSBJc3N1ZSBEaXZpZGVzIE1leGljYW5zLiIuLi4KLSMgaHR0cDovL3d3dy53YXNoaW5ndG9ucG9zdC5jb20vd3AtZHluL2FydGljbGVzL0EzNzM4My0yMDAxSmFuMjMuaHRtbAotIyAuLi4gTWV4aWNvIENpdHkgTWF5b3IgTG9wZXogT2JyYWRvciAiLi4uaXMgdGhyZWF0ZW5pbmcgdG8ga2VlcAotIyBNZXhpY28gQ2l0eSBhbmQgaXRzIDIwIG1pbGxpb24gcmVzaWRlbnRzIG9uIGEgZGlmZmVyZW50IHRpbWUgdGhhbgotIyB0aGUgcmVzdCBvZiB0aGUgY291bnRyeS4uLiIgSW4gcGFydGljdWxhciwgTG9wZXogT2JyYWRvciB3b3VsZCBhYm9saXNoCi0jIG9ic2VydmF0aW9uIG9mIERheWxpZ2h0IFNhdmluZyBUaW1lLgotCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuY29uYWUuZ29iLm14L2Fob3Jyby9kZWNyZXRvaG9ydmVyMjAwMS5odG1sI2RlY3JlIj4KLSMgT2ZmaWNpYWwgc3RhdHV0ZSBwdWJsaXNoZWQgYnkgdGhlIEVuZXJneSBEZXBhcnRtZW50Ci0jIDwvYT4gKDIwMDEtMDItMDEpIHNob3dzIEJhamEgYW5kIENoaWhhdWh1YSBhcyBzdGlsbCB1c2luZyBVUyBEU1QgcnVsZXMsCi0jIGFuZCBTb25vcmEgd2l0aCBubyBEU1QuICBUaGlzIHdhcyByZXBvcnRlZCBieSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDItMDMpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDEtMDMtMDMpOgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhdGltZXMuY29tL25ld3MvbmF0aW9uLzIwMDEwMzAzL3QwMDAwMTg3NjYuaHRtbCI+Ci0jIEphbWVzIEYuIFNtaXRoIHdyaXRlcyBpbiB0b2RheSdzIExBIFRpbWVzCi0jIDwvYT4KLSMgKiBTb25vcmEgd2lsbCBjb250aW51ZSB0byBvYnNlcnZlIHN0YW5kYXJkIHRpbWUuCi0jICogTGFzdCB3ZWVrIE1leGljbyBDaXR5J3MgbWF5b3IgQW5kcmVzIE1hbnVlbCBMb3BleiBPYnJhZG9yIGRlY3JlZWQgdGhhdAotIyAgIHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgbm90IGFkb3B0IERTVC4KLSMgKiA0IG9mIDE2IGRpc3RyaWN0IGxlYWRlcnMgYW5ub3VuY2VkIHRoZXknbGwgaWdub3JlIHRoZSBkZWNyZWUuCi0jICogVGhlIGRlY3JlZSBkb2VzIG5vdCBhZmZlY3QgZmVkZXJhbC1jb250cm9sbGVkIGZhY2lsaXRpZXMgaW5jbHVkaW5nCi0jICAgdGhlIGFpcnBvcnQsIGJhbmtzLCBob3NwaXRhbHMsIGFuZCBzY2hvb2xzLgotIwotIyBGb3Igbm93IHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBGZWRlcmFsIERpc3RyaWN0IHdpbGwgYm93IHRvIGZlZGVyYWwgcnVsZXMuCi0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgKDIwMDEtMDQtMDEpOgotIyBJIGZvdW5kIHNvbWUgcmVmZXJlbmNlcyB0byB0aGUgTWV4aWNhbiBhcHBsaWNhdGlvbiBvZiBkYXlsaWdodAotIyBzYXZpbmcsIHdoaWNoIG1vZGlmaWVzIHdoYXQgSSBoYWQgYWxyZWFkeSBzZW50IHlvdSwgc3RhdGluZyBlYXJsaWVyCi0jIHRoYXQgYSBudW1iZXIgb2Ygbm9ydGhlcm4gTWV4aWNhbiBzdGF0ZXMgd291bGQgZ28gb24gZGF5bGlnaHQKLSMgc2F2aW5nLiBUaGUgbW9kaWZpY2F0aW9uIHJldmVydHMgdGhpcyB0byBvbmx5IGNvdmVyIEJhamEgQ2FsaWZvcm5pYQotIyAoTm9ydGUpLCB3aGlsZSBhbGwgb3RoZXIgc3RhdGVzIChleGNlcHQgU29ub3JhLCB3aG8gaGFzIG5vIGRheWxpZ2h0Ci0jIHNhdmluZyBhbGwgeWVhcikgd2lsbCBmb2xsb3cgdGhlIG9yaWdpbmFsIGRlY3JlZSBvZiBwcmVzaWRlbnQKLSMgVmljZW50ZSBGb3gsIHN0YXJ0aW5nIGRheWxpZ2h0IHNhdmluZyBNYXkgNiwgMjAwMSBhbmQgZW5kaW5nCi0jIFNlcHRlbWJlciAzMCwgMjAwMS4KLSMgUmVmZXJlbmNlczogIkRpYXJpbyBkZSBNb250ZXJyZXkiIDx3d3cuZGlhcmlvZGVtb250ZXJyZXkuY29tL2luZGV4LmFzcD4KLSMgUGFsYWJyYSA8aHR0cDovL3BhbGFicmEuaW5mb3NlbC5jb20vMDEwMzMxL3ByaW1lcmEvcHByaTMxMDEucGRmPiAoMjAwMS0wMy0zMSkKLQotIyBGcm9tIFJldXRlcnMgKDIwMDEtMDktMDQpOgotIyBNZXhpY28ncyBTdXByZW1lIENvdXJ0IG9uIFR1ZXNkYXkgZGVjbGFyZWQgdGhhdCBkYXlsaWdodCBzYXZpbmdzIHdhcwotIyB1bmNvbnN0aXR1dGlvbmFsIGluIE1leGljbyBDaXR5LCBjcmVhdGluZyB0aGUgcG9zc2liaWxpdHkgdGhlCi0jIGNhcGl0YWwgd2lsbCBiZSBpbiBhIGRpZmZlcmVudCB0aW1lIHpvbmUgZnJvbSB0aGUgcmVzdCBvZiB0aGUgbmF0aW9uCi0jIG5leHQgeWVhci4uLi4gIFRoZSBTdXByZW1lIENvdXJ0J3MgcnVsaW5nIHRha2VzIGVmZmVjdCBhdCAyOjAwCi0jIGEubS4gKDA4MDAgR01UKSBvbiBTZXB0LiAzMCwgd2hlbiBNZXhpY28gaXMgc2NoZWR1bGVkIHRvIHJldmVydCB0bwotIyBzdGFuZGFyZCB0aW1lLiAiVGhpcyBpcyBzbyByZXNpZGVudHMgb2YgdGhlIEZlZGVyYWwgRGlzdHJpY3QgYXJlIG5vdAotIyBzdWJqZWN0IHRvIHVuZXhwZWN0ZWQgdGltZSBjaGFuZ2VzLCIgYSBzdGF0ZW1lbnQgZnJvbSB0aGUgY291cnQgc2FpZC4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwMi0wMy0xMik6Ci0jIC4uLiBjb25zdWx0aW5nIG15IGxvY2FsIGdyb2Nlcnkgc3RvcmUoISkgYW5kIG15IGNvd29ya2VycywgdGhleSBhbGwgaW5zaXN0ZWQKLSMgdGhhdCBhIG5ldyBkZWNpc2lvbiBoYWQgYmVlbiBtYWRlIHRvIHJlaW5zdGF0ZSBVUyBzdHlsZSBEU1QgaW4gTWV4aWNvLi4uLgotIyBodHRwOi8vd3d3LmNvbmFlLmdvYi5teC9haG9ycm8vaG9yYXZlcjIwMDFfbTFfMjAwMi5odG1sICgyMDAyLTAyLTIwKQotIyBjb25maXJtcyB0aGlzLiAgU29ub3JhIGFzIHVzdWFsIGlzIHRoZSBvbmx5IHN0YXRlIHdoZXJlIERTVCBpcyBub3QgYXBwbGllZC4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwOS0xMi0yOCk6Ci0jCi0jIFN0ZWZmZW4gVGhvcnNlbiB3cm90ZToKLSMgPiBNZXhpY28ncyBIb3VzZSBvZiBSZXByZXNlbnRhdGl2ZXMgaGFzIGFwcHJvdmVkIGEgcHJvcG9zYWwgZm9yIG5vcnRoZXJuCi0jID4gTWV4aWNvJ3MgYm9yZGVyIGNpdGllcyB0byBzaGFyZSB0aGUgc2FtZSBkYXlsaWdodCBzYXZpbmcgc2NoZWR1bGUgYXMKLSMgPiB0aGUgVW5pdGVkIFN0YXRlcy4KLSMgTm93IHRoaXMgaGFzIHBhc3NlZCBib3RoIHRoZSBDb25ncmVzcyBhbmQgdGhlIFNlbmF0ZSwgc28gc3RhcnRpbmcgZnJvbQotIyAyMDEwLCBzb21lIGJvcmRlciByZWdpb25zIHdpbGwgYmUgdGhlIHNhbWU6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2lnbm9uc2FuZGllZ28uY29tL25ld3MvMjAwOS9kZWMvMjgvY2xvY2tzLXdpbGwtbWF0Y2gtYm90aC1zaWRlcy1ib3JkZXIvIj4KLSMgaHR0cDovL3d3dy5zaWdub25zYW5kaWVnby5jb20vbmV3cy8yMDA5L2RlYy8yOC9jbG9ja3Mtd2lsbC1tYXRjaC1ib3RoLXNpZGVzLWJvcmRlci8KLSMgPC9hPgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmVsbWFuYW5hcmV5LmNvbS9kaWFyaW8vbm90aWNpYS9uYWNpb25hbC9ub3RpY2lhcy9lbXBhdGFuX2hvcmFyaW9fZGVfZnJvbnRlcmFfY29uX2V1LzYyMTkzOSI+Ci0jIGh0dHA6Ly93d3cuZWxtYW5hbmFyZXkuY29tL2RpYXJpby9ub3RpY2lhL25hY2lvbmFsL25vdGljaWFzL2VtcGF0YW5faG9yYXJpb19kZV9mcm9udGVyYV9jb25fZXUvNjIxOTM5Ci0jIDwvYT4KLSMgKFNwYW5pc2gpCi0jCi0jIENvdWxkIG5vdCBmaW5kIHRoZSBuZXcgbGF3IHRleHQsIGJ1dCB0aGUgcHJvcG9zZWQgbGF3IHRleHQgY2hhbmdlcyBhcmUgaGVyZToKLSMgPGEgaHJlZj0iaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy8yMDA5MTIxMC1WLnBkZiI+Ci0jIGh0dHA6Ly9nYWNldGEuZGlwdXRhZG9zLmdvYi5teC9HYWNldGEvNjEvMjAwOS9kaWMvMjAwOTEyMTAtVi5wZGYKLSMgPC9hPgotIyAoR2FjZXRhIFBhcmxhbWVudGFyaWEpCi0jCi0jIFRoZXJlIGlzIGFsc28gYSBsaXN0IG9mIHRoZSB2b3RlcyBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vZ2FjZXRhLmRpcHV0YWRvcy5nb2IubXgvR2FjZXRhLzYxLzIwMDkvZGljL1YyLTEwMTIwOS5odG1sIj4KLSMgaHR0cDovL2dhY2V0YS5kaXB1dGFkb3MuZ29iLm14L0dhY2V0YS82MS8yMDA5L2RpYy9WMi0xMDEyMDkuaHRtbAotIyA8L2E+Ci0jCi0jIE91ciBwYWdlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvbm9ydGgtbWV4aWNvLWRzdC1jaGFuZ2UuaHRtbCI+Ci0jIGh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9ub3J0aC1tZXhpY28tZHN0LWNoYW5nZS5odG1sCi0jIDwvYT4KLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wMS0yMCk6Ci0jIFRoZSBwYWdlCi0jIDxhIGhyZWY9Imh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMCI+Ci0jIGh0dHA6Ly9kb2YuZ29iLm14L25vdGFfZGV0YWxsZS5waHA/Y29kaWdvPTUxMjc0ODAmZmVjaGE9MDYvMDEvMjAxMAotIyA8L2E+Ci0jIGluY2x1ZGVzIHRoaXMgdGV4dDoKLSMgRW4gbG9zIG11bmljaXBpb3MgZnJvbnRlcml6b3MgZGUgVGlqdWFuYSB5IE1leGljYWxpIGVuIEJhamEgQ2FsaWZvcm5pYTsKLSMgSnUmYWFjdXRlO3JleiB5IE9qaW5hZ2EgZW4gQ2hpaHVhaHVhOyBBY3UmbnRpbGRlO2EgeSBQaWVkcmFzIE5lZ3JhcyBlbiBDb2FodWlsYTsKLSMgQW4mYWFjdXRlO2h1YWMgZW4gTnVldm8gTGUmb2FjdXRlO247IHkgTnVldm8gTGFyZWRvLCBSZXlub3NhIHkgTWF0YW1vcm9zIGVuCi0jIFRhbWF1bGlwYXMsIGxhIGFwbGljYWNpJm9hY3V0ZTtuIGRlIGVzdGUgaG9yYXJpbyBlc3RhY2lvbmFsIHN1cnRpciZhYWN1dGU7IGVmZWN0bwotIyBkZXNkZSBsYXMgZG9zIGhvcmFzIGRlbCBzZWd1bmRvIGRvbWluZ28gZGUgbWFyem8geSBjb25jbHVpciZhYWN1dGU7IGEgbGFzIGRvcwotIyBob3JhcyBkZWwgcHJpbWVyIGRvbWluZ28gZGUgbm92aWVtYnJlLgotIyBFbiBsb3MgbXVuaWNpcGlvcyBmcm9udGVyaXpvcyBxdWUgc2UgZW5jdWVudHJlbiB1YmljYWRvcyBlbiBsYSBmcmFuamEKLSMgZnJvbnRlcml6YSBub3J0ZSBlbiBlbCB0ZXJyaXRvcmlvIGNvbXByZW5kaWRvIGVudHJlIGxhIGwmaWFjdXRlO25lYQotIyBpbnRlcm5hY2lvbmFsIHkgbGEgbCZpYWN1dGU7bmVhIHBhcmFsZWxhIHViaWNhZGEgYSB1bmEgZGlzdGFuY2lhIGRlIHZlaW50ZQotIyBraWwmb2FjdXRlO21ldHJvcywgYXMmaWFjdXRlOyBjb21vIGxhIENpdWRhZCBkZSBFbnNlbmFkYSwgQmFqYSBDYWxpZm9ybmlhLCBoYWNpYSBlbAotIyBpbnRlcmlvciBkZWwgcGEmaWFjdXRlO3MsIGxhIGFwbGljYWNpJm9hY3V0ZTtuIGRlIGVzdGUgaG9yYXJpbyBlc3RhY2lvbmFsIHN1cnRpciZhYWN1dGU7Ci0jIGVmZWN0byBkZXNkZSBsYXMgZG9zIGhvcmFzIGRlbCBzZWd1bmRvIGRvbWluZ28gZGUgbWFyem8geSBjb25jbHVpciZhYWN1dGU7IGEKLSMgbGFzIGRvcyBob3JhcyBkZWwgcHJpbWVyIGRvbWluZ28gZGUgbm92aWVtYnJlLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlNZXhpY28JMTkzOQlvbmx5CS0JRmViCTUJMDowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTE5MzkJb25seQktCUp1bgkyNQkwOjAwCTAJUwotUnVsZQlNZXhpY28JMTk0MAlvbmx5CS0JRGVjCTkJMDowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTE5NDEJb25seQktCUFwcgkxCTA6MDAJMAlTCi1SdWxlCU1leGljbwkxOTQzCW9ubHkJLQlEZWMJMTYJMDowMAkxOjAwCVcgIyBXYXIKLVJ1bGUJTWV4aWNvCTE5NDQJb25seQktCU1heQkxCTA6MDAJMAlTCi1SdWxlCU1leGljbwkxOTUwCW9ubHkJLQlGZWIJMTIJMDowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTE5NTAJb25seQktCUp1bAkzMAkwOjAwCTAJUwotUnVsZQlNZXhpY28JMTk5NgkyMDAwCS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAotUnVsZQlNZXhpY28JMTk5NgkyMDAwCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJTWV4aWNvCTIwMDEJb25seQktCU1heQlTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTIwMDEJb25seQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCU1leGljbwkyMDAyCW1heAktCUFwcglTdW4+PTEJMjowMAkxOjAwCUQKLVJ1bGUJTWV4aWNvCTIwMDIJbWF4CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMgUXVpbnRhbmEgUm9vCi1ab25lIEFtZXJpY2EvQ2FuY3VuCS01OjQ3OjA0IC0JTE1UCTE5MjIgSmFuICAxICAwOjEyOjU2Ci0JCQktNjowMAktCUNTVAkxOTgxIERlYyAyMwotCQkJLTU6MDAJTWV4aWNvCUUlc1QJMTk5OCBBdWcgIDIgIDI6MDAKLQkJCS02OjAwCU1leGljbwlDJXNUCi0jIENhbXBlY2hlLCBZdWNhdGFuCi1ab25lIEFtZXJpY2EvTWVyaWRhCS01OjU4OjI4IC0JTE1UCTE5MjIgSmFuICAxICAwOjAxOjMyCi0JCQktNjowMAktCUNTVAkxOTgxIERlYyAyMwotCQkJLTU6MDAJLQlFU1QJMTk4MiBEZWMgIDIKLQkJCS02OjAwCU1leGljbwlDJXNUCi0jIENvYWh1aWxhLCBEdXJhbmdvLCBOdWV2byBMZW9uLCBUYW1hdWxpcGFzIChuZWFyIFVTIGJvcmRlcikKLVpvbmUgQW1lcmljYS9NYXRhbW9yb3MJLTY6NDA6MDAgLQlMTVQJMTkyMSBEZWMgMzEgMjM6MjA6MDAKLQkJCS02OjAwCS0JQ1NUCTE5ODgKLQkJCS02OjAwCVVTCUMlc1QJMTk4OQotCQkJLTY6MDAJTWV4aWNvCUMlc1QJMjAxMAotCQkJLTY6MDAJVVMJQyVzVAotIyBDb2FodWlsYSwgRHVyYW5nbywgTnVldm8gTGVvbiwgVGFtYXVsaXBhcyAoYXdheSBmcm9tIFVTIGJvcmRlcikKLVpvbmUgQW1lcmljYS9Nb250ZXJyZXkJLTY6NDE6MTYgLQlMTVQJMTkyMSBEZWMgMzEgMjM6MTg6NDQKLQkJCS02OjAwCS0JQ1NUCTE5ODgKLQkJCS02OjAwCVVTCUMlc1QJMTk4OQotCQkJLTY6MDAJTWV4aWNvCUMlc1QKLSMgQ2VudHJhbCBNZXhpY28KLVpvbmUgQW1lcmljYS9NZXhpY29fQ2l0eSAtNjozNjozNiAtCUxNVAkxOTIyIEphbiAgMSAwOjIzOjI0Ci0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCU1leGljbwlDJXNUCTIwMDEgU2VwIDMwIDAyOjAwCi0JCQktNjowMAktCUNTVAkyMDAyIEZlYiAyMAotCQkJLTY6MDAJTWV4aWNvCUMlc1QKLSMgQ2hpaHVhaHVhIChuZWFyIFVTIGJvcmRlcikKLVpvbmUgQW1lcmljYS9PamluYWdhCS02OjU3OjQwIC0JTE1UCTE5MjIgSmFuIDEgMDowMjoyMAotCQkJLTc6MDAJLQlNU1QJMTkyNyBKdW4gMTAgMjM6MDAKLQkJCS02OjAwCS0JQ1NUCTE5MzAgTm92IDE1Ci0JCQktNzowMAktCU1TVAkxOTMxIE1heSAgMSAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMSBPY3QKLQkJCS03OjAwCS0JTVNUCTE5MzIgQXByICAxCi0JCQktNjowMAktCUNTVAkxOTk2Ci0JCQktNjowMAlNZXhpY28JQyVzVAkxOTk4Ci0JCQktNjowMAktCUNTVAkxOTk4IEFwciBTdW4+PTEgMzowMAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMjAxMAotCQkJLTc6MDAJVVMJTSVzVAotIyBDaGlodWFodWEgKGF3YXkgZnJvbSBVUyBib3JkZXIpCi1ab25lIEFtZXJpY2EvQ2hpaHVhaHVhCS03OjA0OjIwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU1OjQwCi0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5OTYKLQkJCS02OjAwCU1leGljbwlDJXNUCTE5OTgKLQkJCS02OjAwCS0JQ1NUCTE5OTggQXByIFN1bj49MSAzOjAwCi0JCQktNzowMAlNZXhpY28JTSVzVAotIyBTb25vcmEKLVpvbmUgQW1lcmljYS9IZXJtb3NpbGxvCS03OjIzOjUyIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjM2OjA4Ci0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0Ci0JCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMTk5OQotCQkJLTc6MDAJLQlNU1QKLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAxMC0wNC0yMSk6Ci0jIEFjY29yZGluZyB0byBuZXdzLCBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXMgKE1leGljYW4gc3RhdGUgb2YgTmF5YXJpdCkKLSMgY2hhbmdlZCB0aW1lIHpvbmUgVVRDLTcgdG8gbmV3IHRpbWUgem9uZSBVVEMtNiBvbiBBcHJpbCA0LCAyMDEwICh0bwotIyBzaGFyZSB0aGUgc2FtZSB0aW1lIHpvbmUgYXMgbmVhcmJ5IGNpdHkgUHVlcnRvIFZhbGxhcnRhLCBKYWxpc2NvKS4KLSMKLSMgKFNwYW5pc2gpCi0jIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBob21vbG9nYSBzdSBob3JhcmlvIGFsIGRlbCBjZW50cm8gZGVsCi0jIHBhJmlhY3V0ZTtzLCBhIHBhcnRpciBkZSBlc3RlIGRvbWluZ28KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5uYXlhcml0LmdvYi5teC9ub3Rlcy5hc3A/aWQ9MjA3NDgiPgotIyBodHRwOi8vd3d3Lm5heWFyaXQuZ29iLm14L25vdGVzLmFzcD9pZD0yMDc0OAotIyA8L2E+Ci0jCi0jIEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBob21vbG9nYSBzdSBob3JhcmlvIGNvbiBlbCBkZWwgQ2VudHJvIGRlbAotIyBQYSZpYWN1dGU7cwotIyA8YSBocmVmPSJodHRwOi8vd3d3LmJhaGlhZGViYW5kZXJhcy5nb2IubXgvcHJpbmNpcGFsL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdmlldz1hcnRpY2xlJmlkPTI2MTpiYWhpYS1kZS1iYW5kZXJhcy1ob21vbG9nYS1zdS1ob3JhcmlvLWNvbi1lbC1kZWwtY2VudHJvLWRlbC1wYWlzJmNhdGlkPTQyOmNvbXVuaWNhY2lvbi1zb2NpYWwmSXRlbWlkPTUwIj4KLSMgaHR0cDovL3d3dy5iYWhpYWRlYmFuZGVyYXMuZ29iLm14L3ByaW5jaXBhbC9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnZpZXc9YXJ0aWNsZSZpZD0yNjE6YmFoaWEtZGUtYmFuZGVyYXMtaG9tb2xvZ2Etc3UtaG9yYXJpby1jb24tZWwtZGVsLWNlbnRyby1kZWwtcGFpcyZjYXRpZD00Mjpjb211bmljYWNpb24tc29jaWFsJkl0ZW1pZD01MCIKLSMgPC9hPgotIwotIyAoRW5nbGlzaCkKLSMgUHVlcnRvIFZhbGxhcnRhIGFuZCBCYWgmaWFjdXRlO2EgZGUgQmFuZGVyYXM6IE9uZSBUaW1lIFpvbmUKLSMgPGEgaHJlZj0iaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sIj4KLSMgaHR0cDovL3ZpcnR1YWx2YWxsYXJ0YS5jb20vcHVlcnRvdmFsbGFydGEvcHVlcnRvdmFsbGFydGEvbG9jYWxuZXdzLzIwMDktMTItMDMtUHVlcnRvLVZhbGxhcnRhLWFuZC1CYWhpYS1kZS1CYW5kZXJhcy1PbmUtVGltZS1ab25lLnNodG1sCi0jIDwvYT4KLSMKLSMgb3IKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19tZXhpY28wOC5odG1sCi0jIDwvYT4KLSMKLSMgIk1leGljbydzIFNlbmF0ZSBhcHByb3ZlZCB0aGUgYW1lbmRtZW50cyB0byB0aGUgTWV4aWNhbiBTY2hlZHVsZSBTeXN0ZW0gdGhhdAotIyB3aWxsIGFsbG93IEJhaCZpYWN1dGU7YSBkZSBCYW5kZXJhcyBhbmQgUHVlcnRvIFZhbGxhcnRhIHRvIHNoYXJlIHRoZSBzYW1lIHRpbWUKLSMgem9uZSAuLi4iCi0jIEJhamEgQ2FsaWZvcm5pYSBTdXIsIE5heWFyaXQsIFNpbmFsb2EKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAxMC0wNS0wMSk6Ci0jIFVzZSAiQmFoaWFfQmFuZGVyYXMiIHRvIGtlZXAgdGhlIG5hbWUgdG8gZm91cnRlZW4gY2hhcmFjdGVycy4KLQotWm9uZSBBbWVyaWNhL01hemF0bGFuCS03OjA1OjQwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU0OjIwCi0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0Ci0JCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QKLQotWm9uZSBBbWVyaWNhL0JhaGlhX0JhbmRlcmFzCS03OjAxOjAwIC0JTE1UCTE5MjEgRGVjIDMxIDIzOjU5OjAwCi0JCQktNzowMAktCU1TVAkxOTI3IEp1biAxMCAyMzowMAotCQkJLTY6MDAJLQlDU1QJMTkzMCBOb3YgMTUKLQkJCS03OjAwCS0JTVNUCTE5MzEgTWF5ICAxIDIzOjAwCi0JCQktNjowMAktCUNTVAkxOTMxIE9jdAotCQkJLTc6MDAJLQlNU1QJMTkzMiBBcHIgIDEKLQkJCS02OjAwCS0JQ1NUCTE5NDIgQXByIDI0Ci0JCQktNzowMAktCU1TVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk3MAotCQkJLTc6MDAJTWV4aWNvCU0lc1QJMjAxMCBBcHIgNCAyOjAwCi0JCQktNjowMAlNZXhpY28JQyVzVAotCi0jIEJhamEgQ2FsaWZvcm5pYSAobmVhciBVUyBib3JkZXIpCi1ab25lIEFtZXJpY2EvVGlqdWFuYQktNzo0ODowNCAtCUxNVAkxOTIyIEphbiAgMSAgMDoxMTo1NgotCQkJLTc6MDAJLQlNU1QJMTkyNAotCQkJLTg6MDAJLQlQU1QJMTkyNyBKdW4gMTAgMjM6MDAKLQkJCS03OjAwCS0JTVNUCTE5MzAgTm92IDE1Ci0JCQktODowMAktCVBTVAkxOTMxIEFwciAgMQotCQkJLTg6MDAJMTowMAlQRFQJMTkzMSBTZXAgMzAKLQkJCS04OjAwCS0JUFNUCTE5NDIgQXByIDI0Ci0JCQktODowMAkxOjAwCVBXVAkxOTQ1IEF1ZyAxNCAyMzowMHUKLQkJCS04OjAwCTE6MDAJUFBUCTE5NDUgTm92IDEyICMgUGVhY2UKLQkJCS04OjAwCS0JUFNUCTE5NDggQXByICA1Ci0JCQktODowMAkxOjAwCVBEVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk1NAotCQkJLTg6MDAJQ0EJUCVzVAkxOTYxCi0JCQktODowMAktCVBTVAkxOTc2Ci0JCQktODowMAlVUwlQJXNUCTE5OTYKLQkJCS04OjAwCU1leGljbwlQJXNUCTIwMDEKLQkJCS04OjAwCVVTCVAlc1QJMjAwMiBGZWIgMjAKLQkJCS04OjAwCU1leGljbwlQJXNUCTIwMTAKLQkJCS04OjAwCVVTCVAlc1QKLSMgQmFqYSBDYWxpZm9ybmlhIChhd2F5IGZyb20gVVMgYm9yZGVyKQotWm9uZSBBbWVyaWNhL1NhbnRhX0lzYWJlbAktNzozOToyOCAtCUxNVAkxOTIyIEphbiAgMSAgMDoyMDozMgotCQkJLTc6MDAJLQlNU1QJMTkyNAotCQkJLTg6MDAJLQlQU1QJMTkyNyBKdW4gMTAgMjM6MDAKLQkJCS03OjAwCS0JTVNUCTE5MzAgTm92IDE1Ci0JCQktODowMAktCVBTVAkxOTMxIEFwciAgMQotCQkJLTg6MDAJMTowMAlQRFQJMTkzMSBTZXAgMzAKLQkJCS04OjAwCS0JUFNUCTE5NDIgQXByIDI0Ci0JCQktODowMAkxOjAwCVBXVAkxOTQ1IEF1ZyAxNCAyMzowMHUKLQkJCS04OjAwCTE6MDAJUFBUCTE5NDUgTm92IDEyICMgUGVhY2UKLQkJCS04OjAwCS0JUFNUCTE5NDggQXByICA1Ci0JCQktODowMAkxOjAwCVBEVAkxOTQ5IEphbiAxNAotCQkJLTg6MDAJLQlQU1QJMTk1NAotCQkJLTg6MDAJQ0EJUCVzVAkxOTYxCi0JCQktODowMAktCVBTVAkxOTc2Ci0JCQktODowMAlVUwlQJXNUCTE5OTYKLQkJCS04OjAwCU1leGljbwlQJXNUCTIwMDEKLQkJCS04OjAwCVVTCVAlc1QJMjAwMiBGZWIgMjAKLQkJCS04OjAwCU1leGljbwlQJXNUCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBGb3JtZXJseSB0aGVyZSB3YXMgYW4gQW1lcmljYS9FbnNlbmFkYSB6b25lLCB3aGljaCBkaWZmZXJlZCBmcm9tCi0jIEFtZXJpY2EvVGlqdWFuYSBvbmx5IGluIHRoYXQgaXQgZGlkIG5vdCBvYnNlcnZlIERTVCBmcm9tIDE5NzYKLSMgdGhyb3VnaCAxOTk1LiAgVGhpcyB3YXMgYXMgcGVyIFNoYW5rcyAoMTk5OSkuICBCdXQgU2hhbmtzICYgUG90dGVuZ2VyIHNheQotIyBFbnNlbmFkYSBkaWQgbm90IG9ic2VydmUgRFNUIGZyb20gMTk0OCB0aHJvdWdoIDE5NzUuICBHdXkgSGFycmlzIHJlcG9ydHMKLSMgdGhhdCB0aGUgMTk4NyBPQUcgc2F5cyAiT25seSBFbnNlbmFkYSwgTWV4aWNhbGUsIFNhbiBGZWxpcGUgYW5kCi0jIFRpanVhbmEgb2JzZXJ2ZSBEU1QsIiB3aGljaCBhZ3JlZXMgd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIgYnV0IGltcGxpZXMgdGhhdAotIyBEU1Qtb2JzZXJ2YW5jZSB3YXMgYSB0b3duLWJ5LXRvd24gbWF0dGVyIGJhY2sgdGhlbi4gIFRoaXMgY29uY2VybnMKLSMgZGF0YSBhZnRlciAxOTcwIHNvIG1vc3QgbGlrZWx5IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgWm9uZQotIyBvdGhlciB0aGFuIEFtZXJpY2EvVGlqdWFuYSBmb3IgQmFqYSwgYnV0IGl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IGl0cwotIyBuYW1lIG9yIGNvbnRlbnRzIHNob3VsZCBiZS4KLSMKLSMgUmV2aWxsYWdpZ2VkbyBJcwotIyBubyBpbmZvcm1hdGlvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQW5ndWlsbGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Bbmd1aWxsYQktNDoxMjoxNiAtCUxNVAkxOTEyIE1hciAyCi0JCQktNDowMAktCUFTVAotCi0jIEFudGlndWEgYW5kIEJhcmJ1ZGEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9BbnRpZ3VhCS00OjA3OjEyIC0JTE1UCTE5MTIgTWFyIDIKLQkJCS01OjAwCS0JRVNUCTE5NTEKLQkJCS00OjAwCS0JQVNUCi0KLSMgQmFoYW1hcwotIwotIyBGcm9tIFN1ZSBXaWxsaWFtcyAoMjAwNi0xMi0wNyk6Ci0jIFRoZSBCYWhhbWFzIGFubm91bmNlZCBhYm91dCBhIG1vbnRoIGFnbyB0aGF0IHRoZXkgcGxhbiB0byBjaGFuZ2UgdGhlaXIgRFNUCi0jIHJ1bGVzIHRvIHN5bmMgd2l0aCB0aGUgVS5TLiBzdGFydGluZyBpbiAyMDA3Li4uLgotIyBodHRwOi8vd3d3LmpvbmVzYmFoYW1hcy5jb20vP2M9NDUmYT0xMDQxMgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlCYWhhbWFzCTE5NjQJMTk3NQktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCUJhaGFtYXMJMTk2NAkxOTc1CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9OYXNzYXUJLTU6MDk6MjQgLQlMTVQJMTkxMiBNYXIgMgotCQkJLTU6MDAJQmFoYW1hcwlFJXNUCTE5NzYKLQkJCS01OjAwCVVTCUUlc1QKLQotIyBCYXJiYWRvcwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQmFyYgkxOTc3CW9ubHkJLQlKdW4JMTIJMjowMAkxOjAwCUQKLVJ1bGUJQmFyYgkxOTc3CTE5NzgJLQlPY3QJU3VuPj0xCTI6MDAJMAlTCi1SdWxlCUJhcmIJMTk3OAkxOTgwCS0JQXByCVN1bj49MTUJMjowMAkxOjAwCUQKLVJ1bGUJQmFyYgkxOTc5CW9ubHkJLQlTZXAJMzAJMjowMAkwCVMKLVJ1bGUJQmFyYgkxOTgwCW9ubHkJLQlTZXAJMjUJMjowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9CYXJiYWRvcwktMzo1ODoyOCAtCUxNVAkxOTI0CQkjIEJyaWRnZXRvd24KLQkJCS0zOjU4OjI4IC0JQk1UCTE5MzIJICAjIEJyaWRnZXRvd24gTWVhbiBUaW1lCi0JCQktNDowMAlCYXJiCUElc1QKLQotIyBCZWxpemUKLSMgV2hpdG1hbiBlbnRpcmVseSBkaXNhZ3JlZXMgd2l0aCBTaGFua3M7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQmVsaXplCTE5MTgJMTk0MgktCU9jdAlTdW4+PTIJMDowMAkwOjMwCUhECi1SdWxlCUJlbGl6ZQkxOTE5CTE5NDMJLQlGZWIJU3VuPj05CTA6MDAJMAlTCi1SdWxlCUJlbGl6ZQkxOTczCW9ubHkJLQlEZWMJIDUJMDowMAkxOjAwCUQKLVJ1bGUJQmVsaXplCTE5NzQJb25seQktCUZlYgkgOQkwOjAwCTAJUwotUnVsZQlCZWxpemUJMTk4Mglvbmx5CS0JRGVjCTE4CTA6MDAJMTowMAlECi1SdWxlCUJlbGl6ZQkxOTgzCW9ubHkJLQlGZWIJMTIJMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9CZWxpemUJLTU6NTI6NDggLQlMTVQJMTkxMiBBcHIKLQkJCS02OjAwCUJlbGl6ZQlDJXNUCi0KLSMgQmVybXVkYQotCi0jIEZyb20gRGFuIEpvbmVzLCByZXBvcnRpbmcgaW4gVGhlIFJveWFsIEdhemV0dGUgKDIwMDYtMDYtMjYpOgotCi0jIE5leHQgeWVhciwgaG93ZXZlciwgY2xvY2tzIGluIHRoZSBVUyB3aWxsIGdvIGZvcndhcmQgb24gdGhlIHNlY29uZCBTdW5kYXkKLSMgaW4gTWFyY2gsIHVudGlsIHRoZSBmaXJzdCBTdW5kYXkgaW4gTm92ZW1iZXIuICBBbmQsIGFmdGVyIHRoZSBUaW1lIFpvbmUKLSMgKFNlYXNvbmFsIFZhcmlhdGlvbikgQmlsbCAyMDA2IHdhcyBwYXNzZWQgaW4gdGhlIEhvdXNlIG9mIEFzc2VtYmx5IG9uCi0jIEZyaWRheSwgdGhlIHNhbWUgdGhpbmcgd2lsbCBoYXBwZW4gaW4gQmVybXVkYS4KLSMgaHR0cDovL3d3dy50aGVyb3lhbGdhemV0dGUuY29tL2FwcHMvcGJjcy5kbGwvYXJ0aWNsZT9BSUQ9LzIwMDYwNTI5L05FV1MvMTA1MjkwMTM1Ci0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvQmVybXVkYQktNDoxOTowNCAtCUxNVAkxOTMwIEphbiAgMSAyOjAwICAgICMgSGFtaWx0b24KLQkJCS00OjAwCS0JQVNUCTE5NzQgQXByIDI4IDI6MDAKLQkJCS00OjAwCUJhaGFtYXMJQSVzVAkxOTc2Ci0JCQktNDowMAlVUwlBJXNUCi0KLSMgQ2F5bWFuIElzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvQ2F5bWFuCS01OjI1OjMyIC0JTE1UCTE4OTAJCSMgR2VvcmdldG93bgotCQkJLTU6MDc6MTIgLQlLTVQJMTkxMiBGZWIgICAgIyBLaW5nc3RvbiBNZWFuIFRpbWUKLQkJCS01OjAwCS0JRVNUCi0KLSMgQ29zdGEgUmljYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ1IJMTk3OQkxOTgwCS0JRmViCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJQ1IJMTk3OQkxOTgwCS0JSnVuCVN1bj49MQkwOjAwCTAJUwotUnVsZQlDUgkxOTkxCTE5OTIJLQlKYW4JU2F0Pj0xNQkwOjAwCTE6MDAJRAotIyBJQVRBIFNTSU0gKDE5OTEtMDkpIHNheXMgdGhlIGZvbGxvd2luZyB3YXMgYXQgMTowMDsKLSMgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCUNSCTE5OTEJb25seQktCUp1bAkgMQkwOjAwCTAJUwotUnVsZQlDUgkxOTkyCW9ubHkJLQlNYXIJMTUJMDowMAkwCVMKLSMgVGhlcmUgYXJlIHRvbyBtYW55IFNhbiBKb3NlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSBgQ29zdGEgUmljYScuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvQ29zdGFfUmljYQktNTozNjoyMCAtCUxNVAkxODkwCQkjIFNhbiBKb3NlCi0JCQktNTozNjoyMCAtCVNKTVQJMTkyMSBKYW4gMTUgIyBTYW4gSm9zZSBNZWFuIFRpbWUKLQkJCS02OjAwCUNSCUMlc1QKLSMgQ29jbwotIyBubyBpbmZvcm1hdGlvbjsgcHJvYmFibHkgbGlrZSBBbWVyaWNhL0Nvc3RhX1JpY2EKLQotIyBDdWJhCi0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDE5OTktMDMtMjkpOgotIyBUaGUgMTk5OS0wMy0yOCBleGhpYml0aW9uIGJhc2ViYWxsIGdhbWUgaGVsZCBpbiBIYXZhbmEsIEN1YmEsIGJldHdlZW4KLSMgdGhlIEN1YmFuIE5hdGlvbmFsIFRlYW0gYW5kIHRoZSBCYWx0aW1vcmUgT3Jpb2xlcyB3YXMgY2FycmllZCBsaXZlIG9uCi0jIHRoZSBPcmlvbGVzIFJhZGlvIE5ldHdvcmssIGluY2x1ZGluZyBhZmZpbGlhdGUgV1RPUCBpbiBXYXNoaW5ndG9uLCBEQy4KLSMgRHVyaW5nIHRoZSBnYW1lLCBwbGF5LWJ5LXBsYXkgYW5ub3VuY2VyIEppbSBIdW50ZXIgbm90ZWQgdGhhdAotIyAiV2UnbGwgYmUgbG9zaW5nIHR3byBob3VycyBvZiBzbGVlcC4uLkN1YmEgc3dpdGNoZWQgdG8gRGF5bGlnaHQgU2F2aW5nCi0jIFRpbWUgdG9kYXkuIiAgKFRoZSAidHdvIGhvdXIiIHJlbWFyayByZWZlcnJlZCB0byBsb3Npbmcgb25lIGhvdXIgb2YKLSMgc2xlZXAgb24gMTk5OS0wMy0yOC0td2hlbiB0aGUgYW5ub3VuY2VycyB3ZXJlIGluIEN1YmEgYXMgaXQgc3dpdGNoZWQKLSMgdG8gRFNULS1hbmQgb25lIG1vcmUgaG91ciBvbiAxOTk5LTA0LTA0LS13aGVuIHRoZSBhbm5vdW5jZXJzIHdpbGwgaGF2ZQotIyByZXR1cm5lZCB0byBCYWx0aW1vcmUsIHdoaWNoIHN3aXRjaGVzIG9uIHRoYXQgZGF0ZS4pCi0KLSMgRnJvbSBFdmVydCB2YW4gZGVyIFZlZXIgdmlhIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNC0xMC0yOCk6Ci0jIEN1YmEgaXMgbm90IGdvaW5nIGJhY2sgdG8gc3RhbmRhcmQgdGltZSB0aGlzIHllYXIuCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBodHRwOi8vd3d3LmdyYW5tYS5jdS9pbmdsZXMvMjAwNC9zZXB0aWVtYnJlL2p1ZXYzMC80MW1lZGlkLWkuaHRtbAotIyBzYXlzIHRoYXQgaXQncyBkdWUgdG8gYSBwcm9ibGVtIGF0IHRoZSBBbnRvbmlvIEd1aXRlcmFzCi0jIHRoZXJtb2VsZWN0cmljIHBsYW50LCBhbmQgc2F5cyAiVGhpcyBPY3RvYmVyIHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuCi0jIHRvIG5vcm1hbCBob3VycyAoYWZ0ZXIgZGF5bGlnaHQgc2F2aW5nIHRpbWUpIi4KLSMgRm9yIG5vdywgbGV0J3MgYXNzdW1lIHRoYXQgaXQncyBhIHRlbXBvcmFyeSBtZWFzdXJlLgotCi0jIEZyb20gQ2FybG9zIEEuIENhcm5lcm8gRGVsZ2FkbyAoMjAwNS0xMS0xMik6Ci0jIFRoaXMgeWVhciAoanVzdCBsaWtlIGluIDIwMDQtMjAwNSkgdGhlcmUncyBubyBjaGFuZ2UgaW4gdGltZSB6b25lCi0jIGFkanVzdG1lbnQgaW4gQ3ViYS4gIFdlIHdpbGwgc3RheSBpbiBkYXlsaWdodCBzYXZpbmcgdGltZToKLSMgaHR0cDovL3d3dy5ncmFubWEuY3UvZXNwYW5vbC8yMDA1L25vdmllbWJyZS9taWVyOS9ob3JhcmlvLmh0bWwKLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0yMSk6Ci0jIEFuIGFydGljbGUgaW4gR1JBTk1BIElOVEVSTkFDSU9OQUwgY2xhaW1zIHRoYXQgQ3ViYSB3aWxsIGVuZAotIyB0aGUgMyB5ZWFycyBvZiBwZXJtYW5lbnQgRFNUIG5leHQgd2Vla2VuZCwgc2VlCi0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1L2luZ2xlcy8yMDA2L29jdHVicmUvbHVuMTYvNDNob3JhcmlvLmh0bWwKLSMgIk9uIFNhdHVyZGF5IG5pZ2h0LCBPY3RvYmVyIDI4IGdvaW5nIGludG8gU3VuZGF5LCBPY3RvYmVyIDI5LCBhdCAwMTowMCwKLSMgd2F0Y2hlcyBzaG91bGQgYmUgc2V0IGJhY2sgb25lIGhvdXIgLS0gZ29pbmcgYmFjayB0byAwMDowMCBob3VycyAtLSByZXR1cm5pbmcKLSMgdG8gdGhlIG5vcm1hbCBzY2hlZHVsZS4uLi4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA3LTAzLTAyKToKLSMgaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS9lbmdsaXNoL25ld3MvYXJ0ODkuaHRtbCwgZGF0ZWQgeWVzdGVyZGF5LAotIyBzYXlzIEN1YmFuIGNsb2NrcyB3aWxsIGFkdmFuY2UgYXQgbWlkbmlnaHQgb24gTWFyY2ggMTAuCi0jIEZvciBsYWNrIG9mIGJldHRlciBpbmZvcm1hdGlvbiwgYXNzdW1lIEN1YmEgd2lsbCB1c2UgVVMgcnVsZXMsCi0jIGV4Y2VwdCB0aGF0IGl0IHN3aXRjaGVzIGF0IG1pZG5pZ2h0IHN0YW5kYXJkIHRpbWUgYXMgdXN1YWwuCi0jCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA3LTEwLTI1KToKLSMgQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiBpbmZvcm1lZCBtZSB0aGF0IEN1YmEgd2lsbCBlbmQgRFNUIG9uZSB3ZWVrIAotIyBlYXJsaWVyIC0gb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIsIGp1c3QgbGlrZSBpbiAyMDA2LgotIyAKLSMgSGUgc3VwcGxpZWQgdGhlc2UgcmVmZXJlbmNlczoKLSMgCi0jIGh0dHA6Ly93d3cucHJlbnNhbGF0aW5hLmNvbS5teC9hcnRpY2xlLmFzcD9JRD0lN0I0Q0MzMkMxQi1BOUY3LTQyRkItOEEwNy04NjMxQUZDOTIzQUYlN0QmbGFuZ3VhZ2U9RVMKLSMgaHR0cDovL2FjdHVhbGlkYWQudGVycmEuZXMvc29jaWVkYWQvYXJ0aWN1bG8vY3ViYV9sbGFtYV9haG9ycmFyX2VuZXJnaWFfY2FtYmlvXzE5NTcwNDQuaHRtCi0jIAotIyBGcm9tIEFsZXggS3J5dmVuaXNoZXYgKDIwMDctMTAtMjUpOgotIyBIZXJlIGlzIGFsc28gYXJ0aWNsZSBmcm9tIEdyYW5tYSAoQ3ViYSk6Ci0jIAotIyBbUmVnaXJhXSBlbCBIb3JhcmlvIE5vcm1hbCBkZXNkZSBlbCBbcHJveGltb10gZG9taW5nbyAyOCBkZSBvY3R1YnJlCi0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwNy8xMC8yNC9uYWNpb25hbC9hcnRpYzA3Lmh0bWwKLSMgCi0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfY3ViYTAzLmh0bWwKLQotIyBGcm9tIEFydGh1ciBEYXZpZCBPbHNvbiAoMjAwOC0wMy0wOSk6Ci0jIEknbSBpbiBNYXJ5bGFuZCB3aGljaCBpcyBub3cgb2JzZXJ2aW5nIFVuaXRlZCBTdGF0ZXMgRWFzdGVybiBEYXlsaWdodAotIyBUaW1lLiBBdCA5OjQ0IGxvY2FsIHRpbWUgSSB1c2VkIFJlYWxQbGF5ZXIgdG8gbGlzdGVuIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JhZGlvcmVsb2oiPgotIyBodHRwOi8vbWVkaWEuZW5ldC5jdS9yYWRpb3JlbG9qCi0jIDwvYT4sIGEgQ3ViYW4gaW5mb3JtYXRpb24gc3RhdGlvbiwgYW5kIGhlYXJkCi0jIHRoZSB0aW1lIGFubm91bmNlZCBhcyAib2NobyBjdWFyZW50YSB5IGN1YXRybyIgKCJlaWdodCBmb3J0eS1mb3VyIiksCi0jIGluZGljYXRpbmcgdGhhdCBDdWJhIGlzIHN0aWxsIG9uIHN0YW5kYXJkIHRpbWUuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDgtMDMtMTIpOgotIyBJdCBzZWVtcyB0aGF0IEN1YmEgd2lsbCBzdGFydCBEU1Qgb24gU3VuZGF5LCAyMDA3LTAzLTE2Li4uCi0jIEl0IHdhcyBhbm5vdW5jZWQgeWVzdGVyZGF5LCBhY2NvcmRpbmcgdG8gdGhpcyBzb3VyY2UgKGluIFNwYW5pc2gpOgotIyA8YSBocmVmPSJodHRwOi8vd3d3Lm5uYy5jdWJhd2ViLmN1L21hcnpvLTIwMDgvY2llbi0xLTExLTMtMDguaHRtIj4KLSMgaHR0cDovL3d3dy5ubmMuY3ViYXdlYi5jdS9tYXJ6by0yMDA4L2NpZW4tMS0xMS0zLTA4Lmh0bQotIyA8L2E+Ci0jCi0jIFNvbWUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGlzIHBvc3RlZCBoZXJlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwiPgotIyBodHRwOi8vd3d3LnRpbWVhbmRkYXRlLmNvbS9uZXdzL3RpbWUvY3ViYS1zdGFydHMtZHN0LW1hcmNoLTE2Lmh0bWwKLSMgPC9hPgotIwotIyBUaGUgYXJ0aWNsZSBhbHNvIHNheXMgdGhhdCBDdWJhIGhhcyBiZWVuIG9ic2VydmluZyBEU1Qgc2luY2UgMTk2MywKLSMgd2hpbGUgU2hhbmtzIChhbmQgdHpkYXRhKSBoYXMgMTk2NSBhcyB0aGUgZmlyc3QgZGF0ZSAoZXhjZXB0IGluIHRoZQotIyAxOTQwJ3MpLiBNYW55IG90aGVyIHdlYiBwYWdlcyBpbiBDdWJhIGFsc28gY2xhaW0gdGhhdCBpdCBoYXMgYmVlbgotIyBvYnNlcnZlZCBzaW5jZSAxOTYzLCBidXQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIDE5NzAgLSBhbiBleGNlcHRpb24KLSMgd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gdHpkYXRhL1NoYW5rcy4gU28gdGhlcmUgaXMgYSBjaGFuY2Ugd2UgbmVlZCB0bwotIyBjaGFuZ2Ugc29tZSBoaXN0b3JpYyByZWNvcmRzIGFzIHdlbGwuCi0jCi0jIE9uZSBleGFtcGxlOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnJhZGlvaGMuY3UvZXNwYW5vbC9ub3RpY2lhcy9tYXIwNy8xMW1hci9ob3IuaHRtIj4KLSMgaHR0cDovL3d3dy5yYWRpb2hjLmN1L2VzcGFub2wvbm90aWNpYXMvbWFyMDcvMTFtYXIvaG9yLmh0bQotIyA8L2E+Ci0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDgtMDMtMTMpOgotIyBUaGUgQ3ViYW4gdGltZSBjaGFuZ2UgaGFzIGp1c3QgYmVlbiBjb25maXJtZWQgb24gdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZQotIyB3ZWIgc2l0ZSwgdGhlIEdyYW5tYS4gIFBsZWFzZSBjaGVjayBvdXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFubWEuY3ViYXdlYi5jdS8yMDA4LzAzLzEzL25hY2lvbmFsL2FydGljMTAuaHRtbCI+Ci0jIGh0dHA6Ly93d3cuZ3Jhbm1hLmN1YmF3ZWIuY3UvMjAwOC8wMy8xMy9uYWNpb25hbC9hcnRpYzEwLmh0bWwKLSMgPC9hPgotIwotIyBCYXNpY2FsbHkgYXMgZXhwZWN0ZWQgYWZ0ZXIgU3RlZmZlbiBUaG9yc2VucyBpbmZvcm1hdGlvbiwgdGhlIGNoYW5nZQotIyB3aWxsIHRha2UgcGxhY2UgbWlkbmlnaHQgYmV0d2VlbiBTYXR1cmRheSBhbmQgU3VuZGF5LgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA4LTAzLTEyKToKLSMgQXNzdW1lIFN1bj49MTUgKHRoaXJkIFN1bmRheSkgZ29pbmcgZm9yd2FyZC4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOS0wMy0wNCkKLSMgQWNjb3JkaW5nIHRvIHRoZSBSYWRpbyBSZWxvaiAtIEN1YmEgd2lsbCBzdGFydCBEYXlsaWdodCBTYXZpbmcgVGltZSBvbgotIyBtaWRuaWdodCBiZXR3ZWVuIFNhdHVyZGF5LCBNYXJjaCAwNywgMjAwOSBhbmQgU3VuZGF5LCBNYXJjaCAwOCwgMjAwOS0KLSMgbm90IG9uIG1pZG5pZ2h0IE1hcmNoIDE0IC8gTWFyY2ggMTUgYXMgcHJldmlvdXNseSB0aG91Z2h0LgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2N1YmEwNS5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19jdWJhMDUuaHRtbAotIyAoaW4gU3BhbmlzaCkKLSMgPC9hPgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgyMDA5LTAzLTA5KQotIyBJIGxpc3RlbmVkIG92ZXIgdGhlIEludGVybmV0IHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly9tZWRpYS5lbmV0LmN1L3JlYWRpb3JlbG9qIj4KLSMgaHR0cDovL21lZGlhLmVuZXQuY3UvcmVhZGlvcmVsb2oKLSMgPC9hPgotIyB0aGlzIG1vcm5pbmc7IHdoZW4gaXQgd2FzIDEwOjA1IGEuIG0uIGhlcmUgaW4gQmV0aGVzZGEsIE1hcnlsYW5kIHRoZQotIyB0aGUgdGltZSB3YXMgYW5ub3VuY2VkIGFzICJkaWV6IGNpbmNvIi0tdGhlIHNhbWUgdGltZSBhcyBoZXJlLCBpbmRpY2F0aW5nCi0jIHRoYXQgaGFzIGluZGVlZCBzd2l0Y2hlZCB0byBEU1QuIEFzc3VtZSBzZWNvbmQgU3VuZGF5IGZyb20gMjAwOSBmb3J3YXJkLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDdWJhCTE5MjgJb25seQktCUp1bgkxMAkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5MjgJb25seQktCU9jdAkxMAkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NDAJMTk0MgktCUp1bglTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTQwCTE5NDIJLQlTZXAJU3VuPj0xCTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk0NQkxOTQ2CS0JSnVuCVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5NDUJMTk0NgktCVNlcAlTdW4+PTEJMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTY1CW9ubHkJLQlKdW4JMQkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5NjUJb25seQktCVNlcAkzMAkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NjYJb25seQktCU1heQkyOQkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5NjYJb25seQktCU9jdAkyCTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk2Nwlvbmx5CS0JQXByCTgJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTY3CTE5NjgJLQlTZXAJU3VuPj04CTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk2OAlvbmx5CS0JQXByCTE0CTA6MDAJMTowMAlECi1SdWxlCUN1YmEJMTk2OQkxOTc3CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTY5CTE5NzEJLQlPY3QJbGFzdFN1bgkwOjAwCTAJUwotUnVsZQlDdWJhCTE5NzIJMTk3NAktCU9jdAk4CTA6MDAJMAlTCi1SdWxlCUN1YmEJMTk3NQkxOTc3CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTc4CW9ubHkJLQlNYXkJNwkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5NzgJMTk5MAktCU9jdAlTdW4+PTgJMDowMAkwCVMKLVJ1bGUJQ3ViYQkxOTc5CTE5ODAJLQlNYXIJU3VuPj0xNQkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5ODEJMTk4NQktCU1heQlTdW4+PTUJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTg2CTE5ODkJLQlNYXIJU3VuPj0xNAkwOjAwCTE6MDAJRAotUnVsZQlDdWJhCTE5OTAJMTk5NwktCUFwcglTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJQ3ViYQkxOTkxCTE5OTUJLQlPY3QJU3VuPj04CTA6MDBzCTAJUwotUnVsZQlDdWJhCTE5OTYJb25seQktCU9jdAkgNgkwOjAwcwkwCVMKLVJ1bGUJQ3ViYQkxOTk3CW9ubHkJLQlPY3QJMTIJMDowMHMJMAlTCi1SdWxlCUN1YmEJMTk5OAkxOTk5CS0JTWFyCWxhc3RTdW4JMDowMHMJMTowMAlECi1SdWxlCUN1YmEJMTk5OAkyMDAzCS0JT2N0CWxhc3RTdW4JMDowMHMJMAlTCi1SdWxlCUN1YmEJMjAwMAkyMDA0CS0JQXByCVN1bj49MQkwOjAwcwkxOjAwCUQKLVJ1bGUJQ3ViYQkyMDA2CW1heAktCU9jdAlsYXN0U3VuCTA6MDBzCTAJUwotUnVsZQlDdWJhCTIwMDcJb25seQktCU1hcglTdW4+PTgJMDowMHMJMTowMAlECi1SdWxlCUN1YmEJMjAwOAlvbmx5CS0JTWFyCVN1bj49MTUJMDowMHMJMTowMAlECi1SdWxlCUN1YmEJMjAwOQltYXgJLQlNYXIJU3VuPj04CTA6MDBzCTE6MDAJRAotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvSGF2YW5hCS01OjI5OjI4IC0JTE1UCTE4OTAKLQkJCS01OjI5OjM2IC0JSE1UCTE5MjUgSnVsIDE5IDEyOjAwICMgSGF2YW5hIE1UCi0JCQktNTowMAlDdWJhCUMlc1QKLQotIyBEb21pbmljYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0RvbWluaWNhCS00OjA1OjM2IC0JTE1UCTE5MTEgSnVsIDEgMDowMQkJIyBSb3NlYXUKLQkJCS00OjAwCS0JQVNUCi0KLSMgRG9taW5pY2FuIFJlcHVibGljCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDAtMTAtMzApOgotIyBFbnJpcXVlIE1vcmFsZXMgcmVwb3J0ZWQgdG8gbWUgdGhhdCB0aGUgRG9taW5pY2FuIFJlcHVibGljIGhhcyBjaGFuZ2VkIHRoZQotIyB0aW1lIHpvbmUgdG8gRWFzdGVybiBTdGFuZGFyZCBUaW1lIGFzIG9mIFN1bmRheSAyOSBhdCAyIGFtLi4uLgotIyBodHRwOi8vd3d3Lmxpc3Rpbi5jb20uZG8vYW50ZXMvMjYxMDAwL3JlcHVibGljYS9wcmluY2kuaHRtbAotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDAtMTItMDQpOgotIyBUaGF0IFVSTCAoMjAwMC0xMC0yNiwgaW4gU3BhbmlzaCkgc2F5cyB0aGV5IHBsYW5uZWQgdG8gdXNlIFVTLXN0eWxlIERTVC4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAwLTEyLTAxKToKLSMgRG9taW5pY2FuIFJlcHVibGljIGNoYW5nZWQgaXRzIG1pbmQgYW5kIHByZXNpZGVudGlhbCBkZWNyZWUgb24gVHVlc2RheSwKLSMgTm92ZW1iZXIgMjgsIDIwMDAsIHdpdGggYSBuZXcgZGVjcmVlLiAgT24gU3VuZGF5LCBEZWNlbWJlciAzIGF0IDE6MDAgQU0gdGhlCi0jIERvbWluaWNhbiBSZXB1YmxpYyB3aWxsIGJlIHJldmVydGluZyB0byA4IGhvdXJzIGZyb20gdGhlIEludGVybmF0aW9uYWwgRGF0ZQotIyBMaW5lLCBhbmQgd2lsbCBub3QgYmUgdXNpbmcgRFNUIGluIHRoZSBmb3Jlc2VlYWJsZSBmdXR1cmUuICBUaGUgcmVhc29uIHRoZXkKLSMgZGVjaWRlZCB0byB1c2UgRFNUIHdhcyB0byBiZSBpbiBzeW5jaCB3aXRoIFB1ZXJ0byBSaWNvLCB3aG8gd2FzIGFsc28gZ29pbmcKLSMgdG8gaW1wbGVtZW50IERTVC4gIFdoZW4gUHVlcnRvIFJpY28gZGlkbid0IGltcGxlbWVudCBEU1QsIHRoZSBwcmVzaWRlbnQKLSMgZGVjaWRlZCB0byByZXZlcnQuCi0KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRFIJMTk2Nglvbmx5CS0JT2N0CTMwCTA6MDAJMTowMAlECi1SdWxlCURSCTE5NjcJb25seQktCUZlYgkyOAkwOjAwCTAJUwotUnVsZQlEUgkxOTY5CTE5NzMJLQlPY3QJbGFzdFN1bgkwOjAwCTA6MzAJSEQKLVJ1bGUJRFIJMTk3MAlvbmx5CS0JRmViCTIxCTA6MDAJMAlTCi1SdWxlCURSCTE5NzEJb25seQktCUphbgkyMAkwOjAwCTAJUwotUnVsZQlEUgkxOTcyCTE5NzQJLQlKYW4JMjEJMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9TYW50b19Eb21pbmdvIC00OjM5OjM2IC0JTE1UCTE4OTAKLQkJCS00OjQwCS0JU0RNVAkxOTMzIEFwciAgMSAxMjowMCAjIFMuIERvbS4gTVQKLQkJCS01OjAwCURSCUUlc1QJMTk3NCBPY3QgMjcKLQkJCS00OjAwCS0JQVNUCTIwMDAgT2N0IDI5IDAyOjAwCi0JCQktNTowMAlVUwlFJXNUCTIwMDAgRGVjICAzIDAxOjAwCi0JCQktNDowMAktCUFTVAotCi0jIEVsIFNhbHZhZG9yCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVNhbHYJMTk4NwkxOTg4CS0JTWF5CVN1bj49MQkwOjAwCTE6MDAJRAotUnVsZQlTYWx2CTE5ODcJMTk4OAktCVNlcAlsYXN0U3VuCTA6MDAJMAlTCi0jIFRoZXJlIGFyZSB0b28gbWFueSBTYW4gU2FsdmFkb3JzIGVsc2V3aGVyZSwgc28gdXNlIEFtZXJpY2EvRWxfU2FsdmFkb3IKLSMgaW5zdGVhZCBvZiBBbWVyaWNhL1Nhbl9TYWx2YWRvci4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9FbF9TYWx2YWRvciAtNTo1Njo0OCAtCUxNVAkxOTIxCQkjIFNhbiBTYWx2YWRvcgotCQkJLTY6MDAJU2FsdglDJXNUCi0KLSMgR3JlbmFkYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0dyZW5hZGEJLTQ6MDc6MDAgLQlMTVQJMTkxMSBKdWwJIyBTdCBHZW9yZ2UncwotCQkJLTQ6MDAJLQlBU1QKLQotIyBHdWFkZWxvdXBlCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvR3VhZGVsb3VwZQktNDowNjowOCAtCUxNVAkxOTExIEp1biA4CSMgUG9pbnRlIGEgUGl0cmUKLQkJCS00OjAwCS0JQVNUCi0jIFN0IEJhcnRoZWxlbXkKLUxpbmsgQW1lcmljYS9HdWFkZWxvdXBlCUFtZXJpY2EvU3RfQmFydGhlbGVteQotIyBTdCBNYXJ0aW4gKEZyZW5jaCBwYXJ0KQotTGluayBBbWVyaWNhL0d1YWRlbG91cGUJQW1lcmljYS9NYXJpZ290Ci0KLSMgR3VhdGVtYWxhCi0jCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDYtMDQtMjIpLCBhZnRlciBhIGhlYWRzLXVwIGZyb20gT3NjYXIgdmFuIFZsaWptZW46Ci0jIERpYXJpbyBDbyBMYXRpbm8sIGF0Ci0jIGh0dHA6Ly93d3cuZGlhcmlvY29sYXRpbm8uY29tL2ludGVybmFjaW9uYWxlcy9kZXRhbGxlcy5hc3A/TmV3c0lEPTgwNzksCi0jIHNheXMgaW4gYW4gYXJ0aWNsZSBkYXRlZCAyMDA2LTA0LTE5IHRoYXQgdGhlIEd1YXRlbWFsYW4gZ292ZXJubWVudCBoYWQKLSMgZGVjaWRlZCBvbiB0aGF0IGRhdGUgdG8gYWR2YW5jZSBvZmZpY2lhbCB0aW1lIGJ5IDYwIG1pbnV0ZXMsIHRvIGxlc3NlbiB0aGUKLSMgaW1wYWN0IG9mIHRoZSBlbGV2YXRlZCBjb3N0IG9mIG9pbC4uLi4gIERheWxpZ2h0IHNhdmluZyB0aW1lIHdpbGwgbGFzdCBmcm9tCi0jIDIwMDYtMDQtMjkgMjQ6MDAgKEd1YXRlbWFsYW4gc3RhbmRhcmQgdGltZSkgdG8gMjAwNi0wOS0zMCAodGltZSB1bnNwZWNpZmllZCkuCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDYtMjIpOgotIyBUaGUgTWluaXN0cnkgb2YgRW5lcmd5IGFuZCBNaW5lcywgcHJlc3MgcmVsZWFzZSBDUC0xNS8yMDA2Ci0jICgyMDA2LTA0LTE5KSwgc2F5cyBEU1QgZW5kcyBhdCAyNDowMC4gIFNlZQotIyA8aHR0cDovL3d3dy5zaWVjYS5vcmcuZ3QvU2l0aW9fcHVibGljby9FbmVyZ2V0aWNvcy9Eb2MvTWVkaWRhcy9DYW1iaW9fSG9yYXJpb19OYWNfMTkwNDA2LnBkZj4uCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCUd1YXQJMTk3Mwlvbmx5CS0JTm92CTI1CTA6MDAJMTowMAlECi1SdWxlCUd1YXQJMTk3NAlvbmx5CS0JRmViCTI0CTA6MDAJMAlTCi1SdWxlCUd1YXQJMTk4Mwlvbmx5CS0JTWF5CTIxCTA6MDAJMTowMAlECi1SdWxlCUd1YXQJMTk4Mwlvbmx5CS0JU2VwCTIyCTA6MDAJMAlTCi1SdWxlCUd1YXQJMTk5MQlvbmx5CS0JTWFyCTIzCTA6MDAJMTowMAlECi1SdWxlCUd1YXQJMTk5MQlvbmx5CS0JU2VwCSA3CTA6MDAJMAlTCi1SdWxlCUd1YXQJMjAwNglvbmx5CS0JQXByCTMwCTA6MDAJMTowMAlECi1SdWxlCUd1YXQJMjAwNglvbmx5CS0JT2N0CSAxCTA6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvR3VhdGVtYWxhCS02OjAyOjA0IC0JTE1UCTE5MTggT2N0IDUKLQkJCS02OjAwCUd1YXQJQyVzVAotCi0jIEhhaXRpCi0jIEZyb20gR3dpbGxpbSBMYXcgKDIwMDUtMDQtMTUpOgotIyBSaXN0byBPLiBOeWthbmVuIHdyb3RlIG1lIHRoYXQgSGFpdGkgaXMgbm93IG9uIERTVC4KLSMgSSBzZWFyY2hlZCBmb3IgY29uZmlybWF0aW9uLCBhbmQgSSBmb3VuZCBhCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGFpdGlhbmNvbnN1bGF0ZS5vcmcvdGltZS5kb2MiPiBwcmVzcyByZWxlYXNlCi0jIG9uIHRoZSBXZWIgcGFnZSBvZiB0aGUgSGFpdGlhbiBDb25zdWxhdGUgaW4gQ2hpY2FnbyAoMjAwNS0wMy0zMSksCi0jIDwvYT4uICBUcmFuc2xhdGVkIGZyb20gRnJlbmNoLCBpdCBzYXlzOgotIwotIyAgIlRoZSBQcmltZSBNaW5pc3RlcidzIENvbW11bmljYXRpb24gT2ZmaWNlIG5vdGlmaWVzIHRoZSBwdWJsaWMgaW4gZ2VuZXJhbAotIyAgIGFuZCB0aGUgcHJlc3MgaW4gcGFydGljdWxhciB0aGF0LCBmb2xsb3dpbmcgYSBkZWNpc2lvbiBvZiB0aGUgSW50ZXJpb3IKLSMgICBNaW5pc3RyeSBhbmQgdGhlIFRlcnJpdG9yaWFsIENvbGxlY3Rpdml0aWVzIFtJIHN1cHBvc2UgdGhhdCBtZWFucyB0aGUKLSMgICBwcm92aW5jZXNdLCBIYWl0aSB3aWxsIG1vdmUgdG8gRWFzdGVybiBEYXlsaWdodCBUaW1lIGluIHRoZSBuaWdodCBmcm9tIG5leHQKLSMgICBTYXR1cmRheSB0aGUgMm5kIHRvIFN1bmRheSB0aGUgM3JkLgotIwotIyAgIkNvbnNlcXVlbnRseSwgdGhlIFByaW1lIE1pbmlzdGVyJ3MgQ29tbXVuaWNhdGlvbiBPZmZpY2Ugd2lzaGVzIHRvIGluZm9ybQotIyAgIHRoZSBwb3B1bGF0aW9uIHRoYXQgdGhlIGNvdW50cnkncyBjbG9ja3Mgd2lsbCBiZSBzZXQgZm9yd2FyZCBvbmUgaG91cgotIyAgIHN0YXJ0aW5nIGF0IG1pZG5pZ2h0LiAgVGhpcyBwcm92aXNpb24gd2lsbCBob2xkIHVudGlsIHRoZSBsYXN0IFNhdHVyZGF5IGluCi0jICAgT2N0b2JlciAyMDA1LgotIwotIyAgIlBvcnQtYXUtUHJpbmNlLCBNYXJjaCAzMSwgMjAwNSIKLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDYtMDQtMDQpOgotIyBJIGhhdmUgYmVlbiBpbmZvcm1lZCBieSB1c2VycyB0aGF0IEhhaXRpIG9ic2VydmVzIERTVCB0aGlzIHllYXIgbGlrZQotIyBsYXN0IHllYXIsIHNvIHRoZSBjdXJyZW50ICJvbmx5IiBydWxlIGZvciAyMDA1IG1pZ2h0IGJlIGNoYW5nZWQgdG8gYQotIyAibWF4IiBydWxlIG9yIHRvIGxhc3QgdW50aWwgMjAwNi4gKFdobyBrbm93cyBpZiB0aGV5IHdpbGwgb2JzZXJ2ZSBEU1QKLSMgbmV4dCB5ZWFyIG9yIGlmIHRoZXkgd2lsbCBleHRlbmQgdGhlaXIgRFNUIGxpa2UgVVMvQ2FuYWRhIG5leHQgeWVhcikuCi0jCi0jIEkgaGF2ZSBmb3VuZCB0aGlzIGFydGljbGUgYWJvdXQgaXQgKGluIEZyZW5jaCk6Ci0jIGh0dHA6Ly93d3cuaGFpdGlwcmVzc25ldHdvcmsuY29tL25ld3MuY2ZtP2FydGljbGVJRD03NjEyCi0jCi0jIFRoZSByZWFzb24gc2VlbXMgdG8gYmUgYW4gZW5lcmd5IGNyaXNpcy4KLQotIyBGcm9tIFN0ZXBoZW4gQ29sZWJvdXJuZSAoMjAwNy0wMi0yMik6Ci0jIFNvbWUgSUFUQSBpbmZvOiBIYWl0aSB3b24ndCBiZSBoYXZpbmcgRFNUIGluIDIwMDcuCi0KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSGFpdGkJMTk4Mwlvbmx5CS0JTWF5CTgJMDowMAkxOjAwCUQKLVJ1bGUJSGFpdGkJMTk4NAkxOTg3CS0JQXByCWxhc3RTdW4JMDowMAkxOjAwCUQKLVJ1bGUJSGFpdGkJMTk4MwkxOTg3CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBBVCBpcyAyOjAwLCBidXQgSUFUQSBTU0lNICgxOTkxLzE5OTcpIHNheXMgMTowMHMuCi0jIEdvIHdpdGggSUFUQS4KLVJ1bGUJSGFpdGkJMTk4OAkxOTk3CS0JQXByCVN1bj49MQkxOjAwcwkxOjAwCUQKLVJ1bGUJSGFpdGkJMTk4OAkxOTk3CS0JT2N0CWxhc3RTdW4JMTowMHMJMAlTCi1SdWxlCUhhaXRpCTIwMDUJMjAwNgktCUFwcglTdW4+PTEJMDowMAkxOjAwCUQKLVJ1bGUJSGFpdGkJMjAwNQkyMDA2CS0JT2N0CWxhc3RTdW4JMDowMAkwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Qb3J0LWF1LVByaW5jZSAtNDo0OToyMCAtCUxNVAkxODkwCi0JCQktNDo0OQktCVBQTVQJMTkxNyBKYW4gMjQgMTI6MDAgIyBQLWEtUCBNVAotCQkJLTU6MDAJSGFpdGkJRSVzVAotCi0jIEhvbmR1cmFzCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBzYXkgMTkyMSBKYW4gMTsgZ28gd2l0aCBXaGl0bWFuJ3MgbW9yZSBwcmVjaXNlIEFwciAxLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDUtMDUpOgotIyB3b3JsZHRpbWV6b25lLmNvbSByZXBvcnRzIGEgMjAwNi0wNS0wMiBTcGFuaXNoLWxhbmd1YWdlIEFQIGFydGljbGUKLSMgc2F5aW5nIEhvbmR1cmFzIHdpbGwgc3RhcnQgdXNpbmcgRFNUIG1pZG5pZ2h0IFNhdHVyZGF5LCBlZmZlY3RpdmUgNAotIyBtb250aHMgdW50aWwgU2VwdGVtYmVyLiAgTGEgVHJpYnVuYSByZXBvcnRlZCB0b2RheQotIyA8aHR0cDovL3d3dy5sYXRyaWJ1bmEuaG4vOTkyOTkuaHRtbD4gdGhhdCBNYW51ZWwgWmVsYXlhLCB0aGUgcHJlc2lkZW50Ci0jIG9mIEhvbmR1cmFzLCByZWZ1c2VkIHRvIGJhY2sgZG93biBvbiB0aGlzLgotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA4LTA4KToKLSMgSXQgc2VlbXMgdGhhdCBIb25kdXJhcyBoYXMgcmV0dXJuZWQgZnJvbSBEU1QgdG8gc3RhbmRhcmQgdGltZSB0aGlzIE1vbmRheSBhdAotIyAwMDowMCBob3VycyAocHJvbG9uZ2luZyBTdW5kYXkgdG8gMjUgaG91cnMgZHVyYXRpb24pLgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2hvbmR1cmFzMDQuaHRtbAotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDgtMDgpOgotIyBBbHNvIHNlZSBEaWFyaW8gRWwgSGVyYWxkbywgVGhlIGNvdW50cnkgcmV0dXJucyB0byBzdGFuZGFyZCB0aW1lICgyMDA2LTA4LTA4KQotIyA8aHR0cDovL3d3dy5lbGhlcmFsZG8uaG4vbm90YS5waHA/bmlkPTU0OTQxJnNlYz0xMj4uCi0jIEl0IG1lbnRpb25zIGV4ZWN1dGl2ZSBkZWNyZWUgMTgtMjAwNi4KLQotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNi0wOC0xNyk6Ci0jIEhvbmR1cmFzIHdpbGwgb2JzZXJ2ZSBEU1QgZnJvbSAyMDA3IHRvIDIwMDksIGV4YWN0IGRhdGVzIGFyZSBub3QKLSMgcHVibGlzaGVkLCBJIGhhdmUgbG9jYXRlZCB0aGlzIGF1dGhvcml0YXRpdmUgc291cmNlOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5obi9ub3RpY2lhLmFzcHg/bklkPTQ3Ci0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDMtMzApOgotIyBodHRwOi8vd3d3LmxhcHJlbnNhaG4uY29tL3BhaXNfbm90YS5waHA/aWQwNDk2Mj03Mzg2Ci0jIFNvIGl0IHNlZW1zIHRoYXQgSG9uZHVyYXMgd2lsbCBub3QgZW50ZXIgRFNUIHRoaXMgeWVhci4uLi4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJSG9uZAkxOTg3CTE5ODgJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUhvbmQJMTk4NwkxOTg4CS0JU2VwCWxhc3RTdW4JMDowMAkwCVMKLVJ1bGUJSG9uZAkyMDA2CW9ubHkJLQlNYXkJU3VuPj0xCTA6MDAJMTowMAlECi1SdWxlCUhvbmQJMjAwNglvbmx5CS0JQXVnCU1vbj49MQkwOjAwCTAJUwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1RlZ3VjaWdhbHBhIC01OjQ4OjUyIC0JTE1UCTE5MjEgQXByCi0JCQktNjowMAlIb25kCUMlc1QKLSMKLSMgR3JlYXQgU3dhbiBJIGNlZGVkIGJ5IFVTIHRvIEhvbmR1cmFzIGluIDE5NzIKLQotIyBKYW1haWNhCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgRm9sbG93cyBVUyBydWxlcy4KLQotIyBGcm9tIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5ICgxOTg5LTAxLTE5KToKLSMgSkFNQUlDQSAgICAgICAgICAgICA1IEggIEJFSElORCBVVEMKLQotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9KYW1haWNhCS01OjA3OjEyIC0JTE1UCTE4OTAJCSMgS2luZ3N0b24KLQkJCS01OjA3OjEyIC0JS01UCTE5MTIgRmViICAgICMgS2luZ3N0b24gTWVhbiBUaW1lCi0JCQktNTowMAktCUVTVAkxOTc0IEFwciAyOCAyOjAwCi0JCQktNTowMAlVUwlFJXNUCTE5ODQKLQkJCS01OjAwCS0JRVNUCi0KLSMgTWFydGluaXF1ZQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01hcnRpbmlxdWUJLTQ6MDQ6MjAgLSAgICAgIExNVAkxODkwCQkjIEZvcnQtZGUtRnJhbmNlCi0JCQktNDowNDoyMCAtCUZGTVQJMTkxMSBNYXkgICAgICMgRm9ydC1kZS1GcmFuY2UgTVQKLQkJCS00OjAwCS0JQVNUCTE5ODAgQXByICA2Ci0JCQktNDowMAkxOjAwCUFEVAkxOTgwIFNlcCAyOAotCQkJLTQ6MDAJLQlBU1QKLQotIyBNb250c2VycmF0Ci0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBJbiAxOTk1IHZvbGNhbmljIGVydXB0aW9ucyBmb3JjZWQgZXZhY3VhdGlvbiBvZiBQbHltb3V0aCwgdGhlIGNhcGl0YWwuCi0jIHdvcmxkLmdhemV0dGVlci5jb20gc2F5cyBDb3JrIEhpbGwgaXMgdGhlIG1vc3QgcG9wdWxvdXMgbG9jYXRpb24gbm93LgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01vbnRzZXJyYXQJLTQ6MDg6NTIgLQlMTVQJMTkxMSBKdWwgMSAwOjAxICAgIyBDb3JrIEhpbGwKLQkJCS00OjAwCS0JQVNUCi0KLSMgTmljYXJhZ3VhCi0jCi0jIFRoaXMgdXNlcyBTaGFua3MgJiBQb3R0ZW5nZXIgZm9yIHRpbWVzIGJlZm9yZSAyMDA1LgotIwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNS0wNC0xMik6Ci0jIEkndmUgZ290IHJlcG9ydHMgZnJvbSA4IGRpZmZlcmVudCBwZW9wbGUgdGhhdCBOaWNhcmFndWEganVzdCBzdGFydGVkCi0jIERTVCBvbiBTdW5kYXkgMjAwNS0wNC0xMCwgaW4gb3JkZXIgdG8gc2F2ZSBlbmVyZ3kgYmVjYXVzZSBvZgotIyBleHBlbnNpdmUgcGV0cm9sZXVtLiAgVGhlIGV4YWN0IGVuZCBkYXRlIGZvciBEU1QgaXMgbm90IHlldAotIyBhbm5vdW5jZWQsIG9ubHkgIlNlcHRlbWJlciIgYnV0IHNvbWUgc2l0ZXMgYWxzbyBzYXkgIm1pZC1TZXB0ZW1iZXIiLgotIyBTb21lIGJhY2tncm91bmQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBQcmVzaWRlbnQncyBvZmZpY2lhbCBzaXRlOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvYi5uaS9QcmVzaWRlbmNpYS9GaWxlc19pbmRleC9TZWNyZXRhcmlhL05vdGFzJTIwZGUlMjBQcmVuc2EvUHJlc2lkZW50ZS8yMDA1L0FCUklML0dvYmllcm5vLWRlLW5pY2FyYWd1YS1hZGVsYW50YS1ob3JhLW9maWNpYWwtMDZhYnJpbC5odG0KLSMgVGhlIERlY3JlZSwgbm8gMjMtMjAwNSBpcyBhdmFpbGFibGUgaGVyZToKLSMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvYnVzY2Fkb3JfZ2FjZXRhL0JEL0RFQ1JFVE9TLzIwMDUvRGVjcmV0byUyMDIzLTIwMDUlMjBTZSUyMGFkZWxhbnRhJTIwZW4lMjB1bmElMjBob3JhJTIwZW4lMjB0b2RvJTIwZWwlMjB0ZXJyaXRvcmlvJTIwbmFjaW9uYWwlMjBhcGFydGlyJTIwZGUlMjBsYXMlMjAyNGhvcmFzJTIwZGVsJTIwMDklMjBkZSUyMEFicmlsLnBkZgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA1LTA1LTAxKToKLSMgVGhlIGRlY3JlZSBkb2Vzbid0IHNheSBhbnl0aGluZyBhYm91dCBkYXlsaWdodCBzYXZpbmcsIGJ1dCBmb3Igbm93IGxldCdzCi0jIGFzc3VtZSB0aGF0IGl0IGlzIGRheWxpZ2h0IHNhdmluZy4uLi4KLSMKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwNS0wNC0yMSk6Ci0jIFRoZSBBc3NvY2lhdGVkIFByZXNzIHN0b3J5IG9uIHRoZSB0aW1lIGNoYW5nZSwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0Ci0jIGh0dHA6Ly93d3cubGFwYWxtYWludGVyYWN0aXZvLmNvbS9ndWlhcy9jb250ZW50L2dlbi9hcC9BbWVyaWNhX0xhdGluYS9BTUNfR0VOX05JQ0FSQUdVQV9IT1JBLmh0bWwKLSMgYW5kIGVsc2V3aGVyZSwgc2F5cyAoZmlmdGggcGFyYWdyYXBoLCB0cmFuc2xhdGVkIGZyb20gU3BhbmlzaCk6ICAiVGhlIGxhc3QKLSMgdGltZSB0aGF0IGEgY2hhbmdlIG9mIGNsb2NrcyB3YXMgYXBwbGllZCB0byBzYXZlIGVuZXJneSB3YXMgaW4gdGhlIHllYXIgMjAwMAotIyBkdXJpbmcgdGhlIEFybm9sZG8gQWxlbWFuIGFkbWluaXN0cmF0aW9uLiIuLi4KLSMgVGhlIG5vcnRoYW1lcmljYSBmaWxlIHNheXMgdGhhdCBOaWNhcmFndWEgaGFzIGJlZW4gb24gVVRDLTYgY29udGludW91c2x5Ci0jIHNpbmNlIERlY2VtYmVyIDE5OTguICBJIHdhc24ndCBhYmxlIHRvIGZpbmQgYW55IGRldGFpbHMgb2YgTmljYXJhZ3VhbiB0aW1lCi0jIGNoYW5nZXMgaW4gMjAwMC4gIFBlcmhhcHMgYSBub3RlIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBub3J0aGFtZXJpY2EgZmlsZSwgdG8KLSMgdGhlIGVmZmVjdCB0aGF0IHdlIGhhdmUgaW5kaXJlY3QgZXZpZGVuY2UgdGhhdCBEU1Qgd2FzIG9ic2VydmVkIGluIDIwMDAuCi0jCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA1LTExLTAyKToKLSMgTmljYXJhZ3VhIGxlZnQgRFNUIHRoZSAyMDA1LTEwLTAyIGF0IDAwOjAwIChsb2NhbCB0aW1lKS4KLSMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvcHJlc2lkZW5jaWEvZmlsZXNfaW5kZXgvc2VjcmV0YXJpYS9jb211bmljYWRvcy8yMDA1L3NlcHRpZW1icmUvMjZzZXB0aWVtYnJlLWNhbWJpby1ob3JhLmh0bQotIyAoMjAwNS0wOS0yNikKLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDUtMDUpOgotIyBodHRwOi8vd3d3LmVsbnVldm9kaWFyaW8uY29tLm5pLzIwMDYvMDUvMDEvbmFjaW9uYWxlcy8xODQxMAotIyAobXkgaW5mb3JtYWwgdHJhbnNsYXRpb24pCi0jIEJ5IG9yZGVyIG9mIHRoZSBwcmVzaWRlbnQgb2YgdGhlIHJlcHVibGljLCBFbnJpcXVlIEJvbGFub3MsIE5pY2FyYWd1YQotIyBhZHZhbmNlZCBieSBzaXh0eSBtaW51dGVzIHRoZWlyIG9mZmljaWFsIHRpbWUsIHllc3RlcmRheSBhdCAyIGluIHRoZQotIyBtb3JuaW5nLCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5IHVudGlsIDMwLnRoLiBvZiBzZXB0ZW1iZXIuCi0jCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTA5LTMwKToKLSMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb2IubmkvYnVzY2Fkb3JfZ2FjZXRhL0JEL0RFQ1JFVE9TLzIwMDYvRC0wNjMtMjAwNlAtUFJOLUNhbWJpby1Ib3JhLnBkZgotIyBNeSBpbmZvcm1hbCB0cmFuc2xhdGlvbiBydW5zOgotIyBUaGUgbmF0dXJhbCBzdW4gdGltZSBpcyByZXN0b3JlZCBpbiBhbGwgdGhlIG5hdGlvbmFsIHRlcnJpdG9yeSwgaW4gdGhhdCB0aGUKLSMgdGltZSBpcyByZXR1cm5lZCBvbmUgaG91ciBhdCAwMTowMCBhbSBvZiBPY3RvYmVyIDEgb2YgMjAwNi4KLSMKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCU5pYwkxOTc5CTE5ODAJLQlNYXIJU3VuPj0xNgkwOjAwCTE6MDAJRAotUnVsZQlOaWMJMTk3OQkxOTgwCS0JSnVuCU1vbj49MjMJMDowMAkwCVMKLVJ1bGUJTmljCTIwMDUJb25seQktCUFwcgkxMAkwOjAwCTE6MDAJRAotUnVsZQlOaWMJMjAwNQlvbmx5CS0JT2N0CVN1bj49MQkwOjAwCTAJUwotUnVsZQlOaWMJMjAwNglvbmx5CS0JQXByCTMwCTI6MDAJMTowMAlECi1SdWxlCU5pYwkyMDA2CW9ubHkJLQlPY3QJU3VuPj0xCTE6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvTWFuYWd1YQktNTo0NTowOCAtCUxNVAkxODkwCi0JCQktNTo0NToxMiAtCU1NVAkxOTM0IEp1biAyMyAjIE1hbmFndWEgTWVhbiBUaW1lPwotCQkJLTY6MDAJLQlDU1QJMTk3MyBNYXkKLQkJCS01OjAwCS0JRVNUCTE5NzUgRmViIDE2Ci0JCQktNjowMAlOaWMJQyVzVAkxOTkyIEphbiAgMSA0OjAwCi0JCQktNTowMAktCUVTVAkxOTkyIFNlcCAyNAotCQkJLTY6MDAJLQlDU1QJMTk5MwotCQkJLTU6MDAJLQlFU1QJMTk5NwotCQkJLTY6MDAJTmljCUMlc1QKLQotIyBQYW5hbWEKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUJQW1lcmljYS9QYW5hbWEJLTU6MTg6MDggLQlMTVQJMTg5MAotCQkJLTU6MTk6MzYgLQlDTVQJMTkwOCBBcHIgMjIgICAjIENvbG9uIE1lYW4gVGltZQotCQkJLTU6MDAJLQlFU1QKLQotIyBQdWVydG8gUmljbwotIyBUaGVyZSBhcmUgdG9vIG1hbnkgU2FuIEp1YW5zIGVsc2V3aGVyZSwgc28gd2UnbGwgdXNlIGBQdWVydG9fUmljbycuCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvUHVlcnRvX1JpY28gLTQ6MjQ6MjUgLQlMTVQJMTg5OSBNYXIgMjggMTI6MDAgICAgIyBTYW4gSnVhbgotCQkJLTQ6MDAJLQlBU1QJMTk0MiBNYXkgIDMKLQkJCS00OjAwCVVTCUElc1QJMTk0NgotCQkJLTQ6MDAJLQlBU1QKLQotIyBTdCBLaXR0cy1OZXZpcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1N0X0tpdHRzCS00OjEwOjUyIC0JTE1UCTE5MTIgTWFyIDIJIyBCYXNzZXRlcnJlCi0JCQktNDowMAktCUFTVAotCi0jIFN0IEx1Y2lhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvU3RfTHVjaWEJLTQ6MDQ6MDAgLQlMTVQJMTg5MAkJIyBDYXN0cmllcwotCQkJLTQ6MDQ6MDAgLQlDTVQJMTkxMgkgICAgIyBDYXN0cmllcyBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQVNUCi0KLSMgU3QgUGllcnJlIGFuZCBNaXF1ZWxvbgotIyBUaGVyZSBhcmUgdG9vIG1hbnkgU3QgUGllcnJlcyBlbHNld2hlcmUsIHNvIHdlJ2xsIHVzZSBgTWlxdWVsb24nLgotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL01pcXVlbG9uCS0zOjQ0OjQwIC0JTE1UCTE5MTEgTWF5IDE1CSMgU3QgUGllcnJlCi0JCQktNDowMAktCUFTVAkxOTgwIE1heQotCQkJLTM6MDAJLQlQTVNUCTE5ODcgIyBQaWVycmUgJiBNaXF1ZWxvbiBUaW1lCi0JCQktMzowMAlDYW5hZGEJUE0lc1QKLQotIyBTdCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1N0X1ZpbmNlbnQJLTQ6MDQ6NTYgLQlMTVQJMTg5MAkJIyBLaW5nc3Rvd24KLQkJCS00OjA0OjU2IC0JS01UCTE5MTIJICAgIyBLaW5nc3Rvd24gTWVhbiBUaW1lCi0JCQktNDowMAktCUFTVAotCi0jIFR1cmtzIGFuZCBDYWljb3MKLSMKLSMgRnJvbSBDaHJpcyBEdW5uIGluCi0jIDxodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDE1MDA3PgotIyAoMjAwNy0wMy0xNSk6IEluIHRoZSBUdXJrcyAmIENhaWNvcyBJc2xhbmRzIChBbWVyaWNhL0dyYW5kX1R1cmspIHRoZQotIyBkYXlsaWdodCBzYXZpbmcgZGF0ZXMgZm9yIHRpbWUgY2hhbmdlcyBoYXZlIGJlZW4gYWRqdXN0ZWQgdG8gbWF0Y2gKLSMgdGhlIHJlY2VudCBVLlMuIGNoYW5nZSBvZiBkYXRlcy4KLSMKLSMgRnJvbSBCcmlhbiBJbmdsaXMgKDIwMDctMDQtMjgpOgotIyBodHRwOi8vd3d3LnR1cmtzYW5kY2FpY29zLnRjL2NhbGVuZGFyL2luZGV4Lmh0bSBbMjAwNy0wNC0yNl0KLSMgdGhlcmUgaXMgYW4gZW50cnkgZm9yIE5vdiA0ICJEYXlsaWdodCBTYXZpbmdzIFRpbWUgRW5kcyAyMDA3IiBhbmQgdGhyZWUKLSMgcm93cyBiZWZvcmUgdGhhdCB0aGVyZSBpcyBhbiBvdXQgb2YgZGF0ZSBlbnRyeSBmb3IgT2N0OgotIyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lcyBCZWdpbnMgMjAwNwotIyBDbG9ja3MgYXJlIHNldCBiYWNrIG9uZSBob3VyIGF0IDI6MDAgYS5tLiBsb2NhbCBEYXlsaWdodCBTYXZpbmcgVGltZSIKLSMgaW5kaWNhdGluZyB0aGF0IHRoZSBub3JtYWwgRVQgcnVsZXMgYXJlIGZvbGxvd2VkLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTA1LTAxKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGV5IHVzZSBVUyBEU1QgcnVsZXMsIGJ1dCBJQVRBIFNTSU0gKDE5OTEvMTk5OCkKLSMgc2F5cyB0aGV5IHN3aXRjaCBhdCBtaWRuaWdodC4gIEdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotIwotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJVEMJMTk3OQkxOTg2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKLVJ1bGUJVEMJMTk3OQkyMDA2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJVEMJMTk4NwkyMDA2CS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAotUnVsZQlUQwkyMDA3CW1heAktCU1hcglTdW4+PTgJMjowMAkxOjAwCUQKLVJ1bGUJVEMJMjAwNwltYXgJLQlOb3YJU3VuPj0xCTI6MDAJMAlTCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvR3JhbmRfVHVyawktNDo0NDozMiAtCUxNVAkxODkwCi0JCQktNTowNzoxMiAtCUtNVAkxOTEyIEZlYiAgICAjIEtpbmdzdG9uIE1lYW4gVGltZQotCQkJLTU6MDAJVEMJRSVzVAotCi0jIEJyaXRpc2ggVmlyZ2luIElzCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEFtZXJpY2EvVG9ydG9sYQktNDoxODoyOCAtCUxNVAkxOTExIEp1bCAgICAjIFJvYWQgVG93bgotCQkJLTQ6MDAJLQlBU1QKLQotIyBWaXJnaW4gSXMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9TdF9UaG9tYXMJLTQ6MTk6NDQgLQlMTVQJMTkxMSBKdWwgICAgIyBDaGFybG90dGUgQW1hbGllCi0JCQktNDowMAktCUFTVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvcGFjaWZpY25ldyBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3BhY2lmaWNuZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTEyYzEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvcGFjaWZpY25ldworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKXBhY2lmaWNuZXcJOC4yCi0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIEZyb20gQXJ0aHVyIERhdmlkIE9sc29uICgxOTg5LTA0LTA1KToKLSMgT24gMTk4OS0wNC0wNSwgdGhlIFUuIFMuIEhvdXNlIG9mIFJlcHJlc2VudGF0aXZlcyBwYXNzZWQgKDIzOC0xNTQpIGEgYmlsbAotIyBlc3RhYmxpc2hpbmcgIlBhY2lmaWMgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFRpbWUiOyBpdCB3YXMgbm90IGFjdGVkIG9uCi0jIGJ5IHRoZSBTZW5hdGUgb3Igc2lnbmVkIGludG8gbGF3IGJ5IHRoZSBQcmVzaWRlbnQuCi0jIFlvdSBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGUgIlBFIiAoUHJlc2lkZW50aWFsIEVsZWN0aW9uKSBiZWxvdyB0bwotIyAiUSIgKFF1YWRyZW5uaWFsKSB0byBtYWludGFpbiB0aHJlZS1jaGFyYWN0ZXIgem9uZSBhYmJyZXZpYXRpb25zLgotIyBJZiB5b3UncmUgcmVhbGx5IGNvbnNlcnZhdGl2ZSwgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIGl0IHRvICJEIi4KLSMgQXZvaWQgIkwiIChMZWFwIFllYXIpLCB3aGljaCB3b24ndCBiZSB0cnVlIGluIDIxMDAuCi0KLSMgSWYgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFRpbWUgaXMgZXZlciBlc3RhYmxpc2hlZCwgcmVwbGFjZSAiWFhYWCIgYmVsb3cKLSMgd2l0aCB0aGUgeWVhciB0aGUgbGF3IHRha2VzIGVmZmVjdCBhbmQgdW5jb21tZW50IHRoZSAiIyMiIGxpbmVzLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyMgUnVsZQlUd2lsaXRlCVhYWFgJbWF4CS0JQXByCVN1bj49MQkyOjAwCTE6MDAJRAotIyMgUnVsZQlUd2lsaXRlCVhYWFgJbWF4CXVzcHJlcwlPY3QJbGFzdFN1bgkyOjAwCTE6MDAJUEUKLSMjIFJ1bGUJVHdpbGl0ZQlYWFhYCW1heAl1c3ByZXMJTm92CVN1bj49NwkyOjAwCTAJUwotIyMgUnVsZQlUd2lsaXRlCVhYWFgJbWF4CW5vbnByZXMJT2N0CWxhc3RTdW4JMjowMAkwCVMKLQotIyBab25lCU5BTUUJCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQotIyMgWm9uZQlBbWVyaWNhL0xvc19BbmdlbGVzLVBFVAktODowMAlVUwkJUCVzVAlYWFhYCi0jIwkJCQktODowMAlUd2lsaXRlCQlQJXNUCi0KLSMgRm9yIG5vdy4uLgotTGluawlBbWVyaWNhL0xvc19BbmdlbGVzCVVTL1BhY2lmaWMtTmV3CSMjCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway9zb2xhcjg3IGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvc29sYXI4NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlZTdlNy4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway9zb2xhcjg3CisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKXNvbGFyODcJOC4yCi0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIFNvIG11Y2ggZm9yIGZvb3Rub3RlcyBhYm91dCBTYXVkaSBBcmFiaWEuCi0jIEFwcGFyZW50IG5vb24gdGltZXMgYmVsb3cgYXJlIGZvciBSaXlhZGg7IHlvdXIgbWlsZWFnZSB3aWxsIHZhcnkuCi0jIFRpbWVzIHdlcmUgY29tcHV0ZWQgdXNpbmcgZm9ybXVsYXMgaW4gdGhlIFUuUy4gTmF2YWwgT2JzZXJ2YXRvcnkncwotIyBBbG1hbmFjIGZvciBDb21wdXRlcnMgMTk4NzsgdGhlIGZvcm11bGFzICJ3aWxsIGdpdmUgRXFUIHRvIGFuIGFjY3VyYWN5IG9mCi0jIFtwbHVzIG9yIG1pbnVzIHR3b10gc2Vjb25kcyBkdXJpbmcgdGhlIGN1cnJlbnQgeWVhci4iCi0jCi0jIFJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGZpdmUgc2Vjb25kcyByZXN1bHRzIGluIGZld2VyIHRoYW4KLSMgMjU2IGRpZmZlcmVudCAidGltZSB0eXBlcyItLWEgbGltaXQgdGhhdCdzIGZhY2VkIGJlY2F1c2UgdGltZSB0eXBlcyBhcmUKLSMgc3RvcmVkIG9uIGRpc2sgYXMgdW5zaWduZWQgY2hhcnMuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxCTEyOjAzOjIwcyAtMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyCTEyOjAzOjUwcyAtMDowMzo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkzCTEyOjA0OjE1cyAtMDowNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk0CTEyOjA0OjQ1cyAtMDowNDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk1CTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk2CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk3CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk4CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgk5CTEyOjA2OjU1cyAtMDowNjo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxMAkxMjowNzoyMHMgLTA6MDc6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTEJMTI6MDc6NDVzIC0wOjA3OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTEyCTEyOjA4OjEwcyAtMDowODoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxMwkxMjowODozMHMgLTA6MDg6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTQJMTI6MDg6NTVzIC0wOjA4OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE1CTEyOjA5OjE1cyAtMDowOToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxNgkxMjowOTozNXMgLTA6MDk6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMTcJMTI6MDk6NTVzIC0wOjA5OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTE4CTEyOjEwOjE1cyAtMDoxMDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkxOQkxMjoxMDozNXMgLTA6MTA6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjAJMTI6MTA6NTVzIC0wOjEwOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTIxCTEyOjExOjEwcyAtMDoxMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyMgkxMjoxMTozMHMgLTA6MTE6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjMJMTI6MTE6NDVzIC0wOjExOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI0CTEyOjEyOjAwcyAtMDoxMjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyNQkxMjoxMjoxNXMgLTA6MTI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjYJMTI6MTI6MzBzIC0wOjEyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTI3CTEyOjEyOjQwcyAtMDoxMjo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkyOAkxMjoxMjo1NXMgLTA6MTI6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKYW4JMjkJMTI6MTM6MDVzIC0wOjEzOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSmFuCTMwCTEyOjEzOjE1cyAtMDoxMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUphbgkzMQkxMjoxMzoyNXMgLTA6MTM6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMQkxMjoxMzozNXMgLTA6MTM6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMgkxMjoxMzo0MHMgLTA6MTM6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMwkxMjoxMzo1MHMgLTA6MTM6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNAkxMjoxMzo1NXMgLTA6MTM6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNQkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNgkxMjoxNDowNXMgLTA6MTQ6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJNwkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJOAkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJOQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTAJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTExCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxMgkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTMJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE0CTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxNQkxMjoxNDoxMHMgLTA6MTQ6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTYJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTE3CTEyOjE0OjA1cyAtMDoxNDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkxOAkxMjoxNDowMHMgLTA6MTQ6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMTkJMTI6MTM6NTVzIC0wOjEzOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIwCTEyOjEzOjUwcyAtMDoxMzo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyMQkxMjoxMzo0NXMgLTA6MTM6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjIJMTI6MTM6MzVzIC0wOjEzOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTIzCTEyOjEzOjMwcyAtMDoxMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyNAkxMjoxMzoyMHMgLTA6MTM6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjUJMTI6MTM6MTBzIC0wOjEzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRmViCTI2CTEyOjEzOjAwcyAtMDoxMzowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUZlYgkyNwkxMjoxMjo1MHMgLTA6MTI6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlGZWIJMjgJMTI6MTI6NDBzIC0wOjEyOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEJMTI6MTI6MzBzIC0wOjEyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTIJMTI6MTI6MjBzIC0wOjEyOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTMJMTI6MTI6MDVzIC0wOjEyOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTQJMTI6MTE6NTVzIC0wOjExOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTUJMTI6MTE6NDBzIC0wOjExOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTYJMTI6MTE6MjVzIC0wOjExOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTcJMTI6MTE6MTVzIC0wOjExOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTgJMTI6MTE6MDBzIC0wOjExOjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTkJMTI6MTA6NDVzIC0wOjEwOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEwCTEyOjEwOjMwcyAtMDoxMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxMQkxMjoxMDoxNXMgLTA6MTA6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTIJMTI6MDk6NTVzIC0wOjA5OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTEzCTEyOjA5OjQwcyAtMDowOTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxNAkxMjowOToyNXMgLTA6MDk6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTUJMTI6MDk6MTBzIC0wOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE2CTEyOjA4OjUwcyAtMDowODo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkxNwkxMjowODozNXMgLTA6MDg6MzUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMTgJMTI6MDg6MTVzIC0wOjA4OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTE5CTEyOjA4OjAwcyAtMDowODowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyMAkxMjowNzo0MHMgLTA6MDc6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjEJMTI6MDc6MjVzIC0wOjA3OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTIyCTEyOjA3OjA1cyAtMDowNzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyMwkxMjowNjo1MHMgLTA6MDY6NTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjQJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI1CTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyNgkxMjowNTo1NXMgLTA6MDU6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMjcJMTI6MDU6MzVzIC0wOjA1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTI4CTEyOjA1OjE1cyAtMDowNToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1hcgkyOQkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXIJMzAJMTI6MDQ6NDBzIC0wOjA0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWFyCTMxCTEyOjA0OjI1cyAtMDowNDoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxCTEyOjA0OjA1cyAtMDowNDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyCTEyOjAzOjQ1cyAtMDowMzo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkzCTEyOjAzOjMwcyAtMDowMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk0CTEyOjAzOjEwcyAtMDowMzoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk1CTEyOjAyOjU1cyAtMDowMjo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk2CTEyOjAyOjM1cyAtMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk3CTEyOjAyOjIwcyAtMDowMjoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk4CTEyOjAyOjA1cyAtMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgk5CTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxMAkxMjowMTozMHMgLTA6MDE6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTEJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTEyCTEyOjAwOjU1cyAtMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxMwkxMjowMDo0MHMgLTA6MDA6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBcHIJMTQJMTI6MDA6MjVzIC0wOjAwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXByCTE1CTEyOjAwOjEwcyAtMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxNgkxMTo1OTo1NXMgMDowMDowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxNwkxMTo1OTo0NXMgMDowMDoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxOAkxMTo1OTozMHMgMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkxOQkxMTo1OToxNXMgMDowMDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMAkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMQkxMTo1ODo1MHMgMDowMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMgkxMTo1ODo0MHMgMDowMToyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyMwkxMTo1ODoyNXMgMDowMTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNAkxMTo1ODoxNXMgMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNQkxMTo1ODowNXMgMDowMTo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNgkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyNwkxMTo1Nzo0NXMgMDowMjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyOAkxMTo1NzozNXMgMDowMjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkyOQkxMTo1NzoyNXMgMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUFwcgkzMAkxMTo1NzoxNXMgMDowMjo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxCTExOjU3OjEwcyAwOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTIJMTE6NTc6MDBzIDA6MDM6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJMwkxMTo1Njo1NXMgMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk0CTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTUJMTE6NTY6NDVzIDA6MDM6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJNgkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQk3CTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTWF5CTgJMTE6NTY6MzBzIDA6MDM6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlNYXkJOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMAkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxMwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNQkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNgkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxNwkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxOAkxMTo1NjoyMHMgMDowMzo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkxOQkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMAkxMTo1NjoyNXMgMDowMzozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMQkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMgkxMTo1NjozNXMgMDowMzoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyMwkxMTo1Njo0MHMgMDowMzoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNAkxMTo1Njo0NXMgMDowMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNQkxMTo1Njo1MHMgMDowMzoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNgkxMTo1Njo1NXMgMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyNwkxMTo1NzowMHMgMDowMzowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyOAkxMTo1NzoxMHMgMDowMjo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkyOQkxMTo1NzoxNXMgMDowMjo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkzMAkxMTo1NzoyNXMgMDowMjozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU1heQkzMQkxMTo1NzozMHMgMDowMjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxCTExOjU3OjQwcyAwOjAyOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTIJMTE6NTc6NTBzIDA6MDI6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMwkxMTo1ODowMHMgMDowMjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk0CTExOjU4OjEwcyAwOjAxOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTUJMTE6NTg6MjBzIDA6MDE6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JNgkxMTo1ODozMHMgMDowMTozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgk3CTExOjU4OjQwcyAwOjAxOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTgJMTE6NTg6NTBzIDA6MDE6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JOQkxMTo1OTowNXMgMDowMDo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMAkxMTo1OToxNXMgMDowMDo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMQkxMTo1OTozMHMgMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMgkxMTo1OTo0MHMgMDowMDoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxMwkxMTo1OTo1MHMgMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxNAkxMjowMDowNXMgLTA6MDA6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTUJMTI6MDA6MTVzIC0wOjAwOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE2CTEyOjAwOjMwcyAtMDowMDozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkxNwkxMjowMDo0NXMgLTA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMTgJMTI6MDA6NTVzIC0wOjAwOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTE5CTEyOjAxOjEwcyAtMDowMToxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyMAkxMjowMToyMHMgLTA6MDE6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjEJMTI6MDE6MzVzIC0wOjAxOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTIyCTEyOjAxOjUwcyAtMDowMTo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyMwkxMjowMjowMHMgLTA6MDI6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjQJMTI6MDI6MTVzIC0wOjAyOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI1CTEyOjAyOjI1cyAtMDowMjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyNgkxMjowMjo0MHMgLTA6MDI6NDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMjcJMTI6MDI6NTBzIC0wOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVuCTI4CTEyOjAzOjA1cyAtMDowMzowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bgkyOQkxMjowMzoxNXMgLTA6MDM6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdW4JMzAJMTI6MDM6MzBzIC0wOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEJMTI6MDM6NDBzIC0wOjAzOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTIJMTI6MDM6NTBzIC0wOjAzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTMJMTI6MDQ6MDVzIC0wOjA0OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTQJMTI6MDQ6MTVzIC0wOjA0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTUJMTI6MDQ6MjVzIC0wOjA0OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTYJMTI6MDQ6MzVzIC0wOjA0OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTcJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTgJMTI6MDQ6NTVzIC0wOjA0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTkJMTI6MDU6MDVzIC0wOjA1OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEwCTEyOjA1OjE1cyAtMDowNToxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxMQkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTIJMTI6MDU6MzBzIC0wOjA1OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTEzCTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxNAkxMjowNTo0NXMgLTA6MDU6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTUJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE2CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkxNwkxMjowNjowNXMgLTA6MDY6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMTgJMTI6MDY6MTBzIC0wOjA2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTE5CTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyMAkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjEJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTIyCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyMwkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjQJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI1CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyNgkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMjcJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTI4CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUp1bAkyOQkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlKdWwJMzAJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JSnVsCTMxCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxCTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyCTEyOjA2OjE1cyAtMDowNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkzCTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk0CTEyOjA2OjA1cyAtMDowNjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk1CTEyOjA2OjAwcyAtMDowNjowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk2CTEyOjA1OjU1cyAtMDowNTo1NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk3CTEyOjA1OjUwcyAtMDowNTo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk4CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1Zwk5CTEyOjA1OjM1cyAtMDowNTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxMAkxMjowNToyNXMgLTA6MDU6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTEJMTI6MDU6MTVzIC0wOjA1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTEyCTEyOjA1OjA1cyAtMDowNTowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxMwkxMjowNDo1NXMgLTA6MDQ6NTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTQJMTI6MDQ6NDVzIC0wOjA0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE1CTEyOjA0OjM1cyAtMDowNDozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxNgkxMjowNDoyNXMgLTA6MDQ6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMTcJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTE4CTEyOjA0OjAwcyAtMDowNDowMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkxOQkxMjowMzo0NXMgLTA6MDM6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjAJMTI6MDM6MzBzIC0wOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTIxCTEyOjAzOjE1cyAtMDowMzoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyMgkxMjowMzowMHMgLTA6MDM6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjMJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI0CTEyOjAyOjMwcyAtMDowMjozMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyNQkxMjowMjoxNXMgLTA6MDI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjYJMTI6MDI6MDBzIC0wOjAyOjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTI3CTEyOjAxOjQwcyAtMDowMTo0MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkyOAkxMjowMToyNXMgLTA6MDE6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlBdWcJMjkJMTI6MDE6MDVzIC0wOjAxOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JQXVnCTMwCTEyOjAwOjUwcyAtMDowMDo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCUF1ZwkzMQkxMjowMDozMHMgLTA6MDA6MzAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJMQkxMjowMDoxMHMgLTA6MDA6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJMgkxMTo1OTo1MHMgMDowMDoxMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAkzCTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTQJMTE6NTk6MTVzIDA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJNQkxMTo1ODo1NXMgMDowMTowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk2CTExOjU4OjM1cyAwOjAxOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTcJMTE6NTg6MTVzIDA6MDE6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlTZXAJOAkxMTo1Nzo1NXMgMDowMjowNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCVNlcAk5CTExOjU3OjMwcyAwOjAyOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEwCTExOjU3OjEwcyAwOjAyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTExCTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEyCTExOjU2OjMwcyAwOjAzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTEzCTExOjU2OjEwcyAwOjAzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE0CTExOjU1OjQ1cyAwOjA0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE1CTExOjU1OjI1cyAwOjA0OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE2CTExOjU1OjA1cyAwOjA0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE3CTExOjU0OjQ1cyAwOjA1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE4CTExOjU0OjIwcyAwOjA1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTE5CTExOjU0OjAwcyAwOjA2OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIwCTExOjUzOjQwcyAwOjA2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIxCTExOjUzOjE1cyAwOjA2OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIyCTExOjUyOjU1cyAwOjA3OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTIzCTExOjUyOjM1cyAwOjA3OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI0CTExOjUyOjE1cyAwOjA3OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI1CTExOjUxOjU1cyAwOjA4OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI2CTExOjUxOjM1cyAwOjA4OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI3CTExOjUxOjEwcyAwOjA4OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI4CTExOjUwOjUwcyAwOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTI5CTExOjUwOjMwcyAwOjA5OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JU2VwCTMwCTExOjUwOjEwcyAwOjA5OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEJMTE6NDk6NTBzIDA6MTA6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJMgkxMTo0OTozNXMgMDoxMDoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAkzCTExOjQ5OjE1cyAwOjEwOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTQJMTE6NDg6NTVzIDA6MTE6MDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJNQkxMTo0ODozNXMgMDoxMToyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk2CTExOjQ4OjIwcyAwOjExOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTcJMTE6NDg6MDBzIDA6MTI6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlPY3QJOAkxMTo0Nzo0NXMgMDoxMjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU9jdAk5CTExOjQ3OjI1cyAwOjEyOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEwCTExOjQ3OjEwcyAwOjEyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTExCTExOjQ2OjU1cyAwOjEzOjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEyCTExOjQ2OjQwcyAwOjEzOjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTEzCTExOjQ2OjI1cyAwOjEzOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE0CTExOjQ2OjEwcyAwOjEzOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE1CTExOjQ1OjU1cyAwOjE0OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE2CTExOjQ1OjQ1cyAwOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE3CTExOjQ1OjMwcyAwOjE0OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE4CTExOjQ1OjIwcyAwOjE0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTE5CTExOjQ1OjA1cyAwOjE0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIwCTExOjQ0OjU1cyAwOjE1OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIxCTExOjQ0OjQ1cyAwOjE1OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIyCTExOjQ0OjM1cyAwOjE1OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTIzCTExOjQ0OjI1cyAwOjE1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI0CTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI1CTExOjQ0OjEwcyAwOjE1OjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI2CTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI3CTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI4CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTI5CTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTMwCTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JT2N0CTMxCTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJMgkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgkzCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTQJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJNQkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk2CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTcJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlOb3YJOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCU5vdgk5CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEwCTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTExCTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEyCTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTEzCTExOjQ0OjE1cyAwOjE1OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE0CTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE1CTExOjQ0OjMwcyAwOjE1OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE2CTExOjQ0OjQwcyAwOjE1OjIwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE3CTExOjQ0OjUwcyAwOjE1OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE4CTExOjQ1OjA1cyAwOjE0OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTE5CTExOjQ1OjE1cyAwOjE0OjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIwCTExOjQ1OjMwcyAwOjE0OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIxCTExOjQ1OjQ1cyAwOjE0OjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIyCTExOjQ2OjAwcyAwOjE0OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTIzCTExOjQ2OjE1cyAwOjEzOjQ1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI0CTExOjQ2OjMwcyAwOjEzOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI1CTExOjQ2OjUwcyAwOjEzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI2CTExOjQ3OjEwcyAwOjEyOjUwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI3CTExOjQ3OjI1cyAwOjEyOjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI4CTExOjQ3OjQ1cyAwOjEyOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTI5CTExOjQ4OjA1cyAwOjExOjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JTm92CTMwCTExOjQ4OjMwcyAwOjExOjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEJMTE6NDg6NTBzIDA6MTE6MTAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMgkxMTo0OToxMHMgMDoxMDo1MCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkzCTExOjQ5OjM1cyAwOjEwOjI1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTQJMTE6NTA6MDBzIDA6MTA6MDAgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJNQkxMTo1MDoyNXMgMDowOTozNSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk2CTExOjUwOjUwcyAwOjA5OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTcJMTE6NTE6MTVzIDA6MDg6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJOAkxMTo1MTo0MHMgMDowODoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwk5CTExOjUyOjA1cyAwOjA3OjU1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEwCTExOjUyOjMwcyAwOjA3OjMwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTExCTExOjUzOjAwcyAwOjA3OjAwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEyCTExOjUzOjI1cyAwOjA2OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTEzCTExOjUzOjU1cyAwOjA2OjA1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE0CTExOjU0OjI1cyAwOjA1OjM1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE1CTExOjU0OjUwcyAwOjA1OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE2CTExOjU1OjIwcyAwOjA0OjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE3CTExOjU1OjUwcyAwOjA0OjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE4CTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTE5CTExOjU2OjUwcyAwOjAzOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIwCTExOjU3OjIwcyAwOjAyOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIxCTExOjU3OjUwcyAwOjAyOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIyCTExOjU4OjIwcyAwOjAxOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTIzCTExOjU4OjUwcyAwOjAxOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI0CTExOjU5OjIwcyAwOjAwOjQwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI1CTExOjU5OjUwcyAwOjAwOjEwIC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI2CTEyOjAwOjIwcyAtMDowMDoyMCAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkyNwkxMjowMDo0NXMgLTA6MDA6NDUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMjgJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODcJMTk4Nwlvbmx5CS0JRGVjCTI5CTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg3CTE5ODcJb25seQktCURlYwkzMAkxMjowMjoxNXMgLTA6MDI6MTUgLQotUnVsZQlzb2w4NwkxOTg3CW9ubHkJLQlEZWMJMzEJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLQotIyBSaXlhZGggaXMgYXQgYWJvdXQgNDYgZGVncmVlcyA0NiBtaW51dGVzIEVhc3Q6ICAzIGhycywgNyBtaW5zLCA0IHNlY3MKLSMgQmVmb3JlIGFuZCBhZnRlciAxOTg3LCB3ZSdsbCBvcGVyYXRlIG9uIGxvY2FsIG1lYW4gc29sYXIgdGltZS4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUy9TQVZFCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvUml5YWRoODcJMzowNzowNAktCQl6enoJMTk4NwotCQkJMzowNzowNAlzb2w4NwkJenp6CTE5ODgKLQkJCTM6MDc6MDQJLQkJenp6Ci0jIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Li4uCi1MaW5rCUFzaWEvUml5YWRoODcJTWlkZWFzdC9SaXlhZGg4NwpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvc29sYXI4OCBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3NvbGFyODgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjU5MGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvc29sYXI4OAorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0jIDxwcmU+Ci0jIEAoIylzb2xhcjg4CTguMgotIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgotIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KLQotIyBBcHBhcmVudCBub29uIHRpbWVzIGJlbG93IGFyZSBmb3IgUml5YWRoOyB0aGV5J3JlIGEgYml0IG9mZiBmb3Igb3RoZXIgcGxhY2VzLgotIyBUaW1lcyB3ZXJlIGNvbXB1dGVkIHVzaW5nIGZvcm11bGFzIGluIHRoZSBVLlMuIE5hdmFsIE9ic2VydmF0b3J5J3MKLSMgQWxtYW5hYyBmb3IgQ29tcHV0ZXJzIDE5ODg7IHRoZSBmb3JtdWxhcyAid2lsbCBnaXZlIEVxVCB0byBhbiBhY2N1cmFjeSBvZgotIyBbcGx1cyBvciBtaW51cyB0d29dIHNlY29uZHMgZHVyaW5nIHRoZSBjdXJyZW50IHllYXIuIgotIwotIyBSb3VuZGluZyB0byB0aGUgbmVhcmVzdCBmaXZlIHNlY29uZHMgcmVzdWx0cyBpbiBmZXdlciB0aGFuCi0jIDI1NiBkaWZmZXJlbnQgInRpbWUgdHlwZXMiLS1hIGxpbWl0IHRoYXQncyBmYWNlZCBiZWNhdXNlIHRpbWUgdHlwZXMgYXJlCi0jIHN0b3JlZCBvbiBkaXNrIGFzIHVuc2lnbmVkIGNoYXJzLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMQkxMjowMzoxNXMgLTA6MDM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMgkxMjowMzo0MHMgLTA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMwkxMjowNDoxMHMgLTA6MDQ6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNAkxMjowNDo0MHMgLTA6MDQ6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNQkxMjowNTowNXMgLTA6MDU6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNgkxMjowNTozMHMgLTA6MDU6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JNwkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JOAkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JOQkxMjowNjo1MHMgLTA6MDY6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTAJMTI6MDc6MTVzIC0wOjA3OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTExCTEyOjA3OjQwcyAtMDowNzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxMgkxMjowODowNXMgLTA6MDg6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTMJMTI6MDg6MjVzIC0wOjA4OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE0CTEyOjA4OjUwcyAtMDowODo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxNQkxMjowOToxMHMgLTA6MDk6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTYJMTI6MDk6MzBzIC0wOjA5OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTE3CTEyOjA5OjUwcyAtMDowOTo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkxOAkxMjoxMDoxMHMgLTA6MTA6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMTkJMTI6MTA6MzBzIC0wOjEwOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTIwCTEyOjEwOjUwcyAtMDoxMDo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyMQkxMjoxMTowNXMgLTA6MTE6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjIJMTI6MTE6MjVzIC0wOjExOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTIzCTEyOjExOjQwcyAtMDoxMTo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyNAkxMjoxMTo1NXMgLTA6MTE6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjUJMTI6MTI6MTBzIC0wOjEyOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI2CTEyOjEyOjI1cyAtMDoxMjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkyNwkxMjoxMjo0MHMgLTA6MTI6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMjgJMTI6MTI6NTBzIC0wOjEyOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSmFuCTI5CTEyOjEzOjAwcyAtMDoxMzowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUphbgkzMAkxMjoxMzoxMHMgLTA6MTM6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKYW4JMzEJMTI6MTM6MjBzIC0wOjEzOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEJMTI6MTM6MzBzIC0wOjEzOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIJMTI6MTM6NDBzIC0wOjEzOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTMJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTQJMTI6MTM6NTVzIC0wOjEzOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTUJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTYJMTI6MTQ6MDVzIC0wOjE0OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTcJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTgJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTkJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEwCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxMQkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTIJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTEzCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxNAkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTUJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE2CTEyOjE0OjEwcyAtMDoxNDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkxNwkxMjoxNDowNXMgLTA6MTQ6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMTgJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTE5CTEyOjEzOjU1cyAtMDoxMzo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyMAkxMjoxMzo1MHMgLTA6MTM6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjEJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTIyCTEyOjEzOjQwcyAtMDoxMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyMwkxMjoxMzozMHMgLTA6MTM6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjQJMTI6MTM6MjBzIC0wOjEzOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI1CTEyOjEzOjE1cyAtMDoxMzoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyNgkxMjoxMzowNXMgLTA6MTM6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlGZWIJMjcJMTI6MTI6NTVzIC0wOjEyOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRmViCTI4CTEyOjEyOjQ1cyAtMDoxMjo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUZlYgkyOQkxMjoxMjozMHMgLTA6MTI6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMQkxMjoxMjoyMHMgLTA6MTI6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMgkxMjoxMjoxMHMgLTA6MTI6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMwkxMjoxMTo1NXMgLTA6MTE6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNAkxMjoxMTo0NXMgLTA6MTE6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNQkxMjoxMTozMHMgLTA6MTE6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNgkxMjoxMToxNXMgLTA6MTE6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJNwkxMjoxMTowMHMgLTA6MTE6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJOAkxMjoxMDo0NXMgLTA6MTA6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJOQkxMjoxMDozMHMgLTA6MTA6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTAJMTI6MTA6MTVzIC0wOjEwOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTExCTEyOjEwOjAwcyAtMDoxMDowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxMgkxMjowOTo0NXMgLTA6MDk6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTMJMTI6MDk6MzBzIC0wOjA5OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE0CTEyOjA5OjEwcyAtMDowOToxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxNQkxMjowODo1NXMgLTA6MDg6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTYJMTI6MDg6NDBzIC0wOjA4OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTE3CTEyOjA4OjIwcyAtMDowODoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkxOAkxMjowODowNXMgLTA6MDg6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMTkJMTI6MDc6NDVzIC0wOjA3OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTIwCTEyOjA3OjMwcyAtMDowNzozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyMQkxMjowNzoxMHMgLTA6MDc6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjIJMTI6MDY6NTBzIC0wOjA2OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTIzCTEyOjA2OjM1cyAtMDowNjozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyNAkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjUJMTI6MDY6MDBzIC0wOjA2OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI2CTEyOjA1OjQwcyAtMDowNTo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkyNwkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMjgJMTI6MDU6MDVzIC0wOjA1OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWFyCTI5CTEyOjA0OjQ1cyAtMDowNDo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1hcgkzMAkxMjowNDoyNXMgLTA6MDQ6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXIJMzEJMTI6MDQ6MTBzIC0wOjA0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEJMTI6MDM6NTBzIC0wOjAzOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTIJMTI6MDM6MzVzIC0wOjAzOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTMJMTI6MDM6MTVzIC0wOjAzOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTQJMTI6MDM6MDBzIC0wOjAzOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTUJMTI6MDI6NDBzIC0wOjAyOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTYJMTI6MDI6MjVzIC0wOjAyOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTcJMTI6MDI6MDVzIC0wOjAyOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTgJMTI6MDE6NTBzIC0wOjAxOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTkJMTI6MDE6MzVzIC0wOjAxOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEwCTEyOjAxOjE1cyAtMDowMToxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxMQkxMjowMTowMHMgLTA6MDE6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTIJMTI6MDA6NDVzIC0wOjAwOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXByCTEzCTEyOjAwOjMwcyAtMDowMDozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUFwcgkxNAkxMjowMDoxNXMgLTA6MDA6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTUJMTI6MDA6MDBzIDA6MDA6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTYJMTE6NTk6NDVzIDA6MDA6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTcJMTE6NTk6MzBzIDA6MDA6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTgJMTE6NTk6MjBzIDA6MDA6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMTkJMTE6NTk6MDVzIDA6MDA6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjAJMTE6NTg6NTVzIDA6MDE6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjEJMTE6NTg6NDBzIDA6MDE6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjIJMTE6NTg6MzBzIDA6MDE6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjMJMTE6NTg6MTVzIDA6MDE6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjQJMTE6NTg6MDVzIDA6MDE6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjUJMTE6NTc6NTVzIDA6MDI6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjYJMTE6NTc6NDVzIDA6MDI6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjcJMTE6NTc6MzVzIDA6MDI6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjgJMTE6NTc6MzBzIDA6MDI6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBcHIJMzAJMTE6NTc6MTBzIDA6MDI6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMQkxMTo1NzowNXMgMDowMjo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQkyCTExOjU2OjU1cyAwOjAzOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTMJMTE6NTY6NTBzIDA6MDM6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJNAkxMTo1Njo0NXMgMDowMzoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk1CTExOjU2OjQwcyAwOjAzOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTYJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJNwkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU1heQk4CTExOjU2OjI1cyAwOjAzOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTWF5CTkJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTAJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTEJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTIJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTMJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTQJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTUJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTYJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTcJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTgJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMTkJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjAJMTE6NTY6MzBzIDA6MDM6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjEJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjIJMTE6NTY6NDBzIDA6MDM6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjMJMTE6NTY6NDVzIDA6MDM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjQJMTE6NTY6NTBzIDA6MDM6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjUJMTE6NTY6NTVzIDA6MDM6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjYJMTE6NTc6MDBzIDA6MDM6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjcJMTE6NTc6MDVzIDA6MDI6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjgJMTE6NTc6MTVzIDA6MDI6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMzAJMTE6NTc6MzBzIDA6MDI6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlNYXkJMzEJMTE6NTc6NDBzIDA6MDI6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMQkxMTo1Nzo1MHMgMDowMjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyCTExOjU3OjU1cyAwOjAyOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTMJMTE6NTg6MDVzIDA6MDE6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JNAkxMTo1ODoxNXMgMDowMTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk1CTExOjU4OjMwcyAwOjAxOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTYJMTE6NTg6NDBzIDA6MDE6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JNwkxMTo1ODo1MHMgMDowMToxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgk4CTExOjU5OjAwcyAwOjAxOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTkJMTE6NTk6MTVzIDA6MDA6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTAJMTE6NTk6MjVzIDA6MDA6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTEJMTE6NTk6MzVzIDA6MDA6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTIJMTE6NTk6NTBzIDA6MDA6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTMJMTI6MDA6MDBzIDA6MDA6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTQJMTI6MDA6MTVzIC0wOjAwOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE1CTEyOjAwOjI1cyAtMDowMDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxNgkxMjowMDo0MHMgLTA6MDA6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMTcJMTI6MDA6NTVzIC0wOjAwOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTE4CTEyOjAxOjA1cyAtMDowMTowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkxOQkxMjowMToyMHMgLTA6MDE6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjAJMTI6MDE6MzBzIC0wOjAxOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTIxCTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyMgkxMjowMjowMHMgLTA6MDI6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjMJMTI6MDI6MTBzIC0wOjAyOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI0CTEyOjAyOjI1cyAtMDowMjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyNQkxMjowMjozNXMgLTA6MDI6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjYJMTI6MDI6NTBzIC0wOjAyOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTI3CTEyOjAzOjAwcyAtMDowMzowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bgkyOAkxMjowMzoxNXMgLTA6MDM6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdW4JMjkJMTI6MDM6MjVzIC0wOjAzOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVuCTMwCTEyOjAzOjQwcyAtMDowMzo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxCTEyOjAzOjUwcyAtMDowMzo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyCTEyOjA0OjAwcyAtMDowNDowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkzCTEyOjA0OjEwcyAtMDowNDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk0CTEyOjA0OjI1cyAtMDowNDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk1CTEyOjA0OjM1cyAtMDowNDozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk2CTEyOjA0OjQ1cyAtMDowNDo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk3CTEyOjA0OjU1cyAtMDowNDo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk4CTEyOjA1OjA1cyAtMDowNTowNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAk5CTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxMAkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTEJMTI6MDU6MzBzIC0wOjA1OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTEyCTEyOjA1OjM1cyAtMDowNTozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxMwkxMjowNTo0NXMgLTA6MDU6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTQJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE1CTEyOjA1OjU1cyAtMDowNTo1NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxNgkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMTcJMTI6MDY6MDVzIC0wOjA2OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTE4CTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkxOQkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjAJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTIxCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyMgkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjMJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI0CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyNQkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjYJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTI3CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkyOAkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlKdWwJMjkJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JSnVsCTMwCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUp1bAkzMQkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMQkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMgkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMwkxMjowNjoxMHMgLTA6MDY6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNAkxMjowNjowNXMgLTA6MDY6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNQkxMjowNTo1NXMgLTA6MDU6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNgkxMjowNTo1MHMgLTA6MDU6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJNwkxMjowNTo0NXMgLTA6MDU6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJOAkxMjowNTozNXMgLTA6MDU6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJOQkxMjowNToyNXMgLTA6MDU6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTAJMTI6MDU6MjBzIC0wOjA1OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTExCTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxMgkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTMJMTI6MDQ6NTBzIC0wOjA0OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE0CTEyOjA0OjM1cyAtMDowNDozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxNQkxMjowNDoyNXMgLTA6MDQ6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTYJMTI6MDQ6MTVzIC0wOjA0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTE3CTEyOjA0OjAwcyAtMDowNDowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkxOAkxMjowMzo1MHMgLTA6MDM6NTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMTkJMTI6MDM6MzVzIC0wOjAzOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTIwCTEyOjAzOjIwcyAtMDowMzoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyMQkxMjowMzowNXMgLTA6MDM6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjIJMTI6MDI6NTBzIC0wOjAyOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTIzCTEyOjAyOjM1cyAtMDowMjozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyNAkxMjowMjoyMHMgLTA6MDI6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjUJMTI6MDI6MDBzIC0wOjAyOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI2CTEyOjAxOjQ1cyAtMDowMTo0NSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkyNwkxMjowMTozMHMgLTA6MDE6MzAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMjgJMTI6MDE6MTBzIC0wOjAxOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JQXVnCTI5CTEyOjAwOjUwcyAtMDowMDo1MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCUF1ZwkzMAkxMjowMDozNXMgLTA6MDA6MzUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlBdWcJMzEJMTI6MDA6MTVzIC0wOjAwOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEJMTE6NTk6NTVzIDA6MDA6MDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJMgkxMTo1OTozNXMgMDowMDoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAkzCTExOjU5OjIwcyAwOjAwOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTQJMTE6NTk6MDBzIDA6MDE6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJNQkxMTo1ODo0MHMgMDowMToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk2CTExOjU4OjIwcyAwOjAxOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTcJMTE6NTg6MDBzIDA6MDI6MDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlTZXAJOAkxMTo1NzozNXMgMDowMjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCVNlcAk5CTExOjU3OjE1cyAwOjAyOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEwCTExOjU2OjU1cyAwOjAzOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTExCTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEyCTExOjU2OjE1cyAwOjAzOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTEzCTExOjU1OjUwcyAwOjA0OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE0CTExOjU1OjMwcyAwOjA0OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE1CTExOjU1OjEwcyAwOjA0OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE2CTExOjU0OjUwcyAwOjA1OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE3CTExOjU0OjI1cyAwOjA1OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE4CTExOjU0OjA1cyAwOjA1OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTE5CTExOjUzOjQ1cyAwOjA2OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIwCTExOjUzOjI1cyAwOjA2OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIxCTExOjUzOjAwcyAwOjA3OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIyCTExOjUyOjQwcyAwOjA3OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTIzCTExOjUyOjIwcyAwOjA3OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI0CTExOjUyOjAwcyAwOjA4OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI1CTExOjUxOjQwcyAwOjA4OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI2CTExOjUxOjE1cyAwOjA4OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI3CTExOjUwOjU1cyAwOjA5OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI4CTExOjUwOjM1cyAwOjA5OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTI5CTExOjUwOjE1cyAwOjA5OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JU2VwCTMwCTExOjQ5OjU1cyAwOjEwOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEJMTE6NDk6MzVzIDA6MTA6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJMgkxMTo0OToyMHMgMDoxMDo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAkzCTExOjQ5OjAwcyAwOjExOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTQJMTE6NDg6NDBzIDA6MTE6MjAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJNQkxMTo0ODoyNXMgMDoxMTozNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk2CTExOjQ4OjA1cyAwOjExOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTcJMTE6NDc6NTBzIDA6MTI6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlPY3QJOAkxMTo0NzozMHMgMDoxMjozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU9jdAk5CTExOjQ3OjE1cyAwOjEyOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEwCTExOjQ3OjAwcyAwOjEzOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTExCTExOjQ2OjQ1cyAwOjEzOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEyCTExOjQ2OjMwcyAwOjEzOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTEzCTExOjQ2OjE1cyAwOjEzOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE0CTExOjQ2OjAwcyAwOjE0OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE1CTExOjQ1OjQ1cyAwOjE0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE2CTExOjQ1OjM1cyAwOjE0OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE3CTExOjQ1OjIwcyAwOjE0OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE4CTExOjQ1OjEwcyAwOjE0OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTE5CTExOjQ1OjAwcyAwOjE1OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIwCTExOjQ0OjQ1cyAwOjE1OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIxCTExOjQ0OjQwcyAwOjE1OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIyCTExOjQ0OjMwcyAwOjE1OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTIzCTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI0CTExOjQ0OjEwcyAwOjE1OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI1CTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI2CTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI3CTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI4CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTI5CTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTMwCTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JT2N0CTMxCTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJMgkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgkzCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTQJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJNQkxMTo0Mzo0MHMgMDoxNjoyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk2CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTcJMTE6NDM6NDVzIDA6MTY6MTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlOb3YJOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCU5vdgk5CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEwCTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTExCTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEyCTExOjQ0OjEwcyAwOjE1OjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTEzCTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE0CTExOjQ0OjMwcyAwOjE1OjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE1CTExOjQ0OjQwcyAwOjE1OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE2CTExOjQ0OjUwcyAwOjE1OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE3CTExOjQ1OjAwcyAwOjE1OjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE4CTExOjQ1OjE1cyAwOjE0OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTE5CTExOjQ1OjI1cyAwOjE0OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIwCTExOjQ1OjQwcyAwOjE0OjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIxCTExOjQ1OjU1cyAwOjE0OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIyCTExOjQ2OjEwcyAwOjEzOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTIzCTExOjQ2OjMwcyAwOjEzOjMwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI0CTExOjQ2OjQ1cyAwOjEzOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI1CTExOjQ3OjA1cyAwOjEyOjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI2CTExOjQ3OjIwcyAwOjEyOjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI3CTExOjQ3OjQwcyAwOjEyOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI4CTExOjQ4OjAwcyAwOjEyOjAwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTI5CTExOjQ4OjI1cyAwOjExOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JTm92CTMwCTExOjQ4OjQ1cyAwOjExOjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEJMTE6NDk6MDVzIDA6MTA6NTUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMgkxMTo0OTozMHMgMDoxMDozMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkzCTExOjQ5OjU1cyAwOjEwOjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTQJMTE6NTA6MTVzIDA6MDk6NDUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJNQkxMTo1MDo0MHMgMDowOToyMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk2CTExOjUxOjA1cyAwOjA4OjU1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTcJMTE6NTE6MzVzIDA6MDg6MjUgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJOAkxMTo1MjowMHMgMDowODowMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwk5CTExOjUyOjI1cyAwOjA3OjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEwCTExOjUyOjU1cyAwOjA3OjA1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTExCTExOjUzOjIwcyAwOjA2OjQwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEyCTExOjUzOjUwcyAwOjA2OjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTEzCTExOjU0OjE1cyAwOjA1OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE0CTExOjU0OjQ1cyAwOjA1OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE1CTExOjU1OjE1cyAwOjA0OjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE2CTExOjU1OjQ1cyAwOjA0OjE1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE3CTExOjU2OjE1cyAwOjAzOjQ1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE4CTExOjU2OjQwcyAwOjAzOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTE5CTExOjU3OjEwcyAwOjAyOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIwCTExOjU3OjQwcyAwOjAyOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIxCTExOjU4OjEwcyAwOjAxOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIyCTExOjU4OjQwcyAwOjAxOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTIzCTExOjU5OjEwcyAwOjAwOjUwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI0CTExOjU5OjQwcyAwOjAwOjIwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI1CTEyOjAwOjEwcyAtMDowMDoxMCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyNgkxMjowMDo0MHMgLTA6MDA6NDAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMjcJMTI6MDE6MTBzIC0wOjAxOjEwIC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTI4CTEyOjAxOjQwcyAtMDowMTo0MCAtCi1SdWxlCXNvbDg4CTE5ODgJb25seQktCURlYwkyOQkxMjowMjoxMHMgLTA6MDI6MTAgLQotUnVsZQlzb2w4OAkxOTg4CW9ubHkJLQlEZWMJMzAJMTI6MDI6MzVzIC0wOjAyOjM1IC0KLVJ1bGUJc29sODgJMTk4OAlvbmx5CS0JRGVjCTMxCTEyOjAzOjA1cyAtMDowMzowNSAtCi0KLSMgUml5YWRoIGlzIGF0IGFib3V0IDQ2IGRlZ3JlZXMgNDYgbWludXRlcyBFYXN0OiAgMyBocnMsIDcgbWlucywgNCBzZWNzCi0jIEJlZm9yZSBhbmQgYWZ0ZXIgMTk4OCwgd2UnbGwgb3BlcmF0ZSBvbiBsb2NhbCBtZWFuIHNvbGFyIHRpbWUuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1JpeWFkaDg4CTM6MDc6MDQJLQkJenp6CTE5ODgKLQkJCTM6MDc6MDQJc29sODgJCXp6egkxOTg5Ci0JCQkzOjA3OjA0CS0JCXp6egotIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4uLgotTGluawlBc2lhL1JpeWFkaDg4CU1pZGVhc3QvUml5YWRoODgKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3NvbGFyODkgYi90b29scy96b25laW5mby90emRhdGEyMDEway9zb2xhcjg5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjRkZTRhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3NvbGFyODkKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotIyA8cHJlPgotIyBAKCMpc29sYXI4OQk4LjIKLSMgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBjbGFyaWZpZWQgYXMgb2YKLSMgMjAwOS0wNS0xNyBieSBBcnRodXIgRGF2aWQgT2xzb24uCi0KLSMgQXBwYXJlbnQgbm9vbiB0aW1lcyBiZWxvdyBhcmUgZm9yIFJpeWFkaDsgdGhleSdyZSBhIGJpdCBvZmYgZm9yIG90aGVyIHBsYWNlcy4KLSMgVGltZXMgd2VyZSBjb21wdXRlZCB1c2luZyBhIGZvcm11bGEgcHJvdmlkZWQgYnkgdGhlIFUuIFMuIE5hdmFsIE9ic2VydmF0b3J5OgotIwllcXQgPSAtMTA1LjggKiBzaW4obCkgKyA1OTYuMiAqIHNpbigyICogbCkgKyA0LjQgKiBzaW4oMyAqIGwpCi0jCQktMTIuNyAqIHNpbig0ICogbCkgLSA0MjkuMCAqIGNvcyhsKSAtIDIuMSAqIGNvcyAoMiAqIGwpCi0jCQkrIDE5LjMgKiBjb3MoMyAqIGwpOwotIyB3aGVyZSBsIGlzIHRoZSAibWVhbiBsb25naXR1ZGUgb2YgdGhlIFN1biIgZ2l2ZW4gYnkKLSMJbCA9IDI3OS42NDIgZGVncmVlcyArIDAuOTg1NjQ3ICogZAotIyBhbmQgZCBpcyB0aGUgaW50ZXJ2YWwgaW4gZGF5cyBmcm9tIEphbnVhcnkgMCwgMCBob3VycyBVbml2ZXJzYWwgVGltZQotIyAoZXF1YWxpbmcgdGhlIGRheSBvZiB0aGUgeWVhciBwbHVzIHRoZSBmcmFjdGlvbiBvZiBhIGRheSBmcm9tIHplcm8gaG91cnMpLgotIyBUaGUgYWNjdXJhY3kgb2YgdGhlIGZvcm11bGEgaXMgcGx1cyBvciBtaW51cyB0aHJlZSBzZWNvbmRzLgotIwotIyBSb3VuZGluZyB0byB0aGUgbmVhcmVzdCBmaXZlIHNlY29uZHMgcmVzdWx0cyBpbiBmZXdlciB0aGFuCi0jIDI1NiBkaWZmZXJlbnQgInRpbWUgdHlwZXMiLS1hIGxpbWl0IHRoYXQncyBmYWNlZCBiZWNhdXNlIHRpbWUgdHlwZXMgYXJlCi0jIHN0b3JlZCBvbiBkaXNrIGFzIHVuc2lnbmVkIGNoYXJzLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMQkxMjowMzozNXMgLTA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMgkxMjowNDowNXMgLTA6MDQ6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMwkxMjowNDozMHMgLTA6MDQ6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JNAkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JNQkxMjowNToyNXMgLTA6MDU6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JNgkxMjowNTo1MHMgLTA6MDU6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JNwkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JOAkxMjowNjo0NXMgLTA6MDY6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JOQkxMjowNzoxMHMgLTA6MDc6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTAJMTI6MDc6MzVzIC0wOjA3OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTExCTEyOjA3OjU1cyAtMDowNzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxMgkxMjowODoyMHMgLTA6MDg6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTMJMTI6MDg6NDVzIC0wOjA4OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE0CTEyOjA5OjA1cyAtMDowOTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxNQkxMjowOToyNXMgLTA6MDk6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTYJMTI6MDk6NDVzIC0wOjA5OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTE3CTEyOjEwOjA1cyAtMDoxMDowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkxOAkxMjoxMDoyNXMgLTA6MTA6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMTkJMTI6MTA6NDVzIC0wOjEwOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTIwCTEyOjExOjA1cyAtMDoxMTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyMQkxMjoxMToyMHMgLTA6MTE6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjIJMTI6MTE6MzVzIC0wOjExOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTIzCTEyOjExOjU1cyAtMDoxMTo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyNAkxMjoxMjoxMHMgLTA6MTI6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjUJMTI6MTI6MjBzIC0wOjEyOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI2CTEyOjEyOjM1cyAtMDoxMjozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkyNwkxMjoxMjo1MHMgLTA6MTI6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMjgJMTI6MTM6MDBzIC0wOjEzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSmFuCTI5CTEyOjEzOjEwcyAtMDoxMzoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUphbgkzMAkxMjoxMzoyMHMgLTA6MTM6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKYW4JMzEJMTI6MTM6MzBzIC0wOjEzOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTEJMTI6MTM6NDBzIC0wOjEzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTIJMTI6MTM6NDVzIC0wOjEzOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTMJMTI6MTM6NTVzIC0wOjEzOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTQJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTUJMTI6MTQ6MDVzIC0wOjE0OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTYJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTcJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTgJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTkJMTI6MTQ6MTVzIC0wOjE0OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTEwCTEyOjE0OjIwcyAtMDoxNDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxMQkxMjoxNDoyMHMgLTA6MTQ6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTIJMTI6MTQ6MjBzIC0wOjE0OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTEzCTEyOjE0OjE1cyAtMDoxNDoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxNAkxMjoxNDoxNXMgLTA6MTQ6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTUJMTI6MTQ6MTBzIC0wOjE0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE2CTEyOjE0OjEwcyAtMDoxNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkxNwkxMjoxNDowNXMgLTA6MTQ6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMTgJMTI6MTQ6MDBzIC0wOjE0OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTE5CTEyOjEzOjU1cyAtMDoxMzo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyMAkxMjoxMzo1MHMgLTA6MTM6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjEJMTI6MTM6NDBzIC0wOjEzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTIyCTEyOjEzOjM1cyAtMDoxMzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyMwkxMjoxMzoyNXMgLTA6MTM6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjQJMTI6MTM6MTVzIC0wOjEzOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTI1CTEyOjEzOjA1cyAtMDoxMzowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUZlYgkyNgkxMjoxMjo1NXMgLTA6MTI6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlGZWIJMjcJMTI6MTI6NDVzIC0wOjEyOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRmViCTI4CTEyOjEyOjM1cyAtMDoxMjozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxCTEyOjEyOjI1cyAtMDoxMjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyCTEyOjEyOjEwcyAtMDoxMjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkzCTEyOjEyOjAwcyAtMDoxMjowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk0CTEyOjExOjQ1cyAtMDoxMTo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk1CTEyOjExOjM1cyAtMDoxMTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk2CTEyOjExOjIwcyAtMDoxMToyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk3CTEyOjExOjA1cyAtMDoxMTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk4CTEyOjEwOjUwcyAtMDoxMDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgk5CTEyOjEwOjM1cyAtMDoxMDozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxMAkxMjoxMDoyMHMgLTA6MTA6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTEJMTI6MTA6MDVzIC0wOjEwOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTEyCTEyOjA5OjUwcyAtMDowOTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxMwkxMjowOTozMHMgLTA6MDk6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTQJMTI6MDk6MTVzIC0wOjA5OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE1CTEyOjA5OjAwcyAtMDowOTowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxNgkxMjowODo0MHMgLTA6MDg6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMTcJMTI6MDg6MjVzIC0wOjA4OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTE4CTEyOjA4OjA1cyAtMDowODowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkxOQkxMjowNzo1MHMgLTA6MDc6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjAJMTI6MDc6MzBzIC0wOjA3OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTIxCTEyOjA3OjE1cyAtMDowNzoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyMgkxMjowNjo1NXMgLTA6MDY6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjMJMTI6MDY6MzVzIC0wOjA2OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI0CTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyNQkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjYJMTI6MDU6NDBzIC0wOjA1OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTI3CTEyOjA1OjI1cyAtMDowNToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkyOAkxMjowNTowNXMgLTA6MDU6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXIJMjkJMTI6MDQ6NTBzIC0wOjA0OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWFyCTMwCTEyOjA0OjMwcyAtMDowNDozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1hcgkzMQkxMjowNDoxMHMgLTA6MDQ6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMQkxMjowMzo1NXMgLTA6MDM6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMgkxMjowMzozNXMgLTA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMwkxMjowMzoyMHMgLTA6MDM6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJNAkxMjowMzowMHMgLTA6MDM6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJNQkxMjowMjo0NXMgLTA6MDI6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJNgkxMjowMjoyNXMgLTA6MDI6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJNwkxMjowMjoxMHMgLTA6MDI6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJOAkxMjowMTo1MHMgLTA6MDE6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJOQkxMjowMTozNXMgLTA6MDE6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTAJMTI6MDE6MjBzIC0wOjAxOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTExCTEyOjAxOjA1cyAtMDowMTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxMgkxMjowMDo1MHMgLTA6MDA6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTMJMTI6MDA6MzVzIC0wOjAwOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXByCTE0CTEyOjAwOjIwcyAtMDowMDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUFwcgkxNQkxMjowMDowNXMgLTA6MDA6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTYJMTE6NTk6NTBzIDA6MDA6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTcJMTE6NTk6MzVzIDA6MDA6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTgJMTE6NTk6MjBzIDA6MDA6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMTkJMTE6NTk6MTBzIDA6MDA6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjAJMTE6NTg6NTVzIDA6MDE6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjEJMTE6NTg6NDVzIDA6MDE6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjIJMTE6NTg6MzBzIDA6MDE6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjMJMTE6NTg6MjBzIDA6MDE6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjQJMTE6NTg6MTBzIDA6MDE6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjUJMTE6NTg6MDBzIDA6MDI6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjYJMTE6NTc6NTBzIDA6MDI6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjcJMTE6NTc6NDBzIDA6MDI6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjgJMTE6NTc6MzBzIDA6MDI6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBcHIJMzAJMTE6NTc6MTVzIDA6MDI6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMQkxMTo1NzowNXMgMDowMjo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQkyCTExOjU3OjAwcyAwOjAzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTMJMTE6NTY6NTBzIDA6MDM6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJNAkxMTo1Njo0NXMgMDowMzoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk1CTExOjU2OjQwcyAwOjAzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTYJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJNwkxMTo1NjozMHMgMDowMzozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU1heQk4CTExOjU2OjMwcyAwOjAzOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTWF5CTkJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTAJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTEJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTIJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTMJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTQJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTUJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTYJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTcJMTE6NTY6MjBzIDA6MDM6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTgJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMTkJMTE6NTY6MjVzIDA6MDM6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjAJMTE6NTY6MzBzIDA6MDM6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjEJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjIJMTE6NTY6MzVzIDA6MDM6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjMJMTE6NTY6NDBzIDA6MDM6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjQJMTE6NTY6NDVzIDA6MDM6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjUJMTE6NTY6NTVzIDA6MDM6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjYJMTE6NTc6MDBzIDA6MDM6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjcJMTE6NTc6MDVzIDA6MDI6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjgJMTE6NTc6MTVzIDA6MDI6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMjkJMTE6NTc6MjBzIDA6MDI6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMzAJMTE6NTc6MzBzIDA6MDI6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlNYXkJMzEJMTE6NTc6MzVzIDA6MDI6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMQkxMTo1Nzo0NXMgMDowMjoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyCTExOjU3OjU1cyAwOjAyOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTMJMTE6NTg6MDVzIDA6MDE6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JNAkxMTo1ODoxNXMgMDowMTo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk1CTExOjU4OjI1cyAwOjAxOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTYJMTE6NTg6MzVzIDA6MDE6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JNwkxMTo1ODo0NXMgMDowMToxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgk4CTExOjU5OjAwcyAwOjAxOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTkJMTE6NTk6MTBzIDA6MDA6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTAJMTE6NTk6MjBzIDA6MDA6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTEJMTE6NTk6MzVzIDA6MDA6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTIJMTE6NTk6NDVzIDA6MDA6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTMJMTI6MDA6MDBzIDA6MDA6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTQJMTI6MDA6MTBzIC0wOjAwOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE1CTEyOjAwOjI1cyAtMDowMDoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxNgkxMjowMDozNXMgLTA6MDA6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMTcJMTI6MDA6NTBzIC0wOjAwOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTE4CTEyOjAxOjA1cyAtMDowMTowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkxOQkxMjowMToxNXMgLTA6MDE6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjAJMTI6MDE6MzBzIC0wOjAxOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTIxCTEyOjAxOjQwcyAtMDowMTo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyMgkxMjowMTo1NXMgLTA6MDE6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjMJMTI6MDI6MTBzIC0wOjAyOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI0CTEyOjAyOjIwcyAtMDowMjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyNQkxMjowMjozNXMgLTA6MDI6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjYJMTI6MDI6NDVzIC0wOjAyOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTI3CTEyOjAzOjAwcyAtMDowMzowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bgkyOAkxMjowMzoxMHMgLTA6MDM6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdW4JMjkJMTI6MDM6MjVzIC0wOjAzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVuCTMwCTEyOjAzOjM1cyAtMDowMzozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxCTEyOjAzOjQ1cyAtMDowMzo0NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyCTEyOjA0OjAwcyAtMDowNDowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkzCTEyOjA0OjEwcyAtMDowNDoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk0CTEyOjA0OjIwcyAtMDowNDoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk1CTEyOjA0OjMwcyAtMDowNDozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk2CTEyOjA0OjQwcyAtMDowNDo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk3CTEyOjA0OjUwcyAtMDowNDo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk4CTEyOjA1OjAwcyAtMDowNTowMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAk5CTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxMAkxMjowNToyMHMgLTA6MDU6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTEJMTI6MDU6MjVzIC0wOjA1OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTEyCTEyOjA1OjM1cyAtMDowNTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxMwkxMjowNTo0MHMgLTA6MDU6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTQJMTI6MDU6NTBzIC0wOjA1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE1CTEyOjA1OjU1cyAtMDowNTo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxNgkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMTcJMTI6MDY6MDVzIC0wOjA2OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTE4CTEyOjA2OjEwcyAtMDowNjoxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkxOQkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjAJMTI6MDY6MjBzIC0wOjA2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTIxCTEyOjA2OjIwcyAtMDowNjoyMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyMgkxMjowNjoyNXMgLTA6MDY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjMJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI0CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyNQkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjYJMTI6MDY6MzBzIC0wOjA2OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTI3CTEyOjA2OjMwcyAtMDowNjozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkyOAkxMjowNjozMHMgLTA6MDY6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlKdWwJMjkJMTI6MDY6MjVzIC0wOjA2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JSnVsCTMwCTEyOjA2OjI1cyAtMDowNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUp1bAkzMQkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMQkxMjowNjoyMHMgLTA6MDY6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMgkxMjowNjoxNXMgLTA6MDY6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMwkxMjowNjoxMHMgLTA6MDY6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJNAkxMjowNjowNXMgLTA6MDY6MDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJNQkxMjowNjowMHMgLTA6MDY6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJNgkxMjowNTo1MHMgLTA6MDU6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJNwkxMjowNTo0NXMgLTA6MDU6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJOAkxMjowNTozNXMgLTA6MDU6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJOQkxMjowNTozMHMgLTA6MDU6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTAJMTI6MDU6MjBzIC0wOjA1OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTExCTEyOjA1OjEwcyAtMDowNToxMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxMgkxMjowNTowMHMgLTA6MDU6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTMJMTI6MDQ6NTBzIC0wOjA0OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE0CTEyOjA0OjQwcyAtMDowNDo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxNQkxMjowNDozMHMgLTA6MDQ6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTYJMTI6MDQ6MTVzIC0wOjA0OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTE3CTEyOjA0OjA1cyAtMDowNDowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkxOAkxMjowMzo1MHMgLTA6MDM6NTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMTkJMTI6MDM6MzVzIC0wOjAzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTIwCTEyOjAzOjI1cyAtMDowMzoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyMQkxMjowMzoxMHMgLTA6MDM6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjIJMTI6MDI6NTVzIC0wOjAyOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTIzCTEyOjAyOjQwcyAtMDowMjo0MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyNAkxMjowMjoyMHMgLTA6MDI6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjUJMTI6MDI6MDVzIC0wOjAyOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI2CTEyOjAxOjUwcyAtMDowMTo1MCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkyNwkxMjowMTozMHMgLTA6MDE6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMjgJMTI6MDE6MTVzIC0wOjAxOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JQXVnCTI5CTEyOjAwOjU1cyAtMDowMDo1NSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCUF1ZwkzMAkxMjowMDo0MHMgLTA6MDA6NDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlBdWcJMzEJMTI6MDA6MjBzIC0wOjAwOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTEJMTI6MDA6MDBzIDA6MDA6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJMgkxMTo1OTo0NXMgMDowMDoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAkzCTExOjU5OjI1cyAwOjAwOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTQJMTE6NTk6MDVzIDA6MDA6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJNQkxMTo1ODo0NXMgMDowMToxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk2CTExOjU4OjI1cyAwOjAxOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTcJMTE6NTg6MDVzIDA6MDE6NTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlTZXAJOAkxMTo1Nzo0NXMgMDowMjoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCVNlcAk5CTExOjU3OjIwcyAwOjAyOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTEwCTExOjU3OjAwcyAwOjAzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTExCTExOjU2OjQwcyAwOjAzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTEyCTExOjU2OjIwcyAwOjAzOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTEzCTExOjU2OjAwcyAwOjA0OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE0CTExOjU1OjM1cyAwOjA0OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE1CTExOjU1OjE1cyAwOjA0OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE2CTExOjU0OjU1cyAwOjA1OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE3CTExOjU0OjM1cyAwOjA1OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE4CTExOjU0OjEwcyAwOjA1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTE5CTExOjUzOjUwcyAwOjA2OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTIwCTExOjUzOjMwcyAwOjA2OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTIxCTExOjUzOjEwcyAwOjA2OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTIyCTExOjUyOjQ1cyAwOjA3OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTIzCTExOjUyOjI1cyAwOjA3OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI0CTExOjUyOjA1cyAwOjA3OjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI1CTExOjUxOjQ1cyAwOjA4OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI2CTExOjUxOjI1cyAwOjA4OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI3CTExOjUxOjA1cyAwOjA4OjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI4CTExOjUwOjQwcyAwOjA5OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTI5CTExOjUwOjIwcyAwOjA5OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JU2VwCTMwCTExOjUwOjAwcyAwOjEwOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTEJMTE6NDk6NDVzIDA6MTA6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJMgkxMTo0OToyNXMgMDoxMDozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAkzCTExOjQ5OjA1cyAwOjEwOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTQJMTE6NDg6NDVzIDA6MTE6MTUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJNQkxMTo0ODozMHMgMDoxMTozMCAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk2CTExOjQ4OjEwcyAwOjExOjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTcJMTE6NDc6NTBzIDA6MTI6MTAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlPY3QJOAkxMTo0NzozNXMgMDoxMjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU9jdAk5CTExOjQ3OjIwcyAwOjEyOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTEwCTExOjQ3OjAwcyAwOjEzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTExCTExOjQ2OjQ1cyAwOjEzOjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTEyCTExOjQ2OjMwcyAwOjEzOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTEzCTExOjQ2OjE1cyAwOjEzOjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE0CTExOjQ2OjAwcyAwOjE0OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE1CTExOjQ1OjUwcyAwOjE0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE2CTExOjQ1OjM1cyAwOjE0OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE3CTExOjQ1OjIwcyAwOjE0OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE4CTExOjQ1OjEwcyAwOjE0OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTE5CTExOjQ1OjAwcyAwOjE1OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTIwCTExOjQ0OjUwcyAwOjE1OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTIxCTExOjQ0OjQwcyAwOjE1OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTIyCTExOjQ0OjMwcyAwOjE1OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTIzCTExOjQ0OjIwcyAwOjE1OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI0CTExOjQ0OjEwcyAwOjE1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI1CTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI2CTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI3CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI4CTExOjQzOjQ1cyAwOjE2OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTI5CTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTMwCTExOjQzOjQwcyAwOjE2OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JT2N0CTMxCTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTEJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJMgkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgkzCTExOjQzOjMwcyAwOjE2OjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTQJMTE6NDM6MzVzIDA6MTY6MjUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJNQkxMTo0MzozNXMgMDoxNjoyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk2CTExOjQzOjM1cyAwOjE2OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTcJMTE6NDM6NDBzIDA6MTY6MjAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlOb3YJOAkxMTo0Mzo0NXMgMDoxNjoxNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCU5vdgk5CTExOjQzOjUwcyAwOjE2OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTEwCTExOjQzOjU1cyAwOjE2OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTExCTExOjQ0OjAwcyAwOjE2OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTEyCTExOjQ0OjA1cyAwOjE1OjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTEzCTExOjQ0OjE1cyAwOjE1OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE0CTExOjQ0OjI1cyAwOjE1OjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE1CTExOjQ0OjM1cyAwOjE1OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE2CTExOjQ0OjQ1cyAwOjE1OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE3CTExOjQ0OjU1cyAwOjE1OjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE4CTExOjQ1OjEwcyAwOjE0OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTE5CTExOjQ1OjIwcyAwOjE0OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTIwCTExOjQ1OjM1cyAwOjE0OjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTIxCTExOjQ1OjUwcyAwOjE0OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTIyCTExOjQ2OjA1cyAwOjEzOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTIzCTExOjQ2OjI1cyAwOjEzOjM1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI0CTExOjQ2OjQwcyAwOjEzOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI1CTExOjQ3OjAwcyAwOjEzOjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI2CTExOjQ3OjIwcyAwOjEyOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI3CTExOjQ3OjM1cyAwOjEyOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI4CTExOjQ3OjU1cyAwOjEyOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTI5CTExOjQ4OjIwcyAwOjExOjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JTm92CTMwCTExOjQ4OjQwcyAwOjExOjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTEJMTE6NDk6MDBzIDA6MTE6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMgkxMTo0OToyNXMgMDoxMDozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkzCTExOjQ5OjUwcyAwOjEwOjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTQJMTE6NTA6MTVzIDA6MDk6NDUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJNQkxMTo1MDozNXMgMDowOToyNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk2CTExOjUxOjAwcyAwOjA5OjAwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTcJMTE6NTE6MzBzIDA6MDg6MzAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJOAkxMTo1MTo1NXMgMDowODowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwk5CTExOjUyOjIwcyAwOjA3OjQwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTEwCTExOjUyOjUwcyAwOjA3OjEwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTExCTExOjUzOjE1cyAwOjA2OjQ1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTEyCTExOjUzOjQ1cyAwOjA2OjE1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTEzCTExOjU0OjEwcyAwOjA1OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE0CTExOjU0OjQwcyAwOjA1OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE1CTExOjU1OjEwcyAwOjA0OjUwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE2CTExOjU1OjQwcyAwOjA0OjIwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE3CTExOjU2OjA1cyAwOjAzOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE4CTExOjU2OjM1cyAwOjAzOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTE5CTExOjU3OjA1cyAwOjAyOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTIwCTExOjU3OjM1cyAwOjAyOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTIxCTExOjU4OjA1cyAwOjAxOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTIyCTExOjU4OjM1cyAwOjAxOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTIzCTExOjU5OjA1cyAwOjAwOjU1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI0CTExOjU5OjM1cyAwOjAwOjI1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI1CTEyOjAwOjA1cyAtMDowMDowNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyNgkxMjowMDozNXMgLTA6MDA6MzUgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMjcJMTI6MDE6MDVzIC0wOjAxOjA1IC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTI4CTEyOjAxOjM1cyAtMDowMTozNSAtCi1SdWxlCXNvbDg5CTE5ODkJb25seQktCURlYwkyOQkxMjowMjowMHMgLTA6MDI6MDAgLQotUnVsZQlzb2w4OQkxOTg5CW9ubHkJLQlEZWMJMzAJMTI6MDI6MzBzIC0wOjAyOjMwIC0KLVJ1bGUJc29sODkJMTk4OQlvbmx5CS0JRGVjCTMxCTEyOjAzOjAwcyAtMDowMzowMCAtCi0KLSMgUml5YWRoIGlzIGF0IGFib3V0IDQ2IGRlZ3JlZXMgNDYgbWludXRlcyBFYXN0OiAgMyBocnMsIDcgbWlucywgNCBzZWNzCi0jIEJlZm9yZSBhbmQgYWZ0ZXIgMTk4OSwgd2UnbGwgb3BlcmF0ZSBvbiBsb2NhbCBtZWFuIHNvbGFyIHRpbWUuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMvU0FWRQlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1JpeWFkaDg5CTM6MDc6MDQJLQkJenp6CTE5ODkKLQkJCTM6MDc6MDQJc29sODkJCXp6egkxOTkwCi0JCQkzOjA3OjA0CS0JCXp6egotIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4uLgotTGluawlBc2lhL1JpeWFkaDg5CU1pZGVhc3QvUml5YWRoODkKZGlmZiAtLWdpdCBhL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3NvdXRoYW1lcmljYSBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3NvdXRoYW1lcmljYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1NTAyMi4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway9zb3V0aGFtZXJpY2EKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY4ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKXNvdXRoYW1lcmljYQk4LjQ0Ci0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIFRoaXMgZGF0YSBpcyBieSBubyBtZWFucyBhdXRob3JpdGF0aXZlOyBpZiB5b3UgdGhpbmsgeW91IGtub3cgYmV0dGVyLAotIyBnbyBhaGVhZCBhbmQgZWRpdCB0aGUgZmlsZSAoYW5kIHBsZWFzZSBzZW5kIGFueSBjaGFuZ2VzIHRvCi0jIHR6QGVsc2llLm5jaS5uaWguZ292IGZvciBnZW5lcmFsIHVzZSBpbiB0aGUgZnV0dXJlKS4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgQSBnb29kIHNvdXJjZSBmb3IgdGltZSB6b25lIGhpc3RvcmljYWwgZGF0YSBvdXRzaWRlIHRoZSBVLlMuIGlzCi0jIFRob21hcyBHLiBTaGFua3MgYW5kIFJpcXVlIFBvdHRlbmdlciwgVGhlIEludGVybmF0aW9uYWwgQXRsYXMgKDZ0aCBlZGl0aW9uKSwKLSMgU2FuIERpZWdvOiBBQ1MgUHVibGljYXRpb25zLCBJbmMuICgyMDAzKS4KLSMKLSMgR3dpbGxpbSBMYXcgd3JpdGVzIHRoYXQgYSBnb29kIHNvdXJjZQotIyBmb3IgcmVjZW50IHRpbWUgem9uZSBkYXRhIGlzIHRoZSBJbnRlcm5hdGlvbmFsIEFpciBUcmFuc3BvcnQKLSMgQXNzb2NpYXRpb24ncyBTdGFuZGFyZCBTY2hlZHVsZXMgSW5mb3JtYXRpb24gTWFudWFsIChJQVRBIFNTSU0pLAotIyBwdWJsaXNoZWQgc2VtaWFubnVhbGx5LiAgTGF3IHNlbnQgaW4gc2V2ZXJhbCBoZWxwZnVsIHN1bW1hcmllcwotIyBvZiB0aGUgSUFUQSdzIGRhdGEgYWZ0ZXIgMTk5MC4KLSMKLSMgRXhjZXB0IHdoZXJlIG90aGVyd2lzZSBub3RlZCwgU2hhbmtzICYgUG90dGVuZ2VyIGlzIHRoZSBzb3VyY2UgZm9yCi0jIGVudHJpZXMgdGhyb3VnaCAxOTkwLCBhbmQgSUFUQSBTU0lNIGlzIHRoZSBzb3VyY2UgZm9yIGVudHJpZXMgYWZ0ZXJ3YXJkcy4KLSMKLSMgRWFybGllciBlZGl0aW9ucyBvZiB0aGVzZSB0YWJsZXMgdXNlZCB0aGUgTm9ydGggQW1lcmljYW4gc3R5bGUgKGUuZy4gQVJTVCBhbmQKLSMgQVJEVCBmb3IgQXJnZW50aW5lIFN0YW5kYXJkIGFuZCBEYXlsaWdodCBUaW1lKSwgYnV0IHRoZSBmb2xsb3dpbmcgcXVvdGUKLSMgc3VnZ2VzdHMgdGhhdCBpdCdzIGJldHRlciB0byB1c2UgRXVyb3BlYW4gc3R5bGUgKGUuZy4gQVJUIGFuZCBBUlNUKS4KLSMJSSBzdWdnZXN0IHRoZSB1c2Ugb2YgX1N1bW1lciB0aW1lXyBpbnN0ZWFkIG9mIHRoZSBtb3JlIGN1bWJlcnNvbWUKLSMJX2RheWxpZ2h0LXNhdmluZyB0aW1lXy4gIF9TdW1tZXIgdGltZV8gc2VlbXMgdG8gYmUgaW4gZ2VuZXJhbCB1c2UKLSMJaW4gRXVyb3BlIGFuZCBTb3V0aCBBbWVyaWNhLgotIwktLSBFIE8gQ3V0bGVyLCBfTmV3IFlvcmsgVGltZXNfICgxOTM3LTAyLTE0KSwgcXVvdGVkIGluCi0jCUggTCBNZW5ja2VuLCBfVGhlIEFtZXJpY2FuIExhbmd1YWdlOiBTdXBwbGVtZW50IElfICgxOTYwKSwgcCA0NjYKLSMKLSMgRWFybGllciBlZGl0aW9ucyBvZiB0aGVzZSB0YWJsZXMgYWxzbyB1c2VkIHRoZSBOb3J0aCBBbWVyaWNhbiBzdHlsZQotIyBmb3IgdGltZSB6b25lcyBpbiBCcmF6aWwsIGJ1dCB0aGlzIHdhcyBpbmNvcnJlY3QsIGFzIEJyYXppbGlhbnMgc2F5Ci0jICJzdW1tZXIgdGltZSIuICBSZWluYWxkbyBHb3VsYXJ0LCBhIFNhbyBQYXVsbyBidXNpbmVzc21hbiBhY3RpdmUgaW4KLSMgdGhlIHJhaWxyb2FkIHNlY3Rvciwgd3JpdGVzICgxOTk5LTA3LTA2KToKLSMJVGhlIHN1YmplY3Qgb2YgdGltZSB6b25lcyBpcyBjdXJyZW50bHkgYSBtYXR0ZXIgb2YgZGlzY3Vzc2lvbi9kZWJhdGUgaW4KLSMJQnJhemlsLiAgTGV0J3Mgc2F5IHRoYXQgInRoZSBCcmFzaWxpYSB0aW1lIiBpcyBjb25zaWRlcmVkIHRoZQotIwkib2ZmaWNpYWwgdGltZSIgYmVjYXVzZSBCcmFzaWxpYSBpcyB0aGUgY2FwaXRhbCBjaXR5LgotIwlUaGUgb3RoZXIgdGhyZWUgdGltZSB6b25lcyBhcmUgY2FsbGVkICJCcmFzaWxpYSB0aW1lICJtaW51cyBvbmUiIG9yCi0jCSJwbHVzIG9uZSIgb3IgInBsdXMgdHdvIi4gIEFzIGZhciBhcyBJIGtub3cgdGhlcmUgaXMgbm8gc3VjaAotIwluYW1lL2Rlc2lnbmF0aW9uIGFzICJFYXN0ZXJuIFRpbWUiIG9yICJDZW50cmFsIFRpbWUiLgotIyBTbyBJIGludmVudGVkIHRoZSBmb2xsb3dpbmcgKEVuZ2xpc2gtbGFuZ3VhZ2UpIGFiYnJldmlhdGlvbnMgZm9yIG5vdy4KLSMgQ29ycmVjdGlvbnMgYXJlIHdlbGNvbWUhCi0jCQlzdGQJZHN0Ci0jCS0yOjAwCUZOVAlGTlNUCUZlcm5hbmRvIGRlIE5vcm9uaGEKLSMJLTM6MDAJQlJUCUJSU1QJQnJhc2lsaWEKLSMJLTQ6MDAJQU1UCUFNU1QJQW1hem9uCi0jCS01OjAwCUFDVAlBQ1NUCUFjcmUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQXJnZW50aW5hCi0KLSMgRnJvbSBCb2IgRGV2aW5lICgxOTg4LTAxLTI4KToKLSMgQXJnZW50aW5hOiBmaXJzdCBTdW5kYXkgaW4gT2N0b2JlciB0byBmaXJzdCBTdW5kYXkgaW4gQXByaWwgc2luY2UgMTk3Ni4KLSMgRG91YmxlIFN1bW1lciB0aW1lIGZyb20gMTk2OSB0byAxOTc0LiAgU3dpdGNoZXMgYXQgbWlkbmlnaHQuCi0KLSMgRnJvbSBVLiBTLiBOYXZhbCBPYnNlcnZhdG9yeSAoMTk4OC0wMS0xOTkpOgotIyBBUkdFTlRJTkEgICAgICAgICAgIDMgSCBCRUhJTkQgICBVVEMKLQotIyBGcm9tIEhlcm5hbiBHLiBPdGVybyAoMTk5NS0wNi0yNik6Ci0jIEkgYW0gc2VuZGluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBBcmdlbnRpbmUgdGltZSB6b25lIHRhYmxlLi4uCi0jIEFSIHdhcyBjaG9zZW4gYmVjYXVzZSB0aGV5IGFyZSB0aGUgSVNPIGxldHRlcnMgdGhhdCByZXByZXNlbnQgQXJnZW50aW5hLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlBcmcJMTkzMAlvbmx5CS0JRGVjCSAxCTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTMxCW9ubHkJLQlBcHIJIDEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5MzEJb25seQktCU9jdAkxNQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTkzMgkxOTQwCS0JTWFyCSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTMyCTE5MzkJLQlOb3YJIDEJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NDAJb25seQktCUp1bAkgMQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk0MQlvbmx5CS0JSnVuCTE1CTA6MDAJMAktCi1SdWxlCUFyZwkxOTQxCW9ubHkJLQlPY3QJMTUJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NDMJb25seQktCUF1ZwkgMQkwOjAwCTAJLQotUnVsZQlBcmcJMTk0Mwlvbmx5CS0JT2N0CTE1CTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTQ2CW9ubHkJLQlNYXIJIDEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NDYJb25seQktCU9jdAkgMQkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk2Mwlvbmx5CS0JT2N0CSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTYzCW9ubHkJLQlEZWMJMTUJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NjQJMTk2NgktCU1hcgkgMQkwOjAwCTAJLQotUnVsZQlBcmcJMTk2NAkxOTY2CS0JT2N0CTE1CTA6MDAJMTowMAlTCi1SdWxlCUFyZwkxOTY3CW9ubHkJLQlBcHIJIDIJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NjcJMTk2OAktCU9jdAlTdW4+PTEJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTE5NjgJMTk2OQktCUFwcglTdW4+PTEJMDowMAkwCS0KLVJ1bGUJQXJnCTE5NzQJb25seQktCUphbgkyMwkwOjAwCTE6MDAJUwotUnVsZQlBcmcJMTk3NAlvbmx5CS0JTWF5CSAxCTA6MDAJMAktCi1SdWxlCUFyZwkxOTg4CW9ubHkJLQlEZWMJIDEJMDowMAkxOjAwCVMKLSMKLSMgRnJvbSBIZXJuYW4gRy4gT3Rlcm8gKDE5OTUtMDYtMjYpOgotIyBUaGVzZSBjb3JyZWN0aW9ucyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEludGVyU29mdCBBcmdlbnRpbmEgUy5BLiwKLSMgb2J0YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlOgotIyBUYWxsZXJlcyBkZSBIaWRyb2dyYWZpYSBOYXZhbCBBcmdlbnRpbmEKLSMgKEFyZ2VudGluZSBOYXZhbCBIeWRyb2dyYXBoeSBJbnN0aXR1dGUpCi1SdWxlCUFyZwkxOTg5CTE5OTMJLQlNYXIJU3VuPj0xCTA6MDAJMAktCi1SdWxlCUFyZwkxOTg5CTE5OTIJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotIwotIyBGcm9tIEhlcm5hbiBHLiBPdGVybyAoMTk5NS0wNi0yNik6Ci0jIEZyb20gdGhpcyBtb21lbnQgb24sIHRoZSBsYXcgdGhhdCBtYW5kYXRlZCB0aGUgZGF5bGlnaHQgc2F2aW5nCi0jIHRpbWUgY29ycmVjdGlvbnMgd2FzIGRlcm9nYXRlZCBhbmQgbm8gbW9yZSBtb2RpZmljYXRpb25zCi0jIHRvIHRoZSB0aW1lIHpvbmVzIChmb3IgZGF5bGlnaHQgc2F2aW5nKSBhcmUgbm93IG1hZGUuCi0jCi0jIEZyb20gUml2ZXMgTWNEb3cgKDIwMDAtMDEtMTApOgotIyBPbiBPY3RvYmVyIDMsIDE5OTksIDA6MDAgbG9jYWwsIEFyZ2VudGluYSBpbXBsZW1lbnRlZCBkYXlsaWdodCBzYXZpbmdzIHRpbWUsCi0jIHdoaWNoIGRpZCBub3QgcmVzdWx0IGluIHRoZSBzd2l0Y2ggb2YgYSB0aW1lIHpvbmUsIGFzIHRoZXkgc3RheWVkIDkgaG91cnMKLSMgZnJvbSB0aGUgSW50ZXJuYXRpb25hbCBEYXRlIExpbmUuCi1SdWxlCUFyZwkxOTk5CW9ubHkJLQlPY3QJU3VuPj0xCTA6MDAJMTowMAlTCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMTItMjgpOgotIyBEU1Qgd2FzIHNldCB0byBleHBpcmUgb24gTWFyY2ggNSwgbm90IE1hcmNoIDMsIGJ1dCBzaW5jZSBpdCB3YXMgY29udmVydGVkCi0jIHRvIHN0YW5kYXJkIHRpbWUgb24gTWFyY2ggMyBpdCdzIG1vcmUgY29udmVuaWVudCBmb3IgdXMgdG8gcHJldGVuZCB0aGF0Ci0jIGl0IGVuZGVkIG9uIE1hcmNoIDMuCi1SdWxlCUFyZwkyMDAwCW9ubHkJLQlNYXIJMwkwOjAwCTAJLQotIwotIyBGcm9tIFBldGVyIEdyYWRlbHNraSB2aWEgU3RlZmZlbiBUaG9yc2VuICgyMDAwLTAzLTAxKToKLSMgV2UganVzdCBjaGVja2VkIHdpdGggb3VyIFNhbyBQYXVsbyBvZmZpY2UgYW5kIHRoZXkgc2F5IHRoZSBnb3Zlcm5tZW50IG9mCi0jIEFyZ2VudGluYSBkZWNpZGVkIG5vdCB0byBiZWNvbWUgb25lIG9mIHRoZSBjb3VudHJpZXMgdGhhdCBnbyBvbiBvciBvZmYgRFNULgotIyBTbyBCdWVub3MgQWlyZXMgc2hvdWxkIGJlIC0zIGhvdXJzIGZyb20gR01UIGF0IGFsbCB0aW1lcy4KLSMKLSMgRnJvbSBGYWJpYW4gTC4gQXJjZSBKb2ZyZSAoMjAwMC0wNC0wNCk6Ci0jIFRoZSBsYXcgdGhhdCBjbGFpbWVkIERTVCBmb3IgQXJnZW50aW5hIHdhcyBkZXJvZ2F0ZWQgYnkgUHJlc2lkZW50IEZlcm5hbmRvCi0jIGRlIGxhIFJ1YSBvbiBNYXJjaCAyLCAyMDAwLCBiZWNhdXNlIGl0IHdvdWxkIG1ha2UgcGVvcGxlIHNwZW5kIG1vcmUgZW5lcmd5Ci0jIGluIHRoZSB3aW50ZXIgdGltZSwgcmF0aGVyIHRoYW4gbGVzcy4gIFRoZSBjaGFuZ2UgdG9vayBlZmZlY3Qgb24gTWFyY2ggMy4KLSMKLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwMS0wNi0wNik6Ci0jIG9uZSBvZiB0aGUgbWFqb3IgbmV3c3BhcGVycyBoZXJlIGluIEFyZ2VudGluYSBzYWlkIHRoYXQgdGhlIDE5OTkKLSMgVGltZXpvbmUgTGF3ICh3aGljaCBuZXZlciB3YXMgZWZmZWN0aXZlbHkgYXBwbGllZCkgd2lsbCAod291bGQ/KSBiZQotIyBpbiBlZmZlY3QuLi4uIFRoZSBhcnRpY2xlIGlzIGF0Ci0jIGh0dHA6Ly9hci5jbGFyaW4uY29tL2RpYXJpby8yMDAxLTA2LTA2L2UtMDE3MDEuaHRtCi0jIC4uLiBUaGUgTGF3IGl0c2VsZiBpcyAiTGV5IE5vIDI1MTU1Iiwgc2FuY3Rpb25lZCBvbiAxOTk5LTA4LTI1LCBlbmFjdGVkCi0jIDE5OTktMDktMTcsIGFuZCBwdWJsaXNoZWQgMTk5OS0wOS0yMS4gIFRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiBpcyBhdDoKLSMgaHR0cDovL3d3dy5ib2xldGluLmp1cy5nb3YuYXIvQk9OL1ByaW1lcmEvMTk5OS8wOS1TZXB0aWVtYnJlLzIxL1BERi9CTzIxLTA5LTk5TEVHLlBERgotIyBSZWdyZXRmdWxseSwgeW91IGhhdmUgdG8gc3Vic2NyaWJlIChhbmQgcGF5KSBmb3IgdGhlIG9uLWxpbmUgdmVyc2lvbi4uLi4KLSMKLSMgKDIwMDEtMDYtMTIpOgotIyB0aGUgdGltZXpvbmUgZm9yIEFyZ2VudGluYSB3aWxsIG5vdCBjaGFuZ2UgbmV4dCBTdW5kYXkuCi0jIEFwcGFyZW50bHkgaXQgd2lsbCBkbyBzbyBvbiBTdW5kYXkgMjR0aC4uLi4KLSMgaHR0cDovL2FyLmNsYXJpbi5jb20vZGlhcmlvLzIwMDEtMDYtMTIvcy0wMzUwMS5odG0KLSMKLSMgKDIwMDEtMDYtMjUpOgotIyBMYXN0IEZyaWRheSAoeWVzLCB0aGUgbGFzdCB3b3JraW5nIGRheSBiZWZvcmUgdGhlIGRhdGUgb2YgdGhlIGNoYW5nZSksIHRoZQotIyBTZW5hdGUgYW5udWxsZWQgdGhlIDE5OTkgbGF3IHRoYXQgaW50cm9kdWNlZCB0aGUgY2hhbmdlcyBsYXRlciBwb3N0cG9uZWQuCi0jIGh0dHA6Ly93d3cuY2xhcmluLmNvbS5hci9kaWFyaW8vMjAwMS0wNi0yMi9zLTAzNjAxLmh0bQotIyBJdCByZW1haW5zIHRoZSB2b3RlIG9mIHRoZSBEZXB1dGllcy4uLiwgYnV0IGl0IHdpbGwgYmUgdGhlIHNhbWUuLi4uCi0jIFRoaXMga2luZCBvZiB0aGluZ3MgaGFkIGFsd2F5cyBiZWVuIGRvbmUgdGhpcyB3YXkgaW4gQXJnZW50aW5hLgotIyBXZSBhcmUgc3RpbGwgLTAzOjAwIGFsbCB5ZWFyIHJvdW5kIGluIGFsbCBvZiB0aGUgY291bnRyeS4KLSMKLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMTItMjEpOgotIyBBIHVzZXIgKExlb25hcmRvIENoYWltKSByZXBvcnRlZCB0aGF0IEFyZ2VudGluYSB3aWxsIGFkb3B0IERTVC4uLi4KLSMgYWxsIG9mIHRoZSBjb3VudHJ5IChhbGwgWm9uZS1lbnRyaWVzKSBhcmUgYWZmZWN0ZWQuICBOZXdzIHJlcG9ydHMgbGlrZQotIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9vcGluaW9uL25vdGEuYXNwP25vdGFfaWQ9OTczMDM3IGluZGljYXRlCi0jIHRoYXQgQXJnZW50aW5hIHdpbGwgdXNlIERTVCBuZXh0IHllYXIgYXMgd2VsbCwgZnJvbSBPY3RvYmVyIHRvCi0jIE1hcmNoLCBhbHRob3VnaCBleGFjdCBydWxlcyBhcmUgbm90IGdpdmVuLgotIwotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNy0xMi0yNikKLSMgVGhlIGxhc3QgaHVyZGxlIG9mIEFyZ2VudGluYSBEU1QgaXMgb3ZlciwgdGhlIHByb3Bvc2FsIHdhcyBhcHByb3ZlZCBpbgotIyB0aGUgbG93ZXIgY2hhbWJlciB0b28gKERlcHV0YWRvcykgd2l0aCBhIHZvdGUgMTkyIGZvciBhbmQgMiBhZ2FpbnN0LgotIyBCeSB0aGUgd2F5IHRoYW5rcyB0byBNYXJpYW5vIEFic2F0eiBhbmQgRGFuaWVsIE1hcmlvIFZlZ2EgZm9yIHRoZSBsaW5rIHRvCi0jIHRoZSBvcmlnaW5hbCBzY2FubmVkIHByb3Bvc2FsLCB3aGVyZSB0aGUgZGF0ZXMgYW5kIHRoZSB6ZXJvIGhvdXJzIGFyZQotIyBjbGVhciBhbmQgdW5hbWJpZ3VvdXMuLi5UaGlzIGlzIHRoZSBhcnRpY2xlIGFib3V0IGZpbmFsIGFwcHJvdmFsOgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci9wb2xpdGljYS9ub3RhLmFzcD9ub3RhX2lkPTk3Mzk5NiI+Ci0jIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyL3BvbGl0aWNhL25vdGEuYXNwP25vdGFfaWQ9OTczOTk2Ci0jIDwvYT4KLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNy0xMi0yMik6Ci0jIEZvciBkYXRlcyBhZnRlciBtaWQtMjAwOCwgdGhlIGZvbGxvd2luZyBydWxlcyBhcmUgbXkgZ3Vlc3NlcyBhbmQKLSMgYXJlIHF1aXRlIHBvc3NpYmx5IHdyb25nLCBidXQgYXJlIG1vcmUgbGlrZWx5IHRoYW4gbm8gRFNUIGF0IGFsbC4KLQotIyBGcm9tIEFsZXhhbmRlciBLcml2ZW55c2hldiAoMjAwOC0wOS0wNSk6Ci0jIEFzIHBlciBtZXNzYWdlIGZyb20gQ2FybG9zIEFsYmVydG8gRm9uc2VjYSBBcmF1eiAoTmljYXJhZ3VhKSwKLSMgQXJnZW50aW5hIHdpbGwgc3RhcnQgRFNUIG9uIFN1bmRheSBPY3RvYmVyIDE5LCAyMDA4LgotIwotIyA8YSBocmVmPSJodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwiPgotIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FyZ2VudGluYTAzLmh0bWwKLSMgPC9hPgotIyBPUgotIyA8YSBocmVmPSJodHRwOi8vd3d3LmltcHVsc29iYWlyZXMuY29tLmFyL25vdGEucGhwP2lkPTU3ODMyIChpbiBzcGFuaXNoKSI+Ci0jIGh0dHA6Ly93d3cuaW1wdWxzb2JhaXJlcy5jb20uYXIvbm90YS5waHA/aWQ9NTc4MzIgKGluIHNwYW5pc2gpCi0jIDwvYT4KLQotIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTEwLTA2KToKLSMgSGVyZSBpcyBzb21lIGluZm8gYXZhaWxhYmxlIGF0IGEgR2VudG9vIGJ1ZyByZWxhdGVkIHRvIFRaIG9uIEFyZ2VudGluYSdzIERTVDoKLSMgLi4uCi0jIC0tLS0tLS0gQ29tbWVudCAjMSBmcm9tIFtqbWRvY2lsZV0gIDIwMDgtMTAtMDYgMTY6MjggMDAwMCAtLS0tLS0tCi0jIEhpLCB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aW1lem9uZS1kYXRhLTIwMDhlIGFuZCBtYXliZSB3aXRoCi0jIHRpbWV6b25lLWRhdGEtMjAwOGYKLSMgQXJnZW50aW5pYW4gbGF3IFtOdW1iZXJdIDI1LjE1NSBpcyBubyBsb25nZXIgdmFsaWQuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb2xlZy5nb3YuYXIvaW5mb2xlZ0ludGVybmV0L2FuZXhvcy82MDAwMC02NDk5OS82MDAzNi9ub3JtYS5odG0iPgotIyBodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvNjAwMDAtNjQ5OTkvNjAwMzYvbm9ybWEuaHRtCi0jIDwvYT4KLSMgVGhlIG5ldyBvbmUgaXMgbGF3IFtOdW1iZXJdIDI2LjM1MAotIyA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9sZWcuZ292LmFyL2luZm9sZWdJbnRlcm5ldC9hbmV4b3MvMTM1MDAwLTEzOTk5OS8xMzYxOTEvbm9ybWEuaHRtIj4KLSMgaHR0cDovL3d3dy5pbmZvbGVnLmdvdi5hci9pbmZvbGVnSW50ZXJuZXQvYW5leG9zLzEzNTAwMC0xMzk5OTkvMTM2MTkxL25vcm1hLmh0bQotIyA8L2E+Ci0jIFNvIHRoZXJlIGlzIG5vIHN1bW1lciB0aW1lIGluIEFyZ2VudGluYSBmb3Igbm93LgotCi0jIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDgtMTAtMjApOgotIyBEZWNyZWUgMTY5My8yMDA4IGFwcGxpZXMgTGF3IDI2LjM1MCBmb3IgdGhlIHN1bW1lciAyMDA4LzIwMDkgZXN0YWJsaXNoaW5nIERTVCBpbiBBcmdlbnRpbmEKLSMgRnJvbSAyMDA4LTEwLTE5IHVudGlsIDIwMDktMDMtMTUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE2MTAyMDA4JnBpPTMmcGY9NCZzPTAmc2VjPTAxIj4KLSMgaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE2MTAyMDA4JnBpPTMmcGY9NCZzPTAmc2VjPTAxCi0jIDwvYT4KLSMKLSMgRGVjcmVlIDE3MDUvMjAwOCBleGNlcHRpbmcgMTIgUHJvdmluY2VzIGZyb20gYXBwbHlpbmcgRFNUIGluIHRoZSBzdW1tZXIgMjAwOC8yMDA5OgotIyBDYXRhbWFyY2EsIExhIFJpb2phLCBNZW5kb3phLCBTYWx0YSwgU2FuIEp1YW4sIFNhbiBMdWlzLCBMYSBQYW1wYSwgTmV1cXVlbiwgUmlvIE5lZ3JvLCBDaHVidXQsIFNhbnRhIENydXoKLSMgYW5kIFRpZXJyYSBkZWwgRnVlZ28KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE3MTAyMDA4JnBpPTEmcGY9MSZzPTAmc2VjPTAxIj4KLSMgaHR0cDovL3d3dy5ib2xldGlub2ZpY2lhbC5nb3YuYXIvQm9yYS5Qb3J0YWwvQ3VzdG9tQ29udHJvbHMvUGRmQ29udGVudC5hc3B4P2ZwPTE3MTAyMDA4JnBpPTEmcGY9MSZzPTAmc2VjPTAxCi0jIDwvYT4KLSMKLSMgUHJlc3MgcmVsZWFzZSAyMzUgZGF0ZWQgU2F0dXJkYXkgT2N0b2JlciAxOHRoLCBmcm9tIHRoZSBHb3Zlcm5tZW50IG9mIHRoZSBQcm92aW5jZSBvZiBKdWp1eSBzYXlpbmcKLSMgaXQgd2lsbCBub3QgYXBwbHkgRFNUIGVpdGhlciAoZXZlbiB3aGVuIGl0IHdhcyBub3QgaW5jbHVkZWQgaW4gRGVjcmVlIDE3MDUvMjAwOCkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5qdWp1eS5nb3YuYXIvaW5kZXgyL3BhcnRlc19wcmVuc2EvMThfMTBfMDgvMjM1LTE4MTAwOC5kb2MiPgotIyBodHRwOi8vd3d3Lmp1anV5Lmdvdi5hci9pbmRleDIvcGFydGVzX3ByZW5zYS8xOF8xMF8wOC8yMzUtMTgxMDA4LmRvYwotIyA8L2E+Ci0KLSMgRnJvbSBmdWxsaW5ldCAoMjAwOS0xMC0xOCk6Ci0jIEFzIGFubm91bmNlZCBpbgotIyA8YSBoZWY9Imh0dHA6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9hcmdlbnRpbmEvcG9ydGFsL3BhZ2luYXMuZGh0bWw/cGFnaW5hPTM1NiI+Ci0jIGh0dHA6Ly93d3cuYXJnZW50aW5hLmdvYi5hci9hcmdlbnRpbmEvcG9ydGFsL3BhZ2luYXMuZGh0bWw/cGFnaW5hPTM1NgotIyA8L2E+Ci0jIChhbiBvZmZpY2lhbCAuZ29iLmFyKSB1bmRlciB0aXRsZTogIlNpbiBDYW1iaW8gZGUgSG9yYSIgKGVuZ2xpc2g6ICJObyBob3VyIGNoYW5nZSIpCi0jCi0jICJQb3IgZWwgbW9tZW50bywgZWwgR29iaWVybm8gTmFjaW9uYWwgcmVzb2x2aW8gbm8gbW9kaWZpY2FyIGxhIGhvcmEKLSMgb2ZpY2lhbCwgZGVjaXNpb24gcXVlIGVzdGFiYSBlbiBlc3R1ZGlvIHBhcmEgc3UgaW1wbGVtZW50YWNpb24gZWwKLSMgZG9taW5nbyAxOCBkZSBvY3R1YnJlLiBEZXNkZSBlbCBNaW5pc3RlcmlvIGRlIFBsYW5pZmljYWNpb24gc2UgYW51bmNpbwotIyBxdWUgbGEgQXJnZW50aW5hIGhveSwgZW4gZXN0YXMgY29uZGljaW9uZXMgbWV0ZW9yb2xvZ2ljYXMsIG5vIG5lY2VzaXRhCi0jIGxhIG1vZGlmaWNhY2lvbiBkZWwgaHVzbyBob3JhcmlvLCB5YSBxdWUgMjAwOSBub3MgZW5jdWVudHJhIGNvbgotIyBjcmVjaW1pZW50byBlbiBsYSBwcm9kdWNjaW9uIHkgZGlzdHJpYnVjaW9uIGVuZXJnZXRpY2EuIgotCi1SdWxlCUFyZwkyMDA3CW9ubHkJLQlEZWMJMzAJMDowMAkxOjAwCVMKLVJ1bGUJQXJnCTIwMDgJMjAwOQktCU1hcglTdW4+PTE1CTA6MDAJMAktCi1SdWxlCUFyZwkyMDA4CW9ubHkJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotIAotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTA1LTIxKToKLSMgVG9kYXkgaXQgd2FzIG9mZmljaWFsbHkgcHVibGlzaGVkIHRoYXQgdGhlIFByb3ZpbmNlIG9mIE1lbmRvemEgaXMgY2hhbmdpbmcKLSMgaXRzIHRpbWV6b25lIHRoaXMgd2ludGVyLi4uIHN0YXJ0aW5nIHRvbW9ycm93IG5pZ2h0Li4uLgotIyBodHRwOi8vd3d3LmdvYmVybmFjLm1lbmRvemEuZ292LmFyL2JvbGV0aW4vcGRmLzIwMDQwNTIxLTI3MTU4LW5vcm1hcy5wZGYKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNC0wNS0yNCk6Ci0jIEl0J3MgTGF3IE5vLiA3LDIxMC4gIFRoaXMgY2hhbmdlIGlzIGR1ZSB0byBhIHB1YmxpYyBwb3dlciBlbWVyZ2VuY3ksIHNvIGZvcgotIyBub3cgd2UnbGwgYXNzdW1lIGl0J3MgZm9yIHRoaXMgeWVhciBvbmx5LgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zcGljYXNjLm5ldC9ob3J2ZXJhLmh0bWwiPgotIyBIb3JhIGRlIHZlcmFubyBwYXJhIGxhIFJlcHVibGljYSBBcmdlbnRpbmEgKDIwMDMtMDYtMDgpCi0jIDwvYT4gc2F5cyB0aGF0IHN0YW5kYXJkIHRpbWUgaW4gQXJnZW50aW5hIGZyb20gMTg5NC0xMC0zMQotIyB0byAxOTIwLTA1LTAxIHdhcyAtNDoxNjo0OC4yNS4gIEdvIHdpdGggdGhpcyBtb3JlLXByZWNpc2UgdmFsdWUKLSMgb3ZlciBTaGFua3MgJiBQb3R0ZW5nZXIuCi0jCi0jIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDQtMDYtMDUpOgotIyBUaGVzZSBtZWRpYSBhcnRpY2xlcyBmcm9tIGEgbWFqb3IgbmV3c3BhcGVyIG1vc3RseSBjb3ZlciB0aGUgY3VycmVudCBzdGF0ZToKLSMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvMDQvMDUvMjcvZGVfNjA0ODI1LmFzcAotIyBodHRwOi8vd3d3LmxhbmFjaW9uLmNvbS5hci8wNC8wNS8yOC9kZV82MDUyMDMuYXNwCi0jCi0jIFRoZSBmb2xsb3dpbmcgZWlnaHQgKDgpIHByb3ZpbmNlcyBwdWxsZWQgY2xvY2tzIGJhY2sgdG8gVVRDLTA0OjAwIGF0Ci0jIG1pZG5pZ2h0IE1vbmRheSBNYXkgMzFzdC4gKHRoYXQgaXMsIHRoZSBuaWdodCBiZXR3ZWVuIDA1LzMxIGFuZCAwNi8wMSkuCi0jIEFwcGFyZW50bHksIGFsbCBuaW5lIHByb3ZpbmNlcyB3b3VsZCBnbyBiYWNrIHRvIFVUQy0wMzowMCBhdCB0aGUgc2FtZQotIyB0aW1lIGluIE9jdG9iZXIgMTd0aC4KLSMKLSMgQ2F0YW1hcmNhLCBDaHVidXQsIExhIFJpb2phLCBTYW4gSnVhbiwgU2FuIEx1aXMsIFNhbnRhIENydXosCi0jIFRpZXJyYSBkZWwgRnVlZ28sIFR1Y3VtYW4uCi0jCi0jIEZyb20gTWFyaWFubyBBYnNhdHogKDIwMDQtMDYtMTQpOgotIyAuLi4gdGhpcyB3ZWVrZW5kLCB0aGUgUHJvdmluY2Ugb2YgVHVjdW1hbiBkZWNpZGVkIGl0J2QgZ28gYmFjayB0byBVVEMtMDM6MDAKLSMgeWVzdGVyZGF5IG1pZG5pZ2h0ICh0aGF0IGlzLCBhdCAyNDowMCBTYXR1cmRheSAxMnRoKSwgc2luY2UgdGhlIHBlb3BsZSdzCi0jIGFubm95YW5jZSB3aXRoIHRoZSBjaGFuZ2UgaXMgbXVjaCBoaWdoZXIgdGhhbiB0aGUgcG93ZXIgc2F2aW5ncyBvYnRhaW5lZC4uLi4KLSMKLSMgRnJvbSBHd2lsbGltIExhdyAoMjAwNC0wNi0xNCk6Ci0jIGh0dHA6Ly93d3cubGFuYWNpb24uY29tLmFyLzA0LzA2LzEwL2RlXzYwOTA3OC5hc3AgLi4uCi0jICAgICAiVGhlIHRpbWUgY2hhbmdlIGluIFRpZXJyYSBkZWwgRnVlZ28gd2FzIGEgY29uZmxpY3RlZCBkZWNpc2lvbiBmcm9tCi0jICAgdGhlIHN0YXJ0LiAgVGhlIGdvdmVybm1lbnQgaGFkIGRlY3JlZWQgdGhhdCB0aGUgbWVhc3VyZSB3b3VsZCB0YWtlCi0jICAgZWZmZWN0IG9uIEp1bmUgMSwgYnV0IGEgbm9ybWF0aXZlIGVycm9yIGZvcmNlZCB0aGUgbmV3IHRpbWUgdG8gYmVnaW4KLSMgICB0aHJlZSBkYXlzIGVhcmxpZXIsIGZyb20gYSBTYXR1cmRheSB0byBhIFN1bmRheS4uLi4KLSMgT3VyIHVuZGVyc3RhbmRpbmcgd2FzIHRoYXQgdGhlIGNoYW5nZSB3YXMgb3JpZ2luYWxseSBzY2hlZHVsZWQgdG8gdGFrZSBwbGFjZQotIyBvbiBKdW5lIDEgYXQgMDA6MDAgaW4gQ2h1YnV0LCBTYW50YSBDcnV6LCBUaWVycmEgZGVsIEZ1ZWdvIChhbmQgc29tZSBvdGhlcgotIyBwcm92aW5jZXMpLiAgU3VuZGF5IHdhcyBNYXkgMzAsIG9ubHkgdHdvIGRheXMgZWFybGllci4gIFNvIHRoZSBhcnRpY2xlCi0jIGNvbnRhaW5zIGEgY29udHJhZGljdGlvbi4gIEkgd291bGQgZ2l2ZSBtb3JlIGNyZWRlbmNlIHRvIHRoZSBTYXR1cmRheS9TdW5kYXkKLSMgZGF0ZSB0aGFuIHRoZSAidGhyZWUgZGF5cyBlYXJsaWVyIiBwaHJhc2UsIGFuZCBjb25jbHVkZSB0aGF0IFRpZXJyYSBkZWwKLSMgRnVlZ28gc2V0IGl0cyBjbG9ja3MgYmFjayBhdCAyMDA0LTA1LTMwIDAwOjAwLgotIwotIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAwNC0xMC0wNSk6Ci0jIFRoZSBwcmV2aW91cyBsYXcgNzIxMCB3aGljaCBjaGFuZ2VkIHRoZSBwcm92aW5jZSBvZiBNZW5kb3phJ3MgdGltZSB6b25lCi0jIGJhY2sgaW4gTWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseSBpbiBhIG5ldyBsYXcgNzI3Nywgd2hpY2ggc2V0IHRoZQotIyBuZXcgZW5kIGRhdGUgdG8gMjAwNC0wOS0yNiAob3JpZ2luYWwgZGF0ZSB3YXMgMjAwNC0xMC0xNykuCi0jIGh0dHA6Ly93d3cuZ29iZXJuYWMubWVuZG96YS5nb3YuYXIvYm9sZXRpbi9wZGYvMjAwNDA5MjQtMjcyNDQtbm9ybWFzLnBkZgotIwotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA0LTEwLTA1KToKLSMgU2FuIEp1YW4gY2hhbmdlZCBmcm9tIFVUQy0wMzowMCB0byBVVEMtMDQ6MDAgYXQgbWlkbmlnaHQgYmV0d2VlbgotIyBTdW5kYXksIE1heSAzMHRoIGFuZCBNb25kYXksIE1heSAzMXN0LiAgSXQgY2hhbmdlZCBiYWNrIHRvIFVUQy0wMzowMAotIyBhdCBtaWRuaWdodCBiZXR3ZWVuIFNhdHVyZGF5LCBKdWx5IDI0dGggYW5kIFN1bmRheSwgSnVseSAyNXRoLi4uLgotIyBodHRwOi8vd3d3LnNhbmp1YW4uZ292LmFyL3ByZW5zYS9hcmNoaXZvLzAwMDMyOS5odG1sCi0jIGh0dHA6Ly93d3cuc2FuanVhbi5nb3YuYXIvcHJlbnNhL2FyY2hpdm8vMDAwNDI2Lmh0bWwKLSMgaHR0cDovL3d3dy5zYW5qdWFuLmdvdi5hci9wcmVuc2EvYXJjaGl2by8wMDA0NDEuaHRtbAotCi0jIEZyb20gQWxleCBLcml2ZW55c2hldiAoMjAwOC0wMS0xNyk6Ci0jIEhlcmUgYXJlIGFydGljbGVzIHRoYXQgQXJnZW50aW5hIFByb3ZpbmNlIFNhbiBMdWlzIGlzIHBsYW5uaW5nIHRvIGVuZCBEU1QKLSMgYXMgZWFybGllciBhcyB1cGNvbWluZyBNb25kYXkgSmFudWFyeSAyMSwgMjAwOCBvciBGZWJydWFyeSAyMDA4OgotIwotIyBQcm92aW5jaWEgYXJnZW50aW5hIHJldHJhc2EgcmVsb2ogeSBtYXJjYSBkaWZlcmVuY2lhIGNvbiByZXN0byBkZWwgcGFpcwotIyAoQXJnZW50aW5lIFByb3ZpbmNlIGRlbGF5ZWQgY2xvY2sgYW5kIG1hcmsgZGlmZmVyZW5jZSB3aXRoIHRoZSByZXN0IG9mIHRoZQotIyBjb3VudHJ5KQotIyA8YSBocmVmPSJodHRwOi8vY2wuaW52ZXJ0aWEuY29tL25vdGljaWFzL25vdGljaWEuYXNweD9pZE5vdGljaWE9MjAwODAxMTcxODQ5X0VGRV9FVDQzNzMmaWR0ZWwiPgotIyBodHRwOi8vY2wuaW52ZXJ0aWEuY29tL25vdGljaWFzL25vdGljaWEuYXNweD9pZE5vdGljaWE9MjAwODAxMTcxODQ5X0VGRV9FVDQzNzMmaWR0ZWwKLSMgPC9hPgotIwotIyBFcyBpbm1pbmVudGUgcXVlIGVuIFNhbiBMdWlzIGF0cmFzZW4gdW5hIGhvcmEgbG9zIHJlbG9qZXMKLSMgKEl0IGlzIGltbWluZW50IGluIFNhbiBMdWlzIGNsb2NrcyBvbmUgaG91ciBkZWxheSkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYWdhY2V0YS5jb20uYXIvdmVybm90YWUuYXNwP2lkX25vdGE9MjUzNDE0Ij4KLSMgaHR0cDovL3d3dy5sYWdhY2V0YS5jb20uYXIvdmVybm90YWUuYXNwP2lkX25vdGE9MjUzNDE0Ci0jIDwvYT4KLSMKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMi5odG1sIj4KLSMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLm5ldC9kc3RfbmV3cy9kc3RfbmV3c19hcmdlbnRpbmEwMi5odG1sCi0jIDwvYT4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwOC0wMS0xOCk6Ci0jIFRoZSBwYWdlIG9mIHRoZSBTYW4gTHVpcyBwcm92aW5jaWFsIGdvdmVybm1lbnQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD0wJmlkPTIyODEyIj4KLSMgaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD0wJmlkPTIyODEyCi0jIDwvYT4KLSMgY29uZmlybXMgd2hhdCBBbGV4IEtyaXZlbnlzaGV2IGhhcyBlYXJsaWVyIHNlbnQgdG8gdGhlIHR6Ci0jIGVtYWlsaW5nIGxpc3QgYWJvdXQgdGhhdCBTYW4gTHVpcyBwbGFucyB0byByZXR1cm4gdG8gc3RhbmRhcmQKLSMgdGltZSBtdWNoIGVhcmxpZXIgdGhhbiB0aGUgcmVzdCBvZiB0aGUgY291bnRyeS4gSXQgYWxzbwotIyBjb25maXJtcyB0aGF0IHVwb24gcmVxdWVzdCB0aGUgcHJvdmluY2VzIFNhbiBKdWFuIGFuZCBNZW5kb3phIAotIyByZWZ1c2VkIHRvIGZvbGxvdyBTYW4gTHVpcyBpbiB0aGlzIGNoYW5nZS4gCi0jIAotIyBUaGUgY2hhbmdlIGlzIHN1cHBvc2VkIHRvIHRha2UgcGxhY2UgTW9uZGF5IHRoZSAyMS5zdCBhdCAwOjAwCi0jIGhvdXJzLiBBcyBmYXIgYXMgSSB1bmRlcnN0YW5kIGl0IGlmIHRoaXMgZ29lcyBhaGVhZCwgd2UgbmVlZAotIyBhIG5ldyB0aW1lem9uZSBmb3IgU2FuIEx1aXMgKGFsdGhvdWdoIHRoZXJlIGFyZSBhbHNvIGRvY3VtZW50ZWQKLSMgaW5kZXBlbmRlbnQgY2hhbmdlcyBpbiB0aGUgc291dGhhbWVyaWNhIGZpbGUgb2YgU2FuIEx1aXMgaW4KLSMgMTk5MCBhbmQgMTk5MSB3aGljaCBoYXMgbm90IGJlZW4gY29uZmlybWVkKS4KLQotIyBGcm9tIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwOC0wMS0yNSk6Ci0jIFVuZm9ydHVuYXRlbHkgdGhlIGJlbG93IHBhZ2UgaGFzIGJlY29tZSBkZWZ1bmN0LCBhYm91dCB0aGUgU2FuIEx1aXMKLSMgdGltZSBjaGFuZ2UuIFBlcmhhcHMgYmVjYXVzZSBpdCBub3cgaXMgcGFydCBvZiBhIGdyb3VwIG9mIHBhZ2VzICJNb3N0Ci0jIGltcG9ydGFudCBwYWdlcyBvZiAyMDA4LiIKLSMKLSMgWW91IGNhbiB1c2UKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD04MTQxJmlkPTIyODM0Ij4KLSMgaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9ub3Rhcy5hc3A/aWRDYW5hbD04MTQxJmlkPTIyODM0Ci0jIDwvYT4KLSMgaW5zdGVhZCBpdCBzZWVtcy4gT3IgdXNlICJCdXNjYWRvciIgZnJvbSB0aGUgbWFpbiBwYWdlIG9mIHRoZSBTYW4gTHVpcwotIyBnb3Zlcm5tZW50LCBhbmQgZmlsbCBpbiAiaHVzbyIgYW5kIGNsaWNrIE9LLCBhbmQgeW91IHdpbGwgZ2V0IDMgcGFnZXMKLSMgZnJvbSB3aGljaCB0aGUgZmlyc3Qgb25lIGlzIGlkZW50aWNhbCB0byB0aGUgYWJvdmUuCi0KLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAwOC0wMS0yOCk6Ci0jIEkgY2FuIGNvbmZpcm0gdGhhdCB0aGUgUHJvdmluY2Ugb2YgU2FuIEx1aXMgKGFuZCBzbyBmYXIgb25seSB0aGF0Ci0jIHByb3ZpbmNlKSBkZWNpZGVkIHRvIGdvIGJhY2sgdG8gVVRDLTMgZWZmZWN0aXZlIG1pZG5pZ2h0IEphbiAyMHRoIDIwMDgKLSMgKHRoYXQgaXMsIE1vbmRheSAyMXN0IGF0IDA6MDAgaXMgdGhlIHRpbWUgdGhlIGNsb2NrcyB3ZXJlIGRlbGF5ZWQgYmFjawotIyAxIGhvdXIpLCBhbmQgdGhleSBpbnRlbmQgdG8ga2VlcCBVVEMtMyBhcyB0aGVpciB0aW1lem9uZSBhbGwgeWVhciByb3VuZAotIyAodGhhdCBpcywgdW5sZXNzIHRoZXkgY2hhbmdlIHRoZWlyIG1pbmQgYW55IG1pbnV0ZSBub3cpLgotIwotIyBTbyB3ZSdsbCBoYXZlIHRvIGFkZCB5ZXQgYW5vdGhlciBjaXR5IHRvICdzb3V0aGFtZXJpY2EnIChJIHRoaW5rIFNhbgotIyBMdWlzIGNpdHkgaXMgdGhlIG1vcyBwb3B1bGF0ZWQgY2l0eSBpbiB0aGUgUHJvdmluY2UsIHNvIGl0J2QgYmUKLSMgQW1lcmljYS9BcmdlbnRpbmEvU2FuX0x1aXMuLi4gb2YgY291cnNlIEkgY2FuJ3QgcmVtZW1iZXIgaWYgU2FuIEx1aXMncwotIyBoaXN0b3J5IG9mIHBhcnRpY3VsYXIgY2hhbmdlcyBnb2VzIGFsb25nIHdpdGggTWVuZG96YSBvciBTYW4gSnVhbiA6LSgKLSMgKEkgb25seSByZW1lbWJlciBub3QgYmVpbmcgYWJsZSB0byBjb2xsZWN0IGhhcmQgZmFjdHMgYWJvdXQgU2FuIEx1aXMKLSMgYmFjayBpbiAyMDA0LCB3aGVuIHRoZXNlIHByb3ZpbmNlcyBjaGFuZ2VkIHRvIFVUQy00IGZvciBhIGZldyBkYXlzLCBJCi0jIG1haWxlZCB0aGVtIHBlcnNvbmFsbHkgYW5kIG5ldmVyIGdvdCBhbiBhbnN3ZXIpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDgtMDYtMzApOgotIyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgZGF0YSBhcmUgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIgdGhyb3VnaCAxOTkyLAotIyBmcm9tIHRoZSBJQVRBIG90aGVyd2lzZS4gIEFzIG5vdGVkIGJlbG93LCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQKLSMgQW1lcmljYS9Db3Jkb2JhIHNwbGl0IGludG8gNiBzdWJyZWdpb25zIGR1cmluZyAxOTkxLzE5OTIsIG9uZSBvZiB3aGljaAotIyB3YXMgQW1lcmljYS9TYW5fTHVpcywgYnV0IHdlIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyB5ZXQgc28gZm9yIG5vdyB3ZSdsbAotIyBrZWVwIEFtZXJpY2EvQ29yZG9iYSBhIHNpbmdsZSByZWdpb24gcmF0aGVyIHRoYW4gc3BsaXR0aW5nIGl0IGludG8gdGhlCi0jIG90aGVyIDUgc3VicmVnaW9ucy4KLQotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA5LTAzLTEzKToKLSMgWWVzdGVyZGF5ICh3aXRoIG91ciB1c3VhbCAyLWRheSBub3RpY2UpIHRoZSBQcm92aW5jZSBvZiBTYW4gTHVpcwotIyBkZWNpZGVkIHRoYXQgbmV4dCBTdW5kYXkgaW5zdGVhZCBvZiAic3RheWluZyIgQHV0Yy0wMzowMCB0aGV5IHdpbGwgZ28KLSMgdG8gdXRjLTA0OjAwIHVudGlsIHRoZSBzZWNvbmQgU2F0dXJkYXkgaW4gT2N0b2Jlci4uLgotIwotIyBUaGUgcHJlc3MgcmVsZWFzZSBpcyBhdAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNhbmx1aXMuZ292LmFyL1NML1BhZ2luYXMvTm90aWNpYURldGFsbGUuYXNwP1RlbWFJZD0xJkluZm9QcmVuc2FJZD0zMTAyIj4KLSMgaHR0cDovL3d3dy5zYW5sdWlzLmdvdi5hci9TTC9QYWdpbmFzL05vdGljaWFEZXRhbGxlLmFzcD9UZW1hSWQ9MSZJbmZvUHJlbnNhSWQ9MzEwMgotIyA8L2E+Ci0jIChJIGNvdWxkbid0IGZpbmQgdGhlIGRlY3JlZSwgYnV0Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2FubHVpcy5nb3YuYXIiPgotIyB3d3cuc2FubHVpcy5nb3YuYXIKLSMgPGEvPgotIyBpcyB0aGUgb2ZmaWNpYWwgcGFnZSBmb3IgdGhlIFByb3ZpbmNlIEdvdmVybm1lbnQpLgotIwotIyBUaGVyZSdzIGFsc28gYSBub3RlIGluIG9ubHkgb25lIG9mIHRoZSBtYWpvciBuYXRpb25hbCBwYXBlcnMgKExhIE5hY2nzbikgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvbm90YS5hc3A/bm90YV9pZD0xMTA3OTEyIj4KLSMgaHR0cDovL3d3dy5sYW5hY2lvbi5jb20uYXIvbm90YS5hc3A/bm90YV9pZD0xMTA3OTEyCi0jIDwvYT4KLSMgCi0jIFRoZSBwcmVzcyByZWxlYXNlIHNheXM6Ci0jICAoLi4uKSBhbnVuY2nzIHF1ZSBlbCBwcvN4aW1vIGRvbWluZ28gYSBsYXMgMDA6MDAgbG9zIHB1bnRhbm9zIGRlYmVy4W4KLSMgYXRyYXNhciB1bmEgaG9yYSBzdXMgcmVsb2plcy4KLSMKLSMgQSBwYXJ0aXIgZGUgZW50b25jZXMsIFNhbiBMdWlzIGVzdGFibGVjZXLhIGVsIGh1c28gaG9yYXJpbyBwcm9waW8gZGUKLSMgbGEgUHJvdmluY2lhLiBEZSBlc3RhIG1hbmVyYSwgZHVyYW50ZSBlbCBwZXJpb2RvIGRlbCBjYWxlbmRhcmlvIGFudWFsCi0jIDIwMDksIGVsIGNhbWJpbyBob3JhcmlvIHF1ZWRhcuEgY29tcHJlbmRpZG8gZW50cmUgbGFzIDAwOjAwIGRlbCB0ZXJjZXIKLSMgZG9taW5nbyBkZSBtYXJ6byB5IGxhcyAyNDowMCBkZWwgc2VndW5kbyBz4WJhZG8gZGUgb2N0dWJyZS4KLSMgUXVpY2smZGlydHkgdHJhbnNsYXRpb24KLSMgKC4uLikgYW5ub3VuY2VkIHRoYXQgbmV4dCBTdW5kYXksIGF0IDAwOjAwLCBQdW50YW5vcyAodGhlIFNhbiBMdWlzCi0jIGluaGFiaXRhbnRzKSB3aWxsIGhhdmUgdG8gdHVybiBiYWNrIG9uZSBob3VyIHRoZWlyIGNsb2NrcwotIwotIyBTaW5jZSB0aGVuLCBTYW4gTHVpcyB3aWxsIGVzdGFibGlzaCBpdHMgb3duIFByb3ZpbmNlIHRpbWV6b25lLiBUaHVzLAotIyBkdXJpbmcgMjAwOSwgdGhpcyB0aW1lem9uZSBjaGFuZ2Ugd2lsbCBydW4gZnJvbSAwMDowMCB0aGUgdGhpcmQgU3VuZGF5Ci0jIGluIE1hcmNoIHVudGlsIDI0OjAwIG9mIHRoZSBzZWNvbmQgU2F0dXJkYXkgaW4gT2N0b2Jlci4KLQotIyBGcm9tIE1hcmlhbm8gQWJzYXR6ICgyMDA5LTEwLTE2KToKLSMgLi4udGhlIFByb3ZpbmNlIG9mIFNhbiBMdWlzIGlzIGEgY2FzZSBpbiBpdHNlbGYuCi0jCi0jIFRoZSBMYXcgYXQKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5kaXB1dGFkb3NzYW5sdWlzLmdvdi5hci9kaXB1dGFkb3Nhc3AvcGFnaW5hcy92ZXJOb3JtYS5hc3A/Tm9ybWFJRD0yNzY+IgotIyBodHRwOi8vd3d3LmRpcHV0YWRvc3Nhbmx1aXMuZ292LmFyL2RpcHV0YWRvc2FzcC9wYWdpbmFzL3Zlck5vcm1hLmFzcD9Ob3JtYUlEPTI3NgotIyA8L2E+Ci0jIGlzIGFtYmlndW91cyBiZWNhdXNlIGVzdGFibGlzaGVzIGEgY2FsZW5kYXIgZnJvbSB0aGUgMm5kIFN1bmRheSBpbgotIyBPY3RvYmVyIGF0IDA6MDAgdGhydSB0aGUgMm5kIFNhdHVyZGF5IGluIE1hcmNoIGF0IDI0OjAwIGFuZCB0aGUKLSMgY29tcGxlbWVudCBvZiB0aGF0IHN0YXJ0aW5nIG9uIHRoZSAybmQgU3VuZGF5IG9mIE1hcmNoIGF0IDA6MDAgYW5kCi0jIGVuZGluZyBvbiB0aGUgMm5kIFNhdHVyZGF5IG9mIE1hcmNoIGF0IDI0OjAwLgotIwotIyBUaGlzIGNsZWFybHkgYnJlYWtzIGV2ZXJ5IHRpbWUgdGhlIDFzdCBvZiBNYXJjaCBvciBPY3RvYmVyIGlzIGEgU3VuZGF5LgotIwotIyBJTUhPLCB0aGUgInNwaXJpdCBvZiB0aGUgTGF3IiBpcyB0byBtYWtlIHRoZSBjaGFuZ2VzIGF0IDA6MDAgb24gdGhlIDJuZAotIyBTdW5kYXkgb2YgT2N0b2JlciBhbmQgTWFyY2guCi0jCi0jIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGNoYW5nZXMgaW4gdGhlIHJlc3Qgb2YgdGhlIFByb3ZpbmNlcyB0aGF0IGRpZAotIyBjaGFuZ2UgaW4gMjAwNy8yMDA4LCB3ZXJlIG1hZGUgYWNjb3JkaW5nIHRvIHRoZSBGZWRlcmFsIExhdyBhbmQgRGVjcmVlcwotIyB0aGF0IGRpZCBzbyBvbiB0aGUgM3JkIFN1bmRheSBvZiBPY3RvYmVyIGFuZCBNYXJjaC4KLSMKLSMgSW4gZmFjdCwgU2FuIEx1aXMgYWN0dWFsbHkgc3dpdGNoZWQgZnJvbSBVVEMtNCB0byBVVEMtMyBsYXN0IFN1bmRheQotIyAoT2N0b2JlciAxMXRoKSBhdCAwOjAwLgotIwotIyBTbyBJIGd1ZXNzIGEgbmV3IHNldCBvZiBydWxlcywgYmVzaWRlcyAiQXJnIiwgbXVzdCBiZSBtYWRlIGFuZCB0aGUgbGFzdAotIyBBbWVyaWNhL0FyZ2VudGluYS9TYW5fTHVpcyBlbnRyaWVzIHNob3VsZCBjaGFuZ2UgdG8gdXNlIHRoZXNlLi4uCi0jCi0jIEknbSBlbmNsb3NpbmcgYSBwYXRjaCB0aGF0IGRvZXMgd2hhdCBJIHNheS4uLiByZWdyZXRmdWxseSwgdGhlIFNhbiBMdWlzCi0jIHRpbWV6b25lIG11c3QgYmUgY2FsbGVkICJXQVJUL1dBUlNUIiBldmVuIHdoZW4gbW9zdCBvZiB0aGUgdGltZSAobGlrZSwKLSMgcmlnaHQgbm93KSBXQVJTVCA9PSBBUlQuLi4gdGhhdCBpcywgc2luY2UgbGFzdCBTdW5kYXksIGFsbCB0aGUgY291bnRyeQotIyBpcyB1c2luZyBVVEMtMywgYnV0IGluIG15IHBhdGNoLCBTYW4gTHVpcyBjYWxscyBpdCAiV0FSU1QiIGFuZCB0aGUgcmVzdAotIyBvZiB0aGUgY291bnRyeSBjYWxscyBpdCAiQVJUIi4KLSMgLi4uCi0KLSMgRnJvbSBBbGV4YW5kZXIgS3JpdmVueXNoZXYgKDIwMTAtMDQtMDkpOgotIyBBY2NvcmRpbmcgdG8gbmV3cyByZXBvcnRzIGZyb20gRWwgRGlhcmlvIGRlIGxhIFJlcHVibGljYSBQcm92aW5jZSBTYW4KLSMgTHVpcywgQXJnZW50aW5hIChzdGFuZGFyZCB0aW1lIFVUQy0wNCkgd2lsbCBrZWVwIERheWxpZ2h0IFNhdmluZyBUaW1lCi0jIGFmdGVyIEFwcmlsIDExLCAyMDEwLS13aWxsIGNvbnRpbnVlIHRvIGhhdmUgc2FtZSB0aW1lIGFzIHJlc3Qgb2YKLSMgQXJnZW50aW5hIChVVEMtMykgKG5vIERTVCkuCi0jCi0jIENvbmZpcm1hcm9uIGxhIHByJm9hY3V0ZTtycm9nYSBkZWwgaHVzbyBob3JhcmlvIGRlIHZlcmFubyAoU3BhbmlzaCkKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5lbGRpYXJpb2RlbGFyZXB1YmxpY2EuY29tL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTI5MzgzJkl0ZW1pZD05Ij4KLSMgaHR0cDovL3d3dy5lbGRpYXJpb2RlbGFyZXB1YmxpY2EuY29tL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTI5MzgzJkl0ZW1pZD05Ci0jIDwvYT4KLSMgb3IgKHNvbWUgRW5nbGlzaCB0cmFuc2xhdGlvbik6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDguaHRtbCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYXJnZW50aW5hMDguaHRtbAotIyA8L2E+Ci0KLSMgRnJvbSBNYXJpYW5vIEFic2F0eiAoMjAxMC0wNC0xMik6Ci0jIHllcy4uLkkgY2FuIGNvbmZpcm0gdGhpcy4uLmFuZCBnaXZlbiB0aGF0IFNhbiBMdWlzIGtlZXBzIGNhbGxpbmcKLSMgVVRDLTAzOjAwICJzdW1tZXIgdGltZSIsIHdlIHNob3VsZCd0IGp1c3QgbGV0IFNhbiBMdWlzIGdvIGJhY2sgdG8gIkFyZyIKLSMgcnVsZXMuLi5TYW4gTHVpcyBpcyBzdGlsbCB1c2luZyAiV2VzdGVybiBBUmdlbnRpbmEgVGltZSIgYW5kIGl0IGdvdAotIyBzdHVjayBvbiBTdW1tZXIgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGV2ZW4gdGhvdWdoIHRoZSBzdW1tZXIgaXMgb3Zlci4KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotIwotIyBCdWVub3MgQWlyZXMgKEJBKSwgQ2FwaXRhbCBGZWRlcmFsIChDRiksCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL0J1ZW5vc19BaXJlcyAtMzo1Mzo0OCAtIExNVCAxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgIyBDb3Jkb2JhIE1lYW4gVGltZQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBDb3Jkb2JhIChDQiksIFNhbnRhIEZlIChTRiksIEVudHJlIFJpb3MgKEVSKSwgQ29ycmllbnRlcyAoQ04pLCBNaXNpb25lcyAoTU4pLAotIyBDaGFjbyAoQ0MpLCBGb3Jtb3NhIChGTSksIFNhbnRpYWdvIGRlbCBFc3Rlcm8gKFNFKQotIwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgYWxzbyBtYWtlIHRoZSBmb2xsb3dpbmcgY2xhaW1zLCB3aGljaCB3ZSBoYXZlbid0IHZlcmlmaWVkOgotIyAtIEZvcm1vc2Egc3dpdGNoZWQgdG8gLTM6MDAgb24gMTk5MS0wMS0wNy4KLSMgLSBNaXNpb25lcyBzd2l0Y2hlZCB0byAtMzowMCBvbiAxOTkwLTEyLTI5LgotIyAtIENoYWNvIHN3aXRjaGVkIHRvIC0zOjAwIG9uIDE5OTEtMDEtMDQuCi0jIC0gU2FudGlhZ28gZGVsIEVzdGVybyBzd2l0Y2hlZCB0byAtNDowMCBvbiAxOTkxLTA0LTAxLAotIyAgIHRoZW4gdG8gLTM6MDAgb24gMTk5MS0wNC0yNi4KLSMKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvQ29yZG9iYSAtNDoxNjo0OCAtIExNVAkxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTkxIE1hciAgMwotCQkJLTQ6MDAJLQlXQVJUCTE5OTEgT2N0IDIwCi0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJQXJnCUFSJXNUCi0jCi0jIFNhbHRhIChTQSksIExhIFBhbXBhIChMUCksIE5ldXF1ZW4gKE5RKSwgUmlvIE5lZ3JvIChSTikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvU2FsdGEgLTQ6MjE6NDAgLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDMKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAyMAotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAotCQkJLTM6MDAJLQlBUlQKLSMKLSMgVHVjdW1hbiAoVE0pCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL1R1Y3VtYW4gLTQ6MjA6NTIgLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDMKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAyMAotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgSnVuICAxCi0JCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMTMKLQkJCS0zOjAwCUFyZwlBUiVzVAotIwotIyBMYSBSaW9qYSAoTFIpCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL0xhX1Jpb2phIC00OjI3OjI0IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTEgTWFyICAxCi0JCQktNDowMAktCVdBUlQJMTk5MSBNYXkgIDcKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IEp1biAgMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVuIDIwCi0JCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKLQkJCS0zOjAwCS0JQVJUCi0jCi0jIFNhbiBKdWFuIChTSikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvU2FuX0p1YW4gLTQ6MzQ6MDQgLSBMTVQJMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5Ci0JCQktNDowMAktCUFSVAkxOTMwIERlYwotCQkJLTQ6MDAJQXJnCUFSJXNUCTE5NjkgT2N0ICA1Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5MSBNYXIgIDEKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE1heSAgNwotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgTWF5IDMxCi0JCQktNDowMAktCVdBUlQJMjAwNCBKdWwgMjUKLQkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAotCQkJLTM6MDAJLQlBUlQKLSMKLSMgSnVqdXkgKEpZKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9KdWp1eSAtNDoyMToxMiAtCUxNVAkxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTkwIE1hciAgNAotCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDI4Ci0JCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyIDE3Ci0JCQktNDowMAktCVdBUlQJMTk5MSBPY3QgIDYKLQkJCS0zOjAwCTE6MDAJQVJTVAkxOTkyCi0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJQXJnCUFSJXNUCTIwMDggT2N0IDE4Ci0JCQktMzowMAktCUFSVAotIwotIyBDYXRhbWFyY2EgKENUKSwgQ2h1YnV0IChDSCkKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvQ2F0YW1hcmNhIC00OjIzOjA4IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTEgTWFyICAzCi0JCQktNDowMAktCVdBUlQJMTk5MSBPY3QgMjAKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IEp1biAgMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVuIDIwCi0JCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKLQkJCS0zOjAwCS0JQVJUCi0jCi0jIE1lbmRvemEgKE1aKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9NZW5kb3phIC00OjM1OjE2IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTAgTWFyICA0Ci0JCQktNDowMAktCVdBUlQJMTk5MCBPY3QgMTUKLQkJCS00OjAwCTE6MDAJV0FSU1QJMTk5MSBNYXIgIDEKLQkJCS00OjAwCS0JV0FSVAkxOTkxIE9jdCAxNQotCQkJLTQ6MDAJMTowMAlXQVJTVAkxOTkyIE1hciAgMQotCQkJLTQ6MDAJLQlXQVJUCTE5OTIgT2N0IDE4Ci0JCQktMzowMAlBcmcJQVIlc1QJMTk5OSBPY3QgIDMKLQkJCS00OjAwCUFyZwlBUiVzVAkyMDAwIE1hciAgMwotCQkJLTM6MDAJLQlBUlQJMjAwNCBNYXkgMjMKLQkJCS00OjAwCS0JV0FSVAkyMDA0IFNlcCAyNgotCQkJLTM6MDAJQXJnCUFSJXNUCTIwMDggT2N0IDE4Ci0JCQktMzowMAktCUFSVAotIwotIyBTYW4gTHVpcyAoU0wpCi0KLVJ1bGUJU2FuTHVpcwkyMDA4CTIwMDkJLQlNYXIJU3VuPj04CTA6MDAJMAktCi1SdWxlCVNhbkx1aXMJMjAwNwkyMDA5CS0JT2N0CVN1bj49OAkwOjAwCTE6MDAJUwotCi1ab25lIEFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzIC00OjI1OjI0IC0gTE1UCTE4OTQgT2N0IDMxCi0JCQktNDoxNjo0OCAtCUNNVAkxOTIwIE1heQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTAKLQkJCS0zOjAwCTE6MDAJQVJTVAkxOTkwIE1hciAxNAotCQkJLTQ6MDAJLQlXQVJUCTE5OTAgT2N0IDE1Ci0JCQktNDowMAkxOjAwCVdBUlNUCTE5OTEgTWFyICAxCi0JCQktNDowMAktCVdBUlQJMTk5MSBKdW4gIDEKLQkJCS0zOjAwCS0JQVJUCTE5OTkgT2N0ICAzCi0JCQktNDowMAkxOjAwCVdBUlNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IE1heSAzMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVsIDI1Ci0JCQktMzowMAlBcmcJQVIlc1QJMjAwOCBKYW4gMjEKLQkJCS00OjAwCVNhbkx1aXMJV0FSJXNUCi0jCi0jIFNhbnRhIENydXogKFNDKQotWm9uZSBBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MgLTQ6MzY6NTIgLSBMTVQgMTg5NCBPY3QgMzEKLQkJCS00OjE2OjQ4IC0JQ01UCTE5MjAgTWF5ICMgQ29yZG9iYSBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQVJUCTE5MzAgRGVjCi0JCQktNDowMAlBcmcJQVIlc1QJMTk2OSBPY3QgIDUKLQkJCS0zOjAwCUFyZwlBUiVzVAkxOTk5IE9jdCAgMwotCQkJLTQ6MDAJQXJnCUFSJXNUCTIwMDAgTWFyICAzCi0JCQktMzowMAktCUFSVAkyMDA0IEp1biAgMQotCQkJLTQ6MDAJLQlXQVJUCTIwMDQgSnVuIDIwCi0JCQktMzowMAlBcmcJQVIlc1QJMjAwOCBPY3QgMTgKLQkJCS0zOjAwCS0JQVJUCi0jCi0jIFRpZXJyYSBkZWwgRnVlZ28sIEFudGFydGlkYSBlIElzbGFzIGRlbCBBdGxhbnRpY28gU3VyIChURikKLVpvbmUgQW1lcmljYS9BcmdlbnRpbmEvVXNodWFpYSAtNDozMzoxMiAtIExNVCAxODk0IE9jdCAzMQotCQkJLTQ6MTY6NDggLQlDTVQJMTkyMCBNYXkgIyBDb3Jkb2JhIE1lYW4gVGltZQotCQkJLTQ6MDAJLQlBUlQJMTkzMCBEZWMKLQkJCS00OjAwCUFyZwlBUiVzVAkxOTY5IE9jdCAgNQotCQkJLTM6MDAJQXJnCUFSJXNUCTE5OTkgT2N0ICAzCi0JCQktNDowMAlBcmcJQVIlc1QJMjAwMCBNYXIgIDMKLQkJCS0zOjAwCS0JQVJUCTIwMDQgTWF5IDMwCi0JCQktNDowMAktCVdBUlQJMjAwNCBKdW4gMjAKLQkJCS0zOjAwCUFyZwlBUiVzVAkyMDA4IE9jdCAxOAotCQkJLTM6MDAJLQlBUlQKLQotIyBBcnViYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0FydWJhCS00OjQwOjI0IC0JTE1UCTE5MTIgRmViIDEyCSMgT3Jhbmplc3RhZAotCQkJLTQ6MzAJLQlBTlQJMTk2NSAjIE5ldGhlcmxhbmRzIEFudGlsbGVzIFRpbWUKLQkJCS00OjAwCS0JQVNUCi0KLSMgQm9saXZpYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0xhX1BhegktNDozMjozNiAtCUxNVAkxODkwCi0JCQktNDozMjozNiAtCUNNVAkxOTMxIE9jdCAxNSAjIENhbGFtYXJjYSBNVAotCQkJLTQ6MzI6MzYgMTowMAlCT1NUCTE5MzIgTWFyIDIxICMgQm9saXZpYSBTVAotCQkJLTQ6MDAJLQlCT1QJIyBCb2xpdmlhIFRpbWUKLQotIyBCcmF6aWwKLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTkzLTExLTE4KToKLSMgVGhlIG1heW9yIG9mIFJpbyByZWNlbnRseSBhdHRlbXB0ZWQgdG8gY2hhbmdlIHRoZSB0aW1lIHpvbmUgcnVsZXMKLSMganVzdCBpbiBoaXMgY2l0eSwgaW4gb3JkZXIgdG8gbGVhdmUgbW9yZSBzdW1tZXIgdGltZSBmb3IgdGhlIHRvdXJpc3QgdHJhZGUuCi0jIFRoZSBydWxlIGNoYW5nZSBsYXN0ZWQgb25seSBwYXJ0IG9mIHRoZSBkYXk7Ci0jIHRoZSBmZWRlcmFsIGdvdmVybm1lbnQgcmVmdXNlZCB0byBmb2xsb3cgdGhlIGNpdHkncyBydWxlcywgYW5kIGJ1c2luZXNzCi0jIHdhcyBpbiBhIGNoYW9zLCBzbyB0aGUgbWF5b3IgYmFja2VkIGRvd24gdGhhdCBhZnRlcm5vb24uCi0KLSMgRnJvbSBJQVRBIFNTSU0gKDE5OTYtMDIpOgotIyBfT25seV8gdGhlIGZvbGxvd2luZyBzdGF0ZXMgaW4gQlIxIG9ic2VydmUgRFNUOiBSaW8gR3JhbmRlIGRvIFN1bCAoUlMpLAotIyBTYW50YSBDYXRhcmluYSAoU0MpLCBQYXJhbmEgKFBSKSwgU2FvIFBhdWxvIChTUCksIFJpbyBkZSBKYW5laXJvIChSSiksCi0jIEVzcGlyaXRvIFNhbnRvIChFUyksIE1pbmFzIEdlcmFpcyAoTUcpLCBCYWhpYSAoQkEpLCBHb2lhcyAoR08pLAotIyBEaXN0cml0byBGZWRlcmFsIChERiksIFRvY2FudGlucyAoVE8pLCBTZXJnaXBlIFtTRV0gYW5kIEFsYWdvYXMgW0FMXS4KLSMgW1RoZSBsYXN0IHRocmVlIHN0YXRlcyBhcmUgbmV3IHRvIHRoaXMgaXNzdWUgb2YgdGhlIElBVEEgU1NJTS5dCi0KLSMgRnJvbSBHd2lsbGltIExhdyAoMTk5Ni0xMC0wNyk6Ci0jIEdlb2dyYXBoeSwgaGlzdG9yeSAoVG9jYW50aW5zIHdhcyBwYXJ0IG9mIEdvaWFzIHVudGlsIDE5ODkpLCBhbmQgb3RoZXIKLSMgc291cmNlcyBvZiB0aW1lIHpvbmUgaW5mb3JtYXRpb24gbGVhZCBtZSB0byBiZWxpZXZlIHRoYXQgQUwsIFNFLCBhbmQgVE8gd2VyZQotIyBhbHdheXMgaW4gQlIxLCBhbmQgc28gdGhlIG9ubHkgY2hhbmdlIHdhcyB3aGV0aGVyIG9yIG5vdCB0aGV5IG9ic2VydmVkIERTVC4uLi4KLSMgVGhlIGVhcmxpZXN0IGlzc3VlIG9mIHRoZSBTU0lNIEkgaGF2ZSBpcyAyLzkxLiAgRWFjaCBpc3N1ZSBmcm9tIHRoZW4gdW50aWwKLSMgOS85NSBzYXlzIHRoYXQgRFNUIGlzIG9ic2VydmVkIG9ubHkgaW4gdGhlIHRlbiBzdGF0ZXMgSSBxdW90ZWQgZnJvbSA5Lzk1LAotIyBhbG9uZyB3aXRoIE1hdG8gR3Jvc3NvIChNVCkgYW5kIE1hdG8gR3Jvc3NvIGRvIFN1bCAoTVMpLCB3aGljaCBhcmUgaW4gQlIyCi0jIChVVEMtNCkuLi4uICBUaGUgb3RoZXIgdHdvIHRpbWUgem9uZXMgZ2l2ZW4gZm9yIEJyYXppbCBhcmUgQlIzLCB3aGljaCBpcwotIyBVVEMtNSwgbm8gRFNULCBhbmQgYXBwbGllcyBvbmx5IGluIHRoZSBzdGF0ZSBvZiBBY3JlIChBQyk7IGFuZCBCUjQsIHdoaWNoIGlzCi0jIFVUQy0yLCBhbmQgYXBwbGllcyB0byBGZXJuYW5kbyBkZSBOb3JvbmhhIChmb3JtZXJseSBGTiwgYnV0IEkgYmVsaWV2ZSBpdCdzCi0jIGJlY29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSBvZiBQZXJuYW1idWNvKS4gIFRoZSBib3VuZGFyeSBiZXR3ZWVuIEJSMSBhbmQgQlIyCi0jIGhhcyBuZXZlciBiZWVuIGNsZWFybHkgc3RhdGVkLiAgVGhleSd2ZSBzaW1wbHkgYmVlbiBjYWxsZWQgRWFzdCBhbmQgV2VzdC4KLSMgSG93ZXZlciwgc29tZSBjb25jbHVzaW9ucyBjYW4gYmUgZHJhd24gZnJvbSBhbm90aGVyIElBVEEgbWFudWFsOiB0aGUgQWlybGluZQotIyBDb2RpbmcgRGlyZWN0b3J5LCB3aGljaCBsaXN0cyBjbG9zZSB0byA0MDAgYWlycG9ydHMgaW4gQnJhemlsLiAgRm9yIGVhY2gKLSMgYWlycG9ydCBpdCBnaXZlcyBhIHRpbWUgem9uZSB3aGljaCBpcyBjb2RlZCB0byB0aGUgU1NJTS4gIEZyb20gdGhhdAotIyBpbmZvcm1hdGlvbiwgSSdtIGxlZCB0byBjb25jbHVkZSB0aGF0IHRoZSBzdGF0ZXMgb2YgQW1hcGEgKEFQKSwgQ2VhcmEgKENFKSwKLSMgTWFyYW5oYW8gKE1BKSwgUGFyYWliYSAoUFIpLCBQZXJuYW1idWNvIChQRSksIFBpYXVpIChQSSksIGFuZCBSaW8gR3JhbmRlIGRvCi0jIE5vcnRlIChSTiksIGFuZCB0aGUgZWFzdGVybiBwYXJ0IG9mIFBhcmEgKFBBKSBhcmUgYWxsIGluIEJSMSB3aXRob3V0IERTVC4KLQotIyBGcm9tIE1hcmNvcyBUYWRldSAoMTk5OC0wOS0yNyk6Ci0jIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL3ZlcmFvMS5odG1sIj4KLSMgQnJhemlsaWFuIG9mZmljaWFsIHBhZ2UKLSMgPC9hPgotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkICgyMDAwLTExLTAzKToKLSMgW0ZvciBhbiBvZmZpY2lhbCBsaXN0IG9mIHdoaWNoIHJlZ2lvbnMgaW4gQnJhemlsIHVzZSB3aGljaCB0aW1lIHpvbmVzLCBzZWU6XQotIyBodHRwOi8vcGNkc2gwMS5vbi5ici9GdXNici5odG0KLSMgaHR0cDovL3BjZHNoMDEub24uYnIvRnVzYnJodi5odG0KLQotIyBGcm9tIENlbHNvIERvcmlhIHZpYSBEYXZpZCBNYWRlbyAoMjAwMi0xMC0wOSk6Ci0jIFRoZSByZWFzb24gZm9yIHRoZSBkZWxheSB0aGlzIHllYXIgaGFzIHRvIGRvIHdpdGggZWxlY3Rpb25zIGluIEJyYXppbC4KLSMKLSMgVW5saWtlIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBlbGVjdGlvbnMgaW4gQnJhemlsIGFyZSAxMDAlIGNvbXB1dGVyaXplZCBhbmQKLSMgdGhlIHJlc3VsdHMgYXJlIGtub3duIGFsbW9zdCBpbW1lZGlhdGVseS4gIFllc3RlcmRheSwgaXQgd2FzIHRoZSBmaXJzdAotIyByb3VuZCBvZiB0aGUgZWxlY3Rpb25zIHdoZW4gMTE1IG1pbGxpb24gQnJhemlsaWFucyB2b3RlZCBmb3IgUHJlc2lkZW50LAotIyBHb3Zlcm5vciwgU2VuYXRvcnMsIEZlZGVyYWwgRGVwdXRpZXMsIGFuZCBTdGF0ZSBEZXB1dGllcy4gIE5vYm9keSBpcwotIyBjb3VudGluZyAob3IgcmUtY291bnRpbmcpIHZvdGVzIGFueW1vcmUgYW5kIHdlIGtub3cgdGhlcmUgd2lsbCBiZSBhIHNlY29uZAotIyByb3VuZCBmb3IgdGhlIFByZXNpZGVuY3kgYW5kIGFsc28gZm9yIHNvbWUgR292ZXJub3JzLiAgVGhlIDJuZCByb3VuZCB3aWxsCi0jIHRha2UgcGxhY2Ugb24gT2N0b2JlciAyN3RoLgotIwotIyBUaGUgcmVhc29uIHdoeSB0aGUgRFNUIHdpbGwgb25seSBiZWdpbiBOb3ZlbWJlciAzcmQgaXMgdGhhdCB0aGUgdGhvdXNhbmRzCi0jIG9mIGVsZWN0b3JhbCBtYWNoaW5lcyB1c2VkIGNhbm5vdCBoYXZlIHRoZWlyIHRpbWUgY2hhbmdlZCwgYW5kIHNpbmNlIHRoZQotIyBDb25zdGl0dXRpb24gc2F5cyB0aGUgZWxlY3Rpb25zIG11c3QgYmVnaW4gYXQgODowMCBBTSBhbmQgZW5kIGF0IDU6MDAgUE0sCi0jIHRoZSBHb3Zlcm5tZW50IGRlY2lkZWQgdG8gcG9zdHBvbmUgRFNULCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBDb25zdGl0dXRpb24KLSMgKG1heWJlLCBmb3IgdGhlIG5leHQgZWxlY3Rpb25zLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgY2xvY2spLi4uCi0KLSMgRnJvbSBSb2RyaWdvIFNldmVybyAoMjAwNC0xMC0wNCk6Ci0jIEl0J3MganVzdCB0aGUgYmlhbm51YWwgY2hhbmdlIG1hZGUgbmVjZXNzYXJ5IGJ5IHRoZSBtdWNoIGh5cGVkLCBzdXBwb3NlZGx5Ci0jIG1vZGVybiBCcmF6aWxpYW4gZWxldHJvbmljIHZvdGluZyBtYWNoaW5lcyB3aGljaCwgYXBwYXJlbnRseSwgY2FuJ3QgZGVhbAotIyB3aXRoIGEgdGltZSBjaGFuZ2UgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcm91bmRzIG9mIHRoZSBlbGVjdGlvbnMuCi0KLSMgRnJvbSBTdGVmZmVuIFRob3JzZW4gKDIwMDctMDktMjApOgotIyBCcmF6aWwgd2lsbCBzdGFydCBEU1Qgb24gMjAwNy0xMC0xNCAwMDowMCBhbmQgZW5kIG9uIDIwMDgtMDItMTcgMDA6MDA6Ci0jIGh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvO2pzZXNzaW9uaWQ9QkJBMDY4MTFBRkNBQUMyOEYwMjg1MjEwOTEzNTEzREE/bmV3c0lkPTEzOTc1Ci0KLSMgRnJvbSBQYXVsIFNjaHVsemUgKDIwMDgtMDYtMjQpOgotIyAuLi5ieSBsYXcgbnVtYmVyIDExLjY2MiBvZiBBcHJpbCAyNCwgMjAwOCAocHVibGlzaGVkIGluIHRoZSAiRGlhcmlvCi0jIE9maWNpYWwgZGEgVW5pYW8iLi4uKSBpbiBCcmF6aWwgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIHRpbWV6b25lcywKLSMgZWZmZWN0aXZlIHRvZGF5ICgwMDowMGFtIGF0IEp1bmUgMjQsIDIwMDgpIGFzIGZvbGxvd3M6Ci0jCi0jIGEpIFRoZSB0aW1lem9uZSBVVEMrNSBpcyBlW3hddGluZ3Vpc2hlZCwgd2l0aCBhbGwgdGhlIEFjcmUgc3RhdGUgYW5kIHRoZQotIyBwYXJ0IG9mIHRoZSBBbWF6b25hcyBzdGF0ZSB0aGF0IGhhZCB0aGlzIHRpbWV6b25lIG5vdyBiZWluZyBwdXQgdG8gdGhlCi0jIHRpbWV6b25lIFVUQys0Ci0jIGIpIFRoZSB3aG9sZSBQYXJhIHN0YXRlIG5vdyBpcyBwdXQgYXQgdGltZXpvbmUgVVRDKzMsIGluc3RlYWQgb2YganVzdAotIyBwYXJ0IG9mIGl0LCBhcyB3YXMgYmVmb3JlLgotIwotIyBUaGlzIGNoYW5nZSBmb2xsb3dzIGEgcHJvcG9zYWwgb2Ygc2VuYXRvciBUaWFvIFZpYW5hIG9mIEFjcmUgc3RhdGUsIHRoYXQKLSMgcHJvcG9zZWQgaXQgZHVlIHRvIGNvbmNlcm5zIGFib3V0IG9wZW4gdGVsZXZpc2lvbiBjaGFubmVscyBkaXNwbGF5aW5nCi0jIHByb2dyYW1zIGluYXBwcm9wcmlhdGUgdG8geW91dGhzIGluIHRoZSBzdGF0ZXMgdGhhdCBoYWQgdGhlIHRpbWV6b25lCi0jIFVUQys1IHRvbyBlYXJseSBpbiB0aGUgbmlnaHQuIEluIHRoZSBvY2Nhc2lvbiwgc29tZSBtb3JlIGNvcnJlY3Rpb25zCi0jIHdlcmUgcHJvcG9zZWQsIHRyeWluZyB0byB1bmlmeSB0aGUgdGltZXpvbmVzIG9mIGFueSBnaXZlbiBzdGF0ZS4gVGhpcwotIyBjaGFuZ2UgbW9kaWZpZXMgdGltZXpvbmUgcnVsZXMgZGVmaW5lZCBpbiBkZWNyZWUgMi43ODQgb2YgMTggSnVuZSwKLSMgMTkxMy4KLQotIyBGcm9tIFJvZHJpZ28gU2V2ZXJvICgyMDA4LTA2LTI0KToKLSMgSnVzdCBjb3JyZWN0aW5nIHRoZSBVUkw6Ci0jIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOCI+Ci0jIGh0dHBzOi8vd3d3LmluLmdvdi5ici9pbXByZW5zYS92aXN1YWxpemEvaW5kZXguanNwP2pvcm5hbD1kbyZzZWNhbz0xJnBhZ2luYT0xJmRhdGE9MjUvMDQvMjAwOAotIyA8L2E+Ci0jCi0jIEFzIGEgcmVzdWx0IG9mIHRoZSBhYm92ZSBEZWNyZWUgSSBiZWxpZXZlIHRoZSBBbWVyaWNhL1Jpb19CcmFuY28KLSMgdGltZXpvbmUgc2hhbGwgYmUgbW9kaWZpZWQgZnJvbSBVVEMtNSB0byBVVEMtNCBhbmQgYSBuZXcgdGltZXpvbmUgc2hhbGwKLSMgYmUgY3JlYXRlZCB0byByZXByZXNlbnQgdGhlIHRoZSB3ZXN0IHNpZGUgb2YgdGhlIFBhcmEgU3RhdGUuIEkKLSMgc3VnZ2VzdCB0aGlzIG5ldyB0aW1lem9uZSBiZSBjYWxsZWQgU2FudGFyZW0gYXMgdGhlIG1vc3QKLSMgaW1wb3J0YW50L3BvcHVsYXRlZCBjaXR5IGluIHRoZSBhZmZlY3RlZCBhcmVhLgotIwotIyBUaGlzIG5ldyB0aW1lem9uZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgUmlvX0JyYW5jbyB0aW1lem9uZSB1cCB0bwotIyB0aGUgMjAwOC8wNi8yNCBjaGFuZ2Ugd2hpY2ggd291bGQgYmUgdG8gVVRDLTMgaW5zdGVhZCBvZiBVVEMtNC4KLQotIyBGcm9tIEFsZXggS3JpdmVueXNoZXYgKDIwMDgtMDYtMjQpOgotIyBUaGlzIGlzIGEgcXVpY2sgcmVmZXJlbmNlIHBhZ2UgZm9yIE5ldyBhbmQgT2xkIEJyYXppbCBUaW1lIFpvbmVzIG1hcC4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9icmF6aWwtdGltZS1uZXctb2xkLnBocCI+Ci0jIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vYnJhemlsLXRpbWUtbmV3LW9sZC5waHAKLSMgPC9hPgotIwotIyAtIDQgdGltZSB6b25lcyByZXBsYWNlZCBieSAzIHRpbWUgem9uZXMtZWxpbWluYXRpbmcgdGltZSB6b25lIFVUQy0gMDUKLSMgKHN0YXRlIEFjcmUgYW5kIHRoZSBwYXJ0IG9mIHRoZSBBbWF6b25hcyB3aWxsIGJlIFVUQy9HTVQtIDA0KSAtIHdlc3Rlcm4KLSMgcGFydCBvZiBQYXIgc3RhdGUgaXMgbW92aW5nIHRvIG9uZSB0aW1lem9uZSBVVEMtIDAzIChmcm9tIFVUQyAtMDQpLgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDItMTAtMTApOgotIyBUaGUgb2ZmaWNpYWwgZGVjcmVlcyByZWZlcmVuY2VkIGJlbG93IGFyZSBtb3N0bHkgdGFrZW4gZnJvbQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sIj4KLSMgRGVjcmV0b3Mgc29icmUgbyBIb3JhcmlvIGRlIFZlcmFvIG5vIEJyYXNpbAotIyA8L2E+LgotCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA4LTA4LTI5KToKLSMgQXMgYW5ub3VuY2VkIGJ5IHRoZSBnb3Zlcm5tZW50IGFuZCBtYW55IG5ld3NwYXBlcnMgaW4gQnJhemlsIGxhdGUKLSMgeWVzdGVyZGF5LCBCcmF6aWwgd2lsbCBzdGFydCBEU1Qgb24gMjAwOC0xMC0xOSAobmVlZCB0byBjaGFuZ2UgcnVsZSkgYW5kCi0jIGl0IHdpbGwgZW5kIG9uIDIwMDktMDItMTUgKGN1cnJlbnQgcnVsZSBmb3IgQnJhemlsIGlzIGZpbmUpLiBCYXNlZCBvbgotIyBwYXN0IHllYXJzIGV4cGVyaWVuY2Ugd2l0aCB0aGUgZWxlY3Rpb25zLCB0aGVyZSB3YXMgYSBnb29kIGNoYW5jZSB0aGF0Ci0jIHRoZSBzdGFydCB3YXMgcG9zdHBvbmVkIHRvIE5vdmVtYmVyLCBidXQgaXQgZGlkIG5vdCBoYXBwZW4gdGhpcyB5ZWFyLgotIwotIyBJdCBoYXMgbm90IHlldCBiZWVuIHBvc3RlZCB0byBodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVi5odG1sCi0jCi0jIEFuIG9mZmljaWFsIHBhZ2UgYWJvdXQgaXQ6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMiI+Ci0jIGh0dHA6Ly93d3cubW1lLmdvdi5ici9zaXRlL25ld3MvZGV0YWlsLmRvP25ld3NJZD0xNjcyMgotIyA8L2E+Ci0jIE5vdGUgdGhhdCB0aGlzIGxpbmsgZG9lcyBub3QgYWx3YXlzIHdvcmsgZGlyZWN0bHksIGJ1dCBtdXN0IGJlIGFjY2Vzc2VkCi0jIGJ5IGdvaW5nIHRvCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdCI+Ci0jIGh0dHA6Ly93d3cubW1lLmdvdi5ici9maXJzdAotIyA8L2E+Ci0jCi0jIE9uZSBleGFtcGxlIGxpbmsgdGhhdCB3b3JrcyBkaXJlY3RseToKLSMgPGEgaHJlZj0iaHR0cDovL2pvcm5hbGUuY29tLmJyL2luZGV4LnBocD9vcHRpb249Y29tX2NvbnRlbnQmdGFzaz12aWV3JmlkPTEzNTMwJkl0ZW1pZD01NCI+Ci0jIGh0dHA6Ly9qb3JuYWxlLmNvbS5ici9pbmRleC5waHA/b3B0aW9uPWNvbV9jb250ZW50JnRhc2s9dmlldyZpZD0xMzUzMCZJdGVtaWQ9NTQKLSMgKFBvcnR1Z3Vlc2UpCi0jIDwvYT4KLSMKLSMgV2UgaGF2ZSBhIHdyaXR0ZW4gYSBzaG9ydCBhcnRpY2xlIGFib3V0IGl0IGFzIHdlbGw6Ci0jIDxhIGhyZWY9Imh0dHA6Ly93d3cudGltZWFuZGRhdGUuY29tL25ld3MvdGltZS9icmF6aWwtZHN0LTIwMDgtMjAwOS5odG1sIj4KLSMgaHR0cDovL3d3dy50aW1lYW5kZGF0ZS5jb20vbmV3cy90aW1lL2JyYXppbC1kc3QtMjAwOC0yMDA5Lmh0bWwKLSMgPC9hPgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyMDQ2Ni5odG0iPjIwLDQ2NjwvYT4gKDE5MzEtMTAtMDEpCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIxODk2Lmh0bSI+MjEsODk2PC9hPiAoMTkzMi0wMS0xMCkKLVJ1bGUJQnJhemlsCTE5MzEJb25seQktCU9jdAkgMwkxMTowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTE5MzIJMTkzMwktCUFwcgkgMQkgMDowMAkwCS0KLVJ1bGUJQnJhemlsCTE5MzIJb25seQktCU9jdAkgMwkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjMxOTUuaHRtIj4yMywxOTU8L2E+ICgxOTMzLTEwLTEwKQotIyByZXZva2VkIERTVC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMjc0OTYuaHRtIj4yNyw0OTY8L2E+ICgxOTQ5LTExLTI0KQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYyNzk5OC5odG0iPjI3LDk5ODwvYT4gKDE5NTAtMDQtMTMpCi1SdWxlCUJyYXppbAkxOTQ5CTE5NTIJLQlEZWMJIDEJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTUwCW9ubHkJLQlBcHIJMTYJIDE6MDAJMAktCi1SdWxlCUJyYXppbAkxOTUxCTE5NTIJLQlBcHIJIDEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjMyMzA4Lmh0bSI+MzIsMzA4PC9hPiAoMTk1My0wMi0yNCkKLVJ1bGUJQnJhemlsCTE5NTMJb25seQktCU1hcgkgMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWMzQ3MjQuaHRtIj4zNCw3MjQ8L2E+ICgxOTUzLTExLTMwKQotIyByZXZva2VkIERTVC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTI3MDAuaHRtIj41Miw3MDA8L2E+ICgxOTYzLTEwLTE4KQotIyBlc3RhYmxpc2hlZCBEU1QgZnJvbSAxOTYzLTEwLTIzIDAwOjAwIHRvIDE5NjQtMDItMjkgMDA6MDAKLSMgaW4gU1AsIFJKLCBHQiwgTUcsIEVTLCBkdWUgdG8gdGhlIHByb2xvbmdhdGlvbiBvZiB0aGUgZHJvdWdodC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTMwNzEuaHRtIj41MywwNzE8L2E+ICgxOTYzLTEyLTAzKQotIyBleHRlbmRlZCB0aGUgYWJvdmUgZGVjcmVlIHRvIGFsbCBvZiB0aGUgbmF0aW9uYWwgdGVycml0b3J5IG9uIDEyLTA5LgotUnVsZQlCcmF6aWwJMTk2Mwlvbmx5CS0JRGVjCSA5CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1MzYwNC5odG0iPjUzLDYwNDwvYT4gKDE5NjQtMDItMjUpCi0jIGV4dGVuZGVkIHN1bW1lciB0aW1lIGJ5IG9uZSBkYXkgdG8gMTk2NC0wMy0wMSAwMDowMCAoc3RhcnQgb2Ygc2Nob29sKS4KLVJ1bGUJQnJhemlsCTE5NjQJb25seQktCU1hcgkgMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNTU2MzkuaHRtIj41NSw2Mzk8L2E+ICgxOTY1LTAxLTI3KQotUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JSmFuCTMxCSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk2NQlvbmx5CS0JTWFyCTMxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY1NzMwMy5odG0iPjU3LDMwMzwvYT4gKDE5NjUtMTEtMjIpCi1SdWxlCUJyYXppbAkxOTY1CW9ubHkJLQlEZWMJIDEJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjU3ODQzLmh0bSI+NTcsODQzPC9hPiAoMTk2Ni0wMi0xOCkKLVJ1bGUJQnJhemlsCTE5NjYJMTk2OAktCU1hcgkgMQkgMDowMAkwCS0KLVJ1bGUJQnJhemlsCTE5NjYJMTk2NwktCU5vdgkgMQkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWNjM0MjkuaHRtIj42Myw0Mjk8L2E+ICgxOTY4LTEwLTE1KQotIyByZXZva2VkIERTVC4KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0hWOTE2OTguaHRtIj45MSw2OTg8L2E+ICgxOTg1LTA5LTI3KQotUnVsZQlCcmF6aWwJMTk4NQlvbmx5CS0JTm92CSAyCSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgOTIsMzEwICgxOTg2LTAxLTIxKQotIyBEZWNyZWUgOTIsNDYzICgxOTg2LTAzLTEzKQotUnVsZQlCcmF6aWwJMTk4Nglvbmx5CS0JTWFyCTE1CSAwOjAwCTAJLQotIyBEZWNyZWUgOTMsMzE2ICgxOTg2LTEwLTAxKQotUnVsZQlCcmF6aWwJMTk4Nglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk4Nwlvbmx5CS0JRmViCTE0CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDkyMi5odG0iPjk0LDkyMjwvYT4gKDE5ODctMDktMjIpCi1SdWxlCUJyYXppbAkxOTg3CW9ubHkJLQlPY3QJMjUJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkxOTg4CW9ubHkJLQlGZWIJIDcJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjk2Njc2Lmh0bSI+OTYsNjc2PC9hPiAoMTk4OC0wOS0xMikKLSMgZXhjZXB0IGZvciB0aGUgc3RhdGVzIG9mIEFDLCBBTSwgUEEsIFJSLCBSTywgYW5kIEFQICh0aGVuIGEgdGVycml0b3J5KQotUnVsZQlCcmF6aWwJMTk4OAlvbmx5CS0JT2N0CTE2CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk4OQlvbmx5CS0JSmFuCTI5CSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5ODA3Ny5odG0iPjk4LDA3NzwvYT4gKDE5ODktMDgtMjEpCi0jIHdpdGggdGhlIHNhbWUgZXhjZXB0aW9ucwotUnVsZQlCcmF6aWwJMTk4OQlvbmx5CS0JT2N0CTE1CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JRmViCTExCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5OTUzMC5odG0iPjk5LDUzMDwvYT4gKDE5OTAtMDktMTcpCi0jIGFkb3B0ZWQgYnkgUlMsIFNDLCBQUiwgU1AsIFJKLCBFUywgTUcsIEdPLCBNUywgREYuCi0jIERlY3JlZSA5OSw2MjkgKDE5OTAtMTAtMTkpIGFkZHMgQkEsIE1ULgotUnVsZQlCcmF6aWwJMTk5MAlvbmx5CS0JT2N0CTIxCSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5MQlvbmx5CS0JRmViCTE3CSAwOjAwCTAJLQotIyA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE5OTEuaHRtIj5Vbm51bWJlcmVkIGRlY3JlZTwvYT4gKDE5OTEtMDktMjUpCi0jIGFkb3B0ZWQgYnkgUlMsIFNDLCBQUiwgU1AsIFJKLCBFUywgTUcsIEJBLCBHTywgTVQsIE1TLCBERi4KLVJ1bGUJQnJhemlsCTE5OTEJb25seQktCU9jdAkyMAkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTE5OTIJb25seQktCUZlYgkgOQkgMDowMAkwCS0KLSMgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxOTkyLmh0bSI+VW5udW1iZXJlZCBkZWNyZWU8L2E+ICgxOTkyLTEwLTE2KQotIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLgotUnVsZQlCcmF6aWwJMTk5Mglvbmx5CS0JT2N0CTI1CSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5Mwlvbmx5CS0JSmFuCTMxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFY5NDIuaHRtIj45NDI8L2E+ICgxOTkzLTA5LTI4KQotIyBhZG9wdGVkIGJ5IHNhbWUgc3RhdGVzLCBwbHVzIEFNLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxMjUyLmh0bSI+MSwyNTI8L2E+ICgxOTk0LTA5LTIyOwotIyB3ZWIgcGFnZSBjb3JyZWN0ZWQgMjAwNC0wMS0wNykgYWRvcHRlZCBieSBzYW1lIHN0YXRlcywgbWludXMgQU0uCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjE2MzYuaHRtIj4xLDYzNjwvYT4gKDE5OTUtMDktMTQpCi0jIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIHBsdXMgTVQgYW5kIFRPLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvSFYxNjc0Lmh0bSI+MSw2NzQ8L2E+ICgxOTk1LTEwLTEzKQotIyBhZGRzIEFMLCBTRS4KLVJ1bGUJQnJhemlsCTE5OTMJMTk5NQktCU9jdAlTdW4+PTExCSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5NAkxOTk1CS0JRmViCVN1bj49MTUJIDA6MDAJMAktCi1SdWxlCUJyYXppbAkxOTk2CW9ubHkJLQlGZWIJMTEJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9IVjIwMDAuaHRtIj4yLDAwMDwvYT4gKDE5OTYtMDktMDQpCi0jIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMsIG1pbnVzIEFMLCBTRS4KLVJ1bGUJQnJhemlsCTE5OTYJb25seQktCU9jdAkgNgkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTE5OTcJb25seQktCUZlYgkxNgkgMDowMAkwCS0KLSMgRnJvbSBEYW5pZWwgQy4gU29icmFsICgxOTk4LTAyLTEyKToKLSMgSW4gMTk5NywgdGhlIERTIGJlZ2FuIG9uIE9jdG9iZXIgNi4gVGhlIHN0YXRlZCByZWFzb24gd2FzIHRoYXQKLSMgYmVjYXVzZSBpbnRlcm5hdGlvbmFsIHRlbGV2aXNpb24gbmV0d29ya3MgaWdub3JlZCBCcmF6aWwncyBwb2xpY3kgb24gRFMsCi0jIHRoZXkgYm91Z2h0IHRoZSB3cm9uZyB0aW1lcyBvbiBzYXRlbGxpdGUgZm9yIGNvdmVyYWdlIG9mIFBvcGUncyB2aXNpdC4KLSMgVGhpcyB5ZWFyLCB0aGUgZW5kaW5nIGRhdGUgb2YgRFMgd2FzIHBvc3Rwb25lZCB0byBNYXJjaCAxCi0jIHRvIGhlbHAgZGVhbGluZyB3aXRoIHRoZSBzaG9ydGFnZXMgb2YgZWxlY3RyaWMgcG93ZXIuCi0jCi0jIERlY3JlZSAyLDMxNyAoMTk5Ny0wOS0wNCksIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCi1SdWxlCUJyYXppbAkxOTk3CW9ubHkJLQlPY3QJIDYJIDA6MDAJMTowMAlTCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9maWd1cmFzL0hWMjQ5NS5KUEciPjIsNDk1PC9hPgotIyAoMTk5OC0wMi0xMCkKLVJ1bGUJQnJhemlsCTE5OTgJb25seQktCU1hcgkgMQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL2ZpZ3VyYXMvSHY5OC5qcGciPjIsNzgwPC9hPiAoMTk5OC0wOS0xMSkKLSMgYWRvcHRlZCBieSB0aGUgc2FtZSBzdGF0ZXMgYXMgYmVmb3JlLgotUnVsZQlCcmF6aWwJMTk5OAlvbmx5CS0JT2N0CTExCSAwOjAwCTE6MDAJUwotUnVsZQlCcmF6aWwJMTk5OQlvbmx5CS0JRmViCTIxCSAwOjAwCTAJLQotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjMxNTAuZ2lmIj4zLDE1MDwvYT4KLSMgKDE5OTktMDgtMjMpIGFkb3B0ZWQgYnkgc2FtZSBzdGF0ZXMuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWNIVjk5LmdpZiI+MywxODg8L2E+ICgxOTk5LTA5LTMwKQotIyBhZGRzIFNFLCBBTCwgUEIsIFBFLCBSTiwgQ0UsIFBJLCBNQSBhbmQgUlIuCi1SdWxlCUJyYXppbAkxOTk5CW9ubHkJLQlPY3QJIDMJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkyMDAwCW9ubHkJLQlGZWIJMjcJIDA6MDAJMAktCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9ERUMzNTkyLmh0bSI+Myw1OTI8L2E+ICgyMDAwLTA5LTA2KQotIyBhZG9wdGVkIGJ5IHRoZSBzYW1lIHN0YXRlcyBhcyBiZWZvcmUuCi0jIERlY3JlZSA8YSBocmVmPSJodHRwOi8vcGNkc2gwMS5vbi5ici9EZWMzNjMwLmpwZyI+Myw2MzA8L2E+ICgyMDAwLTEwLTEzKQotIyByZXBlYWxzIERTVCBpbiBQRSBhbmQgUlIsIGVmZmVjdGl2ZSAyMDAwLTEwLTE1IDAwOjAwLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvRGVjMzYzMi5qcGciPjMsNjMyPC9hPiAoMjAwMC0xMC0xNykKLSMgcmVwZWFscyBEU1QgaW4gU0UsIEFMLCBQQiwgUk4sIENFLCBQSSBhbmQgTUEsIGVmZmVjdGl2ZSAyMDAwLTEwLTIyIDAwOjAwLgotIyBEZWNyZWUgPGEgaHJlZj0iaHR0cDovL3BjZHNoMDEub24uYnIvZmlndXJhcy9IVjM5MTYuZ2lmIj4zLDkxNjwvYT4KLSMgKDIwMDEtMDktMTMpIHJlZXN0YWJsaXNoZXMgRFNUIGluIEFMLCBDRSwgTUEsIFBCLCBQRSwgUEksIFJOLCBTRS4KLVJ1bGUJQnJhemlsCTIwMDAJMjAwMQktCU9jdAlTdW4+PTgJIDA6MDAJMTowMAlTCi1SdWxlCUJyYXppbAkyMDAxCTIwMDYJLQlGZWIJU3VuPj0xNQkgMDowMAkwCS0KLSMgRGVjcmVlIDQsMzk5ICgyMDAyLTEwLTAxKSByZXBlYWxzIERTVCBpbiBBTCwgQ0UsIE1BLCBQQiwgUEUsIFBJLCBSTiwgU0UuCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LmJyL0NDSVZJTC9kZWNyZXRvLzIwMDIvRDQzOTkuaHRtIj40LDM5OTwvYT4KLVJ1bGUJQnJhemlsCTIwMDIJb25seQktCU5vdgkgMwkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDQsODQ0ICgyMDAzLTA5LTI0OyBjb3JyZWN0ZWQgMjAwMy0wOS0yNikgcmVwZWFscyBEU1QgaW4gQkEsIE1ULCBUTy4KLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5nb3YuYnIvQ0NJVklML2RlY3JldG8vMjAwMy9ENDg0NC5odG0iPjQsODQ0PC9hPgotUnVsZQlCcmF6aWwJMjAwMwlvbmx5CS0JT2N0CTE5CSAwOjAwCTE6MDAJUwotIyBEZWNyZWUgNSwyMjMgKDIwMDQtMTAtMDEpIHJlZXN0YWJsaXNoZXMgRFNUIGluIE1ULgotIyA8YSBocmVmPSJodHRwOi8vd3d3LnBsYW5hbHRvLmdvdi5ici9jY2l2aWxfMDMvX0F0bzIwMDQtMjAwNi8yMDA0L0RlY3JldG8vRDUyMjMuaHRtIj41LDIyMzwvYT4KLVJ1bGUJQnJhemlsCTIwMDQJb25seQktCU5vdgkgMgkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTUzOS5naWYiPjUsNTM5PC9hPiAoMjAwNS0wOS0xOSksCi0jIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KLVJ1bGUJQnJhemlsCTIwMDUJb25seQktCU9jdAkxNgkgMDowMAkxOjAwCVMKLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNTkyMC5naWYiPjUsOTIwPC9hPiAoMjAwNi0xMC0wMyksCi0jIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KLVJ1bGUJQnJhemlsCTIwMDYJb25seQktCU5vdgkgNQkgMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTIwMDcJb25seQktCUZlYgkyNQkgMDowMAkwCS0KLSMgRGVjcmVlIDxhIGhyZWY9Imh0dHA6Ly9wY2RzaDAxLm9uLmJyL0RlY0hWNjIxMi5naWYiPjYsMjEyPC9hPiAoMjAwNy0wOS0yNiksCi0jIGFkb3B0ZWQgYnkgdGhlIHNhbWUgc3RhdGVzIGFzIGJlZm9yZS4KLVJ1bGUJQnJhemlsCTIwMDcJb25seQktCU9jdAlTdW4+PTgJIDA6MDAJMTowMAlTCi0jIEZyb20gRnJlZGVyaWNvIEEuIEMuIE5ldmVzICgyMDA4LTA5LTEwKToKLSMgQWNvcmRpbmcgdG8gdGhpcyBkZWNyZWUKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5wbGFuYWx0by5nb3YuYnIvY2NpdmlsXzAzL19BdG8yMDA3LTIwMTAvMjAwOC9EZWNyZXRvL0Q2NTU4Lmh0bSI+Ci0jIGh0dHA6Ly93d3cucGxhbmFsdG8uZ292LmJyL2NjaXZpbF8wMy9fQXRvMjAwNy0yMDEwLzIwMDgvRGVjcmV0by9ENjU1OC5odG0KLSMgPC9hPgotIyBbdF1oZSBEU1QgcGVyaW9kIGluIEJyYXppbCBub3cgb24gd2lsbCBiZSBmcm9tIHRoZSAzcmQgT2N0IFN1bmRheSB0byB0aGUKLSMgM3JkIEZlYiBTdW5kYXkuIFRoZXJlIGlzIGFuIGV4Y2VwdGlvbiBvbiB0aGUgcmV0dXJuIGRhdGUgd2hlbiB0aGlzIGlzCi0jIHRoZSBDYXJuaXZhbCBTdW5kYXkgdGhlbiB0aGUgcmV0dXJuIGRhdGUgd2lsbCBiZSB0aGUgbmV4dCBTdW5kYXkuLi4KLVJ1bGUJQnJhemlsCTIwMDgJbWF4CS0JT2N0CVN1bj49MTUJMDowMAkxOjAwCVMKLVJ1bGUJQnJhemlsCTIwMDgJMjAxMQktCUZlYglTdW4+PTE1CTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDEyCW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAxMwkyMDE0CS0JRmViCVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMTUJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDE2CTIwMjIJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAyMwlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMjQJMjAyNQktCUZlYglTdW4+PTE1CTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDI2CW9ubHkJLQlGZWIJU3VuPj0yMgkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAyNwkyMDMzCS0JRmViCVN1bj49MTUJMDowMAkwCS0KLVJ1bGUJQnJhemlsCTIwMzQJb25seQktCUZlYglTdW4+PTIyCTA6MDAJMAktCi1SdWxlCUJyYXppbAkyMDM1CTIwMzYJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQotUnVsZQlCcmF6aWwJMjAzNwlvbmx5CS0JRmViCVN1bj49MjIJMDowMAkwCS0KLSMgRnJvbSBBcnRodXIgRGF2aWQgT2xzb24gKDIwMDgtMDktMjkpOgotIyBUaGUgbmV4dCBpcyB3cm9uZyBpbiBzb21lIHllYXJzIGJ1dCBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nLgotUnVsZQlCcmF6aWwJMjAzOAltYXgJLQlGZWIJU3VuPj0xNQkwOjAwCTAJLQotCi0jIFRoZSBsYXRlc3QgcnVsZXNldCBsaXN0ZWQgYWJvdmUgc2F5cyB0aGF0IHRoZSBmb2xsb3dpbmcgc3RhdGVzIG9ic2VydmUgRFNUOgotIyBERiwgRVMsIEdPLCBNRywgTVMsIE1ULCBQUiwgUkosIFJTLCBTQywgU1AuCi0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLSMKLSMgRmVybmFuZG8gZGUgTm9yb25oYSAoYWRtaW5pc3RyYXRpdmVseSBwYXJ0IG9mIFBFKQotWm9uZSBBbWVyaWNhL05vcm9uaGEJLTI6MDk6NDAgLQlMTVQJMTkxNAotCQkJLTI6MDAJQnJhemlsCUZOJXNUCTE5OTAgU2VwIDE3Ci0JCQktMjowMAktCUZOVAkxOTk5IFNlcCAzMAotCQkJLTI6MDAJQnJhemlsCUZOJXNUCTIwMDAgT2N0IDE1Ci0JCQktMjowMAktCUZOVAkyMDAxIFNlcCAxMwotCQkJLTI6MDAJQnJhemlsCUZOJXNUCTIwMDIgT2N0ICAxCi0JCQktMjowMAktCUZOVAotIyBPdGhlciBBdGxhbnRpYyBpc2xhbmRzIGhhdmUgbm8gcGVybWFuZW50IHNldHRsZW1lbnQuCi0jIFRoZXNlIGluY2x1ZGUgVHJpbmRhZGUgYW5kIE1hcnRpbiBWYXogKGFkbWluaXN0cmF0aXZlbHkgcGFydCBvZiBFUyksCi0jIEF0b2wgZGFzIFJvY2FzIChSTiksIGFuZCBQZW5lZG9zIGRlIFNhbyBQZWRybyBlIFNhbyBQYXVsbyAoUEUpLgotIyBGZXJuYW5kbyBkZSBOb3JvbmhhIHdhcyBhIHNlcGFyYXRlIHRlcnJpdG9yeSBmcm9tIDE5NDItMDktMDIgdG8gMTk4OS0wMS0wMTsKLSMgaXQgYWxzbyBpbmNsdWRlZCB0aGUgUGVuZWRvcy4KLSMKLSMgQW1hcGEgKEFQKSwgZWFzdCBQYXJhIChQQSkKLSMgRWFzdCBQYXJhIGluY2x1ZGVzIEJlbGVtLCBNYXJhYmEsIFNlcnJhIE5vcnRlLCBhbmQgU2FvIEZlbGl4IGRvIFhpbmd1LgotIyBUaGUgZGl2aXNpb24gYmV0d2VlbiBlYXN0IGFuZCB3ZXN0IFBhcmEgaXMgdGhlIHJpdmVyIFhpbmd1LgotIyBJbiB0aGUgbm9ydGggYSB2ZXJ5IHNtYWxsIHBhcnQgZnJvbSB0aGUgcml2ZXIgSmF2YXJ5IChub3cgSmFyaSBJIGd1ZXNzLAotIyB0aGUgYm9yZGVyIHdpdGggQW1hcGEpIHRvIHRoZSBBbWF6b24sIHRoZW4gdG8gdGhlIFhpbmd1LgotWm9uZSBBbWVyaWNhL0JlbGVtCS0zOjEzOjU2IC0JTE1UCTE5MTQKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTg4IFNlcCAxMgotCQkJLTM6MDAJLQlCUlQKLSMKLSMgd2VzdCBQYXJhIChQQSkKLSMgV2VzdCBQYXJhIGluY2x1ZGVzIEFsdGFtaXJhLCBPcmliaWRvcywgUHJhaW5oYSwgT3JpeGltaW5hLCBhbmQgU2FudGFyZW0uCi1ab25lIEFtZXJpY2EvU2FudGFyZW0JLTM6Mzg6NDggLQlMTVQJMTkxNAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCi0JCQktNDowMAktCUFNVAkyMDA4IEp1biAyNCAwMDowMAotCQkJLTM6MDAJLQlCUlQKLSMKLSMgTWFyYW5oYW8gKE1BKSwgUGlhdWkgKFBJKSwgQ2VhcmEgKENFKSwgUmlvIEdyYW5kZSBkbyBOb3J0ZSAoUk4pLAotIyBQYXJhaWJhIChQQikKLVpvbmUgQW1lcmljYS9Gb3J0YWxlemEJLTI6MzQ6MDAgLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3Ci0JCQktMzowMAktCUJSVAkxOTk5IFNlcCAzMAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDAgT2N0IDIyCi0JCQktMzowMAktCUJSVAkyMDAxIFNlcCAxMwotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDIgT2N0ICAxCi0JCQktMzowMAktCUJSVAotIwotIyBQZXJuYW1idWNvIChQRSkgKGV4Y2VwdCBBdGxhbnRpYyBpc2xhbmRzKQotWm9uZSBBbWVyaWNhL1JlY2lmZQktMjoxOTozNiAtCUxNVAkxOTE0Ci0JCQktMzowMAlCcmF6aWwJQlIlc1QJMTk5MCBTZXAgMTcKLQkJCS0zOjAwCS0JQlJUCTE5OTkgU2VwIDMwCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMCBPY3QgMTUKLQkJCS0zOjAwCS0JQlJUCTIwMDEgU2VwIDEzCi0JCQktMzowMAlCcmF6aWwJQlIlc1QJMjAwMiBPY3QgIDEKLQkJCS0zOjAwCS0JQlJUCi0jCi0jIFRvY2FudGlucyAoVE8pCi1ab25lIEFtZXJpY2EvQXJhZ3VhaW5hCS0zOjEyOjQ4IC0JTE1UCTE5MTQKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkxOTkwIFNlcCAxNwotCQkJLTM6MDAJLQlCUlQJMTk5NSBTZXAgMTQKLQkJCS0zOjAwCUJyYXppbAlCUiVzVAkyMDAzIFNlcCAyNAotCQkJLTM6MDAJLQlCUlQKLSMKLSMgQWxhZ29hcyAoQUwpLCBTZXJnaXBlIChTRSkKLVpvbmUgQW1lcmljYS9NYWNlaW8JLTI6MjI6NTIgLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTAgU2VwIDE3Ci0JCQktMzowMAktCUJSVAkxOTk1IE9jdCAxMwotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5OTYgU2VwICA0Ci0JCQktMzowMAktCUJSVAkxOTk5IFNlcCAzMAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDAgT2N0IDIyCi0JCQktMzowMAktCUJSVAkyMDAxIFNlcCAxMwotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDIgT2N0ICAxCi0JCQktMzowMAktCUJSVAotIwotIyBCYWhpYSAoQkEpCi0jIFRoZXJlIGFyZSB0b28gbWFueSBTYWx2YWRvcnMgZWxzZXdoZXJlLCBzbyB1c2UgQW1lcmljYS9CYWhpYSBpbnN0ZWFkCi0jIG9mIEFtZXJpY2EvU2FsdmFkb3IuCi1ab25lIEFtZXJpY2EvQmFoaWEJLTI6MzQ6MDQgLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTIwMDMgU2VwIDI0Ci0JCQktMzowMAktCUJSVAotIwotIyBHb2lhcyAoR08pLCBEaXN0cml0byBGZWRlcmFsIChERiksIE1pbmFzIEdlcmFpcyAoTUcpLAotIyBFc3Bpcml0byBTYW50byAoRVMpLCBSaW8gZGUgSmFuZWlybyAoUkopLCBTYW8gUGF1bG8gKFNQKSwgUGFyYW5hIChQUiksCi0jIFNhbnRhIENhdGFyaW5hIChTQyksIFJpbyBHcmFuZGUgZG8gU3VsIChSUykKLVpvbmUgQW1lcmljYS9TYW9fUGF1bG8JLTM6MDY6MjggLQlMTVQJMTkxNAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCTE5NjMgT2N0IDIzIDAwOjAwCi0JCQktMzowMAkxOjAwCUJSU1QJMTk2NAotCQkJLTM6MDAJQnJhemlsCUJSJXNUCi0jCi0jIE1hdG8gR3Jvc3NvIGRvIFN1bCAoTVMpCi1ab25lIEFtZXJpY2EvQ2FtcG9fR3JhbmRlIC0zOjM4OjI4IC0JTE1UCTE5MTQKLQkJCS00OjAwCUJyYXppbAlBTSVzVAotIwotIyBNYXRvIEdyb3NzbyAoTVQpCi1ab25lIEFtZXJpY2EvQ3VpYWJhCS0zOjQ0OjIwIC0JTE1UCTE5MTQKLQkJCS00OjAwCUJyYXppbAlBTSVzVAkyMDAzIFNlcCAyNAotCQkJLTQ6MDAJLQlBTVQJMjAwNCBPY3QgIDEKLQkJCS00OjAwCUJyYXppbAlBTSVzVAotIwotIyBSb25kb25pYSAoUk8pCi1ab25lIEFtZXJpY2EvUG9ydG9fVmVsaG8gLTQ6MTU6MzYgLQlMTVQJMTkxNAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCi0JCQktNDowMAktCUFNVAotIwotIyBSb3JhaW1hIChSUikKLVpvbmUgQW1lcmljYS9Cb2FfVmlzdGEJLTQ6MDI6NDAgLQlMTVQJMTkxNAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTE5ODggU2VwIDEyCi0JCQktNDowMAktCUFNVAkxOTk5IFNlcCAzMAotCQkJLTQ6MDAJQnJhemlsCUFNJXNUCTIwMDAgT2N0IDE1Ci0JCQktNDowMAktCUFNVAotIwotIyBlYXN0IEFtYXpvbmFzIChBTSk6IEJvY2EgZG8gQWNyZSwgSnV0YWksIE1hbmF1cywgRmxvcmlhbm8gUGVpeG90bwotIyBUaGUgZ3JlYXQgY2lyY2xlIGxpbmUgZnJvbSBUYWJhdGluZ2EgdG8gUG9ydG8gQWNyZSBkaXZpZGVzCi0jIGVhc3QgZnJvbSB3ZXN0IEFtYXpvbmFzLgotWm9uZSBBbWVyaWNhL01hbmF1cwktNDowMDowNCAtCUxNVAkxOTE0Ci0JCQktNDowMAlCcmF6aWwJQU0lc1QJMTk4OCBTZXAgMTIKLQkJCS00OjAwCS0JQU1UCTE5OTMgU2VwIDI4Ci0JCQktNDowMAlCcmF6aWwJQU0lc1QJMTk5NCBTZXAgMjIKLQkJCS00OjAwCS0JQU1UCi0jCi0jIHdlc3QgQW1hem9uYXMgKEFNKTogQXRhbGFpYSBkbyBOb3J0ZSwgQm9jYSBkbyBNYW9jbywgQmVuamFtaW4gQ29uc3RhbnQsCi0jCUVpcnVuZXBlLCBFbnZpcmEsIElwaXh1bmEKLVpvbmUgQW1lcmljYS9FaXJ1bmVwZQktNDozOToyOCAtCUxNVAkxOTE0Ci0JCQktNTowMAlCcmF6aWwJQUMlc1QJMTk4OCBTZXAgMTIKLQkJCS01OjAwCS0JQUNUCTE5OTMgU2VwIDI4Ci0JCQktNTowMAlCcmF6aWwJQUMlc1QJMTk5NCBTZXAgMjIKLQkJCS01OjAwCS0JQUNUCTIwMDggSnVuIDI0IDAwOjAwCi0JCQktNDowMAktCUFNVAotIwotIyBBY3JlIChBQykKLVpvbmUgQW1lcmljYS9SaW9fQnJhbmNvCS00OjMxOjEyIC0JTE1UCTE5MTQKLQkJCS01OjAwCUJyYXppbAlBQyVzVAkxOTg4IFNlcCAxMgotCQkJLTU6MDAJLQlBQ1QJMjAwOCBKdW4gMjQgMDA6MDAKLQkJCS00OjAwCS0JQU1UCi0KLSMgQ2hpbGUKLQotIyBGcm9tIEVkdWFyZG8gS3JlbGwgKDE5OTUtMTAtMTkpOgotIyBUaGUgbGF3IHNheXMgdG8gc3dpdGNoIHRvIERTVCBhdCBtaWRuaWdodCBbMjQ6MDBdIG9uIHRoZSBzZWNvbmQgU0FUVVJEQVkKLSMgb2YgT2N0b2Jlci4uLi4gIFRoZSBsYXcgaXMgdGhlIHNhbWUgZm9yIE1hcmNoIGFuZCBPY3RvYmVyLgotIyAoMTk5OC0wOS0yOSk6Ci0jIEJlY2F1c2Ugb2YgdGhlIGRyb3VnaHQgdGhpcyB5ZWFyLCB0aGUgZ292ZXJubWVudCBkZWNpZGVkIHRvIGdvIGludG8KLSMgRFNUIGVhcmxpZXIgKHNhdHVyZGF5IDkvMjYgYXQgMjQ6MDApLiBUaGlzIGlzIGEgb25lLXRpbWUgY2hhbmdlIG9ubHkgLi4uCi0jICh1bmxlc3MgdGhlcmUncyBhbm90aGVyIGRyeSBzZWFzb24gbmV4dCB5ZWFyLCBJIGd1ZXNzKS4KLQotIyBGcm9tIEp1bGlvIEkuIFBhY2hlY28gVHJvbmNvc28gKDE5OTktMDMtMTgpOgotIyBCZWNhdXNlIG9mIHRoZSBzYW1lIGRyb3VnaHQsIHRoZSBnb3Zlcm5tZW50IGRlY2lkZWQgdG8gZW5kIERTVCBsYXRlciwKLSMgb24gQXByaWwgMywgKG9uZS10aW1lIGNoYW5nZSkuCi0KLSMgRnJvbSBPc2NhciB2YW4gVmxpam1lbiAoMjAwNi0xMC0wOCk6Ci0jIGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvY2FtYmlvLmh0bQotCi0jIEZyb20gSmVzcGVyIE5vcmdhYXJkIFdlbGVuICgyMDA2LTEwLTA4KToKLSMgSSB0aGluayB0aGF0IHRoZXJlIGFyZSBzb21lIG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIHN1Z2dlc3RlZCBsaW5rCi0jIGZyb20gT3NjYXIgdmFuIFZsaWptZW4sLi4uIGZvciBpbnN0YW5jZSBlbnRyeSA2NiBzYXlzIHRoYXQgR01ULTQKLSMgZW5kZWQgMTk5MC0wOS0xMiB3aGlsZSBlbnRyeSA2NyBvbmx5IGJlZ2lucyBHTVQtMyBhdCAxOTkwLTA5LTE1Ci0jICh0aGV5IHNob3VsZCBoYXZlIGJlZW4gMTk5MC0wOS0xNSBhbmQgMTk5MC0wOS0xNiByZXNwZWN0aXZlbHkpLCBidXQKLSMgYW55aG93IGl0IGNsZWFycyB1cCBzb21lIGRvdWJ0cyB0b28uCi0KLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAwNi0xMi0yNyk6Ci0jIFRoZSBmb2xsb3dpbmcgZGF0YSBmb3IgQ2hpbGUgYW5kIEFtZXJpY2EvU2FudGlhZ28gYXJlIGZyb20KLSMgPGh0dHA6Ly93d3cuaG9yYW9maWNpYWwuY2wvaG9yYW9mLmh0bT4gKDIwMDYtMDktMjApLCB0cmFuc2NyaWJlZCBieQotIyBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4uICBUaGUgZGF0YSBmb3IgUGFjaWZpYy9FYXN0ZXIgYXJlIGZyb20gU2hhbmtzCi0jICYgUG90dGVuZ2VyLCBleGNlcHQgd2l0aCBEU1QgdHJhbnNpdGlvbnMgYWZ0ZXIgMTkzMiBjbG9uZWQgZnJvbQotIyBBbWVyaWNhL1NhbnRpYWdvLiAgVGhlIHByZS0xOTgwIFBhY2lmaWMvRWFzdGVyIGRhdGEgYXJlIGR1YmlvdXMsCi0jIGJ1dCB3ZSBoYXZlIG5vIG90aGVyIHNvdXJjZS4KLQotIyBGcm9tIEdlcm1hbiBQb28tQ2FhbWFufm8gKDIwMDgtMDMtMDMpOgotIyBEdWUgdG8gZHJvdWdodCwgQ2hpbGUgZXh0ZW5kcyBEYXlsaWdodCBUaW1lIGluIHRocmVlIHdlZWtzLiAgVGhpcwotIyBpcyBvbmUtdGltZSBjaGFuZ2UgKFNhdHVyZGF5IDMvMjkgYXQgMjQ6MDAgZm9yIEFtZXJpY2EvU2FudGlhZ28KLSMgYW5kIFNhdHVyZGF5IDMvMjkgYXQgMjI6MDAgZm9yIFBhY2lmaWMvRWFzdGVyKQotIyBUaGUgU3VwcmVtZSBEZWNyZWUgaXMgbG9jYXRlZCBhdCAKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5zaG9hLmNsL3NlcnZpY2lvcy9zdXByZW1vMzE2LnBkZiI+Ci0jIGh0dHA6Ly93d3cuc2hvYS5jbC9zZXJ2aWNpb3Mvc3VwcmVtbzMxNi5wZGYKLSMgPC9hPgotIyBhbmQgdGhlIGluc3RydWN0aW9ucyBmb3IgMjAwOCBhcmUgbG9jYXRlZCBpbjoKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtIj4KLSMgaHR0cDovL3d3dy5ob3Jhb2ZpY2lhbC5jbC9jYW1iaW8uaHRtCi0jIDwvYT4uCi0KLSMgRnJvbSBKb3NlIE1pZ3VlbCBHYXJyaWRvICgyMDA4LTAzLTA1KToKLSMgLi4uCi0jIFlvdSBjb3VsZCBzZWUgdGhlIGFubm91bmNlcyBvZiB0aGUgY2hhbmdlIG9uIAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnNob2EuY2wvbm90aWNpYXMvMjAwOC8wNGhvcmEvaG9yYS5odG0iPgotIyBodHRwOi8vd3d3LnNob2EuY2wvbm90aWNpYXMvMjAwOC8wNGhvcmEvaG9yYS5odG0KLSMgPC9hPi4KLQotIyBGcm9tIEFuZ2VsIENoaWFuZyAoMjAxMC0wMy0wNCk6Ci0jIFN1YmplY3Q6IERTVCBpbiBDaGlsZSBleGNlcHRpb25hbGx5IGV4dGVuZGVkIHRvIDMgQXByaWwgZHVlIHRvIGVhcnRocXVha2UKLSMgPGEgaHJlZj0iaHR0cDovL3d3dy5nb2JpZXJub2RlY2hpbGUuY2wvdmlld05vdGljaWEuYXNweD9pZEFydGljdWxvPTMwMDk4Ij4KLSMgaHR0cDovL3d3dy5nb2JpZXJub2RlY2hpbGUuY2wvdmlld05vdGljaWEuYXNweD9pZEFydGljdWxvPTMwMDk4Ci0jIDwvYT4KLSMgKGluIFNwYW5pc2gsIGxhc3QgcGFyYWdyYXBoKS4KLSMKLSMgVGhpcyBpcyBicmVha2luZyBuZXdzLiBUaGVyZSBzaG91bGQgYmUgbW9yZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgbGF0ZXIuCi0KLSMgRnJvbSBBcnRodXIgRGFpdmQgT2xzb24gKDIwMTAtMDMtMDYpOgotIyBBbmdlbCBDaGlhbmcncyBtZXNzYWdlIGNvbmZpcm1lZCBieSBKdWxpbyBQYWNoZWNvOyBKdWxpbyBwcm92aWRlZCBhIHBhdGNoLgotCi0jIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwotUnVsZQlDaGlsZQkxOTI3CTE5MzIJLQlTZXAJIDEJMDowMAkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTkyOAkxOTMyCS0JQXByCSAxCTA6MDAJMAktCi1SdWxlCUNoaWxlCTE5NDIJb25seQktCUp1bgkgMQk0OjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk0Mglvbmx5CS0JQXVnCSAxCTU6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTQ2CW9ubHkJLQlKdWwJMTUJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5NDYJb25seQktCVNlcAkgMQkzOjAwdQkwOjAwCS0KLVJ1bGUJQ2hpbGUJMTk0Nwlvbmx5CS0JQXByCSAxCTQ6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTY4CW9ubHkJLQlOb3YJIDMJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5NjkJb25seQktCU1hcgkzMAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk2OQlvbmx5CS0JTm92CTIzCTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTcwCW9ubHkJLQlNYXIJMjkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5NzEJb25seQktCU1hcgkxNAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk3MAkxOTcyCS0JT2N0CVN1bj49OQk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTk3MgkxOTg2CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk3Mwlvbmx5CS0JU2VwCTMwCTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTc0CTE5ODcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTg3CW9ubHkJLQlBcHIJMTIJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5ODgJMTk4OQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5ODgJb25seQktCU9jdAlTdW4+PTEJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5ODkJb25seQktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTE5OTAJb25seQktCU1hcgkxOAkzOjAwdQkwCS0KLVJ1bGUJQ2hpbGUJMTk5MAlvbmx5CS0JU2VwCTE2CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTkxCTE5OTYJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTkxCTE5OTcJLQlPY3QJU3VuPj05CTQ6MDB1CTE6MDAJUwotUnVsZQlDaGlsZQkxOTk3CW9ubHkJLQlNYXIJMzAJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5OTgJb25seQktCU1hcglTdW4+PTkJMzowMHUJMAktCi1SdWxlCUNoaWxlCTE5OTgJb25seQktCVNlcAkyNwk0OjAwdQkxOjAwCVMKLVJ1bGUJQ2hpbGUJMTk5OQlvbmx5CS0JQXByCSA0CTM6MDB1CTAJLQotUnVsZQlDaGlsZQkxOTk5CW1heAktCU9jdAlTdW4+PTkJNDowMHUJMTowMAlTCi1SdWxlCUNoaWxlCTIwMDAJMjAwNwktCU1hcglTdW4+PTkJMzowMHUJMAktCi0jIE4uQi46IHRoZSBlbmQgb2YgTWFyY2ggMjkgaW4gQ2hpbGUgaXMgTWFyY2ggMzAgaW4gVW5pdmVyc2FsIHRpbWUsCi0jIHdoaWNoIGlzIHVzZWQgYmVsb3cgaW4gc3BlY2lmeWluZyB0aGUgdHJhbnNpdGlvbi4KLVJ1bGUJQ2hpbGUJMjAwOAlvbmx5CS0JTWFyCTMwCTM6MDB1CTAJLQotUnVsZQlDaGlsZQkyMDA5CW9ubHkJLQlNYXIJU3VuPj05CTM6MDB1CTAJLQotUnVsZQlDaGlsZQkyMDEwCW9ubHkJLQlBcHIJIDQJMzowMHUJMAktCi1SdWxlCUNoaWxlCTIwMTEJbWF4CS0JTWFyCVN1bj49OQkzOjAwdQkwCS0KLSMgSUFUQSBTU0lNIGFub21hbGllczogKDE5OTItMDIpIHNheXMgMTk5Mi0wMy0xNDsKLSMgKDE5OTYtMDkpIHNheXMgMTk5OC0wMy0wOC4gIElnbm9yZSB0aGVzZS4KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9TYW50aWFnbwktNDo0Mjo0NiAtCUxNVAkxODkwCi0JCQktNDo0Mjo0NiAtCVNNVAkxOTEwIAkgICAgIyBTYW50aWFnbyBNZWFuIFRpbWUKLQkJCS01OjAwCS0JQ0xUCTE5MTYgSnVsICAxICMgQ2hpbGUgVGltZQotCQkJLTQ6NDI6NDYgLQlTTVQJMTkxOCBTZXAgIDEgIyBTYW50aWFnbyBNZWFuIFRpbWUKLQkJCS00OjAwCS0JQ0xUCTE5MTkgSnVsICAxICMgQ2hpbGUgVGltZQotCQkJLTQ6NDI6NDYgLQlTTVQJMTkyNyBTZXAgIDEgIyBTYW50aWFnbyBNZWFuIFRpbWUKLQkJCS01OjAwCUNoaWxlCUNMJXNUCTE5NDcgTWF5IDIyICMgQ2hpbGUgVGltZQotCQkJLTQ6MDAJQ2hpbGUJQ0wlc1QKLVpvbmUgUGFjaWZpYy9FYXN0ZXIJLTc6MTc6NDQgLQlMTVQJMTg5MAotCQkJLTc6MTc6MjggLQlFTVQJMTkzMiBTZXAgICAgIyBFYXN0ZXIgTWVhbiBUaW1lCi0JCQktNzowMAlDaGlsZQlFQVMlc1QJMTk4MiBNYXIgMTMgMjE6MDAgIyBFYXN0ZXIgSSBUaW1lCi0JCQktNjowMAlDaGlsZQlFQVMlc1QKLSMKLSMgU2FsYSB5IEdvbWV6IElzbGFuZCBpcyBsaWtlIFBhY2lmaWMvRWFzdGVyLgotIyBPdGhlciBDaGlsZWFuIGxvY2F0aW9ucywgaW5jbHVkaW5nIEp1YW4gRmVybmFuZGV6IElzLCBTYW4gQW1icm9zaW8sCi0jIFNhbiBGZWxpeCwgYW5kIEFudGFyY3RpYyBiYXNlcywgYXJlIGxpa2UgQW1lcmljYS9TYW50aWFnby4KLQotIyBDb2xvbWJpYQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJQ08JMTk5Mglvbmx5CS0JTWF5CSAzCTA6MDAJMTowMAlTCi1SdWxlCUNPCTE5OTMJb25seQktCUFwcgkgNAkwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0JvZ290YQktNDo1NjoyMCAtCUxNVAkxODg0IE1hciAxMwotCQkJLTQ6NTY6MjAgLQlCTVQJMTkxNCBOb3YgMjMgIyBCb2dvdGEgTWVhbiBUaW1lCi0JCQktNTowMAlDTwlDTyVzVAkjIENvbG9tYmlhIFRpbWUKLSMgTWFscGVsbywgUHJvdmlkZW5jaWEsIFNhbiBBbmRyZXMKLSMgbm8gaW5mb3JtYXRpb247IHByb2JhYmx5IGxpa2UgQW1lcmljYS9Cb2dvdGEKLQotIyBDdXJhY2FvCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5IHRoYXQgVGhlIEJvdHRvbSBhbmQgUGhpbGlwc2J1cmcgaGF2ZSBiZWVuIGF0Ci0jIC00OjAwIHNpbmNlIHN0YW5kYXJkIHRpbWUgd2FzIGludHJvZHVjZWQgb24gMTkxMi0wMy0wMjsgYW5kIHRoYXQKLSMgS3JhbGVuZGlqayBhbmQgUmluY29uIHVzZWQgS3JhbGVuZGlqayBNZWFuIFRpbWUgKC00OjMzOjA4KSBmcm9tCi0jIDE5MTItMDItMDIgdG8gMTk2NS0wMS0wMS4gIFRoZSBmb3JtZXIgaXMgZHViaW91cywgc2luY2UgUyZQIGFsc28gc2F5Ci0jIFNhYmEgSXNsYW5kIGhhcyBiZWVuIGxpa2UgQ3VyYWNhby4KLSMgVGhpcyBhbGwgcHJlZGF0ZXMgb3VyIDE5NzAgY3V0b2ZmLCB0aG91Z2guCi0jCi0jIEJ5IEp1bHkgMjAwNyBDdXJhY2FvIGFuZCBTdCBNYWFydGVuIGFyZSBwbGFubmVkIHRvIGJlY29tZQotIyBhc3NvY2lhdGVkIHN0YXRlcyB3aXRoaW4gdGhlIE5ldGhlcmxhbmRzLCBtdWNoIGxpa2UgQXJ1YmE7Ci0jIEJvbmFpcmUsIFNhYmEgYW5kIFN0IEV1c3RhdGl1cyB3b3VsZCBiZWNvbWUgZGlyZWN0bHkgcGFydCBvZiB0aGUKLSMgTmV0aGVybGFuZHMgYXMgS2luZ2RvbSBJc2xhbmRzLiAgVGhpcyB3b24ndCBhZmZlY3QgdGhlaXIgdGltZSB6b25lcwotIyB0aG91Z2gsIGFzIGZhciBhcyB3ZSBrbm93LgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0N1cmFjYW8JLTQ6MzU6NDQgLQlMTVQJMTkxMiBGZWIgMTIJIyBXaWxsZW1zdGFkCi0JCQktNDozMAktCUFOVAkxOTY1ICMgTmV0aGVybGFuZHMgQW50aWxsZXMgVGltZQotCQkJLTQ6MDAJLQlBU1QKLQotIyBFY3VhZG9yCi0jCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDctMDMtMDQpOgotIyBBcHBhcmVudGx5IEVjdWFkb3IgaGFkIGEgZmFpbGVkIGV4cGVyaW1lbnQgd2l0aCBEU1QgaW4gMTk5Mi4KLSMgPGh0dHA6Ly9taWRlbmEuZ292LmVjL2NvbnRlbnQvdmlldy8xMjYxLzIwOC8+ICgyMDA3LTAyLTI3KSBhbmQKLSMgPGh0dHA6Ly93d3cuaG95LmNvbS5lYy9Ob3RpY2lhTnVlLmFzcD9yb3dfaWQ9MjQ5ODU2PiAoMjAwNi0xMS0wNikgYm90aAotIyB0YWxrIGFib3V0ICJob3JhIFNpeHRvIi4gIExlYXZlIHRoaXMgYWxvbmUgZm9yIG5vdywgYXMgd2UgaGF2ZSBubyBkYXRhLgotIwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0d1YXlhcXVpbAktNToxOToyMCAtCUxNVAkxODkwCi0JCQktNToxNDowMCAtCVFNVAkxOTMxICMgUXVpdG8gTWVhbiBUaW1lCi0JCQktNTowMAktCUVDVAkgICAgICMgRWN1YWRvciBUaW1lCi1ab25lIFBhY2lmaWMvR2FsYXBhZ29zCS01OjU4OjI0IC0JTE1UCTE5MzEgIyBQdWVydG8gQmFxdWVyaXpvIE1vcmVubwotCQkJLTU6MDAJLQlFQ1QJMTk4NgotCQkJLTY6MDAJLQlHQUxUCSAgICAgIyBHYWxhcGFnb3MgVGltZQotCi0jIEZhbGtsYW5kcwotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgotIyBCZXR3ZWVuIDE5OTAgYW5kIDIwMDAgaW5jbHVzaXZlLCBTaGFua3MgJiBQb3R0ZW5nZXIgYW5kIHRoZSBJQVRBIGFncmVlIGV4Y2VwdAotIyB0aGUgSUFUQSBnaXZlcyAxOTk2LTA5LTA4LiAgR28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi0KLSMgRnJvbSBGYWxrbGFuZCBJc2xhbmRzIEdvdmVybm1lbnQgT2ZmaWNlLCBMb25kb24gKDIwMDEtMDEtMjIpCi0jIHZpYSBKZXNwZXIgTm9yZ2FhcmQ6Ci0jIC4uLiB0aGUgY2xvY2tzIHJldmVydCBiYWNrIHRvIExvY2FsIE1lYW4gVGltZSBhdCAyIGFtIG9uIFN1bmRheSAxNQotIyBBcHJpbCAyMDAxIGFuZCBhZHZhbmNlIG9uZSBob3VyIHRvIHN1bW1lciB0aW1lIGF0IDIgYW0gb24gU3VuZGF5IDIKLSMgU2VwdGVtYmVyLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCB0aGUgY2xvY2tzIHdpbGwgcmV2ZXJ0IGJhY2sgYXQgMgotIyBhbSBvbiBTdW5kYXkgMjEgQXByaWwgMjAwMiBhbmQgYWR2YW5jZSB0byBzdW1tZXIgdGltZSBhdCAyIGFtIG9uCi0jIFN1bmRheSAxIFNlcHRlbWJlci4KLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAxLTAyLTEzKToKLSMKLSMgSSBoYXZlIGNvbW11bmljYXRlZCBzZXZlcmFsIHRpbWVzIHdpdGggcGVvcGxlIHRoZXJlLCBhbmQgdGhlIGxhc3QKLSMgdGltZSBJIGhhZCBjb21tdW5pY2F0aW9ucyB0aGF0IHdhcyBoZWxwZnVsIHdhcyBpbiAxOTk4LiAgSGVyZSBpcwotIyB3aGF0IHdhcyBzYWlkIHRoZW46Ci0jCi0jICJUaGUgZ2VuZXJhbCBydWxlIHdhcyB0aGF0IFN0YW5sZXkgdXNlZCBkYXlsaWdodCBzYXZpbmcgYW5kIHRoZSBDYW1wCi0jIGRpZCBub3QuIEhvd2V2ZXIgZm9yIHZhcmlvdXMgcmVhc29ucyBtYW55IHBlb3BsZSBpbiB0aGUgQ2FtcCBoYXZlCi0jIHN0YXJ0ZWQgdG8gdXNlIGRheWxpZ2h0IHNhdmluZyAoa25vd24gbG9jYWxseSBhcyAnU3RhbmxleSBUaW1lJykKLSMgVGhlcmUgaXMgbm8gcnVsZSBhcyB0byB3aG8gdXNlcyBkYXlsaWdodCBzYXZpbmcgLSBpdCBpcyBhIG1hdHRlciBvZgotIyBwZXJzb25hbCBjaG9pY2UgYW5kIHNvIGl0IGlzIGltcG9zc2libGUgdG8gZHJhdyBhIG1hcCBzaG93aW5nIHdobwotIyB1c2VzIGl0IGFuZCB3aG8gZG9lcyBub3QuIEFueSBsaXN0IHdvdWxkIGJlIG91dCBvZiBkYXRlIGFzIHNvb24gYXMKLSMgaXQgd2FzIHByb2R1Y2VkLiBUaGlzIHllYXIgZGF5bGlnaHQgc2F2aW5nIGVuZGVkIG9uIEFwcmlsIDE4LzE5dGgKLSMgYW5kIHN0YXJ0ZWQgYWdhaW4gb24gU2VwdGVtYmVyIDEyLzEzdGguICBJIGRvIG5vdCBrbm93IHdoYXQgdGhlIHJ1bGUKLSMgaXMsIGJ1dCBjYW4gZmluZCBvdXQgaWYgeW91IGxpa2UuICBXZSBkbyBub3QgY2hhbmdlIGF0IHRoZSBzYW1lIHRpbWUKLSMgYXMgVUsgb3IgQ2hpbGUuIgotIwotIyBJIGRpZCBoYXZlIGluIG15IG5vdGVzIHRoYXQgdGhlIHJ1bGUgd2FzICJTZWNvbmQgU2F0dXJkYXkgaW4gU2VwIGF0Ci0jIDA6MDAgdW50aWwgdGhpcmQgU2F0dXJkYXkgaW4gQXByIGF0IDA6MDAiLiAgSSB0aGluayB0aGF0IHRoaXMgZG9lcwotIyBub3QgYWdyZWUgaW4gc29tZSBjYXNlcyB3aXRoIFNoYW5rczsgaXMgdGhpcyB0cnVlPwotIwotIyBBbHNvLCB0aGVyZSBpcyBubyBtZW50aW9uIGluIHRoZSBsaXN0IHRoYXQgc29tZSBhcmVhcyBpbiB0aGUKLSMgRmFsa2xhbmRzIGRvIG5vdCB1c2UgRFNULiAgSSBoYXZlIGZvdW5kIGluIG15IGNvbW11bmljYXRpb25zIHRoZXJlCi0jIHRoYXQgdGhlc2UgYXJlYXMgYXJlIG9uIHRoZSB3ZXN0ZXJuIGhhbGYgb2YgRWFzdCBGYWxrbGFuZCBhbmQgYWxsIG9mCi0jIFdlc3QgRmFsa2xhbmQuICBTdGFubGV5IGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgY29uc2lzdGVudGx5IG9ic2VydmVzCi0jIERTVC4gIEFnYWluLCBhcyBpbiBvdGhlciBwbGFjZXMgaW4gdGhlIHdvcmxkLCB0aGUgZmFybWVycyBkb24ndCBsaWtlCi0jIGl0LiAgV2VzdCBGYWxrbGFuZCBpcyBhbG1vc3QgZW50aXJlbHkgc2hlZXAgZmFybWVycy4KLSMKLSMgSSBrbm93IG9uZSBsYWR5IHRoZXJlIHRoYXQga2VlcHMgYSBsaXN0IG9mIHdoaWNoIGZhcm0ga2VlcHMgRFNUIGFuZAotIyB3aGljaCBkb2Vzbid0IGVhY2ggeWVhci4gIFNoZSBydW5zIGEgc2hvcCBpbiBTdGFubGV5LCBhbmQgc2F5cyB0aGF0Ci0jIHRoZSBsaXN0IGNoYW5nZXMgZWFjaCB5ZWFyLiAgU2hlIHVzZXMgaXQgdG8gY29tbXVuaWNhdGUgdG8gaGVyCi0jIGN1c3RvbWVycywgY2F0Y2hpbmcgdGhlbSB3aGVuIHRoZXkgYXJlIGhvbWUgZm9yIGx1bmNoIG9yIGRpbm5lci4KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDAxLTAzLTA1KToKLSMgRm9yIG5vdywgd2UnbGwganVzdCByZWNvcmQgdGhlIHRpbWUgaW4gU3RhbmxleSwgc2luY2Ugd2UgaGF2ZSBubwotIyBiZXR0ZXIgaW5mby4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJRmFsawkxOTM3CTE5MzgJLQlTZXAJbGFzdFN1bgkwOjAwCTE6MDAJUwotUnVsZQlGYWxrCTE5MzgJMTk0MgktCU1hcglTdW4+PTE5CTA6MDAJMAktCi1SdWxlCUZhbGsJMTkzOQlvbmx5CS0JT2N0CTEJMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTQwCTE5NDIJLQlTZXAJbGFzdFN1bgkwOjAwCTE6MDAJUwotUnVsZQlGYWxrCTE5NDMJb25seQktCUphbgkxCTA6MDAJMAktCi1SdWxlCUZhbGsJMTk4Mwlvbmx5CS0JU2VwCWxhc3RTdW4JMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTg0CTE5ODUJLQlBcHIJbGFzdFN1bgkwOjAwCTAJLQotUnVsZQlGYWxrCTE5ODQJb25seQktCVNlcAkxNgkwOjAwCTE6MDAJUwotUnVsZQlGYWxrCTE5ODUJMjAwMAktCVNlcAlTdW4+PTkJMDowMAkxOjAwCVMKLVJ1bGUJRmFsawkxOTg2CTIwMDAJLQlBcHIJU3VuPj0xNgkwOjAwCTAJLQotUnVsZQlGYWxrCTIwMDEJbWF4CS0JQXByCVN1bj49MTUJMjowMAkwCS0KLVJ1bGUJRmFsawkyMDAxCW1heAktCVNlcAlTdW4+PTEJMjowMAkxOjAwCVMKLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQXRsYW50aWMvU3RhbmxleQktMzo1MToyNCAtCUxNVAkxODkwCi0JCQktMzo1MToyNCAtCVNNVAkxOTEyIE1hciAxMiAgIyBTdGFubGV5IE1lYW4gVGltZQotCQkJLTQ6MDAJRmFsawlGSyVzVAkxOTgzIE1heSAgICAgIyBGYWxrbGFuZCBJcyBUaW1lCi0JCQktMzowMAlGYWxrCUZLJXNUCTE5ODUgU2VwIDE1Ci0JCQktNDowMAlGYWxrCUZLJXNUCi0KLSMgRnJlbmNoIEd1aWFuYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0NheWVubmUJLTM6Mjk6MjAgLQlMTVQJMTkxMSBKdWwKLQkJCS00OjAwCS0JR0ZUCTE5NjcgT2N0ICMgRnJlbmNoIEd1aWFuYSBUaW1lCi0JCQktMzowMAktCUdGVAotCi0jIEd1eWFuYQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0d1eWFuYQktMzo1Mjo0MCAtCUxNVAkxOTE1IE1hcgkjIEdlb3JnZXRvd24KLQkJCS0zOjQ1CS0JR0JHVAkxOTY2IE1heSAyNiAjIEJyIEd1aWFuYSBUaW1lCi0JCQktMzo0NQktCUdZVAkxOTc1IEp1bCAzMSAjIEd1eWFuYSBUaW1lCi0JCQktMzowMAktCUdZVAkxOTkxCi0jIElBVEEgU1NJTSAoMTk5Ni0wNikgc2F5cyAtNDowMC4gIEFzc3VtZSBhIDE5OTEgc3dpdGNoLgotCQkJLTQ6MDAJLQlHWVQKLQotIyBQYXJhZ3VheQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSB0aGF0IHNwcmluZyB0cmFuc2l0aW9ucyBhcmUgZnJvbSAwMTowMCAtPiAwMjowMCwKLSMgYW5kIGF1dHVtbiB0cmFuc2l0aW9ucyBhcmUgZnJvbSAwMDowMCAtPiAyMzowMC4gIEdvIHdpdGggcHJlLTE5OTkKLSMgZWRpdGlvbnMgb2YgU2hhbmtzLCBhbmQgd2l0aCB0aGUgSUFUQSwgd2hvIHNheSB0cmFuc2l0aW9ucyBvY2N1ciBhdCAwMDowMC4KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVBhcmEJMTk3NQkxOTg4CS0JT2N0CSAxCTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk3NQkxOTc4CS0JTWFyCSAxCTA6MDAJMAktCi1SdWxlCVBhcmEJMTk3OQkxOTkxCS0JQXByCSAxCTA6MDAJMAktCi1SdWxlCVBhcmEJMTk4OQlvbmx5CS0JT2N0CTIyCTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk5MAlvbmx5CS0JT2N0CSAxCTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk5MQlvbmx5CS0JT2N0CSA2CTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk5Mglvbmx5CS0JTWFyCSAxCTA6MDAJMAktCi1SdWxlCVBhcmEJMTk5Mglvbmx5CS0JT2N0CSA1CTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk5Mwlvbmx5CS0JTWFyCTMxCTA6MDAJMAktCi1SdWxlCVBhcmEJMTk5MwkxOTk1CS0JT2N0CSAxCTA6MDAJMTowMAlTCi1SdWxlCVBhcmEJMTk5NAkxOTk1CS0JRmViCWxhc3RTdW4JMDowMAkwCS0KLVJ1bGUJUGFyYQkxOTk2CW9ubHkJLQlNYXIJIDEJMDowMAkwCS0KLSMgSUFUQSBTU0lNICgyMDAwLTAyKSBzYXlzIDE5OTktMTAtMTA7IGlnbm9yZSB0aGlzIGZvciBub3cuCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDAwLTEwLTAyKToKLSMgSSBoYXZlIHRocmVlIGluZGVwZW5kZW50IHJlcG9ydHMgdGhhdCBQYXJhZ3VheSBjaGFuZ2VkIHRvIERTVCB0aGlzIFN1bmRheQotIyAoMTAtMDEpLgotIwotIyBUcmFuc2xhdGVkIGJ5IEd3aWxsaW0gTGF3ICgyMDAxLTAyLTI3KSBmcm9tCi0jIDxhIGhyZWY9Imh0dHA6Ly93d3cuZGlhcmlvbm90aWNpYXMuY29tLnB5LzAxMTAwMC9uYWNpb25hbC9uYWNpb25hMS5odG0iPgotIyBOb3RpY2lhcywgYSBkYWlseSBwYXBlciBpbiBBc3VuY2lvbiwgUGFyYWd1YXkgKDIwMDAtMTAtMDEpCi0jIDwvYT46Ci0jIFN0YXJ0aW5nIGF0IDA6MDAgdG9kYXksIHRoZSBjbG9jayB3aWxsIGJlIHNldCBmb3J3YXJkIDYwIG1pbnV0ZXMsIGluCi0jIGZ1bGZpbGxtZW50IG9mIERlY3JlZSBOby4gNywyNzMgb2YgdGhlIEV4ZWN1dGl2ZSBQb3dlci4uLi4gIFRoZSB0aW1lIGNoYW5nZQotIyBzeXN0ZW0gaGFzIGJlZW4gb3BlcmF0aW5nIGZvciBzZXZlcmFsIHllYXJzLiAgRm9ybWVybHkgdGhlcmUgd2FzIGEgc2VwYXJhdGUKLSMgZGVjcmVlIGVhY2ggeWVhcjsgdGhlIG5ldyBsYXcgaGFzIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHBlcm1hbmVudGx5LiAgRXZlcnkKLSMgeWVhciwgdGhlIHRpbWUgd2lsbCBjaGFuZ2Ugb24gdGhlIGZpcnN0IFN1bmRheSBvZiBPY3RvYmVyOyBsaWtld2lzZSwgdGhlCi0jIGNsb2NrIHdpbGwgYmUgc2V0IGJhY2sgb24gdGhlIGZpcnN0IFN1bmRheSBvZiBNYXJjaC4KLSMKLVJ1bGUJUGFyYQkxOTk2CTIwMDEJLQlPY3QJU3VuPj0xCTA6MDAJMTowMAlTCi0jIElBVEEgU1NJTSAoMTk5Ny0wOSkgc2F5cyBNYXIgMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVBhcmEJMTk5Nwlvbmx5CS0JRmViCWxhc3RTdW4JMDowMAkwCS0KLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSAxOTk5LTAyLTI4OyBJQVRBIFNTSU0gKDE5OTktMDIpIHNheXMgMTk5OS0wMi0yNywgYnV0Ci0jICgxOTk5LTA5KSByZXBvcnRzIG5vIGRhdGU7IGdvIHdpdGggYWJvdmUgc291cmNlcyBhbmQgR2VyZCBLbm9wcyAoMjAwMS0wMi0yNykuCi1SdWxlCVBhcmEJMTk5OAkyMDAxCS0JTWFyCVN1bj49MQkwOjAwCTAJLQotIyBGcm9tIFJpdmVzIE1jRG93ICgyMDAyLTAyLTI4KToKLSMgQSBkZWNyZWUgd2FzIGlzc3VlZCBpbiBQYXJhZ3VheSAobm8uIDE2MzUwKSBvbiAyMDAyLTAyLTI2IHRoYXQgY2hhbmdlZCB0aGUKLSMgZHN0IG1ldGhvZCB0byBiZSBmcm9tIHRoZSBmaXJzdCBTdW5kYXkgaW4gU2VwdGVtYmVyIHRvIHRoZSBmaXJzdCBTdW5kYXkgaW4KLSMgQXByaWwuCi1SdWxlCVBhcmEJMjAwMgkyMDA0CS0JQXByCVN1bj49MQkwOjAwCTAJLQotUnVsZQlQYXJhCTIwMDIJMjAwMwktCVNlcAlTdW4+PTEJMDowMAkxOjAwCVMKLSMKLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDUtMDEtMDIpOgotIyBUaGVyZSBhcmUgc2V2ZXJhbCBzb3VyY2VzIHRoYXQgY2xhaW0gdGhhdCBQYXJhZ3VheSBtYWRlCi0jIGEgdGltZXpvbmUgcnVsZSBjaGFuZ2UgaW4gYXV0dW1uIDIwMDQuCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTAxLTA1KToKLSMgRGVjcmVlIDEsODY3ICgyMDA0LTAzLTA1KQotIyBGcm9tIENhcmxvcyBSYXVsIFBlcmFzc28gdmlhIEplc3BlciBOb3JnYWFyZCBXZWxlbiAoMjAwNi0xMC0xMykKLSMgPGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ292LnB5L2RlY3JldG9zL0QxODY3LnBkZj4KLVJ1bGUJUGFyYQkyMDA0CTIwMDkJLQlPY3QJU3VuPj0xNQkwOjAwCTE6MDAJUwotUnVsZQlQYXJhCTIwMDUJMjAwOQktCU1hcglTdW4+PTgJMDowMAkwCS0KLSMgRnJvbSBDYXJsb3MgUmF1bCBQZXJhc3NvICgyMDEwLTAyLTE4KToKLSMgQnkgZGVjcmVlIG51bWJlciAzOTU4IGlzc3VlZCB5ZXN0ZXJkYXkgKAotIyA8YSBocmVmPSJodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS92MS93cC1jb250ZW50L3VwbG9hZHMvMjAxMC8wMi9kZWNyZXRvMzk1OC5wZGYiPgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmdvdi5weS92MS93cC1jb250ZW50L3VwbG9hZHMvMjAxMC8wMi9kZWNyZXRvMzk1OC5wZGYKLSMgPC9hPgotIyApCi0jIFBhcmFndWF5IGNoYW5nZXMgaXRzIERTVCBzY2hlZHVsZSwgcG9zdHBvbmluZyB0aGUgTWFyY2ggcnVsZSB0byBBcHJpbCBhbmQKLSMgbW9kaWZ5aW5nIHRoZSBPY3RvYmVyIGRhdGUuIFRoZSBkZWNyZWUgcmVhZHM6Ci0jIC4uLgotIyBBcnQuIDEuIEl0IGlzIGhlcmVieSBlc3RhYmxpc2hlZCB0aGF0IGZyb20gdGhlIHNlY29uZCBTdW5kYXkgb2YgdGhlIG1vbnRoIG9mCi0jIEFwcmlsIG9mIHRoaXMgeWVhciAoMjAxMCksIHRoZSBvZmZpY2lhbCB0aW1lIGlzIHRvIGJlIHNldCBiYWNrIDYwIG1pbnV0ZXMsCi0jIGFuZCB0aGF0IG9uIHRoZSBmaXJzdCBTdW5kYXkgb2YgdGhlIG1vbnRoIG9mIE9jdG9iZXIsIGl0IGlzIHRvIGJlIHNldAotIyBmb3J3YXJkIDYwIG1pbnV0ZXMsIGluIGFsbCB0aGUgdGVycml0b3J5IG9mIHRoZSBQYXJhZ3VheWFuIFJlcHVibGljLgotIyAuLi4KLVJ1bGUJUGFyYQkyMDEwCW1heAktCU9jdAlTdW4+PTEJMDowMAkxOjAwCVMKLVJ1bGUJUGFyYQkyMDEwCW1heAktCUFwcglTdW4+PTgJMDowMAkwCS0KLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL0FzdW5jaW9uCS0zOjUwOjQwIC0JTE1UCTE4OTAKLQkJCS0zOjUwOjQwIC0JQU1UCTE5MzEgT2N0IDEwICMgQXN1bmNpb24gTWVhbiBUaW1lCi0JCQktNDowMAktCVBZVAkxOTcyIE9jdCAjIFBhcmFndWF5IFRpbWUKLQkJCS0zOjAwCS0JUFlUCTE5NzQgQXByCi0JCQktNDowMAlQYXJhCVBZJXNUCi0KLSMgUGVydQotIwotIyA8YSBocmVmPSJuZXdzOnhyR21iLjM5OTM1JGdBMS4xMzg5NjExM0BuZXdzNC5zcnYuaGN2bG55LmN2Lm5ldCI+Ci0jIEZyb20gRXZlbHluIEMuIExlZXBlciB2aWEgTWFyayBCcmFkZXIgKDIwMDMtMTAtMjYpOjwvYT4KLSMgV2hlbiB3ZSB3ZXJlIGluIFBlcnUgaW4gMTk4NS0xOTg2LCB0aGV5IGFwcGFyZW50bHkgc3dpdGNoZWQgb3ZlcgotIyBzb21ldGltZSBiZXR3ZWVuIERlY2VtYmVyIDI5IGFuZCBKYW51YXJ5IDMgd2hpbGUgd2Ugd2VyZSBvbiB0aGUgQW1hem9uLgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKLSMgU2hhbmtzICYgUG90dGVuZ2VyIGRvbid0IGhhdmUgdGhpcyB0cmFuc2l0aW9uLiAgQXNzdW1lIDE5ODYgd2FzIGxpa2UgMTk4Ny4KLQotIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKLVJ1bGUJUGVydQkxOTM4CW9ubHkJLQlKYW4JIDEJMDowMAkxOjAwCVMKLVJ1bGUJUGVydQkxOTM4CW9ubHkJLQlBcHIJIDEJMDowMAkwCS0KLVJ1bGUJUGVydQkxOTM4CTE5MzkJLQlTZXAJbGFzdFN1bgkwOjAwCTE6MDAJUwotUnVsZQlQZXJ1CTE5MzkJMTk0MAktCU1hcglTdW4+PTI0CTA6MDAJMAktCi1SdWxlCVBlcnUJMTk4NgkxOTg3CS0JSmFuCSAxCTA6MDAJMTowMAlTCi1SdWxlCVBlcnUJMTk4NgkxOTg3CS0JQXByCSAxCTA6MDAJMAktCi1SdWxlCVBlcnUJMTk5MAlvbmx5CS0JSmFuCSAxCTA6MDAJMTowMAlTCi1SdWxlCVBlcnUJMTk5MAlvbmx5CS0JQXByCSAxCTA6MDAJMAktCi0jIElBVEEgaXMgYW1iaWd1b3VzIGZvciAxOTkzLzE5OTU7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlQZXJ1CTE5OTQJb25seQktCUphbgkgMQkwOjAwCTE6MDAJUwotUnVsZQlQZXJ1CTE5OTQJb25seQktCUFwcgkgMQkwOjAwCTAJLQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBbWVyaWNhL0xpbWEJLTU6MDg6MTIgLQlMTVQJMTg5MAotCQkJLTU6MDg6MzYgLQlMTVQJMTkwOCBKdWwgMjggIyBMaW1hIE1lYW4gVGltZT8KLQkJCS01OjAwCVBlcnUJUEUlc1QJIyBQZXJ1IFRpbWUKLQotIyBTb3V0aCBHZW9yZ2lhCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lIEF0bGFudGljL1NvdXRoX0dlb3JnaWEgLTI6MjY6MDggLQlMTVQJMTg5MAkJIyBHcnl0dmlrZW4KLQkJCS0yOjAwCS0JR1NUCSMgU291dGggR2VvcmdpYSBUaW1lCi0KLSMgU291dGggU2FuZHdpY2ggSXMKLSMgdW5pbmhhYml0ZWQ7IHNjaWVudGlmaWMgcGVyc29ubmVsIGhhdmUgd2ludGVyZWQKLQotIyBTdXJpbmFtZQotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1BhcmFtYXJpYm8JLTM6NDA6NDAgLQlMTVQJMTkxMQotCQkJLTM6NDA6NTIgLQlQTVQJMTkzNSAgICAgIyBQYXJhbWFyaWJvIE1lYW4gVGltZQotCQkJLTM6NDA6MzYgLQlQTVQJMTk0NSBPY3QgIyBUaGUgY2FwaXRhbCBtb3ZlZD8KLQkJCS0zOjMwCS0JTkVHVAkxOTc1IE5vdiAyMCAjIER1dGNoIEd1aWFuYSBUaW1lCi0JCQktMzozMAktCVNSVAkxOTg0IE9jdCAjIFN1cmluYW1lIFRpbWUKLQkJCS0zOjAwCS0JU1JUCi0KLSMgVHJpbmlkYWQgYW5kIFRvYmFnbwotIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZSBBbWVyaWNhL1BvcnRfb2ZfU3BhaW4gLTQ6MDY6MDQgLQlMTVQJMTkxMiBNYXIgMgotCQkJLTQ6MDAJLQlBU1QKLQotIyBVcnVndWF5Ci0jIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTMtMTEtMTgpOgotIyBVcnVndWF5IHdpbnMgdGhlIHByaXplIGZvciB0aGUgc3RyYW5nZXN0IHBlYWNldGltZSBtYW5pcHVsYXRpb24gb2YgdGhlIHJ1bGVzLgotIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlcjoKLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jIFdoaXRtYW4gZ2l2ZXMgMTkyMyBPY3QgMTsgZ28gd2l0aCBTaGFua3MgJiBQb3R0ZW5nZXIuCi1SdWxlCVVydWd1YXkJMTkyMwlvbmx5CS0JT2N0CSAyCSAwOjAwCTA6MzAJSFMKLVJ1bGUJVXJ1Z3VheQkxOTI0CTE5MjYJLQlBcHIJIDEJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTkyNAkxOTI1CS0JT2N0CSAxCSAwOjAwCTA6MzAJSFMKLVJ1bGUJVXJ1Z3VheQkxOTMzCTE5MzUJLQlPY3QJbGFzdFN1bgkgMDowMAkwOjMwCUhTCi0jIFNoYW5rcyAmIFBvdHRlbmdlciBnaXZlIDE5MzUgQXByIDEgMDowMCAmIDE5MzYgTWFyIDMwIDA6MDA7IGdvIHdpdGggV2hpdG1hbi4KLVJ1bGUJVXJ1Z3VheQkxOTM0CTE5MzYJLQlNYXIJU2F0Pj0yNQkyMzozMHMJMAktCi1SdWxlCVVydWd1YXkJMTkzNglvbmx5CS0JTm92CSAxCSAwOjAwCTA6MzAJSFMKLVJ1bGUJVXJ1Z3VheQkxOTM3CTE5NDEJLQlNYXIJbGFzdFN1bgkgMDowMAkwCS0KLSMgV2hpdG1hbiBnaXZlcyAxOTM3IE9jdCAzOyBnbyB3aXRoIFNoYW5rcyAmIFBvdHRlbmdlci4KLVJ1bGUJVXJ1Z3VheQkxOTM3CTE5NDAJLQlPY3QJbGFzdFN1bgkgMDowMAkwOjMwCUhTCi0jIFdoaXRtYW4gZ2l2ZXMgMTk0MSBPY3QgMjQgLSAxOTQyIE1hciAyNywgMTk0MiBEZWMgMTQgLSAxOTQzIEFwciAxMywKLSMgYW5kIDE5NDMgQXByIDEzIGBgdG8gcHJlc2VudCB0aW1lJyc7IGdvIHdpdGggU2hhbmtzICYgUG90dGVuZ2VyLgotUnVsZQlVcnVndWF5CTE5NDEJb25seQktCUF1ZwkgMQkgMDowMAkwOjMwCUhTCi1SdWxlCVVydWd1YXkJMTk0Mglvbmx5CS0JSmFuCSAxCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NDIJb25seQktCURlYwkxNAkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTQzCW9ubHkJLQlNYXIJMTQJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk1OQlvbmx5CS0JTWF5CTI0CSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5NTkJb25seQktCU5vdgkxNQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTYwCW9ubHkJLQlKYW4JMTcJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk2MAlvbmx5CS0JTWFyCSA2CSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NjUJMTk2NwktCUFwcglTdW4+PTEJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk2NQlvbmx5CS0JU2VwCTI2CSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NjYJMTk2NwktCU9jdAkzMQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTY4CTE5NzAJLQlNYXkJMjcJIDA6MDAJMDozMAlIUwotUnVsZQlVcnVndWF5CTE5NjgJMTk3MAktCURlYwkgMgkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTcyCW9ubHkJLQlBcHIJMjQJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk3Mglvbmx5CS0JQXVnCTE1CSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NzQJb25seQktCU1hcgkxMAkgMDowMAkwOjMwCUhTCi1SdWxlCVVydWd1YXkJMTk3NAlvbmx5CS0JRGVjCTIyCSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5NzYJb25seQktCU9jdAkgMQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTc3CW9ubHkJLQlEZWMJIDQJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk3OAlvbmx5CS0JQXByCSAxCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5NzkJb25seQktCU9jdAkgMQkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTgwCW9ubHkJLQlNYXkJIDEJIDA6MDAJMAktCi1SdWxlCVVydWd1YXkJMTk4Nwlvbmx5CS0JRGVjCTE0CSAwOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTE5ODgJb25seQktCU1hcgkxNAkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTg4CW9ubHkJLQlEZWMJMTEJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk4OQlvbmx5CS0JTWFyCTEyCSAwOjAwCTAJLQotUnVsZQlVcnVndWF5CTE5ODkJb25seQktCU9jdAkyOQkgMDowMAkxOjAwCVMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHNheSBubyBEU1Qgd2FzIG9ic2VydmVkIGluIDE5OTAvMSBhbmQgMTk5MS8yLAotIyBhbmQgdGhhdCAxOTkyLzMncyBEU1Qgd2FzIGZyb20gMTAtMjUgdG8gMDMtMDEuICBHbyB3aXRoIElBVEEuCi1SdWxlCVVydWd1YXkJMTk5MAkxOTkyCS0JTWFyCVN1bj49MQkgMDowMAkwCS0KLVJ1bGUJVXJ1Z3VheQkxOTkwCTE5OTEJLQlPY3QJU3VuPj0yMQkgMDowMAkxOjAwCVMKLVJ1bGUJVXJ1Z3VheQkxOTkyCW9ubHkJLQlPY3QJMTgJIDA6MDAJMTowMAlTCi1SdWxlCVVydWd1YXkJMTk5Mwlvbmx5CS0JRmViCTI4CSAwOjAwCTAJLQotIyBGcm9tIEVkdWFyZG8gQ290YSAoMjAwNC0wOS0yMCk6Ci0jIFRoZSB1cnVndWF5YW4gZ292ZXJubWVudCBoYXMgZGVjcmVlZCBhIGNoYW5nZSBpbiB0aGUgbG9jYWwgdGltZS4uLi4KLSMgaHR0cDovL3d3dy5wcmVzaWRlbmNpYS5ndWIudXkvZGVjcmV0b3MvMjAwNDA5MTUwMi5odG0KLVJ1bGUJVXJ1Z3VheQkyMDA0CW9ubHkJLQlTZXAJMTkJIDA6MDAJMTowMAlTCi0jIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDA1LTAzLTExKToKLSMgVXJ1Z3VheSdzIERTVCB3YXMgc2NoZWR1bGVkIHRvIGVuZCBvbiBTdW5kYXksIDIwMDUtMDMtMTMsIGJ1dCBpbiBvcmRlciB0bwotIyBzYXZlIGVuZXJneSAuLi4gaXQgd2FzIHBvc3Rwb25lZCB0d28gd2Vla3MuLi4uCi0jIGh0dHA6Ly93d3cucHJlc2lkZW5jaWEuZ3ViLnV5L19XZWIvbm90aWNpYXMvMjAwNS8wMy8yMDA1MDMxMDA1Lmh0bQotUnVsZQlVcnVndWF5CTIwMDUJb25seQktCU1hcgkyNwkgMjowMAkwCS0KLSMgRnJvbSBFZHVhcmRvIENvdGEgKDIwMDUtMDktMjcpOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9fV2ViL2RlY3JldG9zLzIwMDUvMDkvQ00lMjAxMTlfMDklMjAwOSUyMDIwMDVfMDAwMDEuUERGCi0jIFRoaXMgbWVhbnMgdGhhdCBmcm9tIDIwMDUtMTAtMDkgYXQgMDI6MDAgbG9jYWwgdGltZSwgdW50aWwgMjAwNi0wMy0xMiBhdAotIyAwMjowMCBsb2NhbCB0aW1lLCBvZmZpY2lhbCB0aW1lIGluIFVydWd1YXkgd2lsbCBiZSBhdCBHTVQgLTIuCi1SdWxlCVVydWd1YXkJMjAwNQlvbmx5CS0JT2N0CSA5CSAyOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTIwMDYJb25seQktCU1hcgkxMgkgMjowMAkwCS0KLSMgRnJvbSBKZXNwZXIgTm9yZ2FhcmQgV2VsZW4gKDIwMDYtMDktMDYpOgotIyBodHRwOi8vd3d3LnByZXNpZGVuY2lhLmd1Yi51eS9fd2ViL2RlY3JldG9zLzIwMDYvMDkvQ00lMjAyMTBfMDglMjAwNiUyMDIwMDZfMDAwMDEuUERGCi1SdWxlCVVydWd1YXkJMjAwNgltYXgJLQlPY3QJU3VuPj0xCSAyOjAwCTE6MDAJUwotUnVsZQlVcnVndWF5CTIwMDcJbWF4CS0JTWFyCVN1bj49OAkgMjowMAkwCS0KLSMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KLVpvbmUgQW1lcmljYS9Nb250ZXZpZGVvCS0zOjQ0OjQ0IC0JTE1UCTE4OTggSnVuIDI4Ci0JCQktMzo0NDo0NCAtCU1NVAkxOTIwIE1heSAgMQkjIE1vbnRldmlkZW8gTVQKLQkJCS0zOjMwCVVydWd1YXkJVVklc1QJMTk0MiBEZWMgMTQJIyBVcnVndWF5IFRpbWUKLQkJCS0zOjAwCVVydWd1YXkJVVklc1QKLQotIyBWZW5lenVlbGEKLSMKLSMgRnJvbSBKb2huIFN0YWluZm9ydGggKDIwMDctMTEtMjgpOgotIyAuLi4gdGhlIGNoYW5nZSBmb3IgVmVuZXp1ZWxhIG9yaWdpbmFsbHkgZXhwZWN0ZWQgZm9yIDIwMDctMTItMzEgaGFzCi0jIGJlZW4gYnJvdWdodCBmb3J3YXJkIHRvIDIwMDctMTItMDkuICBUaGUgb2ZmaWNpYWwgYW5ub3VuY2VtZW50IHdhcwotIyBwdWJsaXNoZWQgdG9kYXkgaW4gdGhlICJHYWNldGEgT2ZpY2lhbCBkZSBsYSBSZXB1YmxpY2EgQm9saXZhcmlhbmEKLSMgZGUgVmVuZXp1ZWxhLCBudW1lcm8gMzguODE5IiAob2ZmaWNpYWwgZG9jdW1lbnQgZm9yIGFsbCBsYXdzIG9yCi0jIHJlc29sdXRpb24gcHVibGljYXRpb24pCi0jIGh0dHA6Ly93d3cuZ2xvYm92aXNpb24uY29tL25ld3MucGhwP25pZD03MjIwOAotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFtZXJpY2EvQ2FyYWNhcwktNDoyNzo0NCAtCUxNVAkxODkwCi0JCQktNDoyNzo0MCAtCUNNVAkxOTEyIEZlYiAxMiAjIENhcmFjYXMgTWVhbiBUaW1lPwotCQkJLTQ6MzAJLQlWRVQJMTk2NQkgICAgICMgVmVuZXp1ZWxhIFRpbWUKLQkJCS00OjAwCS0JVkVUCTIwMDcgRGVjICA5IDAzOjAwCi0JCQktNDozMAktCVZFVApkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvc3lzdGVtdiBiL3Rvb2xzL3pvbmVpbmZvL3R6ZGF0YTIwMTBrL3N5c3RlbXYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzM4OGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvc3lzdGVtdgorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgPHByZT4KLSMgQCgjKXN5c3RlbXYJOC4yCi0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotCi0jIE9sZCBydWxlcywgc2hvdWxkIHRoZSBuZWVkIGFyaXNlLgotIyBObyBhdHRlbXB0IGlzIG1hZGUgdG8gaGFuZGxlIE5ld2ZvdW5kbGFuZCwgc2luY2UgaXQgY2Fubm90IGJlIGV4cHJlc3NlZAotIyB1c2luZyB0aGUgU3lzdGVtIFYgIlRaIiBzY2hlbWUgKGhhbGYtaG91ciBvZmZzZXQpLCBvciBhbnl0aGluZyBvdXRzaWRlCi0jIE5vcnRoIEFtZXJpY2EgKG5vIHN1cHBvcnQgZm9yIG5vbi1zdGFuZGFyZCBEU1Qgc3RhcnQvZW5kIGRhdGVzKSwgbm9yCi0jIHRoZSBjaGFuZ2VzIGluIHRoZSBEU1QgcnVsZXMgaW4gdGhlIFVTIGFmdGVyIDE5NzYgKHdoaWNoIG9jY3VycmVkIGFmdGVyCi0jIHRoZSBvbGQgcnVsZXMgd2VyZSB3cml0dGVuKS4KLSMKLSMgSWYgeW91IG5lZWQgdGhlIG9sZCBydWxlcywgdW5jb21tZW50ICMjIGxpbmVzLgotIyBDb21waWxlIHRoaXMgKndpdGhvdXQqIGxlYXAgc2Vjb25kIGNvcnJlY3Rpb24gZm9yIHRydWUgY29uZm9ybWFuY2UuCi0KLSMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi1SdWxlCVN5c3RlbVYJbWluCTE5NzMJLQlBcHIJbGFzdFN1bgkyOjAwCTE6MDAJRAotUnVsZQlTeXN0ZW1WCW1pbgkxOTczCS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3lzdGVtVgkxOTc0CW9ubHkJLQlKYW4JNgkyOjAwCTE6MDAJRAotUnVsZQlTeXN0ZW1WCTE5NzQJb25seQktCU5vdglsYXN0U3VuCTI6MDAJMAlTCi1SdWxlCVN5c3RlbVYJMTk3NQlvbmx5CS0JRmViCTIzCTI6MDAJMTowMAlECi1SdWxlCVN5c3RlbVYJMTk3NQlvbmx5CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKLVJ1bGUJU3lzdGVtVgkxOTc2CW1heAktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECi1SdWxlCVN5c3RlbVYJMTk3NgltYXgJLQlPY3QJbGFzdFN1bgkyOjAwCTAJUwotCi0jIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTL1NBVkUJRk9STUFUCVtVTlRJTF0KLSMjIFpvbmUJU3lzdGVtVi9BU1Q0QURUCS00OjAwCVN5c3RlbVYJCUElc1QKLSMjIFpvbmUJU3lzdGVtVi9FU1Q1RURUCS01OjAwCVN5c3RlbVYJCUUlc1QKLSMjIFpvbmUJU3lzdGVtVi9DU1Q2Q0RUCS02OjAwCVN5c3RlbVYJCUMlc1QKLSMjIFpvbmUJU3lzdGVtVi9NU1Q3TURUCS03OjAwCVN5c3RlbVYJCU0lc1QKLSMjIFpvbmUJU3lzdGVtVi9QU1Q4UERUCS04OjAwCVN5c3RlbVYJCVAlc1QKLSMjIFpvbmUJU3lzdGVtVi9ZU1Q5WURUCS05OjAwCVN5c3RlbVYJCVklc1QKLSMjIFpvbmUJU3lzdGVtVi9BU1Q0CS00OjAwCS0JCUFTVAotIyMgWm9uZQlTeXN0ZW1WL0VTVDUJLTU6MDAJLQkJRVNUCi0jIyBab25lCVN5c3RlbVYvQ1NUNgktNjowMAktCQlDU1QKLSMjIFpvbmUJU3lzdGVtVi9NU1Q3CS03OjAwCS0JCU1TVAotIyMgWm9uZQlTeXN0ZW1WL1BTVDgJLTg6MDAJLQkJUFNUCi0jIyBab25lCVN5c3RlbVYvWVNUOQktOTowMAktCQlZU1QKLSMjIFpvbmUJU3lzdGVtVi9IU1QxMAktMTA6MDAJLQkJSFNUCmRpZmYgLS1naXQgYS90b29scy96b25laW5mby90emRhdGEyMDEway95ZWFyaXN0eXBlLnNoIGIvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsveWVhcmlzdHlwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkYmY4OS4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway95ZWFyaXN0eXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi06ICdUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZicKLTogJzIwMDYtMDctMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLicKLQotOiAnQCgjKXllYXJpc3R5cGUuc2gJOC4yJwotCi1jYXNlICQjLSQxIGluCi0JMi18Mi0wKnwyLSpbITAtOV0qKQotCQllY2hvICIkMDogd2lsZCB5ZWFyIC0gJDEiID4mMgotCQlleGl0IDEgOzsKLWVzYWMKLQotY2FzZSAkIy0kMiBpbgotCTItZXZlbikKLQkJY2FzZSAkMSBpbgotCQkJKlsyNDY4MF0pCQkJZXhpdCAwIDs7Ci0JCQkqKQkJCQlleGl0IDEgOzsKLQkJZXNhYyA7OwotCTItbm9ucHJlc3wyLW5vbnVzcHJlcykKLQkJY2FzZSAkMSBpbgotCQkJKlswMjQ2OF1bMDQ4XXwqWzEzNTc5XVsyNl0pCWV4aXQgMSA7OwotCQkJKikJCQkJZXhpdCAwIDs7Ci0JCWVzYWMgOzsKLQkyLW9kZCkKLQkJY2FzZSAkMSBpbgotCQkJKlsxMzU3OV0pCQkJZXhpdCAwIDs7Ci0JCQkqKQkJCQlleGl0IDEgOzsKLQkJZXNhYyA7OwotCTItdXNwcmVzKQotCQljYXNlICQxIGluCi0JCQkqWzAyNDY4XVswNDhdfCpbMTM1NzldWzI2XSkJZXhpdCAwIDs7Ci0JCQkqKQkJCQlleGl0IDEgOzsKLQkJZXNhYyA7OwotCTItKikKLQkJZWNobyAiJDA6IHdpbGQgdHlwZSAtICQyIiA+JjIgOzsKLWVzYWMKLQotZWNobyAiJDA6IHVzYWdlIGlzICQwIHllYXIgZXZlbnxvZGR8dXNwcmVzfG5vbnByZXN8bm9udXNwcmVzIiA+JjIKLWV4aXQgMQpkaWZmIC0tZ2l0IGEvdG9vbHMvem9uZWluZm8vdHpkYXRhMjAxMGsvem9uZS50YWIgYi90b29scy96b25laW5mby90emRhdGEyMDEway96b25lLnRhYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjMmFkZC4uMDAwMDAwMAotLS0gYS90b29scy96b25laW5mby90emRhdGEyMDEway96b25lLnRhYgorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0jIDxwcmU+Ci0jIEAoIyl6b25lLnRhYgk4LjM3Ci0jIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gY2xhcmlmaWVkIGFzIG9mCi0jIDIwMDktMDUtMTcgYnkgQXJ0aHVyIERhdmlkIE9sc29uLgotIwotIyBUWiB6b25lIGRlc2NyaXB0aW9ucwotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk2LTA4LTA1KToKLSMKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6Ci0jIDEuICBJU08gMzE2NiAyLWNoYXJhY3RlciBjb3VudHJ5IGNvZGUuICBTZWUgdGhlIGZpbGUgYGlzbzMxNjYudGFiJy4KLSMgMi4gIExhdGl0dWRlIGFuZCBsb25naXR1ZGUgb2YgdGhlIHpvbmUncyBwcmluY2lwYWwgbG9jYXRpb24KLSMgICAgIGluIElTTyA2NzA5IHNpZ24tZGVncmVlcy1taW51dGVzLXNlY29uZHMgZm9ybWF0LAotIyAgICAgZWl0aGVyICstRERNTSstRERETU0gb3IgKy1ERE1NU1MrLURERE1NU1MsCi0jICAgICBmaXJzdCBsYXRpdHVkZSAoKyBpcyBub3J0aCksIHRoZW4gbG9uZ2l0dWRlICgrIGlzIGVhc3QpLgotIyAzLiAgWm9uZSBuYW1lIHVzZWQgaW4gdmFsdWUgb2YgVFogZW52aXJvbm1lbnQgdmFyaWFibGUuCi0jIDQuICBDb21tZW50czsgcHJlc2VudCBpZiBhbmQgb25seSBpZiB0aGUgY291bnRyeSBoYXMgbXVsdGlwbGUgcm93cy4KLSMKLSMgQ29sdW1ucyBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHRhYi4KLSMgVGhlIHRhYmxlIGlzIHNvcnRlZCBmaXJzdCBieSBjb3VudHJ5LCB0aGVuIGFuIG9yZGVyIHdpdGhpbiB0aGUgY291bnRyeSB0aGF0Ci0jICgxKSBtYWtlcyBzb21lIGdlb2dyYXBoaWNhbCBzZW5zZSwgYW5kCi0jICgyKSBwdXRzIHRoZSBtb3N0IHBvcHVsb3VzIHpvbmVzIGZpcnN0LCB3aGVyZSB0aGF0IGRvZXMgbm90IGNvbnRyYWRpY3QgKDEpLgotIwotIyBMaW5lcyBiZWdpbm5pbmcgd2l0aCBgIycgYXJlIGNvbW1lbnRzLgotIwotI2NvdW50cnktCi0jY29kZQljb29yZGluYXRlcwlUWgkJCWNvbW1lbnRzCi1BRAkrNDIzMCswMDEzMQlFdXJvcGUvQW5kb3JyYQotQUUJKzI1MTgrMDU1MTgJQXNpYS9EdWJhaQotQUYJKzM0MzErMDY5MTIJQXNpYS9LYWJ1bAotQUcJKzE3MDMtMDYxNDgJQW1lcmljYS9BbnRpZ3VhCi1BSQkrMTgxMi0wNjMwNAlBbWVyaWNhL0FuZ3VpbGxhCi1BTAkrNDEyMCswMTk1MAlFdXJvcGUvVGlyYW5lCi1BTQkrNDAxMSswNDQzMAlBc2lhL1llcmV2YW4KLUFOCSsxMjExLTA2OTAwCUFtZXJpY2EvQ3VyYWNhbwotQU8JLTA4NDgrMDEzMTQJQWZyaWNhL0x1YW5kYQotQVEJLTc3NTArMTY2MzYJQW50YXJjdGljYS9NY011cmRvCU1jTXVyZG8gU3RhdGlvbiwgUm9zcyBJc2xhbmQKLUFRCS05MDAwKzAwMDAwCUFudGFyY3RpY2EvU291dGhfUG9sZQlBbXVuZHNlbi1TY290dCBTdGF0aW9uLCBTb3V0aCBQb2xlCi1BUQktNjczNC0wNjgwOAlBbnRhcmN0aWNhL1JvdGhlcmEJUm90aGVyYSBTdGF0aW9uLCBBZGVsYWlkZSBJc2xhbmQKLUFRCS02NDQ4LTA2NDA2CUFudGFyY3RpY2EvUGFsbWVyCVBhbG1lciBTdGF0aW9uLCBBbnZlcnMgSXNsYW5kCi1BUQktNjczNiswNjI1MwlBbnRhcmN0aWNhL01hd3NvbglNYXdzb24gU3RhdGlvbiwgSG9sbWUgQmF5Ci1BUQktNjgzNSswNzc1OAlBbnRhcmN0aWNhL0RhdmlzCURhdmlzIFN0YXRpb24sIFZlc3Rmb2xkIEhpbGxzCi1BUQktNjYxNysxMTAzMQlBbnRhcmN0aWNhL0Nhc2V5CUNhc2V5IFN0YXRpb24sIEJhaWxleSBQZW5pbnN1bGEKLUFRCS03ODI0KzEwNjU0CUFudGFyY3RpY2EvVm9zdG9rCVZvc3RvayBTdGF0aW9uLCBTIE1hZ25ldGljIFBvbGUKLUFRCS02NjQwKzE0MDAxCUFudGFyY3RpY2EvRHVtb250RFVydmlsbGUJRHVtb250LWQnVXJ2aWxsZSBTdGF0aW9uLCBUZXJyZSBBZGVsaWUKLUFRCS02OTAwMjIrMDM5MzUyNAlBbnRhcmN0aWNhL1N5b3dhCVN5b3dhIFN0YXRpb24sIEUgT25ndWwgSQotQVEJLTU0MzArMTU4NTcJQW50YXJjdGljYS9NYWNxdWFyaWUJTWFjcXVhcmllIElzbGFuZCBTdGF0aW9uLCBNYWNxdWFyaWUgSXNsYW5kCi1BUgktMzQzNi0wNTgyNwlBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMJQnVlbm9zIEFpcmVzIChCQSwgQ0YpCi1BUgktMzEyNC0wNjQxMQlBbWVyaWNhL0FyZ2VudGluYS9Db3Jkb2JhCW1vc3QgbG9jYXRpb25zIChDQiwgQ0MsIENOLCBFUiwgRk0sIE1OLCBTRSwgU0YpCi1BUgktMjQ0Ny0wNjUyNQlBbWVyaWNhL0FyZ2VudGluYS9TYWx0YQkoU0EsIExQLCBOUSwgUk4pCi1BUgktMjQxMS0wNjUxOAlBbWVyaWNhL0FyZ2VudGluYS9KdWp1eQlKdWp1eSAoSlkpCi1BUgktMjY0OS0wNjUxMwlBbWVyaWNhL0FyZ2VudGluYS9UdWN1bWFuCVR1Y3VtYW4gKFRNKQotQVIJLTI4MjgtMDY1NDcJQW1lcmljYS9BcmdlbnRpbmEvQ2F0YW1hcmNhCUNhdGFtYXJjYSAoQ1QpLCBDaHVidXQgKENIKQotQVIJLTI5MjYtMDY2NTEJQW1lcmljYS9BcmdlbnRpbmEvTGFfUmlvamEJTGEgUmlvamEgKExSKQotQVIJLTMxMzItMDY4MzEJQW1lcmljYS9BcmdlbnRpbmEvU2FuX0p1YW4JU2FuIEp1YW4gKFNKKQotQVIJLTMyNTMtMDY4NDkJQW1lcmljYS9BcmdlbnRpbmEvTWVuZG96YQlNZW5kb3phIChNWikKLUFSCS0zMzE5LTA2NjIxCUFtZXJpY2EvQXJnZW50aW5hL1Nhbl9MdWlzCVNhbiBMdWlzIChTTCkKLUFSCS01MTM4LTA2OTEzCUFtZXJpY2EvQXJnZW50aW5hL1Jpb19HYWxsZWdvcwlTYW50YSBDcnV6IChTQykKLUFSCS01NDQ4LTA2ODE4CUFtZXJpY2EvQXJnZW50aW5hL1VzaHVhaWEJVGllcnJhIGRlbCBGdWVnbyAoVEYpCi1BUwktMTQxNi0xNzA0MglQYWNpZmljL1BhZ29fUGFnbwotQVQJKzQ4MTMrMDE2MjAJRXVyb3BlL1ZpZW5uYQotQVUJLTMxMzMrMTU5MDUJQXVzdHJhbGlhL0xvcmRfSG93ZQlMb3JkIEhvd2UgSXNsYW5kCi1BVQktNDI1MysxNDcxOQlBdXN0cmFsaWEvSG9iYXJ0CVRhc21hbmlhIC0gbW9zdCBsb2NhdGlvbnMKLUFVCS0zOTU2KzE0MzUyCUF1c3RyYWxpYS9DdXJyaWUJVGFzbWFuaWEgLSBLaW5nIElzbGFuZAotQVUJLTM3NDkrMTQ0NTgJQXVzdHJhbGlhL01lbGJvdXJuZQlWaWN0b3JpYQotQVUJLTMzNTIrMTUxMTMJQXVzdHJhbGlhL1N5ZG5leQlOZXcgU291dGggV2FsZXMgLSBtb3N0IGxvY2F0aW9ucwotQVUJLTMxNTcrMTQxMjcJQXVzdHJhbGlhL0Jyb2tlbl9IaWxsCU5ldyBTb3V0aCBXYWxlcyAtIFlhbmNvd2lubmEKLUFVCS0yNzI4KzE1MzAyCUF1c3RyYWxpYS9CcmlzYmFuZQlRdWVlbnNsYW5kIC0gbW9zdCBsb2NhdGlvbnMKLUFVCS0yMDE2KzE0OTAwCUF1c3RyYWxpYS9MaW5kZW1hbglRdWVlbnNsYW5kIC0gSG9saWRheSBJc2xhbmRzCi1BVQktMzQ1NSsxMzgzNQlBdXN0cmFsaWEvQWRlbGFpZGUJU291dGggQXVzdHJhbGlhCi1BVQktMTIyOCsxMzA1MAlBdXN0cmFsaWEvRGFyd2luCU5vcnRoZXJuIFRlcnJpdG9yeQotQVUJLTMxNTcrMTE1NTEJQXVzdHJhbGlhL1BlcnRoCVdlc3Rlcm4gQXVzdHJhbGlhIC0gbW9zdCBsb2NhdGlvbnMKLUFVCS0zMTQzKzEyODUyCUF1c3RyYWxpYS9FdWNsYQlXZXN0ZXJuIEF1c3RyYWxpYSAtIEV1Y2xhIGFyZWEKLUFXCSsxMjMwLTA2OTU4CUFtZXJpY2EvQXJ1YmEKLUFYCSs2MDA2KzAxOTU3CUV1cm9wZS9NYXJpZWhhbW4KLUFaCSs0MDIzKzA0OTUxCUFzaWEvQmFrdQotQkEJKzQzNTIrMDE4MjUJRXVyb3BlL1NhcmFqZXZvCi1CQgkrMTMwNi0wNTkzNwlBbWVyaWNhL0JhcmJhZG9zCi1CRAkrMjM0MyswOTAyNQlBc2lhL0RoYWthCi1CRQkrNTA1MCswMDQyMAlFdXJvcGUvQnJ1c3NlbHMKLUJGCSsxMjIyLTAwMTMxCUFmcmljYS9PdWFnYWRvdWdvdQotQkcJKzQyNDErMDIzMTkJRXVyb3BlL1NvZmlhCi1CSAkrMjYyMyswNTAzNQlBc2lhL0JhaHJhaW4KLUJJCS0wMzIzKzAyOTIyCUFmcmljYS9CdWp1bWJ1cmEKLUJKCSswNjI5KzAwMjM3CUFmcmljYS9Qb3J0by1Ob3ZvCi1CTAkrMTc1My0wNjI1MQlBbWVyaWNhL1N0X0JhcnRoZWxlbXkKLUJNCSszMjE3LTA2NDQ2CUF0bGFudGljL0Jlcm11ZGEKLUJOCSswNDU2KzExNDU1CUFzaWEvQnJ1bmVpCi1CTwktMTYzMC0wNjgwOQlBbWVyaWNhL0xhX1BhegotQlIJLTAzNTEtMDMyMjUJQW1lcmljYS9Ob3JvbmhhCUF0bGFudGljIGlzbGFuZHMKLUJSCS0wMTI3LTA0ODI5CUFtZXJpY2EvQmVsZW0JQW1hcGEsIEUgUGFyYQotQlIJLTAzNDMtMDM4MzAJQW1lcmljYS9Gb3J0YWxlemEJTkUgQnJhemlsIChNQSwgUEksIENFLCBSTiwgUEIpCi1CUgktMDgwMy0wMzQ1NAlBbWVyaWNhL1JlY2lmZQlQZXJuYW1idWNvCi1CUgktMDcxMi0wNDgxMglBbWVyaWNhL0FyYWd1YWluYQlUb2NhbnRpbnMKLUJSCS0wOTQwLTAzNTQzCUFtZXJpY2EvTWFjZWlvCUFsYWdvYXMsIFNlcmdpcGUKLUJSCS0xMjU5LTAzODMxCUFtZXJpY2EvQmFoaWEJQmFoaWEKLUJSCS0yMzMyLTA0NjM3CUFtZXJpY2EvU2FvX1BhdWxvCVMgJiBTRSBCcmF6aWwgKEdPLCBERiwgTUcsIEVTLCBSSiwgU1AsIFBSLCBTQywgUlMpCi1CUgktMjAyNy0wNTQzNwlBbWVyaWNhL0NhbXBvX0dyYW5kZQlNYXRvIEdyb3NzbyBkbyBTdWwKLUJSCS0xNTM1LTA1NjA1CUFtZXJpY2EvQ3VpYWJhCU1hdG8gR3Jvc3NvCi1CUgktMDIyNi0wNTQ1MglBbWVyaWNhL1NhbnRhcmVtCVcgUGFyYQotQlIJLTA4NDYtMDYzNTQJQW1lcmljYS9Qb3J0b19WZWxobwlSb25kb25pYQotQlIJKzAyNDktMDYwNDAJQW1lcmljYS9Cb2FfVmlzdGEJUm9yYWltYQotQlIJLTAzMDgtMDYwMDEJQW1lcmljYS9NYW5hdXMJRSBBbWF6b25hcwotQlIJLTA2NDAtMDY5NTIJQW1lcmljYS9FaXJ1bmVwZQlXIEFtYXpvbmFzCi1CUgktMDk1OC0wNjc0OAlBbWVyaWNhL1Jpb19CcmFuY28JQWNyZQotQlMJKzI1MDUtMDc3MjEJQW1lcmljYS9OYXNzYXUKLUJUCSsyNzI4KzA4OTM5CUFzaWEvVGhpbXBodQotQlcJLTI0MzkrMDI1NTUJQWZyaWNhL0dhYm9yb25lCi1CWQkrNTM1NCswMjczNAlFdXJvcGUvTWluc2sKLUJaCSsxNzMwLTA4ODEyCUFtZXJpY2EvQmVsaXplCi1DQQkrNDczNC0wNTI0MwlBbWVyaWNhL1N0X0pvaG5zCU5ld2ZvdW5kbGFuZCBUaW1lLCBpbmNsdWRpbmcgU0UgTGFicmFkb3IKLUNBCSs0NDM5LTA2MzM2CUFtZXJpY2EvSGFsaWZheAlBdGxhbnRpYyBUaW1lIC0gTm92YSBTY290aWEgKG1vc3QgcGxhY2VzKSwgUEVJCi1DQQkrNDYxMi0wNTk1NwlBbWVyaWNhL0dsYWNlX0JheQlBdGxhbnRpYyBUaW1lIC0gTm92YSBTY290aWEgLSBwbGFjZXMgdGhhdCBkaWQgbm90IG9ic2VydmUgRFNUIDE5NjYtMTk3MQotQ0EJKzQ2MDYtMDY0NDcJQW1lcmljYS9Nb25jdG9uCUF0bGFudGljIFRpbWUgLSBOZXcgQnJ1bnN3aWNrCi1DQQkrNTMyMC0wNjAyNQlBbWVyaWNhL0dvb3NlX0JheQlBdGxhbnRpYyBUaW1lIC0gTGFicmFkb3IgLSBtb3N0IGxvY2F0aW9ucwotQ0EJKzUxMjUtMDU3MDcJQW1lcmljYS9CbGFuYy1TYWJsb24JQXRsYW50aWMgU3RhbmRhcmQgVGltZSAtIFF1ZWJlYyAtIExvd2VyIE5vcnRoIFNob3JlCi1DQQkrNDUzMS0wNzMzNAlBbWVyaWNhL01vbnRyZWFsCUVhc3Rlcm4gVGltZSAtIFF1ZWJlYyAtIG1vc3QgbG9jYXRpb25zCi1DQQkrNDMzOS0wNzkyMwlBbWVyaWNhL1Rvcm9udG8JRWFzdGVybiBUaW1lIC0gT250YXJpbyAtIG1vc3QgbG9jYXRpb25zCi1DQQkrNDkwMS0wODgxNglBbWVyaWNhL05pcGlnb24JRWFzdGVybiBUaW1lIC0gT250YXJpbyAmIFF1ZWJlYyAtIHBsYWNlcyB0aGF0IGRpZCBub3Qgb2JzZXJ2ZSBEU1QgMTk2Ny0xOTczCi1DQQkrNDgyMy0wODkxNQlBbWVyaWNhL1RodW5kZXJfQmF5CUVhc3Rlcm4gVGltZSAtIFRodW5kZXIgQmF5LCBPbnRhcmlvCi1DQQkrNjM0NC0wNjgyOAlBbWVyaWNhL0lxYWx1aXQJRWFzdGVybiBUaW1lIC0gZWFzdCBOdW5hdnV0IC0gbW9zdCBsb2NhdGlvbnMKLUNBCSs2NjA4LTA2NTQ0CUFtZXJpY2EvUGFuZ25pcnR1bmcJRWFzdGVybiBUaW1lIC0gUGFuZ25pcnR1bmcsIE51bmF2dXQKLUNBCSs3NDQxNDQtMDk0NDk0NQlBbWVyaWNhL1Jlc29sdXRlCUVhc3Rlcm4gU3RhbmRhcmQgVGltZSAtIFJlc29sdXRlLCBOdW5hdnV0Ci1DQQkrNDg0NTMxLTA5MTM3MTgJQW1lcmljYS9BdGlrb2thbglFYXN0ZXJuIFN0YW5kYXJkIFRpbWUgLSBBdGlrb2thbiwgT250YXJpbyBhbmQgU291dGhhbXB0b24gSSwgTnVuYXZ1dAotQ0EJKzYyNDkwMC0wOTIwNDU5CUFtZXJpY2EvUmFua2luX0lubGV0CUNlbnRyYWwgVGltZSAtIGNlbnRyYWwgTnVuYXZ1dAotQ0EJKzQ5NTMtMDk3MDkJQW1lcmljYS9XaW5uaXBlZwlDZW50cmFsIFRpbWUgLSBNYW5pdG9iYSAmIHdlc3QgT250YXJpbwotQ0EJKzQ4NDMtMDk0MzQJQW1lcmljYS9SYWlueV9SaXZlcglDZW50cmFsIFRpbWUgLSBSYWlueSBSaXZlciAmIEZvcnQgRnJhbmNlcywgT250YXJpbwotQ0EJKzUwMjQtMTA0MzkJQW1lcmljYS9SZWdpbmEJQ2VudHJhbCBTdGFuZGFyZCBUaW1lIC0gU2Fza2F0Y2hld2FuIC0gbW9zdCBsb2NhdGlvbnMKLUNBCSs1MDE3LTEwNzUwCUFtZXJpY2EvU3dpZnRfQ3VycmVudAlDZW50cmFsIFN0YW5kYXJkIFRpbWUgLSBTYXNrYXRjaGV3YW4gLSBtaWR3ZXN0Ci1DQQkrNTMzMy0xMTMyOAlBbWVyaWNhL0VkbW9udG9uCU1vdW50YWluIFRpbWUgLSBBbGJlcnRhLCBlYXN0IEJyaXRpc2ggQ29sdW1iaWEgJiB3ZXN0IFNhc2thdGNoZXdhbgotQ0EJKzY5MDY1MC0xMDUwMzEwCUFtZXJpY2EvQ2FtYnJpZGdlX0JheQlNb3VudGFpbiBUaW1lIC0gd2VzdCBOdW5hdnV0Ci1DQQkrNjIyNy0xMTQyMQlBbWVyaWNhL1llbGxvd2tuaWZlCU1vdW50YWluIFRpbWUgLSBjZW50cmFsIE5vcnRod2VzdCBUZXJyaXRvcmllcwotQ0EJKzY4MjA1OS0xMzM0MzAwCUFtZXJpY2EvSW51dmlrCU1vdW50YWluIFRpbWUgLSB3ZXN0IE5vcnRod2VzdCBUZXJyaXRvcmllcwotQ0EJKzU5NDYtMTIwMTQJQW1lcmljYS9EYXdzb25fQ3JlZWsJTW91bnRhaW4gU3RhbmRhcmQgVGltZSAtIERhd3NvbiBDcmVlayAmIEZvcnQgU2FpbnQgSm9obiwgQnJpdGlzaCBDb2x1bWJpYQotQ0EJKzQ5MTYtMTIzMDcJQW1lcmljYS9WYW5jb3V2ZXIJUGFjaWZpYyBUaW1lIC0gd2VzdCBCcml0aXNoIENvbHVtYmlhCi1DQQkrNjA0My0xMzUwMwlBbWVyaWNhL1doaXRlaG9yc2UJUGFjaWZpYyBUaW1lIC0gc291dGggWXVrb24KLUNBCSs2NDA0LTEzOTI1CUFtZXJpY2EvRGF3c29uCVBhY2lmaWMgVGltZSAtIG5vcnRoIFl1a29uCi1DQwktMTIxMCswOTY1NQlJbmRpYW4vQ29jb3MKLUNECS0wNDE4KzAxNTE4CUFmcmljYS9LaW5zaGFzYQl3ZXN0IERlbS4gUmVwLiBvZiBDb25nbwotQ0QJLTExNDArMDI3MjgJQWZyaWNhL0x1YnVtYmFzaGkJZWFzdCBEZW0uIFJlcC4gb2YgQ29uZ28KLUNGCSswNDIyKzAxODM1CUFmcmljYS9CYW5ndWkKLUNHCS0wNDE2KzAxNTE3CUFmcmljYS9CcmF6emF2aWxsZQotQ0gJKzQ3MjMrMDA4MzIJRXVyb3BlL1p1cmljaAotQ0kJKzA1MTktMDA0MDIJQWZyaWNhL0FiaWRqYW4KLUNLCS0yMTE0LTE1OTQ2CVBhY2lmaWMvUmFyb3RvbmdhCi1DTAktMzMyNy0wNzA0MAlBbWVyaWNhL1NhbnRpYWdvCW1vc3QgbG9jYXRpb25zCi1DTAktMjcwOS0xMDkyNglQYWNpZmljL0Vhc3RlcglFYXN0ZXIgSXNsYW5kICYgU2FsYSB5IEdvbWV6Ci1DTQkrMDQwMyswMDk0MglBZnJpY2EvRG91YWxhCi1DTgkrMzExNCsxMjEyOAlBc2lhL1NoYW5naGFpCWVhc3QgQ2hpbmEgLSBCZWlqaW5nLCBHdWFuZ2RvbmcsIFNoYW5naGFpLCBldGMuCi1DTgkrNDU0NSsxMjY0MQlBc2lhL0hhcmJpbglIZWlsb25namlhbmcgKGV4Y2VwdCBNb2hlKSwgSmlsaW4KLUNOCSsyOTM0KzEwNjM1CUFzaWEvQ2hvbmdxaW5nCWNlbnRyYWwgQ2hpbmEgLSBTaWNodWFuLCBZdW5uYW4sIEd1YW5neGksIFNoYWFueGksIEd1aXpob3UsIGV0Yy4KLUNOCSs0MzQ4KzA4NzM1CUFzaWEvVXJ1bXFpCW1vc3Qgb2YgVGliZXQgJiBYaW5qaWFuZwotQ04JKzM5MjkrMDc1NTkJQXNpYS9LYXNoZ2FyCXdlc3QgVGliZXQgJiBYaW5qaWFuZwotQ08JKzA0MzYtMDc0MDUJQW1lcmljYS9Cb2dvdGEKLUNSCSswOTU2LTA4NDA1CUFtZXJpY2EvQ29zdGFfUmljYQotQ1UJKzIzMDgtMDgyMjIJQW1lcmljYS9IYXZhbmEKLUNWCSsxNDU1LTAyMzMxCUF0bGFudGljL0NhcGVfVmVyZGUKLUNYCS0xMDI1KzEwNTQzCUluZGlhbi9DaHJpc3RtYXMKLUNZCSszNTEwKzAzMzIyCUFzaWEvTmljb3NpYQotQ1oJKzUwMDUrMDE0MjYJRXVyb3BlL1ByYWd1ZQotREUJKzUyMzArMDEzMjIJRXVyb3BlL0JlcmxpbgotREoJKzExMzYrMDQzMDkJQWZyaWNhL0RqaWJvdXRpCi1ESwkrNTU0MCswMTIzNQlFdXJvcGUvQ29wZW5oYWdlbgotRE0JKzE1MTgtMDYxMjQJQW1lcmljYS9Eb21pbmljYQotRE8JKzE4MjgtMDY5NTQJQW1lcmljYS9TYW50b19Eb21pbmdvCi1EWgkrMzY0NyswMDMwMwlBZnJpY2EvQWxnaWVycwotRUMJLTAyMTAtMDc5NTAJQW1lcmljYS9HdWF5YXF1aWwJbWFpbmxhbmQKLUVDCS0wMDU0LTA4OTM2CVBhY2lmaWMvR2FsYXBhZ29zCUdhbGFwYWdvcyBJc2xhbmRzCi1FRQkrNTkyNSswMjQ0NQlFdXJvcGUvVGFsbGlubgotRUcJKzMwMDMrMDMxMTUJQWZyaWNhL0NhaXJvCi1FSAkrMjcwOS0wMTMxMglBZnJpY2EvRWxfQWFpdW4KLUVSCSsxNTIwKzAzODUzCUFmcmljYS9Bc21hcmEKLUVTCSs0MDI0LTAwMzQxCUV1cm9wZS9NYWRyaWQJbWFpbmxhbmQKLUVTCSszNTUzLTAwNTE5CUFmcmljYS9DZXV0YQlDZXV0YSAmIE1lbGlsbGEKLUVTCSsyODA2LTAxNTI0CUF0bGFudGljL0NhbmFyeQlDYW5hcnkgSXNsYW5kcwotRVQJKzA5MDIrMDM4NDIJQWZyaWNhL0FkZGlzX0FiYWJhCi1GSQkrNjAxMCswMjQ1OAlFdXJvcGUvSGVsc2lua2kKLUZKCS0xODA4KzE3ODI1CVBhY2lmaWMvRmlqaQotRksJLTUxNDItMDU3NTEJQXRsYW50aWMvU3RhbmxleQotRk0JKzA3MjUrMTUxNDcJUGFjaWZpYy9DaHV1awlDaHV1ayAoVHJ1aykgYW5kIFlhcAotRk0JKzA2NTgrMTU4MTMJUGFjaWZpYy9Qb2hucGVpCVBvaG5wZWkgKFBvbmFwZSkKLUZNCSswNTE5KzE2MjU5CVBhY2lmaWMvS29zcmFlCUtvc3JhZQotRk8JKzYyMDEtMDA2NDYJQXRsYW50aWMvRmFyb2UKLUZSCSs0ODUyKzAwMjIwCUV1cm9wZS9QYXJpcwotR0EJKzAwMjMrMDA5MjcJQWZyaWNhL0xpYnJldmlsbGUKLUdCCSs1MTMwMzAtMDAwMDczMQlFdXJvcGUvTG9uZG9uCi1HRAkrMTIwMy0wNjE0NQlBbWVyaWNhL0dyZW5hZGEKLUdFCSs0MTQzKzA0NDQ5CUFzaWEvVGJpbGlzaQotR0YJKzA0NTYtMDUyMjAJQW1lcmljYS9DYXllbm5lCi1HRwkrNDkyNy0wMDIzMglFdXJvcGUvR3Vlcm5zZXkKLUdICSswNTMzLTAwMDEzCUFmcmljYS9BY2NyYQotR0kJKzM2MDgtMDA1MjEJRXVyb3BlL0dpYnJhbHRhcgotR0wJKzY0MTEtMDUxNDQJQW1lcmljYS9Hb2R0aGFiCW1vc3QgbG9jYXRpb25zCi1HTAkrNzY0Ni0wMTg0MAlBbWVyaWNhL0Rhbm1hcmtzaGF2bgllYXN0IGNvYXN0LCBub3J0aCBvZiBTY29yZXNieXN1bmQKLUdMCSs3MDI5LTAyMTU4CUFtZXJpY2EvU2NvcmVzYnlzdW5kCVNjb3Jlc2J5c3VuZCAvIEl0dG9xcW9ydG9vcm1paXQKLUdMCSs3NjM0LTA2ODQ3CUFtZXJpY2EvVGh1bGUJVGh1bGUgLyBQaXR1ZmZpawotR00JKzEzMjgtMDE2MzkJQWZyaWNhL0Jhbmp1bAotR04JKzA5MzEtMDEzNDMJQWZyaWNhL0NvbmFrcnkKLUdQCSsxNjE0LTA2MTMyCUFtZXJpY2EvR3VhZGVsb3VwZQotR1EJKzAzNDUrMDA4NDcJQWZyaWNhL01hbGFibwotR1IJKzM3NTgrMDIzNDMJRXVyb3BlL0F0aGVucwotR1MJLTU0MTYtMDM2MzIJQXRsYW50aWMvU291dGhfR2VvcmdpYQotR1QJKzE0MzgtMDkwMzEJQW1lcmljYS9HdWF0ZW1hbGEKLUdVCSsxMzI4KzE0NDQ1CVBhY2lmaWMvR3VhbQotR1cJKzExNTEtMDE1MzUJQWZyaWNhL0Jpc3NhdQotR1kJKzA2NDgtMDU4MTAJQW1lcmljYS9HdXlhbmEKLUhLCSsyMjE3KzExNDA5CUFzaWEvSG9uZ19Lb25nCi1ITgkrMTQwNi0wODcxMwlBbWVyaWNhL1RlZ3VjaWdhbHBhCi1IUgkrNDU0OCswMTU1OAlFdXJvcGUvWmFncmViCi1IVAkrMTgzMi0wNzIyMAlBbWVyaWNhL1BvcnQtYXUtUHJpbmNlCi1IVQkrNDczMCswMTkwNQlFdXJvcGUvQnVkYXBlc3QKLUlECS0wNjEwKzEwNjQ4CUFzaWEvSmFrYXJ0YQlKYXZhICYgU3VtYXRyYQotSUQJLTAwMDIrMTA5MjAJQXNpYS9Qb250aWFuYWsJd2VzdCAmIGNlbnRyYWwgQm9ybmVvCi1JRAktMDUwNysxMTkyNAlBc2lhL01ha2Fzc2FyCWVhc3QgJiBzb3V0aCBCb3JuZW8sIENlbGViZXMsIEJhbGksIE51c2EgVGVuZ2FycmEsIHdlc3QgVGltb3IKLUlECS0wMjMyKzE0MDQyCUFzaWEvSmF5YXB1cmEJSXJpYW4gSmF5YSAmIHRoZSBNb2x1Y2NhcwotSUUJKzUzMjAtMDA2MTUJRXVyb3BlL0R1YmxpbgotSUwJKzMxNDYrMDM1MTQJQXNpYS9KZXJ1c2FsZW0KLUlNCSs1NDA5LTAwNDI4CUV1cm9wZS9Jc2xlX29mX01hbgotSU4JKzIyMzIrMDg4MjIJQXNpYS9Lb2xrYXRhCi1JTwktMDcyMCswNzIyNQlJbmRpYW4vQ2hhZ29zCi1JUQkrMzMyMSswNDQyNQlBc2lhL0JhZ2hkYWQKLUlSCSszNTQwKzA1MTI2CUFzaWEvVGVocmFuCi1JUwkrNjQwOS0wMjE1MQlBdGxhbnRpYy9SZXlramF2aWsKLUlUCSs0MTU0KzAxMjI5CUV1cm9wZS9Sb21lCi1KRQkrNDkxMi0wMDIwNwlFdXJvcGUvSmVyc2V5Ci1KTQkrMTgwMC0wNzY0OAlBbWVyaWNhL0phbWFpY2EKLUpPCSszMTU3KzAzNTU2CUFzaWEvQW1tYW4KLUpQCSszNTM5MTYrMTM5NDQ0MQlBc2lhL1Rva3lvCi1LRQktMDExNyswMzY0OQlBZnJpY2EvTmFpcm9iaQotS0cJKzQyNTQrMDc0MzYJQXNpYS9CaXNoa2VrCi1LSAkrMTEzMysxMDQ1NQlBc2lhL1Bobm9tX1BlbmgKLUtJCSswMTI1KzE3MzAwCVBhY2lmaWMvVGFyYXdhCUdpbGJlcnQgSXNsYW5kcwotS0kJLTAzMDgtMTcxMDUJUGFjaWZpYy9FbmRlcmJ1cnkJUGhvZW5peCBJc2xhbmRzCi1LSQkrMDE1Mi0xNTcyMAlQYWNpZmljL0tpcml0aW1hdGkJTGluZSBJc2xhbmRzCi1LTQktMTE0MSswNDMxNglJbmRpYW4vQ29tb3JvCi1LTgkrMTcxOC0wNjI0MwlBbWVyaWNhL1N0X0tpdHRzCi1LUAkrMzkwMSsxMjU0NQlBc2lhL1B5b25neWFuZwotS1IJKzM3MzMrMTI2NTgJQXNpYS9TZW91bAotS1cJKzI5MjArMDQ3NTkJQXNpYS9LdXdhaXQKLUtZCSsxOTE4LTA4MTIzCUFtZXJpY2EvQ2F5bWFuCi1LWgkrNDMxNSswNzY1NwlBc2lhL0FsbWF0eQltb3N0IGxvY2F0aW9ucwotS1oJKzQ0NDgrMDY1MjgJQXNpYS9ReXp5bG9yZGEJUXl6eWxvcmRhIChLeXp5bG9yZGEsIEt6eWwtT3JkYSkKLUtaCSs1MDE3KzA1NzEwCUFzaWEvQXF0b2JlCUFxdG9iZSAoQWt0b2JlKQotS1oJKzQ0MzErMDUwMTYJQXNpYS9BcXRhdQlBdHlyYXUgKEF0aXJhdSwgR3VyJ3lldiksIE1hbmdnaHlzdGF1IChNYW5raXN0YXUpCi1LWgkrNTExMyswNTEyMQlBc2lhL09yYWwJV2VzdCBLYXpha2hzdGFuCi1MQQkrMTc1OCsxMDIzNglBc2lhL1ZpZW50aWFuZQotTEIJKzMzNTMrMDM1MzAJQXNpYS9CZWlydXQKLUxDCSsxNDAxLTA2MTAwCUFtZXJpY2EvU3RfTHVjaWEKLUxJCSs0NzA5KzAwOTMxCUV1cm9wZS9WYWR1egotTEsJKzA2NTYrMDc5NTEJQXNpYS9Db2xvbWJvCi1MUgkrMDYxOC0wMTA0NwlBZnJpY2EvTW9ucm92aWEKLUxTCS0yOTI4KzAyNzMwCUFmcmljYS9NYXNlcnUKLUxUCSs1NDQxKzAyNTE5CUV1cm9wZS9WaWxuaXVzCi1MVQkrNDkzNiswMDYwOQlFdXJvcGUvTHV4ZW1ib3VyZwotTFYJKzU2NTcrMDI0MDYJRXVyb3BlL1JpZ2EKLUxZCSszMjU0KzAxMzExCUFmcmljYS9Ucmlwb2xpCi1NQQkrMzMzOS0wMDczNQlBZnJpY2EvQ2FzYWJsYW5jYQotTUMJKzQzNDIrMDA3MjMJRXVyb3BlL01vbmFjbwotTUQJKzQ3MDArMDI4NTAJRXVyb3BlL0NoaXNpbmF1Ci1NRQkrNDIyNiswMTkxNglFdXJvcGUvUG9kZ29yaWNhCi1NRgkrMTgwNC0wNjMwNQlBbWVyaWNhL01hcmlnb3QKLU1HCS0xODU1KzA0NzMxCUluZGlhbi9BbnRhbmFuYXJpdm8KLU1ICSswNzA5KzE3MTEyCVBhY2lmaWMvTWFqdXJvCW1vc3QgbG9jYXRpb25zCi1NSAkrMDkwNSsxNjcyMAlQYWNpZmljL0t3YWphbGVpbglLd2FqYWxlaW4KLU1LCSs0MTU5KzAyMTI2CUV1cm9wZS9Ta29wamUKLU1MCSsxMjM5LTAwODAwCUFmcmljYS9CYW1ha28KLU1NCSsxNjQ3KzA5NjEwCUFzaWEvUmFuZ29vbgotTU4JKzQ3NTUrMTA2NTMJQXNpYS9VbGFhbmJhYXRhcgltb3N0IGxvY2F0aW9ucwotTU4JKzQ4MDErMDkxMzkJQXNpYS9Ib3ZkCUJheWFuLU9sZ2l5LCBHb3ZpLUFsdGFpLCBIb3ZkLCBVdnMsIFphdmtoYW4KLU1OCSs0ODA0KzExNDMwCUFzaWEvQ2hvaWJhbHNhbglEb3Jub2QsIFN1a2hiYWF0YXIKLU1PCSsyMjE0KzExMzM1CUFzaWEvTWFjYXUKLU1QCSsxNTEyKzE0NTQ1CVBhY2lmaWMvU2FpcGFuCi1NUQkrMTQzNi0wNjEwNQlBbWVyaWNhL01hcnRpbmlxdWUKLU1SCSsxODA2LTAxNTU3CUFmcmljYS9Ob3Vha2Nob3R0Ci1NUwkrMTY0My0wNjIxMwlBbWVyaWNhL01vbnRzZXJyYXQKLU1UCSszNTU0KzAxNDMxCUV1cm9wZS9NYWx0YQotTVUJLTIwMTArMDU3MzAJSW5kaWFuL01hdXJpdGl1cwotTVYJKzA0MTArMDczMzAJSW5kaWFuL01hbGRpdmVzCi1NVwktMTU0NyswMzUwMAlBZnJpY2EvQmxhbnR5cmUKLU1YCSsxOTI0LTA5OTA5CUFtZXJpY2EvTWV4aWNvX0NpdHkJQ2VudHJhbCBUaW1lIC0gbW9zdCBsb2NhdGlvbnMKLU1YCSsyMTA1LTA4NjQ2CUFtZXJpY2EvQ2FuY3VuCUNlbnRyYWwgVGltZSAtIFF1aW50YW5hIFJvbwotTVgJKzIwNTgtMDg5MzcJQW1lcmljYS9NZXJpZGEJQ2VudHJhbCBUaW1lIC0gQ2FtcGVjaGUsIFl1Y2F0YW4KLU1YCSsyNTQwLTEwMDE5CUFtZXJpY2EvTW9udGVycmV5CU1leGljYW4gQ2VudHJhbCBUaW1lIC0gQ29haHVpbGEsIER1cmFuZ28sIE51ZXZvIExlb24sIFRhbWF1bGlwYXMgYXdheSBmcm9tIFVTIGJvcmRlcgotTVgJKzI1NTAtMDk3MzAJQW1lcmljYS9NYXRhbW9yb3MJVVMgQ2VudHJhbCBUaW1lIC0gQ29haHVpbGEsIER1cmFuZ28sIE51ZXZvIExlb24sIFRhbWF1bGlwYXMgbmVhciBVUyBib3JkZXIKLU1YCSsyMzEzLTEwNjI1CUFtZXJpY2EvTWF6YXRsYW4JTW91bnRhaW4gVGltZSAtIFMgQmFqYSwgTmF5YXJpdCwgU2luYWxvYQotTVgJKzI4MzgtMTA2MDUJQW1lcmljYS9DaGlodWFodWEJTWV4aWNhbiBNb3VudGFpbiBUaW1lIC0gQ2hpaHVhaHVhIGF3YXkgZnJvbSBVUyBib3JkZXIKLU1YCSsyOTM0LTEwNDI1CUFtZXJpY2EvT2ppbmFnYQlVUyBNb3VudGFpbiBUaW1lIC0gQ2hpaHVhaHVhIG5lYXIgVVMgYm9yZGVyCi1NWAkrMjkwNC0xMTA1OAlBbWVyaWNhL0hlcm1vc2lsbG8JTW91bnRhaW4gU3RhbmRhcmQgVGltZSAtIFNvbm9yYQotTVgJKzMyMzItMTE3MDEJQW1lcmljYS9UaWp1YW5hCVVTIFBhY2lmaWMgVGltZSAtIEJhamEgQ2FsaWZvcm5pYSBuZWFyIFVTIGJvcmRlcgotTVgJKzMwMTgtMTE0NTIJQW1lcmljYS9TYW50YV9Jc2FiZWwJTWV4aWNhbiBQYWNpZmljIFRpbWUgLSBCYWphIENhbGlmb3JuaWEgYXdheSBmcm9tIFVTIGJvcmRlcgotTVgJKzIwNDgtMTA1MTUJQW1lcmljYS9CYWhpYV9CYW5kZXJhcwlNZXhpY2FuIENlbnRyYWwgVGltZSAtIEJhaGlhIGRlIEJhbmRlcmFzCi1NWQkrMDMxMCsxMDE0MglBc2lhL0t1YWxhX0x1bXB1cglwZW5pbnN1bGFyIE1hbGF5c2lhCi1NWQkrMDEzMysxMTAyMAlBc2lhL0t1Y2hpbmcJU2FiYWggJiBTYXJhd2FrCi1NWgktMjU1OCswMzIzNQlBZnJpY2EvTWFwdXRvCi1OQQktMjIzNCswMTcwNglBZnJpY2EvV2luZGhvZWsKLU5DCS0yMjE2KzE2NjI3CVBhY2lmaWMvTm91bWVhCi1ORQkrMTMzMSswMDIwNwlBZnJpY2EvTmlhbWV5Ci1ORgktMjkwMysxNjc1OAlQYWNpZmljL05vcmZvbGsKLU5HCSswNjI3KzAwMzI0CUFmcmljYS9MYWdvcwotTkkJKzEyMDktMDg2MTcJQW1lcmljYS9NYW5hZ3VhCi1OTAkrNTIyMiswMDQ1NAlFdXJvcGUvQW1zdGVyZGFtCi1OTwkrNTk1NSswMTA0NQlFdXJvcGUvT3NsbwotTlAJKzI3NDMrMDg1MTkJQXNpYS9LYXRobWFuZHUKLU5SCS0wMDMxKzE2NjU1CVBhY2lmaWMvTmF1cnUKLU5VCS0xOTAxLTE2OTU1CVBhY2lmaWMvTml1ZQotTloJLTM2NTIrMTc0NDYJUGFjaWZpYy9BdWNrbGFuZAltb3N0IGxvY2F0aW9ucwotTloJLTQzNTctMTc2MzMJUGFjaWZpYy9DaGF0aGFtCUNoYXRoYW0gSXNsYW5kcwotT00JKzIzMzYrMDU4MzUJQXNpYS9NdXNjYXQKLVBBCSswODU4LTA3OTMyCUFtZXJpY2EvUGFuYW1hCi1QRQktMTIwMy0wNzcwMwlBbWVyaWNhL0xpbWEKLVBGCS0xNzMyLTE0OTM0CVBhY2lmaWMvVGFoaXRpCVNvY2lldHkgSXNsYW5kcwotUEYJLTA5MDAtMTM5MzAJUGFjaWZpYy9NYXJxdWVzYXMJTWFycXVlc2FzIElzbGFuZHMKLVBGCS0yMzA4LTEzNDU3CVBhY2lmaWMvR2FtYmllcglHYW1iaWVyIElzbGFuZHMKLVBHCS0wOTMwKzE0NzEwCVBhY2lmaWMvUG9ydF9Nb3Jlc2J5Ci1QSAkrMTQzNSsxMjEwMAlBc2lhL01hbmlsYQotUEsJKzI0NTIrMDY3MDMJQXNpYS9LYXJhY2hpCi1QTAkrNTIxNSswMjEwMAlFdXJvcGUvV2Fyc2F3Ci1QTQkrNDcwMy0wNTYyMAlBbWVyaWNhL01pcXVlbG9uCi1QTgktMjUwNC0xMzAwNQlQYWNpZmljL1BpdGNhaXJuCi1QUgkrMTgyODA2LTA2NjA2MjIJQW1lcmljYS9QdWVydG9fUmljbwotUFMJKzMxMzArMDM0MjgJQXNpYS9HYXphCi1QVAkrMzg0My0wMDkwOAlFdXJvcGUvTGlzYm9uCW1haW5sYW5kCi1QVAkrMzIzOC0wMTY1NAlBdGxhbnRpYy9NYWRlaXJhCU1hZGVpcmEgSXNsYW5kcwotUFQJKzM3NDQtMDI1NDAJQXRsYW50aWMvQXpvcmVzCUF6b3JlcwotUFcJKzA3MjArMTM0MjkJUGFjaWZpYy9QYWxhdQotUFkJLTI1MTYtMDU3NDAJQW1lcmljYS9Bc3VuY2lvbgotUUEJKzI1MTcrMDUxMzIJQXNpYS9RYXRhcgotUkUJLTIwNTIrMDU1MjgJSW5kaWFuL1JldW5pb24KLVJPCSs0NDI2KzAyNjA2CUV1cm9wZS9CdWNoYXJlc3QKLVJTCSs0NDUwKzAyMDMwCUV1cm9wZS9CZWxncmFkZQotUlUJKzU0NDMrMDIwMzAJRXVyb3BlL0thbGluaW5ncmFkCU1vc2Nvdy0wMSAtIEthbGluaW5ncmFkCi1SVQkrNTU0NSswMzczNQlFdXJvcGUvTW9zY293CU1vc2NvdyswMCAtIHdlc3QgUnVzc2lhCi1SVQkrNDg0NCswNDQyNQlFdXJvcGUvVm9sZ29ncmFkCU1vc2NvdyswMCAtIENhc3BpYW4gU2VhCi1SVQkrNTMxMiswNTAwOQlFdXJvcGUvU2FtYXJhCU1vc2NvdyAtIFNhbWFyYSwgVWRtdXJ0aWEKLVJVCSs1NjUxKzA2MDM2CUFzaWEvWWVrYXRlcmluYnVyZwlNb3Njb3crMDIgLSBVcmFscwotUlUJKzU1MDArMDczMjQJQXNpYS9PbXNrCU1vc2NvdyswMyAtIHdlc3QgU2liZXJpYQotUlUJKzU1MDIrMDgyNTUJQXNpYS9Ob3Zvc2liaXJzawlNb3Njb3crMDMgLSBOb3Zvc2liaXJzawotUlUJKzUzNDUrMDg3MDcJQXNpYS9Ob3Zva3V6bmV0c2sJTW9zY293KzAzIC0gTm92b2t1em5ldHNrCi1SVQkrNTYwMSswOTI1MAlBc2lhL0tyYXNub3lhcnNrCU1vc2NvdyswNCAtIFllbmlzZWkgUml2ZXIKLVJVCSs1MjE2KzEwNDIwCUFzaWEvSXJrdXRzawlNb3Njb3crMDUgLSBMYWtlIEJhaWthbAotUlUJKzYyMDArMTI5NDAJQXNpYS9ZYWt1dHNrCU1vc2NvdyswNiAtIExlbmEgUml2ZXIKLVJVCSs0MzEwKzEzMTU2CUFzaWEvVmxhZGl2b3N0b2sJTW9zY293KzA3IC0gQW11ciBSaXZlcgotUlUJKzQ2NTgrMTQyNDIJQXNpYS9TYWtoYWxpbglNb3Njb3crMDcgLSBTYWtoYWxpbiBJc2xhbmQKLVJVCSs1OTM0KzE1MDQ4CUFzaWEvTWFnYWRhbglNb3Njb3crMDggLSBNYWdhZGFuCi1SVQkrNTMwMSsxNTgzOQlBc2lhL0thbWNoYXRrYQlNb3Njb3crMDggLSBLYW1jaGF0a2EKLVJVCSs2NDQ1KzE3NzI5CUFzaWEvQW5hZHlyCU1vc2NvdyswOCAtIEJlcmluZyBTZWEKLVJXCS0wMTU3KzAzMDA0CUFmcmljYS9LaWdhbGkKLVNBCSsyNDM4KzA0NjQzCUFzaWEvUml5YWRoCi1TQgktMDkzMisxNjAxMglQYWNpZmljL0d1YWRhbGNhbmFsCi1TQwktMDQ0MCswNTUyOAlJbmRpYW4vTWFoZQotU0QJKzE1MzYrMDMyMzIJQWZyaWNhL0toYXJ0b3VtCi1TRQkrNTkyMCswMTgwMwlFdXJvcGUvU3RvY2tob2xtCi1TRwkrMDExNysxMDM1MQlBc2lhL1NpbmdhcG9yZQotU0gJLTE1NTUtMDA1NDIJQXRsYW50aWMvU3RfSGVsZW5hCi1TSQkrNDYwMyswMTQzMQlFdXJvcGUvTGp1YmxqYW5hCi1TSgkrNzgwMCswMTYwMAlBcmN0aWMvTG9uZ3llYXJieWVuCi1TSwkrNDgwOSswMTcwNwlFdXJvcGUvQnJhdGlzbGF2YQotU0wJKzA4MzAtMDEzMTUJQWZyaWNhL0ZyZWV0b3duCi1TTQkrNDM1NSswMTIyOAlFdXJvcGUvU2FuX01hcmlubwotU04JKzE0NDAtMDE3MjYJQWZyaWNhL0Rha2FyCi1TTwkrMDIwNCswNDUyMglBZnJpY2EvTW9nYWRpc2h1Ci1TUgkrMDU1MC0wNTUxMAlBbWVyaWNhL1BhcmFtYXJpYm8KLVNUCSswMDIwKzAwNjQ0CUFmcmljYS9TYW9fVG9tZQotU1YJKzEzNDItMDg5MTIJQW1lcmljYS9FbF9TYWx2YWRvcgotU1kJKzMzMzArMDM2MTgJQXNpYS9EYW1hc2N1cwotU1oJLTI2MTgrMDMxMDYJQWZyaWNhL01iYWJhbmUKLVRDCSsyMTI4LTA3MTA4CUFtZXJpY2EvR3JhbmRfVHVyawotVEQJKzEyMDcrMDE1MDMJQWZyaWNhL05kamFtZW5hCi1URgktNDkyMTEwKzA3MDEzMDMJSW5kaWFuL0tlcmd1ZWxlbgotVEcJKzA2MDgrMDAxMTMJQWZyaWNhL0xvbWUKLVRICSsxMzQ1KzEwMDMxCUFzaWEvQmFuZ2tvawotVEoJKzM4MzUrMDY4NDgJQXNpYS9EdXNoYW5iZQotVEsJLTA5MjItMTcxMTQJUGFjaWZpYy9GYWthb2ZvCi1UTAktMDgzMysxMjUzNQlBc2lhL0RpbGkKLVRNCSszNzU3KzA1ODIzCUFzaWEvQXNoZ2FiYXQKLVROCSszNjQ4KzAxMDExCUFmcmljYS9UdW5pcwotVE8JLTIxMTAtMTc1MTAJUGFjaWZpYy9Ub25nYXRhcHUKLVRSCSs0MTAxKzAyODU4CUV1cm9wZS9Jc3RhbmJ1bAotVFQJKzEwMzktMDYxMzEJQW1lcmljYS9Qb3J0X29mX1NwYWluCi1UVgktMDgzMSsxNzkxMwlQYWNpZmljL0Z1bmFmdXRpCi1UVwkrMjUwMysxMjEzMAlBc2lhL1RhaXBlaQotVFoJLTA2NDgrMDM5MTcJQWZyaWNhL0Rhcl9lc19TYWxhYW0KLVVBCSs1MDI2KzAzMDMxCUV1cm9wZS9LaWV2CW1vc3QgbG9jYXRpb25zCi1VQQkrNDgzNyswMjIxOAlFdXJvcGUvVXpoZ29yb2QJUnV0aGVuaWEKLVVBCSs0NzUwKzAzNTEwCUV1cm9wZS9aYXBvcm96aHllCVphcG9yb3poJ3llLCBFIEx1Z2Fuc2sgLyBaYXBvcml6aGlhLCBFIEx1aGFuc2sKLVVBCSs0NDU3KzAzNDA2CUV1cm9wZS9TaW1mZXJvcG9sCWNlbnRyYWwgQ3JpbWVhCi1VRwkrMDAxOSswMzIyNQlBZnJpY2EvS2FtcGFsYQotVU0JKzE2NDUtMTY5MzEJUGFjaWZpYy9Kb2huc3RvbglKb2huc3RvbiBBdG9sbAotVU0JKzI4MTMtMTc3MjIJUGFjaWZpYy9NaWR3YXkJTWlkd2F5IElzbGFuZHMKLVVNCSsxOTE3KzE2NjM3CVBhY2lmaWMvV2FrZQlXYWtlIElzbGFuZAotVVMJKzQwNDI1MS0wNzQwMDIzCUFtZXJpY2EvTmV3X1lvcmsJRWFzdGVybiBUaW1lCi1VUwkrNDIxOTUzLTA4MzAyNDUJQW1lcmljYS9EZXRyb2l0CUVhc3Rlcm4gVGltZSAtIE1pY2hpZ2FuIC0gbW9zdCBsb2NhdGlvbnMKLVVTCSszODE1MTUtMDg1NDUzNAlBbWVyaWNhL0tlbnR1Y2t5L0xvdWlzdmlsbGUJRWFzdGVybiBUaW1lIC0gS2VudHVja3kgLSBMb3Vpc3ZpbGxlIGFyZWEKLVVTCSszNjQ5NDctMDg0NTA1NwlBbWVyaWNhL0tlbnR1Y2t5L01vbnRpY2VsbG8JRWFzdGVybiBUaW1lIC0gS2VudHVja3kgLSBXYXluZSBDb3VudHkKLVVTCSszOTQ2MDYtMDg2MDkyOQlBbWVyaWNhL0luZGlhbmEvSW5kaWFuYXBvbGlzCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBtb3N0IGxvY2F0aW9ucwotVVMJKzM4NDAzOC0wODczMTQzCUFtZXJpY2EvSW5kaWFuYS9WaW5jZW5uZXMJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIERhdmllc3MsIER1Ym9pcywgS25veCAmIE1hcnRpbiBDb3VudGllcwotVVMJKzQxMDMwNS0wODYzNjExCUFtZXJpY2EvSW5kaWFuYS9XaW5hbWFjCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBQdWxhc2tpIENvdW50eQotVVMJKzM4MjIzMi0wODYyMDQxCUFtZXJpY2EvSW5kaWFuYS9NYXJlbmdvCUVhc3Rlcm4gVGltZSAtIEluZGlhbmEgLSBDcmF3Zm9yZCBDb3VudHkKLVVTCSszODI5MzEtMDg3MTY0MwlBbWVyaWNhL0luZGlhbmEvUGV0ZXJzYnVyZwlFYXN0ZXJuIFRpbWUgLSBJbmRpYW5hIC0gUGlrZSBDb3VudHkKLVVTCSszODQ0NTItMDg1MDQwMglBbWVyaWNhL0luZGlhbmEvVmV2YXkJRWFzdGVybiBUaW1lIC0gSW5kaWFuYSAtIFN3aXR6ZXJsYW5kIENvdW50eQotVVMJKzQxNTEwMC0wODczOTAwCUFtZXJpY2EvQ2hpY2FnbwlDZW50cmFsIFRpbWUKLVVTCSszNzU3MTEtMDg2NDU0MQlBbWVyaWNhL0luZGlhbmEvVGVsbF9DaXR5CUNlbnRyYWwgVGltZSAtIEluZGlhbmEgLSBQZXJyeSBDb3VudHkKLVVTCSs0MTE3NDUtMDg2MzczMAlBbWVyaWNhL0luZGlhbmEvS25veAlDZW50cmFsIFRpbWUgLSBJbmRpYW5hIC0gU3RhcmtlIENvdW50eQotVVMJKzQ1MDYyOC0wODczNjUxCUFtZXJpY2EvTWVub21pbmVlCUNlbnRyYWwgVGltZSAtIE1pY2hpZ2FuIC0gRGlja2luc29uLCBHb2dlYmljLCBJcm9uICYgTWVub21pbmVlIENvdW50aWVzCi1VUwkrNDcwNjU5LTEwMTE3NTcJQW1lcmljYS9Ob3J0aF9EYWtvdGEvQ2VudGVyCUNlbnRyYWwgVGltZSAtIE5vcnRoIERha290YSAtIE9saXZlciBDb3VudHkKLVVTCSs0NjUwNDItMTAxMjQzOQlBbWVyaWNhL05vcnRoX0Rha290YS9OZXdfU2FsZW0JQ2VudHJhbCBUaW1lIC0gTm9ydGggRGFrb3RhIC0gTW9ydG9uIENvdW50eSAoZXhjZXB0IE1hbmRhbiBhcmVhKQotVVMJKzM5NDQyMS0xMDQ1OTAzCUFtZXJpY2EvRGVudmVyCU1vdW50YWluIFRpbWUKLVVTCSs0MzM2NDktMTE2MTIwOQlBbWVyaWNhL0JvaXNlCU1vdW50YWluIFRpbWUgLSBzb3V0aCBJZGFobyAmIGVhc3QgT3JlZ29uCi1VUwkrMzY0NzA4LTEwODQxMTEJQW1lcmljYS9TaGlwcm9jawlNb3VudGFpbiBUaW1lIC0gTmF2YWpvCi1VUwkrMzMyNjU0LTExMjA0MjQJQW1lcmljYS9QaG9lbml4CU1vdW50YWluIFN0YW5kYXJkIFRpbWUgLSBBcml6b25hCi1VUwkrMzQwMzA4LTExODE0MzQJQW1lcmljYS9Mb3NfQW5nZWxlcwlQYWNpZmljIFRpbWUKLVVTCSs2MTEzMDUtMTQ5NTQwMQlBbWVyaWNhL0FuY2hvcmFnZQlBbGFza2EgVGltZQotVVMJKzU4MTgwNy0xMzQyNTExCUFtZXJpY2EvSnVuZWF1CUFsYXNrYSBUaW1lIC0gQWxhc2thIHBhbmhhbmRsZQotVVMJKzU5MzI0OS0xMzk0MzM4CUFtZXJpY2EvWWFrdXRhdAlBbGFza2EgVGltZSAtIEFsYXNrYSBwYW5oYW5kbGUgbmVjawotVVMJKzY0MzAwNC0xNjUyNDIzCUFtZXJpY2EvTm9tZQlBbGFza2EgVGltZSAtIHdlc3QgQWxhc2thCi1VUwkrNTE1MjQ4LTE3NjM5MjkJQW1lcmljYS9BZGFrCUFsZXV0aWFuIElzbGFuZHMKLVVTCSsyMTE4MjUtMTU3NTEzMAlQYWNpZmljL0hvbm9sdWx1CUhhd2FpaQotVVkJLTM0NTMtMDU2MTEJQW1lcmljYS9Nb250ZXZpZGVvCi1VWgkrMzk0MCswNjY0OAlBc2lhL1NhbWFya2FuZAl3ZXN0IFV6YmVraXN0YW4KLVVaCSs0MTIwKzA2OTE4CUFzaWEvVGFzaGtlbnQJZWFzdCBVemJla2lzdGFuCi1WQQkrNDE1NDA4KzAxMjI3MTEJRXVyb3BlL1ZhdGljYW4KLVZDCSsxMzA5LTA2MTE0CUFtZXJpY2EvU3RfVmluY2VudAotVkUJKzEwMzAtMDY2NTYJQW1lcmljYS9DYXJhY2FzCi1WRwkrMTgyNy0wNjQzNwlBbWVyaWNhL1RvcnRvbGEKLVZJCSsxODIxLTA2NDU2CUFtZXJpY2EvU3RfVGhvbWFzCi1WTgkrMTA0NSsxMDY0MAlBc2lhL0hvX0NoaV9NaW5oCi1WVQktMTc0MCsxNjgyNQlQYWNpZmljL0VmYXRlCi1XRgktMTMxOC0xNzYxMAlQYWNpZmljL1dhbGxpcwotV1MJLTEzNTAtMTcxNDQJUGFjaWZpYy9BcGlhCi1ZRQkrMTI0NSswNDUxMglBc2lhL0FkZW4KLVlUCS0xMjQ3KzA0NTE0CUluZGlhbi9NYXlvdHRlCi1aQQktMjYxNSswMjgwMAlBZnJpY2EvSm9oYW5uZXNidXJnCi1aTQktMTUyNSswMjgxNwlBZnJpY2EvTHVzYWthCi1aVwktMTc1MCswMzEwMwlBZnJpY2EvSGFyYXJlCg==