PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPkQuoENvZGUgZm9yIFhQYXRoIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNjEuMiI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InByZXZpb3VzIiBocmVmPSJhcGMuaHRtbCIgdGl0bGU9IkMuoENvZGUgZm9yIEtleXdvcmQgRXhhbXBsZSI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJhcGUuaHRtbCIgdGl0bGU9IkUuoENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGUiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPkQuoENvZGUgZm9yIFhQYXRoIEV4YW1wbGU8L3RoPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGMuaHRtbCI+UHJldjwvYT6gPC90ZD48dGggd2lkdGg9IjYwJSIgYWxpZ249ImNlbnRlciI+oDwvdGg+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBlLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4IiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0ieHBhdGhhcHBlbmRpeCI+PC9hPkQuoENvZGUgZm9yIFhQYXRoIEV4YW1wbGU8L2gyPjwvZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PHA+CiAgICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+CiNpbmNsdWRlICZsdDtsaWJ4bWwvcGFyc2VyLmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwveHBhdGguaCZndDsKCnhtbERvY1B0cgpnZXRkb2MgKGNoYXIgKmRvY25hbWUpIHsKCXhtbERvY1B0ciBkb2M7Cglkb2MgPSB4bWxQYXJzZUZpbGUoZG9jbmFtZSk7CgkKCWlmIChkb2MgPT0gTlVMTCApIHsKCQlmcHJpbnRmKHN0ZGVyciwiRG9jdW1lbnQgbm90IHBhcnNlZCBzdWNjZXNzZnVsbHkuIFxuIik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJuIGRvYzsKfQoKeG1sWFBhdGhPYmplY3RQdHIKZ2V0bm9kZXNldCAoeG1sRG9jUHRyIGRvYywgeG1sQ2hhciAqeHBhdGgpewoJCgl4bWxYUGF0aENvbnRleHRQdHIgY29udGV4dDsKCXhtbFhQYXRoT2JqZWN0UHRyIHJlc3VsdDsKCgljb250ZXh0ID0geG1sWFBhdGhOZXdDb250ZXh0KGRvYyk7CglpZiAoY29udGV4dCA9PSBOVUxMKSB7CgkJcHJpbnRmKCJFcnJvciBpbiB4bWxYUGF0aE5ld0NvbnRleHRcbiIpOwoJCXJldHVybiBOVUxMOwoJfQoJcmVzdWx0ID0geG1sWFBhdGhFdmFsRXhwcmVzc2lvbih4cGF0aCwgY29udGV4dCk7Cgl4bWxYUGF0aEZyZWVDb250ZXh0KGNvbnRleHQpOwoJaWYgKHJlc3VsdCA9PSBOVUxMKSB7CgkJcHJpbnRmKCJFcnJvciBpbiB4bWxYUGF0aEV2YWxFeHByZXNzaW9uXG4iKTsKCQlyZXR1cm4gTlVMTDsKCX0KCWlmKHhtbFhQYXRoTm9kZVNldElzRW1wdHkocmVzdWx0LSZndDtub2Rlc2V0dmFsKSl7CgkJeG1sWFBhdGhGcmVlT2JqZWN0KHJlc3VsdCk7CiAgICAgICAgICAgICAgICBwcmludGYoIk5vIHJlc3VsdFxuIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4gcmVzdWx0Owp9CmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoKCWNoYXIgKmRvY25hbWU7Cgl4bWxEb2NQdHIgZG9jOwoJeG1sQ2hhciAqeHBhdGggPSAoeG1sQ2hhciopICIvL2tleXdvcmQiOwoJeG1sTm9kZVNldFB0ciBub2Rlc2V0OwoJeG1sWFBhdGhPYmplY3RQdHIgcmVzdWx0OwoJaW50IGk7Cgl4bWxDaGFyICprZXl3b3JkOwoJCQoJaWYgKGFyZ2MgJmx0Oz0gMSkgewoJCXByaW50ZigiVXNhZ2U6ICVzIGRvY25hbWVcbiIsIGFyZ3ZbMF0pOwoJCXJldHVybigwKTsKCX0KCglkb2NuYW1lID0gYXJndlsxXTsKCWRvYyA9IGdldGRvYyhkb2NuYW1lKTsKCXJlc3VsdCA9IGdldG5vZGVzZXQgKGRvYywgeHBhdGgpOwoJaWYgKHJlc3VsdCkgewoJCW5vZGVzZXQgPSByZXN1bHQtJmd0O25vZGVzZXR2YWw7CgkJZm9yIChpPTA7IGkgJmx0OyBub2Rlc2V0LSZndDtub2RlTnI7IGkrKykgewoJCQlrZXl3b3JkID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBub2Rlc2V0LSZndDtub2RlVGFiW2ldLSZndDt4bWxDaGlsZHJlbk5vZGUsIDEpOwoJCXByaW50Zigia2V5d29yZDogJXNcbiIsIGtleXdvcmQpOwoJCXhtbEZyZWUoa2V5d29yZCk7CgkJfQoJCXhtbFhQYXRoRnJlZU9iamVjdCAocmVzdWx0KTsKCX0KCXhtbEZyZWVEb2MoZG9jKTsKCXhtbENsZWFudXBQYXJzZXIoKTsKCXJldHVybiAoMSk7Cn0KPC9wcmU+PHA+CiAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ibmF2Zm9vdGVyIj48aHI+PHRhYmxlIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGZvb3RlciI+PHRyPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGMuaHRtbCI+UHJldjwvYT6gPC90ZD48dGQgd2lkdGg9IjIwJSIgYWxpZ249ImNlbnRlciI+PGEgYWNjZXNza2V5PSJ1IiBocmVmPSJpbmRleC5odG1sIj5VcDwvYT48L3RkPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0icmlnaHQiPqA8YSBhY2Nlc3NrZXk9Im4iIGhyZWY9ImFwZS5odG1sIj5OZXh0PC9hPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Qy6gQ29kZSBmb3IgS2V5d29yZCBFeGFtcGxloDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj6gRS6gQ29kZSBmb3IgQWRkIEtleXdvcmQgRXhhbXBsZTwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjwvYm9keT48L2h0bWw+Cg==