LyoKCXRveSB2bQoJcmVnaXN0ZXIgQSwgQiA6IDMyYml0CglQQyA6IHByb2dyYW0gY291bnRlcgoKCW1lbV8gIDRieXRlIHggNjU1MzYKCgmkuaTZpMakzsy/zuGkzzRieXRluMfE6goJwqjDzaTPwbSkxjE2Yml0CgoJUiA9IEEgb3IgQgoJdmxkaVIsIGltbSAgOyBSID0gaW1tCgl2bGRSLCBpZHggICA7IFIgPSBtZW1fW2lkeF0KCXZzdFIsIGlkeCAgIDsgbWVtX1tpZHhdID0gUgoJdmFkZGlSLCBpbW0gOyBSICs9IGltbQoJdnN1YmlSLCBpbW0gOyBSIC09IGltbQoJdmFkZFIsIGlkeCAgOyBSICs9IG1lbV9baWR4XQoJdnN1YlIsIGlkeCAgOyBSIC09IG1lbV9baWR4XQoJdnB1dFIgICAgICAgOyBwcmludCBSCgl2am56Uiwgb2Zmc2V0OyBpZiAoUiAhPSAwKSB0aGVuIGptcChQQyArPSBvZmZzZXQoc2lnbmVkKSkKKi8KI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8PSAxMjAwKQoJI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDUxNCkKCSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3ODYpCiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlICJ4Ynlhay94Ynlhay5oIgojaW5jbHVkZSAieGJ5YWsveGJ5YWtfdXRpbC5oIgojZGVmaW5lIE5VTV9PRl9BUlJBWSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKHhbMF0pKQoKdXNpbmcgbmFtZXNwYWNlIFhieWFrOwoKY2xhc3MgVG95Vm0gOiBwdWJsaWMgWGJ5YWs6OkNvZGVHZW5lcmF0b3IgewoJdHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50MzI+IEJ1ZmZlcjsKcHVibGljOgoJZW51bSBSZWcgewoJCUEsIEIKCX07CgllbnVtIENvZGUgewoJCUxELCBMREksIFNULCBBREQsIEFEREksIFNVQiwgU1VCSSwgUFVULCBKTlosCgkJRU5EX09GX0NPREUKCX07CglUb3lWbSgpCgkJIDogbWFya18oMCkKCXsKCQk6Om1lbXNldChtZW1fLCAwLCBzaXplb2YobWVtXykpOwoJfQoJdm9pZCB2bGRpKFJlZyByLCB1aW50MTYgaW1tKSB7IGVuY29kZShMREksIHIsIGltbSk7IH0KCXZvaWQgdmxkKFJlZyByLCB1aW50MTYgaWR4KSB7IGVuY29kZShMRCwgciwgaWR4KTsgfQoJdm9pZCB2c3QoUmVnIHIsIHVpbnQxNiBpZHgpIHsgZW5jb2RlKFNULCByLCBpZHgpOyB9Cgl2b2lkIHZhZGQoUmVnIHIsIHVpbnQxNiBpZHgpIHsgZW5jb2RlKEFERCwgciwgaWR4KTsgfQoJdm9pZCB2YWRkaShSZWcgciwgdWludDE2IGltbSkgeyBlbmNvZGUoQURESSwgciwgaW1tKTsgfQoJdm9pZCB2c3ViKFJlZyByLCB1aW50MTYgaWR4KSB7IGVuY29kZShTVUIsIHIsIGlkeCk7IH0KCXZvaWQgdnN1YmkoUmVnIHIsIHVpbnQxNiBpbW0pIHsgZW5jb2RlKFNVQkksIHIsIGltbSk7IH0KCXZvaWQgdmpueihSZWcgciwgaW50IG9mZnNldCkgeyBlbmNvZGUoSk5aLCByLCBzdGF0aWNfY2FzdDx1aW50MTY+KG9mZnNldCkpOyB9Cgl2b2lkIHZwdXQoUmVnIHIpIHsgZW5jb2RlKFBVVCwgcik7IH0KCXZvaWQgc2V0TWFyaygpCgl7CgkJbWFya18gPSAoaW50KWNvZGVfLnNpemUoKTsKCX0KCWludCBnZXRNYXJrT2Zmc2V0KCkKCXsKCQlyZXR1cm4gbWFya18gLSAoaW50KWNvZGVfLnNpemUoKSAtIDE7Cgl9Cgl2b2lkIHJ1bigpCgl7CgkJYm9vbCBkZWJ1ZyA9IGZhbHNlOy8vdHJ1ZTsKCQl1aW50MzIgcmVnWzJdID0geyAwLCAwIH07CgkJY29uc3Qgc2l6ZV90IGVuZCA9IGNvZGVfLnNpemUoKTsKCQl1aW50MzIgcGMgPSAwOwoJCWZvciAoOzspIHsKCQkJdWludDMyIHggPSBjb2RlX1twY107CgkJCXVpbnQzMiBjb2RlLCByLCBpbW07CgkJCWRlY29kZShjb2RlLCByLCBpbW0sIHgpOwoJCQlpZiAoZGVidWcpIHsKCQkJCXByaW50ZigiLS0tXG4iKTsKCQkJCXByaW50ZigiQSAlMDh4IEIgJTA4eFxuIiwgcmVnWzBdLCByZWdbMV0pOwoJCQkJcHJpbnRmKCJtZW1fW10gPSAlMDh4ICUwOHggJTA4eFxuIiwgbWVtX1swXSwgbWVtX1sxXSwgbWVtX1syXSk7CgkJCQlwcmludGYoInBjPSU0ZCwgY29kZT0lMDJ4LCByPSVkLCBpbW09JTA0eFxuIiwgcGMsIGNvZGUsIHIsIGltbSk7CgkJCX0KCQkJc3dpdGNoIChjb2RlKSB7CgkJCWNhc2UgTERJOgoJCQkJcmVnW3JdID0gaW1tOwoJCQkJYnJlYWs7CgkJCWNhc2UgTEQ6CgkJCQlyZWdbcl0gPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBTVDoKCQkJCW1lbV9baW1tXSA9IHJlZ1tyXTsKCQkJCWJyZWFrOwoJCQljYXNlIEFERDoKCQkJCXJlZ1tyXSArPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBBRERJOgoJCQkJcmVnW3JdICs9IGltbTsKCQkJCWJyZWFrOwoJCQljYXNlIFNVQjoKCQkJCXJlZ1tyXSAtPSBtZW1fW2ltbV07CgkJCQlicmVhazsKCQkJY2FzZSBTVUJJOgoJCQkJcmVnW3JdIC09IGltbTsKCQkJCWJyZWFrOwoJCQljYXNlIFBVVDoKCQkJCXByaW50ZigiJWMgJThkKDB4JTA4eClcbiIsICdBJyArIHIsIHJlZ1tyXSwgcmVnW3JdKTsKCQkJCWJyZWFrOwoJCQljYXNlIEpOWjoKCQkJCWlmIChyZWdbcl0gIT0gMCkgcGMgKz0gc3RhdGljX2Nhc3Q8c2lnbmVkIHNob3J0PihpbW0pOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlhc3NlcnQoMCk7CgkJCQlicmVhazsKCQkJfQoJCQlwYysrOwoJCQlpZiAocGMgPj0gZW5kKSBicmVhazsKCQl9IC8vIGZvciAoOzspCgl9Cgl2b2lkIHJlY29tcGlsZSgpCgl7CgkJdXNpbmcgbmFtZXNwYWNlIFhieWFrOwoJCS8qCgkJCWVzaSA6IEEKCQkJZWRpIDogQgoJCQllYnggOiBtZW1fCgkJCWZvciBzcGVlZCB1cAoJCQltZW1fWzBdIDogZWF4CgkJCW1lbV9bMV0gOiBlY3gKCQkJbWVtX1syXSA6IGVkeAoJCSovCgkJcHVzaChlYngpOwoJCXB1c2goZXNpKTsKCQlwdXNoKGVkaSk7CgoJCWNvbnN0IFJlZzMyIHJlZ1syXSA9IHsgZXNpLCBlZGkgfTsKCQljb25zdCBSZWczMiBtZW0oZWJ4KTsKCgkJY29uc3QgUmVnMzIgbWVtVGJsW10gPSB7IGVheCwgZWN4LCBlZHggfTsKCQljb25zdCBzaXplX3QgbWVtVGJsTnVtID0gTlVNX09GX0FSUkFZKG1lbVRibCk7CgkJZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZW1UYmxOdW07IGkrKykgeG9yKG1lbVRibFtpXSwgbWVtVGJsW2ldKTsKCgkJeG9yKGVzaSwgZXNpKTsKCQl4b3IoZWRpLCBlZGkpOwoJCW1vdihtZW0sIChzaXplX3QpbWVtXyk7CgkJY29uc3Qgc2l6ZV90IGVuZCA9IGNvZGVfLnNpemUoKTsKCQl1aW50MzIgcGMgPSAwOwoJCXVpbnQzMiBsYWJlbE51bSA9IDA7CgkJZm9yICg7OykgewoJCQl1aW50MzIgeCA9IGNvZGVfW3BjXTsKCQkJdWludDMyIGNvZGUsIHIsIGltbTsKCQkJZGVjb2RlKGNvZGUsIHIsIGltbSwgeCk7CgkJTChMYWJlbDo6dG9TdHIobGFiZWxOdW0rKykuY19zdHIoKSk7CgkJCXN3aXRjaCAoY29kZSkgewoJCQljYXNlIExESToKCQkJCW1vdihyZWdbcl0sIGltbSk7CgkJCQlicmVhazsKCQkJY2FzZSBMRDoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQltb3YocmVnW3JdLCBtZW1UYmxbaW1tXSk7CgkJCQl9IGVsc2UgewoJCQkJCW1vdihyZWdbcl0sIHB0clttZW0gKyBpbW0gKiA0XSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBTVDoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQltb3YobWVtVGJsW2ltbV0sIHJlZ1tyXSk7CgkJCQl9IGVsc2UgewoJCQkJCW1vdihwdHIgW21lbSArIGltbSAqIDRdLCByZWdbcl0pOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgQUREOgoJCQkJaWYgKGltbSA8IG1lbVRibE51bSkgewoJCQkJCWFkZChyZWdbcl0sIG1lbVRibFtpbW1dKTsKCQkJCX0gZWxzZSB7CgkJCQkJYWRkKHJlZ1tyXSwgcHRyIFttZW0gKyBpbW0gKiA0XSk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBBRERJOgoJCQkJYWRkKHJlZ1tyXSwgaW1tKTsKCQkJCWJyZWFrOwoJCQljYXNlIFNVQjoKCQkJCWlmIChpbW0gPCBtZW1UYmxOdW0pIHsKCQkJCQlzdWIocmVnW3JdLCBtZW1UYmxbaW1tXSk7CgkJCQl9IGVsc2UgewoJCQkJCXN1YihyZWdbcl0sIHB0ciBbbWVtICsgaW1tICogNF0pOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgU1VCSToKCQkJCXN1YihyZWdbcl0sIGltbSk7CgkJCQlicmVhazsKCQkJY2FzZSBQVVQ6CgkJCQl7CgkJCQkJc3RhdGljIGNvbnN0IGNoYXIgKnN0ciA9ICIlYyAlOGQoMHglMDh4KVxuIjsKCQkJCQlwdXNoKGVheCk7CgkJCQkJcHVzaChlZHgpOwoJCQkJCXB1c2goZWN4KTsKCQkJCQlwdXNoKHJlZ1tyXSk7CgkJCQkJcHVzaChyZWdbcl0pOwoJCQkJCXB1c2goJ0EnICsgcik7CgkJCQkJcHVzaCgoaW50KXN0cik7CgkJCQkJY2FsbCgodm9pZCopcHJpbnRmKTsKCQkJCQlhZGQoZXNwLCA0ICogNCk7CgkJCQkJcG9wKGVjeCk7CgkJCQkJcG9wKGVkeCk7CgkJCQkJcG9wKGVheCk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBKTlo6CgkJCQl0ZXN0KHJlZ1tyXSwgcmVnW3JdKTsKCQkJCWpueihMYWJlbDo6dG9TdHIobGFiZWxOdW0gKyBzdGF0aWNfY2FzdDxzaWduZWQgc2hvcnQ+KGltbSkpLmNfc3RyKCkpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlhc3NlcnQoMCk7CgkJCQlicmVhazsKCQkJfQoJCQlwYysrOwoJCQlpZiAocGMgPj0gZW5kKSBicmVhazsKCQl9IC8vIGZvciAoOzspCgoJCXBvcChlZGkpOwoJCXBvcChlc2kpOwoJCXBvcChlYngpOwoJCXJldCgpOwoJfQpwcml2YXRlOgoJdWludDMyIG1lbV9bNjU1MzZdOwoJQnVmZmVyIGNvZGVfOwoJaW50IG1hcmtfOwoJdm9pZCBkZWNvZGUodWludDMyJiBjb2RlLCB1aW50MzImIHIsIHVpbnQzMiYgaW1tLCB1aW50MzIgeCkKCXsKCQljb2RlID0geCA+PiAyNDsKCQlyID0gKHggPj4gMTYpICYgMHhmZjsKCQlpbW0gPSB4ICYgMHhmZmZmOwoJfQoJdm9pZCBlbmNvZGUoQ29kZSBjb2RlLCBSZWcgciwgdWludDE2IGltbSA9IDApCgl7CgkJdWludDMyIHggPSAoY29kZSA8PCAyNCkgfCAociA8PCAxNikgfCBpbW07CgkJY29kZV8ucHVzaF9iYWNrKHgpOwoJfQp9OwoKY2xhc3MgRmliIDogcHVibGljIFRveVZtIHsKcHVibGljOgoJRmliKGludCBuKQoJewoJCWlmIChuID49IDY1NTM2KSB7CgkJCWZwcmludGYoc3RkZXJyLCAiY3VycmVudCB2ZXJzaW9uIHN1cHBvcnQgb25seSBpbW0xNlxuIik7CgkJCXJldHVybjsKCQl9CgkJLyoKCQkJQSA6IGMKCQkJQiA6IHRlbXBvcmFyeQoJCQltZW1fWzBdIDogcAoJCQltZW1fWzFdIDogdAoJCQltZW1fWzJdIDogbgoJCSovCgkJdmxkaShBLCAxKTsgLy8gYwoJCXZzdChBLCAwKTsgLy8gcCgxKQoJCXZsZGkoQiwgc3RhdGljX2Nhc3Q8dWludDE2PihuKSk7CgkJdnN0KEIsIDIpOyAvLyBuCgkJLy8gbHAKCXNldE1hcmsoKTsKCQl2c3QoQSwgMSk7IC8vIHQgPSBjCgkJdmFkZChBLCAwKTsgLy8gYyArPSBwCgkJdmxkKEIsIDEpOwoJCXZzdChCLCAwKTsgLy8gcCA9IHQKLy8JCXZwdXQoQSk7CgkJdmxkKEIsIDIpOwoJCXZzdWJpKEIsIDEpOwoJCXZzdChCLCAyKTsgLy8gbi0tCgkJdmpueihCLCBnZXRNYXJrT2Zmc2V0KCkpOwoJCXZwdXQoQSk7Cgl9Cgl2b2lkIHJ1bkJ5SklUKCkKCXsKCQkoKHZvaWQgKCopKCkpKGNvbnN0IHZvaWQqKWdldENvZGUoKSkoKTsKCX0KfTsKCnZvaWQgZmliQyh1aW50MzIgbikKewoJdWludDMyIHAsIGMsIHQ7CglwID0gMTsKCWMgPSAxOwpscDoKCXQgPSBjOwoJYyArPSBwOwoJcCA9IHQ7CgluLS07CglpZiAobiAhPSAwKSBnb3RvIGxwOwoJcHJpbnRmKCJjPSVkKDB4JTA4eClcbiIsIGMsIGMpOwp9CgppbnQgbWFpbigpCnsKCXRyeSB7CgkJY29uc3QgaW50IG4gPSAxMDAwMDsKCQlGaWIgZmliKG4pOwoKCQlmaWIucmVjb21waWxlKCk7CgoJCXsKCQkJWGJ5YWs6OnV0aWw6OkNsb2NrIGNsazsKCQkJY2xrLmJlZ2luKCk7CgkJCWZpYi5ydW4oKTsKCQkJY2xrLmVuZCgpOwoJCQlwcmludGYoInZtICAgICAgICUuMmZLY2xrXG4iLCBjbGsuZ2V0Q2xvY2soKSAqIDFlLTMpOwoJCX0KCgkJewoJCQlYYnlhazo6dXRpbDo6Q2xvY2sgY2xrOwoJCQljbGsuYmVnaW4oKTsKCQkJZmliLnJ1bkJ5SklUKCk7CgkJCWNsay5lbmQoKTsKCQkJcHJpbnRmKCJqaXQgICAgICAlLjJmS2Nsa1xuIiwgY2xrLmdldENsb2NrKCkgKiAxZS0zKTsKCQl9CgoJCXsKCQkJWGJ5YWs6OnV0aWw6OkNsb2NrIGNsazsKCQkJY2xrLmJlZ2luKCk7CgkJCWZpYkMobik7CgkJCWNsay5lbmQoKTsKCQkJcHJpbnRmKCJuYXRpdmUgQyAlLjJmS2Nsa1xuIiwgY2xrLmdldENsb2NrKCkgKiAxZS0zKTsKCQl9Cgl9IGNhdGNoIChYYnlhazo6RXJyb3IgZXJyKSB7CgkJcHJpbnRmKCJFUlI6JXMoJWQpXG4iLCBYYnlhazo6Q29udmVydEVycm9yVG9TdHJpbmcoZXJyKSwgZXJyKTsKCX0gY2F0Y2ggKC4uLikgewoJCXByaW50ZigidW5rbm93biBlcnJvclxuIik7Cgl9CglyZXR1cm4gMDsKfQoKLyoKCXRoZSBjb2RlIGdlbmVyYXRlZCBieSBYYnlhawogICBwdXNoICAgICAgICBlYngKICAgcHVzaCAgICAgICAgZXNpCiAgIHB1c2ggICAgICAgIGVkaQogICB4b3IgICAgICAgICBlYXgsZWF4CiAgIHhvciAgICAgICAgIGVjeCxlY3gKICAgeG9yICAgICAgICAgZWR4LGVkeAogICB4b3IgICAgICAgICBlc2ksZXNpCiAgIHhvciAgICAgICAgIGVkaSxlZGkKICAgbW92ICAgICAgICAgZWJ4LDBFRkY1OGgKICAgbW92ICAgICAgICAgZXNpLDEKICAgbW92ICAgICAgICAgZWF4LGVzaQogICBtb3YgICAgICAgICBlZGksMjcxMGgKICAgbW92ICAgICAgICAgZWR4LGVkaQoubHA6CiAgIG1vdiAgICAgICAgIGVjeCxlc2kKICAgYWRkICAgICAgICAgZXNpLGVheAogICBtb3YgICAgICAgICBlZGksZWN4CiAgIG1vdiAgICAgICAgIGVheCxlZGkKICAgbW92ICAgICAgICAgZWRpLGVkeAogICBzdWIgICAgICAgICBlZGksMQogICBtb3YgICAgICAgICBlZHgsZWRpCiAgIHRlc3QgICAgICAgIGVkaSxlZGkKICAgam5lICAgICAgICAgLmxwCiAgIHB1c2ggICAgICAgIGVheAogICBwdXNoICAgICAgICBlZHgKICAgcHVzaCAgICAgICAgZWN4CiAgIHB1c2ggICAgICAgIGVzaQogICBwdXNoICAgICAgICBlc2kKICAgcHVzaCAgICAgICAgNDFoCiAgIHB1c2ggICAgICAgIDQyQzQzNGgKICAgY2FsbCAgICAgICAgcHJpbnRmICg0MDkzNDJoKQogICBhZGQgICAgICAgICBlc3AsMTBoCiAgIHBvcCAgICAgICAgIGVjeAogICBwb3AgICAgICAgICBlZHgKICAgcG9wICAgICAgICAgZWF4CiAgIHBvcCAgICAgICAgIGVkaQogICBwb3AgICAgICAgICBlc2kKICAgcG9wICAgICAgICAgZWJ4CiAgIHJldAoqLwo=