PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPkUuoENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNjEuMiI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InByZXZpb3VzIiBocmVmPSJhcGQuaHRtbCIgdGl0bGU9IkQuoENvZGUgZm9yIFhQYXRoIEV4YW1wbGUiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iYXBmLmh0bWwiIHRpdGxlPSJGLqBDb2RlIGZvciBBZGQgQXR0cmlidXRlIEV4YW1wbGUiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPkUuoENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGU8L3RoPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGQuaHRtbCI+UHJldjwvYT6gPC90ZD48dGggd2lkdGg9IjYwJSIgYWxpZ249ImNlbnRlciI+oDwvdGg+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBmLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4IiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iYWRka2V5d29yZGFwcGVuZGl4Ij48L2E+RS6gQ29kZSBmb3IgQWRkIEtleXdvcmQgRXhhbXBsZTwvaDI+PC9kaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48cD4KICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKI2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3htbG1lbW9yeS5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3BhcnNlci5oJmd0OwoKdm9pZApwYXJzZVN0b3J5ICh4bWxEb2NQdHIgZG9jLCB4bWxOb2RlUHRyIGN1ciwgY2hhciAqa2V5d29yZCkgewoKCXhtbE5ld1RleHRDaGlsZCAoY3VyLCBOVUxMLCAia2V5d29yZCIsIGtleXdvcmQpOwogICAgcmV0dXJuOwp9Cgp4bWxEb2NQdHIKcGFyc2VEb2MoY2hhciAqZG9jbmFtZSwgY2hhciAqa2V5d29yZCkgewoKCXhtbERvY1B0ciBkb2M7Cgl4bWxOb2RlUHRyIGN1cjsKCglkb2MgPSB4bWxQYXJzZUZpbGUoZG9jbmFtZSk7CgkKCWlmIChkb2MgPT0gTlVMTCApIHsKCQlmcHJpbnRmKHN0ZGVyciwiRG9jdW1lbnQgbm90IHBhcnNlZCBzdWNjZXNzZnVsbHkuIFxuIik7CgkJcmV0dXJuIChOVUxMKTsKCX0KCQoJY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKCQoJaWYgKGN1ciA9PSBOVUxMKSB7CgkJZnByaW50ZihzdGRlcnIsImVtcHR5IGRvY3VtZW50XG4iKTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuIChOVUxMKTsKCX0KCQoJaWYgKHhtbFN0cmNtcChjdXItJmd0O25hbWUsIChjb25zdCB4bWxDaGFyICopICJzdG9yeSIpKSB7CgkJZnByaW50ZihzdGRlcnIsImRvY3VtZW50IG9mIHRoZSB3cm9uZyB0eXBlLCByb290IG5vZGUgIT0gc3RvcnkiKTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuIChOVUxMKTsKCX0KCQoJY3VyID0gY3VyLSZndDt4bWxDaGlsZHJlbk5vZGU7Cgl3aGlsZSAoY3VyICE9IE5VTEwpIHsKCQlpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSJzdG9yeWluZm8iKSkpewoJCQlwYXJzZVN0b3J5IChkb2MsIGN1ciwga2V5d29yZCk7CgkJfQoJCSAKCWN1ciA9IGN1ci0mZ3Q7bmV4dDsKCX0KCXJldHVybihkb2MpOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCgljaGFyICpkb2NuYW1lOwoJY2hhciAqa2V5d29yZDsKCXhtbERvY1B0ciBkb2M7CgoJaWYgKGFyZ2MgJmx0Oz0gMikgewoJCXByaW50ZigiVXNhZ2U6ICVzIGRvY25hbWUsIGtleXdvcmRcbiIsIGFyZ3ZbMF0pOwoJCXJldHVybigwKTsKCX0KCglkb2NuYW1lID0gYXJndlsxXTsKCWtleXdvcmQgPSBhcmd2WzJdOwoJZG9jID0gcGFyc2VEb2MgKGRvY25hbWUsIGtleXdvcmQpOwoJaWYgKGRvYyAhPSBOVUxMKSB7CgkJeG1sU2F2ZUZvcm1hdEZpbGUgKGRvY25hbWUsIGRvYywgMCk7CgkJeG1sRnJlZURvYyhkb2MpOwoJfQoJCglyZXR1cm4gKDEpOwp9Cgo8L3ByZT48cD4KICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJuYXZmb290ZXIiPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0Ij48YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImFwZC5odG1sIj5QcmV2PC9hPqA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9InUiIGhyZWY9ImluZGV4Lmh0bWwiPlVwPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBmLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5ELqBDb2RlIGZvciBYUGF0aCBFeGFtcGxloDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj6gRi6gQ29kZSBmb3IgQWRkIEF0dHJpYnV0ZSBFeGFtcGxlPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4K