ZGlmZiAtLWdpdCBhL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMDViMzE4Li40OTg1NWUzIDEwMDY0NAotLS0gYS9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw4ICsyMywxMSBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uVklCUkFURSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9VU0VSX0RJQ1RJT05BUlkiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9VU0VSX0RJQ1RJT05BUlkiIC8+CiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9CT09UX0NPTVBMRVRFRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ET1dOTE9BRF9XSVRIT1VUX05PVElGSUNBVElPTiIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2Fvc3BfYW5kcm9pZF9rZXlib2FyZF9pbWVfbmFtZSIKICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQG1pcG1hcC9pY19pbWVfc2V0dGluZ3MiCkBAIC05MSw1ICs5NCw0NCBAQAogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRleHQuc3R5bGUuU1VHR0VTVElPTl9QSUNLRUQiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvcmVjZWl2ZXI+CisKKyAgICAgICAgPHByb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVByb3ZpZGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmFudFVyaVBlcm1pc3Npb25zPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJAc3RyaW5nL2F1dGhvcml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bXVsdGlwcm9jZXNzPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIj4KKyAgICAgICAgPC9wcm92aWRlcj4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RpY3Rpb25hcnlfc2VydmljZV9uYW1lIj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxyZWNlaXZlciBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkV2ZW50SGFuZGxlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRPV05MT0FEX0NPTVBMRVRFIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uREFURV9DSEFOR0VEIiAvPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kaWN0aW9uYXJ5cGFjay5VUERBVEVfTk9XIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2ltZV9zZXR0aW5ncyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkhvbG8iCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnVpT3B0aW9ucz0ic3BsaXRBY3Rpb25CYXJXaGVuTmFycm93Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLkRvd25sb2FkT3Zlck1ldGVyZWREaWFsb2ciCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2RpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmljb249IkBtaXBtYXAvaWNfaW1lX3NldHRpbmdzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuSG9sbyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KICAgICA8L2FwcGxpY2F0aW9uPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtaGRwaS9pY19ub3RpZnlfZGljdGlvbmFyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmZTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nIGIvamF2YS9yZXMvZHJhd2FibGUtbWRwaS9pY19ub3RpZnlfZGljdGlvbmFyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4NzAxZgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX25vdGlmeV9kaWN0aW9uYXJ5LnBuZyBiL2phdmEvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX25vdGlmeV9kaWN0aW9uYXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGY0OWRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvZHJhd2FibGUteGhkcGkvaWNfbm90aWZ5X2RpY3Rpb25hcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phdmEvcmVzL2xheW91dC9kaWN0aW9uYXJ5X2xpbmUueG1sIGIvamF2YS9yZXMvbGF5b3V0L2RpY3Rpb25hcnlfbGluZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkMTVhYgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvcmVzL2xheW91dC9kaWN0aW9uYXJ5X2xpbmUueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8IS0tIFRPRE86IFJlbW92ZSBwYWRkaW5nUmlnaHQsIGxheW91dF9tYXJnaW5MZWZ0LCBsYXlvdXRfbWFyZ2luUmlnaHQgZm9yIEFQSSB2ZXJzaW9uIDE3KyAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSIKKyAgICBhbmRyb2lkOnBhZGRpbmdFbmQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTVkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjE1ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkVuZD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgPExpbmVhckxheW91dAorICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JTZWNvbmRhcnkiCisgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiIC8+CisKKyAgICA8IS0tIDxQcm9ncmVzc0JhciAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmlkPSJAK2lkL2RpY3Rpb25hcnlfbGluZV9wcm9ncmVzc19iYXIiIC0tPgorICAgIDwhLS0gICAgIHN0eWxlPSJAYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsIiAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAtLT4KKyAgICA8IS0tICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLS0+CisgICAgPCEtLSAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiIC8+IC0tPgorCisgIDwvTGluZWFyTGF5b3V0PgorCisgIDxCdXR0b24KKyAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC93b3JkbGlzdF9idXR0b24iCisgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodHxjZW50ZXJfdmVydGljYWwiCisgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luc3RhbGxfZGljdCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy9sYXlvdXQvZG93bmxvYWRfb3Zlcl9tZXRlcmVkLnhtbCBiL2phdmEvcmVzL2xheW91dC9kb3dubG9hZF9vdmVyX21ldGVyZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGU1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy9sYXlvdXQvZG93bmxvYWRfb3Zlcl9tZXRlcmVkLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkaXZpZGVyPSI/YW5kcm9pZDphdHRyL2RpdmlkZXJIb3Jpem9udGFsIgorICAgIGFuZHJvaWQ6c2hvd0RpdmlkZXJzPSJtaWRkbGUiCisgICAgYW5kcm9pZDpkaXZpZGVyUGFkZGluZz0iMGRpcCIgPgorCisgICAgPCEtLSBUaGUgbGlzdCBvZiBwYWNrYWdlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlcXVlc3RpbmcgVUlECisgICAgYW5kIHRoZSBhY2NvdW50L2F1dGh0b2tlblR5cGUgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQgLS0+CisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIj4KKworICAgICAgPFRleHRWaWV3CisgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiCisgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE0ZGlwIgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgorICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgorICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxMmRpcCIgLz4KKworICAgIDwvU2Nyb2xsVmlldz4KKworICAgIDwhLS0gVGhlIGJ1dHRvbnMgdG8gdHJpZ2dlciBkb3dubG9hZCBvciB3YWl0IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25zIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyU3R5bGUiPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGVueV9idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjIiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tEZW55IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgdGV4dCBvZiB0aGlzIGJ1dHRvbiBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgZGljdGlvbmFyeSBzbyBpdCB3aWxsIGJlIGZpbGxlZCBwcm9ncmFtbWF0aWNhbGx5IC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsbG93X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjIiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uQ2xpY2tBbGxvdyIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhckJ1dHRvblN0eWxlIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvbGF5b3V0L2xvYWRpbmdfcGFnZS54bWwgYi9qYXZhL3Jlcy9sYXlvdXQvbG9hZGluZ19wYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTgxNmNkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvbGF5b3V0L2xvYWRpbmdfcGFnZS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvYWRpbmdfY29udGFpbmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiA+CisgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmlkPSJAK2lkL2xvYWRpbmdfcHJvZ3Jlc3NfYmFyIgorICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvcHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiIC8+CisgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xvYWRpbmdfcHJvZ3Jlc3NfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tZXNzYWdlX2xvYWRpbmciCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Cis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QgYi9qYXZhL3Jlcy9yYXcvZW1wdHkuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFiZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9yZXMvcmF3L2VtcHR5LmRpY3QKQEAgLTAsMCArMSBAQAoreLEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKaW5kZXggZGM2ZmRmMi4uMDdiNDUwMyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iVmVyc3RlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRhYWwgZW4gaW52b2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJLaWVzIGludm9lcm1ldG9kZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iV29vcmRlYm9la3ZlcnNrYWZmZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV29vcmRlYm9la3ZlcnNrYWZmZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ildvb3JkZWJvZWstZGllbnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJXb29yZGVib2VrIHNlIG9wZGF0ZWVyaW5saWd0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJBZGRpc2lvbmVsZSB3b29yZGVib2VrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iV29vcmRlYm9layBiZXNraWtiYWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ikluc3RlbGxpbmdzIHZpciB3b29yZGVib2VrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkdlYnJ1aWtlcndvb3JkZWJvZWtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iR2VicnVpa2Vyd29vcmRlYm9layI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+Ildvb3JkZWJvZWsgYmVza2lrYmFhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJMYWFpIHRhbnMgYWYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJHZcOvbnN0YWxsZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJHZcOvbnN0YWxsZWVyLCBnZWRlYWt0aXZlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iS2FuIG5pZSBhYW4gd29vcmRlYm9la2RpZW5zIGtvcHBlbCBuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkdlZW4gd29vcmRlYm9la2UgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJIZXJsYWFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTGFhcyBvcGdlZGF0ZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IktvbnRyb2xlZXIgdmlyIG9wZGF0ZXJpbmdzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkxhYWkgdGFucy4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJIb29md29vcmRlYm9layI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJLYW5zZWxsZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJLYW5zZWxsZWVyIGFmbGFhaXNlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZWFrdGl2ZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZlZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJWZWUgdWl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGllIGdla29zZSB0YWFsIG9wIGpvdSBtb2JpZWxlIHRvZXN0ZWwgaGV0IFwnbiBiZXNraWtiYXJlIHdvb3JkZWJvZWsuJmx0O2JyLyZndDsgT25zIGJldmVlbCBhYW4gZGF0IGRpZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+LXdvb3JkZWJvZWsgJmx0O2ImZ3Q7YWZnZWxhYWkmbHQ7L2ImZ3Q7IHdvcmQgb20gam91IHRpa2VydmFyaW5nIFwnbiBiZXRlciBlZW4gdGUgbWFhay4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEaXQga2FuIFwnbiBtaW51dXQgb2YgdHdlZSBuZWVtIG9tIG9vciAzRyBhZiB0ZSBsYWFpLiBIZWZmaW5ncyBtYWcgZ2VsZCBhcyBqeSBuaWUgXCduICZsdDtiJmd0O29uYmVwZXJrdGUgZGF0YXBsYW4mbHQ7L2ImZ3Q7LiZsdDtici8mZ3Q7IGhldCBuaWUgQXMgankgb25zZWtlciBvb3Igam91IGRhdGFwbGFuIGlzLCBiZXZlZWwgb25zIGFhbiBkYXQgankgXCduIFdpRmktdmVyYmluZGluZyBzb2VrIG9tIG91dG9tYXRpZXMgdGUgYmVnaW4gYWZsYWFpLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFdlbms6IEp5IGthbiB3b29yZGVib2VrZSBhZmxhYWkgZW4gdmVyd3lkZXIgZGV1ciB0ZSBnYWFuIG5hICZsdDtiJmd0O1RhYWwgZW4gaW52b2VyJmx0Oy9iJmd0OyBpbiBkaWUgJmx0O2ImZ3Q7SW5zdGVsbGluZ3MmbHQ7L2ImZ3Q7LWtpZXNseXMgdmFuIGpvdSBtb2JpZWxlIHRvZXN0ZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkxhYWkgbm91IGFmICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz5NQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkxhYWkgb29yIFdpLUZpIGFmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlwnbiBXb29yZGVib2VrIGlzIHZpciA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGJlc2tpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJEcnVrIG9tIHRlIGhlcnNpZW4gZW4gYWYg4oCL4oCLdGUgbGFhaSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCmluZGV4IDE5MDdkYzkuLjZmNzQwYTkgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IuGKkOGJo+GIqiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IuGJi+GKleGJiyDhiqXhipMg4YyN4Ymk4Ym1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLhi6jhjI3hiaThibUg4Yi14YiN4Ym1IOGLreGIneGIqOGMoSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhiYXhiKvhiaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhiYXhiKvhiaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IuGLqOGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yqg4YyI4YiN4YyN4YiO4Ym1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiJvhi5jhiJjhipsg4YiY4Yio4YyDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLhiqXhi6jhibPhiqjhiIkg4Yuo4Yia4Yur4Yu14YyJIOGImOGLneGMiOGJoCDhiYPhiIvhibbhib0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yut4YyI4Yqb4YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IuGLqOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YmF4YqV4Yml4Yiu4Ym9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4Yuo4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLhi6jhibDhjKDhiYPhiJog4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4Yqg4YiIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuGJoOGKoOGIgeGKlSDhjIrhi5wg4Ymg4Yib4YuN4Yio4Yu1IOGIi+GLrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuGJsOGMreGKl+GIjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4Ymw4Yyt4YqX4YiN4Y2jIOGJsOGIsOGKk+GKreGIj+GIjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLhi4jhi7Ag4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhiqDhjIjhiI3hjIjhiI7hibUg4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSDhib3hjI3hiK0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IuGIneGKleGInSDhiJjhi53hjIjhiaAg4YmD4YiL4Ym1IOGLqOGIieGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IuGKoOGLteGItSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IuGIiOGImOGMqOGIqOGIuyDhjIrhi5wg4Yuo4YuY4YiY4YqQ4YuNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuGLneGIm+GKlOGLjuGJveGKlSDhiaDhiJjhjYjhibDhiL0g4YiL4YutIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuGJoOGImOGMq+GKlSDhiIvhi63igKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i4YuL4YqTIOGImOGLneGMiOGJoCDhiYPhiI0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i4Ymw4YuI4YuNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuGMq+GKlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuGIm+GLjeGIqOGLteGKlSDhibDhi4jhi40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i4Yqg4Yiw4YqT4Yqt4YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i4Yqg4YqV4YmDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4Yiw4Yit4YudIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IuGImOGLneGMiOGJoCDhiYPhiIvhibUg4YiIPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDhi63hjIjhipvhiI0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLhiIjhiJjhjIjhiJ3hjIjhiJ3hipMg4YiI4Yib4YuN4Yio4Yu1IOGJsOGMq+GKlSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCmluZGV4IDEyNjhmNDMuLjU2NjhkNTkgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Itin2YTYp9mB2KrYsdin2LbZitipIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i2KfZhNmE2LrYqSDZiNin2YTYpdiv2K7Yp9mEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLYp9iu2KrZitin2LEg2KPYs9mE2YjYqCDYp9mE2KXYr9iu2KfZhCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i2YXZgtiv2YUg2KfZhNmC2KfZhdmI2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i2YXZgtiv2YUg2KfZhNmC2KfZhdmI2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Itiu2K/ZhdipINin2YTZgtin2YXZiNizIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i2YXYudmE2YjZhdin2Kog2KrYrdiv2YrYqyDYp9mE2YLYp9mF2YjYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i2KfZhNmC2YjYp9mF2YrYsyDYp9mE2KXYttin2YHZitipIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLZgtin2YXZiNizINmF2KrZiNmB2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i2KXYudiv2KfYr9in2Kog2KfZhNmC2YjYp9mF2YrYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+ItmC2YjYp9mF2YrYsyDYp9mE2YXYs9iq2K7Yr9mFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i2YLYp9mF2YjYsyDYp9mE2YXYs9iq2K7Yr9mFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i2KfZhNmC2KfZhdmI2LMg2YXYqtin2K0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i2YrYqtmFINit2KfZhNmK2YvYpyDYp9mE2KrZhtiy2YrZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItmF2KvYqNiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLZhdir2KjYqtiMINmF2LnYt9mEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+ItmF2LTZg9mE2Kkg2YHZiiDYp9mE2KfYqti12KfZhCDYqNiu2K/ZhdipINin2YTZgtin2YXZiNizIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLZhNinINiq2KrZiNmB2LEg2KPZitipINmC2YjYp9mF2YrYsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Itiq2K3Yr9mK2KsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLYqtin2LHZitiuINii2K7YsSDYqtit2K/ZitirIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Itis2KfYsdmNINin2YTYqNit2Ksg2LnZhiDYqtit2K/Zitir2KfYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLYqtit2YXZitmELi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+Itin2YTZgtin2YXZiNizINin2YTYsdim2YrYs9mKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Itil2YTYutin2KEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i2KrYq9io2YrYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+Itil2YTYutin2KEg2KfZhNiq2YbYstmK2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i2KrYudi32YrZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Itiq2YXZg9mK2YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLYrdiw2YEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i2YfZhtin2YMg2YLYp9mF2YjYsyDZhdiq2YjZgdixINmE2YTYutipIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLYp9i22LrYtyDZhNmE2YXYsdin2KzYudipINmI2KfZhNiq2YbYstmK2YQiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbAppbmRleCA2ZmMyOGU1Li5kMTJlNDdjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLQn9CwINC30LzQsNGe0YfQsNC90L3RliI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+ItCc0L7QstCwINGWINGe0LLQvtC0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLQktGL0LHQtdGA0YvRhtC1INC80LXRgtCw0LQg0YPQstC+0LTRgyI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QsNGB0YLQsNGe0YjRh9GL0Log0YHQu9C+0Z7QvdGW0LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQn9Cw0YHRgtCw0Z7RiNGH0YvQuiDRgdC70L7RntC90ZbQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLQodC70L7RntC90ZbQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LHQvdCw0Z7Qu9C10L3QvdGPINGB0LvQvtGe0L3RltC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0LDQtNCw0YLQutC+0LLRi9GPINGB0LvQvtGe0L3RltC60ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCU0LDRgdGC0YPQv9C90Ysg0YHQu9C+0Z7QvdGW0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNC70LDQtNGLINC00LvRjyDRgdC70L7RntC90ZbQutCw0Z4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQmtCw0YDRi9GB0YLQsNC70YzQvdGW0YbQutGW0Y8g0YHQu9C+0Z7QvdGW0LrRliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItCa0LDRgNGL0YHRgtCw0LvRjNC90ZbRhtC60ZYg0YHQu9C+0Z7QvdGW0LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLQlNCw0YHRgtGD0L/QvdGLINGB0LvQvtGe0L3RltC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+ItCh0L/QsNC80L/QvtGe0LLQsNC10YbRhtCwINC30LDRgNCw0LciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiLQo9GB0YLQsNC70Y/QstCw0L3RiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i0KPRgdGC0LDQu9GP0LLQsNC90LAsINCw0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQn9GA0LDQsdC70LXQvNCwINC/0LDQtNC60LvRjtGH0Y3QvdC90Y8g0LTQsCDRgdC70L7RntC90ZbQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLQodC70L7RntC90ZbQutCw0Z4g0L3Rj9C80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLQkNCx0L3QsNCy0ZbRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0JDQv9C+0YjQvdGP0LUg0LDQsdC90LDRntC70LXQvdC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i0J/RgNCw0LLQtdGA0LrQsCDQvdCw0Y/RntC90LDRgdGG0ZYg0LDQsdC90LDRntC70LXQvdC90Y/RniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+ItCQ0YHQvdC+0Z7QvdGLINGB0LvQvtGe0L3RltC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+ItCQ0LTQvNC10L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLQo9GB0YLQsNC70Y/QstCw0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+ItCQ0LTQvNGP0L3RltGG0Ywg0YHQv9Cw0LzQv9Cw0LLQsNC90L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLQkNC00LrQu9GO0YfRi9GG0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLQo9C60LvRjtGH0YvRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i0JLRi9C00LDQu9GW0YbRjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQodC70L7RntC90ZbQuiDQtNC70Y8g0LzQvtCy0YsgXCI8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+XCIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLQndCw0YZp0YHQvWnRhtC1LCDQutCw0LEg0L/RgNCw0LPQu9C10LTQt9C10YbRjCBpINGB0L/QsNC80L/QsNCy0LDRhtGMIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKaW5kZXggNzZiZDJkMS4uMzdlYWEzMyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i0KHRgtCw0L3QtNCw0YDRgtC90LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQldC30LjQuiDQuCDQstGK0LLQtdC20LTQsNC90LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+ItCY0LfQsdC+0YAg0L3QsCDQvNC10YLQvtC0INC90LAg0LLRitCy0LXQttC00LDQvdC1Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLQlNC+0YHRgtCw0LLRh9C40Log0L3QsCDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQlNC+0YHRgtCw0LLRh9C40Log0L3QsCDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i0KPRgdC70YPQs9CwINC30LAg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i0JjQvdGE0L7RgNC80LDRhtC40Y8g0LfQsCDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y/RgtCwINC90LAg0YDQtdGH0L3QuNGG0LjRgtC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLQlNC+0LHQsNCy0LXQvdC4INGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLQndCw0LvQuNGG0LUg0LUg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+ItCd0LDRgdGC0YDQvtC50LrQuCDQt9CwINGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i0J/QvtGC0YDQtdCx0LjRgtC10LvRgdC60Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLQn9C+0YLRgNC10LHQuNGC0LXQu9GB0LrQuCDRgNC10YfQvdC40LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLQoNC10YfQvdC40LrRitGCINC1INC90LDQu9C40YbQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQmNC30YLQtdCz0LvRj9GCINGB0LUg0L/QvtC90LDRgdGC0L7Rj9GJ0LXQvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4sINC00LXQsNC60YLQuNCy0LjRgNCw0L3QviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQmNC80LAg0L/RgNC+0LHQu9C10Lwg0YEg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i0J3Rj9C80LAg0L3QsNC70LjRh9C90Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLQntC/0YDQtdGB0L3Rj9Cy0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0J/QvtGB0LvQtdC00L3QsCDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y86Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCf0YDQvtCy0LXRgNGP0LLQsCDRgdC1INC30LAg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+ItCX0LDRgNC10LbQtNCwINGB0LUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0J7RgdC90L7QstC10L0g0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+ItCe0YLQutCw0LciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0JjQvdGB0YLQsNC70LjRgNCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+ItCQ0L3Rg9C70LjRgNCw0L3QtSDQvdCwINC40LfRgtC10LPQu9GP0L3QtdGC0L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i0JTQtdCw0LrRgtC40LLQuNGA0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i0JDQutGC0LjQstC40YDQsNC90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQmNC30YLRgNC40LLQsNC90LUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i0JfQsCA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+INC1INC90LDQu9C40YbQtSDRgNC10YfQvdC40LoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLQndCw0YLQuNGB0L3QtdGC0LUsINC30LAg0LTQsCDQv9GA0LXQs9C70LXQtNCw0YLQtSDQuCDQuNC30YLQtdCz0LvQuNGC0LUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAppbmRleCBlZDg4MzMzLi5jNDViMDdjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZXRlcm1pbmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIGkgaW50cm9kdWNjacOzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTZWxlY2Npw7MgZGUgbcOodG9kZXMgZFwnaW50cm9kdWNjacOzIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJQcm92ZcOvZG9yIGRlIGRpY2Npb25hcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlByb3Zlw69kb3IgZGUgZGljY2lvbmFyaXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZlaSBkZSBkaWNjaW9uYXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYWNpw7MgZFwnYWN0dWFsaXR6YWNpw7MgZGVsIGRpY2Npb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY2Npb25hcmlzIGNvbXBsZW1lbnRhcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNjaW9uYXJpIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iQ29uZmlndXJhY2nDsyBkZWxzIGRpY2Npb25hcmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaXMgZGUgbFwndXN1YXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaSBkZSBsXCd1c3VhcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNjaW9uYXJpIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iU1wnZXN0w6AgYmFpeGFudCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbMK3bGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWzCt2xhdCwgZGVzYWN0aXZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJTXCdoYSBwcm9kdcOvdCB1biBwcm9ibGVtYSBlbiBjb25uZWN0YXIgYWwgc2VydmVpIGRlIGRpY2Npb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5vIGhpIGhhIGNhcCBkaWNjaW9uYXJpIGRpc3BvbmlibGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQWN0dWFsaXR6YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IsOabHRpbWEgYWN0dWFsaXR6YWNpw7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU1wnZXN0w6AgY29tcHJvdmFudCBzaSBoaSBoYSBhY3R1YWxpdHphY2lvbnMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iU1wnZXN0w6AgY2FycmVnYW50Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2Npb25hcmkgcHJpbmNpcGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkNhbmNlbMK3bGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFswrdsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbMK3bGEgbGEgYmFpeGFkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZXNhY3RpdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJBY3RpdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJTdXByaW1laXgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJMXCdpZGlvbWEgc2VsZWNjaW9uYXQgYWwgdGV1IGRpc3Bvc2l0aXUgbcOyYmlsIHTDqSB1biBkaWNjaW9uYXJpIGRpc3BvbmlibGUuJmx0O2JyLyZndDsgRXQgcmVjb21hbmVtIHF1ZSAmbHQ7YiZndDtiYWl4aXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmkgZGUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwZXIgbWlsbG9yYXIgbGEgdGV2YSBleHBlcmnDqG5jaWEgZFwnZXNjcmlwdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBiYWl4YWRhIHBvdCB0cmlnYXIgdW4gcGFyZWxsIGRlIG1pbnV0cyBtaXRqYW7Dp2FudCAzRy4gw4lzIHBvc3NpYmxlIHF1ZSBzXCdhcGxpcXVpbiBjw6BycmVjcyBzaSBubyB0ZW5zIHVuICZsdDtiJmd0O3BsYSBkZSBkYWRlcyBpbMK3bGltaXRhdCZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2kgbm8gZXN0w6BzIHNlZ3VyIGRlIHF1aW4gcGxhIGRlIGRhZGVzIHRlbnMsIGV0IHJlY29tYW5lbSBxdWUgY2VycXVpcyB1bmEgY29ubmV4acOzIFdpLUZpIHBlciBjb21lbsOnYXIgbGEgYmFpeGFkYSBhdXRvbcOgdGljYW1lbnQuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgQ29uc2VsbDogUG90cyBiYWl4YXIgaSBlbGltaW5hciBkaWNjaW9uYXJpcyBzaSB2YXMgYSBsYSBzZWNjacOzICZsdDtiJmd0O0lkaW9tYSBpIGVudHJhZGEmbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtDb25maWd1cmFjacOzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdSBtw7JiaWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkJhaXhhIGFyYSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iQmFpeGEgbWl0amFuw6dhbnQgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSGkgaGEgdW4gZGljY2lvbmFyaSBkaXNwb25pYmxlIHBlciBhIGxcJ2lkaW9tYTogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZW0gcGVyIG9waW5hciBpIHBlciBiYWl4YXIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAppbmRleCBiOTI0ZGFkLi41MDNjZTFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJWw71jaG96w60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKYXp5ayBhIHphZMOhdsOhbsOtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJWw71ixJtyIG1ldG9keSB6YWTDoXbDoW7DrSBkYXQiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlBvc2t5dG92YXRlbCBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUG9za3l0b3ZhdGVsIHNsb3Zuw61rdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2x1xb5iYSBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2UgbyBha3R1YWxpemFjaSBzbG92bsOta3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRvcGzFiGtvdsOpIHNsb3Zuw61reSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iSmUgayBkaXNwb3ppY2kgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iTmFzdGF2ZW7DrSBwcm8gc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVcW+aXZhdGVsc2vDqSBzbG92bsOta3kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJVxb5pdmF0ZWxza8O9IHNsb3Zuw61rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iSyBkaXNwb3ppY2kgamUgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQWt0dcOhbG7DrSBzdGFob3bDoW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ik5haW5zdGFsb3bDoW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWluc3RhbG92w6FubywgemFrw6F6w6FubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9ibC4gcyBwxZlpcC4gayBzbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IsW9w6FkbsOpIHNsb3Zuw61reSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFrdHVhbGl6b3ZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlBvc2xlZG7DrSBha3R1YWxpemFjZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJLb250cm9sYSBha3R1YWxpemFjw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmHEjcOtdMOhbsOtLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkhsYXZuw60gc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iWnJ1xaFpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJOYWluc3RhbG92YXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJacnXFoWl0IHN0YWhvdsOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ilpha8OhemF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iUG92b2xpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlNtYXphdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJKZSBrIGRpc3BvemljaSBzbG92bsOtayBwcm8gamF6eWsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlN0aXNrbnV0w61tIHprb250cm9sdWpldGUgYSBzdMOhaG5ldGUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCBlOTAzNDRhLi5hZjQ3MmY3IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJTdGFuZGFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlNwcm9nIG9nIGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJWw6ZsZyBpbnB1dG1ldG9kZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJPcmRib2dzdGplbmVzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJPcGRhdGVyaW5nc29wbHlzbmluZ2VyIGZvciBvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlRpbGzDpmdzb3JkYsO4Z2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEZXIgZXIgZW4gdGlsZ8OmbmdlbGlnIG9yZGJvZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJJbmRzdGlsbGluZ2VyIGZvciBvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJCcnVnZXJvcmRiw7hnZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJCcnVnZXJvcmRib2ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJPcmRib2cgZXIgdGlsZ8OmbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkRvd25sb2FkZXIgaSDDuGplYmxpa2tldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGxlcmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsZXJldCwgZGVha3RpdmVyZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iVWRlbiBvcmRib2dzdGplbmVzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkluZ2VuIHRpbGcuIG9yZGLDuGdlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Ik9wZGF0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJTaWRzdCBvcGRhdGVyZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU8O4Z2VyIGVmdGVyIG9wZGF0ZXJpbmdlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJJbmRsw6ZzZXIuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSG92ZWRvcmRib2ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW5udWxsZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW5udWxsZXIgZG93bmxvYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXbDqXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJTbGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGV0IHZhbGd0ZSBzcHJvZyBww6UgZGluIG1vYmlsZW5oZWQgaGFyIGVuIHRpbGfDpm5nZWxpZyBvcmRib2cuJmx0O2JyLyZndDsgVmkgYW5iZWZhbGVyLCBhdCBkdSAgJmx0O2ImZ3Q7ZG93bmxvYWRlciZsdDsvYiZndDsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPi1vcmRib2dlbiBmb3IgYXQgZm9yYmVkcmUgZGluIHNrcml2ZW9wbGV2ZWxzZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEb3dubG9hZGVuIGthbiB0YWdlIDEtMiBtaW51dHRlciB2aWEgM0cuIERlciBibGl2ZXIgbXVsaWd2aXMgb3BrcsOmdmV0IGFmZ2lmdGVyLCBodmlzIGR1IGlra2UgaGFyIGV0ICZsdDtiJmd0O3ViZWdyw6Zuc2V0IGRhdGFhYm9ubmVtZW50Jmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0Oy4gSHZpcyBkdSBpa2tlIGVyIHNpa2tlciBww6UsIGh2aWxrZXQgZGF0YWFib25uZW10IGR1IGhhciwgYW5iZWZhbGVyIHZpLCBhdCBkdSBmaW5kZXIgZW4gV2ktRmktZm9yYmluZGVsc2UgZm9yIGF0IHN0YXJ0ZSBhdXRvbWF0aXNrIGRvd25sb2FkLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7VGlwOiBEdSBrYW4gZG93bmxvYWRlIG9nIGZqZXJuZSBvcmRiw7hnZXIgdmVkIGF0IGfDpSB0aWwgJmx0O2ImZ3Q7U3Byb2cgb2cgaW5wdXQgJmx0Oy9iJmd0OyBpIG1lbnVlbiAmbHQ7YiZndDtJbmRzdGlsbGluZ2VyJmx0Oy9iJmd0OyBww6UgZGluIG1vYmlsZW5oZWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkRvd25sb2FkIG51ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEb3dubG9hZCB2aWEgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRGVyIGVyIGVuIHRpbGfDpm5nZWxpZyBvcmRib2cgZm9yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUcnlrIGZvciBhdCBnZW5uZW1nw6Ugb2cgZG93bmxvYWRlIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggY2U2MjBmMC4uN2VmM2QwMCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iU3RhbmRhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJTcHJhY2hlICZhbXA7IEVpbmdhYmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkVpbmdhYmVtZXRob2RlIHfDpGhsZW4iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlfDtnJ0ZXJidWNoYmVyZWl0c3RlbGx1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV8O2cnRlcmJ1Y2hiZXJlaXRzdGVsbHVuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iV8O2cnRlcmJ1Y2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJVcGRhdGUtSW5mb3JtYXRpb25lbiBmw7xyIFfDtnJ0ZXJidWNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJFcndlaXRlcnRlIFfDtnJ0ZXJiw7xjaGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJXw7ZydGVyYnVjaCB2ZXJmw7xnYmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IkVpbnN0ZWxsdW5nZW4gZsO8ciBXw7ZydGVyYsO8Y2hlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ik1laW5lIFfDtnJ0ZXJiw7xjaGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iTWVpbiBXw7ZydGVyYnVjaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IlfDtnJ0ZXJidWNoIHZlcmbDvGdiYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQWt0dWVsbGUgRG93bmxvYWRzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGllcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxpZXJ0LCBkZWFrdGl2aWVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJLZWluIFfDtnJ0ZXJidWNoZGllbnN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJLZWluZSBXw7ZydGVyYsO8Y2hlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFrdHVhbGlzaWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJadWxldHp0IGFrdHVhbGlzaWVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJTdWNoZSBuYWNoIFVwZGF0ZXMuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iV2lyZCBnZWxhZGVuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkFsbGdlbWVpbmVzIFfDtnJ0ZXJidWNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFiYnJlY2hlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxsaWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJEb3dubG9hZCBhYmJyZWNoZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZpZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkzDtnNjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRsO8ciBkaWUgYXVmIGRlbSBNb2JpbGdlcsOkdCBhdXNnZXfDpGhsdGUgU3ByYWNoZSBpc3QgZWluIFfDtnJ0ZXJidWNoIHZlcmbDvGdiYXIuJmx0O2JyLyZndDsgJmx0O2ImZ3Q7TGFkZW4gU2llIGRhcyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+LVfDtnJ0ZXJidWNoIGhlcnVudGVyJmx0Oy9iJmd0OyB1bmQgdmVyYmVzc2VybiBTaWUgSWhyZSBFaW5nYWJlZXJmYWhydW5nLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7RGVyIERvd25sb2FkIMO8YmVyIDNHIGthbm4gZWluIGJpcyB6d2VpIE1pbnV0ZW4gZGF1ZXJuLiBGYWxscyBTaWUga2VpbmUgJmx0O2ImZ3Q7RGF0ZW5mbGF0cmF0ZSZsdDsvYiZndDsgaGFiZW4sIGZhbGxlbiBldmVudHVlbGwgR2Viw7xocmVuIGFuLiZsdDtici8mZ3Q7IFNvbGx0ZW4gU2llIHNpY2ggbmljaHQgc2ljaGVyIHNlaW4sIHdlbGNoZW4gRGF0ZW50YXJpZiBTaWUgaGFiZW4sIHN1Y2hlbiBTaWUgZWluZSBXTEFOLVZlcmJpbmR1bmcsIHVtIGRlbiBEb3dubG9hZCBhdXRvbWF0aXNjaCB6dSBzdGFydGVuLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7VGlwcDogSW0gTWVuw7wgJmx0O2ImZ3Q7RWluc3RlbGx1bmdlbiZsdDsvYiZndDsgSWhyZXMgTW9iaWxnZXLDpHRzIGvDtm5uZW4gU2llIHVudGVyICZsdDtiJmd0O1NwcmFjaGUgJmFtcDsgRWluZ2FiZSZsdDsvYiZndDsgV8O2cnRlcmLDvGNoZXIgaGVydW50ZXJsYWRlbiB1bmQgZW50ZmVybmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJKZXR6dCBoZXJ1bnRlcmxhZGVuICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiLDnGJlciBXTEFOIGhlcnVudGVybGFkZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRXMgaXN0IGVpbiBXw7ZydGVyYnVjaCBmw7xyIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJadW0gTGVzZW4gdW5kIEhlcnVudGVybGFkZW4gZHLDvGNrZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCBhZjIzMWI0Li43NGZmY2Y5IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLOoM+Bzr/Otc+AzrnOu86/zrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Is6TzrvPjs+Dz4POsSDOus6xzrkgzrXOuc+DzrHOs8+JzrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4izpXPgM65zrvOv86zzq4gzrzOtc64z4zOtM6/z4UgzrXOuc+DzrHOs8+JzrPOrs+CIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLOoM6xz4HOv8+Hzq3Osc+CIM67zrXOvs65zrrOv8+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Is6gzrHPgc6/z4fOrc6xz4IgzrvOtc6+zrnOus6/z40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Is6lz4DOt8+BzrXPg86vzrEgzrvOtc6+zrnOus6/z40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLOlc69zrfOvM6tz4HPic+Dzrcgz4DOu863z4HOv8+Gzr/Pgc65z47OvSDOu861zr7Ouc66zr/PjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4izqDPgc+Mz4POuM61z4TOsSDOu861zr7Ouc66zqwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Is6UzrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4izqHPhc64zrzOr8+DzrXOuc+CIM6zzrnOsSDOu861zr7Ouc66zqwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLOm861zr7Ouc66zqwgz4fPgc6uz4PPhM63Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4izpvOtc6+zrnOus+MIM+Hz4HOrs+Dz4TOtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+Is6UzrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4izpvOrs+IzrcgzrHPhc+Ezq7OvSDPhM63IM+Dz4TOuc6zzrzOriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Is6VzrPOus6xz4TOtc+Dz4TOt868zq3Ovc6/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLOlc6zzrrOsc+EzrHPg8+EzqzOuM63zrrOtSwgzrHPgM61zr3Otc+BzrPOv8+Azr/Ouc6uzrjOt866zrUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4izqDPgc+MzrLOuy7Pg8+Nzr3OtC7Pg8+Ezr8gzrvOtc6+LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM6xIM67zrXOvs65zrrOrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Is6Rzr3Osc69zq3Pic+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLOpM61zrvOtc+Fz4TOsc6vzrEgzrXOvc63zrzOrc+Bz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Is6IzrvOtc6zz4fOv8+CIM6zzrnOsSDOtc69zrfOvM61z4HPjs+DzrXOuc+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+Is6az43Pgc65zr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Is6RzrrPjc+Bz4nPg863Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Is6VzrPOus6xz4TOrM+Dz4TOsc+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLOkc66z43Pgc+Jz4POtyDOu86uz4jOt8+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Is6Rz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLOlc69zrXPgc6zzr/PgM6/zq/Ot8+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLOlM65zrHOs8+BzrHPhs6uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Is6lz4DOrM+Bz4fOtc65IM60zrnOsc64zq3Pg865zrzOvyDOu861zr7Ouc66z4wgzrPOuc6xIM+EzrEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Is6gzrHPhM6uz4PPhM61IM6zzrnOsSDOrc67zrXOs8+Hzr8gzrrOsc65IM67zq7PiM63Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAppbmRleCA5ZTdkNjRmLi4zYmI3YmFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkRlZmF1bHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMYW5ndWFnZSAmYW1wOyBpbnB1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iQ2hvb3NlIGlucHV0IG1ldGhvZCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJEaWN0aW9uYXJ5IFNlcnZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJEaWN0aW9uYXJ5IHVwZGF0ZSBpbmZvcm1hdGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iQWRkLW9uIGRpY3Rpb25hcmllcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljdGlvbmFyeSBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU2V0dGluZ3MgZm9yIGRpY3Rpb25hcmllcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IlVzZXIgZGljdGlvbmFyaWVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iVXNlciBkaWN0aW9uYXJ5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iRGljdGlvbmFyeSBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iQ3VycmVudGx5IGRvd25sb2FkaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsZWQsIGRpc2FibGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW0gd2hpbGUgY29ubmVjdGluZyB0byBkaWN0aW9uYXJ5IHNlcnZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5vIGRpY3Rpb25hcmllcyBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJSZWZyZXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTGFzdCB1cGRhdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkNoZWNraW5nIGZvciB1cGRhdGVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkxvYWRpbmcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iTWFpbiBkaWN0aW9uYXJ5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkNhbmNlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQ2FuY2VsIGRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRpc2FibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJFbmFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJEZWxldGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJUaGUgc2VsZWN0ZWQgbGFuZ3VhZ2Ugb24geW91ciBtb2JpbGUgZGV2aWNlIGhhcyBhbiBhdmFpbGFibGUgZGljdGlvbmFyeS4mbHQ7YnIvJmd0OyBXZSByZWNvbW1lbmQgJmx0O2ImZ3Q7ZG93bmxvYWRpbmcmbHQ7L2ImZ3Q7IHRoZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGRpY3Rpb25hcnkgdG8gaW1wcm92ZSB5b3VyIHR5cGluZyBleHBlcmllbmNlLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRoZSBkb3dubG9hZCBjb3VsZCB0YWtlIGEgbWludXRlIG9yIHR3byBvdmVyIDNHLiBDaGFyZ2VzIG1heSBhcHBseSBpZiB5b3UgZG9uXCd0IGhhdmUgYW4gJmx0O2ImZ3Q7dW5saW1pdGVkIGRhdGEgcGxhbiZsdDsvYiZndDsuJmx0O2JyLyZndDsgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGljaCBkYXRhIHBsYW4geW91IGhhdmUsIHdlIHJlY29tbWVuZCBmaW5kaW5nIGEgV2lmaSBjb25uZWN0aW9uIHRvIHN0YXJ0IHRoZSBkb3dubG9hZCBhdXRvbWF0aWNhbGx5LiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRpcDogWW91IGNhbiBkb3dubG9hZCBhbmQgcmVtb3ZlIGRpY3Rpb25hcmllcyBieSBnb2luZyB0byAmbHQ7YiZndDtMYW5ndWFnZSAmYW1wOyBpbnB1dCZsdDsvYiZndDsgaW4gdGhlICZsdDtiJmd0O1NldHRpbmdzJmx0Oy9iJmd0OyBtZW51IG9mIHlvdXIgbW9iaWxlIGRldmljZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI0MDI0MDEzNzY0OTM3ODUwMDYxIj4iRG93bmxvYWQgbm93ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz5NQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkRvd25sb2FkIG92ZXIgV2lmaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJBIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlIGZvciA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHJlc3MgdG8gcmV2aWV3IGFuZCBkb3dubG9hZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggNTBiMjQ2MS4uMGQwYWExNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZXRlcm1pbmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRlY2xhZG8gZSBpZGlvbWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlNlbGVjY2lvbmFyIG3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUHJvdmVlZG9yIGRlIGRpY2Npb25hcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJQcm92ZWVkb3IgZGUgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTZXJ2aWNpbyBkZSBkaWNjaW9uYXJpb3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2nDs24gYWNlcmNhIGRlIGxhIGFjdHVhbGl6YWNpw7NuIGRlbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGljY2lvbmFyaW9zIGNvbXBsZW1lbnRhcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljY2lvbmFyaW8gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDb25maWd1cmFjacOzbiBkZSBsb3MgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaW9zIGRlbCB1c3VhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaW8gZGVsIHVzdWFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNjaW9uYXJpbyBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkRlc2NhcmdhIGVuIGN1cnNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsYWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxhZG8sIGluaGFiaWxpdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJFcnIuIGNvbmV4LiBjb24gZGljLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTm8gaGF5IGRpY2Npb25hcmlvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBY3R1YWxpemFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iw5psdGltYSBhY3R1YWxpemFjacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJCdXNjYW5kbyBsYXMgYWN0dWFsaXphY2lvbmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IkNhcmdhbmRv4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2Npb25hcmlvIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJDYW5jZWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbGFyIGxhIGRlc2NhcmdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkluaGFiaWxpdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWN0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgcGFyYSBlbCBpZGlvbWEgc2VsZWNjaW9uYWRvIGVuIHR1IGRpc3Bvc2l0aXZvIG3Ds3ZpbC4mbHQ7YnIvJmd0OyBUZSByZWNvbWVuZGFtb3MgcXVlICZsdDtiJmd0O2Rlc2Nhcmd1ZXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmlvIGRlIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGFyYSBtZWpvcmFyIHR1IGV4cGVyaWVuY2lhIGRlIGVzY3JpdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBkZXNjYXJnYSBwdWVkZSB0YXJkYXIgdW5vcyBtaW51dG9zIGVuIHJlZGVzIDNHLiBTaSBubyB0aWVuZXMgdW4gJmx0O2ImZ3Q7cGxhbiBkZSBkYXRvcyBpbGltaXRhZG8mbHQ7L2ImZ3Q7LCBlcyBwb3NpYmxlIHF1ZSBzZSBhcGxpcXVlbiBjYXJnb3MuJmx0O2JyLyZndDsgU2kgbm8gY29ub2NlcyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSB0dSBwbGFuIGRlIGRhdG9zLCB0ZSByZWNvbWVuZGFtb3MgcXVlIHVzZXMgdW5hIGNvbmV4acOzbiBXaS1GaSBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2EgYXV0b23DoXRpY2FtZW50ZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBTdWdlcmVuY2lhOiBQdWVkZXMgZGVzY2FyZ2FyIHkgZWxpbWluYXIgZGljY2lvbmFyaW9zIGVuIGxhIHNlY2Npw7NuICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHVjY2nDs24gZGUgdGV4dG8mbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtBanVzdGVzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdm8gbcOzdmlsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJEZXNjYXJnYXIgYWhvcmEgKCA8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEZXNjYXJnYXIgbWVkaWFudGUgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgZGUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQdWxzYSBwYXJhIGNvbnN1bHRhciB5IGRlc2NhcmdhciI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IDQyNDI3ZmUuLjk1ODQ2ZWYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlByZWRldGVybWluYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIHkgZW50cmFkYSBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iU2VsZWNjaW9uYSB1biBtw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlByb3ZlZWRvciBkZWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUHJvdmVlZG9yIGRlbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2VydmljaW8gZGUgZGljY2lvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hY2nDs24gZGUgYWN0dWFsaXphY2nDs24gZGVsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJEaWNjaW9uYXJpb3MgY29tcGxlbWVudGFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNjaW9uYXJpbyBkaXNwb25pYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IkFqdXN0ZXMgZGUgZGljY2lvbmFyaW9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljY2lvbmFyaW9zIGRlbCB1c3VhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljY2lvbmFyaW8gZGVsIHVzdWFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJIYXkgdW4gZGljY2lvbmFyaW8gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJEZXNjYXJnYXMgZW4gY3Vyc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGFkbyAoaW5oYWJpbGl0YWRvKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJFcnJvciBhbCBjb25lY3RhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTm8gaGF5IGRpY2Npb25hcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkFjdHVhbGl6YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLDmmx0aW1hIGFjdHVhbGl6YWNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkJ1c2NhbmRvIGFjdHVhbGl6YWNpb25lcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWNjaW9uYXJpbyBwcmluY2lwYWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJDYW5jZWxhciBkZXNjYXJnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJJbmhhYmlsaXRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkhhYmlsaXRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iSGF5IHVuIGRpY2Npb25hcmlvIGRpc3BvbmlibGUgcGFyYSBlbCBpZGlvbWEgc2VsZWNjaW9uYWRvIGVuIHR1IGRpc3Bvc2l0aXZvIG3Ds3ZpbC4mbHQ7YnIvJmd0OyBUZSByZWNvbWVuZGFtb3MgcXVlICZsdDtiJmd0O2Rlc2Nhcmd1ZXMmbHQ7L2ImZ3Q7IGVsIGRpY2Npb25hcmlvIGRlIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGFyYSBtZWpvcmFyIHR1IGV4cGVyaWVuY2lhIGRlIGVzY3JpdHVyYS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMYSBkZXNjYXJnYSBwdWVkZSB0YXJkYXIgdW5vcyBtaW51dG9zIGVuIHJlZGVzIDNHLiBTaSBubyB0aWVuZXMgdW4gJmx0O2ImZ3Q7cGxhbiBkZSBkYXRvcyBpbGltaXRhZG8mbHQ7L2ImZ3Q7LCBlcyBwb3NpYmxlIHF1ZSBzZSBhcGxpcXVlbiBjYXJnb3MuJmx0O2JyLyZndDsgU2kgbm8gY29ub2NlcyBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSB0dSBwbGFuIGRlIGRhdG9zLCB0ZSByZWNvbWVuZGFtb3MgcXVlIHVzZXMgdW5hIGNvbmV4acOzbiBXaS1GaSBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2EgYXV0b23DoXRpY2FtZW50ZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBTdWdlcmVuY2lhOiBwdWVkZXMgZGVzY2FyZ2FyIHkgZWxpbWluYXIgZGljY2lvbmFyaW9zIGVuIGxhIHNlY2Npw7NuICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHVjY2nDs24gZGUgdGV4dG8mbHQ7L2ImZ3Q7IGRlbCBtZW7DuiAmbHQ7YiZndDtBanVzdGVzJmx0Oy9iJmd0OyBkZWwgZGlzcG9zaXRpdm8gbcOzdmlsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJEZXNjYXJnYXIgYWhvcmEgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IkRlc2NhcmdhciBtZWRpYW50ZSBXaS1GaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJIYXkgdW4gZGljY2lvbmFyaW8gZGlzcG9uaWJsZSBkZSA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHVsc2EgcGFyYSBjb21wcm9iYXIgeSBkZXNjYXJnYXIiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbAppbmRleCA1MWViNDdiLi4wNjk3Y2FiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJWYWlrZXbDpMOkcnR1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IktlZWxlZCBqYSBzaXNlc3RhbWluZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iVmFsaWdlIHNpc2VzdHVzbWVldG9kIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTw7VuYXN0aWt1cGFra3VqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJTw7VuYXN0aWt1cGFra3VqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU8O1bmFyYWFtYXR1dGVlbnVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iU8O1bmFzdGlrdSB2w6Ryc2tlbmRhbWlzdGVhdmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlBpc3Rpa3PDtW5hc3Rpa3VkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJTw7VuYXN0aWsgb24gc2FhZGF2YWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU8O1bmFzdGlrZSBzZWFkZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJLYXN1dGFqYXPDtW5hc3Rpa3VkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FzdXRhamFzw7VuYXN0aWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTw7VuYXN0aWsgb24gc2FhZGF2YWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iUHJhZWd1IGFsbGFsYWFkaW1pc2VsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGl0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxpdHVkLCBrZWVsYXR1ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJUw7VyZ2Ugc8O1bmFzdC4gw7xoZW5kLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iU8O1bmFzdGlra2UgcG9sZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlbDpHJza2VuZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJWaWltYXRpIHbDpHJza2VuZGF0dWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVsOkcnNrZW5kdXN0ZSBvdHNpbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJMYWFkaW1pbmUgLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IlDDtWhpc8O1bmFzdGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IlTDvGhpc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iVMO8aGlzdGEgYWxsYWxhYWRpbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJLZWVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Ikx1YmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJLdXN0dXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTW9iaWlsc2VhZG1lcyB2YWxpdHVkIGtlZWxlbGUgb24gc2FhZGF2YWwgc8O1bmFzdGlrLiZsdDtici8mZ3Q7IFRla3N0aSBzaXNlc3RhbWlzZWtzICBzb292aXRhbWUgJmx0O2ImZ3Q7YWxsYSBsYWFkaWRhJmx0Oy9iJmd0OyBzw7VuYXN0aWt1IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgM0cga2F1ZHUgYWxsYWxhYWRpbWlzZWxlIHbDtWliIGt1bHVkYSBtaW51dCB2w7VpIHBhYXIuIEtlaHRpZGEgdsO1aXZhZCB0YXN1ZCwga3VpIHRlIGVpIGthc3V0YSAmbHQ7YiZndDtwaWlyYW1hdHV0IGFuZG1lcGFrZXR0aSZsdDsvYiZndDsuJmx0O2JyLyZndDsgS3VpIHRlIGVpIHRlYSwgbWlsbGlzdCBhbmRtZXBha2V0dGkga2FzdXRhdGUsIHNvb3ZpdGFtZSBhbGxhbGFhZGltaXNlIGF1dG9tYWF0c2VrcyBrw6Rpdml0YW1pc2VrcyBsZWlkYSBXaUZpLcO8aGVuZHVzZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBOw7V1YW5uZTogc8O1bmFzdGlra2Ugc2FhdGUgYWxsYSBsYWFkaWRhIGphIGVlbWFsZGFkYSwgdGVoZXMgdmFsaWt1ICZsdDtiJmd0O0tlZWxlICZhbXA7IHNpc2VuZCZsdDsvYiZndDsgbW9iaWlsc2VhZG1lIG1lbsO8w7xzICZsdDtiJmd0O1NlYWRlZCZsdDsvYiZndDsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IkxhYWRpIGtvaGUgYWxsYSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGFhZGkgYWxsYSBXaUZpIGthdWR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlPDtW5hc3RpayBvbiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IGtlZWxlIGphb2tzIHNhYWRhdmFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iVmFqdXRhZ2Ugw7xsZXZhYXRhbWlzZWtzIGphIGFsbGFsYWFkaW1pc2VrcyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IDhmNzFmMTkuLmVjYzdlMjggMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKQEAgLTE3NCw0ICsxNzQsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Itm+24zYtOKAjNmB2LHYtiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Itiy2KjYp9mGINmIINmI2LHZiNiv24wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+Itin2YbYqtiu2KfYqCDYsdmI2LQg2YjYsdmI2K/bjCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i2KfYsdin2KbZh+KAjNiv2YfZhtiv2Ycg2YHYsdmH2YbaryDZhNi62KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i2KfYsdin2KbZhyDYr9mH2YbYr9mHINmB2LHZh9mG2q8g2YTYutiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLYs9ix2YjbjNizINmB2LHZh9mG2q8g2YTYutiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i2KfYt9mE2KfYudin2Kog2KjZh+KAjNix2YjYstix2LPYp9mG24wg2YHYsdmH2YbaryDZhNi62KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItmB2LHZh9mG2q/igIzZh9in24wg2YTYutiqINin2YHYstmI2K/ZhtuMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLZgdix2YfZhtqvINmE2LrYqiDYr9ixINiv2LPYqtix2LMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i2KrZhti424zZhdin2Kog2KjYsdin24wg2YHYsdmH2Ybar+KAjCDZhNi62KrigIzZh9inIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i2YHYsdmH2Ybar+KAjNmH2KfbjCDZhNi62Kog2qnYp9ix2KjYsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItmB2LHZh9mG2q/igIwg2YTYutiqINqp2KfYsdio2LEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLZgdix2YfZhtqvINmE2LrYqiDZhdmI2KzZiNivINin2LPYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLZhdmI2KfYsdivINiv2LEg2K3Yp9mEINiv2KfZhtmE2YjYryDaqdmG2YjZhtuMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i2YbYtdioINi02K8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItmG2LXYqCDYtNiv2Iwg2LrbjNix2YHYudin2YQg2LTYryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLZhdi02qnZhCDYp9iq2LXYp9mEINio2Ycg2LPYsdmI24zYsyDZgdix2YfZhtqvINmE2LrYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i2YfbjNqGINmB2LHZh9mG2q8g2YTYutiq24wg2YXZiNis2YjYryDZhtuM2LPYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+Itio2KfYstiu2YjYp9mG24wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLYqtin2LHbjNiuINii2K7YsduM2YYg2KjZh+KAjNix2YjYstix2LPYp9mG24wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i2K/Ysdit2KfZhCDYqNix2LHYs9uMINio2YfigIzYsdmI2LLYsdiz2KfZhtuM4oCM2YfYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLYr9ixINit2KfZhCDYqNin2LHar9uM2LHbjC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLZgdix2YfZhtqv4oCMINmE2LrYqiDYp9i12YTbjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLZhNi62YgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i2YbYtdioIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i2YTYutmIINiv2KfZhtmE2YjYryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLYutuM2LHZgdi52KfZhCDaqdix2K/ZhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+ItmB2LnYp9mEINqp2LHYr9mGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i2K3YsNmBIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+ItuM2qkg2YHYsdmH2YbaryDZhNi62Kog2KjYsdin24wgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDYr9ixINiv2LPYqtix2LMg2KfYs9iqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i2KjYsdin24wg2YXYsdmI2LEg2Ygg2K/Yp9mG2YTZiNivINmB2LTYp9ixINiv2YfbjNivIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKaW5kZXggOWZlOGYxYi4uNjI0ZTRlNiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iT2xldHVzYXJ2b3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJLaWVsaSBqYSBzecO2dHTDtnRhcGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlZhbGl0c2Ugc3nDtnR0w7Z0YXBhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTYW5ha2lyamFuIHRhcmpvYWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlNhbmFraXJqYW4gdGFyam9hamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNhbmFraXJqYXBhbHZlbHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJTYW5ha2lyamFuIHDDpGl2aXR5c3RpZWRvdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iU2FuYWtpcmphbGlzw6Rvc2F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJTYW5ha2lyamEgc2FhdGF2aWxsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJTYW5ha2lyam9qZW4gYXNldHVrc2V0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS8OkeXR0w6Rqw6RuIHNhbmFraXJqYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLw6R5dHTDpGrDpG4gc2FuYWtpcmphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iU2FuYWtpcmphIHNhYXRhdmlsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iTGFkYXRhYW4gcGFyaGFpbGxhYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJBc2VubmV0dHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IkFzZW5uZXR0dSwgcG9pc3RldHR1IGvDpHl0w7ZzdMOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+Ik9uZ2VsbWEgeWhkLiBzYW5hay5wYWx2ZWx1dW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkVpIHNhbmFraXJqLiBzYWF0YXYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iUMOkaXZpdMOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iVmlpbWVrc2kgcMOkaXZpdGV0dHkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVGFya2lzdGV0YWFuIHDDpGl2aXR5a3Npw6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTGFkYXRhYW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iUMOkw6RzYW5ha2lyamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iUGVydXV0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJBc2VubmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJQZXJ1dXRhIGxhdGF1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJQb2lzdGEga8OkeXTDtnN0w6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJPdGEga8OkeXR0w7bDtm4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJQb2lzdGEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iS2llbGVuIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gc2FuYWtpcmphIG9uIHNhYXRhdmlsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQYWluYSB0w6R0w6QsIGpvcyBoYWx1YXQgdGFya2FzdGVsbGEga29oZGV0dGEgdGFpIGxhZGF0YSBzZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCA4YjIyODc0Li43Nzg4ZTVjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQYXIgZMOpZmF1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ikxhbmd1ZSBldCBzYWlzaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlPDqWxlY3Rpb25uZXogbGUgbW9kZSBkZSBzYWlzaWUiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkZvdXJuaXNzZXVyIGRlIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRm91cm5pc3NldXIgZGUgZGljdGlvbm5haXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2VydmljZSBkZSBkaWN0aW9ubmFpcmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYXRpb25zIHJlbGF0aXZlcyDDoCBsYSBtaXNlIMOgIGpvdXIgZGVzIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY3Rpb25uYWlyZXMgY29tcGzDqW1lbnRhaXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljdGlvbm5haXJlIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iUGFyYW3DqHRyZXMgZGVzIGRpY3Rpb25uYWlyZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaWN0aW9ubmFpcmVzIHBlcnNvbm5lbHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJEaWN0aW9ubmFpcmUgcGVyc29ubmVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iRGljdGlvbm5haXJlIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iRW4gY291cnMgZGUgdMOpbMOpY2hhcmdlbWVudOKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGzDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsbMOpLCBkw6lzYWN0aXbDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQYXMgZGUgc2VydmljZSBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJBdWN1biBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQWN0dWFsaXNlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkRlcm5pw6hyZSBtaXNlIMOgIGpvdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iUmVjaGVyY2hlIGRlIG1pc2VzIMOgIGpvdXIgZW4gY291cnPigKYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2hhcmdlbWVudOKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWN0aW9ubmFpcmUgcHJpbmNpcGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFubnVsZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW5udWxlciBsZSB0w6lsw6ljaGFyZ2VtZW50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkTDqXNhY3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWN0aXZlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlN1cHByaW1lciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IlVuIGRpY3Rpb25uYWlyZSBlc3QgZGlzcG9uaWJsZSBwb3VyIGxhIGxhbmd1ZSBzw6lsZWN0aW9ubsOpZSBzdXIgdm90cmUgYXBwYXJlaWwgbW9iaWxlLiZsdDtici8mZ3Q7IE5vdXMgdm91cyBpbnZpdG9ucyDDoCAmbHQ7YiZndDt0w6lsw6ljaGFyZ2VyJmx0Oy9iJmd0OyBsZSBkaWN0aW9ubmFpcmUgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwb3VyIGZhY2lsaXRlciB2b3RyZSBzYWlzaWUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgTGUgdMOpbMOpY2hhcmdlbWVudCBwZXV0IHByZW5kcmUgdW5lIMOgIGRldXjCoG1pbnV0ZXMgdmlhIHVuZSBjb25uZXhpb24gM0cuIERlcyBmcmFpcyBwZXV2ZW50IHNcJ2FwcGxpcXVlciBzaSB2b3VzIG5lIGRpc3Bvc2V6IHBhcyBkXCd1biAmbHQ7YiZndDtmb3JmYWl0IEludGVybmV0IGlsbGltaXTDqSZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2kgdm91cyBuXCfDqnRlcyBwYXMgc8O7ciBkZSB2b3RyZSBmb3JmYWl0LCBub3VzIHZvdXMgY29uc2VpbGxvbnMgZFwndXRpbGlzZXIgdW5lIGNvbm5leGlvbiBXaS1GaSBwb3VyIGxhbmNlciBhdXRvbWF0aXF1ZW1lbnQgbGUgdMOpbMOpY2hhcmdlbWVudC4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBBc3R1Y2XCoDogVm91cyBwb3V2ZXogdMOpbMOpY2hhcmdlciBldCBzdXBwcmltZXIgZGVzIGRpY3Rpb25uYWlyZXMgZGFucyAmbHQ7YiZndDtMYW5ndWUgZXQgc2Fpc2llJmx0Oy9iJmd0OyBkdSBtZW51ICZsdDtiJmd0O1BhcmFtw6h0cmVzJmx0Oy9iJmd0OyBkZSB2b3RyZSBhcHBhcmVpbCBtb2JpbGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlTDqWzDqWNoYXJnZXIgbWFpbnRlbmFudCAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+wqBNbykiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlTDqWzDqWNoYXJnZXIgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlVuIGRpY3Rpb25uYWlyZSBlc3QgZGlzcG9uaWJsZSBlbiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iQXBwdXlleiBpY2kgcG91ciBjb25zdWx0ZXIgZXQgdMOpbMOpY2hhcmdlciBsZSBkaWN0aW9ubmFpcmUuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKaW5kZXggNzcwODFiZC4uNDY3NjAzNCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i4KSh4KS/4KSr4KS84KWJ4KSy4KWN4KSfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i4KSt4KS+4KS34KS+IOCklOCksCDgpIfgpKjgpKrgpYHgpJ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuCkh+CkqOCkquClgeCknyDgpKrgpKbgpY3gpKfgpKTgpL8g4KSa4KWB4KSo4KWH4KSCIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSq4KWN4KSw4KSm4KS+4KSk4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpKrgpY3gpLDgpKbgpL7gpKTgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpLjgpYfgpLXgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSF4KSq4KSh4KWH4KSfIOCknOCkvuCkqOCkleCkvuCksOClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i4KSP4KShLeCkkeCkqCDgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuCkoeCkv+CkleCljeKAjeCktuCkqOCksOClgCDgpIngpKrgpLLgpKzgpY3igI3gpKciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIOCkleClhyDgpLLgpL/gpI8g4KS44KWH4KSf4KS/4KSC4KSXIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4KSJ4KSq4KSv4KWL4KSX4KSV4KSw4KWN4KSk4KS+IOCkoeCkv+CkleCljeCktuCkqOCksOClgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IuCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkviDgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLgpKHgpL/gpJXgpY3gpLbgpKjgpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4oCN4KSnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuCkteCksOCljeCkpOCkruCkvuCkqCDgpK7gpYfgpIIg4KSh4KS+4KSJ4KSo4KSy4KWL4KShIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkueCliCwg4KSF4KSV4KWN4KS34KSuIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLgpKHgpL/gpJXgpY3igI3gpLYuIOCkuOClh+CkteCkviDgpLjgpYcg4KSV4KSo4KWH4KSV4KWN4oCN4KSfIOCkleCksOCkqOClhyDgpK7gpYfgpIIg4KS44KSu4KS44KWN4oCN4KSv4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLgpJXgpYvgpIgg4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIOCkieCkquCksuCkrOCljeKAjeCkpyDgpKjgpLngpYDgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLgpLDgpYDgpKvgpLzgpY3gpLDgpYfgpLYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i4KSF4KSC4KSk4KS/4KSuIOCkheCkquCkoeClh+CknyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiLgpIXgpKrgpKHgpYfgpJ8g4KSm4KWH4KSW4KWHIOCknOCkviDgpLDgpLngpYcg4KS54KWI4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuCksuCli+CkoSDgpLngpYsg4KSw4KS54KWAIOCkueCliC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLgpK7gpYHgpJbgpY3igI3gpK8g4KSh4KS/4KSV4KWN4oCN4KS24KSo4KSw4KWAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IuCksOCkpuCljeCkpiDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i4KSH4KSC4KS44KWN4oCN4KSf4KWJ4KSyIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuCkoeCkvuCkieCkqOCksuCli+CkoSDgpLDgpKbgpY3gpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IuCkheCkleCljeCkt+CkriDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLgpLjgpJXgpY3gpLfgpK4g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4KS54KSf4KS+4KSP4KSCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4g4KSV4KWHIOCksuCkv+CkjyDgpKHgpL/gpJXgpY3igI3gpLbgpKjgpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4oCN4KSnIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuCkuOCkruClgOCkleCljeCkt+CkviDgpJTgpLAg4KSh4KS+4KSJ4KSo4KSy4KWL4KShIOCkleCksOCkqOClhyDgpJXgpYcg4KSy4KS/4KSPIOCkpuCkrOCkvuCkj+CkgiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCmluZGV4IDA3MTBkMzAuLjE4NDUzNTYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlphZGFubyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkplemlrIGkgdW5vcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iT2RhYmlyIG5hxI1pbmEgdW5vc2EiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkRhdmF0ZWxqIHJqZcSNbmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEYXZhdGVsaiByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlVzbHVnYSByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJBxb51cmlyYW5lIGluZm9ybWFjaWplIHJqZcSNbmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iUmplxI1uaWNpIC0gZG9kYWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEb3N0dXBhbiBqZSByamXEjW5payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJQb3N0YXZrZSB6YSByamXEjW5pa2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJLb3Jpc25pxI1raSByamXEjW5pY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLb3Jpc25pxI1raSByamXEjW5payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IlJqZcSNbmlrIGplIGRvc3R1cGFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IlRyZW51dGHEjW5vIHUgcHJldXppbWFuanUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxpcmFubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsaXJhbm8sIG9uZW1vZ3XEh2VubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJOZW1hIHVzbHVnZSByamXEjW5pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IlJqZcSNbmljaSBuZWRvc3R1cG5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iT3N2amXFvmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJaYWRuamUgYcW+dXJpcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iUHJvdmplcmEgYcW+dXJpcmFuamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iVcSNaXRhdmFuamUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iR2xhdm5pIHJqZcSNbmlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Ik9kdXN0YW5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGlyYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJPdGthxb5pIHByZXV6aW1hbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik9uZW1vZ3XEh2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJPbW9ndcSHaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+Ikl6YnJpxaFpIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkRvc3R1cGFuIGplIHJqZcSNbmlrIHphIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gamV6aWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQcml0aXNuaXRlIHphIHByZWdsZWQgaSBwcmV1emltYW5qZSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCmluZGV4IGU5YzdhYTAuLjU1Y2QzYzIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkFsYXDDqXJ0ZWxtZXpldHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJOeWVsdiDDqXMgYmV2aXRlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iQmV2aXRlbGkgbcOzZCBraXbDoWxhc3p0w6FzYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iU3rDs3TDoXJzem9sZ8OhbHRhdMOzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlN6w7N0w6Fyc3pvbGfDoWx0YXTDsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU3rDs3TDoXIgc3pvbGfDoWx0YXTDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJTesOzdMOhcmZyaXNzw610w6lzc2VsIGthcGNzb2xhdG9zIGluZm9ybcOhY2nDs2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkLFkXbDrXRtw6lueWVrOiBzesOzdMOhcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJWYW4gcmVuZGVsa2V6w6lzcmUgw6FsbMOzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IlN6w7N0w6FyYWsgYmXDoWxsw610w6FzYWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJGZWxoYXN6bsOhbMOzaSBzesOzdMOhcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRmVsaGFzem7DoWzDs2kgc3rDs3TDoXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJWYW4gcmVuZGVsa2V6w6lzcmUgw6FsbMOzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkplbGVubGVnaSBsZXTDtmx0w6lzZWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJUZWxlcMOtdHZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJUZWxlcMOtdHZlLCBraWthcGNzb2x2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJDc2F0bGFrb3rDoXNpIGhpYmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik5pbmNzIHN6w7N0w6FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iRnJpc3PDrXTDqXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJVdG9sasOhcmEgZnJpc3PDrXR2ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJGcmlzc8OtdMOpc2VrIGtlcmVzw6lzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJCZXTDtmx0w6lzLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkbFkSBzesOzdMOhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJNw6lnc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iVGVsZXDDrXTDqXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJMZXTDtmx0w6lzIG1lZ3N6YWvDrXTDoXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Iktpa2FwY3NvbMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkJla2FwY3NvbMOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlTDtnJsw6lzIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gbnllbHZoZXogdmFuIHJlbmRlbGtlesOpc3JlIMOhbGzDsyBzesOzdMOhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Ik55b21qYSBtZWcgYXogw6F0dGVraW50w6lzaGV6IMOpcyBsZXTDtmx0w6lzaGV6Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggNWVmZThkZC4uZjliMDI4YyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iRGVmYXVsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkJhaGFzYSAmYW1wOyBtYXN1a2FuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJQaWxpaCBtZXRvZGUgbWFzdWthbiI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUGVueWVkaWEgS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUGVueWVkaWEgS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IkxheWFuYW4gS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm1hc2kgcGVtYmFydWFuIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJLYW11cyBwZW5nYXlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJLYW11cyB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJTZXRlbGFuIHVudHVrIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS2FtdXMgcGVuZ2d1bmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJLYW11cyBwZW5nZ3VuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkthbXVzIHlhbmcgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iU2FhdCBpbmkgc2VkYW5nIG1lbmd1bmR1aCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IlRlcnBhc2FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iVGVycGFzYW5nLCBkaW5vbmFrdGlma2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+Ik1hc2FsYWgga29uZWtzaSBrZSBsYXlhbmFuIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJUaWRhayB0ZXJzZWRpYSBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlNlZ2Fya2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iVGVyYWtoaXIgZGlwZXJiYXJ1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJNZW1lcmlrc2EgcGVtYmFydWFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ik1lbXVhdC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJLYW11cyB1dGFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJCYXRhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJQYXNhbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJCYXRhbGthbiB1bmR1aGFuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik5vbmFrdGlma2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aWZrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJIYXB1cyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJLYW11cyB0ZXJzZWRpYSB1bnR1ayBiYWhhc2EgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlRla2FuIHVudHVrIG1lbmluamF1IGRhbiBtZW5ndW5kdWgiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCAwYTYyZjhhLi41MmE5OWM0IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkZWZpbml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ikxpbmd1YSBlIGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTY2VnbGkgaWwgbWV0b2RvIGRpIGltbWlzc2lvbmUiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IkRpY3Rpb25hcnkgUHJvdmlkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2Vydml6aW8gZGl6aW9uYXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWF6aW9uaSBhZ2dpb3JuYXRlIGRpemlvbmFyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGl6aW9uYXJpIGFnZ2l1bnRpdmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IkRpemlvbmFyaW8gZGlzcG9uaWJpbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iSW1wb3N0YXppb25pIHBlciBkaXppb25hcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaXppb25hcmkgdXRlbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGl6aW9uYXJpbyB1dGVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaXppb25hcmlvIGRpc3BvbmliaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkluIGZhc2UgZGkgZG93bmxvYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxsYXRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxsYXRvLCBkaXNhYmlsaXRhdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmxlbWEgY29ubmVzcy4gZGl6aW9uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTmVzc3VuIGRpemlvbmFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBZ2dpb3JuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlVsdGltbyBhZ2dpb3JuYW1lbnRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlZlcmlmaWNhIGRpc3BvbmliaWxpdMOgIGFnZ2lvcm5hbWVudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2FyaWNhbWVudG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iRGl6aW9uYXJpbyBwcmluY2lwYWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkFubnVsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJBbm51bGxhIGRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRpc2F0dGl2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFiaWxpdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJFbGltaW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTGEgbGluZ3VhIHNlbGV6aW9uYXRhIHN1bCB0dW8gZGlzcG9zaXRpdm8gbW9iaWxlIGhhIHVuIGRpemlvbmFyaW8gZGlzcG9uaWJpbGUuJmx0O2JyLyZndDsgVGkgY29uc2lnbGlhbW8gZGkgJmx0O2ImZ3Q7c2NhcmljYXJlJmx0Oy9iJmd0OyBpbCBkaXppb25hcmlvIGRpIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gcGVyIG1pZ2xpb3JhcmUgbFwnZXNwZXJpZW56YSBkaSBkaWdpdGF6aW9uZS4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBJbCBkb3dubG9hZCBwb3RyZWJiZSByaWNoaWVkZXJlIHVuIHBhaW8gZGkgbWludXRpIHN1IHJldGkgM0cuIFBvdHJlYmJlcm8gZXNzZXJlIGFwcGxpY2F0ZSBkZWxsZSB0YXJpZmZlIHNlIG5vbiBkaXNwb25pIGRpIHVuICZsdDtiJmd0O3BpYW5vIGRhdGkgaWxsaW1pdGF0byZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2Ugbm9uIHNhaSBiZW5lIHF1YWxlIHBpYW5vIGRhdGkgw6ggaW4gdXNvLCB0aSBjb25zaWdsaWFtbyBkaSB0cm92YXJlIHVuYSBjb25uZXNzaW9uZSBXaS1GaSBwZXIgYXZ2aWFyZSBpbCBkb3dubG9hZCBhdXRvbWF0aWNhbWVudGUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgU3VnZ2VyaW1lbnRvLiBQdW9pIHNjYXJpY2FyZSBlIHJpbXVvdmVyZSBpIGRpemlvbmFyaSBwYXNzYW5kbyBhICZsdDtiJmd0O0xpbmd1ZSBlIGltbWlzc2lvbmUmbHQ7L2ImZ3Q7IG5lbCBtZW51ICZsdDtiJmd0O0ltcG9zdGF6aW9uaSZsdDsvYiZndDsgZGVsIHR1byBkaXNwb3NpdGl2byBtb2JpbGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlNjYXJpY2Egb3JhICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJTY2FyaWNhIHRyYW1pdGUgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iw4ggZGlzcG9uaWJpbGUgdW4gZGl6aW9uYXJpbyBwZXIgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZW1pIHBlciBlc2FtaW5hcmUgZSBzY2FyaWNhcmUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAppbmRleCAzM2Q5ZmM1Li45ZTU0MTFiIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLXkdeo15nXqNeqINee15fXk9ecIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i16nXpNeUINeV16fXnNeYIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiLXkdeX15nXqNeqINep15nXmNeqINen15zXmCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i16HXpNenINeU157Xmdec15XXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLXodek16cg15TXnteZ15zXldefIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLXqdeZ16jXldeqINee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLXpNeo15jXmSDXoteT15vXldefINee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IteU15XXodek16og157Xmdec15XXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Itee15nXnNeV158g15bXnteZ158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i15TXkteT16jXldeqINei15HXldeoINee15nXnNeV16DXmdedIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i157Xmdec15XXoNeZINee16nXqtee16kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLXnteZ15zXldefINee16nXqtee16kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLXnteZ15zXldefINeW157XmdefIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+Itee15XXqNeZ15Mg15vXoteqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i157Xldeq16fXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i157Xldeq16fXnywg157Xldep15HXqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLXkdei15nXlCDXkdeU16rXl9eR16jXldeqINec16nXmdeo15XXqiDXlNee15nXnNeV158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IteQ15nXnyDXnteZ15zXldeg15nXnSDXltee15nXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLXqNei16DXnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+Itei15XXk9eb158g15zXkNeX16jXldeg15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i157Xl9ek16kg16LXk9eb15XXoNeZ150iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4i15jXldei158uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i157Xmdec15XXnyDXqNeQ16nXmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLXkdeZ15jXldecIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IteU16rXp9efIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i15HXmNecINeU15XXqNeT15QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i15TXqdeR16oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLXlNek15XXmiDXnNek16LXmdecIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i157Xl9enIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4i15zXqdek15Qg15TXoNeR15fXqNeqINeR157Xm9ep15nXqCDXlNeg15nXmdeTINep15zXmiDXmdepINee15nXnNeV158g15bXnteZ158uJmx0O2JyLyZndDsg15DXoNeVINee157XnNeZ16bXmdedICZsdDtiJmd0O9ec15TXldeo15nXkyZsdDsvYiZndDsg15DXqiDXlNee15nXnNeV158g15E8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+INeb15PXmSDXnNep16TXqCDXkNeqINeX15XXldeZ15nXqiDXlNeU16fXnNeT15QuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsg15TXlNeV16jXk9eUINei16nXldeZ15Qg15zXkNeo15XXmiDXk9en15Qg15DXlSDXqdeq15nXmdedINeRLTNHLiDXmdeZ16rXm9efINep16rXl9eV15nXkSDXkNedINeQ15nXnyDXnNeaICZsdDtiJmd0O9eq15XXm9eg15nXqiDXoNeq15XXoNeZ150g15HXnNeq15kg157XldeS15HXnNeqJmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0OyDXkNedINeQ15nXoNeaINeR15jXldeXINeQ15nXlteVINeq15XXm9eg15nXqiDXoNeq15XXoNeZ150g15nXqSDXnNeaLCDXkNeg15Ug157Xntec15nXpteZ150g15zXl9ek16kg15fXmdeR15XXqCBXaS1GaSDXm9eT15kg15zXlNeq15fXmdecINeR15TXldeo15PXlCDXkdeQ15XXpNefINeQ15XXmNeV157XmNeZLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7INeY15nXpDog16DXmdeq158g15zXlNeV16jXmdeTINeV15zXlNeh15nXqCDXnteZ15zXldeg15nXnSDXkSZsdDtiJmd0O9ep16TXlCDXlden15zXmCZsdDsvYiZndDsg15HXqtek16jXmdeYICZsdDtiJmd0O9eU15LXk9eo15XXqiZsdDsvYiZndDsg16nXnCDXlNee15vXqdeZ16gg15TXoNeZ15nXkyDXqdec15ouIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IteU15XXqNeTINei15vXqdeZ15UgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPk1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4i15TXldeo15Mg15HXkNee16bXoteV16ogV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i15nXqSDXnteZ15zXldefINeW157XmdefINei15HXldeoIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiLXnNeX16Ug15vXk9eZINec16LXmdeZ158g15XXnNeU15XXqNeZ15MiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAppbmRleCAyNWIzN2E0Li41NDY0ZDYwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLjg4fjg5Xjgqnjg6vjg4giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLoqIDoqp7jgajlhaXlipsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuWFpeWKm+aWueazleOBrumBuOaKniI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i6L6e5pu45o+Q5L6b5YWDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Iui+nuabuOaPkOS+m+WFgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i6L6e5pu4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i6L6e5pu444Gu44Ki44OD44OX44OH44O844OI5oOF5aCxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLjgqLjg4njgqrjg7Povp7mm7giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+Iui+nuabuOOCkuWIqeeUqOOBp+OBjeOBvuOBmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLovp7mm7jjga7oqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLljZjoqp7jg6rjgrnjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLljZjoqp7jg6rjgrnjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLovp7mm7jjgpLliKnnlKjjgafjgY3jgb7jgZkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i44OA44Km44Oz44Ot44O844OJ44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i44Kk44Oz44K544OI44O844Or5riI44G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLjgqTjg7Pjgrnjg4jjg7zjg6vmuIjjgb/jgIHnhKHlirkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6L6e5pu444Gr5o6l57aa44Gn44GN44G+44Gb44KTIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLovp7mm7jjga/jgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLmm7TmlrAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLmnIDntYLmm7TmlrDml6UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i44Ki44OD44OX44OH44O844OI44KS56K66KqN44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuiqreOBv+i+vOOBv+S4rS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLjg6HjgqTjg7Povp7mm7giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuOCpOODs+OCueODiOODvOODqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuODgOOCpuODs+ODreODvOODieOCkuOCreODo+ODs+OCu+ODqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLnhKHlirnjgavjgZnjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLmnInlirnjgavjgZnjgosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliYrpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuOBrui+nuabuOOCkuWIqeeUqOOBp+OBjeOBvuOBmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaKvOOBmeOBqOeiuuiqjS/jg4Djgqbjg7Pjg63jg7zjg4njgafjgY3jgb7jgZkiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAzYjAyMjhhLi5jYTFjMmVhIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLquLDrs7jqsJIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLslrjslrQg67CPIO2CpOuztOuTnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i7J6F66ClIOuwqeuylSDshKDtg50iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IuyCrOyghCDsoJzqs7Xsl4XssrQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i7IKs7KCEIOygnOqzteyXheyytCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i7IKs7KCEIOyEnOu5hOyKpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IuyCrOyghCDsl4XrjbDsnbTtirgg7KCV67O0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLsgqzsoIQg7LaU6rCAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLsgqzsoIQg7IKs7JqpIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLsgqzsoIQg7ISk7KCVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i7IKs7Jqp7J6QIOyCrOyghCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IuyCrOyaqeyekCDsgqzsoIQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLsgqzsoIQg7IKs7JqpIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLtmITsnqwg64uk7Jq066Gc65OcIOykkSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuyEpOy5mOuQqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i7ISk7LmYIOyZhOujjOuQmOyXiOycvOuCmCDsgqzsmqkg7KSR7KeA65CoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IuyCrOyghCDshJzruYTsiqTsl5Ag7Jew6rKw7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i7IKs7Jqp7ZWgIOyImCDsnojripQg7IKs7KCE7J20IOyXhuyKteuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLsg4jroZzqs6DsuagiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLstZzqt7wg7JeF642w7J207Yq4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuyXheuNsOydtO2KuOulvCDtmZXsnbjtlZjripQg7KSRIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IuuhnOuTnCDspJEuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i6riw67O4IOyCrOyghCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLst6jshowiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i7ISk7LmYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i64uk7Jq066Gc65OcIOy3qOyGjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLsgqzsmqkg7KSR7KeAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i7IKs7JqpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i7IKt7KCcIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4g7IKs7KCE7J2EIOyCrOyaqe2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuqygO2GoO2VmOqzoCDri6TsmrTroZzrk5ztlZjroKTrqbQg64iE66W07IS47JqULiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCmluZGV4IDliZmZmYmMuLjQ5ZDlhZWMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Ik51bWF0eXRpZWppIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iS2FsYmEgaXIgxK92ZXN0aXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlBhc2lyaW5raXRlIMSvdmVzdGllcyBtZXRvZMSFIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiLFvW9keW5vIHRlaWvEl2phcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLFvW9keW5vIHRlaWvEl2phcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4ixb1vZHlubyBwYXNsYXVnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IsW9b2R5bm8gYXRuYXVqaW5pbW8gaW5mb3JtYWNpamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlBhcGlsZG9taSDFvm9keW5haSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4ixb1vZHluYXMgZ2FsaW1hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLFvW9keW7FsyBudXN0YXR5bWFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iTmF1ZG90b2pvIMW+b2R5bmFpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iTmF1ZG90b2pvIMW+b2R5bmFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4ixb1vZHluYXMgZ2FsaW1hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLFoGl1byBtZXR1IGF0c2lzaXVuxI1pYW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4ixK5kaWVndGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IsSuZGllZ3RhLCBuZWxlaWTFvmlhbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJpc2lqdW5naW1vIHByaWUgxb5vZHlubyBwYXNsYXVnb3MgcHJvYmxlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ik7El3JhIGdhbGltxbMgxb5vZHluxbMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBdG5hdWppbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iUGFza3V0aW7EryBrYXJ0xIUgYXRuYXVqaW50YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJJZcWha29tYSBuYXVqaW5pxbMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4ixK5rZWxpYW1hLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IlBhZ3JpbmRpbmlzIMW+b2R5bmFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkF0xaFhdWt0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLErmRpZWd0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF0xaFhdWt0aSBhdHNpc2l1bnRpbcSFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ik5lbGVpc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4ixK5nYWxpbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iScWhdHJpbnRpIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkdhbGltYXMgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiDFvm9keW5hcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlBhc3BhdXNraXRlLCBrYWQgcGVyxb5pxatyxJd0dW3El3RlIGlyIGF0c2lzacWzc3R1bcSXdGUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAppbmRleCA1ZGNhYTAxLi40ZDZmYjNjIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJOb2tsdXPEk2p1bXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJWYWxvZGEgdW4gaWV2YWRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJZXZhZGVzIG1ldG9kZXMgaXp2xJNsZSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iVsSBcmRuxKtjYXMgbm9kcm/FoWluxIF0xIFqcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJWxIFyZG7Eq2NhcyBub2Ryb8WhaW7EgXTEgWpzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJWxIFyZG7Eq2NhcyBwYWthbHBvanVtcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IlbEgXJkbsSrY2FzIGF0amF1bmluxIFqdW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iUGlldmllbm9qdW12xIFyZG7Eq2NhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iVsSBcmRuxKtjYSBpciBwaWVlamFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJWxIFyZG7Eq2N1IGllc3RhdMSranVtaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkxpZXRvdMSBamEgdsSBcmRuxKtjYXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJMaWV0b3TEgWphIHbEgXJkbsSrY2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJWxIFyZG7Eq2NhIGlyIHBpZWVqYW1hLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJOb3RpZWsgbGVqdXBpZWzEgWRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbMSTdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbMSTdGEsIGF0c3DEk2pvdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmzEk21hLCBzYXZpZW4uIGFyIHbEgXJkbi4gcGFrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iVsSBcmRuLiBuYXYgcGllZWphbWFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iQXRzdmFpZHppbsSBdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlDEk2TEk2pvIHJlaXppIGF0amF1bmluxIF0cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJOb3RpZWsgcMSBcmJhdWRlLCB2YWkgaXIgcGllZWphbWkgYXRqYXVuaW7EgWp1bWkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ik5vdGllayBpZWzEgWRlLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkdhbHZlbsSBIHbEgXJkbsSrY2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQXRjZWx0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbMSTdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF0Y2VsdCBsZWp1cGllbMSBZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iQXRzcMSTam90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iSWVzcMSTam90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iRHrEk3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTW9iaWxhasSBIGllcsSrY8STIGF0bGFzxKt0YWphaSB2YWxvZGFpIGlyIHBpZWVqYW1hIHbEgXJkbsSrY2EuJmx0O2JyLyZndDsgSWV0ZWljYW1zICZsdDtiJmd0O2xlanVwaWVsxIFkxJN0Jmx0Oy9iJmd0OyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IHbEgXJkbsSrY3UsIGxhaSB1emxhYm90dSByYWtzdMSrxaFhbmFzIGllc3DEk2phcy4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBMZWp1cGllbMSBZGUsIGl6bWFudG9qb3TCoDNHLCBhaXrFhmVtcyBkYcW+YXMgbWluxat0ZXMuIEphIG5lbGlldG9qYXQgJmx0O2ImZ3Q7bmVpZXJvYmXFvm90dSBkYXR1IHBsxIFudSZsdDsvYiZndDssIHZhciB0aWt0IHBpZW3Ek3JvdGEgbWFrc2EuJmx0O2JyLyZndDsgSmEgbmV6aW7EgXQsIGvEgWR1IGRhdHUgcGzEgW51IGxpZXRvamF0LCBhdHJvZGlldCBXaS1GaSBzYXZpZW5vanVtdSwgbGFpIGF1dG9txIF0aXNraSBzxIFrdHUgbGVqdXBpZWzEgWRpLiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFBhZG9tczogdsSBcmRuxKtjYXMgdmFyIGxlanVwaWVsxIFkxJN0IHVuIG5vxYZlbXQgbW9iaWzEgXMgaWVyxKtjZXMgaXp2xJNsbmVzICZsdDtiJmd0O0llc3RhdMSranVtaSZsdDsvYiZndDsgc2FkYcS8xIEgJmx0O2ImZ3Q7VmFsb2RhcyBpZXZhZGUmbHQ7L2ImZ3Q7LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJMZWp1cGllbMSBZMSTdCB0xatsxKt0ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz7CoE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGVqdXBpZWzEgWTEk3QsIGl6bWFudG9qb3QgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSXIgcGllZWphbWEgdsSBcmRuxKtjYSDFocSBZGFpIHZhbG9kYWk6IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJOb3NwaWVkaWV0LCBsYWkgcMSBcnNrYXTEq3R1IHVuIGxlanVwaWVsxIFkxJN0dSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmluZGV4IDQ4NjZmZWQuLjdiY2MyODYgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkxhbGFpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iQmFoYXNhICZhbXA7IGlucHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJQaWxpaCBrYWVkYWggaW5wdXQiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlBlbWJla2FsIEthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlBlbWJla2FsIEthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJQZXJraGlkbWF0YW4gS2FtdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJNYWtsdW1hdCBrZW1hcyBraW5pIGthbXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJLYW11cyB0YW1iYWhhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iS2FtdXMgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iVGV0YXBhbiB1bnR1ayBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkthbXVzIHBlbmdndW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FtdXMgcGVuZ2d1bmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJLYW11cyB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJTZWRhbmcgbWVtdWF0IHR1cnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iRGlwYXNhbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IkRpcGFzYW5nLCBkaWx1bXB1aGthbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJNYXNhbGFoIG1lbnlhbWJ1bmcga2VwYWRhIHBlcmtoaWRtYXRhbiBrYW11cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iVGlhZGEga2FtdXMgdGVyc2VkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJNdWF0IHNlbXVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkthbGkgdGVyYWtoaXIgZGlrZW1hcyBraW5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+Ik1lbnllbWFrIGtlbWFzIGtpbmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTWVtdWF0a2FuLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkthbXVzIHV0YW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkJhdGFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IlBhc2FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkJhdGFsa2FuIG11YXQgdHVydW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iTHVtcHVoa2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iRGF5YWthbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlBhZGFtIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkthbXVzIHRlcnNlZGlhIHVudHVrIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUZWthbiB1bnR1ayBtZW5ndWxhcyBkYW4gbWVtdWF0IHR1cnVuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggMzI3OTNlZi4uMmUxZDQ0ZSAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iU3RhbmRhcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJTcHLDpWsgb2cgaW5uZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iVmVsZyBpbm5kYXRhbWV0b2RlIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJPcmRsaXN0ZWxldmVyYW5kw7hyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Ik9yZGxpc3RlbGV2ZXJhbmTDuHIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ik9yZGJva3RqZW5lc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iT3BwZGF0ZXJpbmdzaW5mb3JtYXNqb24gZm9yIG9yZGxpc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJUaWxsZWdnc29yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iT3JkbGlzdGUgZXIgdGlsZ2plbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IklubnN0aWxsaW5nZXIgZm9yIG9yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkJydWtlcm9yZGxpc3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkJydWtlcm9yZGxpc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iT3JkbGlzdGUgZXIgdGlsZ2plbmdlbGlnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+Ikxhc3RlciBuZWQgbsOlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsbGVydCwgZGVha3RpdmVydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJLYW4gaWtrZSBrb2JsZSB0aWwgb3JkbGlzdGV0amVuZXN0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkZhbnQgaW5nZW4gb3JkbGlzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJMYXN0IGlubiBww6Ugbnl0dCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlNpc3Qgb3BwZGF0ZXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlNlciBldHRlciBvcHBkYXRlcmluZ2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Ikxhc3RlciBpbm4g4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkhvdmVkb3JkbGlzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQXZicnl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF2YnJ5dCBuZWRsYXN0aW5nZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iRGVha3RpdmVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iQWt0aXZlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlNsZXR0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iRGV0IHZhbGd0ZSBzcHLDpWtldCBww6UgbW9iaWxlbmVoZXRlbiBkaW4gaGFyIGVuIHRpbGdqZW5nZWxpZyBvcmRsaXN0ZS4mbHQ7YnIvJmd0OyBWaSBhbmJlZmFsZXIgw6UgJmx0O2ImZ3Q7bGFzdGUgbmVkJmx0Oy9iJmd0OyBvcmRsaXN0ZW4gZm9yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uIERldHRlIGZvcmJlZHJlciBza3JpdmVvcHBsZXZlbHNlbiBkaW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgTmVkbGFzdGluZ2VuIGthbiB0YSBmcmEgZXR0IHRpbCB0byBtaW51dHRlciB2aWEgM0cuIEJlbGFzdG5pbmdlciBrYW4gcMOlbMO4cGUgaHZpcyBkdSBpa2tlIGhhciBldCBhYm9ubmVtZW50IG1lZCAmbHQ7YiZndDt1YmVncmVuc2V0IGRhdGFicnVrJmx0Oy9iJmd0Oy4mbHQ7YnIvJmd0OyBIdmlzIGR1IGVyIHVzaWtrZXIgcMOlIGh2aWxrZW4gYWJvbm5lbWVudHN0eXBlIGR1IGhhciwgYW5iZWZhbGVyIHZpIGRlZyDDpSBmaW5uZSBlbiBXaS1GaS10aWxrb2JsaW5nIGZvciDDpSBzdGFydGUgbmVkbGFzdGluZ2VuIGF1dG9tYXRpc2suJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgVGlwczogRHUga2FuIGxhc3RlIG5lZCBvZyBmamVybmUgb3JkbGlzdGVyIHZlZCDDpSBnw6UgdGlsICZsdDtiJmd0O1NwcsOlayBvZyBpbm5kYXRhJmx0Oy9iJmd0OyBpIG1lbnllbiBmb3IgJmx0O2ImZ3Q7SW5uc3RpbGxpbmdlciZsdDsvYiZndDsgcMOlIG1vYmlsZW5oZXRlbiBkaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+Ikxhc3QgbmVkIG7DpSAoPHhsaWZmOmcgaWQ9IlNJWkVfSU5fTUVHQUJZVEVTIj4lMSQuMWY8L3hsaWZmOmc+IE1CKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI2OTYzNzcwODg1MDMzNzY1Mzc4Ij4iTGFzdCBuZWQgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVuIG9yZGxpc3RlIGVyIHRpbGdqZW5nZWxpZyBmb3IgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlRyeWtrIGZvciDDpSBzZSBnamVubm9tIG9nIGxhc3RlIG5lZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmluZGV4IDQ4MjI2MTcuLjU1YWVlNjMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlN0YW5kYWFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlRhYWwgZW4gaW52b2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJbnZvZXJtZXRob2RlIHNlbGVjdGVyZW4iPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+Ildvb3JkZW5ib2VrbGV2ZXJhbmNpZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iV29vcmRlbmJvZWtsZXZlcmFuY2llciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iV29vcmRlbmJvZWtzZXJ2aWNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYXRpZSBvdmVyIHdvb3JkZW5ib2VrdXBkYXRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJXb29yZGVuYm9la2VuIHRvZXZvZWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iV29vcmRlbmJvZWsgYmVzY2hpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iSW5zdGVsbGluZ2VuIHZvb3Igd29vcmRlbmJvZWtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkdlYnJ1aWtlcnN3b29yZGVuYm9la2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iR2VicnVpa2Vyc3dvb3JkZW5ib2VrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iV29vcmRlbmJvZWsgYmVzY2hpa2JhYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iV29yZHQgZ2Vkb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikdlw69uc3RhbGxlZXJkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJHZcOvbnN0YWxsZWVyZCwgdWl0Z2VzY2hha2VsZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJWZXJiaW5kaW5nc3Byb2JsZWVtIHdvb3JkZW5ib2Vrc2VydmljZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iR2VlbiB3b29yZGVuYm9la2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iVmVybmlldXdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IkxhYXRzdCBiaWpnZXdlcmt0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IkNvbnRyb2xlcmVuIG9wIHVwZGF0ZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTGFkZW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iQWxnZW1lZW4gd29vcmRlbmJvZWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW5udWxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+Ikluc3RhbGxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iRG93bmxvYWQgYW5udWxlcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IlVpdHNjaGFrZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+Ikluc2NoYWtlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iVmVyd2lqZGVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCIgbXNnaWQ9IjQ5NjUyNjQ4NDkwNTc2NTY1MjEiPiJFciBpcyBlZW4gd29vcmRlbmJvZWsgYmVzY2hpa2JhYXIgdm9vciBkZSBnZXNlbGVjdGVlcmRlIHRhYWwgb3AgdXcgbW9iaWVsZSBhcHBhcmFhdC4mbHQ7YnIvJmd0OyBXZSByYWRlbiB1IGFhbiBoZXQgd29vcmRlbmJvZWsgdm9vciBoZXQgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiB0ZSAmbHQ7YiZndDtkb3dubG9hZGVuJmx0Oy9iJmd0OyBvbSB1dyB0eXBldmFhcmRpZ2hlaWQgdGUgdmVyYmV0ZXJlbi4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBEZSBkb3dubG9hZCBrYW4gZWVuIG9mIHR3ZWUgbWludXRlbiBkdXJlbiB2aWEgM0cuIEVyIGt1bm5lbiBrb3N0ZW4gd29yZGVuIGJlcmVrZW5kIGFscyB1IGdlZW4gJmx0O2ImZ3Q7b25iZXBlcmt0IGdlZ2V2ZW5zYWJvbm5lbWVudCZsdDsvYiZndDsgaGVlZnQuJmx0O2JyLyZndDsgQWxzIHUgbmlldCB6ZWtlciB3ZWV0IHdlbGsgZ2VnZXZlbnNhYm9ubmVtZW50IHUgaGVlZnQsIHJhZGVuIHdlIHUgYWFuIGVlbiB3aWZpLXZlcmJpbmRpbmcgdGUgem9la2VuIG9tIGRlIGRvd25sb2FkIGF1dG9tYXRpc2NoIHRlIHN0YXJ0ZW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgVGlwOiB1IGt1bnQgd29vcmRlbmJvZWtlbiBkb3dubG9hZGVuIGVuIHZlcndpamRlcmVuIGRvb3IgbmFhciAmbHQ7YiZndDtUYWFsIGVuIGludm9lciZsdDsvYiZndDsgaW4gaGV0IG1lbnUgJmx0O2ImZ3Q7SW5zdGVsbGluZ2VuJmx0Oy9iJmd0OyB2YW4gdXcgbW9iaWVsZSBhcHBhcmFhdCB0ZSBnYWFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJOdSBkb3dubG9hZGVuICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJEb3dubG9hZGVuIHZpYSB3aWZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVyIGlzIGVlbiB3b29yZGVuYm9layBiZXNjaGlrYmFhciB2b29yIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJEcnVrIG9tIHRlIGNvbnRyb2xlcmVuIGVuIHRlIGRvd25sb2FkZW4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA3YmI4Yjc3Li42OGZlZDQwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJEb215xZtsbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKxJl6eWssIGtsYXdpYXR1cmEsIGfFgm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJXeWJpZXJ6IG1ldG9kxJkgd3Byb3dhZHphbmlhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJEb3N0YXdjYSBzxYJvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iRG9zdGF3Y2Egc8WCb3duaWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJVc8WCdWdhIHPFgm93bmlrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWFjamUgbyBha3R1YWxpemFjamkgc8WCb3duaWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJTxYJvd25pa2kgZG9kYXRrb3dlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEb3N0xJlwbnkgc8WCb3duaWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iVXN0YXdpZW5pYSBzxYJvd25pa8OzdyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IlPFgm93bmlraSB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJTxYJvd25payB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTxYJvd25payBqZXN0IGRvc3TEmXBueSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJBa3R1YWxuaWUgcG9iaWVyYW55Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iWmFpbnN0YWxvd2FueSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iWmFpbnN0YWxvd2FueSwgd3nFgsSFY3pvbnkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmxlbSB6IHBvxYLEhWN6ZW5pZW0geiB1c8WCdWfEhSBzxYJvd25pa2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IkJyYWsgc8WCb3duaWvDs3ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPZMWbd2llxbwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJPc3RhdG5pYSBha3R1YWxpemFjamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU3ByYXdkemFuaWUgZG9zdMSZcG5vxZtjaSBha3R1YWxpemFjamkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iV2N6eXR5d2FuaWUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iU8WCb3duaWsgZ8WCw7N3bnkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQW51bHVqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IlphaW5zdGFsdWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJBbnVsdWogcG9iaWVyYW5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJXecWCxIVjeiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlfFgsSFY3oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJVc3XFhCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJEbGEgasSZenlrYTogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBqZXN0IGRvc3TEmXBueSBzxYJvd25payI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+Ik5hY2nFm25paiwgYWJ5IHNwcmF3ZHppxIcgaSBwb2JyYcSHIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCBjYWE0MDE5Li4xNWZmNjViIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlByZWRlZmluaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iSWRpb21hIGUgZW50cmFkYSBkZSBzb20iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkVzY29saGVyIG8gbcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJGb3JuZWNlZG9yIGRlIERpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IkZvcm5lY2Vkb3IgZGUgRGljaW9uw6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZpw6dvIGRlIERpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYcOnw7VlcyBkZSBhdHVhbGl6YcOnw6NvIGRvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJEaWNpb27DoXJpb3Mgc3VwbGVtZW50YXJlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljaW9uw6FyaW8gZGlzcG9uw612ZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iRGVmaW5pw6fDtWVzIGRvcyBkaWNpb27DoXJpb3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiJEaWNpb27DoXJpb3MgZG8gdXRpbGl6YWRvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkRpY2lvbsOhcmlvIGRvIHV0aWxpemFkb3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJUcmFuc2ZlcsOqbmNpYSBlbSBjdXJzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iSW5zdGFsYWRvLCBkZXNhdGl2YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW1hIGFvIGxpZ2FyIGFvIHNlcnZpw6dvIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJTZW0gZGljaW9uw6FyaW9zIGRpc3BvbsOtdmVpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IkF0dWFsaXphciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IsOabHRpbWEgYXR1YWxpemHDp8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJBIHZlcmlmaWNhciBleGlzdMOqbmNpYSBkZSBhdHVhbGl6YcOnw7VlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJBIGNhcnJlZ2FyLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+IkRpY2lvbsOhcmlvIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJDYW5jZWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkNhbmNlbGFyIHRyYW5zZmVyw6puY2lhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRlc2F0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkF0aXZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkVsaW1pbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQiIG1zZ2lkPSI0OTY1MjY0ODQ5MDU3NjU2NTIxIj4iTyBpZGlvbWEgc2VsZWNpb25hZG8gbm8gc2V1IGRpc3Bvc2l0aXZvIG3Ds3ZlbCB0ZW0gdW0gZGljaW9uw6FyaW8gZGlzcG9uw612ZWwuJmx0O2JyLyZndDsgUmVjb21lbmRhbW9zIHF1ZSAmbHQ7YiZndDt0cmFuc2ZpcmEmbHQ7L2ImZ3Q7IG8gZGljaW9uw6FyaW8gPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBwYXJhIG1lbGhvcmFyIGEgc3VhIGV4cGVyacOqbmNpYSBkZSBpbnRyb2R1w6fDo28uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgQSB0cmFuc2ZlcsOqbmNpYSBwb2RlIGRlbW9yYXIgdW0gb3UgZG9pcyBtaW51dG9zIHZpYSAzRy4gUG9kZXLDo28gc2VyIGFwbGljYWRhcyB0YXhhcyBzZSBuw6NvIHRpdmVyIHVtICZsdDtiJmd0O3BsYW5vIGRlIGRhZG9zIGlsaW1pdGFkbyZsdDsvYiZndDsuJmx0O2JyLyZndDsgU2UgbsOjbyB0aXZlciBhIGNlcnRlemEgZG8gcGxhbm8gZGUgZGFkb3MgcXVlIHRlbSwgcmVjb21lbmRhbW9zIHF1ZSBsb2NhbGl6ZSB1bWEgbGlnYcOnw6NvIFdpLUZpIHBhcmEgY29tZcOnYXIgYSB0cmFuc2ZlcsOqbmNpYSBhdXRvbWF0aWNhbWVudGUuJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgU3VnZXN0w6NvOiBwb2RlIHRyYW5zZmVyaXIgZSByZW1vdmVyIGRpY2lvbsOhcmlvcyBhY2VkZW5kbyBhICZsdDtiJmd0O0lkaW9tYSBlIGludHJvZHXDp8OjbyZsdDsvYiZndDsgbm8gbWVudSAmbHQ7YiZndDtEZWZpbmnDp8O1ZXMmbHQ7L2ImZ3Q7IGRvIHNldSBkaXNwb3NpdGl2byBtw7N2ZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNDAyNDAxMzc2NDkzNzg1MDA2MSI+IlRyYW5zZmVyaXIgYWdvcmEgKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlRyYW5zZmVyaXIgdmlhIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IkVzdMOhIGRpc3BvbsOtdmVsIHVtIGRpY2lvbsOhcmlvIHBhcmEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByaW1hIHBhcmEgY29uc3VsdGFyIGUgdHJhbnNmZXJpciI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IGVkOGNkZWMuLjMxMzQxMTUgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlBhZHLDo28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJJZGlvbWEgZSBlbnRyYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJTZWxlY2lvbmUgbyBtw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIiBtc2dpZD0iMTAxNzA1ODE4NjMyMjcxNDQwNSI+IlByb3ZlZG9yIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlByb3ZlZG9yIGRlIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTZXJ2acOnbyBkZSBkaWNpb27DoXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IkluZm9ybWHDp8O1ZXMgZGUgYXR1YWxpemHDp8OjbyBkbyBkaWNpb27DoXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRGljaW9uw6FyaW9zIGNvbXBsZW1lbnRhcmVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDb25maWd1cmHDp8O1ZXMgZG9zIGRpY2lvbsOhcmlvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGljaW9uw6FyaW8gZG8gdXN1w6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJEaWNpb27DoXJpbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJEb3dubG9hZCBlbSBhbmRhbWVudG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbnN0YWxhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGFkbywgZGVzYXRpdmFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9iLiBkZSBjb25leMOjbyBjLyBkaWMuIGRlIHNlcnYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJOZW5odW0gZGljaW9uw6FyaW8gZGlzcG9uw612ZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBdHVhbGl6YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLDmmx0aW1hIGF0dWFsaXphw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iVmVyaWZpY2FuZG8gYXR1YWxpemHDp8O1ZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iQ2FycmVnYW5kby4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWNpb27DoXJpbyBwcmluY2lwYWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJDYW5jZWxhciBkb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJEZXNhdGl2YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJQZXJtaXRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkV4Y2x1aXIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSMOhIHVtIGRpY2lvbsOhcmlvIGRpc3BvbsOtdmVsIHBhcmEgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlByZXNzaW9uZSBwYXJhIGNvbnN1bHRhciBlIGZhemVyIG8gZG93bmxvYWQiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAppbmRleCA1ZmJjYmU1Li5kNGMzOWFmNSAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iUHJlc3RhYmlsaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMaW1ixIMgyJlpIGludHJvZHVjZXJlIGRlIHRleHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkFsZWdlyJtpIG1ldG9kYSBkZSBpbnRyb2R1Y2VyZSBkZSB0ZXh0Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJGdXJuaXpvcnVsIGRpY8WjaW9uYXJ1bHVpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IkZ1cm5pem9ydWwgZGljxaNpb25hcnVsdWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcnZpY2l1bCBEaWPFo2lvbmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW5mb3JtYcWjaWkgcHJpdmluZCBhY3R1YWxpemFyZWEgZGljxaNpb25hcnVsdWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRpY8WjaW9uYXJlIHN1cGxpbWVudGFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRGljxaNpb25hciBkaXNwb25pYmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+IlNldMSDcmkgcGVudHJ1IGRpY8WjaW9uYXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iRGljxaNpb25hcmVsZSB1dGlsaXphdG9ydWx1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IkRpY8WjaW9uYXJ1bCB1dGlsaXphdG9ydWx1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkRpY8WjaW9uYXIgZGlzcG9uaWJpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJTZSBkZXNjYXJjxIMgYWN1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikluc3RhbGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJJbnN0YWxhdCwgZGV6YWN0aXZhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJOdSBzZSBjb25lY3QuIGRpY8WjLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4iTmljaXVuIGRpY8WjaW9uYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJBY3R1YWxpemHFo2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiJEYXRhIHVsdGltZWkgbW9kaWZpY8SDcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU2UgdmVyaWZpY8SDIGV4aXN0ZW7Fo2EgYWN0dWFsaXrEg3JpbG9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IlNlIMOubmNhcmPEgy4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJEaWPFo2lvbmFyIHByaW5jaXBhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJBbnVsYcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbnN0YWxhxaNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iQW51bGHFo2kgZGVzY8SDcmNhcmVhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRlemFjdGl2YcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFjdGl2YcWjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IsWedGVyZ2XFo2kiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRXN0ZSBkaXNwb25pYmlsIHVuIGRpY8WjaW9uYXIgcGVudHJ1IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJBcMSDc2HFo2kgcGVudHJ1IGEgZXhhbWluYSDFn2kgcGVudHJ1IGEgZGVzY8SDcmNhIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggYzIxYmJmOS4uNjgxYzc2ZCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4i0J/QviDRg9C80L7Qu9GH0LDQvdC40Y4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQr9C30YvQuiDQuCDQstCy0L7QtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i0JLRi9Cx0LXRgNC40YLQtSDRgdC/0L7RgdC+0LEg0LLQstC+0LTQsCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QvtGB0YLQsNCy0YnQuNC6INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i0J/QvtGB0YLQsNCy0YnQuNC6INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+ItCh0LvRg9C20LHQsCDRgdC70L7QstCw0YDQtdC5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i0J7QsdC90L7QstC70LXQvdC40Y8g0YHQu9C+0LLQsNGA0Y8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0YHQu9C+0LLQsNGA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCh0LvQvtCy0LDRgNGMINC00L7RgdGC0YPQv9C10L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNGB0YLRgNC+0LnQutC4INGB0LvQvtCy0LDRgNC10LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQn9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQtSDRgdC70L7QstCw0YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+ItCf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQuNC5INGB0LvQvtCy0LDRgNGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KHQu9C+0LLQsNGA0Ywg0LTQvtGB0YLRg9C/0LXQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i0KPRgdGC0LDQvdC+0LLQu9C10L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCj0YHRgtCw0L3QvtCy0LvQtdC9LCDQvtGC0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+ItCe0YjQuNCx0LrQsCDQv9C+0LTQutC70Y7Rh9C10L3QuNGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLQodC70L7QstCw0YDQuCDQvdC10LTQvtGB0YLRg9C/0L3RiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0LHQvdC+0LLQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLQn9C+0YHQu9C10LTQvdC10LUg0L7QsdC90L7QstC70LXQvdC40LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i0J/RgNC+0LLQtdGA0LrQsCDQvtCx0L3QvtCy0LvQtdC90LjQuS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWFpbl9kaWN0X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMTY3OTk2NDMwNjk4MDA5ODU3MCI+ItCe0YHQvdC+0LLQvdC+0Lkg0YHQu9C+0LLQsNGA0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i0J7RgtC80LXQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+ItCj0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4i0J7RgtC80LXQvdC40YLRjCDQt9Cw0LPRgNGD0LfQutGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+ItCe0YLQutC70Y7Rh9C40YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+ItCS0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQo9C00LDQu9C40YLRjCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQlNC+0YHRgtGD0L/QtdC9INGB0LvQvtCy0LDRgNGMOiA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0L/RgNC+0YHQvNC+0YLRgNC10YLRjCDQuCDQt9Cw0LPRgNGD0LfQuNGC0YwiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAppbmRleCBhYWQyMzZlLi41ZDA4MjA4IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJQcmVkdm9sZW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IkphenlrICZhbXA7IHZzdHVwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJadm9sacWlIG1ldMOzZHUgdnN0dXB1Ijwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJQb3NreXRvdmF0ZcS+IHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJQb3NreXRvdmF0ZcS+IHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4iU2x1xb5iYSBzbG92bsOta2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJJbmZvcm3DoWNpZSBha3R1YWxpesOhY2llIHNsb3Zuw61rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iRG9wbG5rb3bDqSBzbG92bsOta3kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IksgZGlzcG96w61jaWkgamUgc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iTmFzdGF2ZW5pYSBwcmUgc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iUG91xb7DrXZhdGXEvnNrw6kgc2xvdm7DrWt5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iUG91xb7DrXZhdGXEvnNrw70gc2xvdm7DrWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJLIGRpc3BvesOtY2lpIGplIHNsb3Zuw61rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkFrdHXDoWxuZSBwcmViZXJhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iTmFpbsWhdGFsb3ZhbsO9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWluxaF0YWxvdmFuw70sIHpha8OhemFuw70iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iUHJvYmzDqW0gcyBwcmlwb2plbsOtbSBrIHNsdcW+YmUgc2xvdm7DrWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJTbG92bsOta3kgbmVkb3N0dXBuw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPYm5vdmnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+IlBvc2xlZG7DoSBha3R1YWxpesOhY2lhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlByZWJpZWhhIGtvbnRyb2xhIGFrdHVhbGl6w6FjacOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+IlByZWJpZWhhIG5hxI3DrXRhdmFuaWUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSGxhdm7DvSBzbG92bsOtayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJacnXFoWnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJJbsWhdGFsb3ZhxaUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJacnXFoWnFpSBwcmViZXJhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+Ilpha8OhemHFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlBvdm9sacWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iT2RzdHLDoW5pxaUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSyBkaXNwb3rDrWNpaSBqZSBzbG92bsOtayBwcmUgamF6eWsgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IlN0bGHEjWVuw61tIHNrb250cm9sdWpldGUgYSBwcmV2ZXptZXRlIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKaW5kZXggZjBkMjM5Zi4uOTdlNTUxOCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iUHJpdnpldG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJKZXppayBpbiB2bm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJJemJpcmEgbmHEjWluYSB2bm9zYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iU2xvdmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IlN0b3JpdGV2IHNsb3ZhcmphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTbG92YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJQb2RhdGtpIG8gcG9zb2RvYml0dmkgc2xvdmFyamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkRvZGF0bmkgc2xvdmFyamkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IlNsb3ZhciBqZSBuYSB2b2xqbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJOYXN0YXZpdHZlIHphIHNsb3ZhcmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVXBvcmFibmnFoWtpIHNsb3ZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+IlVwb3JhYm5pxaFraSBzbG92YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiJTbG92YXIgamUgbmEgdm9sam8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iVHJlbnV0bm8gc2UgcHJlbmHFoWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJOYW1lxaHEjWVubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4iTmFtZcWhxI1lbiwgb25lbW9nb8SNZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iVGXFvmF2YSBzIHBvdmV6YXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJOaSBzbG92YXJqZXYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJPc3Zlxb5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iTmF6YWRuamUgcG9zb2RvYmxqZW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IlByZXZlcmphbmplLCBhbGkgc28gbmEgdm9sam8gcG9zb2RvYml0dmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmFsYWdhbmplIC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJHbGF2bmkgc2xvdmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IlByZWtsacSNaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJOYW1lc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iUHJla2xpxI1pIHByZW5vcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJPbmVtb2dvxI1pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iT21vZ2/EjWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJJemJyacWhaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IlphIGl6YnJhbiBqZXppayB2IG1vYi4gbmFwcmF2aSBqZSBuYSB2b2xqbyBzbG92YXIuJmx0O2JyLyZndDsgWmEgaXpib2xqxaFhbm8gaXprdcWhbmpvIHRpcGthbmphIHByaXBvcm/EjWFtbywgZGEgJmx0O2ImZ3Q7cHJlbmVzZXRlJmx0Oy9iJmd0OyBzbG92YXIgemEgdGEgamV6aWs6IDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgUHJlbm9zIHByZWsgcG92ZXphdmUgVU1UUyBsYWhrbyB0cmFqYSBtaW51dG8gYWxpIGR2ZS4gxIxlIG5pbWF0ZSAmbHQ7YiZndDtuZW9tZWplbi4gcHJlbm9zYSBwb2RhdGtvdiZsdDsvYiZndDsuJmx0O2JyLyZndDssIGdhIGJvc3RlIG1vcmRhIG1vcmFsaSBwbGHEjWF0aS4gxIxlIG5lIHZlc3RlLCBrYXRlcmkgcG9kLiBwYWtldCBpbWF0ZSwgcG9pxaHEjWl0ZSBvbXJlxb5qZSBXaS1GaSwgZGEgcHJlbm9zIHphxI1uZXRlIHNhbW9kZWpuby4mbHQ7YnIvJmd0OyAmbHQ7YnIvJmd0OyBOYXN2ZXQ6IFNsb3ZhcmplIGxhaGtvIHByZW5lc2V0ZSBpbiBvZHN0cmFuaXRlIHRha28sIGRhIHYgbWVuaWp1ICZsdDtiJmd0O05hc3Rhdml0dmUmbHQ7L2ImZ3Q7IHYgbmFwcmF2aSBvZHByZXRlICZsdDtiJmd0O0plemlrIGluIHZub3MmbHQ7L2ImZ3Q7LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjQwMjQwMTM3NjQ5Mzc4NTAwNjEiPiJQcmVuZXNpIHpkYWogKDx4bGlmZjpnIGlkPSJTSVpFX0lOX01FR0FCWVRFUyI+JTEkLjFmPC94bGlmZjpnPiBNQikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkIiBtc2dpZD0iNjk2Mzc3MDg4NTAzMzc2NTM3OCI+IlByZW5vcyBwcmVrIHBvdmV6YXZlIFdpLUZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IlNsb3ZhciBqZSBuYSB2b2xqbyB6YSBqZXppayA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iUHJpdGlzbml0ZSB6YSBwcmVnbGVkIGluIHByZW5vcyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmluZGV4IDExZmYwOWEuLjliMzAyMjMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+ItCf0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4i0IjQtdC30LjQuiDQuCDRg9C90L7RgSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4i0JjQt9Cx0L7RgCDQvNC10YLQvtC00LAg0YPQvdC+0YHQsCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0JTQvtCx0LDQstGZ0LDRhyDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiLQlNC+0LHQsNCy0ZnQsNGHINGA0LXRh9C90LjQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiLQo9GB0LvRg9Cz0LAg0YDQtdGH0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLQmNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INCw0LbRg9GA0LjRgNCw0ZrRgyDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4i0J/QvtC80L7Rm9C90Lgg0YDQtdGH0L3QuNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+ItCg0LXRh9C90LjQuiDRmNC1INC00L7RgdGC0YPQv9Cw0L0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J/QvtC00LXRiNCw0LLQsNGa0LAg0LfQsCDRgNC10YfQvdC40LrQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+ItCa0L7RgNC40YHQvdC40YfQutC4INGA0LXRh9C90LjRhtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i0JrQvtGA0LjRgdC90LjRh9C60Lgg0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KDQtdGH0L3QuNC6INGY0LUg0LTQvtGB0YLRg9C/0LDQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiLQotGA0LXQvdGD0YLQvdC+INGB0LUg0L/RgNC10YPQt9C40LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCY0L3RgdGC0LDQu9C40YDQsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCY0L3RgdGC0LDQu9C40YDQsNC9LCDQvtC90LXQvNC+0LPRg9Gb0LXQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiLQndC10LzQsCDRg9GB0LvRg9Cz0LUg0YDQtdGH0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+ItCd0LXQvNCwINC00L7RgdGC0YPQv9C90LjRhSDRgNC10YfQvdC40LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0YHQstC10LbQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+ItCf0L7RgdC70LXQtNGa0LUg0LDQttGD0YDQuNGA0LDRmtC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCi0YDQsNC20LXRmtC1INCw0LbRg9GA0LjRgNCw0ZrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQo9GH0LjRgtCw0LLQsNGa0LUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0JPQu9Cw0LLQvdC4INGA0LXRh9C90LjQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLQntGC0LrQsNC20LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0JjQvdGB0YLQsNC70LjRgNCw0ZgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLQntGC0LrQsNC20Lgg0L/RgNC10YPQt9C40LzQsNGa0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i0J7QvdC10LzQvtCz0YPRm9C4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i0J7QvNC+0LPRg9Gb0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQmNC30LHRgNC40YjQuCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiLQoNC10YfQvdC40Log0ZjQtSDQtNC+0YHRgtGD0L/QsNC9INC30LAgPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+ItCf0YDQuNGC0LjRgdC90LjRgtC1INC30LAg0L/RgNC10LPQu9C10LQg0Lgg0L/RgNC10YPQt9C40LzQsNGa0LUiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCBiZTI3OGZhLi4yNGVhNDI4IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM2IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiJTdGFuZGFyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+IlNwcsOlayAmYW1wOyBpbm1hdG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlbDpGxqIGlubWF0bmluZ3NtZXRvZCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iRGljdGlvbmFyeSBQcm92aWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJEaWN0aW9uYXJ5IFByb3ZpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJPcmRib2tzdGrDpG5zdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzI3NDg2MTUxNDY5NTAzMjk1NCI+IlVwcGRhdGVyaW5nc2luZm9ybWF0aW9uIGbDtnIgb3JkbGlzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlRpbGzDpGdnc29yZGxpc3RvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iRW4gb3JkbGlzdGEgw6RyIHRpbGxnw6RuZ2xpZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJJbnN0w6RsbG5pbmdhciBmw7ZyIG9yZGxpc3RvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+IkVnbmEgb3JkbGlzdG9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRWdlbiBvcmRsaXN0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkVuIG9yZGxpc3RhIMOkciB0aWxsZ8OkbmdsaWciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iSMOkbXRhcyBmw7ZyIG7DpHJ2YXJhbmRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iSW5zdGFsbGVyYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+Ikluc3RhbGxlcmFkLCBpbmFrdGl2ZXJhZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJQcm9ibGVtIG1lZCBhdHQgYW5zbHV0YSB0aWxsIG9yZGxpc3RldGrDpG5zdGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJEZXQgZmlubnMgaW5nYSBvcmRiw7Zja2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iVXBwZGF0ZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iU2VuYXN0IHVwcGRhdGVyYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iU8O2a2VyIGVmdGVyIHVwcGRhdGVyaW5nYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTMOkc2VyIGluIC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJIdXZ1ZG9yZGxpc3RhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJBdmJyeXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iSW5zdGFsbGVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkF2YnJ5dCBow6RtdG5pbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iSW5ha3RpdmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkFrdGl2ZXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iVGEgYm9ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0IiBtc2dpZD0iNDk2NTI2NDg0OTA1NzY1NjUyMSI+IkRldCBmaW5ucyBlbiBvcmRsaXN0YSBmw7ZyIHNwcsOla2V0IGR1IGhhciB2YWx0IGkgZW5oZXRlbi4mbHQ7YnIvJmd0OyBWaSByZWtvbW1lbmRlcmFyIGF0dCBkdSAmbHQ7YiZndDtow6RtdGFyJmx0Oy9iJmd0OyBkZW4gPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiBvcmRsaXN0YW4uJmx0O2JyLyZndDsgJmx0O2JyLyZndDsgRGV0IGthbiB0YSBuw6Vnb24gbWludXQgYXR0IGjDpG10YSBkZW4gw7Z2ZXIgM0cuIEF2Z2lmdGVyIGthbiB0aWxsa29tbWEgb20gZHUgaW50ZSBoYXIgZXR0IGFib25uZW1hbmcgbWVkICZsdDtiJmd0O29iZWdyw6Ruc2FkIGRhdGF0cmFmaWsmbHQ7L2ImZ3Q7LiZsdDtici8mZ3Q7IE9tIGR1IMOkciBvc8Oka2VyIHDDpSBkaXR0IGFib25uZW1hbmcgcmVrb21tZW5kZXJhciB2aSBhdHQgZHUgYW5zbHV0ZXIgdGlsbCBldHQgV2ktRmktbsOkdHZlcmsgb2NoIGjDpG10YXIgb3JkbGlzdGFuIGF1dG9tYXRpc2t0LiZsdDtici8mZ3Q7ICZsdDtici8mZ3Q7IFRpcHMhIER1IGthbiBow6RtdGEgb2NoIHRhIGJvcnQgb3JkbGlzdG9yIHVuZGVyICZsdDtiJmd0O1NwcsOlayBvY2ggaW5tYXRuaW5nJmx0Oy9iJmd0OyBpIG1lbnluICZsdDtiJmd0O0luc3TDpGxsbmluZ2FyJmx0Oy9iJmd0OyBww6UgZW5oZXRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9vdmVyX21ldGVyZWQiIG1zZ2lkPSI0MDI0MDEzNzY0OTM3ODUwMDYxIj4iSMOkbXRhIG51ICg8eGxpZmY6ZyBpZD0iU0laRV9JTl9NRUdBQllURVMiPiUxJC4xZjwveGxpZmY6Zz4gTUIpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCIgbXNnaWQ9IjY5NjM3NzA4ODUwMzM3NjUzNzgiPiJIw6RtdGEgw7Z2ZXIgV2ktRmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iRW4gb3JkbGlzdGEgw6RyIHRpbGxnw6RuZ2xpZyBmw7ZyIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJUcnljayBvbSBkdSB2aWxsIGdyYW5za2Egb2NoIGjDpG10YSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmluZGV4IDFmYzkyZmIuLmE5NzQ3NTMgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IkNoYWd1by1tc2luZ2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJMdWdoYSBuYSB1aW5naXphamkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IkNoYWd1YSBtYmludSB5YSBrdWluZ2l6YSBkYXRhIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJNdG9hamkgS2FtdXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+Ik10b2FqaSBLYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+Ikh1ZHVtYSB5YSBLYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJNYWVsZXpvIHlhIGt1c2FzaXNoYSBrYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+Ik55b25nZXphIHphIGthbXVzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iS2FtdXNpIGluYXBhdGlrYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ik1pcGFuZ2lsaW8geWEga2FtdXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iS2FtdXNpIHlhIG10dW1pYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iS2FtdXNpIHlhIG10dW1pYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iS2FtdXNpIGluYXBhdGlrYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IkluYXBha3VhIHNhc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxlZCIgbXNnaWQ9IjY0MjU1ODY4OTk2NzEzNzgxNjAiPiJJbWVzYWtpbmlzaHdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJrdXNha2luaXNoYSwgaW1lbGVtYXp3YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSIgbXNnaWQ9IjY4NzU2NjU0OTQ3MjYzMDA0MjciPiJUYXRpem8ga3V1bmdhbmlzaGEga3dhIGh1ZHVtYSB5YSBrYW11c2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Ikhha3VuYSBrYW11c2kgaW5hcGF0aWthbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJaaW11YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIiBtc2dpZD0iMzEwMTU0OTcxOTgyNzYwMDM0NiI+Ik1hcmEgeWEgbXdpc2hvIGt1c2FzaXNod2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4iSW5hdGFmdXRhIHZpc2FzaXNoaS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiJJbmFwYWtpYS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJLYW11c2kga3V1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IkthdGlzaGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4iU2FraW5pc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iR2hhaXJpIGt1cGFrdWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4iTGVtYXphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iV2V6ZXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IkZ1dGEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iS2FtdXNpIGluYXBhdGlrYW5hIHlhIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJCb255ZXphIGlsaSBrdWthZ3VhIG5hIGt1cGFrdWEiPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAppbmRleCA4NGM0YTAzLi4yY2Y5MTMwIDEwMDY0NAotLS0gYS9qYXZhL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLguKDguLLguKnguLLguYHguKXguLDguIHguLLguKPguJvguYnguK3guJnguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IuC5gOC4peC4t+C4reC4geC4p+C4tOC4mOC4teC4geC4suC4o+C4m+C5ieC4reC4meC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i4Lic4Li54LmJ4LmD4Lir4LmJ4Lia4Lij4Li04LiB4Liy4Lij4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuC4nOC4ueC5ieC5g+C4q+C5ieC4muC4o+C4tOC4geC4suC4o+C4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i4Lia4Lij4Li04LiB4Liy4Lij4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i4LiC4LmJ4Lit4Lih4Li54Lil4Lit4Lix4Lib4LmA4LiU4LiV4Liq4Liz4Lir4Lij4Lix4Lia4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLguJ7guIjguJnguLLguJnguLjguIHguKPguKEgQWRkLU9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLguKHguLXguJ7guIjguJnguLLguJnguLjguIHguKPguKHguYPguKvguYnguYPguIrguYnguIfguLLguJkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Liq4Liz4Lir4Lij4Lix4Lia4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lic4Li54LmJ4LmD4LiK4LmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lic4Li54LmJ4LmD4LiK4LmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i4Lih4Li14Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4LmD4Lir4LmJ4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IuC4geC4s+C4peC4seC4h+C4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lOC4reC4ouC4ueC5iCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IuC4leC4tOC4lOC4leC4seC5ieC4h+C5geC4peC5ieC4pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZGlzYWJsZWQiIG1zZ2lkPSIzNDQ4NTcxMjgwNDkwNzQ2MDMyIj4i4LiV4Li04LiU4LiV4Lix4LmJ4LiH4LmB4Lil4LmJ4Lin4LmB4LiV4LmI4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IuC4nuC4muC4m+C4seC4jeC4q+C4suC4guC4k+C4sOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i4LmE4Lih4LmI4Lih4Li14Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4LihIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4i4Lij4Li14LmA4Lif4Lij4LiKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i4Lib4Lij4Lix4Lia4Lib4Lij4Li44LiH4Lil4LmI4Liy4Liq4Li44LiU4LmA4Lih4Li34LmI4LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+IuC4geC4s+C4peC4seC4h+C4leC4o+C4p+C4iOC4quC4reC4muC4geC4suC4o+C4reC4seC4m+C5gOC4lOC4lS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLguIHguLPguKXguLHguIfguYLguKvguKXguJQuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4Lir4Lil4Lix4LiBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IuC4ouC4geC5gOC4peC4tOC4gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiLguJXguLTguJTguJXguLHguYnguIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguJTguLLguKfguJnguYzguYLguKvguKXguJQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2RpY3QiIG1zZ2lkPSI3Njg1ODEwMDQwMjM2NDk3NzAwIj4i4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4i4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4i4Lil4LiaIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+IuC4oeC4teC4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oeC5g+C4q+C5ieC5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4oOC4suC4qeC4siA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4i4LiB4LiU4LmA4Lie4Li34LmI4Lit4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LmB4Lil4Liw4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiUIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKaW5kZXggZTJhNTlhNC4uYWQ1NzE0ZCAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iRGVmYXVsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ildpa2EgYXQgaW5wdXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IlB1bWlsaSBuZyBwYW1hbWFyYWFuIG5nIHBhZy1pbnB1dCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iUHJvdmlkZXIgbmcgRGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iUHJvdmlkZXIgbmcgRGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+IlNlcmJpc3lvIG5nIERpa3N5dW5hcnlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iSW1wb3JtYXN5b24gbmcgcGFnLXVwZGF0ZSBzYSBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3NfdGl0bGUiIG1zZ2lkPSI3MjQzOTMwOTY3ODQ1MDIwNDA3Ij4iTWdhIGRpa3N5dW5hcnlvIG5hIGFkZC1vbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iQXZhaWxhYmxlIGFuZyBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJNZ2Egc2V0dGluZyBwYXJhIHNhIG1nYSBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ik1nYSBkaWtzeXVuYXJ5byBuZyB1c2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iRGlrc3l1bmFyeW8gbmcgdXNlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IkF2YWlsYWJsZSBhbmcgZGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4iS2FzYWx1a3V5YW5nIG5hZ2RhLWRvd25sb2FkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iTmFrYS1pbnN0YWxsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJOYWthLWluc3RhbGwsIGhpbmRpIHBpbmFnYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2Fubm90X2Nvbm5lY3RfdG9fZGljdF9zZXJ2aWNlIiBtc2dpZD0iNjg3NTY2NTQ5NDcyNjMwMDQyNyI+IlByb2JsZW1hIHNhIHBhZ2tvbmVrdGEgc2Egc2VyYmlzeW8gbmcgZGlrc3l1bmFyeW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+IldhbGFuZyBhdmFpbGFibGUgbmEgbWdhIGRpa3N5dW5hcnlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iSS1yZWZyZXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iSHVsaW5nIG5hLXVwZGF0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJUdW1pdGluZ2luIG5nIG1nYSB1cGRhdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iTmFnbG8tbG9hZC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJQYW5ndW5haGluZyBkaWtzeXVuYXJ5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiJLYW5zZWxhaGluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkktaW5zdGFsbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IkthbnNlbGFoaW4gYW5nIHBhZy1kb3dubG9hZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJIdXdhZyBwYWdhbmFoaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiJQYWdhbmFoaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiJUYW5nZ2FsaW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iQXZhaWxhYmxlIGFuZyBpc2FuZyBkaWtzeXVuYXJ5byBwYXJhIHNhIDx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJQaW5kdXRpbiB1cGFuZyBzdXJpaW4gYXQgaS1kb3dubG9hZCI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IGM3OGQ1NmIuLjdlMTIyYWQgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+IlZhcnNhecSxbGFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGFuZ3VhZ2Vfc2V0dGluZ3MiIG1zZ2lkPSIxNjcxMTUzMDUzMjAxODA5MDMxIj4iRGlsIHZlIGdpcmnFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdF9pbnB1dF9tZXRob2QiIG1zZ2lkPSI0MzAxNjAyMzc0NjA5Mjc1MDAzIj4iR2lyacWfIHnDtm50ZW1pbmkgc2XDp2luIjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSIgbXNnaWQ9IjEwMTcwNTgxODYzMjI3MTQ0MDUiPiJTw7Z6bMO8ayBTYcSfbGF5xLFjxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4iU8O2emzDvGsgU2HEn2xhecSxY8SxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJTw7Z6bMO8ayBIaXptZXRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4iU8O2emzDvGsgZ8O8bmNlbGxlbWUgYmlsZ2lsZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiJFa2xpIHPDtnpsw7xrbGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiJLdWxsYW7EsWxhYmlsZWNlayBzw7Z6bMO8ayB2YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4iU8O2emzDvGtsZXIgacOnaW4gYXlhcmxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIiBtc2dpZD0iNzUxOTczNjIzMjQyMzkyOTEyNCI+Ikt1bGxhbsSxY8SxIHPDtnpsw7xrbGVyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfdXNlcl9kaWN0X3ByZWZfbmFtZSIgbXNnaWQ9IjUyMjEyNTE1Mjc1NzYwNzc5MCI+Ikt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iU8O2emzDvGsga3VsbGFuxLFsYWJpbGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+IsWedSBhbmRhIGluZGlyaWxpeW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4iWcO8a2xlbmRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJZw7xrbGVuZGksIGRldnJlIGTEscWfxLEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iU8O2emzDvGsgaGl6bWV0aW5lIGJhxJ9sYW50xLEgeW9rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJLdWxsYW7EsWxhYmlsaXIgc8O2emzDvGsgeW9rIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2hlY2tfZm9yX3VwZGF0ZXNfbm93IiBtc2dpZD0iNjQyMDU3OTg2MTI3NjI0OTg2Ij4iWWVuaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iU29uIGfDvG5jZWxsZW1lIHRhcmloaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJHw7xuY2VsbGVtZWxlciBkZW5ldGxlbml5b3IuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iQW5hIHPDtnpsw7xrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IsSwcHRhbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxfZGljdCIgbXNnaWQ9IjU1MjUwMDU1MjQ2OTc2MDc4NjUiPiJZw7xrbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLEsG5kaXJtZXlpIGlwdGFsIGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IkRldnJlIGTEscWfxLEgYsSxcmFrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW5hYmxlX2RpY3QiIG1zZ2lkPSIzODQ4MTc5Nzg0NzAyNDczNjgwIj4iRXRraW5sZcWfdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iU2lsIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+Ijx4bGlmZjpnIGlkPSJMQU5HVUFHRSI+JTEkczwveGxpZmY6Zz4gacOnaW4ga3VsbGFuxLFsYWJpbGVjZWsgYmlyIHPDtnpsw7xrIHZhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IsSwbmNlbGVtZWsgdmUgaW5kaXJtZWsgacOnaW4gdMSxa2xhecSxbiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCmluZGV4IGExN2YwZDEuLjYwOWM4MGIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+ItCX0LAg0YPQvNC+0LLRh9Cw0L3QvdGP0LwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLQnNC+0LLQsCDRgtCwINCy0LLQtdC00LXQvdC90Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+ItCS0LjQsdGA0LDRgtC4INC80LXRgtC+0LQg0LLQstC10LTQtdC90L3RjyI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i0J/QvtGB0YLQsNGH0LDQu9GM0L3QuNC6INGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiIG1zZ2lkPSI3NzEwNDE1NTk5MzcxMTYxMDkyIj4i0J/QvtGB0YLQsNGH0LDQu9GM0L3QuNC6INGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSIgbXNnaWQ9IjU1MTY1MDY5NzM0ODIwMjA1NiI+ItCf0L7RgdC70YPQs9CwINGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiLQhtC90YTQvtGA0LzQsNGG0ZbRjyDQv9GA0L4g0L7QvdC+0LLQu9C10L3QvdGPINGB0LvQvtCy0L3QuNC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+ItCU0L7QtNCw0YLQutC+0LLRliDRgdC70L7QstC90LjQutC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsX292ZXJfbWV0ZXJlZF9uZXR3b3JrX3Byb21wdCIgbXNnaWQ9IjM2NDI2MzQ2MjM0NjUzNDk3MTYiPiLQodC70L7QstC90LjQuiDQtNC+0YHRgtGD0L/QvdC40LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiIG1zZ2lkPSI4NTk5Njc5NDM0Nzk5NzQ5MDUzIj4i0J3QsNC70LDRiNGC0YPQstCw0L3QvdGPINC00LvRjyDRgdC70L7QstC90LjQutGW0LIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLQodC70L7QstC90LjQutC4INC60L7RgNC40YHRgtGD0LLQsNGH0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLQodC70L7QstC90LjQuiDQutC+0YDQuNGB0YLRg9Cy0LDRh9CwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4i0KHQu9C+0LLQvdC40Log0LTQvtGB0YLRg9C/0L3QuNC5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kb3dubG9hZGluZyIgbXNnaWQ9Ijg1OTQ5NzQ3NjI2NjMwOTU5NiI+ItCX0LDRgNCw0Lcg0LfQsNCy0LDQvdGC0LDQttGD0ZTRgtGM0YHRjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+ItCj0YHRgtCw0L3QvtCy0LvQtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+ItCj0YHRgtCw0L3QvtCy0LvQtdC90L4sINCy0LjQvNC60L3QtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i0J3QtdC80LAg0LfigJnRlNC00L3QsNC90L3RjyDQt9GWINGB0LvQvtCy0L3QuNC60L7QvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUiIG1zZ2lkPSI1MjA2MjI1MDc3OTQ1NjM3ODEwIj4i0KHQu9C+0LLQvdC40LrQuCDQvdC10LTQvtGB0YLRg9C/0L3RliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+ItCe0L3QvtCy0LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4i0J7RgdGC0LDQvdC90ZQg0L7QvdC+0LLQu9C10L3QvdGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV91cGRhdGluZyIgbXNnaWQ9IjgyMDE4NjI3NjcwNDEzNDcyMCI+ItCf0LXRgNC10LLRltGA0LrQsCDQvdCw0Y/QstC90L7RgdGC0ZYg0L7QvdC+0LLQu9C10L3RjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4i0J7RgdC90L7QstC90LjQuSDRgdC70L7QstC90LjQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbCIgbXNnaWQ9IjU1ODY1MzE3MzY2MDkxODMzMDQiPiLQodC60LDRgdGD0LLQsNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiIG1zZ2lkPSI1NTI1MDA1NTI0Njk3NjA3ODY1Ij4i0KPRgdGC0LDQvdC+0LLQuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiLQodC60LDRgdGD0LLQsNGC0Lgg0LfQsNCy0LDQvdGC0LDQttC10L3QvdGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+ItCS0LjQvNC60L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLQo9Cy0ZbQvNC60L3Rg9GC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLQktC40LTQsNC70LjRgtC4Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0ICg0OTY1MjY0ODQ5MDU3NjU2NTIxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvd25sb2FkX292ZXJfbWV0ZXJlZCAoNDAyNDAxMzc2NDkzNzg1MDA2MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb19ub3RfZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg2OTYzNzcwODg1MDMzNzY1Mzc4KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDU2MDU3NjM3OTY4MDY2MDA0NyI+ItCU0L7RgdGC0YPQv9C90LjQuSDRgdC70L7QstC90LjQuiDQtNC70Y8g0YLQsNC60L7RlyDQvNC+0LLQuDogPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+ItCd0LDRgtC40YHQvdGW0YLRjCwg0YnQvtCxINC/0LXRgNC10LPQu9GP0L3Rg9GC0Lgg0YLQsCDQt9Cw0LLQsNC90YLQsNC20LjRgtC4Ijwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKaW5kZXggMmRjZmIxOS4uMTJkMDViYiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApAQCAtMTcwLDQgKzE3MCwzOSBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX2RlZmF1bHQiIG1zZ2lkPSIzOTg4MDE3ODQwNDMxODgxNDkxIj4iTeG6t2MgxJHhu4tuaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxhbmd1YWdlX3NldHRpbmdzIiBtc2dpZD0iMTY3MTE1MzA1MzIwMTgwOTAzMSI+Ik5nw7RuIG5n4buvIHbDoCBwaMawxqFuZyB0aOG7qWMgbmjhuq1wIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJDaOG7jW4gcGjGsMahbmcgdGjhu6ljIG5o4bqtcCI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iTmjDoCBjdW5nIGPhuqVwIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJOaMOgIGN1bmcgY+G6pXAgdOG7qyDEkWnhu4NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJE4buLY2ggduG7pSB04burIMSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJUaMO0bmcgdGluIGPhuq1wIG5o4bqtdCB04burIMSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IlThu6sgxJFp4buDbiBwaOG7pSB0cuG7oyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iQ8OzIHPhurVuIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiJDw6BpIMSR4bq3dCBkw6BuaCBjaG8gdOG7qyDEkWnhu4NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iVOG7qyDEkWnhu4NuIG5nxrDhu51pIGTDuW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIiBtc2dpZD0iNTIyMTI1MTUyNzU3NjA3NzkwIj4iVOG7qyDEkWnhu4NuIG5nxrDhu51pIGTDuW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9hdmFpbGFibGUiIG1zZ2lkPSIzMTkyOTIwNjA4NTIwNjE4MDgzIj4iQ8OzIHPhurVuIHThu6sgxJFp4buDbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJIaeG7h24gxJFhbmcgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+IsSQw6MgY8OgaSDEkeG6t3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIiBtc2dpZD0iMzQ0ODU3MTI4MDQ5MDc0NjAzMiI+IsSQw6MgY8OgaSDEkeG6t3QsIGLhu4sgdOG6r3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iTOG7l2kga27hu5FpIGQuduG7pSB0LsSRaeG7g24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19kaWN0aW9uYXJpZXNfYXZhaWxhYmxlIiBtc2dpZD0iNTIwNjIyNTA3Nzk0NTYzNzgxMCI+Iktow7RuZyBjw7MgdOG7qyDEkWnhu4NuIG7DoG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiJMw6BtIG3hu5tpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iQ+G6rXAgbmjhuq10IGzhuqduIGN14buRaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiLEkGFuZyBraeG7g20gdHJhIGPhuq1wIG5o4bqtdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyIgbXNnaWQ9Ijg2MTEzMzkxNDk4MjUwNDc0NDYiPiLEkGFuZyB04bqjaS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiJU4burIMSRaeG7g24gY2jDrW5oIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+Ikjhu6d5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkPDoGkgxJHhurd0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiIG1zZ2lkPSI3MTYzMTczNjUwMjk4ODM4MzY3Ij4iSOG7p3kgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiJU4bqvdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IkLhuq10Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2RpY3QiIG1zZ2lkPSI1ODE3MTU5MjkwNTAzODQzNzY2Ij4iWMOzYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCAoNDk2NTI2NDg0OTA1NzY1NjUyMSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBkb3dubG9hZF9vdmVyX21ldGVyZWQgKDQwMjQwMTM3NjQ5Mzc4NTAwNjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG9fbm90X2Rvd25sb2FkX292ZXJfbWV0ZXJlZCAoNjk2Mzc3MDg4NTAzMzc2NTM3OCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ1NjA1NzYzNzk2ODA2NjAwNDciPiJDw7Mgc+G6tW4gdOG7qyDEkWnhu4NuIGNobyA8eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdF9hdmFpbGFibGVfbm90aWZpY2F0aW9uX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzU1NTE1MzgxMjg1MzE3ODMyIj4iTmjhuqVuIMSR4buDIHhlbSBs4bqhaSB2w6AgdOG6o2kgeHXhu5FuZyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggM2U0Nzc3Ni4uMGUyZmQ3YyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLpu5jorqQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLor63oqIDlkozovpPlhaXms5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IumAieaLqei+k+WFpeazlSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i6K+N5YW45aSn5YWoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuivjeWFuOWkp+WFqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i5a2X5YW45pyN5YqhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i6K+N5YW45pu05paw5L+h5oGvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLpmYTliqDor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuivjeWFuOWPr+S+m+S4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLor43lhbjorr7nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLnlKjmiLfor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLnlKjmiLfor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLor43lhbjlj6/kvpvkuIvovb0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i55uu5YmN5q2j5Zyo5LiL6L29Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i5bey5a6J6KOFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLlt7Llronoo4XvvIzlt7LlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6L+e5o6l5Yiw6K+N5YW45pyN5Yqh5pe25Y+R55Sf6Zeu6aKYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLmsqHmnInlj6/nlKjnmoTor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLliLfmlrAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLmnIDlkI7mm7TmlrDml7bpl7QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i5q2j5Zyo5qOA5p+l5pu05pawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Iuato+WcqOWKoOi9vS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLkuLvor43lhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i5Y+W5raIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuWuieijhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuWPlua2iOS4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLlkK/nlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliKDpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuivjeWFuOWPr+S+m+S4i+i9vSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaMieatpOmAmuefpeWNs+WPr+afpeeci+WSjOS4i+i9vSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggYWI2YzY2NC4uYWU0YTQ4ZiAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC0xNzAsNCArMTcwLDM5IEBACiAgICAgPHN0cmluZyBuYW1lPSJidXR0b25fZGVmYXVsdCIgbXNnaWQ9IjM5ODgwMTc4NDA0MzE4ODE0OTEiPiLpoJDoqK0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiLoqp7oqIDoiIfovLjlhaXoqK3lrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNDMwMTYwMjM3NDYwOTI3NTAwMyI+IumBuOaTh+i8uOWFpeazlSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4i5a2X5YW45o+Q5L6b6ICFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9wcm92aWRlcl9uYW1lIiBtc2dpZD0iNzcxMDQxNTU5OTM3MTE2MTA5MiI+IuWtl+WFuOaPkOS+m+iAhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2VydmljZV9uYW1lIiBtc2dpZD0iNTUxNjUwNjk3MzQ4MjAyMDU2Ij4i5a2X5YW45pyN5YuZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZG93bmxvYWRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzMjc0ODYxNTE0Njk1MDMyOTU0Ij4i5a2X5YW45pu05paw6LOH6KiKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIgbXNnaWQ9IjcyNDM5MzA5Njc4NDUwMjA0MDciPiLlpJbmjpvlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0IiBtc2dpZD0iMzY0MjYzNDYyMzQ2NTM0OTcxNiI+IuWtl+WFuOWPr+S+m+S4i+i8iSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfc2V0dGluZ3Nfc3VtbWFyeSIgbXNnaWQ9Ijg1OTk2Nzk0MzQ3OTk3NDkwNTMiPiLlrZflhbjoqK3lrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VyX2RpY3Rpb25hcmllcyIgbXNnaWQ9Ijc1MTk3MzYyMzI0MjM5MjkxMjQiPiLkvb/nlKjogIXlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiLkvb/nlKjogIXlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSIgbXNnaWQ9IjMxOTI5MjA2MDg1MjA2MTgwODMiPiLlj6/nlKjnmoTlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rvd25sb2FkaW5nIiBtc2dpZD0iODU5NDk3NDc2MjY2MzA5NTk2Ij4i55uu5YmN5q2j5Zyo5LiL6LyJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9pbnN0YWxsZWQiIG1zZ2lkPSI2NDI1NTg2ODk5NjcxMzc4MTYwIj4i5bey5a6J6KOdIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiLlt7Llronoo53kvYbnm67liY3lgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4i6YCj57ea6Iez5a2X5YW45pyN5YuZ5pmC55m855Sf5ZWP6aGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiLmspLmnInlj6/nlKjnmoTlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciIG1zZ2lkPSI2NDIwNTc5ODYxMjc2MjQ5ODYiPiLph43mlrDmlbTnkIYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXN0X3VwZGF0ZSIgbXNnaWQ9IjMxMDE1NDk3MTk4Mjc2MDAzNDYiPiLkuIrmrKHmm7TmlrDmmYLplpMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIiBtc2dpZD0iODIwMTg2Mjc2NzA0MTM0NzIwIj4i5q2j5Zyo5qqi5p+l5pu05pawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVzc2FnZV9sb2FkaW5nIiBtc2dpZD0iODYxMTMzOTE0OTgyNTA0NzQ0NiI+Iui8ieWFpeS4rS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1haW5fZGljdF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjE2Nzk5NjQzMDY5ODAwOTg1NzAiPiLkuLvopoHlrZflhbgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWwiIG1zZ2lkPSI1NTg2NTMxNzM2NjA5MTgzMzA0Ij4i5Y+W5raIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IuWuieijnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbmNlbF9kb3dubG9hZF9kaWN0IiBtc2dpZD0iNzE2MzE3MzY1MDI5ODgzODM2NyI+IuWPlua2iOS4i+i8iSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpc2FibGVfZGljdCIgbXNnaWQ9Ijc2ODU4MTAwNDAyMzY0OTc3MDAiPiLlgZznlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlbmFibGVfZGljdCIgbXNnaWQ9IjM4NDgxNzk3ODQ3MDI0NzM2ODAiPiLllZ/nlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCIgbXNnaWQ9IjU4MTcxNTkyOTA1MDM4NDM3NjYiPiLliKrpmaQiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4i5pSv5o+044CMPHhsaWZmOmcgaWQ9IkxBTkdVQUdFIj4lMSRzPC94bGlmZjpnPuOAjeWtl+WFuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3RfYXZhaWxhYmxlX25vdGlmaWNhdGlvbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM1NTUxNTM4MTI4NTMxNzgzMiI+IuaMieS4i+WNs+WPr+afpeeci+S4puS4i+i8iSI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvamF2YS9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCmluZGV4IDY3NzU4OGIuLjllMTE4MjEgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgYi9qYXZhL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKQEAgLTE3MCw0ICsxNzAsMzkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9kZWZhdWx0IiBtc2dpZD0iMzk4ODAxNzg0MDQzMTg4MTQ5MSI+Ik9rdXplbnpha2FsZWxheW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYW5ndWFnZV9zZXR0aW5ncyIgbXNnaWQ9IjE2NzExNTMwNTMyMDE4MDkwMzEiPiJVbGltaSBub2tva3VmYWt3YXlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCIgbXNnaWQ9IjQzMDE2MDIzNzQ2MDkyNzUwMDMiPiJLaGV0aGEgaW5kbGVsYSB5b2t1ZmFrYSI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iYXBwX25hbWUiIG1zZ2lkPSIxMDE3MDU4MTg2MzIyNzE0NDA1Ij4iVW1obGluemVraSBXZXNpY2hhemFtYXp3aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcHJvdmlkZXJfbmFtZSIgbXNnaWQ9Ijc3MTA0MTU1OTkzNzExNjEwOTIiPiJVbWhsaW56ZWtpIFdlc2ljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXJ2aWNlX25hbWUiIG1zZ2lkPSI1NTE2NTA2OTczNDgyMDIwNTYiPiJJbnNpemEgeWVzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjMyNzQ4NjE1MTQ2OTUwMzI5NTQiPiJVbHdhemkgbG9rdWJ1eWVrZXphIGlzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIiBtc2dpZD0iNzI0MzkzMDk2Nzg0NTAyMDQwNyI+IkZha2EgaXppY2hhemFtYXp3aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbF9vdmVyX21ldGVyZWRfbmV0d29ya19wcm9tcHQiIG1zZ2lkPSIzNjQyNjM0NjIzNDY1MzQ5NzE2Ij4iSXNpY2hhemFtYXp3aSBzaXlhdGhvbGFrYWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5IiBtc2dpZD0iODU5OTY3OTQzNDc5OTc0OTA1MyI+Ikl6aWx1bmdpc2VsZWxvIHplemljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNlcl9kaWN0aW9uYXJpZXMiIG1zZ2lkPSI3NTE5NzM2MjMyNDIzOTI5MTI0Ij4iU2ViZW56aXNhIGlzaWNoYXphbWF6d2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3VzZXJfZGljdF9wcmVmX25hbWUiIG1zZ2lkPSI1MjIxMjUxNTI3NTc2MDc3OTAiPiJJc2ljaGF6YW1hendpIFNvbXNlYmVuemlzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfYXZhaWxhYmxlIiBtc2dpZD0iMzE5MjkyMDYwODUyMDYxODA4MyI+IklzaWNoYXphbWF6d2kgc2l5YXRob2xha2FsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciIG1zZ2lkPSI4NTk0OTc0NzYyNjYzMDk1OTYiPiJPa3dhbWFuamUgaXlhbGF5aXNoYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIiBtc2dpZD0iNjQyNTU4Njg5OTY3MTM3ODE2MCI+Ikt1ZmFraXdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9kaXNhYmxlZCIgbXNnaWQ9IjM0NDg1NzEyODA0OTA3NDYwMzIiPiJLdWZha2l3ZSwga3VtaXNpd2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UiIG1zZ2lkPSI2ODc1NjY1NDk0NzI2MzAwNDI3Ij4iSW5raW5nYSB5b2t1eGh1bWFuaXNla2EgZXNldmlzaW5pIHllc2ljaGF6YW1hendpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSIgbXNnaWQ9IjUyMDYyMjUwNzc5NDU2Mzc4MTAiPiJBemlraG8gaXphY2hhemltYXp3aSBlemlraG9uYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNoZWNrX2Zvcl91cGRhdGVzX25vdyIgbXNnaWQ9IjY0MjA1Nzk4NjEyNzYyNDk4NiI+IlZ1c2VsZWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGFzdF91cGRhdGUiIG1zZ2lkPSIzMTAxNTQ5NzE5ODI3NjAwMzQ2Ij4iSWdjaW5lIHVrdWx1bmdpc3dhOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfdXBkYXRpbmciIG1zZ2lkPSI4MjAxODYyNzY3MDQxMzQ3MjAiPiJJaGxvbGEgaXppYnV5ZWtlem8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX2xvYWRpbmciIG1zZ2lkPSI4NjExMzM5MTQ5ODI1MDQ3NDQ2Ij4iS3V5YWxheWlzaGEuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iIG1zZ2lkPSIxNjc5OTY0MzA2OTgwMDk4NTcwIj4iSXNpY2hhemltYXp3aSBzYWtobyBuZ3FhbmdpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIiBtc2dpZD0iNTU4NjUzMTczNjYwOTE4MzMwNCI+IktoYW5zZWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbF9kaWN0IiBtc2dpZD0iNTUyNTAwNTUyNDY5NzYwNzg2NSI+IkZha2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjYW5jZWxfZG93bmxvYWRfZGljdCIgbXNnaWQ9IjcxNjMxNzM2NTAyOTg4MzgzNjciPiJLaGFuc2VsYSB1a3VsYXlpc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzYWJsZV9kaWN0IiBtc2dpZD0iNzY4NTgxMDA0MDIzNjQ5NzcwMCI+IlllbnphIGt1bmdhc2ViZW56aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVuYWJsZV9kaWN0IiBtc2dpZD0iMzg0ODE3OTc4NDcwMjQ3MzY4MCI+IlZ1bWVsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9kaWN0IiBtc2dpZD0iNTgxNzE1OTI5MDUwMzg0Mzc2NiI+IlN1c2EiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2hvdWxkX2Rvd25sb2FkX292ZXJfbWV0ZXJlZF9wcm9tcHQgKDQ5NjUyNjQ4NDkwNTc2NTY1MjEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZG93bmxvYWRfb3Zlcl9tZXRlcmVkICg0MDI0MDEzNzY0OTM3ODUwMDYxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQgKDY5NjM3NzA4ODUwMzM3NjUzNzgpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0NTYwNTc2Mzc5NjgwNjYwMDQ3Ij4iSXNpY2hhemFtYXp3aSBzZS08eGxpZmY6ZyBpZD0iTEFOR1VBR0UiPiUxJHM8L3hsaWZmOmc+IHNpeWF0aG9sYWthbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iIG1zZ2lkPSIzNTU1MTUzODEyODUzMTc4MzIiPiJDaW5kZXplbGEgdWt1emUgdWJ1eWVrZXplIGJlc2UgdWxhbmRhIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IGQyNDhhNjguLmE5MGJhODAgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0xMjMsNCArMTIzLDEzIEBACiAgICAgICAgICAgICA0ID0gPwogICAgIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImxvZ19zY3JlZW5fbWV0cmljcyI+MDwvaW50ZWdlcj4KKworICAgIDwhLS0gU2V0dGluZ3MgZm9yIHRoZSBkaWN0aW9uYXJ5IHBhY2sgLS0+CisgICAgPGJvb2wgbmFtZT0iYWxsb3dfb3Zlcl9tZXRlcmVkIj5mYWxzZTwvYm9vbD4KKyAgICA8Ym9vbCBuYW1lPSJhbGxvd19vdmVyX3JvYW1pbmciPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImRpY3RfZG93bmxvYWRzX3Zpc2libGVfaW5fZG93bmxvYWRfVUkiPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9Im1ldGFkYXRhX2Rvd25sb2Fkc192aXNpYmxlX2luX2Rvd25sb2FkX1VJIj5mYWxzZTwvYm9vbD4KKyAgICA8Ym9vbCBuYW1lPSJkaXNwbGF5X25vdGlmaWNhdGlvbl9mb3JfYXV0b191cGRhdGUiPmZhbHNlPC9ib29sPgorICAgIDxib29sIG5hbWU9ImRpc3BsYXlfbm90aWZpY2F0aW9uX2Zvcl91c2VyX3JlcXVlc3RlZF91cGRhdGUiPmZhbHNlPC9ib29sPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2phdmEvcmVzL3ZhbHVlcy9kb25vdHRyYW5zbGF0ZS54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvZG9ub3R0cmFuc2xhdGUueG1sCmluZGV4IGVkZjYxNWEuLjFlNzBmYmIgMTAwNjQ0Ci0tLSBhL2phdmEvcmVzL3ZhbHVlcy9kb25vdHRyYW5zbGF0ZS54bWwKKysrIGIvamF2YS9yZXMvdmFsdWVzL2Rvbm90dHJhbnNsYXRlLnhtbApAQCAtMjEwLDggKzIxMCwxMiBAQAogICAgICAgICA8aXRlbT5xd2VydHk8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKLSAgICA8IS0tIGRpY3Rpb25hcnkgcGFjayBwYWNrYWdlIG5hbWUgL3NldHRpbmdzIGFjdGl2aXR5IChmb3Igc2hhcmVkIHByZWZzIGFuZCBzZXR0aW5ncykgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3BhY2tfcGFja2FnZV9uYW1lIj5jb20uZ29vZ2xlLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSI+Y29tLmdvb2dsZS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLmRpY3Rpb25hcnlwYWNrLkRpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR0aW5nc193YXJuaW5nX3Jlc2VhcmNoZXJfbW9kZSI+QXR0ZW50aW9uISAgWW91IGFyZSB1c2luZyB0aGUgc3BlY2lhbCBrZXlib2FyZCBmb3IgcmVzZWFyY2ggcHVycG9zZXMuPC9zdHJpbmc+CisKKyAgICA8IS0tIGRpY3Rpb25hcnkgcGFjayBzZXR0aW5ncyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfcGFja19zZXR0aW5nc19hY3Rpdml0eSI+Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVNldHRpbmdzQWN0aXZpdHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dGhvcml0eSI+Y29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suYW9zcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9tZXRhZGF0YV91cmkiPjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9jYWxfbWV0YWRhdGFfZmlsZW5hbWUiPm1ldGFkYXRhLmpzb248L3N0cmluZz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9qYXZhL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggZTg5MTc0Yi4uMDNkY2U5YyAxMDA2NDQKLS0tIGEvamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2phdmEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtNDU5LDQgKzQ1OSw3OCBAQAogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0X2lucHV0X21ldGhvZCI+Q2hvb3NlIGlucHV0IG1ldGhvZDwvc3RyaW5nPgogICAgIDwhLS0gT3B0aW9uIHRvIHNob3cgc2V0dXAgd2l6YXJkIGljb24uIFtDSEFSIExJTUlUPTMwXS0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2hvd19zZXR1cF93aXphcmRfaWNvbiIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+U2hvdyBzZXR1cCB3aXphcmQgaWNvbjwvc3RyaW5nPgorCisgICAgPCEtLSBUaGUgZGljdGlvbmFyeSBwcm92aWRlciBhcHBsaWNhdGlvbiBuYW1lLiBWaXNpYmxlIGluIFNldHRpbmdzL0FwcGxpY2F0aW9ucy9NYW5hZ2UgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5EaWN0aW9uYXJ5IFByb3ZpZGVyPC9zdHJpbmc+CisgICAgPCEtLSBUaGUgZGljdGlvbmFyeSBwcm92aWRlciBDb250ZW50UHJvdmlkZXIgbmFtZS4gVmlzaWJsZSBpbiBTZXR0aW5ncy9BcHBsaWNhdGlvbnMvUnVubmluZyBzZXJ2aWNlcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3Byb3ZpZGVyX25hbWUiPkRpY3Rpb25hcnkgUHJvdmlkZXI8L3N0cmluZz4KKyAgICA8IS0tIFRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyIFNlcnZpY2UgbmFtZS4gVmlzaWJsZSBpbiBTZXR0aW5ncy9BcHBsaWNhdGlvbnMvUnVubmluZyBzZXJ2aWNlcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NlcnZpY2VfbmFtZSI+RGljdGlvbmFyeSBTZXJ2aWNlPC9zdHJpbmc+CisKKyAgICA8IS0tIERvd25sb2FkYWJsZSBkaWN0aW9uYXJpZXMgd2lsbCBnZXQgdXBkYXRlIGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIG5ldHdvcmsuIFRoaXMgZGVzY3JpYmVzIHRoZSBhc3NvY2lhdGVkIGRvd25sb2FkLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRvd25sb2FkX2Rlc2NyaXB0aW9uIj5EaWN0aW9uYXJ5IHVwZGF0ZSBpbmZvcm1hdGlvbjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBhbmQgc3VtbWFyeSBvZiB0aGUgZGljdGlvbmFyeSBzZXR0aW5ncyBzY3JlZW4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X3NldHRpbmdzX3RpdGxlIj5BZGQtb24gZGljdGlvbmFyaWVzPC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBmb3IgdGhlIHByb21wdCBkaWFsb2cgd2hpY2ggaW5mb3JtcyB0aGUgdXNlciB0aGF0IGEgZGljdGlvbmFyeSBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGFuZCBhc2tzIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRvd25sb2FkIGl0IG92ZXIgM2cgLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2luc3RhbGxfb3Zlcl9tZXRlcmVkX25ldHdvcmtfcHJvbXB0Ij5EaWN0aW9uYXJ5IGF2YWlsYWJsZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGljdGlvbmFyeV9zZXR0aW5nc19zdW1tYXJ5Ij5TZXR0aW5ncyBmb3IgZGljdGlvbmFyaWVzPC9zdHJpbmc+CisgICAgPCEtLSBOYW1lIG9mIHRoZSB1c2VyIGRpY3Rpb25hcmllcyBzZXR0aW5ncyBjYXRlZ29yeSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZXJfZGljdGlvbmFyaWVzIj5Vc2VyIGRpY3Rpb25hcmllczwvc3RyaW5nPgorICAgIDwhLS0gTmFtZSBmb3IgdGhlICJ1c2VyIGRpY3Rpb25hcnkiIHByZWZlcmVuY2UgaXRlbSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF91c2VyX2RpY3RfcHJlZl9uYW1lIj5Vc2VyIGRpY3Rpb25hcnk8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgYWJvdXQgc29tZSBkaWN0aW9uYXJ5IGluZGljYXRpbmcgaXQgY2FuIGJlIGRvd25sb2FkZWQsIGJ1dCBoYXNuJ3QgYmVlbiB5ZXQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2F2YWlsYWJsZSI+RGljdGlvbmFyeSBhdmFpbGFibGU8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgYWJvdXQgc29tZSBkaWN0aW9uYXJ5IGluZGljYXRpbmcgaXQgaXMgZG93bmxvYWRpbmcgYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgc29vbiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfZG93bmxvYWRpbmciPkN1cnJlbnRseSBkb3dubG9hZGluZzwvc3RyaW5nPgorICAgIDwhLS0gTWVzc2FnZSBhYm91dCBzb21lIGRpY3Rpb25hcnkgaW5kaWNhdGluZyBpdCBpcyBhbHJlYWR5IGluc3RhbGxlZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRpY3Rpb25hcnlfaW5zdGFsbGVkIj5JbnN0YWxsZWQ8L3N0cmluZz4KKyAgICA8IS0tIE1lc3NhZ2UgYWJvdXQgc29tZSBkaWN0aW9uYXJ5IGluZGljYXRpbmcgdGhlIGZpbGUgaXMgaW5zdGFsbGVkLCBidXQgdGhlIGRpY3Rpb25hcnkgaXMgZGlzYWJsZWQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0aW9uYXJ5X2Rpc2FibGVkIj5JbnN0YWxsZWQsIGRpc2FibGVkPC9zdHJpbmc+CisKKyAgICA8IS0tIE1lc3NhZ2UgdG8gZGlzcGxheSBpbiB0aGUgZGljdGlvbmFyaWVzIHNldHRpbmcgc2NyZWVuIHdoZW4gc29tZSBlcnJvciBwcmV2ZW50ZWQgdXMgdG8gbGlzdCBpbnN0YWxsZWQgZGljdGlvbmFyaWVzIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNhbm5vdF9jb25uZWN0X3RvX2RpY3Rfc2VydmljZSI+UHJvYmxlbSBjb25uZWN0aW5nIHRvIGRpY3Rpb25hcnkgc2VydmljZTwvc3RyaW5nPgorICAgIDwhLS0gTWVzc2FnZSB0byBkaXNwbGF5IGluIHRoZSBkaWN0aW9uYXJpZXMgc2V0dGluZyBzY3JlZW4gd2hlbiB3ZSBmb3VuZCB0aGF0IG5vIGRpY3Rpb25hcmllcyBhcmUgYXZhaWxhYmxlIFtDSEFSIExJTUlUPTIwXS0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZGljdGlvbmFyaWVzX2F2YWlsYWJsZSI+Tm8gZGljdGlvbmFyaWVzIGF2YWlsYWJsZTwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiB0aGUgb3B0aW9ucyB0byBwcmVzcyB0byByZWZyZXNoIHRoZSBsaXN0IChhcyBpbiwgY2hlY2sgZm9yIHVwZGF0ZXMgbm93KSBbQ0hBUl9MSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJjaGVja19mb3JfdXBkYXRlc19ub3ciPlJlZnJlc2g8L3N0cmluZz4KKyAgICA8IS0tIEhpbnQgdG8gdGVsbCB3aGVuIHRoZSBkYXRhIHdhcyBsYXN0IHVwZGF0ZWQuIFVzYWdlIDogIkxhc3QgdXBkYXRlZCBbZGF0ZV0iLCBtYXkgY29udGFpbiBhIDogb3Igc28uIFtDSEFSIExJTUlUPTQ1XSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Imxhc3RfdXBkYXRlIj5MYXN0IHVwZGF0ZWQ8L3N0cmluZz4KKworICAgIDwhLS0gTWVzc2FnZSB0byBkaXNwbGF5IGluIGEgZGlhbG9nIGJveCB3aGlsZSB3ZSBhcmUgYWN0aXZlbHkgdXBkYXRpbmcgdGhlIHdvcmQgbGlzdCBbQ0hBUiBMSU1JVD02MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtZXNzYWdlX3VwZGF0aW5nIj5DaGVja2luZyBmb3IgdXBkYXRlczwvc3RyaW5nPgorICAgIDwhLS0gTWVzc2FnZSB0byBkaXNwbGF5IHdoaWxlIHRoZSBhZGQtb24gZGljdGlvbmFyeSBsaXN0IGlzIHVwZGF0aW5nIFtubyBzcGFjZSBjb25zdHJhaW50cyBvbiB0aGlzLCB0aGVyZSBpcyBwbGVudHkgb2Ygc3BhY2UgYnV0IHNob3J0ZXIgaXMgYmV0dGVyIGJlY2F1c2UgaXQncyBvbmx5IG9uIHRoZSBzY3JlZW4gZm9yIGEgc2Vjb25kXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1lc3NhZ2VfbG9hZGluZyI+TG9hZGluZy4uLjwvc3RyaW5nPgorCisgICAgPCEtLSBTdHJpbmcgdG8gZXhwbGFpbiB0aGlzIGRpY3Rpb25hcnkgaXMgdGhlIG1haW4gZGljdGlvbmFyeSBmb3IgdGhpcyBsYW5ndWFnZSBbQ0hBUl9MSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtYWluX2RpY3RfZGVzY3JpcHRpb24iPk1haW4gZGljdGlvbmFyeTwvc3RyaW5nPgorCisgICAgPCEtLSBTdGFuZGFyZCBtZXNzYWdlIHRvIGRpc21pc3MgYSBkaWFsb2cgYm94IC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsIj5DYW5jZWw8L3N0cmluZz4KKworICAgIDwhLS0gQWN0aW9uIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsIGEgZGljdGlvbmFyeSBbQ0hBUl9MSU1JVD0xNV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJpbnN0YWxsX2RpY3QiPkluc3RhbGw8L3N0cmluZz4KKyAgICA8IS0tIEFjdGlvbiB0byBjYW5jZWwgdGhlIG9uZ29pbmcgZG93bmxvYWQgb2YgYSBkaWN0aW9uYXJ5IGZpbGUgW0NIQVJfTElNSVQ9MjVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY2FuY2VsX2Rvd25sb2FkX2RpY3QiPkNhbmNlbDwvc3RyaW5nPgorICAgIDwhLS0gQWN0aW9uIHRvIGRlbGV0ZSBhIGRpY3Rpb25hcnkgZmlsZSBbQ0hBUl9MSU1JVD0xNV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkZWxldGVfZGljdCI+RGVsZXRlPC9zdHJpbmc+CisKKyAgICA8IS0tIE1lc3NhZ2UgaW4gdGhlIHBvcHVwIGluZm9ybWluZyB0aGUgdXNlciBhIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlIGZvciB0aGVpciBsYW5ndWFnZSwgYW5kIGFza2luZyBmb3IgYSBkZWNpc2lvbiB0byBkb3dubG9hZCBvdmVyIHRoZWlyIG1vYmlsZSBkYXRhIHBsYW4gb3Igbm90LiBUaGUgcmVhc29uIHdlIGFzayBmb3IgdGhpcyBpcywgdGhlIGRhdGEgaXMgbGFyZ2UgYW5kIG1heSBiZSBkb3dubG9hZGVkIG92ZXIgYSBwYWlkLXBlci1tZWdhYnl0ZSBjb25uZWN0aW9uIGJ1dCBhIGRpY3Rpb25hcnkgaXMgYWxzbyBlc3NlbnRpYWwgdG8gdHlwZSBjb21mb3J0YWJseSwgc28gd2UgYXNrIHRoZSB1c2VyLiBUaGlzIG9ubHkgcG9wcyBpbiBzZWxlY3RlZCBjYXNlcywgd2hlbiB0aGVyZSBpcyBubyBkaWN0aW9uYXJ5IGF0IGFsbCBjdXJyZW50bHksIGFuZCB0aGUgb25seSBhdmFpbGFibGUgbmV0d29yayBzZWVtcyB0byBiZSBtZXRlcmVkLiBUaGUgIkxhbmd1YWdlICYgaW5wdXQiIHBhcnQgc2hvdWxkIGJlIHNldCB0byB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIG9wdGlvbiAobWVzc2FnZSBJRCA1MjkyNzE2NzQ3MjY0NDQyMzU5IGluIHRoZSB0cmFuc2xhdGlvbiBjb25zb2xlKS4gW0NIQVJfTElNSVQ9NzAwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNob3VsZF9kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0Ij5UaGUgc2VsZWN0ZWQgbGFuZ3VhZ2Ugb24geW91ciBtb2JpbGUgZGV2aWNlIGhhcyBhbiBhdmFpbGFibGUgZGljdGlvbmFyeS4mbHQ7YnIvPgorV2UgcmVjb21tZW5kICZsdDtiPmRvd25sb2FkaW5nJmx0Oy9iPiB0aGUgPHhsaWZmOmcgaWQ9Imxhbmd1YWdlIiBleGFtcGxlPSJFbmdsaXNoIj4lMSRzPC94bGlmZjpnPiBkaWN0aW9uYXJ5IHRvIGltcHJvdmUgeW91ciB0eXBpbmcgZXhwZXJpZW5jZS4mbHQ7YnIvPgorJmx0O2JyLz4KK1RoZSBkb3dubG9hZCBjb3VsZCB0YWtlIGEgbWludXRlIG9yIHR3byBvdmVyIDNHLiBDaGFyZ2VzIG1heSBhcHBseSBpZiB5b3UgZG9uXCd0IGhhdmUgYW4gJmx0O2I+dW5saW1pdGVkIGRhdGEgcGxhbiZsdDsvYj4uJmx0O2JyLz4KK0lmIHlvdSBhcmUgbm90IHN1cmUgd2hpY2ggZGF0YSBwbGFuIHlvdSBoYXZlLCB3ZSByZWNvbW1lbmQgZmluZGluZyBhIFdpLUZpIGNvbm5lY3Rpb24gdG8gc3RhcnQgdGhlIGRvd25sb2FkIGF1dG9tYXRpY2FsbHkuJmx0O2JyLz4KKyZsdDtici8+CitUaXA6IFlvdSBjYW4gZG93bmxvYWQgYW5kIHJlbW92ZSBkaWN0aW9uYXJpZXMgYnkgZ29pbmcgdG8gJmx0O2I+TGFuZ3VhZ2UgJmFtcDsgaW5wdXQmbHQ7L2I+IGluIHRoZSAmbHQ7Yj5TZXR0aW5ncyZsdDsvYj4gbWVudSBvZiB5b3VyIG1vYmlsZSBkZXZpY2UuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkb3dubG9hZF9vdmVyX21ldGVyZWQiPkRvd25sb2FkIG5vdyAoPHhsaWZmOmcgaWQ9InNpemVfaW5fbWVnYWJ5dGVzIiBleGFtcGxlPSIwLjciPiUxJC4xZjwveGxpZmY6Zz5NQik8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRvX25vdF9kb3dubG9hZF9vdmVyX21ldGVyZWQiPkRvd25sb2FkIG92ZXIgV2ktRmk8L3N0cmluZz4KKyAgICA8IS0tIFRoZSB0ZXh0IG9mIHRoZSAiZGljdGlvbmFyeSBhdmFpbGFibGUiIG5vdGlmaWNhdGlvbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiPkEgZGljdGlvbmFyeSBpcyBhdmFpbGFibGUgZm9yIDx4bGlmZjpnIGlkPSJsYW5ndWFnZSIgZXhhbXBsZT0iRW5nbGlzaCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KKyAgICA8IS0tIFRoZSBzbWFsbCBzdWJ0ZXh0IGluIHRoZSAiZGljdGlvbmFyeSBhdmFpbGFibGUiIG5vdGlmaWNhdGlvbi4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24iPlByZXNzIHRvIHJldmlldyBhbmQgZG93bmxvYWQ8L3N0cmluZz4KKworICAgIDwhLS0gVGhlIHRleHQgb2YgdGhlIHRvYXN0IHdhcm5pbmcgYSBkb3dubG9hZCBpcyBzdGFydGluZyBhdXRvbWF0aWNhbGx5IHRvIGVuYWJsZSBzdWdnZXN0aW9ucyBmb3IgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIFtDSEFSIExJTUlUPTEwMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0b2FzdF9kb3dubG9hZGluZ19zdWdnZXN0aW9ucyI+RG93bmxvYWRpbmc6IHN1Z2dlc3Rpb25zIGZvciA8eGxpZmY6ZyBpZD0ibGFuZ3VhZ2UiIGV4YW1wbGU9IkVuZ2xpc2giPiUxJHM8L3hsaWZmOmc+IHdpbGwgYmUgcmVhZHkgc29vbi48L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvamF2YS9yZXMveG1sL2RpY3Rpb25hcnlfc2V0dGluZ3MueG1sIGIvamF2YS9yZXMveG1sL2RpY3Rpb25hcnlfc2V0dGluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGRmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3Jlcy94bWwvZGljdGlvbmFyeV9zZXR0aW5ncy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPFByZWZlcmVuY2VTY3JlZW4KKyAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGljdGlvbmFyeV9zZXR0aW5nc190aXRsZSIKKyAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9kaWN0aW9uYXJ5X3NldHRpbmdzX3N1bW1hcnkiPgorCis8L1ByZWZlcmVuY2VTY3JlZW4+CmRpZmYgLS1naXQgYS9qYXZhL3Jlcy94bWwvcHJlZnMueG1sIGIvamF2YS9yZXMveG1sL3ByZWZzLnhtbAppbmRleCBlNWZlZjg4Li41MWY1ODA3IDEwMDY0NAotLS0gYS9qYXZhL3Jlcy94bWwvcHJlZnMueG1sCisrKyBiL2phdmEvcmVzL3htbC9wcmVmcy54bWwKQEAgLTU5LDcgKzU5LDYgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvY29uZmlndXJlX2RpY3Rpb25hcmllc190aXRsZSI+CiAgICAgICAgICAgIDxpbnRlbnQKICAgICAgICAgICAgICAgYW5kcm9pZDphY3Rpb249ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIgotICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9IkBzdHJpbmcvZGljdGlvbmFyeV9wYWNrX3BhY2thZ2VfbmFtZSIKICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRDbGFzcz0iQHN0cmluZy9kaWN0aW9uYXJ5X3BhY2tfc2V0dGluZ3NfYWN0aXZpdHkiPgogICAgICAgICAgICAgIDxleHRyYQogICAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9ImNsaWVudElkIgpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L0Nvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvY29tcGF0L0Nvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjFmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvQ29ubmVjdGl2aXR5TWFuYWdlckNvbXBhdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworcHVibGljIGZpbmFsIGNsYXNzIENvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscyB7CisgICAgLy8gQ29ubmVjdGl2aXR5TWFuYWdlciNpc0FjdGl2ZU5ldHdvcmtNZXRlcmVkKCkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgIC8vIGluIEFQSSBsZXZlbCAxNiAoQnVpbGQuVkVSU0lPTl9DT0RFUy5KRUxMWV9CRUFOKS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgTUVUSE9EX2lzQWN0aXZlTmV0d29ya01ldGVyZWQgPSBDb21wYXRVdGlscy5nZXRNZXRob2QoCisgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLmNsYXNzLCAiaXNBY3RpdmVOZXR3b3JrTWV0ZXJlZCIpOworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZlTmV0d29ya01ldGVyZWQoZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIHJldHVybiAoQm9vbGVhbilDb21wYXRVdGlscy5pbnZva2UobWFuYWdlciwKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgQVBJIHRlbGxpbmcgd2hldGhlciB0aGUgbmV0d29yayBpcyBtZXRlcmVkIG9yIG5vdCBpcyBub3QgYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhlIGNsb3Nlc3QgdGhpbmcgaXMgImlmIGl0J3MgYSBtb2JpbGUgY29ubmVjdGlvbiIuCisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRBY3RpdmVOZXR3b3JrSW5mbygpLmdldFR5cGUoKSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFLAorICAgICAgICAgICAgICAgIE1FVEhPRF9pc0FjdGl2ZU5ldHdvcmtNZXRlcmVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2NvbXBhdC9Eb3dubG9hZE1hbmFnZXJDb21wYXRVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjljNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9jb21wYXQvRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEb3dubG9hZE1hbmFnZXJDb21wYXRVdGlscyB7CisgICAgLy8gRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3Qjc2V0QWxsb3dlZE92ZXJNZXRlcmVkKCkgaGFzIGJlZW4gaW50cm9kdWNlZAorICAgIC8vIGluIEFQSSBsZXZlbCAxNiAoQnVpbGQuVkVSU0lPTl9DT0RFUy5KRUxMWV9CRUFOKS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgTUVUSE9EX3NldEFsbG93ZWRPdmVyTWV0ZXJlZCA9IENvbXBhdFV0aWxzLmdldE1ldGhvZCgKKyAgICAgICAgICAgIERvd25sb2FkTWFuYWdlci5SZXF1ZXN0LmNsYXNzLCAic2V0QWxsb3dlZE92ZXJNZXRlcmVkIiwgQm9vbGVhbi5UWVBFKTsKKworICAgIHB1YmxpYyBzdGF0aWMgRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3Qgc2V0QWxsb3dlZE92ZXJNZXRlcmVkKAorICAgICAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3QgcmVxdWVzdCwgZmluYWwgYm9vbGVhbiBhbGxvd092ZXJNZXRlcmVkKSB7CisgICAgICAgIHJldHVybiAoRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3QpQ29tcGF0VXRpbHMuaW52b2tlKHJlcXVlc3QsCisgICAgICAgICAgICAgICAgcmVxdWVzdCAvKiBkZWZhdWx0IHJldHVybiB2YWx1ZSAqLywgTUVUSE9EX3NldEFsbG93ZWRPdmVyTWV0ZXJlZCwgYWxsb3dPdmVyTWV0ZXJlZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc1NldEFsbG93ZWRPdmVyTWV0ZXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGwgIT0gTUVUSE9EX3NldEFsbG93ZWRPdmVyTWV0ZXJlZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9BY3Rpb25CYXRjaC5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQWN0aW9uQmF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRhNTJmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQWN0aW9uQmF0Y2guamF2YQpAQCAtMCwwICsxLDY0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlci5SZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQuRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKKworLyoqCisgKiBPYmplY3QgcmVwcmVzZW50aW5nIGFuIHVwZ3JhZGUgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGJhc2ljYWxseSBlbmNhcHN1bGF0ZXMgYSBsaXN0IG9mIFJ1bm5hYmxlIG9iamVjdHMuIEluIHRoZSBmdXR1cmUKKyAqIGl0IG1heSBtYW5hZ2UgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbS4gQ29uY3JldGVseSwgaXQgZG9lcyBub3QgdXNlIFJ1bm5hYmxlIGJlY2F1c2UgdGhlCisgKiBhY3Rpb25zIG5lZWQgYW4gYXJndW1lbnQuCisgKi8KKy8qCisKK1RoZSBzdGF0ZSBvZiBhIHdvcmQgbGlzdCBmb2xsb3dzIHRoZSBmb2xsb3dpbmcgc2NoZW1lLgorCisgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICBNYWtlQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICB8ICAgICAgICAuLS0tLS0tLS0tLS0tRm9yZ2V0LS0tLS0tLS0nCisgICAgICAgViAgICAgICAgfAorIFNUQVRVU19BVkFJTEFCTEUgIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorU3RhcnREb3dubG9hZEFjdGlvbiAgICAgICAgICAgICAgICAgIEZpbmlzaERlbGV0ZUFjdGlvbgorICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorU1RBVFVTX0RPV05MT0FESU5HICAgICAgRW5hYmxlQWN0aW9uLS0gU1RBVFVTX0RFTEVUSU5HCisgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICBeCitJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbiAgIHwgICAgICAgICAgICAgICB8CisgICAgICAgfCAgICAgLi0tLS0tLS0tLS0tLS0tLScgICAgICAgIFN0YXJ0RGVsZXRlQWN0aW9uCisgICAgICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgViAgICAgViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgU1RBVFVTX0lOU1RBTExFRCAgPC0tRW5hYmxlQWN0aW9uLS0gICBTVEFUVVNfRElTQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgLS1EaXNhYmxlQWN0aW9uLS0+CisKKyAgSXQgbWF5IGFsc28gYmUgcG9zc2libGUgdGhhdCBEaXNhYmxlQWN0aW9uIG9yIFN0YXJ0RGVsZXRlQWN0aW9uIG9yCisgIERvd25sb2FkQWN0aW9uIHJ1biB3aGVuIHRoZSBmaWxlIGlzIHN0aWxsIGRvd25sb2FkaW5nLiAgVGhpcyBjYW5jZWxzCisgIHRoZSBkb3dubG9hZCBhbmQgcmV0dXJucyB0byBTVEFUVVNfQVZBSUxBQkxFLgorICBBbHNvLCBhbiBVcGRhdGVEYXRhQWN0aW9uIG1heSBhcHBseSBpbiBhbnkgc3RhdGUuIEl0IGRvZXMgbm90IGFmZmVjdAorICB0aGUgc3RhdGUgaW4gYW55IHdheSAobm9yIHR5cGUsIGxvY2FsIGZpbGVuYW1lLCBpZCBvciB2ZXJzaW9uKSBidXQKKyAgbWF5IHVwZGF0ZSBvdGhlciBhdHRyaWJ1dGVzIGxpa2UgZGVzY3JpcHRpb24gb3IgcmVtb3RlIGZpbGVuYW1lLgorCisgIEZvcmdldCBpcyBhbiBEQiBtYWludGVuYW5jZSBhY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBlbnRyeSBpZiBpdCBpcyBub3QgaW5zdGFsbGVkIG9yIGRpc2FibGVkLgorICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgd29yZCBsaXN0IGluZm9ybWF0aW9uIGRpc2FwcGVhcmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBhIG5ldyB2ZXJzaW9uCisgIGlzIGF2YWlsYWJsZSBhbmQgd2Ugc2hvdWxkIGZvcmdldCBhYm91dCB0aGUgb2xkIG9uZS4KKyovCitwdWJsaWMgZmluYWwgY2xhc3MgQWN0aW9uQmF0Y2ggeworICAgIC8qKgorICAgICAqIEEgcGllY2Ugb2YgdXBkYXRlLgorICAgICAqCisgICAgICogQWN0aW9uIGlzIGJhc2ljYWxseSBsaWtlIGEgUnVubmFibGUgdGhhdCB0YWtlcyBhbiBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlIHRoaXMgYWN0aW9uIE5PVy4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gZ2V0IHN5c3RlbSBzZXJ2aWNlcywgcmVzb3VyY2VzLCBkYXRhYmFzZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhY3Rpb24gdGhhdCBzdGFydHMgZG93bmxvYWRpbmcgYW4gYXZhaWxhYmxlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN0YXJ0RG93bmxvYWRBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIFN0YXJ0RG93bmxvYWRBY3Rpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIGRhdGEgdG8gZG93bmxvYWQuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbUZvcmNlU3RhcnROb3c7CisgICAgICAgIHB1YmxpYyBTdGFydERvd25sb2FkQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRMaXN0LCBmaW5hbCBib29sZWFuIGZvcmNlU3RhcnROb3cpIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBkb3dubG9hZCBhY3Rpb24gZm9yIGNsaWVudCAiLCBjbGllbnRJZCwgIiA6ICIsIHdvcmRMaXN0KTsKKyAgICAgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICAgICAgbVdvcmRMaXN0ID0gd29yZExpc3Q7CisgICAgICAgICAgICBtRm9yY2VTdGFydE5vdyA9IGZvcmNlU3RhcnROb3c7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG1Xb3JkTGlzdCkgeyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVcGRhdGVBY3Rpb24gd2l0aCBhIG51bGwgcGFyYW1ldGVyISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIkRvd25sb2FkaW5nIHdvcmQgbGlzdCIpOworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBEb3dubG9hZE1hbmFnZXIgbWFuYWdlciA9CisgICAgICAgICAgICAgICAgICAgIChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HID09IHN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JkIGxpc3QgaXMgc3RpbGwgZG93bmxvYWRpbmcuIENhbmNlbCB0aGUgZG93bmxvYWQgYW5kIHJldmVydCB0aGUKKyAgICAgICAgICAgICAgICAvLyB3b3JkIGxpc3Qgc3RhdHVzIHRvICJhdmFpbGFibGUiLgorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG93bmxvYWRNYW5hZ2VyIGlzIGRpc2FibGVkIChvciBub3QgaW5zdGFsbGVkPykuIFdlIGNhbid0IGNhbmNlbCAtIHRoZXJlCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGhpbmcgd2UgY2FuIGRvLiBXZSBzdGlsbCBuZWVkIHRvIG1hcmsgdGhlIGVudHJ5IGFzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5yZW1vdmUodmFsdWVzLmdldEFzTG9uZyhNZXRhZGF0YURiSGVscGVyLlBFTkRJTkdJRF9DT0xVTU4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5tYXJrRW50cnlBc0F2YWlsYWJsZShkYiwgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQVZBSUxBQkxFICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgJyIgKyBtV29yZExpc3QubUlkICsgIicgOiAiICsgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGFuIHVwZ3JhZGUgYWN0aW9uLiBGYWxsIGJhY2sgdG8gZG93bmxvYWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEb3dubG9hZCBpdC4KKyAgICAgICAgICAgIFV0aWxzLmwoIlVwZ3JhZGUgd29yZCBsaXN0LCBkb3dubG9hZGluZyIsIG1Xb3JkTGlzdC5tUmVtb3RlRmlsZW5hbWUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBpZiBEb3dubG9hZE1hbmFnZXIgaXMgZGlzYWJsZWQgb3Igbm90IGluc3RhbGxlZCwgZG93bmxvYWQgYnkgb3Vyc2VsdmVzCisgICAgICAgICAgICBpZiAobnVsbCA9PSBtYW5hZ2VyKSByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gdXBncmFkZWQgd29yZCBsaXN0OiB3ZSBzaG91bGQgZG93bmxvYWQgaXQuCisgICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gVXJpLnBhcnNlKG1Xb3JkTGlzdC5tUmVtb3RlRmlsZW5hbWUpOworICAgICAgICAgICAgZmluYWwgUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJpKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpZiAoIW1Gb3JjZVN0YXJ0Tm93KSB7CisgICAgICAgICAgICAgICAgaWYgKERvd25sb2FkTWFuYWdlckNvbXBhdFV0aWxzLmhhc1NldEFsbG93ZWRPdmVyTWV0ZXJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dPdmVyTWV0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChVcGRhdGVIYW5kbGVyLmdldERvd25sb2FkT3Zlck1ldGVyZWRTZXR0aW5nKGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVXBkYXRlSGFuZGxlci5ET1dOTE9BRF9PVkVSX01FVEVSRURfRElTQUxMT1dFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgc2FpZCBubzogZG9uJ3QgYWxsb3cuCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd092ZXJNZXRlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBVcGRhdGVIYW5kbGVyLkRPV05MT0FEX09WRVJfTUVURVJFRF9BTExPV0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBzYWlkIHllczogYWxsb3cuCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd092ZXJNZXRlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBVcGRhdGVIYW5kbGVyLkRPV05MT0FEX09WRVJfTUVURVJFRF9TRVRUSU5HX1VOS05PV04KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGtub3c6IHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd092ZXJNZXRlcmVkID0gcmVzLmdldEJvb2xlYW4oUi5ib29sLmFsbG93X292ZXJfbWV0ZXJlZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuc2V0QWxsb3dlZE92ZXJNZXRlcmVkKHJlcXVlc3QsIGFsbG93T3Zlck1ldGVyZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QWxsb3dlZE5ldHdvcmtUeXBlcyhSZXF1ZXN0Lk5FVFdPUktfV0lGSSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QWxsb3dlZE92ZXJSb2FtaW5nKHJlcy5nZXRCb29sZWFuKFIuYm9vbC5hbGxvd19vdmVyX3JvYW1pbmcpKTsKKyAgICAgICAgICAgIH0gLy8gaWYgbUZvcmNlU3RhcnROb3csIHRoZW4gYWxsb3cgYWxsIG5ldHdvcmsgdHlwZXMgYW5kIHJvYW1pbmcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgcmVxdWVzdC5zZXRUaXRsZShtV29yZExpc3QubURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0Tm90aWZpY2F0aW9uVmlzaWJpbGl0eSgKKyAgICAgICAgICAgICAgICAgICAgcmVzLmdldEJvb2xlYW4oUi5ib29sLmRpc3BsYXlfbm90aWZpY2F0aW9uX2Zvcl9hdXRvX3VwZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFJlcXVlc3QuVklTSUJJTElUWV9WSVNJQkxFIDogUmVxdWVzdC5WSVNJQklMSVRZX0hJRERFTik7CisgICAgICAgICAgICByZXF1ZXN0LnNldFZpc2libGVJbkRvd25sb2Fkc1VpKAorICAgICAgICAgICAgICAgICAgICByZXMuZ2V0Qm9vbGVhbihSLmJvb2wuZGljdF9kb3dubG9hZHNfdmlzaWJsZV9pbl9kb3dubG9hZF9VSSkpOworCisgICAgICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkSWQgPSBVcGRhdGVIYW5kbGVyLnJlZ2lzdGVyRG93bmxvYWRSZXF1ZXN0KG1hbmFnZXIsIHJlcXVlc3QsIGRiLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgVXRpbHMubCgiU3RhcnRpbmcgZG93bmxvYWQgb2YiLCB1cmksICJ3aXRoIGlkIiwgZG93bmxvYWRJZCk7CisgICAgICAgICAgICBQcml2YXRlTG9nLmxvZygiU3RhcnRpbmcgZG93bmxvYWQgb2YgIiArIHVyaSArICIsIGlkIDogIiArIGRvd25sb2FkSWQsIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgdXBkYXRlcyB0aGUgZGF0YWJhc2UgdG8gcmVmbGVjdCB0aGUgc3RhdHVzIG9mIGEgbmV3bHkgaW5zdGFsbGVkIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEluc3RhbGxBZnRlckRvd25sb2FkQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIKKyAgICAgICAgICAgICAgICArIEluc3RhbGxBZnRlckRvd25sb2FkQWN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsaWVudElkOworICAgICAgICAvLyBUaGUgc3RhdGUgdG8gdXBncmFkZSBmcm9tLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgbVdvcmRMaXN0VmFsdWVzOworCisgICAgICAgIHB1YmxpYyBJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB3b3JkTGlzdFZhbHVlcykgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IEluc3RhbGxBZnRlckRvd25sb2FkQWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkTGlzdFZhbHVlcyk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdFZhbHVlcyA9IHdvcmRMaXN0VmFsdWVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3RWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJbnN0YWxsQWZ0ZXJEb3dubG9hZEFjdGlvbiB3aXRoIGEgbnVsbCBwYXJhbWV0ZXIhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IG1Xb3JkTGlzdFZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBtV29yZExpc3RWYWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTik7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBzdGF0ZSBvZiB0aGUgd29yZCBsaXN0ICciICsgaWQgKyAiJyA6ICIgKyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgYW4gSW5zdGFsbEFmdGVyRG93bmxvYWQgYWN0aW9uLiBCYWlsaW5nIG91dC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJTZXR0aW5nIHdvcmQgbGlzdCBhcyBpbnN0YWxsZWQiKTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5tYXJrRW50cnlBc0ZpbmlzaGVkRG93bmxvYWRpbmdBbmRJbnN0YWxsZWQoZGIsIG1Xb3JkTGlzdFZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhY3Rpb24gdGhhdCBlbmFibGVzIGFuIGV4aXN0aW5nIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVuYWJsZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgRW5hYmxlQWN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsaWVudElkOworICAgICAgICAvLyBUaGUgc3RhdGUgdG8gdXBncmFkZSBmcm9tLiBNYXkgbm90IGJlIG51bGwuCisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbVdvcmRMaXN0OworCisgICAgICAgIHB1YmxpYyBFbmFibGVBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRMaXN0KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgRW5hYmxlQWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkTGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFbmFibGVBY3Rpb24gd2l0aCBhIG51bGwgcGFyYW1ldGVyISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIkVuYWJsaW5nIHdvcmQgbGlzdCIpOworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRElTQUJMRUQgIT0gc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICYmIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RFTEVUSU5HICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIHdvcmQgbGlzdCAnIiArIG1Xb3JkTGlzdC5tSWQgKyAiIDogIiArIHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgYW4gZW5hYmxlIGFjdGlvbi4gQ2FuY2VsbGluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNFbmFibGVkKGRiLCBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgZGlzYWJsZXMgYSB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXNhYmxlQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBEaXNhYmxlQWN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsaWVudElkOworICAgICAgICAvLyBUaGUgd29yZCBsaXN0IHRvIGRpc2FibGUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBEaXNhYmxlQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkbGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IERpc2FibGUgYWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGlzYWJsZUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbHMubCgiRGlzYWJsaW5nIHdvcmQgbGlzdCA6ICIgKyBtV29yZExpc3QpOworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVEID09IHN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGluZyBhbiBpbnN0YWxsZWQgd29yZCBsaXN0CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5tYXJrRW50cnlBc0Rpc2FibGVkKGRiLCBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRE9XTkxPQURJTkcgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIHdvcmQgbGlzdCAnIiArIG1Xb3JkTGlzdC5tSWQgKyAiJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXR1cyArICIgZm9yIGEgZGlzYWJsZSBhY3Rpb24uIEZhbGwgYmFjayB0byBtYXJraW5nIGFzIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCBpcyBzdGlsbCBkb3dubG9hZGluZy4gQ2FuY2VsIHRoZSBkb3dubG9hZCBhbmQgcmV2ZXJ0IHRoZQorICAgICAgICAgICAgICAgIC8vIHdvcmQgbGlzdCBzdGF0dXMgdG8gImF2YWlsYWJsZSIuCisgICAgICAgICAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKERvd25sb2FkTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRE9XTkxPQURfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBjYW5jZWwgdGhlIGRvd25sb2FkIGJlY2F1c2UgRG93bmxvYWRNYW5hZ2VyIGlzIG5vdCBhdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIHN0aWxsIG5lZWQgdG8gbWFyayB0aGUgZW50cnkgYXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh2YWx1ZXMuZ2V0QXNMb25nKE1ldGFkYXRhRGJIZWxwZXIuUEVORElOR0lEX0NPTFVNTikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLm1hcmtFbnRyeUFzQXZhaWxhYmxlKGRiLCBtV29yZExpc3QubUlkLCBtV29yZExpc3QubVZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgbWFrZXMgYSB3b3JkIGxpc3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWFrZUF2YWlsYWJsZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgTWFrZUF2YWlsYWJsZUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byBtYWtlIGF2YWlsYWJsZS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIG1Xb3JkTGlzdDsKKyAgICAgICAgcHVibGljIE1ha2VBdmFpbGFibGVBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRsaXN0KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgTWFrZUF2YWlsYWJsZSBhY3Rpb24iLCBjbGllbnRJZCwgIiA6ICIsIHdvcmRsaXN0KTsKKyAgICAgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICAgICAgbVdvcmRMaXN0ID0gd29yZGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG1Xb3JkTGlzdCkgeyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJNYWtlQXZhaWxhYmxlQWN0aW9uIHdpdGggYSBudWxsIHdvcmQgbGlzdCEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgbUNsaWVudElkKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIHdvcmQgbGlzdCAnIiArIG1Xb3JkTGlzdC5tSWQgKyAiJyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGEgbWFrZWF2YWlsYWJsZSBhY3Rpb24uIE1hcmtpbmcgYXMgYXZhaWxhYmxlIGFueXdheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIk1ha2luZyB3b3JkIGxpc3QgYXZhaWxhYmxlIDogIiArIG1Xb3JkTGlzdCk7CisgICAgICAgICAgICAvLyBJZiBtTG9jYWxGaWxlbmFtZSBpcyBudWxsLCB0aGVuIGl0J3MgYSByZW1vdGUgZmlsZSB0aGF0IGhhc24ndCBiZWVuIGRvd25sb2FkZWQKKyAgICAgICAgICAgIC8vIHlldCwgc28gd2Ugc2V0IHRoZSBsb2NhbCBmaWxlbmFtZSB0byB0aGUgZW1wdHkgc3RyaW5nLgorICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLm1ha2VDb250ZW50VmFsdWVzKDAsCisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuVFlQRV9CVUxLLCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tTG9jYWxlLCBtV29yZExpc3QubURlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBudWxsID09IG1Xb3JkTGlzdC5tTG9jYWxGaWxlbmFtZSA/ICIiIDogbVdvcmRMaXN0Lm1Mb2NhbEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lLCBtV29yZExpc3QubUxhc3RVcGRhdGUsIG1Xb3JkTGlzdC5tQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tRmlsZVNpemUsIG1Xb3JkTGlzdC5tVmVyc2lvbiwgbVdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uKTsKKyAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJJbnNlcnQgJ2F2YWlsYWJsZScgcmVjb3JkIGZvciAiICsgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGxvY2FsZSAiICsgbVdvcmRMaXN0Lm1Mb2NhbGUsIGNvbnRleHQpOworICAgICAgICAgICAgZGIuaW5zZXJ0KE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IG1hcmtzIGEgd29yZCBsaXN0IGFzIHByZS1pbnN0YWxsZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyBNYWtlQXZhaWxhYmxlQWN0aW9uLCBhcyBpdCBvbmx5IGluc2VydHMgYSBsaW5lIHdpdGggcGFyYW1ldGVycworICAgICAqIHJlY2VpdmVkIGZyb20gb3V0c2lkZS4KKyAgICAgKiBVbmxpa2UgTWFrZUF2YWlsYWJsZUFjdGlvbiwgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCByZWNlaXZlZCBmcm9tIGEgZG93bmxvYWRlZCBtZXRhZGF0YSBmaWxlCisgICAgICogYnV0IGZyb20gdGhlIGNsaWVudCBkaXJlY3RseTsgaXQgbWFya3MgYSB3b3JkIGxpc3QgYXMgYmVpbmcgImluc3RhbGxlZCIgYW5kIG5vdCAiYXZhaWxhYmxlIi4KKyAgICAgKiBJdCBhbHNvIGV4cGxpY2l0bHkgc2V0cyB0aGUgZmlsZW5hbWUgdG8gdGhlIGVtcHR5IHN0cmluZywgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gb3BlbgorICAgICAqIGl0IG9uIG91ciBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWFya1ByZUluc3RhbGxlZEFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiCisgICAgICAgICAgICAgICAgKyBNYXJrUHJlSW5zdGFsbGVkQWN0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsaWVudElkOworICAgICAgICAvLyBUaGUgd29yZCBsaXN0IHRvIG1hcmsgcHJlLWluc3RhbGxlZC4gTWF5IG5vdCBiZSBudWxsLgorICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIG1Xb3JkTGlzdDsKKyAgICAgICAgcHVibGljIE1hcmtQcmVJbnN0YWxsZWRBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRsaXN0KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgTWFya1ByZUluc3RhbGxlZCBhY3Rpb24iLCBjbGllbnRJZCwgIiA6ICIsIHdvcmRsaXN0KTsKKyAgICAgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICAgICAgbVdvcmRMaXN0ID0gd29yZGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG1Xb3JkTGlzdCkgeyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJNYXJrUHJlSW5zdGFsbGVkQWN0aW9uIHdpdGggYSBudWxsIHdvcmQgbGlzdCEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgbUNsaWVudElkKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIHdvcmQgbGlzdCAnIiArIG1Xb3JkTGlzdC5tSWQgKyAiJyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGEgbWFya3ByZWluc3RhbGxlZCBhY3Rpb24uIE1hcmtpbmcgYXMgcHJlaW5zdGFsbGVkIGFueXdheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIk1hcmtpbmcgd29yZCBsaXN0IHByZWluc3RhbGxlZCA6ICIgKyBtV29yZExpc3QpOworICAgICAgICAgICAgLy8gVGhpcyB3b3JkIGxpc3QgaXMgcHJlLWluc3RhbGxlZCA6IHdlIGRvbid0IGhhdmUgaXRzIGZpbGUuIFdlIHNob3VsZCByZXNldAorICAgICAgICAgICAgLy8gdGhlIGxvY2FsIGZpbGUgbmFtZSB0byB0aGUgZW1wdHkgc3RyaW5nIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIG9wZW4gaXQKKyAgICAgICAgICAgIC8vIGFjY2lkZW50YWxseS4gVGhlIHJlbW90ZSBmaWxlbmFtZSBtYXkgYmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiBpZiBpdCBzbyB3aXNoZXMuCisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIubWFrZUNvbnRlbnRWYWx1ZXMoMCwKKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5UWVBFX0JVTEssIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1Mb2NhbGUsIG1Xb3JkTGlzdC5tRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICIiLCBtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lLCBtV29yZExpc3QubUxhc3RVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tQ2hlY2tzdW0sIG1Xb3JkTGlzdC5tRmlsZVNpemUsIG1Xb3JkTGlzdC5tVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uKTsKKyAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJJbnNlcnQgJ3ByZWluc3RhbGxlZCcgcmVjb3JkIGZvciAiICsgbVdvcmRMaXN0Lm1EZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgYW5kIGxvY2FsZSAiICsgbVdvcmRMaXN0Lm1Mb2NhbGUsIGNvbnRleHQpOworICAgICAgICAgICAgZGIuaW5zZXJ0KE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IHVwZGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSB3b3JkIGxpc3QgLSBkZXNjcmlwdGlvbiwgbG9jYWxlIGV0YworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXBkYXRlRGF0YUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgVXBkYXRlRGF0YUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBVcGRhdGVEYXRhQWN0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgV29yZExpc3RNZXRhZGF0YSB3b3JkbGlzdCkgeworICAgICAgICAgICAgVXRpbHMubCgiTmV3IFVwZGF0ZURhdGEgYWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVXBkYXRlRGF0YUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIG9sZFZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IG9sZFZhbHVlcykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byB1cGRhdGUgZGF0YSBhYm91dCBhIG5vbi1leGlzdGluZyB3b3JkIGxpc3QuIEJhaWxpbmcgb3V0LiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFV0aWxzLmwoIlVwZGF0aW5nIGRhdGEgYWJvdXQgYSB3b3JkIGxpc3QgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gTWV0YWRhdGFEYkhlbHBlci5tYWtlQ29udGVudFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlBFTkRJTkdJRF9DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuVFlQRV9DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTiksCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tTG9jYWxlLCBtV29yZExpc3QubURlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICBtV29yZExpc3QubVJlbW90ZUZpbGVuYW1lLCBtV29yZExpc3QubUxhc3RVcGRhdGUsIG1Xb3JkTGlzdC5tQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tRmlsZVNpemUsIG1Xb3JkTGlzdC5tVmVyc2lvbiwgbVdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uKTsKKyAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJVcGRhdGluZyByZWNvcmQgZm9yICIgKyBtV29yZExpc3QubURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgbG9jYWxlICIgKyBtV29yZExpc3QubUxvY2FsZSwgY29udGV4dCk7CisgICAgICAgICAgICBkYi51cGRhdGUoTWV0YWRhdGFEYkhlbHBlci5NRVRBREFUQV9UQUJMRV9OQU1FLCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgbVdvcmRMaXN0Lm1JZCwgSW50ZWdlci50b1N0cmluZyhtV29yZExpc3QubVZlcnNpb24pIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgZGVsZXRlcyB0aGUgbWV0YWRhdGEgYWJvdXQgYSB3b3JkIGxpc3QgaWYgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRyaWdnZXJlZCB3aGVuIGEgc3BlY2lmaWMgd29yZCBsaXN0IGRpc2FwcGVhcmVkIGZyb20gdGhlIHNlcnZlciwgb3Igd2hlbiBhIGZyZXNoZXIKKyAgICAgKiB3b3JkIGxpc3QgaXMgYXZhaWxhYmxlIGFuZCB0aGUgb2xkIG9uZSB3YXMgbm90IGluc3RhbGxlZC4KKyAgICAgKiBJZiB0aGUgd29yZCBsaXN0IGhhcyBub3QgYmVlbiBpbnN0YWxsZWQsIGl0J3MgcG9zc2libGUgdG8gZGVsZXRlIGl0cyBhc3NvY2lhdGVkIG1ldGFkYXRhLgorICAgICAqIE90aGVyd2lzZSwgdGhlIHNldHRpbmdzIGFyZSByZXRhaW5lZCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzdGlsbCBhZG1pbmlzdHJhdGUgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGb3JnZXRBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIEZvcmdldEFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byByZW1vdmUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbUhhc05ld2VyVmVyc2lvbjsKKyAgICAgICAgcHVibGljIEZvcmdldEFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZGxpc3QsCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNOZXdlclZlcnNpb24pIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBUcnlSZW1vdmUgYWN0aW9uIGZvciBjbGllbnQgIiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICAgICAgbUhhc05ld2VyVmVyc2lvbiA9IGhhc05ld2VyVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKG51bGwgPT0gbVdvcmRMaXN0KSB7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeVJlbW92ZUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbHMubCgiVHJ5aW5nIHRvIHJlbW92ZSB3b3JkIGxpc3QgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBvZiBhIG5vbi1leGlzdGluZyB3b3JkbGlzdC4gQ2FuY2VsbGluZy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgaWYgKG1IYXNOZXdlclZlcnNpb24gJiYgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQVZBSUxBQkxFICE9IHN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBuZXdlciB2ZXJzaW9uIG9mIHRoaXMgd29yZCBsaXN0LCB3ZSBzaG91bGQgYmUgaGVyZSBPTkxZIGlmIGl0IHdhcworICAgICAgICAgICAgICAgIC8vIG5vdCBpbnN0YWxsZWQgLSBlbHNlIHdlIHNob3VsZCBiZSB1cGdyYWRpbmcgaXQuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBzdGF0dXMgZm9yIGZvcmdldHRpbmcgYSB3b3JkIGxpc3QgaW5mbyA6ICIgKyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVtb3ZpbmcgVVJMIHRvIHByZXZlbnQgcmUtZG93bmxvYWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQgPT0gc3RhdHVzCisgICAgICAgICAgICAgICAgICAgIHx8IE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEID09IHN0YXR1cworICAgICAgICAgICAgICAgICAgICB8fCBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyA9PSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBpbnN0YWxsZWQgb3IgZGlzYWJsZWQsIHRoZW4gd2UgY2Fubm90IHJlbW92ZSB0aGUgZW50cnkgbGVzdCB0aGUgdXNlcgorICAgICAgICAgICAgICAgIC8vIGxvc2UgdGhlIGFiaWxpdHkgdG8gZGVsZXRlIHRoZSBmaWxlIG9yIG90aGVyd2lzZSBhZG1pbmlzdHJhdGUgaXQuIFdlIHdpbGwgdGh1cworICAgICAgICAgICAgICAgIC8vIGxlYXZlIGl0IGFzIGlzLCBidXQgcmVtb3ZlIHRoZSBVUkkgZnJvbSB0aGUgZGF0YWJhc2Ugc2luY2UgaXQgaXMgbm90IHN1cHBvc2VkIHRvCisgICAgICAgICAgICAgICAgLy8gYmUgYWNjZXNzaWJsZSBhbnkgbW9yZS4KKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBkZWxldGluZyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIG5ldyB2ZXJzaW9uLCB0aGVuIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAorICAgICAgICAgICAgICAgIC8vIEFuZHJvaWQgS2V5Ym9hcmQgYWN0dWFsbHkgaGFzIGRlbGV0ZWQgaXQgYmVmb3JlIHdlIGNhbiByZW1vdmUgaXRzIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OLCAiIik7CisgICAgICAgICAgICAgICAgZGIudXBkYXRlKE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTiArICIgPSA/IEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG1Xb3JkTGlzdC5tSWQsIEludGVnZXIudG9TdHJpbmcobVdvcmRMaXN0Lm1WZXJzaW9uKSB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBBVkFJTEFCTEUgb3IgRE9XTkxPQURJTkcgb3IgZXZlbiBVTktOT1dOLCBkZWxldGUgdGhlIGVudHJ5LgorICAgICAgICAgICAgICAgIGRiLmRlbGV0ZShNZXRhZGF0YURiSGVscGVyLk1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OICsgIiA9ID8gQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgbVdvcmRMaXN0Lm1JZCwgSW50ZWdlci50b1N0cmluZyhtV29yZExpc3QubVZlcnNpb24pIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgd29yZCBsaXN0IGZvciBkZWxldGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAqCisgICAgICogVGhpcyBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciByZXF1ZXN0cyBkZWxldGlvbiBvZiBhIHdvcmQgbGlzdC4gVGhpcyB3aWxsIG1hcmsgaXQgYXMKKyAgICAgKiBkZWxldGVkIGluIHRoZSBkYXRhYmFzZSwgYW5kIGZpcmUgYW4gaW50ZW50IGZvciBBbmRyb2lkIEtleWJvYXJkIHRvIHRha2Ugbm90aWNlIGFuZAorICAgICAqIHJlbG9hZCBpdHMgZGljdGlvbmFyaWVzIHJpZ2h0IGF3YXkgaWYgaXQgaXMgdXAuIElmIGl0IGlzIG5vdCB1cCBub3csIHRoZW4gaXQgd2lsbAorICAgICAqIGRlbGV0ZSB0aGUgYWN0dWFsIGZpbGUgdGhlIG5leHQgdGltZSBpdCBnZXRzIHVwLgorICAgICAqIEEgZmlsZSBtYXJrZWQgYXMgZGVsZXRlZCBjYXVzZXMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gc3VwcGx5IGEgemVyby1zaXplZCBmaWxlIHRvCisgICAgICogQW5kcm9pZCBLZXlib2FyZCwgd2hpY2ggd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGUgYW5kIHByb3ZpZGUgbm8gd29yZHMgZm9yIHRoaXMKKyAgICAgKiB3b3JkIGxpc3QuIFRoaXMgaXMgbm90IGV4YWN0bHkgYSAiZGVsZXRpb24iLCBzaW5jZSB0aGVyZSBpcyBhbiBhY3R1YWwgZmlsZSB3aGljaCB0YWtlcyB1cAorICAgICAqIGEgZmV3IGJ5dGVzIG9uIHRoZSBkaXNrLCBidXQgdGhpcyBhbGxvd3MgdG8gb3ZlcnJpZGUgYSBkZWZhdWx0IGRpY3Rpb25hcnkgd2l0aCBhbiBlbXB0eQorICAgICAqIGRpY3Rpb25hcnkuIFRoaXMgd2F5LCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgdXNlciB0byBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbgorICAgICAqIGRpY3Rpb25hcmllcyBpbnN0YWxsZWQgYnkgZGVmYXVsdCBhbmQgYWRkLW9uIGRpY3Rpb25hcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN0YXJ0RGVsZXRlQWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBTdGFydERlbGV0ZUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byBkZWxldGUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBTdGFydERlbGV0ZUFjdGlvbihmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZGxpc3QpIHsKKyAgICAgICAgICAgIFV0aWxzLmwoIk5ldyBTdGFydERlbGV0ZSBhY3Rpb24gZm9yIGNsaWVudCAiLCBjbGllbnRJZCwgIiA6ICIsIHdvcmRsaXN0KTsKKyAgICAgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICAgICAgbVdvcmRMaXN0ID0gd29yZGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG1Xb3JkTGlzdCkgeyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFydERlbGV0ZUFjdGlvbiB3aXRoIGEgbnVsbCB3b3JkIGxpc3QhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbHMubCgiVHJ5aW5nIHRvIGRlbGV0ZSB3b3JkIGxpc3QgOiAiICsgbVdvcmRMaXN0KTsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gTWV0YWRhdGFEYkhlbHBlci5nZXREYihjb250ZXh0LCBtQ2xpZW50SWQpOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsCisgICAgICAgICAgICAgICAgICAgIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gc2V0IGEgbm9uLWV4aXN0aW5nIHdvcmRsaXN0IGZvciByZW1vdmFsLiBDYW5jZWxsaW5nLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRElTQUJMRUQgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5leHBlY3RlZCBzdGF0dXMgZm9yIGRlbGV0aW5nIGEgd29yZCBsaXN0IGluZm8gOiAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNEZWxldGluZyhkYiwgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFjdGlvbiB0aGF0IHZhbGlkYXRlcyBhIHdvcmQgbGlzdCBhcyBkZWxldGVkLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIHJlc3RvcmUgdGhlIHdvcmQgbGlzdCBhcyBhdmFpbGFibGUgaWYgaXQgc3RpbGwgaXMsIG9yIHJlbW92ZSB0aGUgZW50cnkgaWYKKyAgICAgKiBpdCBpcyBub3QgYW55IG1vcmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaW5pc2hEZWxldGVBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb24geworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEaWN0aW9uYXJ5UHJvdmlkZXI6IiArIEZpbmlzaERlbGV0ZUFjdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAgICAgLy8gVGhlIHdvcmQgbGlzdCB0byBkZWxldGUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBtV29yZExpc3Q7CisgICAgICAgIHB1YmxpYyBGaW5pc2hEZWxldGVBY3Rpb24oZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRsaXN0KSB7CisgICAgICAgICAgICBVdGlscy5sKCJOZXcgRmluaXNoRGVsZXRlIGFjdGlvbiBmb3IgY2xpZW50IiwgY2xpZW50SWQsICIgOiAiLCB3b3JkbGlzdCk7CisgICAgICAgICAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgICAgIG1Xb3JkTGlzdCA9IHdvcmRsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBtV29yZExpc3QpIHsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmluaXNoRGVsZXRlQWN0aW9uIHdpdGggYSBudWxsIHdvcmQgbGlzdCEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVdGlscy5sKCJUcnlpbmcgdG8gZGVsZXRlIHdvcmQgbGlzdCA6ICIgKyBtV29yZExpc3QpOworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIG1DbGllbnRJZCk7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgbVdvcmRMaXN0Lm1JZCwgbVdvcmRMaXN0Lm1WZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IHZhbHVlcykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgYSBub24tZXhpc3Rpbmcgd29yZGxpc3QgZm9yIHJlbW92YWwuIENhbmNlbGxpbmcuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXR1cyBmb3IgZmluaXNoLWRlbGV0aW5nIGEgd29yZCBsaXN0IGluZm8gOiAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1vdGVGaWxlbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLlJFTU9URV9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSByZW1vdGUgZmlsZW5hbWUgYW55IG1vcmUsIHRoZW4gd2UgZG9uJ3Qga25vdyB3aGVyZSB0byBnZXQgdGhlIGZpbGUKKyAgICAgICAgICAgIC8vIGZyb20gYW55IG1vcmUsIHNvIHdlIHJlbW92ZSB0aGUgZW50cnkgZW50aXJlbHkuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIGlmIHRoZSBmaWxlIHdhcworICAgICAgICAgICAgLy8gbWFya2VkIERFTEVUSU5HIGJ1dCBkaXNhcHBlYXJlZCBmcm9tIHRoZSBtZXRhZGF0YSBvbiB0aGUgc2VydmVyLCBpdCBlbmRlZCB1cAorICAgICAgICAgICAgLy8gdGhpcyB3YXkuCisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmVtb3RlRmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgZGIuZGVsZXRlKE1ldGFkYXRhRGJIZWxwZXIuTUVUQURBVEFfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1ldGFkYXRhRGJIZWxwZXIuVkVSU0lPTl9DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBtV29yZExpc3QubUlkLCBJbnRlZ2VyLnRvU3RyaW5nKG1Xb3JkTGlzdC5tVmVyc2lvbikgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIubWFya0VudHJ5QXNBdmFpbGFibGUoZGIsIG1Xb3JkTGlzdC5tSWQsIG1Xb3JkTGlzdC5tVmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbiBhY3Rpb24gYmF0Y2ggY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBxdWV1ZSBvZiBBY3Rpb25zIHRoYXQgY2FuIGV4ZWN1dGUuCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxBY3Rpb24+IG1BY3Rpb25zOworCisgICAgcHVibGljIEFjdGlvbkJhdGNoKCkgeworICAgICAgICBtQWN0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PEFjdGlvbj4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoZmluYWwgQWN0aW9uIGEpIHsKKyAgICAgICAgbUFjdGlvbnMuYWRkKGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhbGwgdGhlIGFjdGlvbnMgb2YgYW5vdGhlciBhY3Rpb24gYmF0Y2guCisgICAgICogQHBhcmFtIHRoYXQgdGhlIHVwZ3JhZGUgdG8gbWVyZ2UgaW50byB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoZmluYWwgQWN0aW9uQmF0Y2ggdGhhdCkgeworICAgICAgICBmb3IgKGZpbmFsIEFjdGlvbiBhIDogdGhhdC5tQWN0aW9ucykgeworICAgICAgICAgICAgYWRkKGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIGJhdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgZm9yIGdldHRpbmcgcmVzb3VyY2VzLCBkYXRhYmFzZXMsIHN5c3RlbSBzZXJ2aWNlcy4KKyAgICAgKiBAcGFyYW0gcmVwb3J0ZXIgYSBSZXBvcnRlciB0byBzZW5kIGVycm9ycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgUHJvYmxlbVJlcG9ydGVyIHJlcG9ydGVyKSB7CisgICAgICAgIFV0aWxzLmwoIkV4ZWN1dGluZyBhIGJhdGNoIG9mIGFjdGlvbnMiKTsKKyAgICAgICAgUXVldWU8QWN0aW9uPiByZW1haW5pbmdBY3Rpb25zID0gbUFjdGlvbnM7CisgICAgICAgIHdoaWxlICghcmVtYWluaW5nQWN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjdGlvbiBhID0gcmVtYWluaW5nQWN0aW9ucy5wb2xsKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGEuZXhlY3V0ZShjb250ZXh0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVwb3J0ZXIpCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnJlcG9ydChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0Fzc2V0RmlsZUFkZHJlc3MuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0Fzc2V0RmlsZUFkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJiNTlmCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQXNzZXRGaWxlQWRkcmVzcy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBJbW11dGFibGUgY2xhc3MgdG8gaG9sZCB0aGUgYWRkcmVzcyBvZiBhbiBhc3NldC4KKyAqIEFzIG9wcG9zZWQgdG8gYSBub3JtYWwgZmlsZSwgYW4gYXNzZXQgaXMgdXN1YWxseSByZXByZXNlbnRlZCBhcyBhIGNvbnRpZ3VvdXMgYnl0ZSBhcnJheSBpbgorICogdGhlIHBhY2thZ2UgZmlsZS4gT3BlbiBpdCBjb3JyZWN0bHkgdGh1cyByZXF1aXJlcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpdCBpcyBpbiwgYnV0CisgKiBhbHNvIHRoZSBvZmZzZXQgaW4gdGhlIGZpbGUgYW5kIHRoZSBsZW5ndGggb2YgdGhpcyBkYXRhLiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGVzZSB0aHJlZS4KKyAqLworZmluYWwgY2xhc3MgQXNzZXRGaWxlQWRkcmVzcyB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBtRmlsZW5hbWU7CisgICAgcHVibGljIGZpbmFsIGxvbmcgbU9mZnNldDsKKyAgICBwdWJsaWMgZmluYWwgbG9uZyBtTGVuZ3RoOworCisgICAgcHVibGljIEFzc2V0RmlsZUFkZHJlc3MoZmluYWwgU3RyaW5nIGZpbGVuYW1lLCBmaW5hbCBsb25nIG9mZnNldCwgZmluYWwgbG9uZyBsZW5ndGgpIHsKKyAgICAgICAgbUZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgYW4gQXNzZXRGaWxlQWRkcmVzcy4gVGhpcyBtYXkgcmV0dXJuIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MsIG9yIG51bGwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZUFkZHJlc3MgbWFrZUZyb21GaWxlTmFtZShmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gZmlsZW5hbWUpIHJldHVybiBudWxsOworICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisgICAgICAgIGlmICghZi5pc0ZpbGUoKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlQWRkcmVzcyhmaWxlbmFtZSwgMGwsIGYubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIGFuIEFzc2V0RmlsZUFkZHJlc3MuIFRoaXMgbWF5IHJldHVybiBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoLgorICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MsIG9yIG51bGwgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZUFkZHJlc3MgbWFrZUZyb21GaWxlTmFtZUFuZE9mZnNldChmaW5hbCBTdHJpbmcgZmlsZW5hbWUsCisgICAgICAgICAgICBmaW5hbCBsb25nIG9mZnNldCwgZmluYWwgbG9uZyBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gZmlsZW5hbWUpIHJldHVybiBudWxsOworICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisgICAgICAgIGlmICghZi5pc0ZpbGUoKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlQWRkcmVzcyhmaWxlbmFtZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0JhZEZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQmFkRm9ybWF0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwOTBkZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0JhZEZvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIG1ldGFkYXRhIGZvciB0aGUgZGljdGlvbmFyeSBkb2VzIG5vdCBjb21wbHkgdG8gYSBrbm93biBmb3JtYXQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCYWRGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIHB1YmxpYyBCYWRGb3JtYXRFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIEJhZEZvcm1hdEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Db21tb25QcmVmZXJlbmNlcy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tbW9uUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI3ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tbW9uUHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorICogb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uUHJlZmVyZW5jZXMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fUFJFRkVSRU5DRVNfTkFNRSA9ICJMYXRpbkltZURpY3RQcmVmcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIFNoYXJlZFByZWZlcmVuY2VzIGdldENvbW1vblByZWZlcmVuY2VzKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhDT01NT05fUFJFRkVSRU5DRVNfTkFNRSwgQ29udGV4dC5NT0RFX1dPUkxEX1JFQURBQkxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlKGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzIHByZWYsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gcHJlZi5lZGl0KCk7CisgICAgICAgIGVkaXRvci5wdXRCb29sZWFuKGlkLCB0cnVlKTsKKyAgICAgICAgZWRpdG9yLmFwcGx5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGUoZmluYWwgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZiwgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgIGZpbmFsIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBwcmVmLmVkaXQoKTsKKyAgICAgICAgZWRpdG9yLnB1dEJvb2xlYW4oaWQsIGZhbHNlKTsKKyAgICAgICAgZWRpdG9yLmFwcGx5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tcGxldGVkRG93bmxvYWRJbmZvLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Db21wbGV0ZWREb3dubG9hZEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE5ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svQ29tcGxldGVkRG93bmxvYWRJbmZvLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXI7CisKKy8qKgorICogU3RydWN0IGNsYXNzIHRvIGVuY2Fwc3VsYXRlIHRoZSByZXN1bHQgb2YgYSBjb21wbGV0ZWQgZG93bmxvYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wbGV0ZWREb3dubG9hZEluZm8geworICAgIGZpbmFsIFN0cmluZyBtVXJpOworICAgIGZpbmFsIGxvbmcgbURvd25sb2FkSWQ7CisgICAgZmluYWwgaW50IG1TdGF0dXM7CisgICAgcHVibGljIENvbXBsZXRlZERvd25sb2FkSW5mbyhmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBsb25nIGRvd25sb2FkSWQsIGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgbURvd25sb2FkSWQgPSBkb3dubG9hZElkOworICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiB3YXNTdWNjZXNzZnVsKCkgeworICAgICAgICByZXR1cm4gRG93bmxvYWRNYW5hZ2VyLlNUQVRVU19TVUNDRVNTRlVMID09IG1TdGF0dXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVByb3ZpZGVyLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlVyaU1hdGNoZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXIgZm9yIGRpY3Rpb25hcmllcy4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGEgQ29udGVudFByb3ZpZGVyIGV4cG9zaW5nIGFsbCBhdmFpbGFibGUgZGljdGlvbmFyeSBkYXRhIGFzIG1hbmFnZWQgYnkKKyAqIHRoZSBkaWN0aW9uYXJ5IHBhY2suCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5UHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBEaWN0aW9uYXJ5UHJvdmlkZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLy8gQXV0aG9yaXR5IGFuZCBVUkkgbWF0Y2hpbmcgZm9yIHRoZSBDb250ZW50UHJvdmlkZXIgcHJvdG9jb2wuCisgICAgLy8gVE9ETzogZmluZCBzb21lIHdheSB0byBmYWN0b3JpemUgdGhpcyBzdHJpbmcgd2l0aCB0aGUgb25lIGluIHRoZSByZXNvdXJjZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suYW9zcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVCArICI6Ly8iICsgQVVUSE9SSVRZKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX01BWV9QUk9NUFRfVVNFUiA9ICJtYXlQcm9tcHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfVFJVRSA9ICJ0cnVlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX0RFTEVURV9SRVNVTFQgPSAicmVzdWx0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUEFSQU1FVEVSX1NVQ0NFU1MgPSAic3VjY2VzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9GQUlMVVJFID0gImZhaWx1cmUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9QUk9UT0NPTF9WRVJTSU9OID0gInByb3RvY29sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fTUFUQ0ggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1QgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YxX0RJQ1RfSU5GTyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQ1RJT05BUllfVjJfTUVUQURBVEEgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1QgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJQ1RJT05BUllfVjJfREFUQUZJTEUgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc1VyaU1hdGNoZXJWMSA9IG5ldyBVcmlNYXRjaGVyKE5PX01BVENIKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNVcmlNYXRjaGVyVjIgPSBuZXcgVXJpTWF0Y2hlcihOT19NQVRDSCk7CisgICAgc3RhdGljCisgICAgeworICAgICAgICBzVXJpTWF0Y2hlclYxLmFkZFVSSShBVVRIT1JJVFksICJsaXN0IiwgRElDVElPTkFSWV9WMV9XSE9MRV9MSVNUKTsKKyAgICAgICAgc1VyaU1hdGNoZXJWMS5hZGRVUkkoQVVUSE9SSVRZLCAiKiIsIERJQ1RJT05BUllfVjFfRElDVF9JTkZPKTsKKyAgICAgICAgc1VyaU1hdGNoZXJWMi5hZGRVUkkoQVVUSE9SSVRZLCAiKi9tZXRhZGF0YSIsIERJQ1RJT05BUllfVjJfTUVUQURBVEEpOworICAgICAgICBzVXJpTWF0Y2hlclYyLmFkZFVSSShBVVRIT1JJVFksICIqL2xpc3QiLCBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1QpOworICAgICAgICBzVXJpTWF0Y2hlclYyLmFkZFVSSShBVVRIT1JJVFksICIqL2RpY3QvKiIsIERJQ1RJT05BUllfVjJfRElDVF9JTkZPKTsKKyAgICAgICAgc1VyaU1hdGNoZXJWMi5hZGRVUkkoQVVUSE9SSVRZLCAiKi9kYXRhZmlsZS8qIiwgRElDVElPTkFSWV9WMl9EQVRBRklMRSk7CisgICAgfQorCisgICAgLy8gTUlNRSB0eXBlcyBmb3IgZGljdGlvbmFyeSBhbmQgZGljdGlvbmFyeSBsaXN0LCBhcyByZXF1aXJlZCBieSBDb250ZW50UHJvdmlkZXIgY29udHJhY3QuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVF9MSVNUX01JTUVfVFlQRSA9CisgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vdm5kLmdvb2dsZS5kaWN0aW9uYXJ5bGlzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVF9EQVRBRklMRV9NSU1FX1RZUEUgPQorICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5nb29nbGUuZGljdGlvbmFyeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DQVRFR09SWV9TRVBBUkFUT1IgPSAiOiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdEluZm8geworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1JZDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtTG9jYWxlOworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1NYXRjaExldmVsOworICAgICAgICBwdWJsaWMgV29yZExpc3RJbmZvKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgU3RyaW5nIGxvY2FsZSwgZmluYWwgaW50IG1hdGNoTGV2ZWwpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICAgICAgbUxvY2FsZSA9IGxvY2FsZTsKKyAgICAgICAgICAgIG1NYXRjaExldmVsID0gbWF0Y2hMZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3Vyc29yIGZvciByZXR1cm5pbmcgYSBsaXN0IG9mIGZpbGUgaWRzIGZyb20gYSBMaXN0IG9mIHN0cmluZ3MuCisgICAgICoKKyAgICAgKiBUaGlzIHNpbXVsYXRlcyBvbmx5IHRoZSBuZWNlc3NhcnkgbWV0aG9kcy4gSXQgaGFzIG5vIGVycm9yIGhhbmRsaW5nIHRvIHNwZWFrIG9mLAorICAgICAqIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGV2ZXJ5dGhpbmcgYSBkYXRhYmFzZSBkb2VzLCBvbmx5IGEgZmV3IHNlbGVjdCBuZWNlc3NhcnkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVBhdGhDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdEN1cnNvciB7CisKKyAgICAgICAgLy8gQ29sdW1uIG5hbWVzIGZvciB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoaXMgY29udGVudCBwcm92aWRlci4KKyAgICAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXMgPSB7ICJpZCIsICJsb2NhbGUiIH07CisKKyAgICAgICAgLy8gVGhlIGxpc3Qgb2Ygd29yZCBsaXN0cyBzZXJ2ZWQgYnkgdGhpcyBwcm92aWRlciB0aGF0IG1hdGNoIHRoZSBjbGllbnQgcmVxdWVzdC4KKyAgICAgICAgZmluYWwgV29yZExpc3RJbmZvW10gbVdvcmRMaXN0czsKKyAgICAgICAgLy8gTm90ZSA6IHRoZSBjdXJzb3IgYWxzbyB1c2VzIG1Qb3MsIHdoaWNoIGlzIGRlZmluZWQgaW4gQWJzdHJhY3RDdXJzb3IuCisKKyAgICAgICAgcHVibGljIFJlc291cmNlUGF0aEN1cnNvcihmaW5hbCBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gd29yZExpc3RzKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0aW5nIGEgMC1zaXplIFdvcmRMaXN0SW5mbyBoZXJlIGFsbG93cyB0aGUgdG9BcnJheSgpIG1ldGhvZAorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlIGhhdmUgYSBzdHJvbmdseS10eXBlZCBhcnJheS4gSXQncyB0aHJvd24gb3V0LiBUaGF0J3MKKyAgICAgICAgICAgIC8vIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gb2YgI3RvQXJyYXkgc2F5cyB0byBkbyBpbiBvcmRlciB0byBnZXQgYQorICAgICAgICAgICAgLy8gbmV3IHN0cm9uZ2x5IHR5cGVkIGFycmF5IG9mIHRoZSBjb3JyZWN0IHNpemUuCisgICAgICAgICAgICBtV29yZExpc3RzID0gd29yZExpc3RzLnRvQXJyYXkobmV3IFdvcmRMaXN0SW5mb1swXSk7CisgICAgICAgICAgICBtUG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uTmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtV29yZExpc3RzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uKSB7IHJldHVybiAwOyB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHNob3J0IGdldFNob3J0KGludCBjb2x1bW4pIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbikgeyByZXR1cm4gMDsgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhmaW5hbCBpbnQgY29sdW1uKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbikgeworICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG1Xb3JkTGlzdHNbbVBvc10ubUlkOworICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1Xb3JkTGlzdHNbbVBvc10ubUxvY2FsZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGZpbmFsIGludCBjb2x1bW4pIHsKKyAgICAgICAgICAgIGlmIChtUG9zID49IG1Xb3JkTGlzdHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW4gIT0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF0Y2hVcmkoZmluYWwgVXJpIHVyaSkgeworICAgICAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gMTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3RvY29sVmVyc2lvbkFyZyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfUFJPVE9DT0xfVkVSU0lPTik7CisgICAgICAgIGlmICgiMiIuZXF1YWxzKHByb3RvY29sVmVyc2lvbkFyZykpIHByb3RvY29sVmVyc2lvbiA9IDI7CisgICAgICAgIHN3aXRjaCAocHJvdG9jb2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBzVXJpTWF0Y2hlclYxLm1hdGNoKHVyaSk7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBzVXJpTWF0Y2hlclYyLm1hdGNoKHVyaSk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fTUFUQ0g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoZmluYWwgVXJpIHVyaSkgeworICAgICAgICBpbnQgcHJvdG9jb2xWZXJzaW9uID0gMTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3RvY29sVmVyc2lvbkFyZyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfUFJPVE9DT0xfVkVSU0lPTik7CisgICAgICAgIGlmICgiMiIuZXF1YWxzKHByb3RvY29sVmVyc2lvbkFyZykpIHByb3RvY29sVmVyc2lvbiA9IDI7CisgICAgICAgIHN3aXRjaCAocHJvdG9jb2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBudWxsOyAvLyBJbiBwcm90b2NvbCAxLCB0aGUgY2xpZW50IElEIGlzIGFsd2F5cyBudWxsLgorICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhbiBVcmkKKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNnZXRUeXBlKGFuZHJvaWQubmV0LlVyaSkKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgY29udGVudCB0aGUgdHlwZSBvZiB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgTUlNRSB0eXBlLCBvciBudWxsIGlmIHRoZSBVUkwgaXMgbm90IHJlY29nbml6ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGZpbmFsIFVyaSB1cmkpIHsKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkFza2VkIGZvciB0eXBlIG9mIDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgIGZpbmFsIGludCBtYXRjaCA9IG1hdGNoVXJpKHVyaSk7CisgICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKKyAgICAgICAgICAgIGNhc2UgTk9fTUFUQ0g6IHJldHVybiBudWxsOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfRElDVF9JTkZPOgorICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfRElDVF9JTkZPOiByZXR1cm4gRElDVF9MSVNUX01JTUVfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWV9WMl9EQVRBRklMRTogcmV0dXJuIERJQ1RfREFUQUZJTEVfTUlNRV9UWVBFOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgcHJvdmlkZXIgZm9yIGRpY3Rpb25hcnkgZmlsZXMuCisgICAgICoKKyAgICAgKiBUaGlzIHZlcnNpb24gZGlzcGF0Y2hlcyB0aGUgcXVlcnkgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGZvdW5kIGluIHRoZQorICAgICAqID9wcm90b2NvbD0gcXVlcnkgcGFyYW1ldGVyLiBJZiBhYnNlbnQgb3Igbm90IHdlbGwtZm9ybWVkLCBpdCBkZWZhdWx0cyB0byAxLgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIGEgY29udGVudCB1cmkgKHNlZSBzVXJpTWF0Y2hlclZ7MSwyfSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBmb3IgZm9ybWF0KQorICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIGlnbm9yZWQuIEFsbCBjb2x1bW5zIGFyZSBhbHdheXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHNlbGVjdGlvbiBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNvcnRPcmRlciBpZ25vcmVkLiBUaGUgcmVzdWx0cyBhcmUgYWx3YXlzIHJldHVybmVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisgICAgICogQHJldHVybiBhIGN1cnNvciBtYXRjaGluZyB0aGUgdXJpLCBvciBudWxsIGlmIHRoZSBVUkkgd2FzIG5vdCByZWNvZ25pemVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nW10gcHJvamVjdGlvbiwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKKyAgICAgICAgVXRpbHMubCgiVXJpID0iLCB1cmkpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiUXVlcnkgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gZ2V0Q2xpZW50SWQodXJpKTsKKyAgICAgICAgZmluYWwgaW50IG1hdGNoID0gbWF0Y2hVcmkodXJpKTsKKyAgICAgICAgc3dpdGNoIChtYXRjaCkgeworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YxX1dIT0xFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfV0hPTEVfTElTVDoKKyAgICAgICAgICAgICAgICBmaW5hbCBDdXJzb3IgYyA9IE1ldGFkYXRhRGJIZWxwZXIucXVlcnlEaWN0aW9uYXJpZXMoZ2V0Q29udGV4dCgpLCBjbGllbnRJZCk7CisgICAgICAgICAgICAgICAgVXRpbHMubCgiTGlzdCBvZiBkaWN0aW9uYXJpZXMgd2l0aCBjb3VudCIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJldHVybmVkIGEgbGlzdCBvZiAiICsgYy5nZXRDb3VudCgpICsgIiBpdGVtcyIsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTzoKKyAgICAgICAgICAgICAgICAvLyBJbiBwcm90b2NvbCB2ZXJzaW9uIDIsIHdlIHJldHVybiBudWxsIGlmIHRoZSBjbGllbnQgaXMgdW5rbm93bi4gT3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gd2UgYmVoYXZlIGV4YWN0bHkgbGlrZSBmb3IgcHJvdG9jb2wgMS4KKyAgICAgICAgICAgICAgICBpZiAoIU1ldGFkYXRhRGJIZWxwZXIuaXNDbGllbnRLbm93bihnZXRDb250ZXh0KCksIGNsaWVudElkKSkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfRElDVF9JTkZPOgorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgICAgICAgICAgICAgLy8gSWYgTGF0aW5JTUUgZG9lcyBub3QgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yIHRoaXMgbG9jYWxlIGF0IGFsbCwgaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIHNlbmQgdXMgdHJ1ZSBmb3IgdGhpcyB2YWx1ZS4gSW4gdGhpcyBjYXNlLCB3ZSBtYXkgcHJvbXB0IHRoZSB1c2VyIGZvcgorICAgICAgICAgICAgICAgIC8vIGEgZGVjaXNpb24gYWJvdXQgZG93bmxvYWRpbmcgYSBkaWN0aW9uYXJ5IGV2ZW4gb3ZlciBhIG1ldGVyZWQgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWF5UHJvbXB0VmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKFFVRVJZX1BBUkFNRVRFUl9NQVlfUFJPTVBUX1VTRVIpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbWF5UHJvbXB0ID0gUVVFUllfUEFSQU1FVEVSX1RSVUUuZXF1YWxzKG1heVByb21wdFZhbHVlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gZGljdEZpbGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpY3Rpb25hcnlXb3JkTGlzdHNGb3JMb2NhbGUoY2xpZW50SWQsIGxvY2FsZSwgbWF5UHJvbXB0KTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGNsaWVudElkIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5U2VydmljZS51cGRhdGVOb3dJZk5vdFVwZGF0ZWRJbkFWZXJ5TG9uZ1RpbWUoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBkaWN0RmlsZXMgJiYgZGljdEZpbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJldHVybmVkICIgKyBkaWN0RmlsZXMuc2l6ZSgpICsgIiBmaWxlcyIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUGF0aEN1cnNvcihkaWN0RmlsZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJObyBkaWN0aW9uYXJ5IGZpbGVzIGZvciB0aGlzIFVSTCIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUGF0aEN1cnNvcihDb2xsZWN0aW9ucy48V29yZExpc3RJbmZvPmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBWMl9NRVRBREFUQSBhbmQgVjJfREFUQUZJTEUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHF1ZXJ5KCkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgd29yZGxpc3QgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgd29yZGxpc3QgSUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQKKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgSUQgb2YgdGhlIHdvcmRsaXN0IGZvciB3aGljaCB0byBnZXQgdGhlIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIHdvcmRsaXN0IElELCBvciBudWxsIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzIGdldFdvcmRsaXN0TWV0YWRhdGFGb3JXb3JkbGlzdElkKGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkKSB7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdvcmRsaXN0SWQpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuIE1ldGFkYXRhRGJIZWxwZXIuZ2V0SW5zdGFsbGVkT3JEZWxldGluZ1dvcmRMaXN0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZCgKKyAgICAgICAgICAgICAgICBkYiwgd29yZGxpc3RJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW4gYXNzZXQgZmlsZSBmb3IgYW4gVVJJLgorICAgICAqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nKX0gb3IKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW0oVXJpKX0gZnJvbSBhIGNsaWVudCByZXF1ZXN0aW5nIGEKKyAgICAgKiBkaWN0aW9uYXJ5LgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKQorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRoZSBmaWxlIGlzIGZvci4KKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSB0byByZWFkIHRoZSBmaWxlLiBNVVNUIGJlICJyIiBmb3IgcmVhZG9ubHkuCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb3IgaWYgbW9kZSBpcyBub3QgZXF1YWxzIHRvICJyIi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBtb2RlKSB7CisgICAgICAgIGlmIChudWxsID09IG1vZGUgfHwgISJyIi5lcXVhbHMobW9kZSkpIHJldHVybiBudWxsOworCisgICAgICAgIGZpbmFsIGludCBtYXRjaCA9IG1hdGNoVXJpKHVyaSk7CisgICAgICAgIGlmIChESUNUSU9OQVJZX1YxX0RJQ1RfSU5GTyAhPSBtYXRjaCAmJiBESUNUSU9OQVJZX1YyX0RBVEFGSUxFICE9IG1hdGNoKSB7CisgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCBVUkkgZm9yIG9wZW5Bc3NldEZpbGUKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuc3VwcG9ydGVkIFVSSSBmb3Igb3BlbkFzc2V0RmlsZSA6ICIgKyB1cmkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IGdldENsaWVudElkKHVyaSk7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgd29yZExpc3QgPSBnZXRXb3JkbGlzdE1ldGFkYXRhRm9yV29yZGxpc3RJZChjbGllbnRJZCwgd29yZGxpc3RJZCk7CisKKyAgICAgICAgaWYgKG51bGwgPT0gd29yZExpc3QpIHJldHVybiBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzID0gd29yZExpc3QuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJldHVybiBhbiBlbXB0eSBmaWxlIChSLnJhdy5lbXB0eSBwb2ludHMgYXQgYW4gZW1wdHkgZGljdGlvbmFyeSkKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGhvdyB3ZSAiZGVsZXRlIiB0aGUgZmlsZXMuIEl0IGFsbG93cyBBbmRyb2lkIEtleWJvYXJkIHRvIGZha2UgZGVsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIGRlZmF1bHQgZGljdGlvbmFyeSAtIHdoaWNoIGlzIGFjdHVhbGx5IGluIGl0cyBhc3NldHMgYW5kIGNhbid0IGJlIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQuCisgICAgICAgICAgICAgICAgZmluYWwgQXNzZXRGaWxlRGVzY3JpcHRvciBhZmQgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQoCisgICAgICAgICAgICAgICAgICAgICAgICBSLnJhdy5lbXB0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFmZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yZExpc3QuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IGdldENvbnRleHQoKS5nZXRGaWxlU3RyZWFtUGF0aChsb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Iub3BlbihmLCBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1JFQURfT05MWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgMCwgcGZkLmdldFN0YXRTaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gTm8gZmlsZSA6IGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIG51bGwKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWV0YWRhdGEgYW5kIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgZGljdGlvbmFyaWVzIGZvciBhIGdpdmVuIGxvY2FsZS4KKyAgICAgKgorICAgICAqIFdvcmQgbGlzdCBJRHMgYXJlIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtIGNhdGVnb3J5Om1hbnVhbF9pZC4gVGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNlbGVjdCBvbmx5IG9uZSB3b3JkIGxpc3QgZm9yIGVhY2ggY2F0ZWdvcnk6IHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYworICAgICAqIGxvY2FsZSBtYXRjaGluZyB0aGUgbG9jYWxlIHNwZWNpZmllZCBpbiB0aGUgVVJJLiBUaGUgbWFudWFsIGlkIHNlcnZlcyBvbmx5IHRvCisgICAgICogZGlzdGluZ3Vpc2ggYSB3b3JkIGxpc3QgZnJvbSBhbm90aGVyIGZvciB0aGUgcHVycG9zZSBvZiB1cGRhdGluZywgYW5kIGlzIGFyYml0cmFyeQorICAgICAqIGJ1dCBtYXkgbm90IGNvbnRhaW4gYSBjb2xvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgSUQgb2YgdGhlIGNsaWVudCByZXF1ZXN0aW5nIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGZvciB3aGljaCB3ZSB3YW50IHRoZSBsaXN0LCBhcyBhIFN0cmluZworICAgICAqIEBwYXJhbSBtYXlQcm9tcHQgdHJ1ZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGFyYml0cmF0aW9uIHZpYSBub3RpZmljYXRpb24KKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBpZHMuIEl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwsIGJ1dCBtYXkgYmUgZW1wdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFdvcmRMaXN0SW5mbz4gZ2V0RGljdGlvbmFyeVdvcmRMaXN0c0ZvckxvY2FsZShmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlLCBmaW5hbCBib29sZWFuIG1heVByb21wdCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIEN1cnNvciByZXN1bHRzID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLnF1ZXJ5SW5zdGFsbGVkT3JEZWxldGluZ09yQXZhaWxhYmxlRGljdGlvbmFyeU1ldGFkYXRhKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJZCk7CisgICAgICAgIGlmIChudWxsID09IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48V29yZExpc3RJbmZvPmVtcHR5TGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFdvcmRMaXN0SW5mbz4gZGljdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdvcmRMaXN0SW5mbz4oKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZEluZGV4ID0gcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbGVJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbEZpbGVOYW1lSW5kZXggPQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXNJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRzLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdElkID0gcmVzdWx0cy5nZXRTdHJpbmcoaWRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh3b3JkTGlzdElkKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHdvcmRMaXN0SWRBcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLnNwbGl0KHdvcmRMaXN0SWQsIElEX0NBVEVHT1JZX1NFUEFSQVRPUik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdENhdGVnb3J5OworICAgICAgICAgICAgICAgICAgICBpZiAoMiA9PSB3b3JkTGlzdElkQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGF0IHRoZSBjYXRlZ29yeTptYW51YWxfaWQgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgd29yZExpc3RDYXRlZ29yeSA9IHdvcmRMaXN0SWRBcnJheVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVhZCB3b3JkTGlzdElkQXJyYXlbMV0gaGVyZSwgYmVjYXVzZSBpdCdzIGlycmVsZXZhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmQgbGlzdCBzZWxlY3Rpb24gLSBpdCdzIGp1c3QgYSBuYW1lIHdlIHVzZSB0byBpZGVudGlmeSB3aGljaCBkYXRhIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGEgbmV3ZXIgdmVyc2lvbiBvZiB3aGljaCB3b3JkIGxpc3QuIFdlIGRvIGhvd2V2ZXIgcmV0dXJuIHRoZSBmdWxsIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgZm9yIGVhY2ggc2VsZWN0ZWQgd29yZCBsaXN0LCBzbyBpbiB0aGlzIHNlbnNlIHdlIGFyZSAndXNpbmcnIGl0LgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjb250YWluIGEgY29sb24sIGxpa2UgdGhlIG9sZCBmb3JtYXQgZG9lcy4gT2xkLWZvcm1hdCBJRHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBwb2ludCB0byBtYWluIGRpY3Rpb25hcmllcywgc28gd2UgZm9yY2UgdGhlIG1haW4gY2F0ZWdvcnkgdXBvbiBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRMaXN0Q2F0ZWdvcnkgPSBVcGRhdGVIYW5kbGVyLk1BSU5fRElDVElPTkFSWV9DQVRFR09SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZExpc3RMb2NhbGUgPSByZXN1bHRzLmdldFN0cmluZyhsb2NhbGVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkTGlzdExvY2FsRmlsZW5hbWUgPSByZXN1bHRzLmdldFN0cmluZyhsb2NhbEZpbGVOYW1lSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd29yZExpc3RTdGF0dXMgPSByZXN1bHRzLmdldEludChzdGF0dXNJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhlIHJlcXVlc3RlZCBsb2NhbGUgYWdhaW5zdCB0aGlzIHdvcmRsaXN0IGxvY2FsZS4gVGhlIHJlcXVlc3RlZCBsb2NhbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFzIHRvIGVpdGhlciBtYXRjaCBleGFjdGx5IG9yIGJlIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZGljdGlvbmFyeSAtIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgImVuIiB3b3VsZCBtYXRjaCBib3RoIGEgcmVxdWVzdCBmb3IgImVuIiBvciBmb3IgImVuX1VTIiwgYnV0IGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgImVuX0dCIiB3b3VsZCBub3QgbWF0Y2ggYSByZXF1ZXN0IGZvciAiZW5fVVMiLiBUaHVzIGlmIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyB0aHJlZSBvZiAiZW4iICJlbl9VUyIgYW5kICJlbl9HQiIgZGljdGlvbmFyaWVzIGFyZSBpbnN0YWxsZWQsIGEgcmVxdWVzdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gImVuX1VTIiB3b3VsZCBtYXRjaCAiZW4iIGFuZCAiZW5fVVMiLCBhbmQgYSByZXF1ZXN0IGZvciAiZW4iIG9ubHkgd291bGQgb25seQorICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgZ2VuZXJpYyAiZW4iIGRpY3Rpb25hcnkuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgTG9jYWxlVXRpbHMjZ2V0TWF0Y2hMZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1hdGNoTGV2ZWwgPSBMb2NhbGVVdGlscy5nZXRNYXRjaExldmVsKHdvcmRMaXN0TG9jYWxlLCBsb2NhbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUxvY2FsZVV0aWxzLmlzTWF0Y2gobWF0Y2hMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsb2NhbGUgb2YgdGhpcyB3b3JkbGlzdCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgbG9jYWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHdvcmRsaXN0IGFuZCBnbyB0byB0aGUgbmV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQgPT0gd29yZExpc3RTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGUgSU1FIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXZlIGl0LiBEbyBub3QgcmV0dXJuIGl0LiBIb3dldmVyLCB0aGlzIG9ubHkgYXBwbGllcyBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmQgbGlzdCBpcyBJTlNUQUxMRUQsIGZvciBpZiBpdCBpcyBERUxFVElORyB3ZSBzaG91bGQgcmV0dXJuIGl0IGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBBbmRyb2lkIEtleWJvYXJkIGNhbiBwZXJmb3JtIHRoZSBhY3R1YWwgZGVsZXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBnZXRDb250ZXh0KCkuZ2V0RmlsZVN0cmVhbVBhdGgod29yZExpc3RMb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRSA9PSB3b3JkTGlzdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxvY2FsZSBpcyB0aGUgaWQgZm9yIHRoZSBtYWluIGRpY3Rpb25hcnkuCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVIYW5kbGVyLmluc3RhbGxJZk5ldmVyUmVxdWVzdGVkKGNvbnRleHQsIGNsaWVudElkLCB3b3JkTGlzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXlQcm9tcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RJbmZvIGN1cnJlbnRCZXN0TWF0Y2ggPSBkaWN0cy5nZXQod29yZExpc3RDYXRlZ29yeSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRCZXN0TWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjdXJyZW50QmVzdE1hdGNoLm1NYXRjaExldmVsIDwgbWF0Y2hMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGljdHMucHV0KHdvcmRMaXN0Q2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3JkTGlzdEluZm8od29yZExpc3RJZCwgd29yZExpc3RMb2NhbGUsIG1hdGNoTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdHMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdHMuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRpY3RzLnZhbHVlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgdGhlIGZpbGUgcG9pbnRlZCBieSBVcmksIGFzIHJldHVybmVkIGJ5IG9wZW5Bc3NldEZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdGhlIGZpbGUgaXMgZm9yLgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gaWdub3JlZAorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIGlnbm9yZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgZGVsZXRlZCAoMCBvciAxIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNkZWxldGUoVXJpLCBTdHJpbmcsIFN0cmluZ1tdKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgbWF0Y2ggPSBtYXRjaFVyaSh1cmkpOworICAgICAgICBpZiAoRElDVElPTkFSWV9WMV9ESUNUX0lORk8gPT0gbWF0Y2ggfHwgRElDVElPTkFSWV9WMl9EQVRBRklMRSA9PSBtYXRjaCkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZURhdGFGaWxlKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERJQ1RJT05BUllfVjJfTUVUQURBVEEgPT0gbWF0Y2gpIHsKKyAgICAgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLmRlbGV0ZUNsaWVudChnZXRDb250ZXh0KCksIGdldENsaWVudElkKHVyaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBVbnN1cHBvcnRlZCBVUkkgZm9yIGRlbGV0ZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVEYXRhRmlsZShmaW5hbCBVcmkgdXJpKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQgPSBnZXRDbGllbnRJZCh1cmkpOworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHdvcmRMaXN0ID0gZ2V0V29yZGxpc3RNZXRhZGF0YUZvcldvcmRsaXN0SWQoY2xpZW50SWQsIHdvcmRsaXN0SWQpOworICAgICAgICBpZiAobnVsbCA9PSB3b3JkTGlzdCkgcmV0dXJuIDA7CisgICAgICAgIGZpbmFsIGludCBzdGF0dXMgPSB3b3JkTGlzdC5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSB3b3JkTGlzdC5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTik7CisgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORyA9PSBzdGF0dXMpIHsKKyAgICAgICAgICAgIFVwZGF0ZUhhbmRsZXIubWFya0FzRGVsZXRlZChnZXRDb250ZXh0KCksIGNsaWVudElkLCB3b3JkbGlzdElkLCB2ZXJzaW9uLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVEID09IHN0YXR1cykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfREVMRVRFX1JFU1VMVCk7CisgICAgICAgICAgICBpZiAoUVVFUllfUEFSQU1FVEVSX0ZBSUxVUkUuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBVcGRhdGVIYW5kbGVyLm1hcmtBc0Jyb2tlbihnZXRDb250ZXh0KCksIGNsaWVudElkLCB3b3JkbGlzdElkLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbEZpbGVuYW1lID0KKyAgICAgICAgICAgICAgICAgICAgd29yZExpc3QuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgRmlsZSBmID0gZ2V0Q29udGV4dCgpLmdldEZpbGVTdHJlYW1QYXRoKGxvY2FsRmlsZW5hbWUpOworICAgICAgICAgICAgLy8gZi5kZWxldGUoKSByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmIChmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXR0ZW1wdCB0byBkZWxldGUgYSBmaWxlIHdob3NlIHN0YXR1cyBpcyAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0IGRhdGEgaW50byB0aGUgcHJvdmlkZXIuIE1heSBiZSBlaXRoZXIgYSBtZXRhZGF0YSBzb3VyY2UgVVJMIG9yIHNvbWUgZGljdGlvbmFyeSBpbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgZGVzaWduYXRlZCBjb250ZW50IFVSSS4gU2VlIHNVcmlNYXRjaGVyVnsxLDJ9IGZvciBhdmFpbGFibGUgVVJJcy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0IGZvciB0aGlzIGNvbnRlbnQgdXJpCisgICAgICogQHJldHVybiB0aGUgVVJJIGZvciB0aGUgbmV3bHkgaW5zZXJ0ZWQgaXRlbS4gTWF5IGJlIG51bGwgaWYgYXJndW1lbnRzIGRvbid0IGFsbG93IGZvciBpbnNlcnQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChmaW5hbCBVcmkgdXJpLCBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IHVyaSB8fCBudWxsID09IHZhbHVlcykgcmV0dXJuIG51bGw7IC8vIFNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGxldCdzIGJlIHNhZmUKKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkluc2VydCwgdXJpID0gIiArIHVyaS50b1N0cmluZygpLCB0aGlzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gZ2V0Q2xpZW50SWQodXJpKTsKKyAgICAgICAgc3dpdGNoIChtYXRjaFVyaSh1cmkpKSB7CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjJfTUVUQURBVEE6CisgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlcyBzaG91bGQgY29udGFpbiBhIHZhbGlkIGNsaWVudCBJRCBhbmQgYSB2YWxpZCBVUkkgZm9yIHRoZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xpZW50IElEIG1heSBub3QgYmUgbnVsbCwgbm9yIG1heSBpdCBiZSBlbXB0eSBiZWNhdXNlIHRoZSBlbXB0eSBjbGllbnQgSUQKKyAgICAgICAgICAgICAgICAvLyBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgorICAgICAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBVUkkgbWF5IG5vdCBiZSBudWxsLCBidXQgaXQgbWF5IGJlIGVtcHR5IGlmIHRoZSBjbGllbnQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAvLyB3YW50IHRoZSBkaWN0aW9uYXJ5IHBhY2sgdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBhdXRvbWF0aWNhbGx5LgorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIudXBkYXRlQ2xpZW50SW5mbyhnZXRDb250ZXh0KCksIGNsaWVudElkLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESUNUSU9OQVJZX1YyX0RJQ1RfSU5GTzoKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIG5ld0RpY3Rpb25hcnlNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZExpc3RNZXRhZGF0YS5jcmVhdGVGcm9tQ29udGVudFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuY29tcGxldGVXaXRoRGVmYXVsdFZhbHVlcyh2YWx1ZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkJhdGNoLk1hcmtQcmVJbnN0YWxsZWRBY3Rpb24oY2xpZW50SWQsIG5ld0RpY3Rpb25hcnlNZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZShnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEJhZEZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5zZXJ0IHRoaXMgZGljdGlvbmFyeSAiICsgdmFsdWVzLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJQ1RJT05BUllfVjFfV0hPTEVfTElTVDoKKyAgICAgICAgICAgIGNhc2UgRElDVElPTkFSWV9WMV9ESUNUX0lORk86CisgICAgICAgICAgICAgICAgUHJpdmF0ZUxvZy5sb2coIkF0dGVtcHQgdG8gaW5zZXJ0IDogIiArIHVyaSwgdGhpcyk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkluc2VydGlvbiBpbiB0aGUgZGljdGlvbmFyeSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRpbmcgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3VwZGF0ZShVcmksIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI2luc2VydChVcmksIENvbnRlbnRWYWx1ZXMpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoZmluYWwgVXJpIHVyaSwgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBQcml2YXRlTG9nLmxvZygiQXR0ZW1wdCB0byB1cGRhdGUgOiAiICsgdXJpLCB0aGlzKTsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVcGRhdGluZyBkaWN0aW9uYXJ5IHdvcmRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2VydmljZS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE3ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIFNlcnZpY2UgdGhhdCBoYW5kbGVzIGJhY2tncm91bmQgdGFza3MgZm9yIHRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyLgorICoKKyAqIFRoaXMgc2VydmljZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb25zIGRvbmUgYnkgdGhlCisgKiBkaWN0aW9uYXJ5IHByb3ZpZGVyLiBUaG9zZSBpbmNsdWRlOgorICogLSBDaGVja2luZyBmb3IgdGhlIGxhc3QgdXBkYXRlIGRhdGUgYW5kIHNjaGVkdWxpbmcgdGhlIG5leHQgdXBkYXRlLiBUaGlzIHJ1bnMgZXZlcnkKKyAqICAgZGF5IGFyb3VuZCBtaWRuaWdodCwgdXBvbiByZWNlcHRpb24gb2YgdGhlIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OIGJyb2FkY2FzdC4KKyAqICAgRXZlcnkgZm91ciBkYXlzLCBpdCBzY2hlZHVsZXMgYW4gdXBkYXRlIG9mIHRoZSBtZXRhZGF0YSB3aXRoIHRoZSBhbGFybSBtYW5hZ2VyLgorICogLSBJc3N1aW5nIHRoZSBvcmRlciB0byB1cGRhdGUgdGhlIG1ldGFkYXRhLiBUaGlzIHJ1bnMgZXZlcnkgZm91ciBkYXlzLCBiZXR3ZWVuIDAgYW5kCisgKiAgIDYsIHVwb24gcmVjZXB0aW9uIG9mIHRoZSBVUERBVEVfTk9XX0lOVEVOVF9BQ1RJT04gYnJvYWRjYXN0IHNlbnQgYnkgdGhlIGFsYXJtIG1hbmFnZXIKKyAqICAgYXMgYSByZXN1bHQgb2YgdGhlIGFib3ZlIGFjdGlvbi4KKyAqIC0gSGFuZGxpbmcgYSBkb3dubG9hZCB0aGF0IGp1c3QgZW5kZWQuIFRoZXNlIGNvbWUgaW4gdHdvIGZsYXZvcnM6CisgKiAgIC0gTWV0YWRhdGEgaXMgZmluaXNoZWQgZG93bmxvYWRpbmcuIFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBuZXcgZGljdGlvbmFyaWVzCisgKiAgICAgYXZhaWxhYmxlLCBhbmQgZG93bmxvYWQgdGhvc2UgdGhhdCB3ZSBuZWVkIHRoYXQgaGF2ZSBuZXcgdmVyc2lvbnMuCisgKiAgIC0gQSBkaWN0aW9uYXJ5IGZpbGUgZmluaXNoZWQgZG93bmxvYWRpbmcuIFdlIHNob3VsZCBwdXQgdGhlIGZpbGUgcmVhZHkgZm9yIGEgY2xpZW50IElNRQorICogICAgIHRvIGFjY2VzcywgYW5kIG1hcmsgdGhlIGN1cnJlbnQgc3RhdGUgYXMgc3VjaC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERpY3Rpb25hcnlTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpY3Rpb25hcnlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUsIHRvIHVzZSBpbiB0aGUgaW50ZW50IGFjdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJjb20uYW5kcm9pZC5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gb2YgdGhlIGludGVudCB0byB0ZWxsIHRoZSBkaWN0aW9uYXJ5IHByb3ZpZGVyIHRvIHVwZGF0ZSBub3cuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9OT1dfSU5URU5UX0FDVElPTiA9IFBBQ0tBR0VfTkFNRSArICIuVVBEQVRFX05PVyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0aW9uIG9mIHRoZSBkYXRlIGNoYW5naW5nLCB1c2VkIHRvIHNjaGVkdWxlIGEgcGVyaW9kaWMgZnJlc2huZXNzIGNoZWNrCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OID0KKyAgICAgICAgICAgIEludGVudC5BQ1RJT05fREFURV9DSEFOR0VEOworCisgICAgLyoqCisgICAgICogVGhlIGFjdGlvbiBvZiBkaXNwbGF5aW5nIGEgdG9hc3QgdG8gd2FybiB0aGUgdXNlciBhbiBhdXRvbWF0aWMgZG93bmxvYWQgaXMgc3RhcnRpbmcuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTiA9CisgICAgICAgICAgICBQQUNLQUdFX05BTUUgKyAiLlNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTiI7CisKKyAgICAvKioKKyAgICAgKiBBIGxvY2FsZSBhcmd1bWVudCwgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMRV9JTlRFTlRfQVJHVU1FTlQgPSAibG9jYWxlIjsKKworICAgIC8qKgorICAgICAqIEhvdyBvZnRlbiwgaW4gbWlsbGlzZWNvbmRzLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgbWV0YWRhdGEuIFRoaXMgaXMgYQorICAgICAqIGZsb29yIHZhbHVlOyBhY3R1YWxseSwgaXQgbWF5IGhhcHBlbiBzZXZlcmFsIGhvdXJzIGxhdGVyLCBvciBldmVuIG1vcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfRlJFUVVFTkNZID0gNCAqIERhdGVVdGlscy5EQVlfSU5fTUlMTElTOworCisgICAgLyoqCisgICAgICogV2UgYXJlIHdha2VkIGFyb3VuZCBtaWRuaWdodCwgbG9jYWwgdGltZS4gV2Ugd2FudCB0byB3YWtlIGJldHdlZW4gbWlkbmlnaHQgYW5kIDYgYW0sCisgICAgICogcm91Z2hseS4gU28gdXNlIGEgcmFuZG9tIHRpbWUgYmV0d2VlbiAwIGFuZCB0aGlzIGRlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQUxBUk1fREVMQVkgPSA2ICogKChpbnQpQWxhcm1NYW5hZ2VyLklOVEVSVkFMX0hPVVIpOworCisgICAgLyoqCisgICAgICogSG93IGxvbmcgd2UgY29uc2lkZXIgYSAidmVyeSBsb25nIHRpbWUiLiBJZiBubyB1cGRhdGUgdG9vayBwbGFjZSBpbiB0aGlzIHRpbWUsCisgICAgICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCB0cmlnZ2VyIGFuIHVwZGF0ZSBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFZFUllfTE9OR19USU1FID0gMTQgKiBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IHNlZW4gc3RhcnQgSWQuIFRoaXMgbXVzdCBiZSBzdG9yZWQgYmVjYXVzZSB3ZSBtdXN0IG9ubHkgY2FsbCBzdG9wU2VsZlJlc3VsdCgpIHdpdGgKKyAgICAgKiB0aGUgbGFzdCBzZWVuIElkLCBvciB0aGUgc2VydmljZSB3b24ndCBzdG9wLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1MYXN0U2VlblN0YXJ0SWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWFuZCBjb3VudC4gV2UgbmVlZCB0aGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBub3QgY2FsbCBzdG9wU2VsZlJlc3VsdCgpIHdoaWxlIHdlIHN0aWxsCisgICAgICogaGF2ZSBjb21tYW5kcyBydW5uaW5nLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1Db21tYW5kQ291bnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgbUxhc3RTZWVuU3RhcnRJZCA9IDA7CisgICAgICAgIG1Db21tYW5kQ291bnQgPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICAvLyBUaGlzIHNlcnZpY2UgY2Fubm90IGJlIGJvdW5kCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGFuIGV4cGxpY2l0IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgYXJiaXRyYXJ5IGNvbW1hbmRzIHRoYXQgYXJlIGV4ZWN1dGVkIHVwb24gcmVjZXB0aW9uIG9mIGNlcnRhaW4KKyAgICAgKiBldmVudHMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIGNvbnRleHQgb2YgdGhpcyBzZXJ2aWNlLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmRzIGFyZToKKyAgICAgKiAtIENoZWNrIGxhc3QgdXBkYXRlIHRpbWUgYW5kIHBvc3NpYmx5IHNjaGVkdWxlIGFuIHVwZGF0ZSBvZiB0aGUgZGF0YSBmb3IgbGF0ZXIuCisgICAgICogICAgIFRoaXMgaXMgdHJpZ2dlcmVkIGV2ZXJ5IGRheSwgdXBvbiByZWNlcHRpb24gb2YgdGhlIERBVEVfQ0hBTkdFRF9JTlRFTlRfQUNUSU9OIGJyb2FkY2FzdC4KKyAgICAgKiAtIFVwZGF0ZSBkYXRhIE5PVy4KKyAgICAgKiAgICAgVGhpcyBpcyBub3JtYWxseSByZWNlaXZlZCB1cG9uIHRyaWdnZXIgb2YgdGhlIHNjaGVkdWxlZCB1cGRhdGUuCisgICAgICogLSBIYW5kbGUgYSBmaW5pc2hlZCBkb3dubG9hZC4KKyAgICAgKiAgICAgVGhpcyBleGVjdXRlcyB0aGUgYWN0aW9ucyB0aGF0IG11c3QgYmUgdGFrZW4gYWZ0ZXIgYSBmaWxlIChtZXRhZGF0YSBvciBkaWN0aW9uYXJ5IGRhdGEKKyAgICAgKiAgICAgaGFzIGJlZW4gZG93bmxvYWRlZCAob3IgZmFpbGVkIHRvIGRvd25sb2FkKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBvblN0YXJ0Q29tbWFuZChmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnRJZCkgeworICAgICAgICBmaW5hbCBEaWN0aW9uYXJ5U2VydmljZSBzZWxmID0gdGhpczsKKyAgICAgICAgbUxhc3RTZWVuU3RhcnRJZCA9IHN0YXJ0SWQ7CisgICAgICAgIG1Db21tYW5kQ291bnQgKz0gMTsKKyAgICAgICAgaWYgKFNIT1dfRE9XTkxPQURfVE9BU1RfSU5URU5UX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIFVJIGFjdGlvbiwgaXQgY2FuJ3QgYmUgcnVuIGluIGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgICBzaG93U3RhcnREb3dubG9hZGluZ1RvYXN0KHRoaXMsIExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShMT0NBTEVfSU5URU5UX0FSR1VNRU5UKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgaXQncyBhIGNvbW1hbmQgdGhhdCBkb2VzIG5vdCByZXF1aXJlIFVJLCBjcmVhdGUgYSB0aHJlYWQgdG8gZG8gdGhlIHdvcmsKKyAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gcmlnaHQgYXdheS4gREFURV9DSEFOR0VEIG9yIFVQREFURV9OT1cgYXJlIGV4YW1wbGVzIG9mIHN1Y2ggY29tbWFuZHMuCisgICAgICAgICAgICBuZXcgVGhyZWFkKCJ1cGRhdGVPckZpbmlzaERvd25sb2FkIikgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hCcm9hZGNhc3Qoc2VsZiwgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLW1Db21tYW5kQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcFNlbGZSZXN1bHQobUxhc3RTZWVuU3RhcnRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgc3RvcCBvdXJzZWx2ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNlcnZpY2UuU1RBUlRfUkVERUxJVkVSX0lOVEVOVDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRpc3BhdGNoQnJvYWRjYXN0KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoREFURV9DSEFOR0VEX0lOVEVOVF9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBkYXRlIG9mIHRoZSBkZXZpY2UgY2hhbmdlcy4gVGhpcyBub3JtYWxseSBoYXBwZW5zCisgICAgICAgICAgICAvLyBhdCBtaWRuaWdodCBsb2NhbCB0aW1lLCBidXQgaXQgbWF5IGhhcHBlbiBpZiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBkYXRlCisgICAgICAgICAgICAvLyBieSBoYW5kIG9yIHNvbWV0aGluZyBzaW1pbGFyIGhhcHBlbnMuCisgICAgICAgICAgICBjaGVja1RpbWVBbmRNYXliZVNldHVwVXBkYXRlQWxhcm0oY29udGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAoVVBEQVRFX05PV19JTlRFTlRfQUNUSU9OLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAvLyBJbnRlbnQgdG8gdHJpZ2dlciBhbiB1cGRhdGUgbm93LgorICAgICAgICAgICAgVXBkYXRlSGFuZGxlci51cGRhdGUoY29udGV4dCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVXBkYXRlSGFuZGxlci5kb3dubG9hZEZpbmlzaGVkKGNvbnRleHQsIGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cHMgYW4gYWxhcm0gdG8gY2hlY2sgZm9yIHVwZGF0ZXMgaWYgYW4gdXBkYXRlIGlzIGR1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVGltZUFuZE1heWJlU2V0dXBVcGRhdGVBbGFybShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gT2YgYWxsIGNsaWVudHMsIGlmIHRoZSBvbmUgdGhhdCBoYXNuJ3QgYmVlbiB1cGRhdGVkIGZvciB0aGUgbG9uZ2VzdAorICAgICAgICAvLyBpcyBzdGlsbCBtb3JlIHJlY2VudCB0aGFuIFVQREFURV9GUkVRVUVOQ1ksIGRvIG5vdGhpbmcuCisgICAgICAgIGlmICghaXNMYXN0VXBkYXRlQXRMZWFzdFRoaXNPbGQoY29udGV4dCwgVVBEQVRFX0ZSRVFVRU5DWSkpIHJldHVybjsKKworICAgICAgICBQcml2YXRlTG9nLmxvZygiRGF0ZSBjaGFuZ2VkIC0gcmVnaXN0ZXJpbmcgYWxhcm0iLCBjb250ZXh0KTsKKyAgICAgICAgQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CisKKyAgICAgICAgLy8gQmVzdCBlZmZvcnQgdG8gd2FrZSBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCBNQVhfQUxBUk1fREVMQVkgaW4gdGhlIG1vcm5pbmcuCisgICAgICAgIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIHRvbyBtdWNoIGlmIHRoaXMgaXMgdmVyeSBpbmV4YWN0LgorICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBmaW5hbCBsb25nIGFsYXJtVGltZSA9IG5vdyArIG5ldyBSYW5kb20oKS5uZXh0SW50KE1BWF9BTEFSTV9ERUxBWSk7CisgICAgICAgIGZpbmFsIEludGVudCB1cGRhdGVJbnRlbnQgPSBuZXcgSW50ZW50KERpY3Rpb25hcnlTZXJ2aWNlLlVQREFURV9OT1dfSU5URU5UX0FDVElPTik7CisgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgdXBkYXRlSW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfQ0FOQ0VMX0NVUlJFTlQpOworCisgICAgICAgIC8vIFdlIHNldCB0aGUgYWxhcm0gaW4gdGhlIHR5cGUgdGhhdCBkb2Vzbid0IGZvcmNlZnVsbHkgd2FrZSB0aGUgZGV2aWNlCisgICAgICAgIC8vIGZyb20gc2xlZXAsIGJ1dCBmaXJlcyB0aGUgbmV4dCB0aW1lIHRoZSBkZXZpY2UgYWN0dWFsbHkgd2FrZXMgZm9yIGFueQorICAgICAgICAvLyBvdGhlciByZWFzb24uCisgICAgICAgIGlmIChudWxsICE9IGFsYXJtTWFuYWdlcikgYWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuUlRDLCBhbGFybVRpbWUsIHBlbmRpbmdJbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBsYXN0IHVwZGF0ZSBpcyBvbGRlciB0aGFuIGEgY2VydGFpbiB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IGB0aW1lJyBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIGxhc3QgdXBkYXRlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhc3RVcGRhdGVBdExlYXN0VGhpc09sZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGxvbmcgdGltZSkgeworICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBmaW5hbCBsb25nIGxhc3RVcGRhdGUgPSBNZXRhZGF0YURiSGVscGVyLmdldE9sZGVzdFVwZGF0ZVRpbWUoY29udGV4dCk7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJMYXN0IHVwZGF0ZSB3YXMgIiArIGxhc3RVcGRhdGUsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gbGFzdFVwZGF0ZSArIHRpbWUgPCBub3c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmcmVzaGVzIGRhdGEgaWYgaXQgaGFzbid0IGJlZW4gcmVmcmVzaGVkIGluIGEgdmVyeSBsb25nIHRpbWUuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIGxhc3QgdXBkYXRlIHRpbWUsIGFuZCBpZiBpdCdzIGJlZW4gbW9yZSB0aGFuIFZFUllfTE9OR19USU1FLAorICAgICAqIHVwZGF0ZSBtZXRhZGF0YSBub3cgLSBhbmQgcG9zc2libHkgdGFrZSBzdWJzZXF1ZW50IHVwZGF0ZSBhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVOb3dJZk5vdFVwZGF0ZWRJbkFWZXJ5TG9uZ1RpbWUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghaXNMYXN0VXBkYXRlQXRMZWFzdFRoaXNPbGQoY29udGV4dCwgVkVSWV9MT05HX1RJTUUpKSByZXR1cm47CisgICAgICAgIFVwZGF0ZUhhbmRsZXIudXBkYXRlKGNvbnRleHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBhIHRvYXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGFuIGF1dG9tYXRpYyBkaWN0aW9uYXJ5IGRvd25sb2FkIGlzIHN0YXJ0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2hvd1N0YXJ0RG93bmxvYWRpbmdUb2FzdChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRvYXN0VGV4dCA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudG9hc3RfZG93bmxvYWRpbmdfc3VnZ2VzdGlvbnMpLAorICAgICAgICAgICAgICAgIGxvY2FsZS5nZXREaXNwbGF5TmFtZSgpKTsKKyAgICAgICAgVG9hc3QubWFrZVRleHQoY29udGV4dCwgdG9hc3RUZXh0LCBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0FjdGl2aXR5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDE2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHk7CisKKy8qKgorICogUHJlZmVyZW5jZSBzY3JlZW4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eSBleHRlbmRzIFByZWZlcmVuY2VBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgbW9kSW50ZW50ID0gbmV3IEludGVudChzdXBlci5nZXRJbnRlbnQoKSk7CisgICAgICAgIG1vZEludGVudC5wdXRFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5ULCBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBtb2RJbnRlbnQucHV0RXh0cmEoRVhUUkFfTk9fSEVBREVSUywgdHJ1ZSk7CisgICAgICAgIC8vIEltcG9ydGFudCBub3RlIDogdGhlIG9yaWdpbmFsIGludGVudCBzaG91bGQgY29udGFpbiBhIFN0cmluZyBleHRyYSB3aXRoIHRoZSBrZXkKKyAgICAgICAgLy8gRGljdGlvbmFyeVNldHRpbmdzRnJhZ21lbnQuRElDVF9TRVRUSU5HU19GUkFHTUVOVF9DTElFTlRfSURfQVJHVU1FTlQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gZnJhZ21lbnQgY2FuIGtub3cgd2hvIHRoZSBjbGllbnQgaXMuCisgICAgICAgIHJldHVybiBtb2RJbnRlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svRGljdGlvbmFyeVNldHRpbmdzRnJhZ21lbnQuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MjZkZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0RpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2U7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUdyb3VwOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogUHJlZmVyZW5jZSBzY3JlZW4uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudCBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudAorICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUhhbmRsZXIuVXBkYXRlRXZlbnRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IERpY3Rpb25hcnlTZXR0aW5nc0ZyYWdtZW50LmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBESUNUX0xJU1RfSUQgPSAibGlzdCI7CisgICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgRElDVF9TRVRUSU5HU19GUkFHTUVOVF9DTElFTlRfSURfQVJHVU1FTlQgPSAiY2xpZW50SWQiOworCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IE1FTlVfVVBEQVRFX05PVyA9IE1lbnUuRklSU1Q7CisKKyAgICBwcml2YXRlIFZpZXcgbUxvYWRpbmdWaWV3OworICAgIHByaXZhdGUgU3RyaW5nIG1DbGllbnRJZDsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBNZW51SXRlbSBtVXBkYXRlTm93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNoYW5nZWRTZXR0aW5nczsKKworICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUNvbm5lY3Rpdml0eUNoYW5nZWRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hOZXR3b3JrU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIC8qKgorICAgICAqIEVtcHR5IGNvbnN0cnVjdG9yIGZvciBmcmFnbWVudCBnZW5lcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEaWN0aW9uYXJ5U2V0dGluZ3NGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIGZpbmFsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIGZpbmFsIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubG9hZGluZ19wYWdlLCBjb250YWluZXIsIHRydWUpOworICAgICAgICBtTG9hZGluZ1ZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmxvYWRpbmdfY29udGFpbmVyKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uQ3JlYXRlVmlldyhpbmZsYXRlciwgY29udGFpbmVyLCBzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKGZpbmFsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBtQ2xpZW50SWQgPSBhY3Rpdml0eS5nZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShESUNUX1NFVFRJTkdTX0ZSQUdNRU5UX0NMSUVOVF9JRF9BUkdVTUVOVCk7CisgICAgICAgIG1Db25uZWN0aXZpdHlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlcilhY3Rpdml0eS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5kaWN0aW9uYXJ5X3NldHRpbmdzKTsKKyAgICAgICAgcmVmcmVzaEludGVyZmFjZSgpOworICAgICAgICBzZXRIYXNPcHRpb25zTWVudSh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZU9wdGlvbnNNZW51KGZpbmFsIE1lbnUgbWVudSwgZmluYWwgTWVudUluZmxhdGVyIGluZmxhdGVyKSB7CisgICAgICAgIG1VcGRhdGVOb3dNZW51ID0gbWVudS5hZGQoTWVudS5OT05FLCBNRU5VX1VQREFURV9OT1csIDAsIFIuc3RyaW5nLmNoZWNrX2Zvcl91cGRhdGVzX25vdyk7CisgICAgICAgIG1VcGRhdGVOb3dNZW51LnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgcmVmcmVzaE5ldHdvcmtTdGF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtQ2hhbmdlZFNldHRpbmdzID0gZmFsc2U7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIucmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKHRoaXMpOworICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKENvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTik7CisgICAgICAgIGdldEFjdGl2aXR5KCkucmVnaXN0ZXJSZWNlaXZlcihtQ29ubmVjdGl2aXR5Q2hhbmdlZFJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICByZWZyZXNoTmV0d29ya1N0YXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIudW5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgICAgIGFjdGl2aXR5LnVucmVnaXN0ZXJSZWNlaXZlcihtQ29ubmVjdGl2aXR5Q2hhbmdlZFJlY2VpdmVyKTsKKyAgICAgICAgaWYgKG1DaGFuZ2VkU2V0dGluZ3MpIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVudCBuZXdEaWN0QnJvYWRjYXN0ID0gbmV3IEludGVudChVcGRhdGVIYW5kbGVyLk5FV19ESUNUSU9OQVJZX0lOVEVOVF9BQ1RJT04pOworICAgICAgICAgICAgYWN0aXZpdHkuc2VuZEJyb2FkY2FzdChuZXdEaWN0QnJvYWRjYXN0KTsKKyAgICAgICAgICAgIG1DaGFuZ2VkU2V0dGluZ3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkZWRNZXRhZGF0YShmaW5hbCBib29sZWFuIHN1Y2NlZWRlZCkgeworICAgICAgICBzdG9wTG9hZGluZ0FuaW1hdGlvbigpOworICAgICAgICBpZiAoIXN1Y2NlZWRlZCkgcmV0dXJuOyAvLyBJZiB0aGUgZG93bmxvYWQgZmFpbGVkIG5vdGhpbmcgY2hhbmdlZCwgc28gbm8gbmVlZCB0byByZWZyZXNoCisgICAgICAgIG5ldyBUaHJlYWQoInJlZnJlc2hJbnRlcmZhY2UiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoSW50ZXJmYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3b3JkTGlzdERvd25sb2FkRmluaXNoZWQoZmluYWwgU3RyaW5nIHdvcmRMaXN0SWQsIGZpbmFsIGJvb2xlYW4gc3VjY2VlZGVkKSB7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0UHJlZmVyZW5jZSBwcmVmID0gZmluZFdvcmRMaXN0UHJlZmVyZW5jZSh3b3JkTGlzdElkKTsKKyAgICAgICAgaWYgKG51bGwgPT0gcHJlZikgcmV0dXJuOworICAgICAgICAvLyBUT0RPOiBSZXBvcnQgdG8gdGhlIHVzZXIgaWYgIXN1Y2NlZWRlZAorICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGlmIChudWxsID09IGFjdGl2aXR5KSByZXR1cm47CisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZS1yZWFkIHRoZSBkYiBpbiBjYXNlIHRoZSBkZXNjcmlwdGlvbiBoYXMgY2hhbmdlZCwgYW5kIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgb3V0IHdoYXQgc3RhdGUgaXQgZW5kZWQgdXAgaWYgdGhlIGRvd25sb2FkIHdhc24ndCBzdWNjZXNzZnVsCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHJlZG8gZXZlcnl0aGluZywgb25seSByZS1yZWFkIGFuZCBzZXQgdGhpcyB3b3JkIGxpc3Qgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdvcmRMaXN0UHJlZmVyZW5jZSBmaW5kV29yZExpc3RQcmVmZXJlbmNlKGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlR3JvdXAgcHJlZlNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKG51bGwgPT0gcHJlZlNjcmVlbikgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGZpbmQgdGhlIHByZWZlcmVuY2UgZ3JvdXAiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBwcmVmU2NyZWVuLmdldFByZWZlcmVuY2VDb3VudCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2UgcHJlZiA9IHByZWZTY3JlZW4uZ2V0UHJlZmVyZW5jZShpKTsKKyAgICAgICAgICAgIGlmIChwcmVmIGluc3RhbmNlb2YgV29yZExpc3RQcmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RQcmVmZXJlbmNlIHdsUHJlZiA9IChXb3JkTGlzdFByZWZlcmVuY2UpcHJlZjsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHdsUHJlZi5tV29yZGxpc3RJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdsUHJlZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGZpbmQgdGhlIHByZWZlcmVuY2UgZm9yIGEgd29yZCBsaXN0IGlkICIgKyBpZCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUN5Y2xlQ29tcGxldGVkKCkge30KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoTmV0d29ya1N0YXRlKCkgeworICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gbUNvbm5lY3Rpdml0eU1hbmFnZXIuZ2V0QWN0aXZlTmV0d29ya0luZm8oKTsKKyAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZCA9IG51bGwgPT0gaW5mbyA/IGZhbHNlIDogaW5mby5pc0Nvbm5lY3RlZCgpOworICAgICAgICBpZiAobnVsbCAhPSBtVXBkYXRlTm93TWVudSkgbVVwZGF0ZU5vd01lbnUuc2V0RW5hYmxlZChpc0Nvbm5lY3RlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hJbnRlcmZhY2UoKSB7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgaWYgKG51bGwgPT0gYWN0aXZpdHkpIHJldHVybjsKKyAgICAgICAgZmluYWwgbG9uZyBsYXN0VXBkYXRlRGF0ZSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRMYXN0VXBkYXRlRGF0ZUZvckNsaWVudChnZXRBY3Rpdml0eSgpLCBtQ2xpZW50SWQpOworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlR3JvdXAgcHJlZlNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJlZmVyZW5jZT4gcHJlZkxpc3QgPQorICAgICAgICAgICAgICAgIGNyZWF0ZUluc3RhbGxlZERpY3RTZXR0aW5nc0NvbGxlY3Rpb24obUNsaWVudElkKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXBkYXRlTm93U3VtbWFyeSA9IGdldFN0cmluZyhSLnN0cmluZy5sYXN0X3VwZGF0ZSkgKyAiICIKKyAgICAgICAgICAgICAgICArIERhdGVVdGlscy5mb3JtYXREYXRlVGltZShhY3Rpdml0eSwgbGFzdFVwZGF0ZURhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVXRpbHMuRk9STUFUX1NIT1dfREFURSB8IERhdGVVdGlscy5GT1JNQVRfU0hPV19USU1FKTsKKworICAgICAgICBhY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGRpc3BsYXkgdGhpcyBzb21ld2hlcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgKDAgIT0gbGFzdFVwZGF0ZSkgbVVwZGF0ZU5vd1ByZWZlcmVuY2Uuc2V0U3VtbWFyeSh1cGRhdGVOb3dTdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaE5ldHdvcmtTdGF0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUFueURpY3RTZXR0aW5ncyhwcmVmU2NyZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQcmVmZXJlbmNlIHByZWZlcmVuY2UgOiBwcmVmTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZlNjcmVlbi5hZGRQcmVmZXJlbmNlKHByZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlIGNyZWF0ZUVycm9yTWVzc2FnZShmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSwgZmluYWwgaW50IG1lc3NhZ2VSZXNvdXJjZSkgeworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlIG1lc3NhZ2UgPSBuZXcgUHJlZmVyZW5jZShhY3Rpdml0eSk7CisgICAgICAgIG1lc3NhZ2Uuc2V0VGl0bGUobWVzc2FnZVJlc291cmNlKTsKKyAgICAgICAgbWVzc2FnZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFueURpY3RTZXR0aW5ncyhmaW5hbCBQcmVmZXJlbmNlR3JvdXAgcHJlZkdyb3VwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBwcmVmR3JvdXAuZ2V0UHJlZmVyZW5jZUNvdW50KCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgcHJlZkdyb3VwLnJlbW92ZVByZWZlcmVuY2UocHJlZkdyb3VwLmdldFByZWZlcmVuY2UoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFdvcmRMaXN0UHJlZmVyZW5jZSBsaXN0IHRvIGJlIGFkZGVkIHRvIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IGNyZWF0ZXMgdGhlIHByZWZlcmVuY2VzIGJ1dCBkb2VzIG5vdCBhZGQgdGhlbS4KKyAgICAgKiBUaHVzLCBpdCBjYW4gYmUgY2FsbGVkIG9uIGFub3RoZXIgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50IGZvciB3aGljaCB3ZSB3YW50IHRvIGRpc3BsYXkgdGhlIGRpY3Rpb25hcnkgbGlzdAorICAgICAqIEByZXR1cm4gQSBjb2xsZWN0aW9uIG9mIHByZWZlcmVuY2VzIHJlYWR5IHRvIGFkZCB0byB0aGUgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJlZmVyZW5jZT4gY3JlYXRlSW5zdGFsbGVkRGljdFNldHRpbmdzQ29sbGVjdGlvbigKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAvLyBUaGlzIHdpbGwgZGlyZWN0bHkgY29udGFjdCB0aGUgRGljdGlvbmFyeVByb3ZpZGVyIGFuZCByZXF1ZXN0IHRoZSBsaXN0IGV4YWN0bHkgbGlrZQorICAgICAgICAvLyBhbnkgcmVndWxhciBjbGllbnQgd291bGQgZG8uCisgICAgICAgIC8vIENvbnNpZGVyaW5nIHRoZSByZXNwZWN0aXZlIHZhbHVlIG9mIHRoZSByZXNwZWN0aXZlIGNvbnN0YW50cyB1c2VkIGhlcmUgZm9yIGVhY2ggcGF0aCwKKyAgICAgICAgLy8gc2VnbWVudCwgdGhlIHVybCBnZW5lcmF0ZWQgYnkgdGhpcyBpcyBvZiB0aGUgZm9ybSAoYXNzdW1pbmcgImNsaWVudElkIiBhcyBhIGNsaWVudElkKQorICAgICAgICAvLyBjb250ZW50Oi8vY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2svY2xpZW50SWQvbGlzdD9wcm9jb3RvbD0yCisgICAgICAgIGZpbmFsIFVyaSBjb250ZW50VXJpID0gbmV3IFVyaS5CdWlsZGVyKCkuc2NoZW1lKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAuYXV0aG9yaXR5KGdldFN0cmluZyhSLnN0cmluZy5hdXRob3JpdHkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKGNsaWVudElkKQorICAgICAgICAgICAgICAgIC5hcHBlbmRQYXRoKERJQ1RfTElTVF9JRCkKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHVzZSB2ZXJzaW9uIDIgdG8gZ2V0IHRoaXMgY2xpZW50J3MgbGlzdAorICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcihEaWN0aW9uYXJ5UHJvdmlkZXIuUVVFUllfUEFSQU1FVEVSX1BST1RPQ09MX1ZFUlNJT04sICIyIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gbnVsbCA9PSBhY3Rpdml0eSA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGFjdGl2aXR5LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KGNvbnRlbnRVcmksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworCisgICAgICAgIGlmIChudWxsID09IGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFByZWZlcmVuY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJlZmVyZW5jZT4oKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoY3JlYXRlRXJyb3JNZXNzYWdlKGFjdGl2aXR5LCBSLnN0cmluZy5jYW5ub3RfY29ubmVjdF90b19kaWN0X3NlcnZpY2UpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8UHJlZmVyZW5jZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxQcmVmZXJlbmNlPigpOworICAgICAgICAgICAgcmVzdWx0LmFkZChjcmVhdGVFcnJvck1lc3NhZ2UoYWN0aXZpdHksIFIuc3RyaW5nLm5vX2RpY3Rpb25hcmllc19hdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3lzdGVtTG9jYWxlU3RyaW5nID0gTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpOworICAgICAgICAgICAgZmluYWwgVHJlZU1hcDxTdHJpbmcsIFdvcmRMaXN0UHJlZmVyZW5jZT4gcHJlZkxpc3QgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZU1hcDxTdHJpbmcsIFdvcmRMaXN0UHJlZmVyZW5jZT4oKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZEluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb25JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbGVJbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGRlc2NyaXB0aW9uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5ERVNDUklQVElPTl9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1c0luZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQgPSBjdXJzb3IuZ2V0U3RyaW5nKGlkSW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uID0gY3Vyc29yLmdldEludCh2ZXJzaW9uSW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbGVTdHJpbmcgPSBjdXJzb3IuZ2V0U3RyaW5nKGxvY2FsZUluZGV4KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGVTdHJpbmcpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiA9IGN1cnNvci5nZXRTdHJpbmcoZGVzY3JpcHRpb25JbmRleCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IGN1cnNvci5nZXRJbnQoc3RhdHVzSW5kZXgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXRjaExldmVsID0gTG9jYWxlVXRpbHMuZ2V0TWF0Y2hMZXZlbChzeXN0ZW1Mb2NhbGVTdHJpbmcsIGxvY2FsZVN0cmluZyk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hdGNoTGV2ZWxTdHJpbmcgPSBMb2NhbGVVdGlscy5nZXRNYXRjaExldmVsU29ydGVkU3RyaW5nKG1hdGNoTGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIFRoZSBrZXkgaXMgc29ydGVkIGluIGxleGljb2dyYXBoaWMgb3JkZXIsIGFjY29yZGluZyB0byB0aGUgbWF0Y2ggbGV2ZWwsIHRoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgZGVzY3JpcHRpb24uCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IG1hdGNoTGV2ZWxTdHJpbmcgKyAiLiIgKyBkZXNjcmlwdGlvbiArICIuIiArIHdvcmRsaXN0SWQ7CisgICAgICAgICAgICAgICAgZmluYWwgV29yZExpc3RQcmVmZXJlbmNlIGV4aXN0aW5nUHJlZiA9IHByZWZMaXN0LmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmIChudWxsID09IGV4aXN0aW5nUHJlZiB8fCBoYXNQcmlvcml0eShzdGF0dXMsIGV4aXN0aW5nUHJlZi5tU3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXb3JkTGlzdFByZWZlcmVuY2UgcHJlZiA9IG5ldyBXb3JkTGlzdFByZWZlcmVuY2UoYWN0aXZpdHksIG1DbGllbnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkbGlzdElkLCB2ZXJzaW9uLCBsb2NhbGUsIGRlc2NyaXB0aW9uLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBwcmVmTGlzdC5wdXQoa2V5LCBwcmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmTGlzdC52YWx1ZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIG91dCBpZiBhIGdpdmVuIHN0YXR1cyBoYXMgcHJpb3JpdHkgb3ZlciBhbm90aGVyIGZvciBkaXNwbGF5IG9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5ld1N0YXR1cworICAgICAqIEBwYXJhbSBvbGRTdGF0dXMKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgbmV3U3RhdHVzIGhhcyBwcmlvcml0eSBvdmVyIG9sZFN0YXR1cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1ByaW9yaXR5KGZpbmFsIGludCBuZXdTdGF0dXMsIGZpbmFsIGludCBvbGRTdGF0dXMpIHsKKyAgICAgICAgLy8gQm90aCBvZiB0aGVzZSBzaG91bGQgYmUgb25lIG9mIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTXyoKKyAgICAgICAgcmV0dXJuIG5ld1N0YXR1cyA+IG9sZFN0YXR1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoZmluYWwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgY2FzZSBNRU5VX1VQREFURV9OT1c6CisgICAgICAgICAgICBpZiAoVmlldy5HT05FID09IG1Mb2FkaW5nVmlldy5nZXRWaXNpYmlsaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBzdGFydFJlZnJlc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FuY2VsUmVmcmVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFJlZnJlc2goKSB7CisgICAgICAgIHN0YXJ0TG9hZGluZ0FuaW1hdGlvbigpOworICAgICAgICBtQ2hhbmdlZFNldHRpbmdzID0gdHJ1ZTsKKyAgICAgICAgVXBkYXRlSGFuZGxlci5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKyAgICAgICAgbmV3IFRocmVhZCgidXBkYXRlQnlIYW5kIikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgVXBkYXRlSGFuZGxlci51cGRhdGUoYWN0aXZpdHksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFJlZnJlc2goKSB7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIudW5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIuY2FuY2VsVXBkYXRlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGNvbnRleHQsIG1DbGllbnRJZCkpOworICAgICAgICBzdG9wTG9hZGluZ0FuaW1hdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydExvYWRpbmdBbmltYXRpb24oKSB7CisgICAgICAgIG1Mb2FkaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIGdldFZpZXcoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1VcGRhdGVOb3dNZW51LnNldFRpdGxlKFIuc3RyaW5nLmNhbmNlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BMb2FkaW5nQW5pbWF0aW9uKCkgeworICAgICAgICBmaW5hbCBWaWV3IHByZWZlcmVuY2VWaWV3ID0gZ2V0VmlldygpOworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGlmIChudWxsID09IGFjdGl2aXR5KSByZXR1cm47CisgICAgICAgIGFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtTG9hZGluZ1ZpZXcuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlVmlldy5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU5vd01lbnUuc2V0VGl0bGUoUi5zdHJpbmcuY2hlY2tfZm9yX3VwZGF0ZXNfbm93KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjMGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0Rvd25sb2FkT3Zlck1ldGVyZWREaWFsb2cuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmxhdGluLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIFRoaXMgaW1wbGVtZW50cyB0aGUgZGlhbG9nIGZvciBhc2tpbmcgdGhlIHVzZXIgd2hldGhlciBpdCdzIG9rYXkgdG8gZG93bmxvYWQgZGljdGlvbmFyaWVzIG92ZXIKKyAqIGEgbWV0ZXJlZCBjb25uZWN0aW9uIG9yIG5vdCAoZS5nLiB0aGVpciBtb2JpbGUgZGF0YSBwbGFuKS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvd25sb2FkT3Zlck1ldGVyZWREaWFsb2cgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xJRU5UX0lEX0tFWSA9ICJjbGllbnRfaWQiOworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdPUkRMSVNUX1RPX0RPV05MT0FEX0tFWSA9ICJ3b3JkbGlzdF90b19kb3dubG9hZCI7CisgICAgZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgU0laRV9LRVkgPSAic2l6ZSI7CisgICAgZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxFX0tFWSA9ICJsb2NhbGUiOworICAgIHByaXZhdGUgU3RyaW5nIG1DbGllbnRJZDsKKyAgICBwcml2YXRlIFN0cmluZyBtV29yZExpc3RUb0Rvd25sb2FkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIG1DbGllbnRJZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShDTElFTlRfSURfS0VZKTsKKyAgICAgICAgbVdvcmRMaXN0VG9Eb3dubG9hZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShXT1JETElTVF9UT19ET1dOTE9BRF9LRVkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKExPQ0FMRV9LRVkpOworICAgICAgICBmaW5hbCBsb25nIHNpemUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoU0laRV9LRVksIDApOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5kb3dubG9hZF9vdmVyX21ldGVyZWQpOworICAgICAgICBzZXRUZXh0cyhsb2NhbGVTdHJpbmcsIHNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRUZXh0cyhmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nLCBmaW5hbCBsb25nIHNpemUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb21wdEZvcm1hdCA9IGdldFN0cmluZyhSLnN0cmluZy5zaG91bGRfZG93bmxvYWRfb3Zlcl9tZXRlcmVkX3Byb21wdCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0J1dHRvbkZvcm1hdCA9IGdldFN0cmluZyhSLnN0cmluZy5kb3dubG9hZF9vdmVyX21ldGVyZWQpOworICAgICAgICBmaW5hbCBMb2NhbGUgbG9jYWxlID0gTG9jYWxlVXRpbHMuY29uc3RydWN0TG9jYWxlRnJvbVN0cmluZyhsb2NhbGVTdHJpbmcpOworICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSAobnVsbCA9PSBsb2NhbGUgPyAiIiA6IGxvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UoKSk7CisgICAgICAgIGZpbmFsIFRleHRWaWV3IHByb21wdCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5kb3dubG9hZF9vdmVyX21ldGVyZWRfcHJvbXB0KTsKKyAgICAgICAgcHJvbXB0LnNldFRleHQoSHRtbC5mcm9tSHRtbChTdHJpbmcuZm9ybWF0KHByb21wdEZvcm1hdCwgbGFuZ3VhZ2UpKSk7CisgICAgICAgIGZpbmFsIEJ1dHRvbiBhbGxvd0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYWxsb3dfYnV0dG9uKTsKKyAgICAgICAgYWxsb3dCdXR0b24uc2V0VGV4dChTdHJpbmcuZm9ybWF0KGFsbG93QnV0dG9uRm9ybWF0LCAoKGZsb2F0KXNpemUpLygxMDI0KjEwMjQpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGlja0RlbnkoZmluYWwgVmlldyB2KSB7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIuc2V0RG93bmxvYWRPdmVyTWV0ZXJlZFNldHRpbmcodGhpcywgZmFsc2UpOworICAgICAgICBmaW5pc2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrQWxsb3coZmluYWwgVmlldyB2KSB7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIuc2V0RG93bmxvYWRPdmVyTWV0ZXJlZFNldHRpbmcodGhpcywgdHJ1ZSk7CisgICAgICAgIFVwZGF0ZUhhbmRsZXIuaW5zdGFsbElmTmV2ZXJSZXF1ZXN0ZWQodGhpcywgbUNsaWVudElkLCBtV29yZExpc3RUb0Rvd25sb2FkLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qIG1heVByb21wdCAqLyk7CisgICAgICAgIGZpbmlzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0Rvd25sb2FkUmVjb3JkLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZFJlY29yZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjI5OTAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Eb3dubG9hZFJlY29yZC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CisKKy8qKgorICogU3RydWN0IGNsYXNzIHRvIGVuY2Fwc3VsYXRlIGEgY2xpZW50IElEIHdpdGggY29udGVudCB2YWx1ZXMgYWJvdXQgYSBkb3dubG9hZC4KKyAqLworcHVibGljIGNsYXNzIERvd25sb2FkUmVjb3JkIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAvLyBPbmx5IHdvcmQgbGlzdHMgaGF2ZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIENvbnRlbnRWYWx1ZXMgc2hvdWxkIGNvbnRhaW4gdGhlIHNhbWUKKyAgICAvLyBrZXlzIGFzIHRoZXkgZG8gZm9yIGFsbCBNZXRhZGF0YURiSGVscGVyIGZ1bmN0aW9ucy4gU2luY2Ugb25seSB3b3JkIGxpc3RzIGhhdmUKKyAgICAvLyBhdHRyaWJ1dGVzLCBhIG51bGwgcG9pbnRlciBoZXJlIG1lYW5zIHRoaXMgcmVjb3JkIHJlcHJlc2VudHMgbWV0YWRhdGEuCisgICAgcHVibGljIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUF0dHJpYnV0ZXM7CisgICAgcHVibGljIERvd25sb2FkUmVjb3JkKGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgQ29udGVudFZhbHVlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICBtQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiBudWxsID09IG1BdHRyaWJ1dGVzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9FdmVudEhhbmRsZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0V2ZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzRhODMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9FdmVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5MYXRpbklNRTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGZpbmFsIGNsYXNzIEV2ZW50SGFuZGxlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gRXZlbnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgaW50ZW50IGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIFdlIHJlY2VpdmUgZXZlcnkgZGF5IGEgYnJvYWRjYXN0IGluZGljYXRpbmcgdGhhdCBkYXRlIGNoYW5nZWQuCisgICAgICogVGhlbiB3ZSB3YWl0IGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJlZm9yZSBhY3R1YWxseSByZWdpc3RlcmluZworICAgICAqIHRoZSBkb3dubG9hZCwgdG8gYXZvaWQgY29uY2VudHJhdGluZyB0b28gbWFueSBhY2Nlc3NlcyBhcm91bmQKKyAgICAgKiBtaWRuaWdodCBpbiBtb3JlIHBvcHVsYXRlZCB0aW1lem9uZXMuCisgICAgICogV2UgcmVjZWl2ZSBhbGwgYnJvYWRjYXN0cyBoZXJlLCBzbyB0aGlzIGNhbiBiZSBlaXRoZXIgdGhlIERBVEVfQ0hBTkdFRCBicm9hZGNhc3QsIHRoZQorICAgICAqIFVQREFURV9OT1cgcHJpdmF0ZSBicm9hZGNhc3QgdGhhdCB3ZSByZWNlaXZlIHdoZW4gdGhlIHRpbWUtcmFuZG9taXppbmcgYWxhcm0gdHJpZ2dlcnMKKyAgICAgKiBmb3IgcmVndWxhciB1cGRhdGUgb3IgZnJvbSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHRlc3QgdGhlIGRpY3Rpb25hcnkgcGFjaywgb3IgYQorICAgICAqIGJyb2FkY2FzdCBmcm9tIERvd25sb2FkTWFuYWdlciB0ZWxsaW5nIHRoYXQgYSBkb3dubG9hZCBoYXMgZmluaXNoZWQuCisgICAgICogU2VlIGluc2lkZSBvZiBBbmRyb2lkTWFuaWZlc3QueG1sIHRvIHNlZSB3aGljaCBldmVudHMgYXJlIGNhdWdodC4KKyAgICAgKiBBbHNvIEBzZWUge0BsaW5rIEJyb2FkY2FzdFJlY2VpdmVyI29uUmVjZWl2ZShDb250ZXh0LCBJbnRlbnQpfQorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB0aGF0IHdhcyBicm9hZGNhc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgeworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoY29udGV4dCwgRGljdGlvbmFyeVNlcnZpY2UuY2xhc3MpOworICAgICAgICBjb250ZXh0LnN0YXJ0U2VydmljZShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0xvY2FsZVV0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2NhbGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTg0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2NhbGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogQSBjbGFzcyB0byBoZWxwIHdpdGggaGFuZGxpbmcgTG9jYWxlcyBpbiBzdHJpbmcgZm9ybS4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYW5kIGZlYXR1cmVzIChhbmQgc2hhcmVzIGFsbCBvZiBpdHMgY29kZSkgd2l0aCB0aGUgb25lIHdpdGggdGhlCisgKiBzYW1lIG5hbWUgaW4gTGF0aW4gSU1FLiBUaGV5IG5lZWQgdG8gYmUga2VwdCBzeW5jaHJvbml6ZWQ7IGZvciBhbnkgdXBkYXRlL2J1Z2ZpeCB0bworICogdGhpcyBmaWxlLCBjb25zaWRlciBhbHNvIHVwZGF0aW5nL2ZpeGluZyB0aGUgdmVyc2lvbiBpbiBMYXRpbiBJTUUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2NhbGVVdGlscyB7CisgICAgcHJpdmF0ZSBMb2NhbGVVdGlscygpIHsKKyAgICAgICAgLy8gSW50ZW50aW9uYWwgZW1wdHkgY29uc3RydWN0b3IgZm9yIHV0aWxpdHkgY2xhc3MuCisgICAgfQorCisgICAgLy8gTG9jYWxlIG1hdGNoIGxldmVsIGNvbnN0YW50cy4KKyAgICAvLyBBIGhpZ2hlciBsZXZlbCBvZiBtYXRjaCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSBoaWdoZXIgbnVtZXJpY2FsIHZhbHVlLgorICAgIC8vIFNvbWUgcm9vbSBpcyBsZWZ0IHdpdGhpbiBjb25zdGFudHMgdG8gYWRkIG1hdGNoIGNhc2VzIHRoYXQgbWF5IGFyaXNlIG5lY2Vzc2FyeQorICAgIC8vIGluIHRoZSBmdXR1cmUsIGZvciBleGFtcGxlIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSBjYXNlIHdoZXJlIHRoZSBjb3VudHJpZXMKKyAgICAvLyBhcmUgYm90aCBwcmVzZW50IGFuZCBkaWZmZXJlbnQsIGFuZCB0aGUgY2FzZSB3aGVyZSBvbmUgb2YgdGhlIGxvY2FsZXMgZG9lcyBub3QKKyAgICAvLyBzcGVjaWZ5IHRoZSBjb3VudHJpZXMuIFRoaXMgZGlmZmVyZW5jZSBpcyBub3QgbmVlZGVkIG5vdy4KKworICAgIC8vIE5vdGhpbmcgbWF0Y2hlcy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTEVfTk9fTUFUQ0ggPSAwOworICAgIC8vIFRoZSBsYW5ndWFnZXMgbWF0Y2hlcywgYnV0IHRoZSBjb3VudHJ5IGFyZSBkaWZmZXJlbnQuIE9yLCB0aGUgcmVmZXJlbmNlIGxvY2FsZSByZXF1aXJlcyBhCisgICAgLy8gY291bnRyeSBhbmQgdGhlIHRlc3RlZCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBvbmUuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX0xBTkdVQUdFX01BVENIX0NPVU5UUllfRElGRkVSID0gMzsKKyAgICAvLyBUaGUgbGFuZ3VhZ2VzIGFuZCBjb3VudHJ5IG1hdGNoLCBidXQgdGhlIHZhcmlhbnRzIGFyZSBkaWZmZXJlbnQuIE9yLCB0aGUgcmVmZXJlbmNlIGxvY2FsZQorICAgIC8vIHJlcXVpcmVzIGEgdmFyaWFudCBhbmQgdGhlIHRlc3RlZCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBvbmUuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIX1ZBUklBTlRfRElGRkVSID0gNjsKKyAgICAvLyBUaGUgcmVxdWlyZWQgbG9jYWxlIGlzIG51bGwgb3IgZW1wdHkgc28gaXQgd2lsbCBhY2NlcHQgYW55dGhpbmcsIGFuZCB0aGUgdGVzdGVkIGxvY2FsZQorICAgIC8vIGlzIG5vbi1udWxsIGFuZCBub24tZW1wdHkuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX0FOWV9NQVRDSCA9IDEwOworICAgIC8vIFRoZSBsYW5ndWFnZSBtYXRjaGVzLCBhbmQgdGhlIHRlc3RlZCBsb2NhbGUgc3BlY2lmaWVzIGEgY291bnRyeSBidXQgdGhlIHJlZmVyZW5jZSBsb2NhbGUKKyAgICAvLyBkb2VzIG5vdCByZXF1aXJlIG9uZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTEVfTEFOR1VBR0VfTUFUQ0ggPSAxNTsKKyAgICAvLyBUaGUgbGFuZ3VhZ2UgYW5kIHRoZSBjb3VudHJ5IG1hdGNoLCBhbmQgdGhlIHRlc3RlZCBsb2NhbGUgc3BlY2lmaWVzIGEgdmFyaWFudCBidXQgdGhlCisgICAgLy8gcmVmZXJlbmNlIGxvY2FsZSBkb2VzIG5vdCByZXF1aXJlIG9uZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTEVfTEFOR1VBR0VfQU5EX0NPVU5UUllfTUFUQ0ggPSAyMDsKKyAgICAvLyBUaGUgY29tcGFyZWQgbG9jYWxlcyBhcmUgZnVsbHkgaWRlbnRpY2FsLiBUaGlzIGlzIHRoZSBiZXN0IG1hdGNoIGxldmVsLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMRV9GVUxMX01BVENIID0gMzA7CisKKyAgICAvLyBUaGUgbGV2ZWwgYXQgd2hpY2ggYSBtYXRjaCBpcyAibm9ybWFsbHkiIGNvbnNpZGVyZWQgYSBsb2NhbGUgbWF0Y2ggd2l0aCBzdGFuZGFyZCBhbGdvcml0aG1zLgorICAgIC8vIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5LCB1c2UgI2lzTWF0Y2ggdG8gdGVzdC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxFX01BVENIID0gTE9DQUxFX0FOWV9NQVRDSDsKKworICAgIC8vIE1ha2UgdGhpcyBtYXRjaCB0aGUgbWF4aW11bSBtYXRjaCBsZXZlbC4gSWYgdGhpcyBldm9sdmVzIHRvIGhhdmUgbW9yZSB0aGFuIDIgZGlnaXRzCisgICAgLy8gd2hlbiB3cml0dGVuIGluIGJhc2UgMTAsIGFsc28gYWRqdXN0IHRoZSBnZXRNYXRjaExldmVsU29ydGVkU3RyaW5nIG1ldGhvZC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfTEVWRUxfTUFYID0gMzA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaG93IHdlbGwgYSB0ZXN0ZWQgbG9jYWxlIG1hdGNoZXMgYSByZWZlcmVuY2UgbG9jYWxlLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSB0ZXN0ZWQgbG9jYWxlIGFnYWluc3QgdGhlIHJlZmVyZW5jZSBsb2NhbGUgYW5kIHJldHVybiBhIG1lYXN1cmUgb2YgaG93CisgICAgICogYSB3ZWxsIGl0IG1hdGNoZXMgdGhlIHJlZmVyZW5jZS4gVGhlIGdlbmVyYWwgaWRlYSBpcyB0aGF0IHRoZSB0ZXN0ZWQgbG9jYWxlIGhhcyB0byBtYXRjaAorICAgICAqIGV2ZXJ5IHNwZWNpZmllZCBwYXJ0IG9mIHRoZSByZXF1aXJlZCBsb2NhbGUuIEEgZnVsbCBtYXRjaCBvY2N1ciB3aGVuIHRoZXkgYXJlIGVxdWFsLCBhCisgICAgICogcGFydGlhbCBtYXRjaCB3aGVuIHRoZSB0ZXN0ZWQgbG9jYWxlIGFncmVlcyB3aXRoIHRoZSByZWZlcmVuY2UgbG9jYWxlIGJ1dCBpcyBtb3JlIHNwZWNpZmljLAorICAgICAqIGFuZCBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgdGVzdGVkIGxvY2FsZSBkb2VzIG5vdCBjb21wbHkgd2l0aCBhbGwgcmVxdWlyZW1lbnRzIGZyb20gdGhlCisgICAgICogcmVmZXJlbmNlIGxvY2FsZS4KKyAgICAgKiBJbiBtb3JlIGRldGFpbCwgaWYgdGhlIHJlZmVyZW5jZSBsb2NhbGUgc3BlY2lmaWVzIGF0IGxlYXN0IGEgbGFuZ3VhZ2UgYW5kIHRoZSB0ZXN0ZWRMb2NhbGUKKyAgICAgKiBkb2VzIG5vdCBzcGVjaWZ5IG9uZSwgb3Igc3BlY2lmaWVzIGEgZGlmZmVyZW50IG9uZSwgTE9DQUxFX05PX01BVENIIGlzIHJldHVybmVkLiBJZiB0aGUKKyAgICAgKiByZWZlcmVuY2UgbG9jYWxlIGlzIGVtcHR5IG9yIG51bGwsIGl0IHdpbGwgbWF0Y2ggYW55dGhpbmcgLSBpbiB0aGUgZm9ybSBvZiBMT0NBTEVfRlVMTF9NQVRDSAorICAgICAqIGlmIHRoZSB0ZXN0ZWQgbG9jYWxlIGlzIGVtcHR5IG9yIG51bGwsIGFuZCBMT0NBTEVfQU5ZX01BVENIIG90aGVyd2lzZS4gSWYgdGhlIHJlZmVyZW5jZSBhbmQKKyAgICAgKiB0ZXN0ZWQgbG9jYWxlIGFncmVlIG9uIHRoZSBsYW5ndWFnZSwgYnV0IG5vdCBvbiB0aGUgY291bnRyeSwKKyAgICAgKiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0hfQ09VTlRSWV9ESUZGRVIgaXMgcmV0dXJuZWQgaWYgdGhlIHJlZmVyZW5jZSBsb2NhbGUgc3BlY2lmaWVzIGEgY291bnRyeSwKKyAgICAgKiBhbmQgTE9DQUxFX0xBTkdVQUdFX01BVENIIG90aGVyd2lzZS4KKyAgICAgKiBJZiB0aGV5IGFncmVlIG9uIGJvdGggdGhlIGxhbmd1YWdlIGFuZCB0aGUgY291bnRyeSwgYnV0IG5vdCBvbiB0aGUgdmFyaWFudCwKKyAgICAgKiBMT0NBTEVfTEFOR1VBR0VfQU5EX0NPVU5UUllfTUFUQ0hfVkFSSUFOVF9ESUZGRVIgaXMgcmV0dXJuZWQgaWYgdGhlIHJlZmVyZW5jZSBsb2NhbGUKKyAgICAgKiBzcGVjaWZpZXMgYSB2YXJpYW50LCBhbmQgTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIIG90aGVyd2lzZS4gSWYgZXZlcnl0aGluZyBtYXRjaGVzLAorICAgICAqIExPQ0FMRV9GVUxMX01BVENIIGlzIHJldHVybmVkLgorICAgICAqIEV4YW1wbGVzOgorICAgICAqIGVuIDw9PiBlbl9VUyAgPT4gTE9DQUxFX0xBTkdVQUdFX01BVENICisgICAgICogZW5fVVMgPD0+IGVuID0+IExPQ0FMRV9MQU5HVUFHRV9NQVRDSF9DT1VOVFJZX0RJRkZFUgorICAgICAqIGVuX1VTX1BPU0lYIDw9PiBlbl9VU19BbmRyb2lkICA9PiAgTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIX1ZBUklBTlRfRElGRkVSCisgICAgICogZW5fVVMgPD0+IGVuX1VTX0FuZHJvaWQgPT4gTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENICisgICAgICogc3BfVVMgPD0+IGVuX1VTICA9PiAgTE9DQUxFX05PX01BVENICisgICAgICogZGUgPD0+IGRlICA9PiBMT0NBTEVfRlVMTF9NQVRDSAorICAgICAqIGVuX1VTIDw9PiBlbl9VUyA9PiBMT0NBTEVfRlVMTF9NQVRDSAorICAgICAqICIiIDw9PiBlbl9VUyA9PiBMT0NBTEVfQU5ZX01BVENICisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlTG9jYWxlIHRoZSByZWZlcmVuY2UgbG9jYWxlIHRvIHRlc3QgYWdhaW5zdC4KKyAgICAgKiBAcGFyYW0gdGVzdGVkTG9jYWxlIHRoZSBsb2NhbGUgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIGEgY29uc3RhbnQgdGhhdCBtZWFzdXJlcyBob3cgd2VsbCB0aGUgdGVzdGVkIGxvY2FsZSBtYXRjaGVzIHRoZSByZWZlcmVuY2UgbG9jYWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoTGV2ZWwoZmluYWwgU3RyaW5nIHJlZmVyZW5jZUxvY2FsZSwgZmluYWwgU3RyaW5nIHRlc3RlZExvY2FsZSkgeworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmVmZXJlbmNlTG9jYWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5pc0VtcHR5KHRlc3RlZExvY2FsZSkgPyBMT0NBTEVfRlVMTF9NQVRDSCA6IExPQ0FMRV9BTllfTUFUQ0g7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgPT0gdGVzdGVkTG9jYWxlKSByZXR1cm4gTE9DQUxFX05PX01BVENIOworICAgICAgICBmaW5hbCBTdHJpbmdbXSByZWZlcmVuY2VQYXJhbXMgPSByZWZlcmVuY2VMb2NhbGUuc3BsaXQoIl8iLCAzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdGVkUGFyYW1zID0gdGVzdGVkTG9jYWxlLnNwbGl0KCJfIiwgMyk7CisgICAgICAgIC8vIEJ5IHNwZWMgb2YgU3RyaW5nI3NwbGl0LCBbMF0gY2Fubm90IGJlIG51bGwgYW5kIGxlbmd0aCBjYW5ub3QgYmUgMC4KKyAgICAgICAgaWYgKCFyZWZlcmVuY2VQYXJhbXNbMF0uZXF1YWxzKHRlc3RlZFBhcmFtc1swXSkpIHJldHVybiBMT0NBTEVfTk9fTUFUQ0g7CisgICAgICAgIHN3aXRjaCAocmVmZXJlbmNlUGFyYW1zLmxlbmd0aCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gMSA9PSB0ZXN0ZWRQYXJhbXMubGVuZ3RoID8gTE9DQUxFX0ZVTExfTUFUQ0ggOiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0g7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICgxID09IHRlc3RlZFBhcmFtcy5sZW5ndGgpIHJldHVybiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0hfQ09VTlRSWV9ESUZGRVI7CisgICAgICAgICAgICBpZiAoIXJlZmVyZW5jZVBhcmFtc1sxXS5lcXVhbHModGVzdGVkUGFyYW1zWzFdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9DQUxFX0xBTkdVQUdFX01BVENIX0NPVU5UUllfRElGRkVSOworICAgICAgICAgICAgaWYgKDMgPT0gdGVzdGVkUGFyYW1zLmxlbmd0aCkgcmV0dXJuIExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSDsKKyAgICAgICAgICAgIHJldHVybiBMT0NBTEVfRlVMTF9NQVRDSDsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKDEgPT0gdGVzdGVkUGFyYW1zLmxlbmd0aCkgcmV0dXJuIExPQ0FMRV9MQU5HVUFHRV9NQVRDSF9DT1VOVFJZX0RJRkZFUjsKKyAgICAgICAgICAgIGlmICghcmVmZXJlbmNlUGFyYW1zWzFdLmVxdWFscyh0ZXN0ZWRQYXJhbXNbMV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBMT0NBTEVfTEFOR1VBR0VfTUFUQ0hfQ09VTlRSWV9ESUZGRVI7CisgICAgICAgICAgICBpZiAoMiA9PSB0ZXN0ZWRQYXJhbXMubGVuZ3RoKSByZXR1cm4gTE9DQUxFX0xBTkdVQUdFX0FORF9DT1VOVFJZX01BVENIX1ZBUklBTlRfRElGRkVSOworICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2VQYXJhbXNbMl0uZXF1YWxzKHRlc3RlZFBhcmFtc1syXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIExPQ0FMRV9MQU5HVUFHRV9BTkRfQ09VTlRSWV9NQVRDSF9WQVJJQU5UX0RJRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBMT0NBTEVfRlVMTF9NQVRDSDsKKyAgICAgICAgfQorICAgICAgICAvLyBJdCBzaG91bGQgYmUgaW1wb3NzaWJsZSB0byBjb21lIGhlcmUKKyAgICAgICAgcmV0dXJuIExPQ0FMRV9OT19NQVRDSDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoaXMgbWF0Y2ggbGV2ZWwsIHdpdGggYmV0dGVyIG1hdGNoZXMgZmlyc3QuCisgICAgICoKKyAgICAgKiBUaGUgc3RyaW5ncyBhcmUgc29ydGVkIGluIGxleGljb2dyYXBoaWMgb3JkZXI6IGEgYmV0dGVyIG1hdGNoIHdpbGwgYWx3YXlzIGJlIGxlc3MgdGhhbgorICAgICAqIGEgd29yc2UgbWF0Y2ggd2hlbiBjb21wYXJlZCB0b2dldGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXRjaExldmVsU29ydGVkU3RyaW5nKGZpbmFsIGludCBtYXRjaExldmVsKSB7CisgICAgICAgIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgbWF0Y2ggbGV2ZWxzIGFyZSAwfjk5IChhY3R1YWxseSAwfjMwKQorICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHVzZSBhIG51bWJlciBvZiBkaWdpdHMgZXF1YWxzIHRvIHRoZSAxb2cxMCBvZiB0aGUgZ3JlYXRlciBtYXRjaExldmVsCisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlMDJkIiwgTUFUQ0hfTEVWRUxfTUFYIC0gbWF0Y2hMZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBvdXQgd2hldGhlciBhIG1hdGNoIGxldmVsIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbWF0Y2guCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIG1hdGNoIGxldmVsIGFzIHJldHVybmVkIGJ5IHRoZSAjZ2V0TWF0Y2hMZXZlbCBtZXRob2QsIGFuZCByZXR1cm5zIHdoZXRoZXIKKyAgICAgKiBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhIG1hdGNoIGluIHRoZSB1c3VhbCBzZW5zZSB3aXRoIHN0YW5kYXJkIExvY2FsZSBmdW5jdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIG1hdGNoIGxldmVsLCBhcyByZXR1cm5lZCBieSBnZXRNYXRjaExldmVsLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgbWF0Y2ggb3Igbm90LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hdGNoKGZpbmFsIGludCBsZXZlbCkgeworICAgICAgICByZXR1cm4gTE9DQUxFX01BVENIIDw9IGxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN5c3RlbSBsb2NhbGUgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMgdGhlIHJlc291cmNlcyB0byB1c2UuIFBhc3MgY3VycmVudCByZXNvdXJjZXMuCisgICAgICogQHBhcmFtIG5ld0xvY2FsZSB0aGUgbG9jYWxlIHRvIGNoYW5nZSB0by4KKyAgICAgKiBAcmV0dXJuIHRoZSBvbGQgbG9jYWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9jYWxlIHNldFN5c3RlbUxvY2FsZShmaW5hbCBSZXNvdXJjZXMgcmVzLCBmaW5hbCBMb2NhbGUgbmV3TG9jYWxlKSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZiA9IHJlcy5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIExvY2FsZSBzYXZlTG9jYWxlID0gY29uZi5sb2NhbGU7CisgICAgICAgIGNvbmYubG9jYWxlID0gbmV3TG9jYWxlOworICAgICAgICByZXMudXBkYXRlQ29uZmlndXJhdGlvbihjb25mLCByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKSk7CisgICAgICAgIHJldHVybiBzYXZlTG9jYWxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBMb2NhbGU+IHNMb2NhbGVDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9jYWxlPigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsZSBmcm9tIGEgc3RyaW5nIHNwZWNpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGUgY29uc3RydWN0TG9jYWxlRnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgbG9jYWxlU3RyKSB7CisgICAgICAgIGlmIChsb2NhbGVTdHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNMb2NhbGVDYWNoZSkgeworICAgICAgICAgICAgaWYgKHNMb2NhbGVDYWNoZS5jb250YWluc0tleShsb2NhbGVTdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBzTG9jYWxlQ2FjaGUuZ2V0KGxvY2FsZVN0cik7CisgICAgICAgICAgICBMb2NhbGUgcmV0dmFsID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZ1tdIGxvY2FsZVBhcmFtcyA9IGxvY2FsZVN0ci5zcGxpdCgiXyIsIDMpOworICAgICAgICAgICAgaWYgKGxvY2FsZVBhcmFtcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IG5ldyBMb2NhbGUobG9jYWxlUGFyYW1zWzBdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlUGFyYW1zLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gbmV3IExvY2FsZShsb2NhbGVQYXJhbXNbMF0sIGxvY2FsZVBhcmFtc1sxXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZVBhcmFtcy5sZW5ndGggPT0gMykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IG5ldyBMb2NhbGUobG9jYWxlUGFyYW1zWzBdLCBsb2NhbGVQYXJhbXNbMV0sIGxvY2FsZVBhcmFtc1syXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV0dmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzTG9jYWxlQ2FjaGUucHV0KGxvY2FsZVN0ciwgcmV0dmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2dQcm9ibGVtUmVwb3J0ZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL0xvZ1Byb2JsZW1SZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjdhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Mb2dQcm9ibGVtUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEEgdmVyeSBzaW1wbGUgcHJvYmxlbSByZXBvcnRlci4KKyAqLworZmluYWwgY2xhc3MgTG9nUHJvYmxlbVJlcG9ydGVyIGltcGxlbWVudHMgUHJvYmxlbVJlcG9ydGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUc7CisKKyAgICBwdWJsaWMgTG9nUHJvYmxlbVJlcG9ydGVyKGZpbmFsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgVEFHID0gdGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcG9ydChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICBMb2cuZShUQUcsICJSZXBvcnRpbmcgcHJvYmxlbSA6ICIgKyBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NRDVDYWxjdWxhdG9yLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NRDVDYWxjdWxhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3ZTg2ZQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ENUNhbGN1bGF0b3IuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKKworZmluYWwgY2xhc3MgTUQ1Q2FsY3VsYXRvciB7CisgICAgcHJpdmF0ZSBNRDVDYWxjdWxhdG9yKCkge30gLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgbm90IGluc3RhbnRpYWJsZQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tzdW0oZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoaXMgY29kZSBmcm9tIHRoZSBBbmRyb2lkIGRvY3VtZW50YXRpb24gZm9yIE1lc3NhZ2VEaWdlc3QuIE5lYXJseSB2ZXJiYXRpbS4KKyAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3RlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRpZ2VzdGVyID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IE1ENSA6IGNhbid0IGNoZWNrLCBzbyByZXR1cm4gbnVsbAorICAgICAgICB9CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBpbnQgYnl0ZUNvdW50OworICAgICAgICB3aGlsZSAoKGJ5dGVDb3VudCA9IGluLnJlYWQoYnl0ZXMpKSA+IDApIHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnVwZGF0ZShieXRlcywgMCwgYnl0ZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBieXRlW10gZGlnZXN0ID0gZGlnZXN0ZXIuZGlnZXN0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnZXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMSQwMngiLCBkaWdlc3RbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhRGJIZWxwZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhRGJIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWY1NDVhCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFEYkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogVmFyaW91cyBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgc3RhdGUgZGF0YWJhc2UKKyAqLworcHVibGljIGNsYXNzIE1ldGFkYXRhRGJIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBNZXRhZGF0YURiSGVscGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8vIFRoaXMgd2FzIHRoZSBpbml0aWFsIHJlbGVhc2UgdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2UuIEl0IHNob3VsZCBuZXZlciBiZQorICAgIC8vIGNoYW5nZWQgZ29pbmcgZm9yd2FyZC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfREFUQUJBU0VfSU5JVElBTF9WRVJTSU9OID0gMzsKKyAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZSB0aGF0IGltcGxlbWVudHMgQ0xJRU5USUQuIEl0IGlzCisgICAgLy8gdXNlZCB0byBpZGVudGlmeSB0aGUgdmVyc2lvbnMgZm9yIHVwZ3JhZGVzLiBUaGlzIHNob3VsZCBuZXZlciBjaGFuZ2UgZ29pbmcgZm9yd2FyZC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfREFUQUJBU0VfVkVSU0lPTl9XSVRIX0NMSUVOVElEID0gNTsKKyAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IGRhdGFiYXNlIHZlcnNpb24uIEl0IHNob3VsZCBiZSB1cGRhdGVkIHdoZW4gdGhlIGRhdGFiYXNlIHNjaGVtYQorICAgIC8vIGdldHMgdXBkYXRlZC4gSXQgaXMgcGFzc2VkIHRvIHRoZSBmcmFtZXdvcmsgY29uc3RydWN0b3Igb2YgU1FMaXRlT3BlbkhlbHBlciwgc28KKyAgICAvLyB0aGF0J3Mgd2hhdCB0aGUgZnJhbWV3b3JrIHVzZXMgdG8gdHJhY2sgb3VyIGRhdGFiYXNlIHZlcnNpb24uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX0RBVEFCQVNFX1ZFUlNJT04gPSA1OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBOT1RfQV9ET1dOTE9BRF9JRCA9IC0xOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVEFCTEVfTkFNRSA9ICJwZW5kaW5nVXBkYXRlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9UQUJMRV9OQU1FID0gImNsaWVudHMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFTkRJTkdJRF9DT0xVTU4gPSAicGVuZGluZ2lkIjsgLy8gRG93bmxvYWQgTWFuYWdlciBJRAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ09MVU1OID0gInR5cGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19DT0xVTU4gPSAic3RhdHVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfQ09MVU1OID0gImxvY2FsZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SRExJU1RJRF9DT0xVTU4gPSAiaWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0NPTFVNTiA9ICJkZXNjcmlwdGlvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfRklMRU5BTUVfQ09MVU1OID0gImZpbGVuYW1lIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRklMRU5BTUVfQ09MVU1OID0gInVybCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURV9DT0xVTU4gPSAiZGF0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tTVU1fQ09MVU1OID0gImNoZWNrc3VtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFU0laRV9DT0xVTU4gPSAiZmlsZXNpemUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQ09MVU1OID0gInZlcnNpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFZFUlNJT05fQ09MVU1OID0gImZvcm1hdHZlcnNpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdTX0NPTFVNTiA9ICJmbGFncyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gPSAiY2xpZW50aWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiA9ICJ1cmkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfTEFTVF9VUERBVEVfREFURV9DT0xVTU4gPSAibGFzdHVwZGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9QRU5ESU5HSURfQ09MVU1OID0gInBlbmRpbmdpZCI7IC8vIERvd25sb2FkIE1hbmFnZXIgSUQKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0RBVEFCQVNFX05BTUVfU1RFTSA9ICJwZW5kaW5nVXBkYXRlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVVBEQVRFX0RFU0NSSVBUSU9OID0gIm1ldGFkYXRhIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQ1RJT05BUklFU19BU1NFVFNfUEFUSCA9ICJkaWN0aW9uYXJpZXMiOworCisgICAgLy8gU3RhdHVzZXMsIGZvciBzdG9yaW5nIGluIHRoZSBTVEFUVVNfQ09MVU1OCisgICAgLy8gSU1QT1JUQU5UOiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGFzIGluZGV4IGFycmF5cyBpbiAuLi9Xb3JkTGlzdFByZWZlcmVuY2UKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoZWlyIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZSBtYXRjaGVkIGNvZGUuCisgICAgLy8gVW5rbm93biBzdGF0dXM6IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVU5LTk9XTiA9IDA7CisgICAgLy8gQXZhaWxhYmxlOiB0aGlzIHdvcmQgbGlzdCBpcyBhdmFpbGFibGUsIGJ1dCBpdCBpcyBub3QgZG93bmxvYWRlZCAobm90IGRvd25sb2FkaW5nKSwgYmVjYXVzZQorICAgIC8vIGl0IGlzIHNldCBub3QgdG8gYmUgdXNlZC4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQVZBSUxBQkxFID0gMTsKKyAgICAvLyBEb3dubG9hZGluZzogdGhpcyB3b3JkIGxpc3QgaXMgYmVpbmcgZG93bmxvYWRlZC4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRE9XTkxPQURJTkcgPSAyOworICAgIC8vIEluc3RhbGxlZDogdGhpcyB3b3JkIGxpc3QgaXMgaW5zdGFsbGVkIGFuZCB1c2FibGUuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOU1RBTExFRCA9IDM7CisgICAgLy8gRGlzYWJsZWQ6IHRoaXMgd29yZCBsaXN0IGlzIGluc3RhbGxlZCwgYnV0IGhhcyBiZWVuIGRpc2FibGVkIGJ5IHRoZSB1c2VyLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19ESVNBQkxFRCA9IDQ7CisgICAgLy8gRGVsZXRpbmc6IHRoZSB1c2VyIG1hcmtlZCB0aGlzIHdvcmQgbGlzdCB0byBiZSBkZWxldGVkLCBidXQgaXQgaGFzIG5vdCBiZWVuIHlldCBiZWNhdXNlCisgICAgLy8gTGF0aW4gSU1FIGlzIG5vdCB1cCB5ZXQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0RFTEVUSU5HID0gNTsKKworICAgIC8vIFR5cGVzLCBmb3Igc3RvcmluZyBpbiB0aGUgVFlQRV9DT0xVTU4KKyAgICAvLyBUaGlzIGlzIG1ldGFkYXRhIGFib3V0IHdoYXQgaXMgYXZhaWxhYmxlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUVUQURBVEEgPSAxOworICAgIC8vIFRoaXMgaXMgYSBidWxrIGZpbGUuIEl0IHNob3VsZCByZXBsYWNlIG9sZGVyIGZpbGVzLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQlVMSyA9IDI7CisgICAgLy8gVGhpcyBpcyBhbiBpbmNyZW1lbnRhbCB1cGRhdGUsIGV4cGVjdGVkIHRvIGJlIHNtYWxsLCBhbmQgbWVhbmluZ2xlc3Mgb24gaXRzIG93bi4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VQREFURSA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfVEFCTEVfQ1JFQVRFID0KKyAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgIiArIE1FVEFEQVRBX1RBQkxFX05BTUUgKyAiICgiCisgICAgICAgICAgICArIFBFTkRJTkdJRF9DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgVFlQRV9DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgU1RBVFVTX0NPTFVNTiArICIgSU5URUdFUiwgIgorICAgICAgICAgICAgKyBXT1JETElTVElEX0NPTFVNTiArICIgVEVYVCwgIgorICAgICAgICAgICAgKyBMT0NBTEVfQ09MVU1OICsgIiBURVhULCAiCisgICAgICAgICAgICArIERFU0NSSVBUSU9OX0NPTFVNTiArICIgVEVYVCwgIgorICAgICAgICAgICAgKyBMT0NBTF9GSUxFTkFNRV9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiArICIgVEVYVCwgIgorICAgICAgICAgICAgKyBEQVRFX0NPTFVNTiArICIgSU5URUdFUiwgIgorICAgICAgICAgICAgKyBDSEVDS1NVTV9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgRklMRVNJWkVfQ09MVU1OICsgIiBJTlRFR0VSLCAiCisgICAgICAgICAgICArIFZFUlNJT05fQ09MVU1OICsgIiBJTlRFR0VSLCIKKyAgICAgICAgICAgICsgRk9STUFUVkVSU0lPTl9DT0xVTU4gKyAiIElOVEVHRVIsIgorICAgICAgICAgICAgKyBGTEFHU19DT0xVTU4gKyAiIElOVEVHRVIsIgorICAgICAgICAgICAgKyAiUFJJTUFSWSBLRVkgKCIgKyBXT1JETElTVElEX0NPTFVNTiArICIsIiArIFZFUlNJT05fQ09MVU1OICsgIikpOyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0NSRUFURV9DTElFTlRfVEFCTEUgPQorICAgICAgICAgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICIgKyBDTElFTlRfVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICsgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4gKyAiIFRFWFQsICIKKyAgICAgICAgICAgICsgQ0xJRU5UX0xBU1RfVVBEQVRFX0RBVEVfQ09MVU1OICsgIiBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorICAgICAgICAgICAgKyBDTElFTlRfUEVORElOR0lEX0NPTFVNTiArICIgSU5URUdFUiwgIgorICAgICAgICAgICAgKyBGTEFHU19DT0xVTU4gKyAiIElOVEVHRVIsICIKKyAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZICgiICsgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gKyAiKSk7IjsKKworICAgIC8vIExpc3Qgb2YgYWxsIG1ldGFkYXRhIHRhYmxlIGNvbHVtbnMuCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMgPSB7IFBFTkRJTkdJRF9DT0xVTU4sIFRZUEVfQ09MVU1OLAorICAgICAgICAgICAgU1RBVFVTX0NPTFVNTiwgV09SRExJU1RJRF9DT0xVTU4sIExPQ0FMRV9DT0xVTU4sIERFU0NSSVBUSU9OX0NPTFVNTiwKKyAgICAgICAgICAgIExPQ0FMX0ZJTEVOQU1FX0NPTFVNTiwgUkVNT1RFX0ZJTEVOQU1FX0NPTFVNTiwgREFURV9DT0xVTU4sIENIRUNLU1VNX0NPTFVNTiwKKyAgICAgICAgICAgIEZJTEVTSVpFX0NPTFVNTiwgVkVSU0lPTl9DT0xVTU4sIEZPUk1BVFZFUlNJT05fQ09MVU1OLCBGTEFHU19DT0xVTU4gfTsKKyAgICAvLyBMaXN0IG9mIGFsbCBjbGllbnQgdGFibGUgY29sdW1ucy4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0xJRU5UX1RBQkxFX0NPTFVNTlMgPSB7IENMSUVOVF9DTElFTlRfSURfQ09MVU1OLAorICAgICAgICAgICAgQ0xJRU5UX01FVEFEQVRBX1VSSV9DT0xVTU4sIENMSUVOVF9QRU5ESU5HSURfQ09MVU1OLCBGTEFHU19DT0xVTU4gfTsKKyAgICAvLyBMaXN0IG9mIHB1YmxpYyBjb2x1bW5zIHJldHVybmVkIHRvIGNsaWVudHMuIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgaW4gdGhpcyBsaXN0IGlzCisgICAgLy8gcHJpdmF0ZSBhbmQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBESUNUSU9OQVJJRVNfTElTVF9QVUJMSUNfQ09MVU1OUyA9IHsgU1RBVFVTX0NPTFVNTiwgV09SRExJU1RJRF9DT0xVTU4sCisgICAgICAgICAgICBMT0NBTEVfQ09MVU1OLCBERVNDUklQVElPTl9DT0xVTU4sIERBVEVfQ09MVU1OLCBGSUxFU0laRV9DT0xVTU4sIFZFUlNJT05fQ09MVU1OIH07CisKKyAgICAvLyBUaGlzIGNsYXNzIGV4aGliaXRzIGEgc2luZ2xldG9uLWxpa2UgYmVoYXZpb3IgYnkgY2xpZW50IElELCBzbyBpdCBpcyBnZXRJbnN0YW5jZSdkCisgICAgLy8gYW5kIGhhcyBhIHByaXZhdGUgYyd0b3IuCisgICAgcHJpdmF0ZSBzdGF0aWMgVHJlZU1hcDxTdHJpbmcsIE1ldGFkYXRhRGJIZWxwZXI+IHNJbnN0YW5jZU1hcCA9IG51bGw7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWV0YWRhdGFEYkhlbHBlciBnZXRJbnN0YW5jZShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWRPck51bGwpIHsKKyAgICAgICAgLy8gQXMgYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZlYXR1cmUsIG51bGwgY2FuIGJlIHBhc3NlZCBoZXJlIHRvIHJldHJpZXZlIHRoZSAiZGVmYXVsdCIKKyAgICAgICAgLy8gZGF0YWJhc2UuIEJlZm9yZSBtdWx0aS1jbGllbnQgc3VwcG9ydCwgdGhlIGRpY3Rpb25hcnkgcGFja2VkIHVzZWQgb25seSBvbmUgZGF0YWJhc2UKKyAgICAgICAgLy8gYW5kIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGhhbmRsZSBzZXZlcmFsIGRpY3Rpb25hcnkgc2V0cy4gUGFzc2luZyBudWxsIGhlcmUgcmV0cmlldmVzCisgICAgICAgIC8vIHRoaXMgbGVnYWN5IGRhdGFiYXNlLiBOZXcgY2xpZW50cyBzaG91bGQgbWFrZSBzdXJlIHRvIGFsd2F5cyBwYXNzIGEgY2xpZW50IElEIHNvIGFzCisgICAgICAgIC8vIHRvIGF2b2lkIGNvbmZsaWN0cy4KKyAgICAgICAgZmluYWwgU3RyaW5nIGNsaWVudElkID0gbnVsbCAhPSBjbGllbnRJZE9yTnVsbCA/IGNsaWVudElkT3JOdWxsIDogIiI7CisgICAgICAgIGlmIChudWxsID09IHNJbnN0YW5jZU1hcCkgc0luc3RhbmNlTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBNZXRhZGF0YURiSGVscGVyPigpOworICAgICAgICBNZXRhZGF0YURiSGVscGVyIGhlbHBlciA9IHNJbnN0YW5jZU1hcC5nZXQoY2xpZW50SWQpOworICAgICAgICBpZiAobnVsbCA9PSBoZWxwZXIpIHsKKyAgICAgICAgICAgIGhlbHBlciA9IG5ldyBNZXRhZGF0YURiSGVscGVyKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgIHNJbnN0YW5jZU1hcC5wdXQoY2xpZW50SWQsIGhlbHBlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlbHBlcjsKKyAgICB9CisgICAgcHJpdmF0ZSBNZXRhZGF0YURiSGVscGVyKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfREFUQUJBU0VfTkFNRV9TVEVNICsgKFRleHRVdGlscy5pc0VtcHR5KGNsaWVudElkKSA/ICIiIDogIi4iICsgY2xpZW50SWQpLAorICAgICAgICAgICAgICAgIG51bGwsIE1FVEFEQVRBX0RBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2xpZW50SWQ7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRhdGFiYXNlIGl0c2VsZi4gVGhpcyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QgZm9yIGFueSBjbGllbnQgSUQuIElmIHRoZQorICAgICAqIGNsaWVudCBJRCBpcyBudWxsLCBhIGRlZmF1bHQgZGF0YWJhc2UgaXMgcmV0dXJuZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIERvbid0CisgICAgICogcGFzcyBudWxsIGZvciBuZXcgY2FsbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0byBjcmVhdGUgdGhlIGRhdGFiYXNlIGZyb20uIFRoaXMgaXMgaWdub3JlZCBhZnRlciB0aGUgZmlyc3QgY2FsbC4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIGNsaWVudCBpZCB0byByZXRyaWV2ZSB0aGUgZGF0YWJhc2Ugb2YuIG51bGwgZm9yIGRlZmF1bHQgKGRlcHJlY2F0ZWQpCisgICAgICogQHJldHVybiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBnZXREYihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoY29udGV4dCwgY2xpZW50SWQpLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2xpZW50VGFibGUoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgLy8gVGhlIGNsaWVudHMgdGFibGUgb25seSBleGlzdHMgaW4gdGhlIHByaW1hcnkgZGIsIHRoZSBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgY2xpZW50IGlkCisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUNsaWVudElkKSkgcmV0dXJuOworICAgICAgICBkYi5leGVjU1FMKE1FVEFEQVRBX0NSRUFURV9DTElFTlRfVEFCTEUpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdE1ldGFkYXRhVXJpID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRlZmF1bHRfbWV0YWRhdGFfdXJpKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZWZhdWx0TWV0YWRhdGFVcmkpKSB7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGRlZmF1bHRNZXRhZGF0YVZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICBkZWZhdWx0TWV0YWRhdGFWYWx1ZXMucHV0KENMSUVOVF9DTElFTlRfSURfQ09MVU1OLCAiIik7CisgICAgICAgICAgICBkZWZhdWx0TWV0YWRhdGFWYWx1ZXMucHV0KENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OLCBkZWZhdWx0TWV0YWRhdGFVcmkpOworICAgICAgICAgICAgZGIuaW5zZXJ0KENMSUVOVF9UQUJMRV9OQU1FLCBudWxsLCBkZWZhdWx0TWV0YWRhdGFWYWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSB0YWJsZSBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXBrLgorICAgICAqCisgICAgICogQHNlZSBTUUxpdGVPcGVuSGVscGVyI29uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlKQorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBkYXRhYmFzZSB0byBjcmVhdGUgYW5kIHBvcHVsYXRlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIGRiLmV4ZWNTUUwoTUVUQURBVEFfVEFCTEVfQ1JFQVRFKTsKKyAgICAgICAgY3JlYXRlQ2xpZW50VGFibGUoZGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZ3JhZGUgdGhlIGRhdGFiYXNlLiBVcGdyYWRlIGZyb20gdmVyc2lvbiAzIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIGludCBvbGRWZXJzaW9uLCBmaW5hbCBpbnQgbmV3VmVyc2lvbikgeworICAgICAgICBpZiAoTUVUQURBVEFfREFUQUJBU0VfSU5JVElBTF9WRVJTSU9OID09IG9sZFZlcnNpb24KKyAgICAgICAgICAgICAgICAmJiBNRVRBREFUQV9EQVRBQkFTRV9WRVJTSU9OX1dJVEhfQ0xJRU5USUQgPT0gbmV3VmVyc2lvbikgeworICAgICAgICAgICAgLy8gVXBncmFkZSBmcm9tIHZlcnNpb24gTUVUQURBVEFfREFUQUJBU0VfSU5JVElBTF9WRVJTSU9OIHRvIHZlcnNpb24KKyAgICAgICAgICAgIC8vIE1FVEFEQVRBX0RBVEFCQVNFX1ZFUlNJT05fV0lUSF9DTElFTlRfSUQKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtQ2xpZW50SWQpKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzaG91bGQgY29udGFpbiB0aGUgY2xpZW50IHRhYmxlLgorICAgICAgICAgICAgICAgIC8vIEFueXdheSBpbiB2ZXJzaW9uIDMgb25seSB0aGUgZGVmYXVsdCB0YWJsZSBleGlzdGVkIHNvIHRoZSBlbXB0eW5lc3MKKyAgICAgICAgICAgICAgICAvLyB0ZXN0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgYnV0IGJldHRlciBjaGVjayB0byBiZSBzdXJlLgorICAgICAgICAgICAgICAgIGNyZWF0ZUNsaWVudFRhYmxlKGRiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFZlcnNpb24gMyB3YXMgdGhlIGVhcmxpZXN0IHZlcnNpb24sIHNvIHdlIHNob3VsZCBuZXZlciBjb21lIGhlcmUuIElmIHdlIGRvLCB3ZQorICAgICAgICAgICAgLy8gaGF2ZSBubyBpZGVhIHdoYXQgdGhpcyBkYXRhYmFzZSBpcywgc28gd2UnZCBiZXR0ZXIgd2lwZSBpdCBvZmYuCisgICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgTUVUQURBVEFfVEFCTEVfTkFNRSk7CisgICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgQ0xJRU5UX1RBQkxFX05BTUUpOworICAgICAgICAgICAgb25DcmVhdGUoZGIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG93bmdyYWRlIHRoZSBkYXRhYmFzZS4gVGhpcyBkcm9wcyBhbmQgcmVjcmVhdGVzIHRoZSB0YWJsZSBpbiBhbGwgY2FzZXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Eb3duZ3JhZGUoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIGludCBvbGRWZXJzaW9uLCBmaW5hbCBpbnQgbmV3VmVyc2lvbikgeworICAgICAgICAvLyBObyBtYXR0ZXIgd2hhdCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiBvbGRWZXJzaW9uIGFuZCBuZXdWZXJzaW9uIGFyZSwgd2Uga25vdyB0aGlzCisgICAgICAgIC8vIGlzIGEgZG93bmdyYWRlIChuZXdWZXJzaW9uIDwgb2xkVmVyc2lvbikuIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoYXQgdGhlIGZ1dHVyZQorICAgICAgICAvLyBkYXRhYmFzZXMgd2lsbCBsb29rIGxpa2UsIGJ1dCB3ZSBrbm93IGl0J3MgZXh0cmVtZWx5IGxpa2VseSB0aGF0IGl0J3Mgb2theSB0byBqdXN0CisgICAgICAgIC8vIGRyb3AgdGhlIHRhYmxlcyBhbmQgc3RhcnQgZnJvbSBzY3JhdGNoLiBIZW5jZSwgd2UgaWdub3JlIHRoZSB2ZXJzaW9ucyBhbmQganVzdCB3aXBlCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcgd2Ugd2FudCB0byB1c2UuCisgICAgICAgIGlmIChvbGRWZXJzaW9uIDw9IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uRG93bmdyYWRlIGRhdGFiYXNlIGJ1dCBuZXcgdmVyc2lvbiBpcyBoaWdoZXI/ICIgKyBvbGRWZXJzaW9uICsgIiA8PSAiCisgICAgICAgICAgICAgICAgICAgICsgbmV3VmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIE1FVEFEQVRBX1RBQkxFX05BTUUpOworICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgQ0xJRU5UX1RBQkxFX05BTUUpOworICAgICAgICBvbkNyZWF0ZShkYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjbGllbnQgSUQsIHJldHVybnMgd2hldGhlciB0aGlzIGNsaWVudCBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgdG8gb3BlbiB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIGNsaWVudCBJRCB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpZW50IGlzIGtub3duLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRLbm93bihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAvLyBJZiB0aGUgY2xpZW50IGlzIGtub3duLCB0aGV5J2xsIGhhdmUgYSBub24tbnVsbCBtZXRhZGF0YSBVUkkuIEFuIGVtcHR5IHN0cmluZyBpcworICAgICAgICAvLyBhbGxvd2VkIGFzIGEgbWV0YWRhdGEgVVJJLCBpZiB0aGUgY2xpZW50IGRvZXNuJ3Qgd2FudCBhbnkgdXBkYXRlcyB0byBoYXBwZW4uCisgICAgICAgIHJldHVybiBudWxsICE9IGdldE1ldGFkYXRhVXJpQXNTdHJpbmcoY29udGV4dCwgY2xpZW50SWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1ldGFkYXRhIFVSSSBhcyBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIElmIHRoZSBjbGllbnQgaXMgbm90IGtub3duLCB0aGlzIHdpbGwgcmV0dXJuIG51bGwuIElmIGl0IGlzIGtub3duLCBpdCB3aWxsIHJldHVybgorICAgICAqIHRoZSBVUkkgYXMgYSBzdHJpbmcuIE5vdGUgdGhhdCB0aGUgZW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgaW5zdGFuY2UgdG8gb3BlbiB0aGUgZGF0YWJhc2Ugb24KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQgd2Ugd2FudCB0aGUgbWV0YWRhdGEgVVJJIG9mCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhZGF0YVVyaUFzU3RyaW5nKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRlZmF1bHREYiA9IGdldERiKGNvbnRleHQsIG51bGwpOworICAgICAgICBmaW5hbCBDdXJzb3IgY3Vyc29yID0gZGVmYXVsdERiLnF1ZXJ5KENMSUVOVF9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OIH0sCisgICAgICAgICAgICAgICAgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gKyAiID0gPyIsIG5ldyBTdHJpbmdbXSB7IGNsaWVudElkIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKDApOyAvLyBPbmx5IG9uZSBjb2x1bW4sIHJldHVybiBpdAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGxhc3QgbWV0YWRhdGEgdXBkYXRlIHRpbWUgZm9yIGFsbCBjbGllbnRzIHVzaW5nIGEgcGFydGljdWxhciBVUkkuCisgICAgICoKKyAgICAgKiBBbGwgY2xpZW50cyB1c2luZyB0aGlzIG1ldGFkYXRhIFVSSSB3aWxsIGJlIGluZGljYXRlZCBhcyBoYXZpbmcgYmVlbiB1cGRhdGVkIG5vdy4KKyAgICAgKiBUaGUgY3VycmVudCB0aW1lIGlzIHVzZWQgYXMgdGhlIGxhdGVzdCB1cGRhdGUgdGltZS4gVGhpcyBzYXZlZCBkYXRlIHdpbGwgYmUgd2hhdAorICAgICAqIGlzIHJldHVybmVkIGhlbmNlZm9ydGggYnkge0BsaW5rICNnZXRMYXN0VXBkYXRlRGF0ZUZvckNsaWVudChDb250ZXh0LCBTdHJpbmcpfSwKKyAgICAgKiB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgaW5zdGFuY2UgdG8gb3BlbiB0aGUgZGF0YWJhc2Ugb24KKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBtZXRhZGF0YSBVUkkgd2UganVzdCBkb3dubG9hZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVMYXN0VXBkYXRlVGltZU9mVXJpKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIHVyaSkgeworICAgICAgICBQcml2YXRlTG9nLmxvZygiU2F2ZSBsYXN0IHVwZGF0ZSB0aW1lIG9mIFVSSSA6ICIgKyB1cmkgKyAiICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KENMSUVOVF9MQVNUX1VQREFURV9EQVRFX0NPTFVNTiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgZGVmYXVsdERiLnVwZGF0ZShDTElFTlRfVEFCTEVfTkFNRSwgdmFsdWVzLAorICAgICAgICAgICAgICAgIENMSUVOVF9NRVRBREFUQV9VUklfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyB1cmkgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBsYXN0IGRhdGUgYXQgd2hpY2ggd2UgdXBkYXRlZCB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgY2xpZW50LgorICAgICAqCisgICAgICogVGhlIHJldHVybmVkIGRhdGUgaXMgaW4gbWlsbGlzZWNvbmRzIGZyb20gdGhlIEVQT0NIOyB0aGlzIGlzIHRoZSBzYW1lIHVuaXQgYXMKKyAgICAgKiByZXR1cm5lZCBieSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0IGluc3RhbmNlIHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBjbGllbnQgSUQgdG8gZ2V0IHRoZSBsYXRlc3QgdXBkYXRlIGRhdGUgb2YKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGRhdGUgYXQgd2hpY2ggdGhpcyBjbGllbnQgd2FzIHVwZGF0ZWQsIGFzIGEgbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TGFzdFVwZGF0ZURhdGVGb3JDbGllbnQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgbnVsbCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkZWZhdWx0RGIucXVlcnkoQ0xJRU5UX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ0xJRU5UX0xBU1RfVVBEQVRFX0RBVEVfQ09MVU1OIH0sCisgICAgICAgICAgICAgICAgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgbnVsbCA9PSBjbGllbnRJZCA/ICIiIDogY2xpZW50SWQgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRMb25nKDApOyAvLyBPbmx5IG9uZSBjb2x1bW4sIHJldHVybiBpdAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRvd25sb2FkIElEIGZvciBhIGNsaWVudCBJRC4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCByZXRyaWV2ZSB0aGUgZG93bmxvYWQgSUQgZm9yIHRoZSBtZXRhZGF0YSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudCBJRC4KKyAgICAgKiBJZiB0aGVyZSBpcyBubyBtZXRhZGF0YSBkb3dubG9hZCBpbiBwcm9ncmVzcyBmb3IgdGhpcyBjbGllbnQsIGl0IHdpbGwgcmV0dXJuIE5PVF9BTl9JRC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGEgY29udGV4dCBpbnN0YW5jZSB0byBvcGVuIHRoZSBkYXRhYmFzZSBvbgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IElEIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBkb3dubG9hZCBJRCBvZgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGRvd25sb2FkIElELCBvciBOT1RfQU5fSUQgaWYgbm8gZG93bmxvYWQgaXMgaW4gcHJvZ3Jlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0TWV0YWRhdGFEb3dubG9hZElkRm9yQ2xpZW50KGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRlZmF1bHREYi5xdWVyeShDTElFTlRfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDTElFTlRfUEVORElOR0lEX0NPTFVNTiB9LAorICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9LAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgcmV0dXJuIFVwZGF0ZUhhbmRsZXIuTk9UX0FOX0lEOworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoMCk7IC8vIE9ubHkgb25lIGNvbHVtbiwgcmV0dXJuIGl0CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRPbGRlc3RVcGRhdGVUaW1lKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCBudWxsKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRlZmF1bHREYi5xdWVyeShDTElFTlRfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDTElFTlRfTEFTVF9VUERBVEVfREFURV9DT0xVTU4gfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHJldHVybiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbkluZGV4ID0gMDsgLy8gT25seSBvbmUgY29sdW1uIHF1ZXJpZWQKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVhcmxpZXN0VGltZSB0byB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZS4KKyAgICAgICAgICAgIGxvbmcgZWFybGllc3RUaW1lID0gTG9uZy5NQVhfVkFMVUU7IC8vIEFsbW9zdCAzMDAgbWlsbGlvbiB5ZWFycyBpbiB0aGUgZnV0dXJlCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aGlzVGltZSA9IGN1cnNvci5nZXRMb25nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICBlYXJsaWVzdFRpbWUgPSBNYXRoLm1pbih0aGlzVGltZSwgZWFybGllc3RUaW1lKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpOworICAgICAgICAgICAgcmV0dXJuIGVhcmxpZXN0VGltZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBtYWtlIGNvbnRlbnQgdmFsdWVzIHRvIHdyaXRlIGludG8gdGhlIGRhdGFiYXNlLgorICAgICAqIEByZXR1cm4gY29udGVudCB2YWx1ZXMgd2l0aCBhbGwgdGhlIGFyZ3VtZW50cyBwdXQgd2l0aCB0aGUgcmlnaHQgY29sdW1uIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFZhbHVlcyBtYWtlQ29udGVudFZhbHVlcyhmaW5hbCBpbnQgcGVuZGluZ0lkLCBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgICAgIGZpbmFsIGludCBzdGF0dXMsIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBTdHJpbmcgbG9jYWxlLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBTdHJpbmcgZmlsZW5hbWUsIGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIGxvbmcgZGF0ZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGVja3N1bSwgZmluYWwgbG9uZyBmaWxlc2l6ZSwgZmluYWwgaW50IHZlcnNpb24sCisgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbikgeworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdCA9IG5ldyBDb250ZW50VmFsdWVzKENPTFVNTl9DT1VOVCk7CisgICAgICAgIHJlc3VsdC5wdXQoUEVORElOR0lEX0NPTFVNTiwgcGVuZGluZ0lkKTsKKyAgICAgICAgcmVzdWx0LnB1dChUWVBFX0NPTFVNTiwgdHlwZSk7CisgICAgICAgIHJlc3VsdC5wdXQoV09SRExJU1RJRF9DT0xVTU4sIHdvcmRsaXN0SWQpOworICAgICAgICByZXN1bHQucHV0KFNUQVRVU19DT0xVTU4sIHN0YXR1cyk7CisgICAgICAgIHJlc3VsdC5wdXQoTE9DQUxFX0NPTFVNTiwgbG9jYWxlKTsKKyAgICAgICAgcmVzdWx0LnB1dChERVNDUklQVElPTl9DT0xVTU4sIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgcmVzdWx0LnB1dChMT0NBTF9GSUxFTkFNRV9DT0xVTU4sIGZpbGVuYW1lKTsKKyAgICAgICAgcmVzdWx0LnB1dChSRU1PVEVfRklMRU5BTUVfQ09MVU1OLCB1cmwpOworICAgICAgICByZXN1bHQucHV0KERBVEVfQ09MVU1OLCBkYXRlKTsKKyAgICAgICAgcmVzdWx0LnB1dChDSEVDS1NVTV9DT0xVTU4sIGNoZWNrc3VtKTsKKyAgICAgICAgcmVzdWx0LnB1dChGSUxFU0laRV9DT0xVTU4sIGZpbGVzaXplKTsKKyAgICAgICAgcmVzdWx0LnB1dChWRVJTSU9OX0NPTFVNTiwgdmVyc2lvbik7CisgICAgICAgIHJlc3VsdC5wdXQoRk9STUFUVkVSU0lPTl9DT0xVTU4sIGZvcm1hdFZlcnNpb24pOworICAgICAgICByZXN1bHQucHV0KEZMQUdTX0NPTFVNTiwgMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBmaWxsIGluIGFuIGluY29tcGxldGUgQ29udGVudFZhbHVlcyB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIEEgd29yZGxpc3QgSUQgYW5kIGEgbG9jYWxlIGFyZSByZXF1aXJlZCwgb3RoZXJ3aXNlIEJhZEZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogQHJldHVybiB0aGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluLCBjb21wbGV0ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRWYWx1ZXMgY29tcGxldGVXaXRoRGVmYXVsdFZhbHVlcyhmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdCkKKyAgICAgICAgICAgIHRocm93cyBCYWRGb3JtYXRFeGNlcHRpb24geworICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShXT1JETElTVElEX0NPTFVNTikgfHwgIXJlc3VsdC5jb250YWluc0tleShMT0NBTEVfQ09MVU1OKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZEZvcm1hdEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIC8vIDAgZm9yIHRoZSBwZW5kaW5nIGlkLCBiZWNhdXNlIHRoZXJlIGlzIG5vbmUKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoUEVORElOR0lEX0NPTFVNTikpIHJlc3VsdC5wdXQoUEVORElOR0lEX0NPTFVNTiwgMCk7CisgICAgICAgIC8vIFRoaXMgaXMgYSBiaW5hcnkgYmxvYiBvZiBhIGRpY3Rpb25hcnkKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoVFlQRV9DT0xVTU4pKSByZXN1bHQucHV0KFRZUEVfQ09MVU1OLCBUWVBFX0JVTEspOworICAgICAgICAvLyBUaGlzIHdvcmQgbGlzdCBpcyB1bmtub3duLCBidXQgaXQncyBwcmVzZW50LCBlbHNlIHdlIHdvdWxkbid0IGJlIGhlcmUsIHNvIElOU1RBTExFRAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShTVEFUVVNfQ09MVU1OKSkgcmVzdWx0LnB1dChTVEFUVVNfQ09MVU1OLCBTVEFUVVNfSU5TVEFMTEVEKTsKKyAgICAgICAgLy8gTm8gZGVzY3JpcHRpb24gdW5sZXNzIHNwZWNpZmllZCwgYmVjYXVzZSB3ZSBjYW4ndCBndWVzcyBpdAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShERVNDUklQVElPTl9DT0xVTU4pKSByZXN1bHQucHV0KERFU0NSSVBUSU9OX0NPTFVNTiwgIiIpOworICAgICAgICAvLyBGaWxlIG5hbWUgLSB0aGlzIGlzIGFuIGFzc2V0LCBzbyBpdCB3b3JrcyBhcyBhbiBhbHJlYWR5IGRlbGV0ZWQgZmlsZS4KKyAgICAgICAgLy8gICAgIGhlbmNlLCB3ZSBuZWVkIHRvIHN1cHBseSBhIG5vbi1leGlzdGVudCBmaWxlIG5hbWUuIEFueXRoaW5nIHdpbGwKKyAgICAgICAgLy8gICAgIGRvIGFzIGxvbmcgYXMgaXQgcmV0dXJucyBmYWxzZSB3aGVuIHRlc3RlZCB3aXRoIEZpbGUjZXhpc3QoKSwgYW5kCisgICAgICAgIC8vICAgICB0aGUgZW1wdHkgc3RyaW5nIGRvZXMgbm90LCBzbyBpdCdzIHNldCB0byAiXyIuCisgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zS2V5KExPQ0FMX0ZJTEVOQU1FX0NPTFVNTikpIHJlc3VsdC5wdXQoTE9DQUxfRklMRU5BTUVfQ09MVU1OLCAiXyIpOworICAgICAgICAvLyBObyByZW1vdGUgZmlsZSBuYW1lIDogdGhpcyBjYW4ndCBiZSBkb3dubG9hZGVkLiBVbmxlc3Mgc3BlY2lmaWVkLgorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShSRU1PVEVfRklMRU5BTUVfQ09MVU1OKSkgcmVzdWx0LnB1dChSRU1PVEVfRklMRU5BTUVfQ09MVU1OLCAiIik7CisgICAgICAgIC8vIDAgZm9yIHRoZSB1cGRhdGUgZGF0ZSA6IDE5NzAvMS8xLiBVbmxlc3Mgc3BlY2lmaWVkLgorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShEQVRFX0NPTFVNTikpIHJlc3VsdC5wdXQoREFURV9DT0xVTU4sIDApOworICAgICAgICAvLyBDaGVja3N1bSB1bmtub3duIHVubGVzcyBzcGVjaWZpZWQKKyAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnNLZXkoQ0hFQ0tTVU1fQ09MVU1OKSkgcmVzdWx0LnB1dChDSEVDS1NVTV9DT0xVTU4sICIiKTsKKyAgICAgICAgLy8gTm8gZmlsZXNpemUgdW5sZXNzIHNwZWNpZmllZAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShGSUxFU0laRV9DT0xVTU4pKSByZXN1bHQucHV0KEZJTEVTSVpFX0NPTFVNTiwgMCk7CisgICAgICAgIC8vIFNtYWxsZXN0IHBvc3NpYmxlIHZlcnNpb24gdW5sZXNzIHNwZWNpZmllZAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShWRVJTSU9OX0NPTFVNTikpIHJlc3VsdC5wdXQoVkVSU0lPTl9DT0xVTU4sIDEpOworICAgICAgICAvLyBBc3N1bWUgY3VycmVudCBmb3JtYXQgdW5sZXNzIHNwZWNpZmllZAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShGT1JNQVRWRVJTSU9OX0NPTFVNTikpCisgICAgICAgICAgICByZXN1bHQucHV0KEZPUk1BVFZFUlNJT05fQ09MVU1OLCBVcGRhdGVIYW5kbGVyLk1BWElNVU1fU1VQUE9SVEVEX0ZPUk1BVF9WRVJTSU9OKTsKKyAgICAgICAgLy8gTm8gZmxhZ3MgdW5sZXNzIHNwZWNpZmllZAorICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShGTEFHU19DT0xVTU4pKSByZXN1bHQucHV0KEZMQUdTX0NPTFVNTiwgMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBjb2x1bW4gaW4gYSBDdXJzb3IgYXMgYSBTdHJpbmcgYW5kIHN0b3JlcyBpdCBpbiBhIENvbnRlbnRWYWx1ZXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIENvbnRlbnRWYWx1ZXMgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCisgICAgICogQHBhcmFtIGN1cnNvciB0aGUgQ3Vyc29yIHRvIHJlYWQgdGhlIGNvbHVtbiBmcm9tLgorICAgICAqIEBwYXJhbSBjb2x1bW5JZCB0aGUgY29sdW1uIElEIHRvIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRTdHJpbmdSZXN1bHQoQ29udGVudFZhbHVlcyByZXN1bHQsIEN1cnNvciBjdXJzb3IsIFN0cmluZyBjb2x1bW5JZCkgeworICAgICAgICByZXN1bHQucHV0KGNvbHVtbklkLCBjdXJzb3IuZ2V0U3RyaW5nKGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW5JZCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNvbHVtbiBpbiBhIEN1cnNvciBhcyBhbiBpbnQgYW5kIHN0b3JlcyBpdCBpbiBhIENvbnRlbnRWYWx1ZXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIENvbnRlbnRWYWx1ZXMgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCisgICAgICogQHBhcmFtIGN1cnNvciB0aGUgQ3Vyc29yIHRvIHJlYWQgdGhlIGNvbHVtbiBmcm9tLgorICAgICAqIEBwYXJhbSBjb2x1bW5JZCB0aGUgY29sdW1uIElEIHRvIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRJbnRSZXN1bHQoQ29udGVudFZhbHVlcyByZXN1bHQsIEN1cnNvciBjdXJzb3IsIFN0cmluZyBjb2x1bW5JZCkgeworICAgICAgICByZXN1bHQucHV0KGNvbHVtbklkLCBjdXJzb3IuZ2V0SW50KGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW5JZCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZW50VmFsdWVzIGdldEZpcnN0TGluZUFzQ29udGVudFZhbHVlcyhmaW5hbCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgcmVzdWx0OworICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb250ZW50VmFsdWVzKENPTFVNTl9DT1VOVCk7CisgICAgICAgICAgICBwdXRJbnRSZXN1bHQocmVzdWx0LCBjdXJzb3IsIFBFTkRJTkdJRF9DT0xVTU4pOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBUWVBFX0NPTFVNTik7CisgICAgICAgICAgICBwdXRJbnRSZXN1bHQocmVzdWx0LCBjdXJzb3IsIFNUQVRVU19DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBXT1JETElTVElEX0NPTFVNTik7CisgICAgICAgICAgICBwdXRTdHJpbmdSZXN1bHQocmVzdWx0LCBjdXJzb3IsIExPQ0FMRV9DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBERVNDUklQVElPTl9DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBMT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBSRU1PVEVfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dEludFJlc3VsdChyZXN1bHQsIGN1cnNvciwgREFURV9DT0xVTU4pOworICAgICAgICAgICAgcHV0U3RyaW5nUmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBDSEVDS1NVTV9DT0xVTU4pOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBGSUxFU0laRV9DT0xVTU4pOworICAgICAgICAgICAgcHV0SW50UmVzdWx0KHJlc3VsdCwgY3Vyc29yLCBWRVJTSU9OX0NPTFVNTik7CisgICAgICAgICAgICBwdXRJbnRSZXN1bHQocmVzdWx0LCBjdXJzb3IsIEZPUk1BVFZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgICAgIHB1dEludFJlc3VsdChyZXN1bHQsIGN1cnNvciwgRkxBR1NfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcHJpbnQgdGhlIHNlY29uZCBsZXZlbCBvZiB0aGUgc3RhY2sgdG8gdGhlIGxvZyBzbyB0aGF0IHdlIGtub3cKKyAgICAgICAgICAgICAgICAvLyBpbiB3aGljaCBjb2RlIHBhdGggdGhlIGVycm9yIGhhcHBlbmVkCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2V2ZXJhbCBTUUwgcmVzdWx0cyB3aGVuIHdlIGV4cGVjdGVkIG9ubHkgb25lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZm8gYWJvdXQgYXMgc3BlY2lmaWMgZG93bmxvYWQsIGluZGV4ZWQgYnkgaXRzIERvd25sb2FkTWFuYWdlciBJRC4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIERvd25sb2FkTWFuYWdlciBpZC4KKyAgICAgKiBAcmV0dXJuIG1ldGFkYXRhIGFib3V0IHRoaXMgZG93bmxvYWQuIFRoaXMgcmV0dXJucyBhbGwgY29sdW1ucyBpbiB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50VmFsdWVzIGdldENvbnRlbnRWYWx1ZXNCeVBlbmRpbmdJZChmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQpIHsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfVEFCTEVfQ09MVU1OUywKKyAgICAgICAgICAgICAgICBQRU5ESU5HSURfQ09MVU1OICsgIj0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhpZCkgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUgcmVzdWx0LiBJZiBiZWNhdXNlIG9mIHNvbWUgYnVnIHRoZXJlIGFyZSwgcmV0dXJuaW5nCisgICAgICAgIC8vIG9ubHkgb25lIHJlc3VsdCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIGJlY2F1c2Ugd2UgY291bGRuJ3QgaGFuZGxlIHNldmVyYWwgYW55d2F5CisgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgc3RpbGwgaGFuZGxlIG9uZS4KKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyByZXN1bHQgPSBnZXRGaXJzdExpbmVBc0NvbnRlbnRWYWx1ZXMoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5mbyBhYm91dCBhbiBpbnN0YWxsZWQgT1IgZGVsZXRpbmcgd29yZCBsaXN0IHdpdGggYSBzcGVjaWZpZWQgaWQuCisgICAgICoKKyAgICAgKiBCYXNpY2FsbHksIHRoaXMgaXMgdGhlIHdvcmQgbGlzdCB0aGF0IHdlIHdhbnQgdG8gcmV0dXJuIHRvIEFuZHJvaWQgS2V5Ym9hcmQgd2hlbgorICAgICAqIGl0IGFza3MgZm9yIGEgc3BlY2lmaWMgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIHdvcmQgbGlzdCBJRC4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBhYm91dCB0aGlzIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRWYWx1ZXMgZ2V0SW5zdGFsbGVkT3JEZWxldGluZ1dvcmRMaXN0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZCgKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfVEFCTEVfQ09MVU1OUywKKyAgICAgICAgICAgICAgICBXT1JETElTVElEX0NPTFVNTiArICI9PyBBTkQgKCIgKyBTVEFUVVNfQ09MVU1OICsgIj0/IE9SICIgKyBTVEFUVVNfQ09MVU1OICsgIj0/KSIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgaWQsIEludGVnZXIudG9TdHJpbmcoU1RBVFVTX0lOU1RBTExFRCksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19ERUxFVElORykgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc3VsdCwgYnV0IGlmIHRoZXJlIGFyZSBzZXZlcmFsLCB3ZSBjYW4ndCB0ZWxsIHdoaWNoCisgICAgICAgIC8vIGlzIHRoZSBiZXN0LCBzbyB3ZSBqdXN0IHJldHVybiB0aGUgZmlyc3Qgb25lLgorICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdCA9IGdldEZpcnN0TGluZUFzQ29udGVudFZhbHVlcyhjdXJzb3IpOworICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHNwZWNpZmljIGRvd25sb2FkIElELCByZXR1cm4gcmVjb3JkcyBmb3IgYWxsIHBlbmRpbmcgZG93bmxvYWRzIGFjcm9zcyBhbGwgY2xpZW50cy4KKyAgICAgKgorICAgICAqIElmIHNldmVyYWwgY2xpZW50cyB1c2UgdGhlIHNhbWUgbWV0YWRhdGEgVVJMLCB3ZSBrbm93IHRvIG9ubHkgZG93bmxvYWQgaXQgb25jZSwgYW5kCisgICAgICogZGlzcGF0Y2ggdGhlIHVwZGF0ZSBwcm9jZXNzIGFjcm9zcyBhbGwgcmVsZXZhbnQgY2xpZW50cyB3aGVuIHRoZSBkb3dubG9hZCBlbmRzLiBUaGlzIG1lYW5zCisgICAgICogc2V2ZXJhbCBjbGllbnRzIG1heSBzaGFyZSBhIHNpbmdsZSBkb3dubG9hZCBJRCBpZiB0aGV5IHNoYXJlIGEgbWV0YWRhdGEgVVJJLgorICAgICAqIFRoZSBkaXNwYXRjaGluZyBpcyBkb25lIGluIHtAbGluayBVcGRhdGVIYW5kbGVyI2Rvd25sb2FkRmluaXNoZWQoQ29udGV4dCwgSW50ZW50KX0sIHdoaWNoCisgICAgICogZmluZHMgb3V0IGFib3V0IHRoZSBsaXN0IG9mIHJlbGV2YW50IGNsaWVudHMgYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGEgY29udGV4dCBpbnN0YW5jZSB0byBvcGVuIHRoZSBkYXRhYmFzZXMKKyAgICAgKiBAcGFyYW0gZG93bmxvYWRJZCB0aGUgZG93bmxvYWQgSUQgdG8gcXVlcnkgYWJvdXQKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlY29yZHMuIE5ldmVyIG51bGwsIGJ1dCBtYXkgYmUgZW1wdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8RG93bmxvYWRSZWNvcmQ+IGdldERvd25sb2FkUmVjb3Jkc0ZvckRvd25sb2FkSWQoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgbG9uZyBkb3dubG9hZElkKSB7CisgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRlZmF1bHREYiA9IGdldERiKGNvbnRleHQsICIiKTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PERvd25sb2FkUmVjb3JkPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxEb3dubG9hZFJlY29yZD4oKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRlZmF1bHREYi5xdWVyeShDTElFTlRfVEFCTEVfTkFNRSwgQ0xJRU5UX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICAgIGZpbmFsIGludCBjbGllbnRJZEluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENMSUVOVF9DTElFTlRfSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwZW5kaW5nSWRDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4pOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGVuZGluZ0lkID0gY3Vyc29yLmdldEludChwZW5kaW5nSWRDb2x1bW4pOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCA9IGN1cnNvci5nZXRTdHJpbmcoY2xpZW50SWRJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PSBkb3dubG9hZElkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG5ldyBEb3dubG9hZFJlY29yZChjbGllbnRJZCwgbnVsbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlc0ZvclRoaXNDbGllbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGVudFZhbHVlc0J5UGVuZGluZ0lkKGdldERiKGNvbnRleHQsIGNsaWVudElkKSwgZG93bmxvYWRJZCk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdmFsdWVzRm9yVGhpc0NsaWVudCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgRG93bmxvYWRSZWNvcmQoY2xpZW50SWQsIHZhbHVlc0ZvclRoaXNDbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZm8gYWJvdXQgYSBzcGVjaWZpYyB3b3JkIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIGRhdGFiYXNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIHdvcmQgbGlzdCBJRC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgd29yZCBsaXN0IHZlcnNpb24uCisgICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgYWJvdXQgdGhpcyB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50VmFsdWVzIGdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIGludCB2ZXJzaW9uKSB7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiPSA/IEFORCAiICsgVkVSU0lPTl9DT0xVTU4gKyAiPSA/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBpZCwgSW50ZWdlci50b1N0cmluZyh2ZXJzaW9uKSB9LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgLy8gVGhpcyBpcyBhIGxvb2t1cCBieSBwcmltYXJ5IGtleSwgc28gdGhlcmUgY2FuJ3QgYmUgbW9yZSB0aGFuIG9uZSByZXN1bHQuCisgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgcmVzdWx0ID0gZ2V0Rmlyc3RMaW5lQXNDb250ZW50VmFsdWVzKGN1cnNvcik7CisgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZm8gYWJvdXQgdGhlIGxhdGVzdCB3b3JkIGxpc3Qgd2l0aCBhbiBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgZGF0YWJhc2UgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tLgorICAgICAqIEBwYXJhbSBpZCB0aGUgd29yZCBsaXN0IElELgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGFib3V0IHRoZSB3b3JkIGxpc3Qgd2l0aCB0aGlzIGlkIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFZhbHVlcyBnZXRDb250ZW50VmFsdWVzT2ZMYXRlc3RBdmFpbGFibGVXb3JkbGlzdEJ5SWQoCisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiPSA/IiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBpZCB9LCBudWxsLCBudWxsLCBWRVJTSU9OX0NPTFVNTiArICIgREVTQyIsICIxIik7CisgICAgICAgIC8vIFRoaXMgaXMgYSBsb29rdXAgYnkgcHJpbWFyeSBrZXksIHNvIHRoZXJlIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUgcmVzdWx0LgorICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHJlc3VsdCA9IGdldEZpcnN0TGluZUFzQ29udGVudFZhbHVlcyhjdXJzb3IpOworICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGFkYXRhIGFib3V0IElOU1RBTExFRCwgQVZBSUxBQkxFIG9yIERFTEVUSU5HIGRpY3Rpb25hcmllcy4KKyAgICAgKgorICAgICAqIFRoaXMgb2RkIG1ldGhvZCBpcyB0YWlsb3JlZCB0byB0aGUgbmVlZHMgb2YKKyAgICAgKiBEaWN0aW9uYXJ5UHJvdmlkZXIjZ2V0RGljdGlvbmFyeVdvcmRMaXN0c0ZvckNvbnRlbnRVcmksIHdoaWNoIG5lZWRzIHRoZSB3b3JkIGxpc3QgaWYKKyAgICAgKiBpdCBpczoKKyAgICAgKiAtIElOU1RBTExFRDogdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgdG8gTGF0aW5JTUUgaWYgdGhlIGZpbGUgaXMgc3RpbGwgaW5zaWRlIHRoZSBkaWN0aW9uYXJ5CisgICAgICogcGFjaywgc28gdGhhdCBpdCBjYW4gYmUgY29waWVkLiBJZiB0aGUgZmlsZSBpcyBub3QgdGhlcmUsIGl0J3MgYmVlbiBjb3BpZWQgYWxyZWFkeSBhbmQgc2hvdWxkCisgICAgICogbm90IGJlIHJldHVybmVkLCBzbyBnZXREaWN0aW9uYXJ5V29yZExpc3RzRm9yQ29udGVudFVyaSB0YWtlcyBjYXJlIG9mIHRoaXMuCisgICAgICogLSBERUxFVElORzogdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgdG8gTGF0aW5JTUUgc28gdGhhdCBpdCBjYW4gYWN0dWFsbHkgZGVsZXRlIHRoZSBmaWxlLgorICAgICAqIC0gQVZBSUxBQkxFOiB0aGlzIHNob3VsZCBub3QgYmUgcmV0dXJuZWQsIGJ1dCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYXV0by1pbnN0YWxsYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgZ2V0dGluZyB0aGUgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBjbGllbnQgaWQgZm9yIHJldHJpZXZpbmcgdGhlIGRhdGFiYXNlLiBudWxsIGZvciBkZWZhdWx0IChkZXByZWNhdGVkKQorICAgICAqIEByZXR1cm4gYSBjdXJzb3Igd2l0aCBtZXRhZGF0YSBhYm91dCB1c2FibGUgZGljdGlvbmFyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yIHF1ZXJ5SW5zdGFsbGVkT3JEZWxldGluZ09yQXZhaWxhYmxlRGljdGlvbmFyeU1ldGFkYXRhKAorICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgLy8gSWYgY2xpZW50SWQgaXMgbnVsbCwgd2UgZ2V0IHRoZSBkZWZhdXQgREIgKHNlZSAjZ2V0SW5zdGFuY2UoKSBmb3IgbW9yZSBhYm91dCB0aGlzKQorICAgICAgICBmaW5hbCBDdXJzb3IgcmVzdWx0cyA9IGdldERiKGNvbnRleHQsIGNsaWVudElkKS5xdWVyeShNRVRBREFUQV9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX1RBQkxFX0NPTFVNTlMsCisgICAgICAgICAgICAgICAgU1RBVFVTX0NPTFVNTiArICIgPSA/IE9SICIgKyBTVEFUVVNfQ09MVU1OICsgIiA9ID8gT1IgIiArIFNUQVRVU19DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhTVEFUVVNfSU5TVEFMTEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoU1RBVFVTX0RFTEVUSU5HKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoU1RBVFVTX0FWQUlMQUJMRSkgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBMT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBtZXRhZGF0YSBhYm91dCBhbGwgZGljdGlvbmFyaWVzLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBhYm91dCBhbGwgZGljdGlvbmFyaWVzLCBpbmNsdWRpbmcKKyAgICAgKiBvbGRlciBmaWxlcywgb3IgZmlsZXMgbm90IHlldCBkb3dubG9hZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgZm9yIGdldHRpbmcgdGhlIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IGlkIGZvciByZXRyaWV2aW5nIHRoZSBkYXRhYmFzZS4gbnVsbCBmb3IgZGVmYXVsdCAoZGVwcmVjYXRlZCkKKyAgICAgKiBAcmV0dXJuIGEgY3Vyc29yIHdpdGggbWV0YWRhdGEgYWJvdXQgdXNhYmxlIGRpY3Rpb25hcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBxdWVyeUN1cnJlbnRNZXRhZGF0YShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAvLyBJZiBjbGllbnRJZCBpcyBudWxsLCB3ZSBnZXQgdGhlIGRlZmF1dCBEQiAoc2VlICNnZXRJbnN0YW5jZSgpIGZvciBtb3JlIGFib3V0IHRoaXMpCisgICAgICAgIGZpbmFsIEN1cnNvciByZXN1bHRzID0gZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpLnF1ZXJ5KE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfVEFCTEVfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgTE9DQUxFX0NPTFVNTik7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGRpY3Rpb25hcmllcyBrbm93biB0byB0aGUgZGljdGlvbmFyeSBwcm92aWRlciwgd2l0aCBvbmx5IHB1YmxpYyBjb2x1bW5zLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGFsbCBrbm93biBkaWN0aW9uYXJpZXMsIGFuZCB0aGVpciBzdGF0dXMuIEFzIHN1Y2gsCisgICAgICogaXQgd2lsbCBhbHNvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBkaWN0aW9uYXJpZXMgb24gdGhlIHNlcnZlciB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICAgKiBkb3dubG9hZGVkIHlldCwgYnV0IG1heSBiZSByZXF1ZXN0ZWQuCisgICAgICogVGhpcyBvbmx5IHJldHVybnMgcHVibGljIGNvbHVtbnMuIEl0IGRvZXMgbm90IHBvcHVsYXRlIGludGVybmFsIGNvbHVtbnMgaW4gdGhlIHJldHVybmVkCisgICAgICogY3Vyc29yLgorICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBnb29kIHRvIGJlIHJldHVybmVkIGRpcmVjdGx5IGZvciBhCisgICAgICogcmVxdWVzdCBvZiB0aGUgbGlzdCBvZiBkaWN0aW9uYXJpZXMgYnkgYSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB0byByZWFkIHRoZSBkYXRhYmFzZSBmcm9tLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgY2xpZW50IGlkIGZvciByZXRyaWV2aW5nIHRoZSBkYXRhYmFzZS4gbnVsbCBmb3IgZGVmYXVsdCAoZGVwcmVjYXRlZCkKKyAgICAgKiBAcmV0dXJuIGEgY3Vyc29yIHRoYXQgbGlzdHMgYWxsIGF2YWlsYWJsZSBkaWN0aW9uYXJpZXMgYW5kIHRoZWlyIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yIHF1ZXJ5RGljdGlvbmFyaWVzKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIC8vIElmIGNsaWVudElkIGlzIG51bGwsIHdlIGdldCB0aGUgZGVmYXV0IERCIChzZWUgI2dldEluc3RhbmNlKCkgZm9yIG1vcmUgYWJvdXQgdGhpcykKKyAgICAgICAgZmluYWwgQ3Vyc29yIHJlc3VsdHMgPSBnZXREYihjb250ZXh0LCBjbGllbnRJZCkucXVlcnkoTUVUQURBVEFfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBESUNUSU9OQVJJRVNfTElTVF9QVUJMSUNfQ09MVU1OUywKKyAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IGxvY2FsZXMgc28gYXMgbm90IHRvIHJldHVybiBhdXhpbGlhcnkgZGF0YSwgbGlrZSBhCisgICAgICAgICAgICAgICAgLy8gZGF0YSBsaW5lIGZvciBkb3dubG9hZGluZyBtZXRhZGF0YToKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4gKyAiICE9ID8iLCBuZXcgU3RyaW5nW10geyIifSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZWluc3RhdGUgdGhlIGZvbGxvd2luZyBjb2RlIGZvciBidWxrLCB0aGVuIGltcGxlbWVudCBwYXJ0aWFsIHVwZGF0ZXMKKyAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLlRZUEVfQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5UWVBFX0JVTEspIH0sICovCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgTE9DQUxFX0NPTFVNTik7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgZm9yIG9wZW5pbmcgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBJRCBvZiB0aGUgY2xpZW50IHRvIGRlbGV0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlQ2xpZW50KGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIC8vIFJlbW92ZSBhbGwgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xpZW50CisgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgTUVUQURBVEFfVEFCTEVfTkFNRSk7CisgICAgICAgIGRiLmV4ZWNTUUwoTUVUQURBVEFfVEFCTEVfQ1JFQVRFKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgY2xpZW50J3MgZW50cnkgaW4gdGhlIGNsaWVudHMgdGFibGUKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGVmYXVsdERiID0gZ2V0RGIoY29udGV4dCwgIiIpOworICAgICAgICBpZiAoMCA9PSBkZWZhdWx0RGIuZGVsZXRlKENMSUVOVF9UQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgaW5mb3JtYXRpb24gcmVsYXRpdmUgdG8gYSBzcGVjaWZpYyBjbGllbnQuCisgICAgICoKKyAgICAgKiBVcGRhdGFibGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgb25seSB0aGUgbWV0YWRhdGEgVVJJLCBidXQgbWF5IGJlIGV4cGFuZGVkIGluIHRoZSBmdXR1cmUuCisgICAgICogVGhlIHBhc3NlZCB2YWx1ZXMgbXVzdCBpbmNsdWRlIGEgY2xpZW50IElEIGluIHRoZSBrZXkgQ0xJRU5UX0NMSUVOVF9JRF9DT0xVTU4sIGFuZCBpdCBtdXN0CisgICAgICogYmUgZXF1YWwgdG8gdGhlIHN0cmluZyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgZm9yIGNsaWVudElkLgorICAgICAqIFRoZSBwYXNzZWQgdmFsdWVzIG11c3QgYWxzbyBpbmNsdWRlIGEgbm9uLWVtcHR5IG1ldGFkYXRhIFVSSSBpbiB0aGUKKyAgICAgKiBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiBjb2x1bW4uCisgICAgICogSWYgYW55IG9mIHRoZSBhYm92ZSBpcyBub3QgY29tcGxpZWQgd2l0aCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdpdGhvdXQgdXBkYXRpbmcgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0LCB0byBvcGVuIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgSUQgb2YgdGhlIGNsaWVudCB0byB1cGRhdGUKKyAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMgdG8gdXBkYXRlLiBNdXN0IGNvbmZvcm0gdG8gdGhlIHByb3RvY29sIChzZWUgYWJvdmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUNsaWVudEluZm8oZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIGNvbnRlbnQgdmFsdWVzCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZXNDbGllbnRJZCA9IHZhbHVlcy5nZXRBc1N0cmluZyhDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTik7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZXNNZXRhZGF0YVVyaSA9IHZhbHVlcy5nZXRBc1N0cmluZyhDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTik7CisgICAgICAgIC8vIEVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIGNsaWVudCBJRCwgYnV0IGV4dGVybmFsIGFwcHMgbWF5IG5vdCBjb25maWd1cmUgaXQuCisgICAgICAgIC8vIEVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIG1ldGFkYXRhIFVSSSBpZiB0aGUgY2xpZW50IGRvZXMgbm90IHdhbnQgdXBkYXRlcy4KKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlc0NsaWVudElkKSB8fCBudWxsID09IHZhbHVlc01ldGFkYXRhVXJpKSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIGJvdGggdGhlc2UgY29sdW1ucyB0byBiZSBmaWxsZWQgaW4KKyAgICAgICAgICAgIFV0aWxzLmwoIk1pc3NpbmcgcGFyYW1ldGVyIGZvciB1cGRhdGVDbGllbnRJbmZvIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjbGllbnRJZC5lcXVhbHModmFsdWVzQ2xpZW50SWQpKSB7CisgICAgICAgICAgICAvLyBNaXNtYXRjaCEgVGhlIGNsaWVudCB2aW9sYXRlcyB0aGUgcHJvdG9jb2wuCisgICAgICAgICAgICBVdGlscy5sKCJSZWNlaXZlZCBhbiB1cGRhdGVDbGllbnRJbmZvIHJlcXVlc3QgZm9yICIsIGNsaWVudElkLCAiIGJ1dCB0aGUgdmFsdWVzICIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29udGFpbiBhIGRpZmZlcmVudCBJRCA6ICIsIHZhbHVlc0NsaWVudElkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCAiIik7CisgICAgICAgIGlmICgtMSA9PSBkZWZhdWx0RGIuaW5zZXJ0KENMSUVOVF9UQUJMRV9OQU1FLCBudWxsLCB2YWx1ZXMpKSB7CisgICAgICAgICAgICBkZWZhdWx0RGIudXBkYXRlKENMSUVOVF9UQUJMRV9OQU1FLCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIENMSUVOVF9DTElFTlRfSURfQ09MVU1OICsgIiA9ID8iLCBuZXcgU3RyaW5nW10geyBjbGllbnRJZCB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBleGlzdGluZyBjbGllbnQgSURzLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlCisgICAgICogQHJldHVybiBhIGN1cnNvciBjb250YWluaW5nIG9ubHkgb25lIGNvbHVtbiwgYW5kIG9uZSBjbGllbnQgSUQgcGVyIGxpbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3IgcXVlcnlDbGllbnRJZHMoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBnZXREYihjb250ZXh0LCBudWxsKS5xdWVyeShDTElFTlRfVEFCTEVfTkFNRSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDTElFTlRfQ0xJRU5UX0lEX0NPTFVNTiB9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGRvd25sb2FkIElEIGZvciBhIHNwZWNpZmljIG1ldGFkYXRhIFVSSS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGRvd25sb2FkIGZvciBhIG1ldGFkYXRhIFVSSSBpcyBzdGFydGluZy4gSXQgd2lsbAorICAgICAqIHJlZ2lzdGVyIHRoZSBkb3dubG9hZCBJRCBmb3IgYWxsIGNsaWVudHMgdXNpbmcgdGhpcyBtZXRhZGF0YSBVUkkgaW50byB0aGUgZGF0YWJhc2UKKyAgICAgKiBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHtAbGluayAjZ2V0RG93bmxvYWRSZWNvcmRzRm9yRG93bmxvYWRJZChDb250ZXh0LCBsb25nKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQgZm9yIG9wZW5pbmcgZGF0YWJhc2VzCisgICAgICogQHBhcmFtIHVyaSB0aGUgbWV0YWRhdGEgVVJJCisgICAgICogQHBhcmFtIGRvd25sb2FkSWQgdGhlIGRvd25sb2FkIElECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWV0YWRhdGFEb3dubG9hZElkKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIHVyaSwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93bmxvYWRJZCkgeworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoQ0xJRU5UX1BFTkRJTkdJRF9DT0xVTU4sIGRvd25sb2FkSWQpOworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkZWZhdWx0RGIgPSBnZXREYihjb250ZXh0LCAiIik7CisgICAgICAgIGRlZmF1bHREYi51cGRhdGUoQ0xJRU5UX1RBQkxFX05BTUUsIHZhbHVlcywKKyAgICAgICAgICAgICAgICBDTElFTlRfTUVUQURBVEFfVVJJX0NPTFVNTiArICIgPSA/IiwgbmV3IFN0cmluZ1tdIHsgdXJpIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIGEgZG93bmxvYWRpbmcgZW50cnkgYXMgaGF2aW5nIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkIGFuZCBiZWluZyBpbnN0YWxsZWQuCisgICAgICoKKyAgICAgKiBUaGUgbWV0YWRhdGEgZGF0YWJhc2UgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgb25nb2luZyBwcm9jZXNzZXMsIHR5cGljYWxseSBvbmdvaW5nCisgICAgICogZG93bmxvYWRzLiBUaGlzIG1hcmtzIHN1Y2ggYW4gZW50cnkgYXMgaGF2aW5nIGZpbmlzaGVkIGFuZCBoYXZpbmcgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseSwKKyAgICAgKiBzbyBpdCBiZWNvbWVzIElOU1RBTExFRC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIHIgY29udGVudCB2YWx1ZXMgYWJvdXQgdGhlIGVudHJ5IHRvIG1hcmsgYXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0ZpbmlzaGVkRG93bmxvYWRpbmdBbmRJbnN0YWxsZWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHIpIHsKKyAgICAgICAgc3dpdGNoIChyLmdldEFzSW50ZWdlcihUWVBFX0NPTFVNTikpIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CVUxLOgorICAgICAgICAgICAgICAgIFV0aWxzLmwoIkVuZGVkIHByb2Nlc3NpbmcgYSB3b3JkbGlzdCIpOworICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIGEgYnVsayB3b3JkIGxpc3QgaXMgYSB0aHJlZS1zdGVwIG9wZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAvLyAtIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSB0YWJsZQorICAgICAgICAgICAgICAgIC8vIC0gUmVtb3ZlIHRoZSBvbGQgZW50cnkgZnJvbSB0aGUgdGFibGUKKyAgICAgICAgICAgICAgICAvLyAtIEVyYXNlIHRoZSBvbGQgZmlsZQorICAgICAgICAgICAgICAgIC8vIFdlIHN0YXJ0IGJ5IGdhdGhlcmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdlIHNob3VsZCBkZWxldGUuCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGZpbGVuYW1lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDdXJzb3IgYyA9IGRiLnF1ZXJ5KE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBMT0NBTF9GSUxFTkFNRV9DT0xVTU4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMRV9DT0xVTU4gKyAiID0gPyBBTkQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JETElTVElEX0NPTFVNTiArICIgPSA/IEFORCAiICsgU1RBVFVTX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHIuZ2V0QXNTdHJpbmcoTE9DQUxFX0NPTFVNTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0QXNTdHJpbmcoV09SRExJU1RJRF9DT0xVTU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKFNUQVRVU19JTlNUQUxMRUQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBuZXZlciBiZSBtb3JlIHRoYW4gb25lIGZpbGUsIGJ1dCBpZiB0aGVyZSBhcmUsIGl0J3MgYSBidWcKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIHNob3VsZCByZW1vdmUgdGhlbSBhbGwuIEkgdGhpbmsgaXQgbWlnaHQgaGFwcGVuIGlmIHRoZSBwb3dlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcGhvbmUgaXMgc3VkZGVubHkgY3V0IGR1cmluZyBhbiB1cGRhdGUuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWxlbmFtZUluZGV4ID0gYy5nZXRDb2x1bW5JbmRleChMT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5sKCJTZXR0aW5nIGZvciByZW1vdmFsIiwgYy5nZXRTdHJpbmcoZmlsZW5hbWVJbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzLmFkZChjLmdldFN0cmluZyhmaWxlbmFtZUluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByLnB1dChTVEFUVVNfQ09MVU1OLCBTVEFUVVNfSU5TVEFMTEVEKTsKKyAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCBvbGQgZW50cmllcy4gVGhlcmUgc2hvdWxkIG5ldmVyIGJlIGFueSBzdGFsbGVkIGVudHJpZXMsIGJ1dCBpZgorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSwgdGhpcyBkZWxldGVzIHRoZW0uCisgICAgICAgICAgICAgICAgZGIuZGVsZXRlKE1FVEFEQVRBX1RBQkxFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JETElTVElEX0NPTFVNTiArICIgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHIuZ2V0QXNTdHJpbmcoV09SRExJU1RJRF9DT0xVTU4pIH0pOworICAgICAgICAgICAgICAgIGRiLmluc2VydChNRVRBREFUQV9UQUJMRV9OQU1FLCBudWxsLCByKTsKKyAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogZmlsZW5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBwZXJtaXNzaW9ucyB0byBkZWxldGUuIFVtLiBDYW4ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICAgICAgICAgICAgfSAvLyBJIGRvbid0IHRoaW5rIGFueXRoaW5nIGVsc2UgY2FuIGJlIHRocm93bgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVW5rbm93biB0eXBlOiBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBkb3dubG9hZGluZyBlbnRyeSBmcm9tIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgaW52b2tlZCB3aGVuIGEgZG93bmxvYWQgZmFpbHMuIEVpdGhlciB3ZSB0cmllZCB0byBkb3dubG9hZCwgYnV0CisgICAgICogd2UgcmVjZWl2ZWQgYSBwZXJtYW5lbnQgZmFpbHVyZSBhbmQgd2Ugc2hvdWxkIHJlbW92ZSBpdCwgb3Igd2UgZ290IG1hbnVhbGx5CisgICAgICogY2FuY2VsbGVkIGFuZCB3ZSBzaG91bGQgbGVhdmUgaXQgYXQgdGhhdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBEb3dubG9hZE1hbmFnZXIgaWQgb2YgdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURvd25sb2FkaW5nRW50cnkoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIGxvbmcgaWQpIHsKKyAgICAgICAgZGIuZGVsZXRlKE1FVEFEQVRBX1RBQkxFX05BTUUsIFBFTkRJTkdJRF9DT0xVTU4gKyAiID0gPyBBTkQgIiArIFNUQVRVU19DT0xVTU4gKyAiID0gPyIsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhpZCksIEludGVnZXIudG9TdHJpbmcoU1RBVFVTX0RPV05MT0FESU5HKSB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZWZ1bGx5IHJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGludm9rZWQgd2hlbiBhIGZpbGUgaXMgYnJva2VuLiBUaGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkLCBidXQgQW5kcm9pZAorICAgICAqIEtleWJvYXJkIGlzIHRlbGxpbmcgdXMgaXQgY291bGQgbm90IG9wZW4gaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVFbnRyeShmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBkYi5kZWxldGUoTUVUQURBVEFfVEFCTEVfTkFNRSwgV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIiArIFZFUlNJT05fQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IGlkLCBJbnRlZ2VyLnRvU3RyaW5nKHZlcnNpb24pIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHNldHMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGFuIGVudHJ5IG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIHRvIHNldCB0aGUgd29yZCBsaXN0IHRvLgorICAgICAqIEBwYXJhbSBkb3dubG9hZElkIGFuIG9wdGlvbmFsIGRvd25sb2FkIGlkIHRvIHdyaXRlLCBvciBOT1RfQV9ET1dOTE9BRF9JRAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFya0VudHJ5QXMoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBsb25nIGRvd25sb2FkSWQpIHsKKyAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBNZXRhZGF0YURiSGVscGVyLmdldENvbnRlbnRWYWx1ZXNCeVdvcmRMaXN0SWQoZGIsIGlkLCB2ZXJzaW9uKTsKKyAgICAgICAgdmFsdWVzLnB1dChTVEFUVVNfQ09MVU1OLCBzdGF0dXMpOworICAgICAgICBpZiAoTk9UX0FfRE9XTkxPQURfSUQgIT0gZG93bmxvYWRJZCkgeworICAgICAgICAgICAgdmFsdWVzLnB1dChNZXRhZGF0YURiSGVscGVyLlBFTkRJTkdJRF9DT0xVTU4sIGRvd25sb2FkSWQpOworICAgICAgICB9CisgICAgICAgIGRiLnVwZGF0ZShNRVRBREFUQV9UQUJMRV9OQU1FLCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgV09SRExJU1RJRF9DT0xVTU4gKyAiID0gPyBBTkQgIiArIFZFUlNJT05fQ09MVU1OICsgIiA9ID8iLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IGlkLCBJbnRlZ2VyLnRvU3RyaW5nKHZlcnNpb24pIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3RhdHVzIGNvbHVtbiBmb3IgdGhlIHdvcmRsaXN0IHdpdGggdGhpcyBpZCBhcyBlbmFibGVkLiBUeXBpY2FsbHkgdGhpcworICAgICAqIG1lYW5zIHRoZSB3b3JkIGxpc3QgaXMgY3VycmVudGx5IGRpc2FibGVkIGFuZCB3ZSB3YW50IHRvIHNldCBpdHMgc3RhdHVzIHRvIElOU1RBTExFRC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtFbnRyeUFzRW5hYmxlZChmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkLAorICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgbWFya0VudHJ5QXMoZGIsIGlkLCB2ZXJzaW9uLCBTVEFUVVNfSU5TVEFMTEVELCBOT1RfQV9ET1dOTE9BRF9JRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzdGF0dXMgY29sdW1uIGZvciB0aGUgd29yZGxpc3Qgd2l0aCB0aGlzIGlkIGFzIGRpc2FibGVkLiBUeXBpY2FsbHkgdGhpcworICAgICAqIG1lYW5zIHRoZSB3b3JkIGxpc3QgaXMgY3VycmVudGx5IGluc3RhbGxlZCBhbmQgd2Ugd2FudCB0byBzZXQgaXRzIHN0YXR1cyB0byBESVNBQkxFRC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtFbnRyeUFzRGlzYWJsZWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uKSB7CisgICAgICAgIG1hcmtFbnRyeUFzKGRiLCBpZCwgdmVyc2lvbiwgU1RBVFVTX0RJU0FCTEVELCBOT1RfQV9ET1dOTE9BRF9JRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzdGF0dXMgY29sdW1uIGZvciB0aGUgd29yZGxpc3Qgd2l0aCB0aGlzIGlkIGFzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGZvcgorICAgICAqIGV4YW1wbGUgd2hlbiBhIHdvcmQgbGlzdCBoYXMgYmVlbiBkZWxldGVkIGJ1dCBjYW4gYmUgZG93bmxvYWRlZCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtFbnRyeUFzQXZhaWxhYmxlKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBtYXJrRW50cnlBcyhkYiwgaWQsIHZlcnNpb24sIFNUQVRVU19BVkFJTEFCTEUsIE5PVF9BX0RPV05MT0FEX0lEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRlc2lnbmF0ZWQgd29yZCBsaXN0IGFzIGRvd25sb2FkYWJsZSwgYWxvbmdzaWRlIHdpdGggaXRzIGRvd25sb2FkIGlkLgorICAgICAqCisgICAgICogQHBhcmFtIGRiIHRoZSBtZXRhZGF0YSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gZG93bmxvYWRJZCB0aGUgZG93bmxvYWQgaWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtFbnRyeUFzRG93bmxvYWRpbmcoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBsb25nIGRvd25sb2FkSWQpIHsKKyAgICAgICAgbWFya0VudHJ5QXMoZGIsIGlkLCB2ZXJzaW9uLCBTVEFUVVNfRE9XTkxPQURJTkcsIGRvd25sb2FkSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZGVzaWduYXRlZCB3b3JkIGxpc3QgYXMgZGVsZXRpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgdGhlIG1ldGFkYXRhIGRhdGFiYXNlLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRW50cnlBc0RlbGV0aW5nKGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiLCBmaW5hbCBTdHJpbmcgaWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBtYXJrRW50cnlBcyhkYiwgaWQsIHZlcnNpb24sIFNUQVRVU19ERUxFVElORywgTk9UX0FfRE9XTkxPQURfSUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhSGFuZGxlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNDdiNgotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL01ldGFkYXRhSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gZWFzeSB1cCBtYW5pcHVsYXRpb24gb2YgZGljdGlvbmFyeSBwYWNrIG1ldGFkYXRhLgorICovCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFIYW5kbGVyIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRpY3Rpb25hcnlQcm92aWRlcjoiICsgTWV0YWRhdGFIYW5kbGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8vIFRoZSBjYW5vbmljYWwgZmlsZSBuYW1lIGZvciBtZXRhZGF0YS4gVGhpcyBpcyBub3QgdGhlIG5hbWUgb2YgYSByZWFsIGZpbGUgb24gdGhlCisgICAgLy8gZGV2aWNlLCBidXQgYSBzeW1ib2xpYyBuYW1lIHVzZWQgaW4gdGhlIGRhdGFiYXNlIGFuZCBpbiBtZXRhZGF0YSBoYW5kbGluZy4gSXQgaXMgbmV2ZXIKKyAgICAvLyB0ZXN0ZWQgYWdhaW5zdCwgb25seSB1c2VkIGZvciBodW1hbi1yZWFkYWJpbGl0eSBhcyB0aGUgZmlsZSBuYW1lIGZvciB0aGUgbWV0YWRhdGEuCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVUQURBVEFfRklMRU5BTUUgPSAibWV0YWRhdGEuanNvbiI7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYW5kIHN0b3JlIGl0IGluIG1ldGFkYXRhIG9iamVjdHMuCisgICAgICogQHBhcmFtIHJlc3VsdHMgdGhlIGN1cnNvciB0byByZWFkIGRhdGEgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBsaXN0IG9mIHdvcmRsaXN0IG1ldGFkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gbWFrZU1ldGFkYXRhT2JqZWN0KGZpbmFsIEN1cnNvciByZXN1bHRzKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBidWlsZGluZ01ldGFkYXRhID0gbmV3IEFycmF5TGlzdDxXb3JkTGlzdE1ldGFkYXRhPigpOworCisgICAgICAgIGlmIChyZXN1bHRzLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbGVDb2x1bW4gPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxFX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZUNvbHVtbiA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5UWVBFX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgZGVzY3JpcHRpb25Db2x1bW4gPQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZEluZGV4ID0gcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB1cGRhdGVJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5EQVRFX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgZmlsZVNpemVJbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5GSUxFU0laRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IGNoZWNrc3VtSW5kZXggPSByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuQ0hFQ0tTVU1fQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBsb2NhbEZpbGVuYW1lSW5kZXggPQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldENvbHVtbkluZGV4KE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGZpbmFsIGludCByZW1vdGVGaWxlbmFtZUluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLlJFTU9URV9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb25JbmRleCA9IHJlc3VsdHMuZ2V0Q29sdW1uSW5kZXgoTWV0YWRhdGFEYkhlbHBlci5WRVJTSU9OX0NPTFVNTik7CisgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbkluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRDb2x1bW5JbmRleChNZXRhZGF0YURiSGVscGVyLkZPUk1BVFZFUlNJT05fQ09MVU1OKTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGJ1aWxkaW5nTWV0YWRhdGEuYWRkKG5ldyBXb3JkTGlzdE1ldGFkYXRhKHJlc3VsdHMuZ2V0U3RyaW5nKGlkSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRJbnQodHlwZUNvbHVtbiksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldFN0cmluZyhkZXNjcmlwdGlvbkNvbHVtbiksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldExvbmcodXBkYXRlSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRMb25nKGZpbGVTaXplSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRTdHJpbmcoY2hlY2tzdW1JbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldFN0cmluZyhsb2NhbEZpbGVuYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRTdHJpbmcocmVtb3RlRmlsZW5hbWVJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldEludCh2ZXJzaW9uSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXRJbnQoZm9ybWF0VmVyc2lvbkluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJlc3VsdHMuZ2V0U3RyaW5nKGxvY2FsZUNvbHVtbikpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdHMubW92ZVRvTmV4dCgpKTsKKworICAgICAgICAgICAgcmVzdWx0cy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGJ1aWxkaW5nTWV0YWRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHdob2xlIG1ldGFkYXRhLCBmb3IgaW5zdGFsbGVkIGFuZCBub3QgaW5zdGFsbGVkIGRpY3Rpb25hcmllcy4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBvcGVuIGZpbGVzIG92ZXIuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBjbGllbnQgaWQgZm9yIHJldHJpZXZpbmcgdGhlIGRhdGFiYXNlLiBudWxsIGZvciBkZWZhdWx0IChkZXByZWNhdGVkKQorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGdldEN1cnJlbnRNZXRhZGF0YShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgLy8gSWYgY2xpZW50SWQgaXMgbnVsbCwgd2UgZ2V0IGEgY3Vyc29yIG9uIHRoZSBkZWZhdWx0IGRhdGFiYXNlIChzZWUKKyAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlciNnZXRJbnN0YW5jZSgpIGZvciBtb3JlIG9uIHRoaXMpCisgICAgICAgIGZpbmFsIEN1cnNvciByZXN1bHRzID0gTWV0YWRhdGFEYkhlbHBlci5xdWVyeUN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gcmVzdWx0TGlzdCA9IG1ha2VNZXRhZGF0YU9iamVjdChyZXN1bHRzKTsKKyAgICAgICAgcmVzdWx0cy5jbG9zZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0TGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gYSBzdHJlYW0uCisgICAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJlYW0gdG8gcmVhZCBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIHJlYWQgbWV0YWRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgc3RyZWFtIGNhbm5vdCBiZSByZWFkCisgICAgICogQHRocm93cyBCYWRGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBpcyBub3QgaW4gYSBrbm93biBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gcmVhZE1ldGFkYXRhKGZpbmFsIElucHV0U3RyZWFtUmVhZGVyIGlucHV0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gTWV0YWRhdGFQYXJzZXIucGFyc2VNZXRhZGF0YShpbnB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBzaW5nbGUgV29yZExpc3RNZXRhZGF0YSBpbnNpZGUgYSB3aG9sZSBtZXRhZGF0YSBjaHVuay4KKyAgICAgKgorICAgICAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIHdob2xlIHBhc3NlZCBtZXRhZGF0YSBmb3IgdGhlIGZpcnN0IFdvcmRMaXN0TWV0YWRhdGEgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIHBhc3NlZCBJRC4gSWYgc2V2ZXJhbCBtZXRhZGF0YSBjaHVua3Mgd2l0aCB0aGUgc2FtZSBpZCBhcmUgZm91bmQsIGl0IHdpbGwKKyAgICAgKiBhbHdheXMgcmV0dXJuIHRoZSBvbmUgd2l0aCB0aGUgYmlnZ2VyIEZvcm1hdFZlcnNpb24gdGhhdCBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gdGhlCisgICAgICogbWF4aW11bSBzdXBwb3J0ZWQgZm9ybWF0IHZlcnNpb24gKGFzIGxpc3RlZCBpbiBVcGRhdGVIYW5kbGVyKS4KKyAgICAgKiBUaGlzIHdpbGwgTkVWRVIgcmV0dXJuIHRoZSBtZXRhZGF0YSB3aXRoIGEgRm9ybWF0VmVyc2lvbiBiaWdnZXIgdGhhbiB3aGF0IGlzIHN1cHBvcnRlZCwKKyAgICAgKiBldmVuIGlmIGl0IGlzIHRoZSBvbmx5IHdvcmQgbGlzdCB3aXRoIHRoaXMgSUQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIG1ldGFkYXRhIHRvIHNlYXJjaCBpbnRvLgorICAgICAqIEBwYXJhbSBpZCB0aGUgd29yZCBsaXN0IElEIG9mIHRoZSBtZXRhZGF0YSB0byBmaW5kLgorICAgICAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEsIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV29yZExpc3RNZXRhZGF0YSBmaW5kV29yZExpc3RCeUlkKGZpbmFsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gbWV0YWRhdGEsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgV29yZExpc3RNZXRhZGF0YSBiZXN0V29yZExpc3QgPSBudWxsOworICAgICAgICBpbnQgYmVzdEZvcm1hdFZlcnNpb24gPSBJbnRlZ2VyLk1JTl9WQUxVRTsgLy8gVG8gYmUgc3VyZSB3ZSBjYW4ndCBiZSBpbmFkdmVydGVudGx5IHNtYWxsZXIKKyAgICAgICAgZm9yIChXb3JkTGlzdE1ldGFkYXRhIHdvcmRMaXN0IDogbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMod29yZExpc3QubUlkKQorICAgICAgICAgICAgICAgICAgICAmJiB3b3JkTGlzdC5tRm9ybWF0VmVyc2lvbiA8PSBVcGRhdGVIYW5kbGVyLk1BWElNVU1fU1VQUE9SVEVEX0ZPUk1BVF9WRVJTSU9OCisgICAgICAgICAgICAgICAgICAgICYmIHdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uID4gYmVzdEZvcm1hdFZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBiZXN0V29yZExpc3QgPSB3b3JkTGlzdDsKKyAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0VmVyc2lvbiA9IHdvcmRMaXN0Lm1Gb3JtYXRWZXJzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBtYXRjaCB3ZSdsbCByZXR1cm4gbnVsbC4KKyAgICAgICAgcmV0dXJuIGJlc3RXb3JkTGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9NZXRhZGF0YVBhcnNlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY3MGZkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svTWV0YWRhdGFQYXJzZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuSnNvblJlYWRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgY29udGFpbmluZyBmdW5jdGlvbnMgdG8gcGFyc2UgdGhlIGRpY3Rpb25hcnkgbWV0YWRhdGEuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhZGF0YVBhcnNlciB7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIEpTT04tZm9ybWF0dGVkIGZpbGUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0ZJRUxEX05BTUUgPSBNZXRhZGF0YURiSGVscGVyLldPUkRMSVNUSURfQ09MVU1OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfRklFTERfTkFNRSA9ICJsb2NhbGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9GSUVMRF9OQU1FID0gTWV0YWRhdGFEYkhlbHBlci5ERVNDUklQVElPTl9DT0xVTU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9GSUVMRF9OQU1FID0gInVwZGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVTSVpFX0ZJRUxEX05BTUUgPSBNZXRhZGF0YURiSGVscGVyLkZJTEVTSVpFX0NPTFVNTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tTVU1fRklFTERfTkFNRSA9IE1ldGFkYXRhRGJIZWxwZXIuQ0hFQ0tTVU1fQ09MVU1OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVEVfRklMRU5BTUVfRklFTERfTkFNRSA9CisgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLlJFTU9URV9GSUxFTkFNRV9DT0xVTU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRklFTERfTkFNRSA9IE1ldGFkYXRhRGJIZWxwZXIuVkVSU0lPTl9DT0xVTU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFZFUlNJT05fRklFTERfTkFNRSA9IE1ldGFkYXRhRGJIZWxwZXIuRk9STUFUVkVSU0lPTl9DT0xVTU47CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBvbmUgSlNPTi1mb3JtYXR0ZWQgd29yZCBsaXN0IG1ldGFkYXRhLgorICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciBjb250YWluaW5nIHRoZSBkYXRhLgorICAgICAqIEByZXR1cm4gYSBXb3JkTGlzdE1ldGFkYXRhIG9iamVjdCBmcm9tIHRoZSBwYXJzZWQgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHJlYWRlciB0aHJvd3MgSU9FeGNlcHRpb24gZHVyaW5nIHJlYWRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgV29yZExpc3RNZXRhZGF0YSBwYXJzZU9uZVdvcmRMaXN0KGZpbmFsIEpzb25SZWFkZXIgcmVhZGVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBhcmd1bWVudHMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShuYW1lKSkgeworICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXQobmFtZSwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChJRF9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KExPQ0FMRV9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KERFU0NSSVBUSU9OX0ZJRUxEX05BTUUpKQorICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGFyZ3VtZW50cy5nZXQoVVBEQVRFX0ZJRUxEX05BTUUpKQorICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGFyZ3VtZW50cy5nZXQoRklMRVNJWkVfRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChDSEVDS1NVTV9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KFJFTU9URV9GSUxFTkFNRV9GSUVMRF9OQU1FKSkKKyAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShhcmd1bWVudHMuZ2V0KFZFUlNJT05fRklFTERfTkFNRSkpCisgICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoYXJndW1lbnRzLmdldChGT1JNQVRWRVJTSU9OX0ZJRUxEX05BTUUpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZEZvcm1hdEV4Y2VwdGlvbihhcmd1bWVudHMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIGl0J3MgYnVsayBvciB1cGRhdGUKKyAgICAgICAgLy8gVGhlIG51bGwgYXJndW1lbnQgaXMgdGhlIGxvY2FsIGZpbGUgbmFtZSwgd2hpY2ggaXMgbm90IGtub3duIGF0IHRoaXMgdGltZSBhbmQgd2lsbAorICAgICAgICAvLyBiZSBkZWNpZGVkIGxhdGVyLgorICAgICAgICByZXR1cm4gbmV3IFdvcmRMaXN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgYXJndW1lbnRzLmdldChJRF9GSUVMRF9OQU1FKSwKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLlRZUEVfQlVMSywKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMuZ2V0KERFU0NSSVBUSU9OX0ZJRUxEX05BTUUpLAorICAgICAgICAgICAgICAgIExvbmcucGFyc2VMb25nKGFyZ3VtZW50cy5nZXQoVVBEQVRFX0ZJRUxEX05BTUUpKSwKKyAgICAgICAgICAgICAgICBMb25nLnBhcnNlTG9uZyhhcmd1bWVudHMuZ2V0KEZJTEVTSVpFX0ZJRUxEX05BTUUpKSwKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMuZ2V0KENIRUNLU1VNX0ZJRUxEX05BTUUpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgYXJndW1lbnRzLmdldChSRU1PVEVfRklMRU5BTUVfRklFTERfTkFNRSksCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChhcmd1bWVudHMuZ2V0KFZFUlNJT05fRklFTERfTkFNRSkpLAorICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoYXJndW1lbnRzLmdldChGT1JNQVRWRVJTSU9OX0ZJRUxEX05BTUUpKSwKKyAgICAgICAgICAgICAgICAwLCBhcmd1bWVudHMuZ2V0KExPQ0FMRV9GSUVMRF9OQU1FKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIG1ldGFkYXRhIGluIHRoZSBKU09OIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gaW5wdXQgYSBzdHJlYW0gcmVhZGVyIGV4cGVjdGVkIHRvIGNvbnRhaW4gSlNPTiBmb3JtYXR0ZWQgbWV0YWRhdGEuCisgICAgICogQHJldHVybiBkaWN0aW9uYXJ5IG1ldGFkYXRhLCBhcyBhbiBhcnJheSBvZiBXb3JkTGlzdE1ldGFkYXRhIG9iamVjdHMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyByZWFkZXIgdGhyb3dzIElPRXhjZXB0aW9uIGR1cmluZyByZWFkaW5nLgorICAgICAqIEB0aHJvd3MgQmFkRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBkYXRhIHdhcyBub3QgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gcGFyc2VNZXRhZGF0YShmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQmFkRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihpbnB1dCk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxXb3JkTGlzdE1ldGFkYXRhPiByZWFkSW5mbyA9IG5ldyBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4oKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgdGhpc01ldGFkYXRhID0gcGFyc2VPbmVXb3JkTGlzdChyZWFkZXIpOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aGlzTWV0YWRhdGEubUxvY2FsZSkpCisgICAgICAgICAgICAgICAgcmVhZEluZm8uYWRkKHRoaXNNZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVhZEluZm8pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJpdmF0ZUxvZy5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJpdmF0ZUxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTNjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Qcml2YXRlTG9nLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIENsYXNzIHRvIGtlZXAgbG9uZy10ZXJtIGxvZy4gVGhpcyBpcyBpbmFjdGl2ZSBpbiBwcm9kdWN0aW9uLCBhbmQgaXMgb25seSBmb3IgZGVidWcgcHVycG9zZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBQcml2YXRlTG9nIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IERpY3Rpb25hcnlQcm92aWRlci5ERUJVRzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfREFUQUJBU0VfTkFNRSA9ICJsb2ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFCTEVfTkFNRSA9ICJsb2ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfREFUQUJBU0VfVkVSU0lPTiA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RBVEUgPSAiZGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9FVkVOVCA9ICJldmVudCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBQkxFX0NSRUFURSA9ICJDUkVBVEUgVEFCTEUgIiArIExPR19UQUJMRV9OQU1FICsgIiAoIgorICAgICAgICAgICAgKyBDT0xVTU5fREFURSArICIgVEVYVCwiCisgICAgICAgICAgICArIENPTFVNTl9FVkVOVCArICIgVEVYVCk7IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc0RhdGVGb3JtYXQgPQorICAgICAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiKTsKKworICAgIHByaXZhdGUgc3RhdGljIFByaXZhdGVMb2cgc0luc3RhbmNlID0gbmV3IFByaXZhdGVMb2coKTsKKyAgICBwcml2YXRlIHN0YXRpYyBEZWJ1Z0hlbHBlciBtRGVidWdIZWxwZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBQcml2YXRlTG9nKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFByaXZhdGVMb2cgZ2V0SW5zdGFuY2UoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybiBzSW5zdGFuY2U7CisgICAgICAgIHN5bmNocm9uaXplZChQcml2YXRlTG9nLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoc0luc3RhbmNlLm1EZWJ1Z0hlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlLm1EZWJ1Z0hlbHBlciA9IG5ldyBEZWJ1Z0hlbHBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWJ1Z0hlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworCisgICAgICAgIHByaXZhdGUgRGVidWdIZWxwZXIoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBMT0dfREFUQUJBU0VfTkFNRSwgbnVsbCwgTE9HX0RBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBpZiAoIURFQlVHKSByZXR1cm47CisgICAgICAgICAgICBkYi5leGVjU1FMKExPR19UQUJMRV9DUkVBVEUpOworICAgICAgICAgICAgaW5zZXJ0KGRiLCAiQ3JlYXRlZCB0YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAoIURFQlVHKSByZXR1cm47CisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGRhdGEuCisgICAgICAgICAgICBkYi5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgTE9HX1RBQkxFX05BTUUpOworICAgICAgICAgICAgb25DcmVhdGUoZGIpOworICAgICAgICAgICAgaW5zZXJ0KGRiLCAiVXBncmFkZSBmaW5pc2hlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBldmVudCkgeworICAgICAgICAgICAgaWYgKCFERUJVRykgcmV0dXJuOworICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjID0gbmV3IENvbnRlbnRWYWx1ZXMoMik7CisgICAgICAgICAgICBjLnB1dChDT0xVTU5fREFURSwgc0RhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkpOworICAgICAgICAgICAgYy5wdXQoQ09MVU1OX0VWRU5ULCBldmVudCk7CisgICAgICAgICAgICBkYi5pbnNlcnQoTE9HX1RBQkxFX05BTUUsIG51bGwsIGMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBldmVudCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgbCA9IGdldEluc3RhbmNlKGNvbnRleHQpLm1EZWJ1Z0hlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIG1EZWJ1Z0hlbHBlci5pbnNlcnQobCwgZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIGV2ZW50LCBDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKCFERUJVRykgcmV0dXJuOworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBsID0KKyAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZShwcm92aWRlci5nZXRDb250ZXh0KCkpLm1EZWJ1Z0hlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIG1EZWJ1Z0hlbHBlci5pbnNlcnQobCwgZXZlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1Byb2JsZW1SZXBvcnRlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svUHJvYmxlbVJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyODE5YQotLS0gL2Rldi9udWxsCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1Byb2JsZW1SZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworLyoqCisgKiBBIHNpbXBsZSBpbnRlcmZhY2UgdG8gcmVwb3J0IHByb2JsZW1zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1SZXBvcnRlciB7CisgICAgcHVibGljIHZvaWQgcmVwb3J0KEV4Y2VwdGlvbiBlKTsKK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1VwZGF0ZUhhbmRsZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1VwZGF0ZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNmNmVkCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svVXBkYXRlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTA4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlci5RdWVyeTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Eb3dubG9hZE1hbmFnZXIuUmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuY29tcGF0LkNvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5jb21wYXQuRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uUjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCisvKioKKyAqIEhhbmRsZXIgZm9yIHRoZSB1cGRhdGUgcHJvY2Vzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGluIGNoYXJnZSBvZiBjb29yZGluYXRpbmcgdGhlIHVwZGF0ZSBwcm9jZXNzIGZvciB0aGUgdmFyaW91cyBkaWN0aW9uYXJpZXMKKyAqIHN0b3JlZCBpbiB0aGUgZGljdGlvbmFyeSBwYWNrLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXBkYXRlSGFuZGxlciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGljdGlvbmFyeVByb3ZpZGVyOiIgKyBVcGRhdGVIYW5kbGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGljdGlvbmFyeVByb3ZpZGVyLkRFQlVHOworCisgICAgLy8gVXNlZCB0byBwcmV2ZW50IHRyeWluZyB0byByZWFkIHRoZSBpZCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGJlZm9yZSBpdCBpcyB3cml0dGVuCisgICAgc3RhdGljIGZpbmFsIE9iamVjdCBzU2hhcmVkSWRQcm90ZWN0b3IgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBWYWx1ZSB1c2VkIHRvIG1lYW4gdGhpcyBpcyBub3QgYSByZWFsIERvd25sb2FkTWFuYWdlciBkb3dubG9hZGVkIGZpbGUgaWQKKyAgICAvLyBEb3dubG9hZE1hbmFnZXIgdXNlcyBhcyBhbiBJRCBudW1iZXJzIHJldHVybmVkIG91dCBvZiBhbiBBVVRPSU5DUkVNRU5UIGNvbHVtbgorICAgIC8vIGluIFNRTGl0ZSwgc28gaXQgc2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDAuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FOX0lEID0gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9TVVBQT1JURURfRk9STUFUX1ZFUlNJT04gPSAyOworCisgICAgLy8gQXJiaXRyYXJ5LiBQcm9iYWJseSBnb29kIGlmIGl0J3MgYSBwb3dlciBvZiAyLCBhbmQgYSBjb3VwbGUgdGhvdXNhbmQgYnl0ZXMgbG9uZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9DT1BZX0JVRkZFUl9TSVpFID0gODE5MjsKKworICAgIC8vIFRhYmxlIGZpeGVkIHZhbHVlcyBmb3IgbWV0YWRhdGEgLyBkb3dubG9hZHMKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFEQVRBX05BTUUgPSAibWV0YWRhdGEiOworICAgIGZpbmFsIHN0YXRpYyBpbnQgTUVUQURBVEFfVFlQRSA9IDA7CisgICAgZmluYWwgc3RhdGljIGludCBXT1JETElTVF9UWVBFID0gMTsKKworICAgIC8vIFN1ZmZpeCBmb3IgZ2VuZXJhdGVkIGRpY3Rpb25hcnkgZmlsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVF9GSUxFX1NVRkZJWCA9ICIuZGljdCI7CisgICAgLy8gTmFtZSBvZiB0aGUgY2F0ZWdvcnkgZm9yIHRoZSBtYWluIGRpY3Rpb25hcnkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0RJQ1RJT05BUllfQ0FURUdPUlkgPSAibWFpbiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0aW9uIG9mIHRoZSBpbnRlbnQgZm9yIHB1Ymxpc2hpbmcgdGhhdCBuZXcgZGljdGlvbmFyeSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgZGlmZmVyZW50IGFjcm9zcyBkaWZmZXJlbnQgcGFja2FnZXMuIEEgc3VnZ2VzdGVkIGNvdXJzZSBvZiBhY3Rpb24gaXMKKyAgICAvLyB0byB1c2UgdGhlIHBhY2thZ2UgbmFtZSBpbnNpZGUgdGhpcyBzdHJpbmcuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJQ1RJT05BUllfSU5URU5UX0FDVElPTiA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2submV3ZGljdCI7CisKKyAgICAvLyBUaGUgaWQgZm9yIHRoZSAiZGljdGlvbmFyeSBhdmFpbGFibGUiIG5vdGlmaWNhdGlvbi4KKyAgICBzdGF0aWMgZmluYWwgaW50IERJQ1RfQVZBSUxBQkxFX05PVElGSUNBVElPTl9JRCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcmZhY2UgZm9yIFVJcyBvciBzZXJ2aWNlcyB0aGF0IHdhbnQgdG8ga25vdyB3aGVuIHNvbWV0aGluZyBoYXBwZW5lZC4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgY2hpZWZseSB1c2VkIGJ5IHRoZSBkaWN0aW9uYXJ5IG1hbmFnZXIgVUkuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBVcGRhdGVFdmVudExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgZG93bmxvYWRlZE1ldGFkYXRhKGJvb2xlYW4gc3VjY2VlZGVkKTsKKyAgICAgICAgcHVibGljIHZvaWQgd29yZExpc3REb3dubG9hZEZpbmlzaGVkKFN0cmluZyB3b3JkTGlzdElkLCBib29sZWFuIHN1Y2NlZWRlZCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUN5Y2xlQ29tcGxldGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgY3VycmVudGx5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VXBkYXRlRXZlbnRMaXN0ZW5lcj4gc1VwZGF0ZUV2ZW50TGlzdGVuZXJzCisgICAgICAgICAgICA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IExpbmtlZExpc3Q8VXBkYXRlRXZlbnRMaXN0ZW5lcj4oKSk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvZiB1cGRhdGVzLgorICAgICAqCisgICAgICogRG9uJ3QgZm9yZ2V0IHRvIGNhbGwgdW5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIgd2hlbiBkb25lIHdpdGggaXQsIG9yCisgICAgICogaXQgd2lsbCBsZWFrIHRoZSByZWdpc3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJVcGRhdGVFdmVudExpc3RlbmVyKGZpbmFsIFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc1VwZGF0ZUV2ZW50TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5yZWdpc3RlclVwZGF0ZUV2ZW50TGlzdGVuZXIoZmluYWwgVXBkYXRlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzVXBkYXRlRXZlbnRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfUFJFRlNfS0VZID0gImRvd25sb2FkT3Zlck1ldGVyZWQiOworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIERvd25sb2FkTWFuYWdlciBJRCBvZiB0aGUgY3VycmVudGx5IGRvd25sb2FkaW5nIG1ldGFkYXRhIHRvIHBlcm1hbmVudCBzdG9yYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdG8gb3BlbiBzaGFyZWQgcHJlZnMKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgb2YgdGhlIG1ldGFkYXRhCisgICAgICogQHBhcmFtIGRvd25sb2FkSWQgdGhlIGlkIHJldHVybmVkIGJ5IERvd25sb2FkTWFuYWdlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVNZXRhZGF0YURvd25sb2FkSWQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgZmluYWwgbG9uZyBkb3dubG9hZElkKSB7CisgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIucmVnaXN0ZXJNZXRhZGF0YURvd25sb2FkSWQoY29udGV4dCwgdXJpLCBkb3dubG9hZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOTE9BRF9PVkVSX01FVEVSRURfU0VUVElOR19VTktOT1dOID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOTE9BRF9PVkVSX01FVEVSRURfQUxMT1dFRCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX0RJU0FMTE9XRUQgPSAyOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0dGluZyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgd2UgbWF5IGRvd25sb2FkIG92ZXIgYSBtZXRlcmVkIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERvd25sb2FkT3Zlck1ldGVyZWRTZXR0aW5nKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkRG93bmxvYWRPdmVyTWV0ZXJlZCkgeworICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IENvbW1vblByZWZlcmVuY2VzLmdldENvbW1vblByZWZlcmVuY2VzKGNvbnRleHQpOworICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gcHJlZnMuZWRpdCgpOworICAgICAgICBlZGl0b3IucHV0SW50KERPV05MT0FEX09WRVJfTUVURVJFRF9TRVRUSU5HX1BSRUZTX0tFWSwgc2hvdWxkRG93bmxvYWRPdmVyTWV0ZXJlZAorICAgICAgICAgICAgICAgID8gRE9XTkxPQURfT1ZFUl9NRVRFUkVEX0FMTE9XRUQgOiBET1dOTE9BRF9PVkVSX01FVEVSRURfRElTQUxMT1dFRCk7CisgICAgICAgIGVkaXRvci5hcHBseSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNldHRpbmcgdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHdlIG1heSBkb3dubG9hZCBvdmVyIGEgbWV0ZXJlZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyByZXR1cm5zIG9uZSBvZiB0aGUgY29uc3RhbnRzIGFib3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERvd25sb2FkT3Zlck1ldGVyZWRTZXR0aW5nKGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IENvbW1vblByZWZlcmVuY2VzLmdldENvbW1vblByZWZlcmVuY2VzKGNvbnRleHQpOworICAgICAgICBmaW5hbCBpbnQgc2V0dGluZyA9IHByZWZzLmdldEludChET1dOTE9BRF9PVkVSX01FVEVSRURfU0VUVElOR19QUkVGU19LRVksCisgICAgICAgICAgICAgICAgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfVU5LTk9XTik7CisgICAgICAgIHJldHVybiBzZXR0aW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvd25sb2FkIGxhdGVzdCBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgdGhyb3VnaCBEb3dubG9hZE1hbmFnZXIgZm9yIGFsbCBrbm93biBjbGllbnRzCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHJldHJpZXZpbmcgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIHVwZGF0ZU5vdyBXaGV0aGVyIHdlIHNob3VsZCB1cGRhdGUgTk9XLCBvciByZXNwZWN0IGJhbmR3aWR0aCBwb2xpY2llcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGUoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBib29sZWFuIHVwZGF0ZU5vdykgeworICAgICAgICAvLyBUT0RPOiBsb29wIHRocm91Z2ggYWxsIGNsaWVudHMgaW5zdGVhZCBvZiBvbmx5IGRvaW5nIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAgICAgZmluYWwgVHJlZVNldDxTdHJpbmc+IHVyaXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSBNZXRhZGF0YURiSGVscGVyLnF1ZXJ5Q2xpZW50SWRzKGNvbnRleHQpOworICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IpIHJldHVybjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHJldHVybjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjbGllbnRJZCkpIGNvbnRpbnVlOyAvLyBUaGlzIHByb2JhYmx5IGNhbid0IGhhcHBlbgorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRhZGF0YVVyaSA9CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLmdldE1ldGFkYXRhVXJpQXNTdHJpbmcoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICAgICAgICAgIFByaXZhdGVMb2cubG9nKCJVcGRhdGUgZm9yIGNsaWVudElkICIgKyBVdGlscy5zKGNsaWVudElkKSwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgVXRpbHMubCgiVXBkYXRlIGZvciBjbGllbnRJZCIsIGNsaWVudElkLCAiIHdoaWNoIHVzZXMgVVJJICIsIG1ldGFkYXRhVXJpKTsKKyAgICAgICAgICAgICAgICB1cmlzLmFkZChtZXRhZGF0YVVyaSk7CisgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG1ldGFkYXRhVXJpIDogdXJpcykgeworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtZXRhZGF0YVVyaSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWV0YWRhdGEgVVJJIGlzIGVtcHR5LCB0aGF0IG1lYW5zIHdlIHNob3VsZCBuZXZlciB1cGRhdGUgaXQgYXQgYWxsLgorICAgICAgICAgICAgICAgIC8vIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gY29tZSBoZXJlIHdpdGggYSBudWxsIG1ldGFkYXRhIFVSSSwgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBoYXZlIGJlZW4gcmVqZWN0ZWQgYXQgdGhlIHRpbWUgb2YgY2xpZW50IHJlZ2lzdHJhdGlvbjsgaWYgdGhlcmUKKyAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBhbmQgaXQgaGFwcGVucyBhbnl3YXksIGRvaW5nIG5vdGhpbmcgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLgorICAgICAgICAgICAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCB7QHNlZSBEaWN0aW9uYXJ5UHJvdmlkZXIjaW5zZXJ0KFVyaSwgQ29udGVudFZhbHVlcyl9LgorICAgICAgICAgICAgICAgIHVwZGF0ZUNsaWVudHNXaXRoTWV0YWRhdGFVcmkoY29udGV4dCwgdXBkYXRlTm93LCBtZXRhZGF0YVVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb3dubG9hZCBsYXRlc3QgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyIHRocm91Z2ggRG93bmxvYWRNYW5hZ2VyIGZvciBhbGwgcmVsZXZhbnQgY2xpZW50cworICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHJldHJpZXZpbmcgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIHVwZGF0ZU5vdyBXaGV0aGVyIHdlIHNob3VsZCB1cGRhdGUgTk9XLCBvciByZXNwZWN0IGJhbmR3aWR0aCBwb2xpY2llcworICAgICAqIEBwYXJhbSBtZXRhZGF0YVVyaSBUaGUgY2xpZW50IHRvIHVwZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ2xpZW50c1dpdGhNZXRhZGF0YVVyaShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVwZGF0ZU5vdywgZmluYWwgU3RyaW5nIG1ldGFkYXRhVXJpKSB7CisgICAgICAgIFByaXZhdGVMb2cubG9nKCJVcGRhdGUgZm9yIG1ldGFkYXRhIFVSSSAiICsgVXRpbHMucyhtZXRhZGF0YVVyaSksIGNvbnRleHQpOworICAgICAgICBmaW5hbCBSZXF1ZXN0IG1ldGFkYXRhUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFVyaS5wYXJzZShtZXRhZGF0YVVyaSkpOworICAgICAgICBVdGlscy5sKCJSZXF1ZXN0ID0iLCBtZXRhZGF0YVJlcXVlc3QpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAvLyBCeSBkZWZhdWx0LCBkb3dubG9hZCBvdmVyIHJvYW1pbmcgaXMgYWxsb3dlZCBhbmQgYWxsIG5ldHdvcmsgdHlwZXMgYXJlIGFsbG93ZWQgdG9vLgorICAgICAgICBpZiAoIXVwZGF0ZU5vdykgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd2VkT3Zlck1ldGVyZWQgPSByZXMuZ2V0Qm9vbGVhbihSLmJvb2wuYWxsb3dfb3Zlcl9tZXRlcmVkKTsKKyAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG8gdXBkYXRlIE5PVywgdGhlbiBvbmx5IGRvIGl0IG92ZXIgbm9uLW1ldGVyZWQgY29ubmVjdGlvbnMuCisgICAgICAgICAgICBpZiAoRG93bmxvYWRNYW5hZ2VyQ29tcGF0VXRpbHMuaGFzU2V0QWxsb3dlZE92ZXJNZXRlcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBEb3dubG9hZE1hbmFnZXJDb21wYXRVdGlscy5zZXRBbGxvd2VkT3Zlck1ldGVyZWQobWV0YWRhdGFSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZE92ZXJNZXRlcmVkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93ZWRPdmVyTWV0ZXJlZCkgeworICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVxdWVzdC5zZXRBbGxvd2VkTmV0d29ya1R5cGVzKFJlcXVlc3QuTkVUV09SS19XSUZJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGFkYXRhUmVxdWVzdC5zZXRBbGxvd2VkT3ZlclJvYW1pbmcocmVzLmdldEJvb2xlYW4oUi5ib29sLmFsbG93X292ZXJfcm9hbWluZykpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZpY2F0aW9uVmlzaWJsZSA9IHVwZGF0ZU5vdworICAgICAgICAgICAgICAgID8gcmVzLmdldEJvb2xlYW4oUi5ib29sLmRpc3BsYXlfbm90aWZpY2F0aW9uX2Zvcl91c2VyX3JlcXVlc3RlZF91cGRhdGUpCisgICAgICAgICAgICAgICAgOiByZXMuZ2V0Qm9vbGVhbihSLmJvb2wuZGlzcGxheV9ub3RpZmljYXRpb25fZm9yX2F1dG9fdXBkYXRlKTsKKworICAgICAgICBtZXRhZGF0YVJlcXVlc3Quc2V0VGl0bGUocmVzLmdldFN0cmluZyhSLnN0cmluZy5kb3dubG9hZF9kZXNjcmlwdGlvbikpOworICAgICAgICBtZXRhZGF0YVJlcXVlc3Quc2V0Tm90aWZpY2F0aW9uVmlzaWJpbGl0eShub3RpZmljYXRpb25WaXNpYmxlCisgICAgICAgICAgICAgICAgPyBSZXF1ZXN0LlZJU0lCSUxJVFlfVklTSUJMRSA6IFJlcXVlc3QuVklTSUJJTElUWV9ISURERU4pOworICAgICAgICBtZXRhZGF0YVJlcXVlc3Quc2V0VmlzaWJsZUluRG93bmxvYWRzVWkoCisgICAgICAgICAgICAgICAgcmVzLmdldEJvb2xlYW4oUi5ib29sLm1ldGFkYXRhX2Rvd25sb2Fkc192aXNpYmxlX2luX2Rvd25sb2FkX1VJKSk7CisKKyAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICBpZiAobnVsbCA9PSBtYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBEb3dubG9hZCBtYW5hZ2VyIGlzIG5vdCBpbnN0YWxsZWQgb3IgZGlzYWJsZWQuCisgICAgICAgICAgICAvLyBUT0RPOiBmYWxsIGJhY2sgdG8gc2VsZi1tYW5hZ2VkIGRvd25sb2FkPworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhbmNlbFVwZGF0ZVdpdGhEb3dubG9hZE1hbmFnZXIoY29udGV4dCwgbWV0YWRhdGFVcmksIG1hbmFnZXIpOworICAgICAgICBmaW5hbCBsb25nIGRvd25sb2FkSWQ7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1NoYXJlZElkUHJvdGVjdG9yKSB7CisgICAgICAgICAgICBkb3dubG9hZElkID0gbWFuYWdlci5lbnF1ZXVlKG1ldGFkYXRhUmVxdWVzdCk7CisgICAgICAgICAgICBVdGlscy5sKCJNZXRhZGF0YSBkb3dubG9hZCByZXF1ZXN0ZWQgd2l0aCBpZCIsIGRvd25sb2FkSWQpOworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGRvd25sb2FkIGluIHByb2dyZXNzLCBpdCdzIGJlZW4gdGhlcmUgZm9yIGEgd2hpbGUgYW5kCisgICAgICAgICAgICAvLyB0aGVyZSBpcyBwcm9iYWJseSBzb21ldGhpbmcgd3Jvbmcgd2l0aCBkb3dubG9hZCBtYW5hZ2VyLiBJdCdzIGJlc3QgdG8ganVzdAorICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBpZCBhbmQgcmVxdWVzdCBpdCBhZ2Fpbi4gSWYgdGhlIG9sZCBvbmUgaGFwcGVucyB0byBmaW5pc2gKKyAgICAgICAgICAgIC8vIGFueXdheSwgd2UgZG9uJ3Qga25vdyBhYm91dCBpdHMgSUQgYW55IG1vcmUsIHNvIHRoZSBkb3dubG9hZEZpbmlzaGVkCisgICAgICAgICAgICAvLyBtZXRob2Qgd2lsbCBpZ25vcmUgaXQuCisgICAgICAgICAgICB3cml0ZU1ldGFkYXRhRG93bmxvYWRJZChjb250ZXh0LCBtZXRhZGF0YVVyaSwgZG93bmxvYWRJZCk7CisgICAgICAgIH0KKyAgICAgICAgUHJpdmF0ZUxvZy5sb2coIlJlcXVlc3RlZCBkb3dubG9hZCB3aXRoIGlkICIgKyBkb3dubG9hZElkLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgcGVuZGluZyB1cGRhdGUsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKgorICAgICAqIElmIG5vbmUsIHRoaXMgaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50CisgICAgICogQHBhcmFtIG1hbmFnZXIgYW4gaW5zdGFuY2Ugb2YgRG93bmxvYWRNYW5hZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYW5jZWxVcGRhdGVXaXRoRG93bmxvYWRNYW5hZ2VyKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU2hhcmVkSWRQcm90ZWN0b3IpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbWV0YWRhdGFEb3dubG9hZElkID0KKyAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5nZXRNZXRhZGF0YURvd25sb2FkSWRGb3JDbGllbnQoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICAgICAgaWYgKE5PVF9BTl9JRCA9PSBtZXRhZGF0YURvd25sb2FkSWQpIHJldHVybjsKKyAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKG1ldGFkYXRhRG93bmxvYWRJZCk7CisgICAgICAgICAgICB3cml0ZU1ldGFkYXRhRG93bmxvYWRJZChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLmdldE1ldGFkYXRhVXJpQXNTdHJpbmcoY29udGV4dCwgY2xpZW50SWQpLCBOT1RfQU5fSUQpOworICAgICAgICB9CisgICAgICAgIC8vIENvbnNpZGVyIGEgY2FuY2VsbGF0aW9uIGFzIGEgZmFpbHVyZS4gQXMgc3VjaCwgaW5mb3JtIGxpc3RlbmVycyB0aGF0IHRoZSBkb3dubG9hZAorICAgICAgICAvLyBoYXMgZmFpbGVkLgorICAgICAgICBmb3IgKFVwZGF0ZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaW5rZWRDb3B5T2ZMaXN0KHNVcGRhdGVFdmVudExpc3RlbmVycykpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLmRvd25sb2FkZWRNZXRhZGF0YShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgcGVuZGluZyB1cGRhdGUsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGlzIG5vbmUsIHRoaXMgaXMgYSBuby1vcC4gVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdGhhdCBnZXRzIHRoZQorICAgICAqIGRvd25sb2FkIG1hbmFnZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0LCB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgRG93bmxvYWRNYW5hZ2VyCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBJRCBvZiB0aGUgY2xpZW50IHdlIHdhbnQgdG8gY2FuY2VsIHRoZSB1cGRhdGUgb2YKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2FuY2VsVXBkYXRlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkKSB7CisgICAgICAgIGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgKERvd25sb2FkTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRE9XTkxPQURfU0VSVklDRSk7CisgICAgICAgIGlmIChudWxsICE9IG1hbmFnZXIpIGNhbmNlbFVwZGF0ZVdpdGhEb3dubG9hZE1hbmFnZXIoY29udGV4dCwgY2xpZW50SWQsIG1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGRvd25sb2FkIHJlcXVlc3QgYW5kIGZsYWdzIGl0IGFzIGRvd25sb2FkaW5nIGluIHRoZSBtZXRhZGF0YSB0YWJsZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgZXhpc3RzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVyZSBEb3dubG9hZE1hbmFnZXIgbWlnaHQKKyAgICAgKiBmaW5pc2ggZG93bmxvYWRpbmcgdGhlIGZpbGUgYmVmb3JlIHRoZSBkYXRhIGlzIGNvbW1pdHRlZCB0byB0aGUgZGF0YWJhc2UuCisgICAgICogSXQgcmVnaXN0ZXJzIHRoZSByZXF1ZXN0IHdpdGggdGhlIERvd25sb2FkTWFuYWdlciBzZXJ2aWNlIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIG1ldGFkYXRhCisgICAgICogZGF0YWJhc2UgZGlyZWN0bHkgd2l0aGluIGEgc3luY2hyb25pemVkIHNlY3Rpb24uCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGludGVsbGlnZW5jZSBhYm91dCB0aGUgZGF0YSBpdCBjb21taXRzIHRvIHRoZSBkYXRhYmFzZSBhc2lkZSBmcm9tIHRoZQorICAgICAqIGRvd25sb2FkIHJlcXVlc3QgaWQsIHdoaWNoIGlzIG5vdCBrbm93biBiZWZvcmUgc3VibWl0dGluZyB0aGUgcmVxdWVzdCB0byB0aGUgZG93bmxvYWQKKyAgICAgKiBtYW5hZ2VyLiBIZW5jZSwgaXQgb25seSB1cGRhdGVzIHRoZSByZWxldmFudCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIGRvd25sb2FkIG1hbmFnZXIgc2VydmljZSB0byByZWdpc3RlciB0aGUgcmVxdWVzdCB3aXRoLgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRvIHJlZ2lzdGVyLgorICAgICAqIEBwYXJhbSBkYiB0aGUgbWV0YWRhdGEgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0LgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QuCisgICAgICogQHJldHVybiB0aGUgZG93bmxvYWQgaWQgcmV0dXJuZWQgYnkgdGhlIGRvd25sb2FkIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHJlZ2lzdGVyRG93bmxvYWRSZXF1ZXN0KGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyLCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBpbnQgdmVyc2lvbikgeworICAgICAgICBVdGlscy5sKCJSZWdpc3RlckRvd25sb2FkUmVxdWVzdCBmb3Igd29yZCBsaXN0IGlkIDogIiwgaWQsICIsIHZlcnNpb24gIiwgdmVyc2lvbik7CisgICAgICAgIGZpbmFsIGxvbmcgZG93bmxvYWRJZDsKKyAgICAgICAgc3luY2hyb25pemVkIChzU2hhcmVkSWRQcm90ZWN0b3IpIHsKKyAgICAgICAgICAgIGRvd25sb2FkSWQgPSBtYW5hZ2VyLmVucXVldWUocmVxdWVzdCk7CisgICAgICAgICAgICBVdGlscy5sKCJEb3dubG9hZCByZXF1ZXN0ZWQgd2l0aCBpZCIsIGRvd25sb2FkSWQpOworICAgICAgICAgICAgTWV0YWRhdGFEYkhlbHBlci5tYXJrRW50cnlBc0Rvd25sb2FkaW5nKGRiLCBpZCwgdmVyc2lvbiwgZG93bmxvYWRJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRvd25sb2FkSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBkb3dubG9hZCBmcm9tIERvd25sb2FkTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb21wbGV0ZWREb3dubG9hZEluZm8gZ2V0Q29tcGxldGVkRG93bmxvYWRJbmZvKGZpbmFsIERvd25sb2FkTWFuYWdlciBtYW5hZ2VyLAorICAgICAgICAgICAgZmluYWwgbG9uZyBkb3dubG9hZElkKSB7CisgICAgICAgIGZpbmFsIFF1ZXJ5IHF1ZXJ5ID0gbmV3IFF1ZXJ5KCkuc2V0RmlsdGVyQnlJZChkb3dubG9hZElkKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IG1hbmFnZXIucXVlcnkocXVlcnkpOworCisgICAgICAgIGlmIChudWxsID09IGN1cnNvcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV0ZWREb3dubG9hZEluZm8obnVsbCwgZG93bmxvYWRJZCwgRG93bmxvYWRNYW5hZ2VyLlNUQVRVU19GQUlMRUQpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpOworICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1czsKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtblN0YXR1cyA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChEb3dubG9hZE1hbmFnZXIuQ09MVU1OX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbkVycm9yID0gY3Vyc29yLmdldENvbHVtbkluZGV4KERvd25sb2FkTWFuYWdlci5DT0xVTU5fUkVBU09OKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29sdW1uVXJpID0gY3Vyc29yLmdldENvbHVtbkluZGV4KERvd25sb2FkTWFuYWdlci5DT0xVTU5fVVJJKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXJyb3IgPSBjdXJzb3IuZ2V0SW50KGNvbHVtbkVycm9yKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjdXJzb3IuZ2V0SW50KGNvbHVtblN0YXR1cyk7CisgICAgICAgICAgICAgICAgdXJpID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5VcmkpOworICAgICAgICAgICAgICAgIGlmIChEb3dubG9hZE1hbmFnZXIuU1RBVFVTX1NVQ0NFU1NGVUwgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBlcm1hbmVudCBmYWlsdXJlIG9mIGRvd25sb2FkICIgKyBkb3dubG9hZElkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggZXJyb3IgY29kZTogIiArIGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRG93bmxvYWRNYW5hZ2VyLlNUQVRVU19GQUlMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXRlZERvd25sb2FkSW5mbyh1cmksIGRvd25sb2FkSWQsIHN0YXR1cyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxEb3dubG9hZFJlY29yZD4gZ2V0RG93bmxvYWRSZWNvcmRzRm9yQ29tcGxldGVkRG93bmxvYWRJbmZvKAorICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBDb21wbGV0ZWREb3dubG9hZEluZm8gZG93bmxvYWRJbmZvKSB7CisgICAgICAgIC8vIEdldCBhbmQgY2hlY2sgdGhlIElEIG9mIHRoZSBmaWxlIHdlIGFyZSB3YWl0aW5nIGZvciwgY29tcGFyZSB0aGVtIHRvIGRvd25sb2FkZWQgb25lcworICAgICAgICBzeW5jaHJvbml6ZWQoc1NoYXJlZElkUHJvdGVjdG9yKSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8RG93bmxvYWRSZWNvcmQ+IGRvd25sb2FkUmVjb3JkcyA9CisgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0RG93bmxvYWRSZWNvcmRzRm9yRG93bmxvYWRJZChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkSW5mby5tRG93bmxvYWRJZCk7CisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlc2UgaXMgbWV0YWRhdGEsIHdlIHNob3VsZCB1cGRhdGUgdGhlIERCCisgICAgICAgICAgICBib29sZWFuIGhhc01ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKERvd25sb2FkUmVjb3JkIHJlY29yZCA6IGRvd25sb2FkUmVjb3JkcykgeworICAgICAgICAgICAgICAgIGlmIChudWxsID09IHJlY29yZC5tQXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICBoYXNNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHdyaXRlTWV0YWRhdGFEb3dubG9hZElkKGNvbnRleHQsIGRvd25sb2FkSW5mby5tVXJpLCBOT1RfQU5fSUQpOworICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuc2F2ZUxhc3RVcGRhdGVUaW1lT2ZVcmkoY29udGV4dCwgZG93bmxvYWRJbmZvLm1VcmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkUmVjb3JkczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGFmdGVyIGEgZG93bmxvYWQgZmluaXNoZWQsIGluIHN1Y2Nlc3Mgb3IgaW4gZXJyb3IuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgc3lzdGVtIHVwb24gYnJvYWRjYXN0IGZyb20gdGhlIERvd25sb2FkTWFuYWdlciB0aGF0IGEgZmlsZQorICAgICAqIGhhcyBiZWVuIGRvd25sb2FkZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIEFmdGVyIGEgc2ltcGxlIGNoZWNrIHRoYXQgdGhpcyBpcyBhY3R1YWxseSB0aGUgZmlsZSB3ZSBhcmUgd2FpdGluZyBmb3IsIHRoaXMKKyAgICAgKiBtZXRob2QgYmFzaWNhbGx5IGNvb3JkaW5hdGVzIHRoZSBwYXJzaW5nIGFuZCBjb21wYXJpc29uIG9mIG1ldGFkYXRhLCBhbmQgZmlyZXMKKyAgICAgKiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGxpc3Qgb2YgYWN0aW9ucyB0aGF0IHNob3VsZCBiZSB0YWtlbiB0aGVuIGV4ZWN1dGVzIHRoZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhpcyBhY3Rpb24uCisgICAgICogQHBhcmFtIGludGVudCBUaGUgaW50ZW50IGZyb20gdGhlIERvd25sb2FkTWFuYWdlciBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGRvd25sb2FkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIHZvaWQgZG93bmxvYWRGaW5pc2hlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gR2V0IGFuZCBjaGVjayB0aGUgSUQgb2YgdGhlIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZAorICAgICAgICBmaW5hbCBsb25nIGZpbGVJZCA9IGludGVudC5nZXRMb25nRXh0cmEoRG93bmxvYWRNYW5hZ2VyLkVYVFJBX0RPV05MT0FEX0lELCBOT1RfQU5fSUQpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWQgZmluaXNoZWQgd2l0aCBpZCAiICsgZmlsZUlkLCBjb250ZXh0KTsKKyAgICAgICAgVXRpbHMubCgiRG93bmxvYWRGaW5pc2hlZCB3aXRoIGlkIiwgZmlsZUlkKTsKKyAgICAgICAgaWYgKE5PVF9BTl9JRCA9PSBmaWxlSWQpIHJldHVybjsgLy8gU3B1cmlvdXMgd2FrZS11cDogaWdub3JlCisKKyAgICAgICAgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChEb3dubG9hZE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRPV05MT0FEX1NFUlZJQ0UpOworICAgICAgICBmaW5hbCBDb21wbGV0ZWREb3dubG9hZEluZm8gZG93bmxvYWRJbmZvID0gZ2V0Q29tcGxldGVkRG93bmxvYWRJbmZvKG1hbmFnZXIsIGZpbGVJZCk7CisKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PERvd25sb2FkUmVjb3JkPiByZWNvcmRMaXN0ID0KKyAgICAgICAgICAgICAgICBnZXREb3dubG9hZFJlY29yZHNGb3JDb21wbGV0ZWREb3dubG9hZEluZm8oY29udGV4dCwgZG93bmxvYWRJbmZvKTsKKyAgICAgICAgaWYgKG51bGwgPT0gcmVjb3JkTGlzdCkgcmV0dXJuOyAvLyBJdCB3YXMgc29tZW9uZSBlbHNlJ3MgZG93bmxvYWQuCisgICAgICAgIFV0aWxzLmwoIlJlY2VpdmVkIHJlc3VsdCBmb3IgZG93bmxvYWQgIiwgZmlsZUlkKTsKKworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZ3JhY2VmdWxseSBhIG51bGwgcG9pbnRlciBoZXJlLiBUaGlzIGlzIHByYWN0aWNhbGx5IGltcG9zc2libGUgYmVjYXVzZQorICAgICAgICAvLyB3ZSBjb21lIGhlcmUgb25seSB3aGVuIERvd25sb2FkTWFuYWdlciBleHBsaWNpdGx5IGNhbGxlZCB1cyB3aGVuIGl0IGVuZGVkIGEKKyAgICAgICAgLy8gZG93bmxvYWQsIHNvIHdlIGFyZSBwcmV0dHkgc3VyZSBpdCdzIGFsaXZlLiBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdGhhdCBpdCdzCisgICAgICAgIC8vIGRpc2FibGVkIHJpZ2h0IGluYmV0d2VlbiB0aGUgZmlyaW5nIG9mIHRoZSBpbnRlbnQgYW5kIHRoZSBjb250cm9sIHJlYWNoaW5nIGhlcmUuCisKKyAgICAgICAgZm9yIChmaW5hbCBEb3dubG9hZFJlY29yZCByZWNvcmQgOiByZWNvcmRMaXN0KSB7CisgICAgICAgICAgICAvLyBkb3dubG9hZFN1Y2Nlc3NmdWwgaXMgbm90IGZpbmFsIGJlY2F1c2Ugd2UgbWF5IHN0aWxsIGhhdmUgZXhjZXB0aW9ucyBmcm9tIG5vdyBvbgorICAgICAgICAgICAgYm9vbGVhbiBkb3dubG9hZFN1Y2Nlc3NmdWwgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkSW5mby53YXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRTdWNjZXNzZnVsID0gaGFuZGxlRG93bmxvYWRlZEZpbGUoY29udGV4dCwgcmVjb3JkLCBtYW5hZ2VyLCBmaWxlSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pc01ldGFkYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGlzaFVwZGF0ZU1ldGFkYXRhQ29tcGxldGVkKGNvbnRleHQsIGRvd25sb2FkU3VjY2Vzc2Z1bCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIHJlY29yZC5tQ2xpZW50SWQpOworICAgICAgICAgICAgICAgICAgICBwdWJsaXNoVXBkYXRlV29yZExpc3RDb21wbGV0ZWQoY29udGV4dCwgZG93bmxvYWRTdWNjZXNzZnVsLCBmaWxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIsIHJlY29yZC5tQXR0cmlidXRlcywgcmVjb3JkLm1DbGllbnRJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3JlIGRvbmUgdXNpbmcgaXQsIHdlIGNhbiByZW1vdmUgdGhpcyBkb3dubG9hZCBmcm9tIERMTWFuYWdlcgorICAgICAgICBtYW5hZ2VyLnJlbW92ZShmaWxlSWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHVibGlzaFVwZGF0ZU1ldGFkYXRhQ29tcGxldGVkKGZpbmFsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG93bmxvYWRTdWNjZXNzZnVsKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FybiBhbGwgbGlzdGVuZXJzIG9mIHdoYXQgaGFwcGVuZWQuIEJ1dCBzb21lIGxpc3RlbmVycyBtYXkgd2FudCB0bworICAgICAgICAvLyByZW1vdmUgdGhlbXNlbHZlcyBvciByZS1yZWdpc3RlciBzb21ldGhpbmcgaW4gcmVzcG9uc2UuIEhlbmNlIHdlIHNob3VsZCB0YWtlIGEKKyAgICAgICAgLy8gc25hcHNob3Qgb2YgdGhlIGxpc3RlbmVyIGxpc3QgYW5kIHdhcm4gdGhlbSBhbGwuIFRoaXMgYWxzbyBwcmV2ZW50cyBhbnkKKyAgICAgICAgLy8gY29uY3VycmVudCBtb2RpZmljYXRpb24gcHJvYmxlbSBvZiB0aGUgc3RhdGljIGxpc3QuCisgICAgICAgIGZvciAoVXBkYXRlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpbmtlZENvcHlPZkxpc3Qoc1VwZGF0ZUV2ZW50TGlzdGVuZXJzKSkgeworICAgICAgICAgICAgbGlzdGVuZXIuZG93bmxvYWRlZE1ldGFkYXRhKGRvd25sb2FkU3VjY2Vzc2Z1bCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGlzaFVwZGF0ZUN5Y2xlQ29tcGxldGVkRXZlbnQoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdWJsaXNoVXBkYXRlV29yZExpc3RDb21wbGV0ZWQoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkb3dubG9hZFN1Y2Nlc3NmdWwsIGZpbmFsIGxvbmcgZmlsZUlkLAorICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIGZpbmFsIENvbnRlbnRWYWx1ZXMgZG93bmxvYWRlZEZpbGVSZWNvcmQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHNTaGFyZWRJZFByb3RlY3RvcikgeworICAgICAgICAgICAgaWYgKGRvd25sb2FkU3VjY2Vzc2Z1bCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guSW5zdGFsbEFmdGVyRG93bmxvYWRBY3Rpb24oY2xpZW50SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVJlY29yZCkpOworICAgICAgICAgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLmRlbGV0ZURvd25sb2FkaW5nRW50cnkoZGIsIGZpbGVJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgI2xpbmtlZENvcHlPZkxpc3RzCisgICAgICAgIGZvciAoVXBkYXRlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpbmtlZENvcHlPZkxpc3Qoc1VwZGF0ZUV2ZW50TGlzdGVuZXJzKSkgeworICAgICAgICAgICAgbGlzdGVuZXIud29yZExpc3REb3dubG9hZEZpbmlzaGVkKGRvd25sb2FkZWRGaWxlUmVjb3JkLmdldEFzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuV09SRExJU1RJRF9DT0xVTU4pLCBkb3dubG9hZFN1Y2Nlc3NmdWwpOworICAgICAgICB9CisgICAgICAgIHB1Ymxpc2hVcGRhdGVDeWNsZUNvbXBsZXRlZEV2ZW50KGNvbnRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHVibGlzaFVwZGF0ZUN5Y2xlQ29tcGxldGVkRXZlbnQoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIEV2ZW4gaWYgdGhpcyBpcyBub3Qgc3VjY2Vzc2Z1bCwgd2UgaGF2ZSB0byBwdWJsaXNoIHRoZSBuZXcgc3RhdGUuCisgICAgICAgIFByaXZhdGVMb2cubG9nKCJQdWJsaXNoaW5nIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZWQgZXZlbnQiLCBjb250ZXh0KTsKKyAgICAgICAgVXRpbHMubCgiUHVibGlzaGluZyB1cGRhdGUgY3ljbGUgY29tcGxldGVkIGV2ZW50Iik7CisgICAgICAgIGZvciAoVXBkYXRlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpbmtlZENvcHlPZkxpc3Qoc1VwZGF0ZUV2ZW50TGlzdGVuZXJzKSkgeworICAgICAgICAgICAgbGlzdGVuZXIudXBkYXRlQ3ljbGVDb21wbGV0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYW5kbGVEb3dubG9hZGVkRmlsZShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBEb3dubG9hZFJlY29yZCBkb3dubG9hZFJlY29yZCwgZmluYWwgRG93bmxvYWRNYW5hZ2VyIG1hbmFnZXIsCisgICAgICAgICAgICBmaW5hbCBsb25nIGZpbGVJZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8ge0BsaW5rIGhhbmRsZVdvcmRMaXN0KENvbnRleHQsSW5wdXRTdHJlYW0sQ29udGVudFZhbHVlcyl9LgorICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBkb3dubG9hZGVkIGZpbGUgYWNjb3JkaW5nIHRvIGl0cyB0eXBlCisgICAgICAgICAgICBpZiAoZG93bmxvYWRSZWNvcmQuaXNNZXRhZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgVXRpbHMubCgiRGF0YSBEL0wnZCBpcyBtZXRhZGF0YSBmb3IiLCBkb3dubG9hZFJlY29yZC5tQ2xpZW50SWQpOworICAgICAgICAgICAgICAgIC8vICNoYW5kbGVNZXRhZGF0YSgpIGNsb3NlcyBpdHMgSW5wdXRTdHJlYW0gYXJndW1lbnQKKyAgICAgICAgICAgICAgICBoYW5kbGVNZXRhZGF0YShjb250ZXh0LCBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLm9wZW5Eb3dubG9hZGVkRmlsZShmaWxlSWQpKSwgZG93bmxvYWRSZWNvcmQubUNsaWVudElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVXRpbHMubCgiRGF0YSBEL0wnZCBpcyBhIHdvcmQgbGlzdCIpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB3b3JkTGlzdFN0YXR1cyA9IGRvd25sb2FkUmVjb3JkLm1BdHRyaWJ1dGVzLmdldEFzSW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTik7CisgICAgICAgICAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HID09IHdvcmRMaXN0U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vICNoYW5kbGVXb3JkTGlzdCgpIGNsb3NlcyBpdHMgSW5wdXRTdHJlYW0gYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlV29yZExpc3QoY29udGV4dCwgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIub3BlbkRvd25sb2FkZWRGaWxlKGZpbGVJZCkpLCBkb3dubG9hZFJlY29yZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3B1cmlvdXMgZG93bmxvYWQgZW5kZWQuIE1heWJlIGEgY2FuY2VsbGVkIGRvd25sb2FkPyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQSBmaWxlIHdhcyBkb3dubG9hZGVkIGJ1dCBpdCBjYW4ndCBiZSBvcGVuZWQiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgcmVhZCB0aGUgZmlsZS4uLiBkaXNrIGRhbWFnZT8KKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IHJlYWQgYSBmaWxlIiwgZSk7CisgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB3aXRoIFVYIGhvdyB3ZSBzaG91bGQgd2FybiB0aGUgdXNlci4KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoZSBmb3JtYXQgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSBpcyBpbmNvcnJlY3QuIFdlIHNob3VsZCBtYXliZSByZXBvcnQgdXBzdHJlYW0/CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbmNvcnJlY3QgZGF0YSByZWNlaXZlZCIsIGUpOworICAgICAgICB9IGNhdGNoIChCYWRGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVGhlIGZvcm1hdCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIGluY29ycmVjdC4gV2Ugc2hvdWxkIG1heWJlIHJlcG9ydCB1cHN0cmVhbT8KKyAgICAgICAgICAgIExvZy5lKFRBRywgIkluY29ycmVjdCBkYXRhIHJlY2VpdmVkIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbGlzdCwgd2l0aCBhbGwgZWxlbWVudHMgY29waWVkLgorICAgICAqCisgICAgICogVGhpcyByZXR1cm5zIGEgbGlua2VkIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8VD4gbGlua2VkQ29weU9mTGlzdChmaW5hbCBMaXN0PFQ+IHNyYykgeworICAgICAgICAvLyBJbnN0YW50aWF0aW9uIG9mIGEgcGFyYW1ldGVyaXplZCB0eXBlIGlzIG5vdCBwb3NzaWJsZSBpbiBKYXZhLCBzbyBpdCdzIG5vdCBwb3NzaWJsZSB0bworICAgICAgICAvLyByZXR1cm4gdGhlIHNhbWUgdHlwZSBvZiBsaXN0IHRoYXQgd2FzIHBhc3NlZCAtIHByb2JhYmx5IHRoZSBzYW1lIHJlYXNvbiB3aHkgQ29sbGVjdGlvbnMKKyAgICAgICAgLy8gZG9lcyBub3QgZG8gaXQuIFNvIHdlIG5lZWQgdG8gZGVjaWRlIHN0YXRpY2FsbHkgd2hpY2ggY29uY3JldGUgdHlwZSB0byByZXR1cm4uCisgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxUPihzcmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhcm4gQW5kcm9pZCBLZXlib2FyZCB0aGF0IHRoZSBzdGF0ZSBvZiBkaWN0aW9uYXJpZXMgY2hhbmdlZCBhbmQgaXQgc2hvdWxkIHJlZnJlc2ggaXRzIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEludGVudCBuZXdEaWN0QnJvYWRjYXN0ID0gbmV3IEludGVudChORVdfRElDVElPTkFSWV9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgY29udGV4dC5zZW5kQnJvYWRjYXN0KG5ld0RpY3RCcm9hZGNhc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIG1ldGFkYXRhIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiAodGhhdCBpcywgdXBncmFkZSBkaWN0aW9uYXJpZXMpLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIHJlYWQgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIHN0cmVhbSBhbiBpbnB1dCBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIGRvd25sb2FkZWQgZGF0YS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqICBXaWxsIGJlIGNsb3NlZCB1cG9uIGZpbmlzaGluZy4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgdGhlIElEIG9mIHRoZSBjbGllbnQgdG8gdXBkYXRlCisgICAgICogQHRocm93cyBCYWRGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG1ldGFkYXRhIGlzIG5vdCBpbiBhIGtub3duIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBkb3dubG9hZGVkIGZpbGUgY2FuJ3QgYmUgcmVhZCBmcm9tIHRoZSBkaXNrCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVNZXRhZGF0YShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnRJZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworICAgICAgICBVdGlscy5sKCJFbnRlcmluZyBoYW5kbGVNZXRhZGF0YSIpOworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IG5ld01ldGFkYXRhOworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgZG9jIElucHV0U3RyZWFtUmVhZGVyIGJ1ZmZlcnMsIHNvIG5vIG5lZWQgdG8gYWRkIGEgYnVmZmVyaW5nIGxheWVyCisgICAgICAgICAgICBuZXdNZXRhZGF0YSA9IE1ldGFkYXRhSGFuZGxlci5yZWFkTWV0YWRhdGEocmVhZGVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbHMubCgiRG93bmxvYWRlZCBtZXRhZGF0YSA6IiwgbmV3TWV0YWRhdGEpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWRlZCBtZXRhZGF0YVxuIiArIG5ld01ldGFkYXRhLCBjb250ZXh0KTsKKworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gY29tcHV0ZVVwZ3JhZGVUbyhjb250ZXh0LCBjbGllbnRJZCwgbmV3TWV0YWRhdGEpOworICAgICAgICAvLyBUT0RPOiBDaGVjayB3aXRoIFVYIGhvdyB3ZSBzaG91bGQgcmVwb3J0IHRvIHRoZSB1c2VyCisgICAgICAgIC8vIFRPRE86IGFkZCBhbiBhY3Rpb24gdG8gY2xvc2UgdGhlIGRhdGFiYXNlCisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIHdvcmQgbGlzdDogcHV0IGl0IGluIGl0cyByaWdodCBwbGFjZSwgYW5kIHVwZGF0ZSB0aGUgcGFzc2VkIGNvbnRlbnQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGZvciBvcGVuaW5nIGZpbGVzLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBhbiBpbnB1dCBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIGRvd25sb2FkZWQgZGF0YS4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqICBXaWxsIGJlIGNsb3NlZCB1cG9uIGZpbmlzaGluZy4KKyAgICAgKiBAcGFyYW0gZG93bmxvYWRSZWNvcmQgdGhlIGNvbnRlbnQgdmFsdWVzIHRvIGZpbGwgdGhlIGZpbGUgbmFtZSBpbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGVzIGNhbid0IGJlIHJlYWQgb3Igd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIEJhZEZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgbWQ1IGNoZWNrc3VtIGRvZXNuJ3QgbWF0Y2ggdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlV29yZExpc3QoZmluYWwgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGZpbmFsIERvd25sb2FkUmVjb3JkIGRvd25sb2FkUmVjb3JkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCYWRGb3JtYXRFeGNlcHRpb24geworCisgICAgICAgIC8vIERvd25sb2FkTWFuYWdlciBkb2VzIG5vdCBoYXZlIHRoZSBhYmlsaXR5IHRvIHB1dCB0aGUgZmlsZSBkaXJlY3RseSB3aGVyZSB3ZSB3YW50CisgICAgICAgIC8vIGl0LCBzbyB3ZSBoYWQgaXQgZG93bmxvYWQgdG8gYSB0ZW1wb3JhcnkgcGxhY2UuIE5vdyB3ZSBtb3ZlIGl0LiBJdCB3aWxsIGJlIGRlbGV0ZWQKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBieSBEb3dubG9hZE1hbmFnZXIuCisgICAgICAgIFV0aWxzLmwoIkRvd25sb2FkZWQgYSBuZXcgd29yZCBsaXN0IDoiLCBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc1N0cmluZygKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTiksICJmb3IiLCBkb3dubG9hZFJlY29yZC5tQ2xpZW50SWQpOworICAgICAgICBQcml2YXRlTG9nLmxvZygiRG93bmxvYWRlZCBhIG5ldyB3b3JkIGxpc3Qgd2l0aCBkZXNjcmlwdGlvbiA6ICIKKyAgICAgICAgICAgICAgICArIGRvd25sb2FkUmVjb3JkLm1BdHRyaWJ1dGVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuREVTQ1JJUFRJT05fQ09MVU1OKQorICAgICAgICAgICAgICAgICsgIiBmb3IgIiArIGRvd25sb2FkUmVjb3JkLm1DbGllbnRJZCwgY29udGV4dCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsZSA9CisgICAgICAgICAgICAgICAgZG93bmxvYWRSZWNvcmQubUF0dHJpYnV0ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTEVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uRmlsZSA9IGdldFRlbXBGaWxlTmFtZShjb250ZXh0LCBsb2NhbGUpOworICAgICAgICBkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5wdXQoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4sIGRlc3RpbmF0aW9uRmlsZSk7CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY29udGV4dC5vcGVuRmlsZU91dHB1dChkZXN0aW5hdGlvbkZpbGUsIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgICAgIGNvcHlGaWxlKGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogQ29uc29saWRhdGUgdGhpcyBNRDUgY2FsY3VsYXRpb24gd2l0aCBmaWxlIGNvcHlpbmcgYWJvdmUuCisgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVvcGVuIHRoZSBmaWxlIGJlY2F1c2UgdGhlIGlucHV0c3RyZWFtIGJ5dGVzIGhhdmUgYmVlbiBjb25zdW1lZCwgYW5kIHRoZXJlCisgICAgICAgIC8vIGlzIG5vdGhpbmcgaW4gSW5wdXRTdHJlYW0gdG8gcmVvcGVuIG9yIHJld2luZCB0aGUgc3RyZWFtCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBjb3BpZWRGaWxlID0gbnVsbDsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1kNXN1bTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvcGllZEZpbGUgPSBjb250ZXh0Lm9wZW5GaWxlSW5wdXQoZGVzdGluYXRpb25GaWxlKTsKKyAgICAgICAgICAgIG1kNXN1bSA9IE1ENUNhbGN1bGF0b3IuY2hlY2tzdW0oY29waWVkRmlsZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY29waWVkRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29waWVkRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtZDVzdW0pKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIFdlIGNhbid0IGNvbXB1dGUgdGhlIGNoZWNrc3VtIGFueXdheSwgc28gcmV0dXJuIGFuZCBob3BlIGZvciB0aGUgYmVzdAorICAgICAgICB9CisgICAgICAgIGlmICghbWQ1c3VtLmVxdWFscyhkb3dubG9hZFJlY29yZC5tQXR0cmlidXRlcy5nZXRBc1N0cmluZygKKyAgICAgICAgICAgICAgICBNZXRhZGF0YURiSGVscGVyLkNIRUNLU1VNX0NPTFVNTikpKSB7CisgICAgICAgICAgICBjb250ZXh0LmRlbGV0ZUZpbGUoZGVzdGluYXRpb25GaWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRGb3JtYXRFeGNlcHRpb24oIk1ENSBjaGVja3N1bSBjaGVjayBmYWlsZWQgOiBcIiIgKyBtZDVzdW0gKyAiXCIgPD4gXCIiCisgICAgICAgICAgICAgICAgICAgICsgZG93bmxvYWRSZWNvcmQubUF0dHJpYnV0ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5DSEVDS1NVTV9DT0xVTU4pCisgICAgICAgICAgICAgICAgICAgICsgIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgaW4gdG8gb3V0IHVzaW5nIEZpbGVDaGFubmVscy4KKyAgICAgKgorICAgICAqIFRoaXMgdHJpZXMgdG8gdXNlIGNoYW5uZWxzIGZvciBmYXN0IGNvcHlpbmcuIElmIGl0IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIHRvCisgICAgICogY29weUZpbGVGYWxsQmFjayBiZWxvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIGNvcHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gY29weSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGJvdGggdGhlIG5vcm1hbCBhbmQgZmFsbGJhY2sgbWV0aG9kcyByYWlzZSBleGNlcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGUoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVdGlscy5sKCJDb3B5aW5nIGZpbGVzIik7CisgICAgICAgIGlmICghKGluIGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKSB8fCAhKG91dCBpbnN0YW5jZW9mIEZpbGVPdXRwdXRTdHJlYW0pKSB7CisgICAgICAgICAgICBVdGlscy5sKCJOb3QgdGhlIHJpZ2h0IHR5cGVzIik7CisgICAgICAgICAgICBjb3B5RmlsZUZhbGxiYWNrKGluLCBvdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlQ2hhbm5lbCBzb3VyY2VDaGFubmVsID0gKChGaWxlSW5wdXRTdHJlYW0pIGluKS5nZXRDaGFubmVsKCk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gKChGaWxlT3V0cHV0U3RyZWFtKSBvdXQpLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICBzb3VyY2VDaGFubmVsLnRyYW5zZmVyVG8oMCwgSW50ZWdlci5NQVhfVkFMVUUsIGRlc3RpbmF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3Qgd29yayB3aXRoIGNoYW5uZWxzLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZy4gQ29weSBieSBoYW5kLgorICAgICAgICAgICAgICAgIFV0aWxzLmwoIldvbid0IHdvcmsiKTsKKyAgICAgICAgICAgICAgICBjb3B5RmlsZUZhbGxiYWNrKGluLCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGluIHRvIG91dCB3aXRoIHJlYWQvd3JpdGUgbWV0aG9kcywgbm90IEZpbGVDaGFubmVscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIGNvcHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gY29weSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgcmVhZCBvciBhIHdyaXRlIGZhaWxzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGVGYWxsYmFjayhmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFV0aWxzLmwoIkZhbGxpbmcgYmFjayB0byBzbG93IGNvcHkiKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0ZJTEVfQ09QWV9CVUZGRVJfU0laRV07CisgICAgICAgIGZvciAoaW50IHJlYWRCeXRlcyA9IGluLnJlYWQoYnVmZmVyKTsgcmVhZEJ5dGVzID49IDA7IHJlYWRCeXRlcyA9IGluLnJlYWQoYnVmZmVyKSkKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIHJlYWRCeXRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBmaWxlIHRvIHN0b3JlIGEgZGljdGlvbmFyeQorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIHVzZSB0byBvcGVuIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSBmb3IgdGhpcyBkaWN0aW9uYXJ5LCB0byBtYWtlIHRoZSBmaWxlIG5hbWUgbW9yZSByZWFkYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUsIG9yIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wRmlsZU5hbWUoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgbG9jYWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVXRpbHMubCgiRW50ZXJpbmcgb3BlblRlbXBGaWxlT3V0cHV0Iik7CisgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gY29udGV4dC5nZXRGaWxlc0RpcigpOworICAgICAgICBmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKGxvY2FsZSArICJfX18iLCBESUNUX0ZJTEVfU1VGRklYLCBkaXIpOworICAgICAgICBVdGlscy5sKCJGaWxlIG5hbWUgaXMiLCBmLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBmLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIG1ldGFkYXRhIChjb2xsZWN0aW9ucyBvZiB3b3JkIGxpc3RzKS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIHdob2xlIG1ldGFkYXRhIHNldHMgZGlyZWN0bHkgYW5kIGNvbXBhcmVzIHRoZW0sIG1hdGNoaW5nIHRoZSB3b3JkbGlzdHMgaW4KKyAgICAgKiBlYWNoIG9mIHRoZW0gb24gdGhlIGlkLiBJdCBjcmVhdGVzIGFuIEFjdGlvbkJhdGNoIG9iamVjdCB0aGF0IGNhbiBiZSAuZXhlY3V0ZSgpJ2QgdG8gcGVyZm9ybQorICAgICAqIHRoZSBhY3R1YWwgdXBncmFkZSBmcm9tIGBmcm9tJyB0byBgdG8nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdG8gb3BlbiBkYXRhYmFzZXMgb24uCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBkaWN0aW9uYXJ5IGRlc2NyaXB0b3IgKGFzIGEgbGlzdCBvZiB3b3JkbGlzdHMpIHRvIHVwZ3JhZGUgZnJvbS4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIGRpY3Rpb25hcnkgZGVzY3JpcHRvciAoYXMgYSBsaXN0IG9mIHdvcmRsaXN0cykgdG8gdXBncmFkZSB0by4KKyAgICAgKiBAcmV0dXJuIGFuIG9yZGVyZWQgbGlzdCBvZiBydW5uYWJsZXMgdG8gYmUgY2FsbGVkIHRvIHVwZ3JhZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uQmF0Y2ggY29tcGFyZU1ldGFkYXRhRm9yVXBncmFkZShmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gZnJvbSwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiB0bykgeworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gbmV3IEFjdGlvbkJhdGNoKCk7CisgICAgICAgIC8vIFVwZ3JhZGUgZXhpc3Rpbmcgd29yZCBsaXN0cworICAgICAgICBVdGlscy5sKCJDb21wYXJpbmcgZGljdGlvbmFyaWVzIik7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHdvcmRMaXN0SWRzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICAvLyBUT0RPOiBDYW4gdGhlc2UgYmUgbnVsbD8KKyAgICAgICAgaWYgKG51bGwgPT0gZnJvbSkgZnJvbSA9IG5ldyBBcnJheUxpc3Q8V29yZExpc3RNZXRhZGF0YT4oKTsKKyAgICAgICAgaWYgKG51bGwgPT0gdG8pIHRvID0gbmV3IEFycmF5TGlzdDxXb3JkTGlzdE1ldGFkYXRhPigpOworICAgICAgICBmb3IgKFdvcmRMaXN0TWV0YWRhdGEgd2xEYXRhIDogZnJvbSkgd29yZExpc3RJZHMuYWRkKHdsRGF0YS5tSWQpOworICAgICAgICBmb3IgKFdvcmRMaXN0TWV0YWRhdGEgd2xEYXRhIDogdG8pIHdvcmRMaXN0SWRzLmFkZCh3bERhdGEubUlkKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaWQgOiB3b3JkTGlzdElkcykgeworICAgICAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBjdXJyZW50SW5mbyA9IE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGZyb20sIGlkKTsKKyAgICAgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgbWV0YWRhdGFJbmZvID0gTWV0YWRhdGFIYW5kbGVyLmZpbmRXb3JkTGlzdEJ5SWQodG8sIGlkKTsKKyAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIHVubmVjZXNzYXJ5IGNoZWNrLCBzaW5jZSB3ZSBhcmUgbm93IGRvaW5nIHRoZSBmaWx0ZXJpbmcKKyAgICAgICAgICAgIC8vIGluc2lkZSBmaW5kV29yZExpc3RCeUlkLgorICAgICAgICAgICAgZmluYWwgV29yZExpc3RNZXRhZGF0YSBuZXdJbmZvID0gbnVsbCA9PSBtZXRhZGF0YUluZm8KKyAgICAgICAgICAgICAgICAgICAgfHwgbWV0YWRhdGFJbmZvLm1Gb3JtYXRWZXJzaW9uID4gTUFYSU1VTV9TVVBQT1JURURfRk9STUFUX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwgOiBtZXRhZGF0YUluZm87CisgICAgICAgICAgICBVdGlscy5sKCJDb25zaWRlcmluZyB1cGRhdGluZyAiLCBpZCwgImN1cnJlbnRJbmZvID0iLCBjdXJyZW50SW5mbyk7CisKKyAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRJbmZvICYmIG51bGwgPT0gbmV3SW5mbykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiBpZiBhIG5ldyB3b3JkIGxpc3QgYXBwZWFyZWQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUuCisgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbWV0YWRhdGFJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgaGFwcGVuZWQ/IEJ1ZyBpbiBTZXQ8Pj8KKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiR290IGFuIGlkIGZvciBhIHdvcmRsaXN0IHRoYXQgaXMgbmVpdGhlciBpbiBmcm9tIG5vciBpbiB0byIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYSBuZXcgd29yZCBsaXN0IHRoYXQgd2UgY2FuJ3QgaGFuZGxlLgorICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDYW4ndCBoYW5kbGUgd29yZCBsaXN0IHdpdGggaWQgJyIgKyBpZCArICInIGJlY2F1c2UgaXQgaGFzIGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmVyc2lvbiAiICsgbWV0YWRhdGFJbmZvLm1Gb3JtYXRWZXJzaW9uICsgIiBhbmQgdGhlIG1heGltdW0gdmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3ZSBjYW4gaGFuZGxlIGlzICIgKyBNQVhJTVVNX1NVUFBPUlRFRF9GT1JNQVRfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChudWxsID09IGN1cnJlbnRJbmZvKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBhIG5ldyBsaXN0IHRoYXQgd2UgZGlkIG5vdCBrbm93IG9mIHBvcHBlZCBvbiB0aGUgc2VydmVyLgorICAgICAgICAgICAgICAgIC8vIE1ha2UgaXQgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5NYWtlQXZhaWxhYmxlQWN0aW9uKGNsaWVudElkLCBuZXdJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG51bGwgPT0gbmV3SW5mbykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYW4gb2xkIGxpc3Qgd2UgaGFkIGlzIG5vdCBpbiB0aGUgc2VydmVyIGRhdGEgYW55IG1vcmUuCisgICAgICAgICAgICAgICAgLy8gUGFzcyBmYWxzZSB0byBGb3JnZXRBY3Rpb246IHRoaXMgbWF5IGJlIGluc3RhbGxlZCBhbmQgd2Ugc3RpbGwgd2FudCB0byBhcHBseQorICAgICAgICAgICAgICAgIC8vIGEgZm9yZ2V0LWxpa2UgYWN0aW9uIChyZW1vdmUgdGhlIFVSTCkgaWYgaXQgaXMsIHNvIHdlIHdhbnQgdG8gdHVybiBvZmYgdGhlCisgICAgICAgICAgICAgICAgLy8gc3RhdHVzID09IEFWQUlMQUJMRSBjaGVjay4gSWYgaXQncyBERUxFVElORywgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sCisgICAgICAgICAgICAgICAgLy8gYXMgd2Ugd2FudCB0byBsZWF2ZSB0aGUgcmVjb3JkIGFzIGxvbmcgYXMgQW5kcm9pZCBLZXlib2FyZCBoYXMgbm90IGRlbGV0ZWQgaXQgOworICAgICAgICAgICAgICAgIC8vIHRoZSByZWNvcmQgd2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGZpbGUgaXMgYWN0dWFsbHkgZGVsZXRlZC4KKyAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guRm9yZ2V0QWN0aW9uKGNsaWVudElkLCBjdXJyZW50SW5mbywgZmFsc2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBNZXRhZGF0YURiSGVscGVyLmdldERiKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3SW5mby5tVmVyc2lvbiA9PSBjdXJyZW50SW5mby5tVmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHRoZSBzYW1lIGlkL3ZlcnNpb24sIHdlIHVwZGF0ZSB0aGUgREIgd2l0aCB0aGUgbmV3IHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgdG9vIG11Y2ggaWYgdGhleSBkaWRuJ3QgY2hhbmdlLgorICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guVXBkYXRlRGF0YUFjdGlvbihjbGllbnRJZCwgbmV3SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3SW5mby5tVmVyc2lvbiA+IGN1cnJlbnRJbmZvLm1WZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSBuZXcgdmVyc2lvbiwgaXQncyBhIGRpZmZlcmVudCBlbnRyeSBpbiB0aGUgZGF0YWJhc2UuIE1ha2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlLCBhbmQgaWYgaXQncyBpbnN0YWxsZWQsIGFsc28gc3RhcnQgdGhlIGRvd25sb2FkLgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc0J5V29yZExpc3RJZChkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5mby5tSWQsIGN1cnJlbnRJbmZvLm1WZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1cyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQ09MVU1OKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLk1ha2VBdmFpbGFibGVBY3Rpb24oY2xpZW50SWQsIG5ld0luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGF0dXMgPT0gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5TdGFydERvd25sb2FkQWN0aW9uKGNsaWVudElkLCBuZXdJbmZvLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyB0cnVlIHRvIEZvcmdldEFjdGlvbjogdGhpcyBpcyBpbmRlZWQgYW4gdXBkYXRlIHRvIGEgbm9uLWluc3RhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29yZCBsaXN0LCBzbyBhY3RpdmF0ZSBzdGF0dXMgPT0gQVZBSUxBQkxFIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzdGF0dXMgaXMgREVMRVRJTkcsIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBJdCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgZW50cnkgYXMgREVMRVRJTkcgYW5kIHJlbW92ZSBpdHMgVVJMIHNvIHRoYXQgQW5kcm9pZCBLZXlib2FyZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGRlbGV0ZSBpdCB0aGUgbmV4dCB0aW1lIGl0IHN0YXJ0cyB1cC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5Gb3JnZXRBY3Rpb24oY2xpZW50SWQsIGN1cnJlbnRJbmZvLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5vdCB1cGRhdGluZyB3b3JkIGxpc3QgIiArIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogY3VycmVudCBsaXN0IHRpbWVzdGFtcCBpcyAiICsgY3VycmVudEluZm8ubUxhc3RVcGRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA7IG5ldyBsaXN0IHRpbWVzdGFtcCBpcyAiICsgbmV3SW5mby5tTGFzdFVwZGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhY3Rpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIGFuIHVwZ3JhZGUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGljdGlvbmFyaWVzIHRvIHNvbWUgZGVzaXJlZCBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgcmVhZGluZyBzZXR0aW5ncyBhbmQgZmlsZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBuZXdNZXRhZGF0YSB0aGUgc3RhdGUgd2Ugd2FudCB0byB1cGdyYWRlIHRvLgorICAgICAqIEByZXR1cm4gdGhlIHVwZ3JhZGUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgZGVzaXJlZCBzdGF0ZSwgcmVhZHkgdG8gYmUgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY3Rpb25CYXRjaCBjb21wdXRlVXBncmFkZVRvKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBuZXdNZXRhZGF0YSkgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIHJldHVybiBjb21wYXJlTWV0YWRhdGFGb3JVcGdyYWRlKGNvbnRleHQsIGNsaWVudElkLCBjdXJyZW50TWV0YWRhdGEsIG5ld01ldGFkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyB0aGUgbm90aWZpY2F0aW9uIHRoYXQgaW5mb3JtcyB0aGUgdXNlciBhIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogV2hlbiB0aGlzIG5vdGlmaWNhdGlvbiBpcyBjbGlja2VkLCB0aGUgZGlhbG9nIGZvciBkb3dubG9hZGluZyB0aGUgZGljdGlvbmFyeQorICAgICAqIG92ZXIgYSBtZXRlcmVkIGNvbm5lY3Rpb24gaXMgc2hvd24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93RGljdGlvbmFyeUF2YWlsYWJsZU5vdGlmaWNhdGlvbihmaW5hbCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIENvbnRlbnRWYWx1ZXMgaW5zdGFsbENhbmRpZGF0ZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gaW5zdGFsbENhbmRpZGF0ZS5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3MoY29udGV4dCwgRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShEb3dubG9hZE92ZXJNZXRlcmVkRGlhbG9nLkNMSUVOVF9JRF9LRVksIGNsaWVudElkKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKERvd25sb2FkT3Zlck1ldGVyZWREaWFsb2cuV09SRExJU1RfVE9fRE9XTkxPQURfS0VZLAorICAgICAgICAgICAgICAgIGluc3RhbGxDYW5kaWRhdGUuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTikpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5TSVpFX0tFWSwKKyAgICAgICAgICAgICAgICBpbnN0YWxsQ2FuZGlkYXRlLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLkZJTEVTSVpFX0NPTFVNTikpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRG93bmxvYWRPdmVyTWV0ZXJlZERpYWxvZy5MT0NBTEVfS0VZLCBsb2NhbGVTdHJpbmcpOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7CisgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgbm90aWZpY2F0aW9uSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShjb250ZXh0LAorICAgICAgICAgICAgICAgIDAgLyogcmVxdWVzdENvZGUgKi8sIGludGVudCwKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQgfCBQZW5kaW5nSW50ZW50LkZMQUdfT05FX1NIT1QpOworICAgICAgICBmaW5hbCBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChOb3RpZmljYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisgICAgICAgIC8vIE5vbmUgb2YgdGhvc2UgYXJlIGV4cGVjdGVkIHRvIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgICAgICBpZiAobnVsbCA9PSBub3RpZmljYXRpb25JbnRlbnQgfHwgbnVsbCA9PSBub3RpZmljYXRpb25NYW5hZ2VyKSByZXR1cm47CisKKyAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZSA9IExvY2FsZVV0aWxzLmNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobG9jYWxlU3RyaW5nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gKG51bGwgPT0gbG9jYWxlID8gIiIgOiBsb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGVGb3JtYXQgPSBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fdGl0bGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgbm90aWZpY2F0aW9uVGl0bGUgPSBTdHJpbmcuZm9ybWF0KHRpdGxlRm9ybWF0LCBsYW5ndWFnZSk7CisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIoY29udGV4dCkKKyAgICAgICAgICAgICAgICAuc2V0QXV0b0NhbmNlbCh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50SW50ZW50KG5vdGlmaWNhdGlvbkludGVudCkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudFRpdGxlKG5vdGlmaWNhdGlvblRpdGxlKQorICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dChjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0X2F2YWlsYWJsZV9ub3RpZmljYXRpb25fZGVzY3JpcHRpb24pKQorICAgICAgICAgICAgICAgIC5zZXRUaWNrZXIobm90aWZpY2F0aW9uVGl0bGUpCisgICAgICAgICAgICAgICAgLnNldE9uZ29pbmcoZmFsc2UpCisgICAgICAgICAgICAgICAgLnNldE9ubHlBbGVydE9uY2UodHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKFIuZHJhd2FibGUuaWNfbm90aWZ5X2RpY3Rpb25hcnkpCisgICAgICAgICAgICAgICAgLmdldE5vdGlmaWNhdGlvbigpOworICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShESUNUX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fSUQsIG5vdGlmaWNhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFsbHMgYSB3b3JkIGxpc3QgaWYgaXQgaGFzIG5ldmVyIGJlZW4gcmVxdWVzdGVkLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHdvcmQgbGlzdCBpcyByZXF1ZXN0ZWQsIGFuZCBpcyBhdmFpbGFibGUgYnV0IG5vdCBpbnN0YWxsZWQuIEl0IGNoZWNrcworICAgICAqIHRoZSBjb25kaXRpb25zIGZvciBhdXRvLWluc3RhbGxhdGlvbjogaWYgdGhlIGRpY3Rpb25hcnkgaXMgYSBtYWluIGRpY3Rpb25hcnkgZm9yIHRoaXMKKyAgICAgKiBsYW5ndWFnZSwgYW5kIGl0IGhhcyBuZXZlciBiZWVuIG9wdGVkIG91dCB0aHJvdWdoIHRoZSBkaWN0aW9uYXJ5IGludGVyZmFjZSwgdGhlbiB3ZSBzdGFydAorICAgICAqIGluc3RhbGxpbmcgaXQuIEZvciB0aGUgdXNlciB3aG8gZW5hYmxlcyBhIGxhbmd1YWdlIGFuZCB1c2VzIGl0IGZvciB0aGUgZmlyc3QgdGltZSwgdGhlCisgICAgICogZGljdGlvbmFyeSBzaG91bGQgbWFnaWNhbGx5IHN0YXJ0IGJlaW5nIHVzZWQgYSBzaG9ydCB0aW1lIGFmdGVyIHRoZXkgc3RhcnQgdHlwaW5nLgorICAgICAqIFRoZSBtYXlQcm9tcHQgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIHByb21wdCB0aGUgdXNlciBmb3IgYSBkZWNpc2lvbiB0bworICAgICAqIGRvd25sb2FkIG9yIG5vdCwgaW4gY2FzZSB3ZSBkZWNpZGUgd2UgYXJlIGluIHRoZSBjYXNlIHdoZXJlIHdlIHNob3VsZCBkb3dubG9hZCAtIHRoaXMKKyAgICAgKiByb3VnaGx5IGhhcHBlbnMgd2hlbiB0aGUgY3VycmVudCBjb25uZWN0aXZpdHkgaXMgM0cuIFNlZQorICAgICAqIERpY3Rpb25hcnlQcm92aWRlciNnZXREaWN0aW9uYXJ5V29yZExpc3RzRm9yQ29udGVudFVyaSBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICAvLyBBcyBvcHBvc2VkIHRvIG1hbnkgb3RoZXIgbWV0aG9kcywgdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZAorICAgIC8vIGxpc3QgYmVjYXVzZSBpdCBtYXkgb25seSBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiB3ZSBrbm93IGFib3V0IGZvciB0aGlzIHNwZWNpZmljCisgICAgLy8gd29yZCBsaXN0IElEIC8gY2xpZW50IElEIGNvbWJpbmF0aW9uLgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsSWZOZXZlclJlcXVlc3RlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBib29sZWFuIG1heVByb21wdCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBpZEFycmF5ID0gd29yZGxpc3RJZC5zcGxpdChEaWN0aW9uYXJ5UHJvdmlkZXIuSURfQ0FURUdPUllfU0VQQVJBVE9SKTsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5ldy1mb3JtYXQgZGljdGlvbmFyeSBpZCAoY2F0ZWdvcnk6bWFudWFsX2lkKSwgdGhlbiB1c2UgdGhlCisgICAgICAgIC8vIHNwZWNpZmllZCBjYXRlZ29yeS4gT3RoZXJ3aXNlLCBpdCBpcyBhIG1haW4gZGljdGlvbmFyeSwgc28gZm9yY2UgdGhlCisgICAgICAgIC8vIE1BSU4gY2F0ZWdvcnkgdXBvbiBpdC4KKyAgICAgICAgZmluYWwgU3RyaW5nIGNhdGVnb3J5ID0gMiA9PSBpZEFycmF5Lmxlbmd0aCA/IGlkQXJyYXlbMF0gOiBNQUlOX0RJQ1RJT05BUllfQ0FURUdPUlk7CisgICAgICAgIGlmICghTUFJTl9ESUNUSU9OQVJZX0NBVEVHT1JZLmVxdWFscyhjYXRlZ29yeSkpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhIG1haW4gZGljdGlvbmFyeS4gV2Ugb25seSBhdXRvLWluc3RhbGwgbWFpbiBkaWN0aW9uYXJpZXMsIHNvIHdlIGNhbiByZXR1cm4gbm93LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhjb250ZXh0KS5jb250YWlucyh3b3JkbGlzdElkKSkgeworICAgICAgICAgICAgLy8gSWYgc29tZSBraW5kIG9mIHNldHRpbmdzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgZm9yIHRoaXMgc3BlY2lmaWMgaWQsIHRoZW4KKyAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IGEgY2FuZGlkYXRlIGZvciBhdXRvLWluc3RhbGwuIEJlY2F1c2UgaXQgYWxyZWFkeSBpcyBlaXRoZXIgdHJ1ZSwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgbWF5IGJlIGluc3RhbGxlZCBvciBkb3dubG9hZGluZyBvciB3aGF0ZXZlciwgYW5kIHdlIGRvbid0CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNhcmUgYWJvdXQgaXQgYmVjYXVzZSBpdCdzIGFscmVhZHkgaGFuZGxlZCBvciBiZWluZyBoYW5kbGVkLCBvciBpdCdzIGZhbHNlCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIGl0IG1lYW5zIHRoZSB1c2VyIGV4cGxpY2l0ZWx5IHR1cm5lZCBpdCBvZmYgYW5kIGRvbid0IHdhbnQgdG8gaGF2ZQorICAgICAgICAgICAgLy8gaXQgaW5zdGFsbGVkLiBTbyB3ZSBxdWl0IHJpZ2h0IGF3YXkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGluc3RhbGxDYW5kaWRhdGUgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhRGJIZWxwZXIuZ2V0Q29udGVudFZhbHVlc09mTGF0ZXN0QXZhaWxhYmxlV29yZGxpc3RCeUlkKGRiLCB3b3JkbGlzdElkKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRQorICAgICAgICAgICAgICAgICE9IGluc3RhbGxDYW5kaWRhdGUuZ2V0QXNJbnRlZ2VyKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0NPTFVNTikpIHsKKyAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90ICJBVkFJTEFCTEUiLCB3ZSB3YW50IHRvIHN0b3Agbm93LiBCZWNhdXNlIGNhbmRpZGF0ZXMgZm9yIGF1dG8taW5zdGFsbAorICAgICAgICAgICAgLy8gYXJlIGxpc3RzIHRoYXQgd2Uga25vdyBhcmUgYXZhaWxhYmxlLCBidXQgd2UgYWxzbyBrbm93IGhhdmUgbmV2ZXIgYmVlbiBpbnN0YWxsZWQuCisgICAgICAgICAgICAvLyBJdCBkb2VzIG9idmlvdXNseSBub3QgY29uY2VybiBhbHJlYWR5IGluc3RhbGxlZCBsaXN0cywgb3IgZG93bmxvYWRpbmcgbGlzdHMsCisgICAgICAgICAgICAvLyBvciB0aG9zZSB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCwgZmxhZ2dlZCBhcyBkZWxldGluZy4uLiBTbyBhbnl0aGluZyBlbHNlIHRoYW4KKyAgICAgICAgICAgIC8vIEFWQUlMQUJMRSBtZWFucyB3ZSBkb24ndCBhdXRvLWluc3RhbGwuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF5UHJvbXB0CisgICAgICAgICAgICAgICAgJiYgRE9XTkxPQURfT1ZFUl9NRVRFUkVEX1NFVFRJTkdfVU5LTk9XTgorICAgICAgICAgICAgICAgICAgICAgICAgPT0gZ2V0RG93bmxvYWRPdmVyTWV0ZXJlZFNldHRpbmcoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eU1hbmFnZXIgY20gPQorICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXJDb21wYXRVdGlscy5pc0FjdGl2ZU5ldHdvcmtNZXRlcmVkKGNtKSkgeworICAgICAgICAgICAgICAgIHNob3dEaWN0aW9uYXJ5QXZhaWxhYmxlTm90aWZpY2F0aW9uKGNvbnRleHQsIGNsaWVudElkLCBpbnN0YWxsQ2FuZGlkYXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBkZWNpZGVkIGFnYWluc3QgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciBhIGRlY2lzaW9uLiBUaGlzIG1heSBiZSBiZWNhdXNlIHdlIHdlcmUKKyAgICAgICAgLy8gZXhwbGljaXRseSBhc2tlZCBub3QgdG8sIG9yIGJlY2F1c2Ugd2UgYXJlIGN1cnJlbnRseSBvbiB3aS1maSBhbnl3YXksIG9yIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW9uLiBXZSdsbCBlbnF1ZXVlIGEgcmVxdWVzdCA7IFN0YXJ0RG93bmxvYWRBY3Rpb24KKyAgICAgICAgLy8ga25vd3MgdG8gdXNlIHRoZSBjb3JyZWN0IHR5cGUgb2YgbmV0d29yayBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZ3MuCisKKyAgICAgICAgLy8gQWxzbyBub3RlIHRoYXQgb25jZSBpdCdzIGF1dG8taW5zdGFsbGVkLCBhIHdvcmQgbGlzdCB3aWxsIGJlIG1hcmtlZCBhcyBJTlNUQUxMRUQuIEl0IHdpbGwKKyAgICAgICAgLy8gdGh1cyByZWNlaXZlIGF1dG9tYXRpYyB1cGRhdGVzIGlmIHRoZXJlIGFyZSBhbnksIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4gSWYgdGhlIHVzZXIgZG9lcworICAgICAgICAvLyBub3Qgd2FudCB0aGlzIHdvcmQgbGlzdCwgdGhleSB3aWxsIGhhdmUgdG8gZ28gdG8gdGhlIHNldHRpbmdzIGFuZCBjaGFuZ2UgdGhlbSwgd2hpY2ggd2lsbAorICAgICAgICAvLyBjaGFuZ2UgdGhlIHNoYXJlZCBwcmVmZXJlbmNlcy4gU28gdGhlcmUgaXMgbm8gd2F5IGZvciBhIHdvcmQgbGlzdCB0aGF0IGhhcyBiZWVuCisgICAgICAgIC8vIGF1dG8taW5zdGFsbGVkIG9uY2UgdG8gZ2V0IGF1dG8taW5zdGFsbGVkIGFnYWluLCBhbmQgdGhhdCdzIHdoYXQgd2Ugd2FudC4KKyAgICAgICAgZmluYWwgQWN0aW9uQmF0Y2ggYWN0aW9ucyA9IG5ldyBBY3Rpb25CYXRjaCgpOworICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREb3dubG9hZEFjdGlvbihjbGllbnRJZCwKKyAgICAgICAgICAgICAgICBXb3JkTGlzdE1ldGFkYXRhLmNyZWF0ZUZyb21Db250ZW50VmFsdWVzKGluc3RhbGxDYW5kaWRhdGUpLCBmYWxzZSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyaW5nID0gaW5zdGFsbENhbmRpZGF0ZS5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkxPQ0FMRV9DT0xVTU4pOworICAgICAgICAvLyBXZSBhcmUgaW4gYSBjb250ZW50IHByb3ZpZGVyOiB3ZSBjYW4ndCBkbyBhbnkgVUkgYXQgYWxsLiBXZSBoYXZlIHRvIGRlZmVyIHRoZSBkaXNwbGF5aW5nCisgICAgICAgIC8vIGl0c2VsZiB0byB0aGUgc2VydmljZS4gQWxzbywgd2Ugb25seSBkaXNwbGF5IHRoaXMgd2hlbiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgLy8gZGljdGlvbmFyeSBmb3IgdGhpcyBsYW5ndWFnZSBhbHJlYWR5OiB3ZSBrbm93IHRoYXQgZnJvbSB0aGUgbWF5UHJvbXB0IGFyZ3VtZW50LgorICAgICAgICBpZiAobWF5UHJvbXB0KSB7CisgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgaW50ZW50LnNldENsYXNzKGNvbnRleHQsIERpY3Rpb25hcnlTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oRGljdGlvbmFyeVNlcnZpY2UuU0hPV19ET1dOTE9BRF9UT0FTVF9JTlRFTlRfQUNUSU9OKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShEaWN0aW9uYXJ5U2VydmljZS5MT0NBTEVfSU5URU5UX0FSR1VNRU5ULCBsb2NhbGVTdHJpbmcpOworICAgICAgICAgICAgY29udGV4dC5zdGFydFNlcnZpY2UoaW50ZW50KTsKKyAgICAgICAgfQorICAgICAgICBhY3Rpb25zLmV4ZWN1dGUoY29udGV4dCwgbmV3IExvZ1Byb2JsZW1SZXBvcnRlcihUQUcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgd29yZCBsaXN0IHdpdGggdGhlIHBhc3NlZCBpZCBhcyB1c2VkLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGRvd25sb2FkL2luc3RhbGwgdGhlIGxpc3QgYXMgcmVxdWlyZWQuIFRoZSBhY3Rpb24gd2lsbCBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgICAgKiB3b3JkIGxpc3QgaXMgYSB2YWxpZCBsaXN0LCBhbmQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gLSBpbiB0aGlzIGNhc2UsIG1hcmsgaXQgYXMgdXNlZC4KKyAgICAgKiBAc2VlIEFjdGlvbkJhdGNoLkFjdGlvbiNleGVjdXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgdXNpbmcgYWN0aW9uIGJhdGNoZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB3b3JkbGlzdElkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgaW5zdGFsbGVkLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QgdG8gbWFyayBhcyBpbnN0YWxsZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKiBAcGFyYW0gYWxsb3dEb3dubG9hZE9uTWV0ZXJlZERhdGEgd2hldGhlciB0byBkb3dubG9hZCBldmVuIG9uIG1ldGVyZWQgZGF0YSBjb25uZWN0aW9uCisgICAgICovCisgICAgLy8gVGhlIHZlcnNpb24gYXJndW1lbnQgaXMgbm90IHVzZWQgeWV0LCBiZWNhdXNlIHdlIGRvbid0IG5lZWQgaXQgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uCisgICAgLy8gd2UgbmVlZC4gSG93ZXZlciwgdGhlIHBhaXIgKGlkLCB2ZXJzaW9uKSBiZWluZyB0aGUgcHJpbWFyeSBrZXkgdG8gYSB3b3JkIGxpc3QgaW4gdGhlIGRhdGFiYXNlCisgICAgLy8gaXQgZmVlbHMgYmV0dGVyIGZvciBjb25zaXN0ZW5jeSB0byBwYXNzIGl0LCBhbmQgc29tZSBtZXRob2RzIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgIC8vIHdvcmQgbGlzdCBuZWVkIGl0IHNvIHdlIG1heSBuZWVkIGl0IGluIHRoZSBmdXR1cmUuCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtBc1VzZWQoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgaW50IHZlcnNpb24sCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBib29sZWFuIGFsbG93RG93bmxvYWRPbk1ldGVyZWREYXRhKSB7CisgICAgICAgIGZpbmFsIExpc3Q8V29yZExpc3RNZXRhZGF0YT4gY3VycmVudE1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YUhhbmRsZXIuZ2V0Q3VycmVudE1ldGFkYXRhKGNvbnRleHQsIGNsaWVudElkKTsKKyAgICAgICAgV29yZExpc3RNZXRhZGF0YSB3b3JkTGlzdCA9IE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEID09IHN0YXR1cworICAgICAgICAgICAgICAgIHx8IE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RFTEVUSU5HID09IHN0YXR1cykgeworICAgICAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkVuYWJsZUFjdGlvbihjbGllbnRJZCwgd29yZExpc3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUgPT0gc3RhdHVzKSB7CisgICAgICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREb3dubG9hZEFjdGlvbihjbGllbnRJZCwgd29yZExpc3QsCisgICAgICAgICAgICAgICAgICAgIGFsbG93RG93bmxvYWRPbk1ldGVyZWREYXRhKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIG1hcmtBc1VzZWQgOiAiICsgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBhY3Rpb25zLmV4ZWN1dGUoY29udGV4dCwgbmV3IExvZ1Byb2JsZW1SZXBvcnRlcihUQUcpKTsKKyAgICAgICAgc2lnbmFsTmV3RGljdGlvbmFyeVN0YXRlKGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSB3b3JkIGxpc3Qgd2l0aCB0aGUgcGFzc2VkIGlkIGFzIHVudXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbGVhdmVzIHRoZSBmaWxlIG9uIHRoZSBkaXNrIGZvciB1bHRlcmlvciB1c2UuIFRoZSBhY3Rpb24gd2lsbCBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgICAgKiB3b3JkIGxpc3QgaXMgbnVsbCwgYW5kIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIC0gaW4gdGhpcyBjYXNlLCBtYXJrIGl0IGFzIHVudXNlZC4KKyAgICAgKiBAc2VlIEFjdGlvbkJhdGNoLkFjdGlvbiNleGVjdXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBmb3IgdXNpbmcgYWN0aW9uIGJhdGNoZXMuCisgICAgICogQHBhcmFtIGNsaWVudElkIHRoZSBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB3b3JkbGlzdElkIHRoZSBpZCBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgaW5zdGFsbGVkLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSB3b3JkIGxpc3QgdG8gbWFyayBhcyBpbnN0YWxsZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICAvLyBUaGUgdmVyc2lvbiBhbmQgc3RhdHVzIGFyZ3VtZW50cyBhcmUgbm90IHVzZWQgeWV0LCBidXQgdGhpcyBtZXRob2QgbWF0Y2hlcyBpdHMgaW50ZXJmYWNlIHRvCisgICAgLy8gbWFya0FzVXNlZCBmb3IgY29uc2lzdGVuY3kuCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtBc1VudXNlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZExpc3QgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkRpc2FibGVBY3Rpb24oY2xpZW50SWQsIHdvcmRMaXN0KSk7CisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgICAgICBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIHdvcmQgbGlzdCB3aXRoIHRoZSBwYXNzZWQgaWQgYXMgZGVsZXRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGJhc2ljYWxseSBtZWFucyB0aGF0IG9uIHRoZSBuZXh0IGNoYW5jZSB0aGVyZSBpcyAocmlnaHQgYXdheSBpZiBBbmRyb2lkIEtleWJvYXJkCisgICAgICogaGFwcGVucyB0byBiZSB1cCwgb3IgdGhlIG5leHQgdGltZSBpdCBnZXRzIHVwIG90aGVyd2lzZSkgdGhlIGRpY3Rpb25hcnkgcGFjayB3aWxsCisgICAgICogc3VwcGx5IGFuIGVtcHR5IGRpY3Rpb25hcnkgdG8gaXQgdGhhdCB3aWxsIHJlcGxhY2Ugd2hhdGV2ZXIgZGljdGlvbmFyeSBpcyBpbnN0YWxsZWQuCisgICAgICogVGhpcyBhbGxvd3MgdG8gcmVsZWFzZSB0aGUgc3BhY2UgdGFrZW4gYnkgYSBkaWN0aW9uYXJ5IChleGNlcHQgZm9yIHRoZSBmZXcgYnl0ZXMgdGhlCisgICAgICogZW1wdHkgZGljdGlvbmFyeSB0YWtlcyB1cCksIGFuZCBvdmVycmlkZSBhIGJ1aWx0LWluIGRlZmF1bHQgZGljdGlvbmFyeSBzbyB0aGF0IHdlCisgICAgICogY2FuIGZha2UgZGVsZXRlIGEgYnVpbHQtaW4gZGljdGlvbmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzRGVsZXRpbmcoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY2xpZW50SWQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd29yZGxpc3RJZCwgZmluYWwgaW50IHZlcnNpb24sIGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxXb3JkTGlzdE1ldGFkYXRhPiBjdXJyZW50TWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5nZXRDdXJyZW50TWV0YWRhdGEoY29udGV4dCwgY2xpZW50SWQpOworICAgICAgICBmaW5hbCBXb3JkTGlzdE1ldGFkYXRhIHdvcmRMaXN0ID0KKyAgICAgICAgICAgICAgICBNZXRhZGF0YUhhbmRsZXIuZmluZFdvcmRMaXN0QnlJZChjdXJyZW50TWV0YWRhdGEsIHdvcmRsaXN0SWQpOworICAgICAgICBpZiAobnVsbCA9PSB3b3JkTGlzdCkgcmV0dXJuOworICAgICAgICBmaW5hbCBBY3Rpb25CYXRjaCBhY3Rpb25zID0gbmV3IEFjdGlvbkJhdGNoKCk7CisgICAgICAgIGFjdGlvbnMuYWRkKG5ldyBBY3Rpb25CYXRjaC5EaXNhYmxlQWN0aW9uKGNsaWVudElkLCB3b3JkTGlzdCkpOworICAgICAgICBhY3Rpb25zLmFkZChuZXcgQWN0aW9uQmF0Y2guU3RhcnREZWxldGVBY3Rpb24oY2xpZW50SWQsIHdvcmRMaXN0KSk7CisgICAgICAgIGFjdGlvbnMuZXhlY3V0ZShjb250ZXh0LCBuZXcgTG9nUHJvYmxlbVJlcG9ydGVyKFRBRykpOworICAgICAgICBzaWduYWxOZXdEaWN0aW9uYXJ5U3RhdGUoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhlIHdvcmQgbGlzdCB3aXRoIHRoZSBwYXNzZWQgaWQgYXMgYWN0dWFsbHkgZGVsZXRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgcmV2ZXJ0cyB0byBhdmFpbGFibGUgc3RhdHVzIG9yIGRlbGV0ZXMgdGhlIHJvdyBhcyBhcHByb3ByaWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHN0YXR1cyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzRGVsZXRlZChmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JkbGlzdElkLCBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBMaXN0PFdvcmRMaXN0TWV0YWRhdGE+IGN1cnJlbnRNZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgTWV0YWRhdGFIYW5kbGVyLmdldEN1cnJlbnRNZXRhZGF0YShjb250ZXh0LCBjbGllbnRJZCk7CisgICAgICAgIGZpbmFsIFdvcmRMaXN0TWV0YWRhdGEgd29yZExpc3QgPQorICAgICAgICAgICAgICAgIE1ldGFkYXRhSGFuZGxlci5maW5kV29yZExpc3RCeUlkKGN1cnJlbnRNZXRhZGF0YSwgd29yZGxpc3RJZCk7CisgICAgICAgIGlmIChudWxsID09IHdvcmRMaXN0KSByZXR1cm47CisgICAgICAgIGZpbmFsIEFjdGlvbkJhdGNoIGFjdGlvbnMgPSBuZXcgQWN0aW9uQmF0Y2goKTsKKyAgICAgICAgYWN0aW9ucy5hZGQobmV3IEFjdGlvbkJhdGNoLkZpbmlzaERlbGV0ZUFjdGlvbihjbGllbnRJZCwgd29yZExpc3QpKTsKKyAgICAgICAgYWN0aW9ucy5leGVjdXRlKGNvbnRleHQsIG5ldyBMb2dQcm9ibGVtUmVwb3J0ZXIoVEFHKSk7CisgICAgICAgIHNpZ25hbE5ld0RpY3Rpb25hcnlTdGF0ZShjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgd29yZCBsaXN0IHdpdGggdGhlIHBhc3NlZCBpZCBhcyBicm9rZW4uCisgICAgICoKKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IGRlbGV0ZXMgdGhlIGVudHJ5IGZyb20gdGhlIG1ldGFkYXRhLiBJdCBkb2Vzbid0IHByZXZlbnQgdGhlIHNhbWUKKyAgICAgKiB3b3JkIGxpc3QgdG8gYmUgZG93bmxvYWRlZCBhZ2FpbiBhdCBhIGxhdGVyIHRpbWUgaWYgdGhlIHNhbWUgb3IgYSBuZXcgdmVyc2lvbiBpcworICAgICAqIGF2YWlsYWJsZSB0aGUgbmV4dCB0aW1lIHdlIGRvd25sb2FkIHRoZSBtZXRhZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHRvIG9wZW4gdGhlIGRhdGFiYXNlIG9uLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCB0aGUgaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gd29yZGxpc3RJZCB0aGUgaWQgb2YgdGhlIHdvcmQgbGlzdCB0byBtYXJrIGFzIGJyb2tlbi4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgd29yZCBsaXN0IHRvIG1hcmsgYXMgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya0FzQnJva2VuKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNsaWVudElkLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsIGZpbmFsIGludCB2ZXJzaW9uKSB7CisgICAgICAgIC8vIFRPRE86IGRvIHRoaXMgb24gYW5vdGhlciB0aHJlYWQgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIFVJLgorICAgICAgICBNZXRhZGF0YURiSGVscGVyLmRlbGV0ZUVudHJ5KE1ldGFkYXRhRGJIZWxwZXIuZ2V0RGIoY29udGV4dCwgY2xpZW50SWQpLAorICAgICAgICAgICAgICAgIHdvcmRsaXN0SWQsIHZlcnNpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2RpY3Rpb25hcnlwYWNrL1V0aWxzLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTQyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEEgY2xhc3MgZm9yIHZhcmlvdXMgdXRpbGl0eSBtZXRob2RzLCBlc3BlY2lhbGx5IGRlYnVnZ2luZy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFV0aWxzIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gVXRpbHMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIjpERUJVRyAtLSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IERpY3Rpb25hcnlQcm92aWRlci5ERUJVRzsKKworICAgIC8qKgorICAgICAqIENhbGxzIC50b1N0cmluZygpIG9uIGl0cyBub24tbnVsbCBhcmd1bWVudCBvciByZXR1cm5zICJudWxsIgorICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gY29udmVydCB0byBhIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiAudG9TdHJpbmcoKSBvciBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICByZXR1cm4gbnVsbCA9PSBvID8gIm51bGwiIDogby50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqIEByZXR1cm4gYSByZWFkYWJsZSwgY2FycmlhZ2UtcmV0dXJuLXNlcGFyYXRlZCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YWNrVHJhY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgLy8gU3RhcnQgYXQgMSBiZWNhdXNlIHRoZSBmaXJzdCBmcmFtZSBpcyBoZXJlIGFuZCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGZyYW1lcy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmcmFtZXNbal0udG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RhY2sgdHJhY2UgY29udGFpbmVkIGluIGFuIGV4Y2VwdGlvbiBhcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uCisgICAgICogQHJldHVybiB0aGUgaHVtYW4tcmVhZGFibGUgc3RhY2sgdHJhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGFja1RyYWNlKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYW1lcy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgc2IuYXBwZW5kKGZyYW1lc1tqXS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGxvZyBtZXRob2QgdG8gZWFzZSBudWxsLWNoZWNrcyBhbmQgYWRkaW5nIHNwYWNlcy4KKyAgICAgKgorICAgICAqIFRoaXMgc2VuZHMgYWxsIGFyZ3VtZW50cyB0byB0aGUgbG9nLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLiBBbnkgbnVsbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQKKyAgICAgKiB0byB0aGUgIm51bGwiIHN0cmluZy4gSXQgdXNlcyBhIHZlcnkgdmlzaWJsZSB0YWcgYW5kIGxvZyBsZXZlbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0dWZmIHRvIHNlbmQgdG8gdGhlIGxvZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsKGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IG8gOiBhcmdzKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocyhvKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGxvZyBtZXRob2QgdG8gcHV0IHN0dWZmIGluIHJlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyB0aGUgc2FtZSBhcyAjbCBidXQgcHJpbnRzIGluIHJlZAorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHN0dWZmIHRvIHNlbmQgdG8gdGhlIGxvZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByKGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIGlmICghREVCVUcpIHJldHVybjsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcdTAwMUJbMzFtIik7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IG8gOiBhcmdzKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocyhvKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXHUwMDFCWzBtIik7CisgICAgICAgIExvZy5lKFRBRywgc2IudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RNZXRhZGF0YS5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmZmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Xb3JkTGlzdE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjazsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworCisvKioKKyAqIFRoZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgd29yZCBsaXN0LgorICoKKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBhbHdheXMgaW1tdXRhYmxlLgorICovCitwdWJsaWMgY2xhc3MgV29yZExpc3RNZXRhZGF0YSB7CisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1JZDsKKyAgICBwdWJsaWMgZmluYWwgaW50IG1UeXBlOyAvLyBUeXBlLCBhcyBvZiBNZXRhZGF0YURiSGVscGVyI1RZUEVfKgorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbURlc2NyaXB0aW9uOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG1MYXN0VXBkYXRlOworICAgIHB1YmxpYyBmaW5hbCBsb25nIG1GaWxlU2l6ZTsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1DaGVja3N1bTsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Mb2NhbEZpbGVuYW1lOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJlbW90ZUZpbGVuYW1lOworICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247IC8vIHZlcnNpb24gb2YgdGhpcyB3b3JkIGxpc3QKKyAgICBwdWJsaWMgZmluYWwgaW50IG1GbGFnczsgLy8gQWx3YXlzIDAgaW4gdGhpcyB2ZXJzaW9uLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCisgICAgLy8gVGhlIGxvY2FsZSBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGxvY2FsZSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIG1hdGNoaW5nIGFsZ29yaXRobQorICAgIC8vIGlzIGEgc3RhbmRhcmQgbG9jYWxlIG1hdGNoaW5nIHdpdGggZmFsbGJhY2s7IGl0IGlzIGltcGxlbWVudGVkIGluCisgICAgLy8gRGljdGlvbmFyeVByb3ZpZGVyI2dldERpY3Rpb25hcnlGaWxlRm9yQ29udGVudFVyaS4KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Mb2NhbGU7CisKKworICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBmb3JtYXQuCisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGljdGlvbmFyeURhdGFTZXJ2aWNlIGtub3dzIGhvdyB0byBoYW5kbGUgZm9ybWF0IDEgb25seS4KKyAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSwgdG8gYmUgYWJsZSB0byB1cGdyYWRlIHRoZSBmb3JtYXQgd2l0aG91dAorICAgIC8vIGJyZWFraW5nIG9sZCBpbXBsZW1lbnRhdGlvbnMuCisgICAgcHVibGljIGZpbmFsIGludCBtRm9ybWF0VmVyc2lvbjsKKworICAgIHB1YmxpYyBXb3JkTGlzdE1ldGFkYXRhKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgaW50IHR5cGUsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIGxvbmcgbGFzdFVwZGF0ZSwgZmluYWwgbG9uZyBmaWxlU2l6ZSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGVja3N1bSwgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUsIGZpbmFsIFN0cmluZyByZW1vdGVGaWxlbmFtZSwKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLCBmaW5hbCBpbnQgZm9ybWF0VmVyc2lvbiwgZmluYWwgaW50IGZsYWdzLCBmaW5hbCBTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgIG1JZCA9IGlkOworICAgICAgICBtVHlwZSA9IHR5cGU7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICBtTGFzdFVwZGF0ZSA9IGxhc3RVcGRhdGU7IC8vIEluIG1pbGxpc2Vjb25kcworICAgICAgICBtRmlsZVNpemUgPSBmaWxlU2l6ZTsKKyAgICAgICAgbUNoZWNrc3VtID0gY2hlY2tzdW07CisgICAgICAgIG1Mb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZTsKKyAgICAgICAgbVJlbW90ZUZpbGVuYW1lID0gcmVtb3RlRmlsZW5hbWU7CisgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUZvcm1hdFZlcnNpb24gPSBmb3JtYXRWZXJzaW9uOworICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgbUxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBXb3JkTGlzdE1ldGFkYXRhIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgQ29udGVudFZhbHVlcy4KKyAgICAgKgorICAgICAqIElmIHRoaXMgbGFja3MgYW55IHJlcXVpcmVkIGZpZWxkLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV29yZExpc3RNZXRhZGF0YSBjcmVhdGVGcm9tQ29udGVudFZhbHVlcyhmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5XT1JETElTVElEX0NPTFVNTik7CisgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZSA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5UWVBFX0NPTFVNTik7CisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiA9IHZhbHVlcy5nZXRBc1N0cmluZyhNZXRhZGF0YURiSGVscGVyLkRFU0NSSVBUSU9OX0NPTFVNTik7CisgICAgICAgIGZpbmFsIExvbmcgbGFzdFVwZGF0ZSA9IHZhbHVlcy5nZXRBc0xvbmcoTWV0YWRhdGFEYkhlbHBlci5EQVRFX0NPTFVNTik7CisgICAgICAgIGZpbmFsIExvbmcgZmlsZVNpemUgPSB2YWx1ZXMuZ2V0QXNMb25nKE1ldGFkYXRhRGJIZWxwZXIuRklMRVNJWkVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrc3VtID0gdmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuQ0hFQ0tTVU1fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsRmlsZW5hbWUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5MT0NBTF9GSUxFTkFNRV9DT0xVTU4pOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZW5hbWUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWV0YWRhdGFEYkhlbHBlci5SRU1PVEVfRklMRU5BTUVfQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciB2ZXJzaW9uID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLlZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciBmb3JtYXRWZXJzaW9uID0gdmFsdWVzLmdldEFzSW50ZWdlcihNZXRhZGF0YURiSGVscGVyLkZPUk1BVFZFUlNJT05fQ09MVU1OKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciBmbGFncyA9IHZhbHVlcy5nZXRBc0ludGVnZXIoTWV0YWRhdGFEYkhlbHBlci5GTEFHU19DT0xVTU4pOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlID0gdmFsdWVzLmdldEFzU3RyaW5nKE1ldGFkYXRhRGJIZWxwZXIuTE9DQUxFX0NPTFVNTik7CisgICAgICAgIGlmIChudWxsID09IGlkCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSB0eXBlCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gbGFzdFVwZGF0ZQorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZmlsZVNpemUKKyAgICAgICAgICAgICAgICB8fCBudWxsID09IGNoZWNrc3VtCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSBsb2NhbEZpbGVuYW1lCisgICAgICAgICAgICAgICAgfHwgbnVsbCA9PSByZW1vdGVGaWxlbmFtZQorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gdmVyc2lvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZm9ybWF0VmVyc2lvbgorICAgICAgICAgICAgICAgIHx8IG51bGwgPT0gZmxhZ3MKKyAgICAgICAgICAgICAgICB8fCBudWxsID09IGxvY2FsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgV29yZExpc3RNZXRhZGF0YShpZCwgdHlwZSwgZGVzY3JpcHRpb24sIGxhc3RVcGRhdGUsIGZpbGVTaXplLCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICBsb2NhbEZpbGVuYW1lLCByZW1vdGVGaWxlbmFtZSwgdmVyc2lvbiwgZm9ybWF0VmVyc2lvbiwgZmxhZ3MsIGxvY2FsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFdvcmRMaXN0TWV0YWRhdGEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgOiAiKS5hcHBlbmQobUlkKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcblR5cGUgOiAiKS5hcHBlbmQobVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIlxuRGVzY3JpcHRpb24gOiAiKS5hcHBlbmQobURlc2NyaXB0aW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkxhc3RVcGRhdGUgOiAiKS5hcHBlbmQobUxhc3RVcGRhdGUpOworICAgICAgICBzYi5hcHBlbmQoIlxuRmlsZVNpemUgOiAiKS5hcHBlbmQobUZpbGVTaXplKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkNoZWNrc3VtIDogIikuYXBwZW5kKG1DaGVja3N1bSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG5Mb2NhbEZpbGVuYW1lIDogIikuYXBwZW5kKG1Mb2NhbEZpbGVuYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcblJlbW90ZUZpbGVuYW1lIDogIikuYXBwZW5kKG1SZW1vdGVGaWxlbmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG5WZXJzaW9uIDogIikuYXBwZW5kKG1WZXJzaW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkZvcm1hdFZlcnNpb24gOiAiKS5hcHBlbmQobUZvcm1hdFZlcnNpb24pOworICAgICAgICBzYi5hcHBlbmQoIlxuRmxhZ3MgOiAiKS5hcHBlbmQobUZsYWdzKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbkxvY2FsZSA6ICIpLmFwcGVuZChtTG9jYWxlKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9kaWN0aW9uYXJ5cGFjay9Xb3JkTGlzdFByZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkyM2FlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvZGljdGlvbmFyeXBhY2svV29yZExpc3RQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwyNDggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisgKiBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2s7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5SOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBBIHByZWZlcmVuY2UgZm9yIG9uZSB3b3JkIGxpc3QuCisgKgorICogVGhpcyBwcmVmZXJlbmNlIHJlZmVycyB0byBhIHNpbmdsZSB3b3JkIGxpc3QsIGFzIGF2YWlsYWJsZSBpbiB0aGUgZGljdGlvbmFyeQorICogcGFjay4gVXBvbiBiZWluZyBwcmVzc2VkLCBpdCBkaXNwbGF5cyBhIG1lbnUgdG8gYWxsb3cgdGhlIHVzZXIgdG8gaW5zdGFsbCwgZGlzYWJsZSwKKyAqIGVuYWJsZSBvciBkZWxldGUgaXQgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXb3JkTGlzdFByZWZlcmVuY2UgZXh0ZW5kcyBEaWFsb2dQcmVmZXJlbmNlIHsKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgVEFHID0gV29yZExpc3RQcmVmZXJlbmNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIC8vIFdoYXQgdG8gZGlzcGxheSBpbiB0aGUgInN0YXR1cyIgZmllbGQgd2hlbiB3ZSByZWNlaXZlIHVua25vd24gZGF0YSBhcyBhIHN0YXR1cyBmcm9tCisgICAgLy8gdGhlIGNvbnRlbnQgcHJvdmlkZXIuIEVtcHR5IHN0cmluZyBzb3VuZHMgc2Vuc2libGUuCisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIE5PX1NUQVRVU19NRVNTQUdFID0gIiI7CisKKyAgICAvLy8gQWN0aW9ucworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBBQ1RJT05fVU5LTk9XTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEFDVElPTl9FTkFCTEVfRElDVCA9IDE7CisgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEFDVElPTl9ESVNBQkxFX0RJQ1QgPSAyOworICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGludCBBQ1RJT05fREVMRVRFX0RJQ1QgPSAzOworCisgICAgLy8gTWVtYmVycworICAgIC8vIFRoZSBjb250ZXh0IHRvIGdldCByZXNvdXJjZXMKKyAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIC8vIFRoZSBpZCBvZiB0aGUgY2xpZW50IGZvciB3aGljaCB0aGlzIHByZWZlcmVuY2UgaXMuCisgICAgZmluYWwgU3RyaW5nIG1DbGllbnRJZDsKKyAgICAvLyBUaGUgbWV0YWRhdGEgd29yZCBsaXN0IGlkIGFuZCB2ZXJzaW9uIG9mIHRoaXMgd29yZCBsaXN0LgorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVdvcmRsaXN0SWQ7CisgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKKyAgICAvLyBUaGUgc3RhdHVzCisgICAgcHVibGljIGludCBtU3RhdHVzOworCisgICAgLy8gQW5pbWF0aW9uIGRpcmVjdGlvbnMKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX0lOID0gMTsKKyAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBpbnQgQU5JTUFUSU9OX09VVCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCdXR0b24gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2sgbVByZWZlcmVuY2VDbGlja0hhbmRsZXIgPQorICAgICAgICAgICAgbmV3IE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2soKTsKKyAgICBwcml2YXRlIGZpbmFsIE9uQWN0aW9uQnV0dG9uQ2xpY2sgbUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlciA9CisgICAgICAgICAgICBuZXcgT25BY3Rpb25CdXR0b25DbGljaygpOworCisgICAgcHVibGljIFdvcmRMaXN0UHJlZmVyZW5jZShmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBjbGllbnRJZCwgZmluYWwgU3RyaW5nIHdvcmRsaXN0SWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgTG9jYWxlIGxvY2FsZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLCBmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIG1Xb3JkbGlzdElkID0gd29yZGxpc3RJZDsKKworICAgICAgICBzZXRMYXlvdXRSZXNvdXJjZShSLmxheW91dC5kaWN0aW9uYXJ5X2xpbmUpOworCisgICAgICAgIHNldFRpdGxlKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIHNldEtleSh3b3JkbGlzdElkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RhdHVzKGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBtU3RhdHVzKSByZXR1cm47CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIHNldFN1bW1hcnkoZ2V0U3VtbWFyeShzdGF0dXMpKTsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBkaWFsb2csIHdlIHNob3VsZCB1cGRhdGUgaXQsIG9yIGF0IGxlYXN0CisgICAgICAgIC8vIGRpc21pc3MgaXQuCisgICAgICAgIGZpbmFsIERpYWxvZyBkaWFsb2cgPSBnZXREaWFsb2coKTsKKyAgICAgICAgaWYgKG51bGwgIT0gZGlhbG9nKSB7CisgICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3VtbWFyeShmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhlIHdvcmQgbGlzdCwgZm9yIHRoZSB1c2VyIGl0J3MgbGlrZSBpdCdzIGFscmVhZHkgZGVsZXRlZC4KKyAgICAgICAgICAgIC8vIEl0IHNob3VsZCBiZSByZWluc3RhbGxhYmxlLiBFeHBvc2luZyB0byB0aGUgdXNlciB0aGUgd2hvbGUgY29tcGxleGl0eSBvZgorICAgICAgICAgICAgLy8gdGhlIGRlbGF5ZWQgZGVsZXRpb24gcHJvY2VzcyBiZXR3ZWVuIHRoZSBkaWN0aW9uYXJ5IHBhY2sgYW5kIEFuZHJvaWQgS2V5Ym9hcmQKKyAgICAgICAgICAgIC8vIHdvdWxkIG9ubHkgYmUgY29uZnVzaW5nLgorICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ERUxFVElORzoKKyAgICAgICAgICAgIGNhc2UgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGljdGlvbmFyeV9hdmFpbGFibGUpOworICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ET1dOTE9BRElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRpY3Rpb25hcnlfZG93bmxvYWRpbmcpOworICAgICAgICAgICAgY2FzZSBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19JTlNUQUxMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0aW9uYXJ5X2luc3RhbGxlZCk7CisgICAgICAgICAgICBjYXNlIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGljdGlvbmFyeV9kaXNhYmxlZCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOT19TVEFUVVNfTUVTU0FHRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzU3RhdHVzQWN0aW9uTGlzdFtdW10gPSB7CisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX1VOS05PV04KKyAgICAgICAge30sCisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0FWQUlMQUJMRQorICAgICAgICB7IFIuc3RyaW5nLmluc3RhbGxfZGljdCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0sCisgICAgICAgIC8vIE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HCisgICAgICAgIHsgUi5zdHJpbmcuY2FuY2VsX2Rvd25sb2FkX2RpY3QsIEFDVElPTl9ESVNBQkxFX0RJQ1QgfSwKKyAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfSU5TVEFMTEVECisgICAgICAgIHsgUi5zdHJpbmcuZGVsZXRlX2RpY3QsIEFDVElPTl9ERUxFVEVfRElDVCB9LAorICAgICAgICAvLyBNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRAorICAgICAgICB7IFIuc3RyaW5nLmRlbGV0ZV9kaWN0LCBBQ1RJT05fREVMRVRFX0RJQ1QgfSwKKyAgICAgICAgLy8gTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcKKyAgICAgICAgLy8gV2Ugc2hvdyAnaW5zdGFsbCcgYmVjYXVzZSB0aGUgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSBkZWxldGVkLgorICAgICAgICAvLyBUaGUgdXNlciBtYXkgcmVpbnN0YWxsIGl0LgorICAgICAgICB7IFIuc3RyaW5nLmluc3RhbGxfZGljdCwgQUNUSU9OX0VOQUJMRV9ESUNUIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0QnV0dG9uTGFiZWwoZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzID49IHNTdGF0dXNBY3Rpb25MaXN0Lmxlbmd0aCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBzdGF0dXMgIiArIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFN0cmluZyhzU3RhdHVzQWN0aW9uTGlzdFtzdGF0dXNdWzBdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QWN0aW9uSWRGcm9tU3RhdHVzQW5kTWVudUVudHJ5KGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA+PSBzU3RhdHVzQWN0aW9uTGlzdC5sZW5ndGgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gc3RhdHVzICIgKyBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzU3RhdHVzQWN0aW9uTGlzdFtzdGF0dXNdWzFdOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlRGljdCgpIHsKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhtQ29udGV4dCk7CisgICAgICAgIENvbW1vblByZWZlcmVuY2VzLmRpc2FibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNVbnVzZWQobUNvbnRleHQsIG1DbGllbnRJZCwgbVdvcmRsaXN0SWQsIG1WZXJzaW9uLCBtU3RhdHVzKTsKKyAgICAgICAgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HID09IG1TdGF0dXMpIHsKKyAgICAgICAgICAgIHNldFN0YXR1cyhNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUpOworICAgICAgICB9IGVsc2UgaWYgKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCA9PSBtU3RhdHVzKSB7CisgICAgICAgICAgICAvLyBJbnRlcmZhY2Utd2lzZSwgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhYmxlIHRvIGNvbWUgaGVyZS4gSG93ZXZlciwgdGhpcyBpcyBzdGlsbAorICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGlmIHdlIGRvIGNvbWUgaGVyZS4KKyAgICAgICAgICAgIHNldFN0YXR1cyhNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIGRpc2FibGluZyAiICsgbVN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZURpY3QoKSB7CisgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gQ29tbW9uUHJlZmVyZW5jZXMuZ2V0Q29tbW9uUHJlZmVyZW5jZXMobUNvbnRleHQpOworICAgICAgICBDb21tb25QcmVmZXJlbmNlcy5lbmFibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgLy8gRXhwbGljaXQgZW5hYmxpbmcgYnkgdGhlIHVzZXIgOiBhbGxvdyBkb3dubG9hZGluZyBvbiBtZXRlcmVkIGRhdGEgY29ubmVjdGlvbi4KKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNVc2VkKG1Db250ZXh0LCBtQ2xpZW50SWQsIG1Xb3JkbGlzdElkLCBtVmVyc2lvbiwgbVN0YXR1cywgdHJ1ZSk7CisgICAgICAgIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19BVkFJTEFCTEUgPT0gbVN0YXR1cykgeworICAgICAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RPV05MT0FESU5HKTsKKyAgICAgICAgfSBlbHNlIGlmIChNZXRhZGF0YURiSGVscGVyLlNUQVRVU19ESVNBQkxFRCA9PSBtU3RhdHVzCisgICAgICAgICAgICAgICAgfHwgTWV0YWRhdGFEYkhlbHBlci5TVEFUVVNfREVMRVRJTkcgPT0gbVN0YXR1cykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBpcyBERUxFVElORywgaXQgbWVhbnMgQW5kcm9pZCBLZXlib2FyZAorICAgICAgICAgICAgLy8gaGFzIG5vdCBkZWxldGVkIHRoZSB3b3JkIGxpc3QgeWV0LCBzbyB3ZSBjYW4gc2FmZWx5CisgICAgICAgICAgICAvLyB0dXJuIGl0IHRvICdpbnN0YWxsZWQnLiBUaGUgc3RhdHVzIERJU0FCTEVEIGlzIHN0aWxsIHN1cHBvcnRlZCBpbnRlcm5hbGx5IHRvCisgICAgICAgICAgICAvLyBhdm9pZCBicmVha2luZyBvbGRlciBpbnN0YWxsYXRpb25zIGFuZCBhbGwgYnV0IHRoZXJlIHNob3VsZCBub3QgYmUgYSB3YXkgdG8KKyAgICAgICAgICAgIC8vIGRpc2FibGUgYSB3b3JkIGxpc3QgdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGFueSBtb3JlLgorICAgICAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0lOU1RBTExFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbmV4cGVjdGVkIHN0YXRlIG9mIHRoZSB3b3JkIGxpc3QgZm9yIGVuYWJsaW5nICIgKyBtU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGljdCgpIHsKKyAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlcy5nZXRDb21tb25QcmVmZXJlbmNlcyhtQ29udGV4dCk7CisgICAgICAgIENvbW1vblByZWZlcmVuY2VzLmRpc2FibGUocHJlZnMsIG1Xb3JkbGlzdElkKTsKKyAgICAgICAgc2V0U3RhdHVzKE1ldGFkYXRhRGJIZWxwZXIuU1RBVFVTX0RFTEVUSU5HKTsKKyAgICAgICAgVXBkYXRlSGFuZGxlci5tYXJrQXNEZWxldGluZyhtQ29udGV4dCwgbUNsaWVudElkLCBtV29yZGxpc3RJZCwgbVZlcnNpb24sIG1TdGF0dXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZFZpZXcoZmluYWwgVmlldyB2aWV3KSB7CisgICAgICAgIHN1cGVyLm9uQmluZFZpZXcodmlldyk7CisgICAgICAgICgoVmlld0dyb3VwKXZpZXcpLnNldExheW91dFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgIGZpbmFsIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKXZpZXcuZmluZFZpZXdCeUlkKFIuaWQud29yZGxpc3RfYnV0dG9uKTsKKyAgICAgICAgYnV0dG9uLnNldFRleHQoZ2V0QnV0dG9uTGFiZWwobVN0YXR1cykpOworICAgICAgICBidXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUFjdGlvbkJ1dHRvbkNsaWNrSGFuZGxlcik7CisgICAgICAgIHZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1QcmVmZXJlbmNlQ2xpY2tIYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uV29yZExpc3RQcmVmZXJlbmNlQ2xpY2sgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdikgeworICAgICAgICAgICAgZmluYWwgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC53b3JkbGlzdF9idXR0b24pOworICAgICAgICAgICAgaWYgKG51bGwgIT0gc0xhc3RDbGlja2VkQWN0aW9uQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihzTGFzdENsaWNrZWRBY3Rpb25CdXR0b24sIEFOSU1BVElPTl9PVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUJ1dHRvbihidXR0b24sIEFOSU1BVElPTl9JTik7CisgICAgICAgICAgICBzTGFzdENsaWNrZWRBY3Rpb25CdXR0b24gPSBidXR0b247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUJ1dHRvbihmaW5hbCBCdXR0b24gYnV0dG9uLCBmaW5hbCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG91dGVyWCA9ICgoVmlldylidXR0b24uZ2V0UGFyZW50KCkpLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IGlubmVyWCA9IGJ1dHRvbi5nZXRYKCkgLSBidXR0b24uZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgIGlmIChWaWV3LklOVklTSUJMRSA9PSBidXR0b24uZ2V0VmlzaWJpbGl0eSgpKSB7CisgICAgICAgICAgICBidXR0b24uc2V0VHJhbnNsYXRpb25YKG91dGVyWCAtIGlubmVyWCk7CisgICAgICAgICAgICBidXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgICAgIGlmIChBTklNQVRJT05fSU4gPT0gZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBidXR0b24uYW5pbWF0ZSgpLnRyYW5zbGF0aW9uWCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1dHRvbi5hbmltYXRlKCkudHJhbnNsYXRpb25YKG91dGVyWCAtIGlubmVyWCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9uQWN0aW9uQnV0dG9uQ2xpY2sgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIFZpZXcgdikgeworICAgICAgICAgICAgc3dpdGNoIChnZXRBY3Rpb25JZEZyb21TdGF0dXNBbmRNZW51RW50cnkobVN0YXR1cykpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VOQUJMRV9ESUNUOgorICAgICAgICAgICAgICAgIGVuYWJsZURpY3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0RJU0FCTEVfRElDVDoKKyAgICAgICAgICAgICAgICBkaXNhYmxlRGljdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fREVMRVRFX0RJQ1Q6CisgICAgICAgICAgICAgICAgZGVsZXRlRGljdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIG1lbnUgaXRlbSBwcmVzc2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5LmphdmEKaW5kZXggZDM2OWUyYi4uNzM4Mzg2MiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeS5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnkuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QuZGljdGlvbmFyeXBhY2suRGljdGlvbmFyeVByb3ZpZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmtleWJvYXJkLlByb3hpbWl0eUluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uU3VnZ2VzdGVkV29yZHMuU3VnZ2VzdGVkV29yZEluZm87CiAKQEAgLTMxLDggKzMyLDcgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeURpY3Rpb25hcnkgZXh0ZW5kcyBEaWN0aW9uYXJ5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gQmluYXJ5RGljdGlvbmFyeS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVElPTkFSWV9QQUNLX0FVVEhPUklUWSA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQ1RJT05BUllfUEFDS19BVVRIT1JJVFkgPSBEaWN0aW9uYXJ5UHJvdmlkZXIuQVVUSE9SSVRZOwogCiAgICAgLy8gTXVzdCBiZSBlcXVhbCB0byBNQVhfV09SRF9MRU5HVEggaW4gbmF0aXZlL2puaS9zcmMvZGVmaW5lcy5oCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XT1JEX0xFTkdUSCA9IENvbnN0YW50cy5EaWN0aW9uYXJ5Lk1BWF9XT1JEX0xFTkdUSDsKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlHZXR0ZXIuamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0JpbmFyeURpY3Rpb25hcnlHZXR0ZXIuamF2YQppbmRleCBmNjhlOWY5Li4yOTQzMTI4IDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9CaW5hcnlEaWN0aW9uYXJ5R2V0dGVyLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vQmluYXJ5RGljdGlvbmFyeUdldHRlci5qYXZhCkBAIC05NiwxOCArOTYsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERpY3RQYWNrU2V0dGluZ3MgewogICAgICAgICBmaW5hbCBTaGFyZWRQcmVmZXJlbmNlcyBtRGljdFByZWZlcmVuY2VzOwogICAgICAgICBwdWJsaWMgRGljdFBhY2tTZXR0aW5ncyhmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIENvbnRleHQgZGljdFBhY2tDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRpY3RQYWNrTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kaWN0aW9uYXJ5X3BhY2tfcGFja2FnZV9uYW1lKTsKLSAgICAgICAgICAgICAgICBkaWN0UGFja0NvbnRleHQgPSBjb250ZXh0LmNyZWF0ZVBhY2thZ2VDb250ZXh0KGRpY3RQYWNrTmFtZSwgMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkaWN0aW9uYXJ5IHBhY2sgaXMgbm90IGluc3RhbGxlZC4uLgotICAgICAgICAgICAgICAgIC8vIFRPRE86IGZhbGxiYWNrIG9uIHRoZSBidWlsdC1pbiBkaWN0LCBzZWUgdGhlIFRPRE8gYWJvdmUKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgZmluZCBhIGRpY3Rpb25hcnkgcGFjayIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURpY3RQcmVmZXJlbmNlcyA9IG51bGwgPT0gZGljdFBhY2tDb250ZXh0ID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IGRpY3RQYWNrQ29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhDT01NT05fUFJFRkVSRU5DRVNfTkFNRSwKKyAgICAgICAgICAgIG1EaWN0UHJlZmVyZW5jZXMgPSBudWxsID09IGNvbnRleHQgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogY29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhDT01NT05fUFJFRkVSRU5DRVNfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0Lk1PREVfV09STERfUkVBREFCTEUgfCBDb250ZXh0Lk1PREVfTVVMVElfUFJPQ0VTUyk7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXb3JkTGlzdEFjdGl2ZShmaW5hbCBTdHJpbmcgZGljdElkKSB7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5UGFja0luc3RhbGxCcm9hZGNhc3RSZWNlaXZlci5qYXZhIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vRGljdGlvbmFyeVBhY2tJbnN0YWxsQnJvYWRjYXN0UmVjZWl2ZXIuamF2YQppbmRleCBhODUxM2ZmLi5kNmM4ODkxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9EaWN0aW9uYXJ5UGFja0luc3RhbGxCcm9hZGNhc3RSZWNlaXZlci5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL0RpY3Rpb25hcnlQYWNrSW5zdGFsbEJyb2FkY2FzdFJlY2VpdmVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbjsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmlucHV0bWV0aG9kLmRpY3Rpb25hcnlwYWNrLlVwZGF0ZUhhbmRsZXI7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM0LDcgKzM2LDcgQEAKICAgICAgKiBUaGUgYWN0aW9uIG9mIHRoZSBpbnRlbnQgZm9yIHB1Ymxpc2hpbmcgdGhhdCBuZXcgZGljdGlvbmFyeSBkYXRhIGlzIGF2YWlsYWJsZS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RJQ1RJT05BUllfSU5URU5UX0FDVElPTiA9Ci0gICAgICAgICAgICAiY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uZGljdGlvbmFyeXBhY2submV3ZGljdCI7CisgICAgICAgICAgICBVcGRhdGVIYW5kbGVyLk5FV19ESUNUSU9OQVJZX0lOVEVOVF9BQ1RJT047CiAKICAgICBwdWJsaWMgRGljdGlvbmFyeVBhY2tJbnN0YWxsQnJvYWRjYXN0UmVjZWl2ZXIoZmluYWwgTGF0aW5JTUUgc2VydmljZSkgewogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CmRpZmYgLS1naXQgYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0ZyYWdtZW50LmphdmEgYi9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9TZXR0aW5nc0ZyYWdtZW50LmphdmEKaW5kZXggODQwODI5Yy4uZmExN2I0ZiAxMDA2NDQKLS0tIGEvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vU2V0dGluZ3NGcmFnbWVudC5qYXZhCisrKyBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL1NldHRpbmdzRnJhZ21lbnQuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5kaWN0aW9uYXJ5cGFjay5EaWN0aW9uYXJ5U2V0dGluZ3NBY3Rpdml0eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnB1dG1ldGhvZC5sYXRpbi5kZWZpbmUuUHJvZHVjdGlvbkZsYWc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc2V0dXAuTGF1bmNoZXJJY29uVmlzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW5wdXRtZXRob2Rjb21tb24uSW5wdXRNZXRob2RTZXR0aW5nc0ZyYWdtZW50OwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gZGljdGlvbmFyeUxpbmsgPQogICAgICAgICAgICAgICAgIChQcmVmZXJlbmNlU2NyZWVuKSBmaW5kUHJlZmVyZW5jZShTZXR0aW5ncy5QUkVGX0NPTkZJR1VSRV9ESUNUSU9OQVJJRVNfS0VZKTsKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGRpY3Rpb25hcnlMaW5rLmdldEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgRGljdGlvbmFyeVNldHRpbmdzQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgZmluYWwgaW50IG51bWJlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5xdWVyeUludGVudEFjdGl2aXRpZXMoaW50ZW50LCAwKS5zaXplKCk7CiAgICAgICAgIC8vIFRPRE86IFRoZSBkZXZlbG9wbWVudC1vbmx5LWRpYWdub3N0aWMgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBEaWN0aW9uYXJ5IFBhY2sKICAgICAgICAgLy8gU2VydmljZSB5ZXQKZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YQppbmRleCA2M2Y0NmI3Li45YTExMTRmIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRTcGVsbENoZWNrZXJTZXNzaW9uLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW5wdXRtZXRob2QubGF0aW4uc3BlbGxjaGVjazsKIAoraW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcudGV4dHNlcnZpY2UuU2VudGVuY2VTdWdnZXN0aW9uc0luZm87CkBAIC0xMzMsMjIgKzEzNCwyNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdWdnZXN0aW9uc0luZm9bXSBvbkdldFN1Z2dlc3Rpb25zTXVsdGlwbGUoVGV4dEluZm9bXSB0ZXh0SW5mb3MsCiAgICAgICAgICAgICBpbnQgc3VnZ2VzdGlvbnNMaW1pdCwgYm9vbGVhbiBzZXF1ZW50aWFsV29yZHMpIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHRJbmZvcy5sZW5ndGg7Ci0gICAgICAgIGZpbmFsIFN1Z2dlc3Rpb25zSW5mb1tdIHJldHZhbCA9IG5ldyBTdWdnZXN0aW9uc0luZm9bbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZXb3JkOwotICAgICAgICAgICAgaWYgKHNlcXVlbnRpYWxXb3JkcyAmJiBpID4gMCkgeworICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dEluZm9zLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIFN1Z2dlc3Rpb25zSW5mb1tdIHJldHZhbCA9IG5ldyBTdWdnZXN0aW9uc0luZm9bbGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJldldvcmQ7CisgICAgICAgICAgICAgICAgaWYgKHNlcXVlbnRpYWxXb3JkcyAmJiBpID4gMCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2V29yZENhbmRpZGF0ZSA9IHRleHRJbmZvc1tpIC0gMV0uZ2V0VGV4dCgpOwogICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbiBlbXB0eSBzdHJpbmcgd291bGQgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgaW5pdGlhbCB3b3JkCiAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZS4KICAgICAgICAgICAgICAgICBwcmV2V29yZCA9IFRleHRVdGlscy5pc0VtcHR5KHByZXZXb3JkQ2FuZGlkYXRlKSA/IG51bGwgOiBwcmV2V29yZENhbmRpZGF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldldvcmQgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZXb3JkID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKHRleHRJbmZvc1tpXSwgcHJldldvcmQsIHN1Z2dlc3Rpb25zTGltaXQpOworICAgICAgICAgICAgICAgIHJldHZhbFtpXS5zZXRDb29raWVBbmRTZXF1ZW5jZSh0ZXh0SW5mb3NbaV0uZ2V0Q29va2llKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW5mb3NbaV0uZ2V0U2VxdWVuY2UoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR2YWxbaV0gPSBvbkdldFN1Z2dlc3Rpb25zKHRleHRJbmZvc1tpXSwgcHJldldvcmQsIHN1Z2dlc3Rpb25zTGltaXQpOwotICAgICAgICAgICAgcmV0dmFsW2ldLnNldENvb2tpZUFuZFNlcXVlbmNlKHRleHRJbmZvc1tpXS5nZXRDb29raWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdGV4dEluZm9zW2ldLmdldFNlcXVlbmNlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFdvcmRMZXZlbFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YSBiL2phdmEvc3JjL2NvbS9hbmRyb2lkL2lucHV0bWV0aG9kL2xhdGluL3NwZWxsY2hlY2svQW5kcm9pZFdvcmRMZXZlbFNwZWxsQ2hlY2tlclNlc3Npb24uamF2YQppbmRleCBjZDNmOWU0Li40Zjg2YTMxIDEwMDY0NAotLS0gYS9qYXZhL3NyYy9jb20vYW5kcm9pZC9pbnB1dG1ldGhvZC9sYXRpbi9zcGVsbGNoZWNrL0FuZHJvaWRXb3JkTGV2ZWxTcGVsbENoZWNrZXJTZXNzaW9uLmphdmEKKysrIGIvamF2YS9zcmMvY29tL2FuZHJvaWQvaW5wdXRtZXRob2QvbGF0aW4vc3BlbGxjaGVjay9BbmRyb2lkV29yZExldmVsU3BlbGxDaGVja2VyU2Vzc2lvbi5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuVXNlckRpY3Rpb25hcnkuV29yZHM7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnRleHRzZXJ2aWNlLlNwZWxsQ2hlY2tlclNlcnZpY2UuU2Vzc2lvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMjM0LDEzICsyMzUsMTIgQEAKICAgICAgKiBjb3JyZWN0aW9ucyBmb3IgdGhlIHRleHQgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LiBJdCBtYXkgc3BsaXQgb3IgZ3JvdXAgd29yZHMsIGFuZAogICAgICAqIGV2ZW4gcGVyZm9ybSBncmFtbWF0aWNhbCBhbmFseXNpcy4KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VnZ2VzdGlvbnNJbmZvIG9uR2V0U3VnZ2VzdGlvbnMoZmluYWwgVGV4dEluZm8gdGV4dEluZm8sCisgICAgcHJpdmF0ZSBTdWdnZXN0aW9uc0luZm8gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKGZpbmFsIFRleHRJbmZvIHRleHRJbmZvLAogICAgICAgICAgICAgZmluYWwgaW50IHN1Z2dlc3Rpb25zTGltaXQpIHsKLSAgICAgICAgcmV0dXJuIG9uR2V0U3VnZ2VzdGlvbnModGV4dEluZm8sIG51bGwsIHN1Z2dlc3Rpb25zTGltaXQpOworICAgICAgICByZXR1cm4gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKHRleHRJbmZvLCBudWxsLCBzdWdnZXN0aW9uc0xpbWl0KTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3VnZ2VzdGlvbnNJbmZvIG9uR2V0U3VnZ2VzdGlvbnMoCisgICAgcHJvdGVjdGVkIFN1Z2dlc3Rpb25zSW5mbyBvbkdldFN1Z2dlc3Rpb25zSW50ZXJuYWwoCiAgICAgICAgICAgICBmaW5hbCBUZXh0SW5mbyB0ZXh0SW5mbywgZmluYWwgU3RyaW5nIHByZXZXb3JkLCBmaW5hbCBpbnQgc3VnZ2VzdGlvbnNMaW1pdCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluVGV4dCA9IHRleHRJbmZvLmdldFRleHQoKTsKQEAgLTM1Nyw0ICszNTcsMjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIC8qCisgICAgICogVGhlIHNwZWxsIGNoZWNrZXIgYWN0cyBvbiBpdHMgb3duIGJlaGFsZi4gVGhhdCBpcyBuZWVkZWQsIGluIHBhcnRpY3VsYXIsIHRvIGJlIGFibGUgdG8KKyAgICAgKiBhY2Nlc3MgdGhlIGRpY3Rpb25hcnkgZmlsZXMsIHdoaWNoIHRoZSBwcm92aWRlciByZXN0cmljdHMgdG8gdGhlIGlkZW50aXR5IG9mIExhdGluIElNRS4KKyAgICAgKiBTaW5jZSBpdCdzIGNhbGxlZCBleHRlcm5hbGx5IGJ5IHRoZSBhcHBsaWNhdGlvbiwgdGhlIHNwZWxsIGNoZWNrZXIgaXMgdXNpbmcgdGhlIGlkZW50aXR5CisgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIGJ5IGRlZmF1bHQgdW5sZXNzIHdlIGNsZWFyQ2FsbGluZ0lkZW50aXR5LgorICAgICAqIFRoYXQncyB3aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGRvZXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN1Z2dlc3Rpb25zSW5mbyBvbkdldFN1Z2dlc3Rpb25zKGZpbmFsIFRleHRJbmZvIHRleHRJbmZvLAorICAgICAgICAgICAgZmluYWwgaW50IHN1Z2dlc3Rpb25zTGltaXQpIHsKKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG9uR2V0U3VnZ2VzdGlvbnNJbnRlcm5hbCh0ZXh0SW5mbywgc3VnZ2VzdGlvbnNMaW1pdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisgICAgICAgIH0KKyAgICB9CiB9Cg==