PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5CLiBDb2RlIGZvciBLZXl3b3JkIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNDgiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJwcmV2aW91cyIgaHJlZj0iYXBhLmh0bWwiIHRpdGxlPSJBLiBTYW1wbGUgRG9jdW1lbnQiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iYXBjLmh0bWwiIHRpdGxlPSJDLiBDb2RlIGZvciBBZGQgS2V5d29yZCBFeGFtcGxlIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9Im5hdmhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciI+PHRyPjx0aCBjb2xzcGFuPSIzIiBhbGlnbj0iY2VudGVyIj5CLiBDb2RlIGZvciBLZXl3b3JkIEV4YW1wbGU8L3RoPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGEuaHRtbCI+UHJldjwvYT6gPC90ZD48dGggd2lkdGg9IjYwJSIgYWxpZ249ImNlbnRlciI+oDwvdGg+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBjLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4Ij48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9ImtleXdvcmRhcHBlbmRpeCI+PC9hPkIuIENvZGUgZm9yIEtleXdvcmQgRXhhbXBsZTwvaDI+PHA+CiAgICAgIDxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKI2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3htbG1lbW9yeS5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3BhcnNlci5oJmd0OwoKdm9pZApwYXJzZVN0b3J5ICh4bWxEb2NQdHIgZG9jLCB4bWxOb2RlUHRyIGN1cikgewoKCWN1ciA9IGN1ci0mZ3Q7eG1sQ2hpbGRyZW5Ob2RlOwoJd2hpbGUgKGN1ciAhPSBOVUxMKSB7CgkgICAgaWYgKCgheG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikmcXVvdDtrZXl3b3JkJnF1b3Q7KSkpIHsKCQkgICAgcHJpbnRmKCZxdW90O2tleXdvcmQ6ICVzXG4mcXVvdDssIHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY3VyLSZndDt4bWxDaGlsZHJlbk5vZGUsIDEpKTsKCSAgICB9CgljdXIgPSBjdXItJmd0O25leHQ7Cgl9CiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkCnBhcnNlRG9jKGNoYXIgKmRvY25hbWUpIHsKCgl4bWxEb2NQdHIgZG9jOwoJeG1sTm9kZVB0ciBjdXI7CgoJZG9jID0geG1sUGFyc2VGaWxlKGRvY25hbWUpOwoJCglpZiAoZG9jID09IE5VTEwgKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7RG9jdW1lbnQgbm90IHBhcnNlZCBzdWNjZXNzZnVsbHkuIFxuJnF1b3Q7KTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuOwoJfQoJCgljdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwoJCglpZiAoY3VyID09IE5VTEwpIHsKCQlmcHJpbnRmKHN0ZGVyciwmcXVvdDtlbXB0eSBkb2N1bWVudFxuJnF1b3Q7KTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuOwoJfQoJCglpZiAoeG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgJnF1b3Q7c3RvcnkmcXVvdDspKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7ZG9jdW1lbnQgb2YgdGhlIHdyb25nIHR5cGUsIHJvb3Qgbm9kZSAhPSBzdG9yeSZxdW90Oyk7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldHVybjsKCX0KCQoJY3VyID0gY3VyLSZndDt4bWxDaGlsZHJlbk5vZGU7Cgl3aGlsZSAoY3VyICE9IE5VTEwpIHsKCQlpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSZxdW90O3N0b3J5aW5mbyZxdW90OykpKXsKCQkJcGFyc2VTdG9yeSAoZG9jLCBjdXIpOwoJCX0KCQkgCgljdXIgPSBjdXItJmd0O25leHQ7Cgl9CgkKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybjsKfQoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CgoJY2hhciAqZG9jbmFtZTsKCQkKCWlmIChhcmdjICZsdDs9IDEpIHsKCQlwcmludGYoJnF1b3Q7VXNhZ2U6ICVzIGRvY25hbWVcbiZxdW90OywgYXJndlswXSk7CgkJcmV0dXJuKDApOwoJfQoKCWRvY25hbWUgPSBhcmd2WzFdOwoJcGFyc2VEb2MgKGRvY25hbWUpOwoKCXJldHVybiAoMSk7Cn0KCjwvcHJlPgogICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5hdmZvb3RlciI+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXBhLmh0bWwiPlByZXY8L2E+oDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iaW5kZXguaHRtbCI+VXA8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJhcGMuaHRtbCI+TmV4dDwvYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkEuIFNhbXBsZSBEb2N1bWVudKA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCI+oEMuIENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGU8L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2JvZHk+PC9odG1sPgo=