PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5FLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlPC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjUwLjAiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJwcmV2aW91cyIgaHJlZj0iYXBkLmh0bWwiIHRpdGxlPSJELiBDb2RlIGZvciBBZGQgQXR0cmlidXRlIEV4YW1wbGUiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iYXBmLmh0bWwiIHRpdGxlPSJGLiBDb2RlIGZvciBFbmNvZGluZyBDb252ZXJzaW9uIEV4YW1wbGUiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPkUuIENvZGUgZm9yIFJldHJpZXZpbmcgQXR0cmlidXRlIFZhbHVlIEV4YW1wbGU8L3RoPjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0ibGVmdCI+PGEgYWNjZXNza2V5PSJwIiBocmVmPSJhcGQuaHRtbCI+UHJldjwvYT6gPC90ZD48dGggd2lkdGg9IjYwJSIgYWxpZ249ImNlbnRlciI+oDwvdGg+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBmLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4Ij48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9ImdldGF0dHJpYnV0ZWFwcGVuZGl4Ij48L2E+RS4gQ29kZSBmb3IgUmV0cmlldmluZyBBdHRyaWJ1dGUgVmFsdWUgRXhhbXBsZTwvaDI+PHA+CiAgICAgIDxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKI2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3htbG1lbW9yeS5oJmd0OwojaW5jbHVkZSAmbHQ7bGlieG1sL3BhcnNlci5oJmd0OwoKdm9pZApnZXRSZWZlcmVuY2UgKHhtbERvY1B0ciBkb2MsIHhtbE5vZGVQdHIgY3VyKSB7CgoJeG1sQ2hhciAqdXJpOwoJY3VyID0gY3VyLSZndDt4bWxDaGlsZHJlbk5vZGU7Cgl3aGlsZSAoY3VyICE9IE5VTEwpIHsKCSAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSZxdW90O3JlZmVyZW5jZSZxdW90OykpKSB7CgkJICAgIHVyaSA9IHhtbEdldFByb3AoY3VyLCAmcXVvdDt1cmkmcXVvdDspOwoJCSAgICBwcmludGYoJnF1b3Q7dXJpOiAlc1xuJnF1b3Q7LCB1cmkpOwoJCSAgICB4bWxGcmVlKHVyaSk7CgkgICAgfQoJICAgIGN1ciA9IGN1ci0mZ3Q7bmV4dDsKCX0KCXJldHVybjsKfQoKCnZvaWQKcGFyc2VEb2MoY2hhciAqZG9jbmFtZSkgewoKCXhtbERvY1B0ciBkb2M7Cgl4bWxOb2RlUHRyIGN1cjsKCglkb2MgPSB4bWxQYXJzZUZpbGUoZG9jbmFtZSk7CgkKCWlmIChkb2MgPT0gTlVMTCApIHsKCQlmcHJpbnRmKHN0ZGVyciwmcXVvdDtEb2N1bWVudCBub3QgcGFyc2VkIHN1Y2Nlc3NmdWxseS4gXG4mcXVvdDspOwoJCXJldHVybjsKCX0KCQoJY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKCQoJaWYgKGN1ciA9PSBOVUxMKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7ZW1wdHkgZG9jdW1lbnRcbiZxdW90Oyk7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldHVybjsKCX0KCQoJaWYgKHhtbFN0cmNtcChjdXItJmd0O25hbWUsIChjb25zdCB4bWxDaGFyICopICZxdW90O3N0b3J5JnF1b3Q7KSkgewoJCWZwcmludGYoc3RkZXJyLCZxdW90O2RvY3VtZW50IG9mIHRoZSB3cm9uZyB0eXBlLCByb290IG5vZGUgIT0gc3RvcnkmcXVvdDspOwoJCXhtbEZyZWVEb2MoZG9jKTsKCQlyZXR1cm47Cgl9CgkKCWdldFJlZmVyZW5jZSAoZG9jLCBjdXIpOwoJeG1sRnJlZURvYyhkb2MpOwoJcmV0dXJuOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCgljaGFyICpkb2NuYW1lOwoKCWlmIChhcmdjICZsdDs9IDEpIHsKCQlwcmludGYoJnF1b3Q7VXNhZ2U6ICVzIGRvY25hbWVcbiZxdW90OywgYXJndlswXSk7CgkJcmV0dXJuKDApOwoJfQoKCWRvY25hbWUgPSBhcmd2WzFdOwoJcGFyc2VEb2MgKGRvY25hbWUpOwoJCglyZXR1cm4gKDEpOwp9Cgo8L3ByZT4KICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJuYXZmb290ZXIiPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0Ij48YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImFwZC5odG1sIj5QcmV2PC9hPqA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9InUiIGhyZWY9ImluZGV4Lmh0bWwiPlVwPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXBmLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5ELiBDb2RlIGZvciBBZGQgQXR0cmlidXRlIEV4YW1wbGWgPC90ZD48dGQgd2lkdGg9IjIwJSIgYWxpZ249ImNlbnRlciI+PGEgYWNjZXNza2V5PSJoIiBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiPqBGLiBDb2RlIGZvciBFbmNvZGluZyBDb252ZXJzaW9uIEV4YW1wbGU8L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2JvZHk+PC9odG1sPgo=