LyogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRyaXN0aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KCiAgIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgUlRqcGVnIDAuMS4yLCAoQykgSnVzdGluIFNjaG9lbWFuIDE5OTgKCiAgICg5OTExMDEpIFdpbSBUYXltYW5zIDogYWRkZWQgTU1YIGRjdCBhbmQgaWRjdCBmcm9tIGludGVscyBzaXRlLgoqLwoKCi8qCgpNYWluIFJvdXRpbmVzCgpUaGlzIGZpbGUgY29udGFpbnMgbW9zdCBvZiB0aGUgaW5pdGlhbGlzYXRpb24gYW5kIGNvbnRyb2wgZnVuY3Rpb25zCgooQykgSnVzdGluIFNjaG9lbWFuIDE5OTgKCiovCgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7CnR5cGVkZWYgc2lnbmVkIGNoYXIgX19zODsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKdHlwZWRlZiBzaWduZWQgc2hvcnQgX19zMTY7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3UzMjsKdHlwZWRlZiBzaWduZWQgbG9uZyBfX3MzMjsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CgovKiNkZWZpbmUgTU1YX1RSQUNFICovCgoKI2lmZGVmIEhBVkVfTElCTU1YCiNpbmNsdWRlICJtbXguaCIKI2VuZGlmCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSVGpwZWdfWlpbNjRdPXsKMCwKOCwgMSwKMiwgOSwgMTYsCjI0LCAxNywgMTAsIDMsCjQsIDExLCAxOCwgMjUsIDMyLAo0MCwgMzMsIDI2LCAxOSwgMTIsIDUsCjYsIDEzLCAyMCwgMjcsIDM0LCA0MSwgNDgsCjU2LCA0OSwgNDIsIDM1LCAyOCwgMjEsIDE0LCA3LAoxNSwgMjIsIDI5LCAzNiwgNDMsIDUwLCA1NywKNTgsIDUxLCA0NCwgMzcsIDMwLCAyMywKMzEsIDM4LCA0NSwgNTIsIDU5LAo2MCwgNTMsIDQ2LCAzOSwKNDcsIDU0LCA2MSwKNjIsIDU1LAo2MyB9OwoKc3RhdGljIGNvbnN0IF9fdTY0IFJUanBlZ19hYW5fdGFiWzY0XT17CjQyOTQ5NjcyOTZVTEwsIDU5NTcyMjI5MTJVTEwsIDU2MTE3MTgxNDRVTEwsIDUwNTA0NjQ3NjhVTEwsIDQyOTQ5NjcyOTZVTEwsIDMzNzQ1ODE1MDRVTEwsIDIzMjQ0MzIxMjhVTEwsIDExODQ4OTEyNjRVTEwsIAo1OTU3MjIyOTEyVUxMLCA4MjYzMDQwNTEyVUxMLCA3NzgzNTgwMTYwVUxMLCA3MDA1MDA5OTIwVUxMLCA1OTU3MjIyOTEyVUxMLCA0NjgwNTgyMTQ0VUxMLCAzMjI0MTA3NTIwVUxMLCAxNjQzNjQxMDg4VUxMLCAKNTYxMTcxODE0NFVMTCwgNzc4MzU4MDE2MFVMTCwgNzMzMTkwNDUxMlVMTCwgNjU5ODY4ODc2OFVMTCwgNTYxMTcxODE0NFVMTCwgNDQwODk5ODkxMlVMTCwgMzAzNjkzNjk2MFVMTCwgMTU0ODIyNDAwMFVMTCwgCjUwNTA0NjQ3NjhVTEwsIDcwMDUwMDk5MjBVTEwsIDY1OTg2ODg3NjhVTEwsIDU5Mzg2MDgxMjhVTEwsIDUwNTA0NjQ3NjhVTEwsIDM5NjgwNzI5NjBVTEwsIDI3MzMxMTUzOTJVTEwsIDEzOTMyOTYwMDBVTEwsIAo0Mjk0OTY3Mjk2VUxMLCA1OTU3MjIyOTEyVUxMLCA1NjExNzE4MTQ0VUxMLCA1MDUwNDY0NzY4VUxMLCA0Mjk0OTY3Mjk2VUxMLCAzMzc0NTgxNTA0VUxMLCAyMzI0NDMyMTI4VUxMLCAxMTg0ODkxMjY0VUxMLCAKMzM3NDU4MTUwNFVMTCwgNDY4MDU4MjE0NFVMTCwgNDQwODk5ODkxMlVMTCwgMzk2ODA3Mjk2MFVMTCwgMzM3NDU4MTUwNFVMTCwgMjY1MTMyNjIwOFVMTCwgMTgyNjM1NzUwNFVMTCwgOTMxMTM2MDAwVUxMLCAKMjMyNDQzMjEyOFVMTCwgMzIyNDEwNzUyMFVMTCwgMzAzNjkzNjk2MFVMTCwgMjczMzExNTM5MlVMTCwgMjMyNDQzMjEyOFVMTCwgMTgyNjM1NzUwNFVMTCwgMTI1ODAzMDMzNlVMTCwgNjQxMjA0Mjg4VUxMLCAKMTE4NDg5MTI2NFVMTCwgMTY0MzY0MTA4OFVMTCwgMTU0ODIyNDAwMFVMTCwgMTM5MzI5NjAwMFVMTCwgMTE4NDg5MTI2NFVMTCwgOTMxMTM2MDAwVUxMLCA2NDEyMDQyODhVTEwsIDMyNjg5NDI0MFVMTCwgCn07CgojaWZuZGVmIEhBVkVfTElCTU1YCnN0YXRpYyBfX3MzMiBSVGpwZWdfd3NbNjQrMzFdOwojZW5kaWYKX191OCBSVGpwZWdfYWxsZGF0YVsyKjY0KzQqNjQrNCo2NCs0KjY0KzQqNjQrMzJdOwoKX19zMTYgKlJUanBlZ19ibG9jazsKX19zMzIgKlJUanBlZ19scXQ7Cl9fczMyICpSVGpwZWdfY3F0OwpfX3UzMiAqUlRqcGVnX2xpcXQ7Cl9fdTMyICpSVGpwZWdfY2lxdDsKCnVuc2lnbmVkIGNoYXIgUlRqcGVnX2xiODsKdW5zaWduZWQgY2hhciBSVGpwZWdfY2I4OwppbnQgUlRqcGVnX3dpZHRoLCBSVGpwZWdfaGVpZ2h0OwppbnQgUlRqcGVnX1l3aWR0aCwgUlRqcGVnX0N3aWR0aDsKaW50IFJUanBlZ19Zc2l6ZSwgUlRqcGVnX0NzaXplOwoKX19zMTYgKlJUanBlZ19vbGQ9TlVMTDsKCiNpZmRlZiBIQVZFX0xJQk1NWAptbXhfdCBSVGpwZWdfbG1hc2s7Cm1teF90IFJUanBlZ19jbWFzazsKI2Vsc2UKX191MTYgUlRqcGVnX2xtYXNrOwpfX3UxNiBSVGpwZWdfY21hc2s7CiNlbmRpZgppbnQgUlRqcGVnX210ZXN0PTA7CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSVGpwZWdfbHVtX3F1YW50X3RibFs2NF0gPSB7CiAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAogICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKICAgIDE0LCAgMTMsICAxNiwgIDI0LCAgNDAsICA1NywgIDY5LCAgNTYsCiAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAogICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKICAgIDI0LCAgMzUsICA1NSwgIDY0LCAgODEsIDEwNCwgMTEzLCAgOTIsCiAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAogICAgNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQogfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJUanBlZ19jaHJvbV9xdWFudF90YmxbNjRdID0gewogICAgMTcsICAxOCwgIDI0LCAgNDcsICA5OSwgIDk5LCAgOTksICA5OSwKICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCiAgICAyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAogICAgNDcsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCiAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAogICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKIH07CiAKaW50IFJUanBlZ19iMnMoX19zMTYgKmRhdGEsIF9fczggKnN0cm0sIF9fdTggYnQ4KQp7CiByZWdpc3RlciBpbnQgY2ksIGNvPTEsIHRtcDsKIHJlZ2lzdGVyIF9fczE2IFpadmFsdWU7CgogKF9fdTgpc3RybVswXT0oX191OCkoZGF0YVtSVGpwZWdfWlpbMF1dPjI1NCkgPyAyNTQ6KChkYXRhW1JUanBlZ19aWlswXV08MCk/MDpkYXRhW1JUanBlZ19aWlswXV0pOwogCiBmb3IoY2k9MTsgY2k8PWJ0ODsgY2krKykgCiB7CglaWnZhbHVlID0gZGF0YVtSVGpwZWdfWlpbY2ldXTsKCiAgIGlmKFpadmFsdWU+MCkgCgl7CiAgICAgc3RybVtjbysrXT0oX19zOCkoWlp2YWx1ZT4xMjcpPzEyNzpaWnZhbHVlOwogICB9IAoJZWxzZSAKCXsKICAgICBzdHJtW2NvKytdPShfX3M4KShaWnZhbHVlPC0xMjgpPy0xMjg6Wlp2YWx1ZTsKICAgfQogfQoKIGZvcig7IGNpPDY0OyBjaSsrKSAKIHsKICBaWnZhbHVlID0gZGF0YVtSVGpwZWdfWlpbY2ldXTsKCiAgaWYoWlp2YWx1ZT4wKQogIHsKICAgc3RybVtjbysrXT0oX19zOCkoWlp2YWx1ZT42Myk/NjM6Wlp2YWx1ZTsKICB9IAogIGVsc2UgaWYoWlp2YWx1ZTwwKQogIHsKICAgc3RybVtjbysrXT0oX19zOCkoWlp2YWx1ZTwtNjQpPy02NDpaWnZhbHVlOwogIH0gCiAgZWxzZSAvKiBjb21wcmVzcyB6ZXJvcyAqLwogIHsKICAgdG1wPWNpOwogICBkbwogICB7CiAgICBjaSsrOwogICB9IAoJd2hpbGUoKGNpPDY0KSYmKGRhdGFbUlRqcGVnX1paW2NpXV09PTApKTsKCiAgIHN0cm1bY28rK109KF9fczgpKDYzKyhjaS10bXApKTsKICAgY2ktLTsKICB9CiB9CiByZXR1cm4gKGludCljbzsKfQoKaW50IFJUanBlZ19zMmIoX19zMTYgKmRhdGEsIF9fczggKnN0cm0sIF9fdTggYnQ4LCBfX3UzMiAqcXRibCkKewogaW50IGNpPTEsIGNvPTEsIHRtcDsKIHJlZ2lzdGVyIGludCBpOwoKIGk9UlRqcGVnX1paWzBdOwogZGF0YVtpXT0oKF9fdTgpc3RybVswXSkqcXRibFtpXTsKCiBmb3IoY289MTsgY288PWJ0ODsgY28rKykKIHsKICBpPVJUanBlZ19aWltjb107CiAgZGF0YVtpXT1zdHJtW2NpKytdKnF0YmxbaV07CiB9CiAKIGZvcig7IGNvPDY0OyBjbysrKQogewogIGlmKHN0cm1bY2ldPjYzKQogIHsKICAgdG1wPWNvK3N0cm1bY2ldLTYzOwogICBmb3IoOyBjbzx0bXA7IGNvKyspZGF0YVtSVGpwZWdfWlpbY29dXT0wOwogICBjby0tOwogIH0gZWxzZQogIHsKICAgaT1SVGpwZWdfWlpbY29dOwogICBkYXRhW2ldPXN0cm1bY2ldKnF0YmxbaV07CiAgfQogIGNpKys7CiB9CiByZXR1cm4gKGludCljaTsKfQoKI2lmIGRlZmluZWQoSEFWRV9MSUJNTVgpCnZvaWQgUlRqcGVnX3F1YW50X2luaXQodm9pZCkKewogaW50IGk7CiBfX3MxNiAqcXRibDsKIAogcXRibD0oX19zMTYgKilSVGpwZWdfbHF0OwogZm9yKGk9MDsgaTw2NDsgaSsrKXF0YmxbaV09KF9fczE2KVJUanBlZ19scXRbaV07CgogcXRibD0oX19zMTYgKilSVGpwZWdfY3F0OwogZm9yKGk9MDsgaTw2NDsgaSsrKXF0YmxbaV09KF9fczE2KVJUanBlZ19jcXRbaV07Cn0KCnN0YXRpYyBtbXhfdCBSVGpwZWdfb25lcz0obW14X3QpKGxvbmcgbG9uZykweDAwMDEwMDAxMDAwMTAwMDFMTDsKc3RhdGljIG1teF90IFJUanBlZ19oYWxmPShtbXhfdCkobG9uZyBsb25nKTB4N2ZmZjdmZmY3ZmZmN2ZmZkxMOwoKdm9pZCBSVGpwZWdfcXVhbnQoX19zMTYgKmJsb2NrLCBfX3MzMiAqcXRibCkKewogaW50IGk7CiBtbXhfdCAqYmwsICpxbDsKIAogcWw9KG1teF90ICopcXRibDsKIGJsPShtbXhfdCAqKWJsb2NrOwogCiBtb3ZxX20ycihSVGpwZWdfb25lcywgbW02KTsKIG1vdnFfbTJyKFJUanBlZ19oYWxmLCBtbTcpOwoKIGZvcihpPTE2OyBpOyBpLS0pIAogewogIG1vdnFfbTJyKCoocWwrKyksIG1tMCk7IC8qIHF1YW50IHZhbHMgKDQpICovCiAgbW92cV9tMnIoKmJsLCBtbTIpOyAvKiBibG9jayB2YWxzICg0KSAqLwogIG1vdnFfcjJyKG1tMCwgbW0xKTsKICBtb3ZxX3IycihtbTIsIG1tMyk7CiAgCiAgcHVucGNrbHdkX3IycihtbTYsIG1tMCk7IC8qICAgICAgICAgICAxIHFiIDEgcWEgKi8KICBwdW5wY2tod2RfcjJyKG1tNiwgbW0xKTsgLyogMSBxZCAxIHFjICovCiAgCiAgcHVucGNrbHdkX3IycihtbTcsIG1tMik7IC8qICAgICAgICAgICAgICAgICAgIDMyNzY3IGJiIDMyNzY3IGJhICovCiAgcHVucGNraHdkX3IycihtbTcsIG1tMyk7IC8qIDMyNzY3IGJkIDMyNzY3IGJjICovCiAgCiAgcG1hZGR3ZF9yMnIobW0yLCBtbTApOyAvKiAgICAgICAgICAgICAgICAgICAgICAgICAzMjc2NytiYipxYiAzMjc2NytiYSpxYSAqLwogIHBtYWRkd2RfcjJyKG1tMywgbW0xKTsgLyogMzI3NjcrYmQqcWQgMzI3NjcrYmMqcWMgKi8KICAKICBwc3JhZF9pMnIoMTYsIG1tMCk7CiAgcHNyYWRfaTJyKDE2LCBtbTEpOwogIAogIHBhY2tzc2R3X3IycihtbTEsIG1tMCk7CiAgCiAgbW92cV9yMm0obW0wLCAqKGJsKyspKTsKICAKIH0KfQojZWxzZQp2b2lkIFJUanBlZ19xdWFudF9pbml0KHZvaWQpCnsKfQoKdm9pZCBSVGpwZWdfcXVhbnQoX19zMTYgKmJsb2NrLCBfX3MzMiAqcXRibCkKewogaW50IGk7CiAKIGZvcihpPTA7IGk8NjQ7IGkrKykKICAgYmxvY2tbaV09KF9fczE2KSgoYmxvY2tbaV0qcXRibFtpXSszMjc2Nyk+PjE2KTsKfQojZW5kaWYKCi8qCiAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgogKi8KI2lmZGVmIEhBVkVfTElCTU1YCnN0YXRpYyBtbXhfdCBSVGpwZWdfQzQgICA9KG1teF90KShsb25nIGxvbmcpMHgyRDQxMkQ0MTJENDEyRDQxTEw7CnN0YXRpYyBtbXhfdCBSVGpwZWdfQzYgICA9KG1teF90KShsb25nIGxvbmcpMHgxODdFMTg3RTE4N0UxODdFTEw7CnN0YXRpYyBtbXhfdCBSVGpwZWdfQzJtQzY9KG1teF90KShsb25nIGxvbmcpMHgyMkEzMjJBMzIyQTMyMkEzTEw7CnN0YXRpYyBtbXhfdCBSVGpwZWdfQzJwQzY9KG1teF90KShsb25nIGxvbmcpMHg1MzlGNTM5RjUzOUY1MzlGTEw7CnN0YXRpYyBtbXhfdCBSVGpwZWdfemVybyA9KG1teF90KShsb25nIGxvbmcpMHgwMDAwMDAwMDAwMDAwMDAwTEw7CgojZWxzZQoKI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoX19zMzIpICAgOTgpCQkvKiBGSVgoMC4zODI2ODM0MzMpICovCiNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKF9fczMyKSAgMTM5KQkJLyogRklYKDAuNTQxMTk2MTAwKSAqLwojZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgKChfX3MzMikgIDE4MSkJCS8qIEZJWCgwLjcwNzEwNjc4MSkgKi8KI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoX19zMzIpICAzMzQpCQkvKiBGSVgoMS4zMDY1NjI5NjUpICovCgojZGVmaW5lIERFU0NBTEUxMCh4KSAoX19zMTYpKCAoKHgpKzEyOCkgPj4gOCkKI2RlZmluZSBERVNDQUxFMjAoeCkgIChfX3MxNikoKCh4KSszMjc2OCkgPj4gMTYpCiNkZWZpbmUgRF9NVUxUSVBMWSh2YXIsY29uc3QpICAoKF9fczMyKSAoKHZhcikgKiAoY29uc3QpKSkKI2VuZGlmCgp2b2lkIFJUanBlZ19kY3RfaW5pdCh2b2lkKQp7CiBpbnQgaTsKIAogZm9yKGk9MDsgaTw2NDsgaSsrKQogewogIFJUanBlZ19scXRbaV09KCgoX191NjQpUlRqcGVnX2xxdFtpXTw8MzIpL1JUanBlZ19hYW5fdGFiW2ldKTsKICBSVGpwZWdfY3F0W2ldPSgoKF9fdTY0KVJUanBlZ19jcXRbaV08PDMyKS9SVGpwZWdfYWFuX3RhYltpXSk7CiB9Cn0KCnZvaWQgUlRqcGVnX2RjdFkoX191OCAqaWRhdGEsIF9fczE2ICpvZGF0YSwgaW50IHJza2lwKQp7CiNpZm5kZWYgSEFWRV9MSUJNTVgKICBfX3MzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwogIF9fczMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwogIF9fczMyIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7CiAgX191OCAqaWRhdGFwdHI7CiAgX19zMTYgKm9kYXRhcHRyOwogIF9fczMyICp3c3B0cjsKICBpbnQgY3RyOwoKICBpZGF0YXB0ciA9IGlkYXRhOwogIHdzcHRyID0gUlRqcGVnX3dzOwogIGZvciAoY3RyID0gNzsgY3RyID49IDA7IGN0ci0tKSB7CiAgICB0bXAwID0gaWRhdGFwdHJbMF0gKyBpZGF0YXB0cls3XTsKICAgIHRtcDcgPSBpZGF0YXB0clswXSAtIGlkYXRhcHRyWzddOwogICAgdG1wMSA9IGlkYXRhcHRyWzFdICsgaWRhdGFwdHJbNl07CiAgICB0bXA2ID0gaWRhdGFwdHJbMV0gLSBpZGF0YXB0cls2XTsKICAgIHRtcDIgPSBpZGF0YXB0clsyXSArIGlkYXRhcHRyWzVdOwogICAgdG1wNSA9IGlkYXRhcHRyWzJdIC0gaWRhdGFwdHJbNV07CiAgICB0bXAzID0gaWRhdGFwdHJbM10gKyBpZGF0YXB0cls0XTsKICAgIHRtcDQgPSBpZGF0YXB0clszXSAtIGlkYXRhcHRyWzRdOwogICAgCiAgICB0bXAxMCA9ICh0bXAwICsgdG1wMyk7CS8qIHBoYXNlIDIgKi8KICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CiAgICB0bXAxMSA9ICh0bXAxICsgdG1wMik7CiAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwogICAgCiAgICB3c3B0clswXSA9ICh0bXAxMCArIHRtcDExKTw8ODsgLyogcGhhc2UgMyAqLwogICAgd3NwdHJbNF0gPSAodG1wMTAgLSB0bXAxMSk8PDg7CiAgICAKICAgIHoxID0gRF9NVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwogICAgd3NwdHJbMl0gPSAodG1wMTM8PDgpICsgejE7CS8qIHBoYXNlIDUgKi8KICAgIHdzcHRyWzZdID0gKHRtcDEzPDw4KSAtIHoxOwogICAgCiAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCiAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OwogICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKCiAgICB6NSA9IERfTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KICAgIHoyID0gRF9NVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwogICAgejQgPSBEX01VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCiAgICB6MyA9IERfTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCgogICAgejExID0gKHRtcDc8PDgpICsgejM7CQkvKiBwaGFzZSA1ICovCiAgICB6MTMgPSAodG1wNzw8OCkgLSB6MzsKCiAgICB3c3B0cls1XSA9IHoxMyArIHoyOwkvKiBwaGFzZSA2ICovCiAgICB3c3B0clszXSA9IHoxMyAtIHoyOwogICAgd3NwdHJbMV0gPSB6MTEgKyB6NDsKICAgIHdzcHRyWzddID0gejExIC0gejQ7CgogICAgaWRhdGFwdHIgKz0gcnNraXA8PDM7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KICAgIHdzcHRyICs9IDg7CiAgfQoKICB3c3B0ciA9IFJUanBlZ193czsKICBvZGF0YXB0cj1vZGF0YTsKICBmb3IgKGN0ciA9IDc7IGN0ciA+PSAwOyBjdHItLSkgewogICAgdG1wMCA9IHdzcHRyWzBdICsgd3NwdHJbNTZdOwogICAgdG1wNyA9IHdzcHRyWzBdIC0gd3NwdHJbNTZdOwogICAgdG1wMSA9IHdzcHRyWzhdICsgd3NwdHJbNDhdOwogICAgdG1wNiA9IHdzcHRyWzhdIC0gd3NwdHJbNDhdOwogICAgdG1wMiA9IHdzcHRyWzE2XSArIHdzcHRyWzQwXTsKICAgIHRtcDUgPSB3c3B0clsxNl0gLSB3c3B0cls0MF07CiAgICB0bXAzID0gd3NwdHJbMjRdICsgd3NwdHJbMzJdOwogICAgdG1wNCA9IHdzcHRyWzI0XSAtIHdzcHRyWzMyXTsKICAgIAogICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLwogICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKICAgIHRtcDExID0gdG1wMSArIHRtcDI7CiAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwogICAgCiAgICBvZGF0YXB0clswXSA9IERFU0NBTEUxMCh0bXAxMCArIHRtcDExKTsgLyogcGhhc2UgMyAqLwogICAgb2RhdGFwdHJbMzJdID0gREVTQ0FMRTEwKHRtcDEwIC0gdG1wMTEpOwogICAgCiAgICB6MSA9IERfTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KICAgIG9kYXRhcHRyWzE2XSA9IERFU0NBTEUyMCgodG1wMTM8PDgpICsgejEpOyAvKiBwaGFzZSA1ICovCiAgICBvZGF0YXB0cls0OF0gPSBERVNDQUxFMjAoKHRtcDEzPDw4KSAtIHoxKTsKCiAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCiAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OwogICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKCiAgICB6NSA9IERfTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KICAgIHoyID0gRF9NVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwogICAgejQgPSBEX01VTFRJUExZKHRtcDEyLCBGSVhfMV8zMDY1NjI5NjUpICsgejU7IC8qIGMyK2M2ICovCiAgICB6MyA9IERfTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCgogICAgejExID0gKHRtcDc8PDgpICsgejM7CQkvKiBwaGFzZSA1ICovCiAgICB6MTMgPSAodG1wNzw8OCkgLSB6MzsKCiAgICBvZGF0YXB0cls0MF0gPSBERVNDQUxFMjAoejEzICsgejIpOyAvKiBwaGFzZSA2ICovCiAgICBvZGF0YXB0clsyNF0gPSBERVNDQUxFMjAoejEzIC0gejIpOwogICAgb2RhdGFwdHJbOF0gPSBERVNDQUxFMjAoejExICsgejQpOwogICAgb2RhdGFwdHJbNTZdID0gREVTQ0FMRTIwKHoxMSAtIHo0KTsKCiAgICBvZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLwogICAgd3NwdHIrKzsKICB9CiNlbHNlCiAgbW14X3QgdG1wNiwgdG1wNzsKICByZWdpc3RlciBtbXhfdCAqZGF0YXB0ciA9IChtbXhfdCAqKW9kYXRhOwogIG1teF90ICppZGF0YTIgPSAobW14X3QgKilpZGF0YTsKCiAgIC8qIGZpcnN0IGNvcHkgdGhlIGlucHV0IDggYml0IHRvIHRoZSBkZXN0aW5hdGlvbiAxNiBiaXRzICovCgogICBtb3ZxX20ycihSVGpwZWdfemVybywgbW0yKTsKCgoJbW92cV9tMnIoKmlkYXRhMiwgbW0wKTsJCSAKCW1vdnFfcjJyKG1tMCwgbW0xKTsJCSAJCQkKCglwdW5wY2tsYndfcjJyKG1tMiwgbW0wKTsKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKSk7CgoJcHVucGNraGJ3X3IycihtbTIsIG1tMSk7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cisxKSk7CgkKCWlkYXRhMiArPSByc2tpcDsKCgltb3ZxX20ycigqaWRhdGEyLCBtbTApOwkJIAoJbW92cV9yMnIobW0wLCBtbTEpOwkJIAkJCQoKCXB1bnBja2xid19yMnIobW0yLCBtbTApOwoJbW92cV9yMm0obW0wLCAqKGRhdGFwdHIrMikpOwoKCXB1bnBja2hid19yMnIobW0yLCBtbTEpOwoJbW92cV9yMm0obW0xLCAqKGRhdGFwdHIrMykpOwoJCglpZGF0YTIgKz0gcnNraXA7CgoJbW92cV9tMnIoKmlkYXRhMiwgbW0wKTsJCSAKCW1vdnFfcjJyKG1tMCwgbW0xKTsJCSAJCQkKCglwdW5wY2tsYndfcjJyKG1tMiwgbW0wKTsKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzQpKTsKCglwdW5wY2toYndfcjJyKG1tMiwgbW0xKTsKCW1vdnFfcjJtKG1tMSwgKihkYXRhcHRyKzUpKTsKCQoJaWRhdGEyICs9IHJza2lwOwoKCW1vdnFfbTJyKCppZGF0YTIsIG1tMCk7CQkgCgltb3ZxX3IycihtbTAsIG1tMSk7CQkgCQkJCgoJcHVucGNrbGJ3X3IycihtbTIsIG1tMCk7Cgltb3ZxX3IybShtbTAsICooZGF0YXB0cis2KSk7CgoJcHVucGNraGJ3X3IycihtbTIsIG1tMSk7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cis3KSk7CgkKCWlkYXRhMiArPSByc2tpcDsKCgltb3ZxX20ycigqaWRhdGEyLCBtbTApOwkJIAoJbW92cV9yMnIobW0wLCBtbTEpOwkJIAkJCQoKCXB1bnBja2xid19yMnIobW0yLCBtbTApOwoJbW92cV9yMm0obW0wLCAqKGRhdGFwdHIrOCkpOwoKCXB1bnBja2hid19yMnIobW0yLCBtbTEpOwoJbW92cV9yMm0obW0xLCAqKGRhdGFwdHIrOSkpOwoJCglpZGF0YTIgKz0gcnNraXA7CgoJbW92cV9tMnIoKmlkYXRhMiwgbW0wKTsJCSAKCW1vdnFfcjJyKG1tMCwgbW0xKTsJCSAJCQkKCglwdW5wY2tsYndfcjJyKG1tMiwgbW0wKTsKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzEwKSk7CgoJcHVucGNraGJ3X3IycihtbTIsIG1tMSk7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cisxMSkpOwoJCglpZGF0YTIgKz0gcnNraXA7CgoJbW92cV9tMnIoKmlkYXRhMiwgbW0wKTsJCSAKCW1vdnFfcjJyKG1tMCwgbW0xKTsJCSAJCQkKCglwdW5wY2tsYndfcjJyKG1tMiwgbW0wKTsKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzEyKSk7CgoJcHVucGNraGJ3X3IycihtbTIsIG1tMSk7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cisxMykpOwoJCglpZGF0YTIgKz0gcnNraXA7CgoJbW92cV9tMnIoKmlkYXRhMiwgbW0wKTsJCSAKCW1vdnFfcjJyKG1tMCwgbW0xKTsJCSAJCQkKCglwdW5wY2tsYndfcjJyKG1tMiwgbW0wKTsKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzE0KSk7CgoJcHVucGNraGJ3X3IycihtbTIsIG1tMSk7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cisxNSkpOwoKLyogIFN0YXJ0IFRyYW5zcG9zZSB0byBkbyBjYWxjdWxhdGlvbnMgb24gcm93cyAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis5KSwgbW03KTsJCSAJLyogbTAzOm0wMnxtMDE6bTAwIC0gZmlyc3QgbGluZSAobGluZSA0KWFuZCBjb3B5IGludG8gbTUgKi8KCgltb3ZxX20ycigqKGRhdGFwdHIrMTMpLCBtbTYpOwkgICAgCS8qIG0yMzptMjJ8bTIxOm0yMCAtIHRoaXJkIGxpbmUgKGxpbmUgNilhbmQgY29weSBpbnRvIG0yICovCgltb3ZxX3IycihtbTcsIG1tNSk7CQkgCQkJCgoJcHVucGNrbHdkX20ycigqKGRhdGFwdHIrMTEpLCBtbTcpOyAJLyogbTExOm0wMXxtMTA6bTAwIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTYsIG1tMik7CQkJCQkJIAoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzE1KSwgbW02KTsgIC8qIG0zMTptMjF8bTMwOm0yMCAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW03LCBtbTEpOwoKCW1vdnFfbTJyKCooZGF0YXB0cisxMSksIG1tMyk7CSAgICAgIC8qIG0xMzptMTN8bTExOm0xMCAtIHNlY29uZCBsaW5lCSAqLwoJcHVucGNrbGRxX3IycihtbTYsIG1tNyk7CQkJCS8qIG0zMDptMjB8bTEwOm0wMCAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMSAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cisxNSksIG1tMCk7CSAgICAgIC8qIG0xMzptMTN8bTExOm0xMCAtIGZvdXJ0aCBsaW5lICovCglwdW5wY2toZHFfcjJyKG1tNiwgbW0xKTsJCQkJLyogbTMxOm0yMXxtMTE6bTAxIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCAyICovCgoJbW92cV9yMm0obW03LCooZGF0YXB0cis5KSk7CQkJLyogd3JpdGUgcmVzdWx0IDEgKi8KCXB1bnBja2h3ZF9yMnIobW0zLCBtbTUpOwkJCQkvKiBtMTM6bTAzfG0xMjptMDIgLSBpbnRlcmxlYXZlIGZpcnN0IGFuZCBzZWNvbmQgbGluZXMgKi8KCQoJbW92cV9yMm0obW0xLCooZGF0YXB0cisxMSkpOwkJCS8qIHdyaXRlIHJlc3VsdCAyICovCglwdW5wY2tod2RfcjJyKG1tMCwgbW0yKTsJCQkJLyogbTMzOm0yM3xtMzI6bTIyIC0gaW50ZXJsZWF2ZSB0aGlyZCBhbmQgZm91cnRoIGxpbmVzICovCgoJbW92cV9yMnIobW01LCBtbTEpOwoJcHVucGNrbGRxX3IycihtbTIsIG1tNSk7CQkJCS8qIG0zMjptMjJ8bTEyOm0wMiAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMyAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cisxKSwgbW0wKTsJCQkvKiBtMDM6bTAyfG0wMTptMDAgLSBmaXJzdCBsaW5lLCA0eDQgKi8KCXB1bnBja2hkcV9yMnIobW0yLCBtbTEpOwkJCQkvKiBtMzM6bTIzfG0xMzptMDMgLSBpbnRlcmxlYXZlIHRvIHByb2R1Y2UgcmVzdWx0IDQgKi8KCgltb3ZxX3IybShtbTUsKihkYXRhcHRyKzEzKSk7CQkJLyogd3JpdGUgcmVzdWx0IDMgKi8KCgkvKiBsYXN0IDR4NCBkb25lICovCgoJbW92cV9yMm0obW0xLCAqKGRhdGFwdHIrMTUpKTsJCQkvKiB3cml0ZSByZXN1bHQgNCwgbGFzdCA0eDQgKi8KCgltb3ZxX20ycigqKGRhdGFwdHIrNSksIG1tMik7CQkJLyogbTIzOm0yMnxtMjE6bTIwIC0gdGhpcmQgbGluZSAqLwoJbW92cV9yMnIobW0wLCBtbTYpOwoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzMpLCBtbTApOyAgCS8qIG0xMTptMDF8bTEwOm0wMCAtIGludGVybGVhdmUgZmlyc3QgYW5kIHNlY29uZCBsaW5lcyAqLwoJbW92cV9yMnIobW0yLCBtbTcpOwoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzcpLCBtbTIpOyAgCS8qIG0zMTptMjF8bTMwOm0yMCAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW0wLCBtbTQpOwoKCQoJbW92cV9tMnIoKihkYXRhcHRyKzgpLCBtbTEpOwkJCS8qIG4wMzpuMDJ8bjAxOm4wMCAtIGZpcnN0IGxpbmUgICovCglwdW5wY2tsZHFfcjJyKG1tMiwgbW0wKTsJCQkJLyogbTMwOm0yMHxtMTA6bTAwIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIGZpcnN0IHJlc3VsdCAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cisxMiksIG1tMyk7CQkJLyogbjIzOm4yMnxuMjE6bjIwIC0gdGhpcmQgbGluZSAqLwoJcHVucGNraGRxX3IycihtbTIsIG1tNCk7CQkJCS8qIG0zMTptMjF8bTExOm0wMSAtIGludGVybGVhdmUgdG8gcHJvZHVjZSBzZWNvbmQgcmVzdWx0ICovCgoJcHVucGNraHdkX20ycigqKGRhdGFwdHIrMyksIG1tNik7ICAJLyogbTEzOm0wM3xtMTI6bTAyIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTEsIG1tMik7ICAgICAgICAgICAgICAgCS8qIGNvcHkgZmlyc3QgbGluZSAqLwoKCXB1bnBja2h3ZF9tMnIoKihkYXRhcHRyKzcpLCBtbTcpOyAgCS8qIG0zMzptMjN8bTMyOm0yMiAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW02LCBtbTUpOwkJCQkJCS8qIGNvcHkgZmlyc3QgaW50ZXJtZWRpYXRlIHJlc3VsdCAqLwoKCW1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzgpKTsJCQkvKiB3cml0ZSByZXN1bHQgMSAqLwoJcHVucGNraGRxX3IycihtbTcsIG1tNSk7CQkJCS8qIG0zMzptMjN8bTEzOm0wMyAtIHByb2R1Y2UgdGhpcmQgcmVzdWx0ICovCgoJcHVucGNrbHdkX20ycigqKGRhdGFwdHIrMTApLCBtbTEpOyAgLyogbjExOm4wMXxuMTA6bjAwIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTMsIG1tMCk7CQkJCQkJLyogY29weSB0aGlyZCBsaW5lICovCgoJcHVucGNraHdkX20ycigqKGRhdGFwdHIrMTApLCBtbTIpOyAgLyogbjEzOm4wM3xuMTI6bjAyIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgoJbW92cV9yMm0obW00LCAqKGRhdGFwdHIrMTApKTsJCQkvKiB3cml0ZSByZXN1bHQgMiBvdXQgKi8KCXB1bnBja2xkcV9yMnIobW03LCBtbTYpOwkJCQkvKiBtMzI6bTIyfG0xMjptMDIgLSBwcm9kdWNlIGZvdXJ0aCByZXN1bHQgKi8KCglwdW5wY2tsd2RfbTJyKCooZGF0YXB0cisxNCksIG1tMyk7ICAvKiBuMzE6bjIxfG4zMDpuMjAgLSBpbnRlcmxlYXZlIHRoaXJkIGFuZCBmb3VydGggbGluZXMgKi8KCW1vdnFfcjJyKG1tMSwgbW00KTsKCgltb3ZxX3IybShtbTYsICooZGF0YXB0cisxMikpOwkJCS8qIHdyaXRlIHJlc3VsdCAzIG91dCAqLwoJcHVucGNrbGRxX3IycihtbTMsIG1tMSk7CQkJCS8qIG4zMDpuMjB8bjEwOm4wMCAtIHByb2R1Y2UgZmlyc3QgcmVzdWx0ICovCgoJcHVucGNraHdkX20ycigqKGRhdGFwdHIrMTQpLCBtbTApOyAgLyogbjMzOm4yM3xuMzI6bjIyIC0gaW50ZXJsZWF2ZSB0aGlyZCBhbmQgZm91cnRoIGxpbmVzICovCgltb3ZxX3IycihtbTIsIG1tNik7CgoJbW92cV9yMm0obW01LCAqKGRhdGFwdHIrMTQpKTsJCQkvKiB3cml0ZSByZXN1bHQgNCBvdXQgKi8KCXB1bnBja2hkcV9yMnIobW0zLCBtbTQpOwkJCQkvKiBuMzE6bjIxfG4xMTpuMDEtIHByb2R1Y2Ugc2Vjb25kIHJlc3VsdCAqLwoKCW1vdnFfcjJtKG1tMSwgKihkYXRhcHRyKzEpKTsJCQkvKiB3cml0ZSByZXN1bHQgNSBvdXQgLSAoZmlyc3QgcmVzdWx0IGZvciBvdGhlciA0IHggNCBibG9jaykgKi8KCXB1bnBja2xkcV9yMnIobW0wLCBtbTIpOwkJCQkvKiBuMzI6bjIyfG4xMjpuMDItIHByb2R1Y2UgdGhpcmQgcmVzdWx0ICovCgoJbW92cV9yMm0obW00LCAqKGRhdGFwdHIrMykpOwkJCS8qIHdyaXRlIHJlc3VsdCA2IG91dCAqLwoJcHVucGNraGRxX3IycihtbTAsIG1tNik7CQkJCS8qIG4zMzpuMjN8bjEzOm4wMyAtIHByb2R1Y2UgZm91cnRoIHJlc3VsdCAqLwoKCW1vdnFfcjJtKG1tMiwgKihkYXRhcHRyKzUpKTsJCQkvKiB3cml0ZSByZXN1bHQgNyBvdXQqLwoKCW1vdnFfbTJyKCpkYXRhcHRyLCBtbTApOwkJCQkvKiBtMDM6bTAyfG0wMTptMDAgLSBmaXJzdCBsaW5lLCBmaXJzdCA0eDQgKi8KCgltb3ZxX3IybShtbTYsICooZGF0YXB0cis3KSk7CQkJLyogd3JpdGUgcmVzdWx0IDggb3V0ICovCgoKLyogRG8gZmlyc3QgNHg0IHF1YWRyYW50LCB3aGljaCBpcyB1c2VkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIERDVDogKi8KCgltb3ZxX20ycigqKGRhdGFwdHIrNCksIG1tNyk7CQkJLyogbTIzOm0yMnxtMjE6bTIwIC0gdGhpcmQgbGluZSAqLwoJbW92cV9yMnIobW0wLCBtbTIpOwoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzIpLCBtbTApOyAgCS8qIG0xMTptMDF8bTEwOm0wMCAtIGludGVybGVhdmUgZmlyc3QgYW5kIHNlY29uZCBsaW5lcyAqLwoJbW92cV9yMnIobW03LCBtbTQpOwoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzYpLCBtbTcpOyAgCS8qIG0zMTptMjF8bTMwOm0yMCAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW0wLCBtbTEpOwoKCW1vdnFfbTJyKCooZGF0YXB0cisyKSwgbW02KTsJCQkvKiBtMTM6bTEyfG0xMTptMTAgLSBzZWNvbmQgbGluZSAqLwoJcHVucGNrbGRxX3IycihtbTcsIG1tMCk7CQkJCS8qIG0zMDptMjB8bTEwOm0wMCAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMSAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis2KSwgbW01KTsJCQkvKiBtMzM6bTMyfG0zMTptMzAgLSBmb3VydGggbGluZSAqLwoJcHVucGNraGRxX3IycihtbTcsIG1tMSk7CQkJCS8qIG0zMTptMjF8bTExOm0wMSAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMiAqLwoKCW1vdnFfcjJyKG1tMCwgbW03KTsJCQkJCQkvKiB3cml0ZSByZXN1bHQgMSAqLwoJcHVucGNraHdkX3IycihtbTYsIG1tMik7CQkJCS8qIG0xMzptMDN8bTEyOm0wMiAtIGludGVybGVhdmUgZmlyc3QgYW5kIHNlY29uZCBsaW5lcyAqLwoKCXBzdWJ3X20ycigqKGRhdGFwdHIrMTQpLCBtbTcpOwkJLyogdG1wMDc9eDAteDc6IFN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMSwgbW02KTsJCQkJCQkvKiB3cml0ZSByZXN1bHQgMiAqLwoKCXBhZGR3X20ycigqKGRhdGFwdHIrMTQpLCBtbTApOwkJLyogdG1wMDA9eDAreDc6IFN0YWdlIDEgKi8KCXB1bnBja2h3ZF9yMnIobW01LCBtbTQpOyAgIAkJCS8qIG0zMzptMjN8bTMyOm0yMiAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoKCXBhZGR3X20ycigqKGRhdGFwdHIrMTIpLCBtbTEpOwkJLyogdG1wMDE9eDEreDY6IFN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMiwgbW0zKTsJCQkJCQkvKiBjb3B5IGZpcnN0IGludGVybWVkaWF0ZSByZXN1bHQgKi8KCglwc3Vid19tMnIoKihkYXRhcHRyKzEyKSwgbW02KTsJCS8qIHRtcDA2PXgxLXg2OiBTdGFnZSAxICovCglwdW5wY2tsZHFfcjJyKG1tNCwgbW0yKTsJCQkJLyogbTMyOm0yMnxtMTI6bTAyIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCAzICovCgogICBtb3ZxX3IybShtbTcsIHRtcDcpOwoJbW92cV9yMnIobW0yLCBtbTUpOwkJCQkJCS8qIHdyaXRlIHJlc3VsdCAzICovCgogICBtb3ZxX3IybShtbTYsIHRtcDYpOwoJcHVucGNraGRxX3IycihtbTQsIG1tMyk7CQkJCS8qIG0zMzptMjN8bTEzOm0wMyAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgNCAqLwoKCXBhZGR3X20ycigqKGRhdGFwdHIrMTApLCBtbTIpOyAgICAgCS8qIHRtcDAyPXgyKzU6IFN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMywgbW00KTsJCQkJCQkvKiB3cml0ZSByZXN1bHQgNCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCQkJCUVuZCBvZiBUcmFuc3Bvc2UKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrOCksIG1tMyk7ICAgIAkvKiB0bXAwMz14Myt4NDogc3RhZ2UgMSAqLwogICBtb3ZxX3IycihtbTAsIG1tNyk7CgogICBwc3Vid19tMnIoKihkYXRhcHRyKzgpLCBtbTQpOyAgICAJLyogdG1wMDQ9eDMteDQ6IHN0YWdlIDEgKi8KICAgbW92cV9yMnIobW0xLCBtbTYpOwoKCXBhZGR3X3IycihtbTMsIG1tMCk7ICAJCQkJCS8qIHRtcDEwID0gdG1wMDAgKyB0bXAwMzogZXZlbiAyICovCglwc3Vid19yMnIobW0zLCBtbTcpOyAgCQkJCQkvKiB0bXAxMyA9IHRtcDAwIC0gdG1wMDM6IGV2ZW4gMiAqLwoKCXBzdWJ3X3IycihtbTIsIG1tNik7ICAJCQkJCS8qIHRtcDEyID0gdG1wMDEgLSB0bXAwMjogZXZlbiAyICovCglwYWRkd19yMnIobW0yLCBtbTEpOyAgCQkJCQkvKiB0bXAxMSA9IHRtcDAxICsgdG1wMDI6IGV2ZW4gMiAqLwoKICAgcHN1YndfbTJyKCooZGF0YXB0cisxMCksIG1tNSk7ICAgIAkvKiB0bXAwNT14Mi14NTogc3RhZ2UgMSAqLwoJcGFkZHdfcjJyKG1tNywgbW02KTsJCQkJCQkvKiB0bXAxMiArIHRtcDEzICovCgoJLyogc3RhZ2UgMyAqLwoKICAgbW92cV9tMnIodG1wNiwgbW0yKTsKICAgbW92cV9yMnIobW0wLCBtbTMpOwoKCXBzbGx3X2kycigyLCBtbTYpOwkJCS8qIG04ICogMl4yICovCglwYWRkd19yMnIobW0xLCBtbTApOwkJCgoJcG11bGh3X20ycihSVGpwZWdfQzQsIG1tNik7CQkJLyogejEgKi8KCXBzdWJ3X3IycihtbTEsIG1tMyk7CQkKCiAgIG1vdnFfcjJtKG1tMCwgKmRhdGFwdHIpOwogICBtb3ZxX3IycihtbTcsIG1tMCk7CiAgIAogICAgLyogT2RkIHBhcnQgKi8KICAgbW92cV9yMm0obW0zLCAqKGRhdGFwdHIrOCkpOwoJcGFkZHdfcjJyKG1tNSwgbW00KTsJCQkJCQkvKiB0bXAxMCAqLwoKICAgbW92cV9tMnIodG1wNywgbW0zKTsKCXBhZGR3X3IycihtbTYsIG1tMCk7CQkJCQkJLyogdG1wMzIgKi8KCglwYWRkd19yMnIobW0yLCBtbTUpOwkJCQkJCS8qIHRtcDExICovCglwc3Vid19yMnIobW02LCBtbTcpOwkJCQkJCS8qIHRtcDMzICovCgogICBtb3ZxX3IybShtbTAsICooZGF0YXB0cis0KSk7CglwYWRkd19yMnIobW0zLCBtbTIpOwkJCQkJCS8qIHRtcDEyICovCgoJLyogc3RhZ2UgNCAqLwoKICAgbW92cV9yMm0obW03LCAqKGRhdGFwdHIrMTIpKTsKCW1vdnFfcjJyKG1tNCwgbW0xKTsJCQkJCQkvKiBjb3B5IG9mIHRtcDEwICovCgoJcHN1YndfcjJyKG1tMiwgbW0xKTsJCQkJCQkvKiB0bXAxMCAtIHRtcDEyICovCglwc2xsd19pMnIoMiwgbW00KTsJCQkvKiBtOCAqIDJeMiAqLwoKCW1vdnFfbTJyKFJUanBlZ19DMm1DNiwgbW0wKTsJCQoJcHNsbHdfaTJyKDIsIG1tMSk7CgoJcG11bGh3X20ycihSVGpwZWdfQzYsIG1tMSk7CQkJLyogejUgKi8KCXBzbGx3X2kycigyLCBtbTIpOwoKCXBtdWxod19yMnIobW0wLCBtbTQpOwkJCQkJLyogejUgKi8KCgkvKiBzdGFnZSA1ICovCgoJcG11bGh3X20ycihSVGpwZWdfQzJwQzYsIG1tMik7Cglwc2xsd19pMnIoMiwgbW01KTsKCglwbXVsaHdfbTJyKFJUanBlZ19DNCwgbW01KTsJCQkvKiB6MyAqLwoJbW92cV9yMnIobW0zLCBtbTApOwkJCQkJCS8qIGNvcHkgdG1wNyAqLwoKICAgbW92cV9tMnIoKihkYXRhcHRyKzEpLCBtbTcpOwoJcGFkZHdfcjJyKG1tMSwgbW00KTsJCQkJCQkvKiB6MiAqLwoKCXBhZGR3X3IycihtbTEsIG1tMik7CQkJCQkJLyogejQgKi8KCglwYWRkd19yMnIobW01LCBtbTApOwkJCQkJCS8qIHoxMSAqLwoJcHN1YndfcjJyKG1tNSwgbW0zKTsJCQkJCQkvKiB6MTMgKi8KCgkvKiBzdGFnZSA2ICovCgoJbW92cV9yMnIobW0zLCBtbTUpOwkJCQkJCS8qIGNvcHkgejEzICovCglwc3Vid19yMnIobW00LCBtbTMpOwkJCQkJCS8qIHkzPXoxMyAtIHoyICovCgoJcGFkZHdfcjJyKG1tNCwgbW01KTsJCQkJCQkvKiB5NT16MTMgKyB6MiAqLwoJbW92cV9yMnIobW0wLCBtbTYpOwkJCQkJCS8qIGNvcHkgejExICovCgogICBtb3ZxX3IybShtbTMsICooZGF0YXB0cis2KSk7IAkJCS8qc2F2ZSB5MyAqLwoJcHN1YndfcjJyKG1tMiwgbW0wKTsJCQkJCQkvKiB5Nz16MTEgLSB6NCAqLwoKICAgbW92cV9yMm0obW01LCAqKGRhdGFwdHIrMTApKTsgCQkvKnNhdmUgeTUgKi8KCXBhZGR3X3IycihtbTIsIG1tNik7CQkJCQkJLyogeTE9ejExICsgejQgKi8KCiAgIG1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzE0KSk7IAkJLypzYXZlIHk3ICovCgoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJICogIEVuZCBvZiAxc3QgNCByb3dzCgkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgbW92cV9tMnIoKihkYXRhcHRyKzMpLCBtbTEpOyAJCQkvKiBsb2FkIHgxOiBzdGFnZSAxICovCgltb3ZxX3IycihtbTcsIG1tMCk7CQkJCQkJLyogY29weSB4MCAqLwoKICAgbW92cV9yMm0obW02LCAqKGRhdGFwdHIrMikpOyAJCQkvKnNhdmUgeTEgKi8KCiAgIG1vdnFfbTJyKCooZGF0YXB0cis1KSwgbW0yKTsgCQkJLyogbG9hZCB4Mjogc3RhZ2UgMSAqLwoJbW92cV9yMnIobW0xLCBtbTYpOwkJCQkJCS8qIGNvcHkgeDEgKi8KCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrMTUpLCBtbTApOyAgCQkvKiB0bXAwMCA9IHgwICsgeDcgKi8KCiAgIG1vdnFfbTJyKCooZGF0YXB0cis3KSwgbW0zKTsgCQkJLyogbG9hZCB4MyA6IHN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMiwgbW01KTsJCQkJCQkvKiBjb3B5IHgyICovCgogICBwc3Vid19tMnIoKihkYXRhcHRyKzE1KSwgbW03KTsgIAkJLyogdG1wMDcgPSB4MCAtIHg3ICovCgltb3ZxX3IycihtbTMsIG1tNCk7CQkJCQkJLyogY29weSB4MyAqLwoKICAgcGFkZHdfbTJyKCooZGF0YXB0cisxMyksIG1tMSk7ICAJCS8qIHRtcDAxID0geDEgKyB4NiAqLwoKCW1vdnFfcjJtKG1tNywgdG1wNyk7CQkJCQkJLyogc2F2ZSB0bXAwNyAqLwoJbW92cV9yMnIobW0wLCBtbTcpOwkJCQkJCS8qIGNvcHkgdG1wMDAgKi8KCiAgIHBzdWJ3X20ycigqKGRhdGFwdHIrMTMpLCBtbTYpOyAgCQkvKiB0bXAwNiA9IHgxIC0geDYgKi8KCiAgIC8qIHN0YWdlIDIsIEV2ZW4gUGFydCAqLwoKICAgcGFkZHdfbTJyKCooZGF0YXB0cis5KSwgbW0zKTsgIAkJLyogdG1wMDMgPSB4MyArIHg0ICovCgoJbW92cV9yMm0obW02LCB0bXA2KTsJCQkJCQkvKiBzYXZlIHRtcDA3ICovCgltb3ZxX3IycihtbTEsIG1tNik7CQkJCQkJLyogY29weSB0bXAwMSAqLwoKICAgcGFkZHdfbTJyKCooZGF0YXB0cisxMSksIG1tMik7ICAJCS8qIHRtcDAyID0geDIgKyB4NSAqLwoJcGFkZHdfcjJyKG1tMywgbW0wKTsgICAgICAgICAgICAgIAkvKiB0bXAxMCA9IHRtcDAwICsgdG1wMDMgKi8KCglwc3Vid19yMnIobW0zLCBtbTcpOyAgICAgICAgICAgICAgCS8qIHRtcDEzID0gdG1wMDAgLSB0bXAwMyAqLwoKICAgcHN1YndfbTJyKCooZGF0YXB0cis5KSwgbW00KTsgIAkJLyogdG1wMDQgPSB4MyAtIHg0ICovCglwc3Vid19yMnIobW0yLCBtbTYpOyAgICAgICAgICAgICAgCS8qIHRtcDEyID0gdG1wMDEgLSB0bXAwMiAqLwoKCXBhZGR3X3IycihtbTIsIG1tMSk7ICAgICAgICAgICAgICAJLyogdG1wMTEgPSB0bXAwMSArIHRtcDAyICovCgogICBwc3Vid19tMnIoKihkYXRhcHRyKzExKSwgbW01KTsgIAkJLyogdG1wMDUgPSB4MiAtIHg1ICovCglwYWRkd19yMnIobW03LCBtbTYpOyAgICAgICAgICAgICAgCS8qICB0bXAxMiArIHRtcDEzICovCgogICAvKiBzdGFnZSAzLCBFdmVuIGFuZCBzdGFnZSA0ICYgNSBldmVuICovCgoJbW92cV9tMnIodG1wNiwgbW0yKTsgICAgICAgICAgICAJCS8qIGxvYWQgdG1wNiAqLwoJbW92cV9yMnIobW0wLCBtbTMpOwkJCQkJCS8qIGNvcHkgdG1wMTAgKi8KCglwc2xsd19pMnIoMiwgbW02KTsJCQkvKiBzaGlmdCB6MSAqLwoJcGFkZHdfcjJyKG1tMSwgbW0wKTsgICAgCQkJCS8qIHkwPXRtcDEwICsgdG1wMTEgKi8KCglwbXVsaHdfbTJyKFJUanBlZ19DNCwgbW02KTsgICAgCQkvKiB6MSAqLwoJcHN1YndfcjJyKG1tMSwgbW0zKTsgICAgCQkJCS8qIHk0PXRtcDEwIC0gdG1wMTEgKi8KCiAgIG1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzEpKTsgCQkJLypzYXZlIHkwICovCgltb3ZxX3IycihtbTcsIG1tMCk7CQkJCQkJLyogY29weSB0bXAxMyAqLwogIAoJLyogb2RkIHBhcnQgKi8KCiAgIG1vdnFfcjJtKG1tMywgKihkYXRhcHRyKzkpKTsgCQkJLypzYXZlIHk0ICovCglwYWRkd19yMnIobW01LCBtbTQpOyAgICAgICAgICAgICAgCS8qIHRtcDEwID0gdG1wNCArIHRtcDUgKi8KCgltb3ZxX20ycih0bXA3LCBtbTMpOyAgICAgICAgICAgIAkJLyogbG9hZCB0bXA3ICovCglwYWRkd19yMnIobW02LCBtbTApOyAgICAgICAgICAgICAgCS8qIHRtcDMyID0gdG1wMTMgKyB6MSAqLwoKCXBhZGR3X3IycihtbTIsIG1tNSk7ICAgICAgICAgICAgICAJLyogdG1wMTEgPSB0bXA1ICsgdG1wNiAqLwoJcHN1YndfcjJyKG1tNiwgbW03KTsgICAgICAgICAgICAgIAkvKiB0bXAzMyA9IHRtcDEzIC0gejEgKi8KCiAgIG1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzUpKTsgCQkJLypzYXZlIHkyICovCglwYWRkd19yMnIobW0zLCBtbTIpOyAgICAgICAgICAgICAgCS8qIHRtcDEyID0gdG1wNiArIHRtcDcgKi8KCgkvKiBzdGFnZSA0ICovCgogICBtb3ZxX3IybShtbTcsICooZGF0YXB0cisxMykpOyAJCS8qc2F2ZSB5NiAqLwoJbW92cV9yMnIobW00LCBtbTEpOwkJCQkJCS8qIGNvcHkgdG1wMTAgKi8KCglwc3Vid19yMnIobW0yLCBtbTEpOyAgICAJCQkJLyogdG1wMTAgLSB0bXAxMiAqLwoJcHNsbHdfaTJyKDIsIG1tNCk7CQkJLyogc2hpZnQgdG1wMTAgKi8KCgltb3ZxX20ycihSVGpwZWdfQzJtQzYsIG1tMCk7CQkJLyogbG9hZCBDMm1DNiAqLwoJcHNsbHdfaTJyKDIsIG1tMSk7CQkJLyogc2hpZnQgKHRtcDEwLXRtcDEyKSAqLwoKCXBtdWxod19tMnIoUlRqcGVnX0M2LCBtbTEpOyAgICAJCS8qIHo1ICovCglwc2xsd19pMnIoMiwgbW01KTsJCQkvKiBwcmVwYXJlIGZvciBtdWx0aXBseSAgKi8KCglwbXVsaHdfcjJyKG1tMCwgbW00KTsJCQkJCS8qIG11bHRpcGx5IGJ5IGNvbnZlcnRlZCByZWFsICovCgoJLyogc3RhZ2UgNSAqLwoKCXBtdWxod19tMnIoUlRqcGVnX0M0LCBtbTUpOwkJCS8qIHozICovCglwc2xsd19pMnIoMiwgbW0yKTsJCQkvKiBwcmVwYXJlIGZvciBtdWx0aXBseSAgKi8KCglwbXVsaHdfbTJyKFJUanBlZ19DMnBDNiwgbW0yKTsJCS8qIG11bHRpcGx5ICovCgltb3ZxX3IycihtbTMsIG1tMCk7CQkJCQkJLyogY29weSB0bXA3ICovCgoJbW92cV9tMnIoKihkYXRhcHRyKzkpLCBtbTcpOwkJIAkvKiBtMDM6bTAyfG0wMTptMDAgLSBmaXJzdCBsaW5lIChsaW5lIDQpYW5kIGNvcHkgaW50byBtbTcgKi8KCXBhZGR3X3IycihtbTEsIG1tNCk7CQkJCQkJLyogejIgKi8KCglwYWRkd19yMnIobW01LCBtbTApOwkJCQkJCS8qIHoxMSAqLwoJcHN1YndfcjJyKG1tNSwgbW0zKTsJCQkJCQkvKiB6MTMgKi8KCgkvKiBzdGFnZSA2ICovCgoJbW92cV9yMnIobW0zLCBtbTUpOwkJCQkJCS8qIGNvcHkgejEzICovCglwYWRkd19yMnIobW0xLCBtbTIpOwkJCQkJCS8qIHo0ICovCgoJbW92cV9yMnIobW0wLCBtbTYpOwkJCQkJCS8qIGNvcHkgejExICovCglwc3Vid19yMnIobW00LCBtbTUpOwkJCQkJCS8qIHkzICovCgoJcGFkZHdfcjJyKG1tMiwgbW02KTsJCQkJCQkvKiB5MSAqLwoJcGFkZHdfcjJyKG1tNCwgbW0zKTsJCQkJCQkvKiB5NSAqLwoKICAgbW92cV9yMm0obW01LCAqKGRhdGFwdHIrNykpOyAJCQkvKnNhdmUgeTMgKi8KCiAgIG1vdnFfcjJtKG1tNiwgKihkYXRhcHRyKzMpKTsgCQkJLypzYXZlIHkxICovCglwc3Vid19yMnIobW0yLCBtbTApOwkJCQkJCS8qIHk3ICovCgkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCQkJCVN0YXJ0IG9mIFRyYW5zcG9zZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogCW1vdnFfbTJyKCooZGF0YXB0cisxMyksIG1tNik7CQkgCS8qIG0yMzptMjJ8bTIxOm0yMCAtIHRoaXJkIGxpbmUgKGxpbmUgNilhbmQgY29weSBpbnRvIG0yICovCgltb3ZxX3IycihtbTcsIG1tNSk7CQkJCQkJLyogY29weSBmaXJzdCBsaW5lICovCgoJcHVucGNrbHdkX3IycihtbTMsIG1tNyk7IAkJCQkvKiBtMTE6bTAxfG0xMDptMDAgLSBpbnRlcmxlYXZlIGZpcnN0IGFuZCBzZWNvbmQgbGluZXMgKi8KCW1vdnFfcjJyKG1tNiwgbW0yKTsJCQkJCQkvKiBjb3B5IHRoaXJkIGxpbmUgKi8KCglwdW5wY2tsd2RfcjJyKG1tMCwgbW02KTsgIAkJCQkvKiBtMzE6bTIxfG0zMDptMjAgLSBpbnRlcmxlYXZlIHRoaXJkIGFuZCBmb3VydGggbGluZXMgKi8KCW1vdnFfcjJyKG1tNywgbW0xKTsJCQkJCQkvKiBjb3B5IGZpcnN0IGludGVybWVkaWF0ZSByZXN1bHQgKi8KCglwdW5wY2tsZHFfcjJyKG1tNiwgbW03KTsJCQkJLyogbTMwOm0yMHxtMTA6bTAwIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCAxICovCgoJcHVucGNraGRxX3IycihtbTYsIG1tMSk7CQkJCS8qIG0zMTptMjF8bTExOm0wMSAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMiAqLwoKCW1vdnFfcjJtKG1tNywgKihkYXRhcHRyKzkpKTsJCQkvKiB3cml0ZSByZXN1bHQgMSAqLwoJcHVucGNraHdkX3IycihtbTMsIG1tNSk7CQkJCS8qIG0xMzptMDN8bTEyOm0wMiAtIGludGVybGVhdmUgZmlyc3QgYW5kIHNlY29uZCBsaW5lcyAqLwoKCW1vdnFfcjJtKG1tMSwgKihkYXRhcHRyKzExKSk7CQkJLyogd3JpdGUgcmVzdWx0IDIgKi8KCXB1bnBja2h3ZF9yMnIobW0wLCBtbTIpOwkJCQkvKiBtMzM6bTIzfG0zMjptMjIgLSBpbnRlcmxlYXZlIHRoaXJkIGFuZCBmb3VydGggbGluZXMgKi8KCgltb3ZxX3IycihtbTUsIG1tMSk7CQkJCQkJLyogY29weSBmaXJzdCBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCglwdW5wY2tsZHFfcjJyKG1tMiwgbW01KTsJCQkJLyogbTMyOm0yMnxtMTI6bTAyIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCAzICovCgoJbW92cV9tMnIoKihkYXRhcHRyKzEpLCBtbTApOwkJCS8qIG0wMzptMDJ8bTAxOm0wMCAtIGZpcnN0IGxpbmUsIDR4NCAqLwoJcHVucGNraGRxX3IycihtbTIsIG1tMSk7CQkJCS8qIG0zMzptMjN8bTEzOm0wMyAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgNCAqLwoKCW1vdnFfcjJtKG1tNSwgKihkYXRhcHRyKzEzKSk7CQkJLyogd3JpdGUgcmVzdWx0IDMgKi8KCgkvKioqKioqIGxhc3QgNHg0IGRvbmUgKi8KCgltb3ZxX3IybShtbTEsICooZGF0YXB0cisxNSkpOwkJCS8qIHdyaXRlIHJlc3VsdCA0LCBsYXN0IDR4NCAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis1KSwgbW0yKTsJCQkvKiBtMjM6bTIyfG0yMTptMjAgLSB0aGlyZCBsaW5lICovCgltb3ZxX3IycihtbTAsIG1tNik7CQkJCQkJLyogY29weSBmaXJzdCBsaW5lICovCgoJcHVucGNrbHdkX20ycigqKGRhdGFwdHIrMyksIG1tMCk7ICAJLyogbTExOm0wMXxtMTA6bTAwIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTIsIG1tNyk7CQkJCQkJLyogY29weSB0aGlyZCBsaW5lICovCgoJcHVucGNrbHdkX20ycigqKGRhdGFwdHIrNyksIG1tMik7ICAJLyogbTMxOm0yMXxtMzA6bTIwIC0gaW50ZXJsZWF2ZSB0aGlyZCBhbmQgZm91cnRoIGxpbmVzICovCgltb3ZxX3IycihtbTAsIG1tNCk7CQkJCQkJLyogY29weSBmaXJzdCBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCgoJCgoJbW92cV9tMnIoKihkYXRhcHRyKzgpLCBtbTEpOwkJCS8qIG4wMzpuMDJ8bjAxOm4wMCAtIGZpcnN0IGxpbmUgICovCglwdW5wY2tsZHFfcjJyKG1tMiwgbW0wKTsJCQkJLyogbTMwOm0yMHxtMTA6bTAwIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIGZpcnN0IHJlc3VsdCAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cisxMiksIG1tMyk7CQkJLyogbjIzOm4yMnxuMjE6bjIwIC0gdGhpcmQgbGluZSAqLwoJcHVucGNraGRxX3IycihtbTIsIG1tNCk7CQkJCS8qIG0zMTptMjF8bTExOm0wMSAtIGludGVybGVhdmUgdG8gcHJvZHVjZSBzZWNvbmQgcmVzdWx0ICovCgoJcHVucGNraHdkX20ycigqKGRhdGFwdHIrMyksIG1tNik7ICAJLyogbTEzOm0wM3xtMTI6bTAyIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTEsIG1tMik7CQkJCQkJLyogY29weSBmaXJzdCBsaW5lICovCgoJcHVucGNraHdkX20ycigqKGRhdGFwdHIrNyksIG1tNyk7ICAJLyogbTMzOm0yM3xtMzI6bTIyIC0gaW50ZXJsZWF2ZSB0aGlyZCBhbmQgZm91cnRoIGxpbmVzICovCgltb3ZxX3IycihtbTYsIG1tNSk7CQkJCQkJLyogY29weSBmaXJzdCBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCgoJbW92cV9yMm0obW0wLCAqKGRhdGFwdHIrOCkpOwkJCS8qIHdyaXRlIHJlc3VsdCAxICovCglwdW5wY2toZHFfcjJyKG1tNywgbW01KTsJCQkJLyogbTMzOm0yM3xtMTM6bTAzIC0gcHJvZHVjZSB0aGlyZCByZXN1bHQgKi8KCglwdW5wY2tsd2RfbTJyKCooZGF0YXB0cisxMCksIG1tMSk7ICAvKiBuMTE6bjAxfG4xMDpuMDAgLSBpbnRlcmxlYXZlIGZpcnN0IGFuZCBzZWNvbmQgbGluZXMgKi8KCW1vdnFfcjJyKG1tMywgbW0wKTsJCQkJCQkvKiBjb3B5IHRoaXJkIGxpbmUgKi8KCglwdW5wY2tod2RfbTJyKCooZGF0YXB0cisxMCksIG1tMik7ICAvKiBuMTM6bjAzfG4xMjpuMDIgLSBpbnRlcmxlYXZlIGZpcnN0IGFuZCBzZWNvbmQgbGluZXMgKi8KCgltb3ZxX3IybShtbTQsICooZGF0YXB0cisxMCkpOwkJCS8qIHdyaXRlIHJlc3VsdCAyIG91dCAqLwoJcHVucGNrbGRxX3IycihtbTcsIG1tNik7CQkJCS8qIG0zMjptMjJ8bTEyOm0wMiAtIHByb2R1Y2UgZm91cnRoIHJlc3VsdCAqLwoKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzE0KSwgbW0zKTsgIC8qIG4zMzpuMjN8bjMyOm4yMiAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW0xLCBtbTQpOwkJCQkJCS8qIGNvcHkgc2Vjb25kIGludGVybWVkaWF0ZSByZXN1bHQgKi8KCgltb3ZxX3IybShtbTYsICooZGF0YXB0cisxMikpOwkJCS8qIHdyaXRlIHJlc3VsdCAzIG91dCAqLwoJcHVucGNrbGRxX3IycihtbTMsIG1tMSk7CQkJCS8qICAqLwoKCXB1bnBja2h3ZF9tMnIoKihkYXRhcHRyKzE0KSwgbW0wKTsgIC8qIG4zMzpuMjN8bjMyOm4yMiAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW0yLCBtbTYpOwkJCQkJCS8qIGNvcHkgc2Vjb25kIGludGVybWVkaWF0ZSByZXN1bHQgKi8KCgltb3ZxX3IybShtbTUsICooZGF0YXB0cisxNCkpOwkJCS8qIHdyaXRlIHJlc3VsdCA0IG91dCAqLwoJcHVucGNraGRxX3IycihtbTMsIG1tNCk7CQkJCS8qIG4zMTpuMjF8bjExOm4wMS0gcHJvZHVjZSBzZWNvbmQgcmVzdWx0ICovCgoJbW92cV9yMm0obW0xLCAqKGRhdGFwdHIrMSkpOwkJCS8qIHdyaXRlIHJlc3VsdCA1IG91dCAtIChmaXJzdCByZXN1bHQgZm9yIG90aGVyIDQgeCA0IGJsb2NrKSAqLwoJcHVucGNrbGRxX3IycihtbTAsIG1tMik7CQkJCS8qIG4zMjpuMjJ8bjEyOm4wMi0gcHJvZHVjZSB0aGlyZCByZXN1bHQgKi8KCgltb3ZxX3IybShtbTQsICooZGF0YXB0ciszKSk7CQkJLyogd3JpdGUgcmVzdWx0IDYgb3V0ICovCglwdW5wY2toZHFfcjJyKG1tMCwgbW02KTsJCQkJLyogbjMzOm4yM3xuMTM6bjAzIC0gcHJvZHVjZSBmb3VydGggcmVzdWx0ICovCgoJbW92cV9yMm0obW0yLCAqKGRhdGFwdHIrNSkpOwkJCS8qIHdyaXRlIHJlc3VsdCA3IG91dCAqLwoKCW1vdnFfbTJyKCpkYXRhcHRyLCBtbTApOwkJCQkvKiBtMDM6bTAyfG0wMTptMDAgLSBmaXJzdCBsaW5lLCBmaXJzdCA0eDQgKi8KCgltb3ZxX3IybShtbTYsICooZGF0YXB0cis3KSk7CQkJLyogd3JpdGUgcmVzdWx0IDggb3V0ICovCgovKiBEbyBmaXJzdCA0eDQgcXVhZHJhbnQsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgRENUOiAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis0KSwgbW03KTsJCQkvKiBtMjM6bTIyfG0yMTptMjAgLSB0aGlyZCBsaW5lICovCgltb3ZxX3IycihtbTAsIG1tMik7CQkJCQkJLyogY29weSBmaXJzdCBsaW5lICovCgoJcHVucGNrbHdkX20ycigqKGRhdGFwdHIrMiksIG1tMCk7ICAJLyogbTExOm0wMXxtMTA6bTAwIC0gaW50ZXJsZWF2ZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmVzICovCgltb3ZxX3IycihtbTcsIG1tNCk7CQkJCQkJLyogY29weSB0aGlyZCBsaW5lICovCgkKCXB1bnBja2x3ZF9tMnIoKihkYXRhcHRyKzYpLCBtbTcpOyAgCS8qIG0zMTptMjF8bTMwOm0yMCAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoJbW92cV9yMnIobW0wLCBtbTEpOwkJCQkJCS8qIGNvcHkgZmlyc3QgaW50ZXJtZWRpYXRlIHJlc3VsdCAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cisyKSwgbW02KTsJCQkvKiBtMTM6bTEyfG0xMTptMTAgLSBzZWNvbmQgbGluZSAqLwoJcHVucGNrbGRxX3IycihtbTcsIG1tMCk7CQkJCS8qIG0zMDptMjB8bTEwOm0wMCAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMSAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis2KSwgbW01KTsJCQkvKiBtMzM6bTMyfG0zMTptMzAgLSBmb3VydGggbGluZSAqLwoJcHVucGNraGRxX3IycihtbTcsIG1tMSk7CQkJCS8qIG0zMTptMjF8bTExOm0wMSAtIGludGVybGVhdmUgdG8gcHJvZHVjZSByZXN1bHQgMiAqLwoKCW1vdnFfcjJyKG1tMCwgbW03KTsJCQkJCQkvKiB3cml0ZSByZXN1bHQgMSAqLwoJcHVucGNraHdkX3IycihtbTYsIG1tMik7CQkJCS8qIG0xMzptMDN8bTEyOm0wMiAtIGludGVybGVhdmUgZmlyc3QgYW5kIHNlY29uZCBsaW5lcyAqLwoKCXBzdWJ3X20ycigqKGRhdGFwdHIrMTQpLCBtbTcpOwkJLyogdG1wMDc9eDAteDc6IFN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMSwgbW02KTsJCQkJCQkvKiB3cml0ZSByZXN1bHQgMiAqLwoKCXBhZGR3X20ycigqKGRhdGFwdHIrMTQpLCBtbTApOwkJLyogdG1wMDA9eDAreDc6IFN0YWdlIDEgKi8KCXB1bnBja2h3ZF9yMnIobW01LCBtbTQpOyAgIAkJCS8qIG0zMzptMjN8bTMyOm0yMiAtIGludGVybGVhdmUgdGhpcmQgYW5kIGZvdXJ0aCBsaW5lcyAqLwoKCXBhZGR3X20ycigqKGRhdGFwdHIrMTIpLCBtbTEpOwkJLyogdG1wMDE9eDEreDY6IFN0YWdlIDEgKi8KCW1vdnFfcjJyKG1tMiwgbW0zKTsJCQkJCQkvKiBjb3B5IGZpcnN0IGludGVybWVkaWF0ZSByZXN1bHQgKi8KCglwc3Vid19tMnIoKihkYXRhcHRyKzEyKSwgbW02KTsJCS8qIHRtcDA2PXgxLXg2OiBTdGFnZSAxICovCglwdW5wY2tsZHFfcjJyKG1tNCwgbW0yKTsJCQkJLyogbTMyOm0yMnxtMTI6bTAyIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCAzICovCgoJbW92cV9yMm0obW03LCB0bXA3KTsJCQkJCQkvKiBzYXZlIHRtcDA3ICovCgltb3ZxX3IycihtbTIsIG1tNSk7CQkJCQkJLyogd3JpdGUgcmVzdWx0IDMgKi8KCgltb3ZxX3IybShtbTYsIHRtcDYpOwkJCQkJCS8qIHNhdmUgdG1wMDYgKi8KCglwdW5wY2toZHFfcjJyKG1tNCwgbW0zKTsJCQkJLyogbTMzOm0yM3xtMTM6bTAzIC0gaW50ZXJsZWF2ZSB0byBwcm9kdWNlIHJlc3VsdCA0ICovCgoJcGFkZHdfbTJyKCooZGF0YXB0cisxMCksIG1tMik7ICAgCS8qIHRtcDAyPXgyK3g1OiBzdGFnZSAxICovCgltb3ZxX3IycihtbTMsIG1tNCk7CQkJCQkJLyogd3JpdGUgcmVzdWx0IDQgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQkJCQlFbmQgb2YgVHJhbnNwb3NlIDIKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgcGFkZHdfbTJyKCooZGF0YXB0cis4KSwgbW0zKTsgICAgCS8qIHRtcDAzPXgzK3g0OiBzdGFnZSAxICovCiAgIG1vdnFfcjJyKG1tMCwgbW03KTsKCiAgIHBzdWJ3X20ycigqKGRhdGFwdHIrOCksIG1tNCk7ICAgIAkvKiB0bXAwND14My14NDogc3RhZ2UgMSAqLwogICBtb3ZxX3IycihtbTEsIG1tNik7CgoJcGFkZHdfcjJyKG1tMywgbW0wKTsgIAkJCQkJLyogdG1wMTAgPSB0bXAwMCArIHRtcDAzOiBldmVuIDIgKi8KCXBzdWJ3X3IycihtbTMsIG1tNyk7ICAJCQkJCS8qIHRtcDEzID0gdG1wMDAgLSB0bXAwMzogZXZlbiAyICovCgoJcHN1YndfcjJyKG1tMiwgbW02KTsgIAkJCQkJLyogdG1wMTIgPSB0bXAwMSAtIHRtcDAyOiBldmVuIDIgKi8KCXBhZGR3X3IycihtbTIsIG1tMSk7ICAJCQkJCS8qIHRtcDExID0gdG1wMDEgKyB0bXAwMjogZXZlbiAyICovCgogICBwc3Vid19tMnIoKihkYXRhcHRyKzEwKSwgbW01KTsgICAgCS8qIHRtcDA1PXgyLXg1OiBzdGFnZSAxICovCglwYWRkd19yMnIobW03LCBtbTYpOwkJCQkJCS8qIHRtcDEyICsgdG1wMTMgKi8KCgkvKiBzdGFnZSAzICovCgogICBtb3ZxX20ycih0bXA2LCBtbTIpOwogICBtb3ZxX3IycihtbTAsIG1tMyk7CgoJcHNsbHdfaTJyKDIsIG1tNik7CQkJLyogbTggKiAyXjIgKi8KCXBhZGR3X3IycihtbTEsIG1tMCk7CQkKCglwbXVsaHdfbTJyKFJUanBlZ19DNCwgbW02KTsJCQkvKiB6MSAqLwoJcHN1YndfcjJyKG1tMSwgbW0zKTsJCQoKICAgbW92cV9yMm0obW0wLCAqZGF0YXB0cik7CiAgIG1vdnFfcjJyKG1tNywgbW0wKTsKICAgCiAgICAvKiBPZGQgcGFydCAqLwogICBtb3ZxX3IybShtbTMsICooZGF0YXB0cis4KSk7CglwYWRkd19yMnIobW01LCBtbTQpOwkJCQkJCS8qIHRtcDEwICovCgogICBtb3ZxX20ycih0bXA3LCBtbTMpOwoJcGFkZHdfcjJyKG1tNiwgbW0wKTsJCQkJCQkvKiB0bXAzMiAqLwoKCXBhZGR3X3IycihtbTIsIG1tNSk7CQkJCQkJLyogdG1wMTEgKi8KCXBzdWJ3X3IycihtbTYsIG1tNyk7CQkJCQkJLyogdG1wMzMgKi8KCiAgIG1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzQpKTsKCXBhZGR3X3IycihtbTMsIG1tMik7CQkJCQkJLyogdG1wMTIgKi8KCgkvKiBzdGFnZSA0ICovCiAgIG1vdnFfcjJtKG1tNywgKihkYXRhcHRyKzEyKSk7Cgltb3ZxX3IycihtbTQsIG1tMSk7CQkJCQkJLyogY29weSBvZiB0bXAxMCAqLwoKCXBzdWJ3X3IycihtbTIsIG1tMSk7CQkJCQkJLyogdG1wMTAgLSB0bXAxMiAqLwoJcHNsbHdfaTJyKDIsIG1tNCk7CQkJLyogbTggKiAyXjIgKi8KCgltb3ZxX20ycihSVGpwZWdfQzJtQzYsIG1tMCk7Cglwc2xsd19pMnIoMiwgbW0xKTsKCglwbXVsaHdfbTJyKFJUanBlZ19DNiwgbW0xKTsJCQkvKiB6NSAqLwoJcHNsbHdfaTJyKDIsIG1tMik7CgoJcG11bGh3X3IycihtbTAsIG1tNCk7CQkJCQkvKiB6NSAqLwoKCS8qIHN0YWdlIDUgKi8KCglwbXVsaHdfbTJyKFJUanBlZ19DMnBDNiwgbW0yKTsKCXBzbGx3X2kycigyLCBtbTUpOwoKCXBtdWxod19tMnIoUlRqcGVnX0M0LCBtbTUpOwkJCS8qIHozICovCgltb3ZxX3IycihtbTMsIG1tMCk7CQkJCQkJLyogY29weSB0bXA3ICovCgogICBtb3ZxX20ycigqKGRhdGFwdHIrMSksIG1tNyk7CglwYWRkd19yMnIobW0xLCBtbTQpOwkJCQkJCS8qIHoyICovCgoJcGFkZHdfcjJyKG1tMSwgbW0yKTsJCQkJCQkvKiB6NCAqLwoKCXBhZGR3X3IycihtbTUsIG1tMCk7CQkJCQkJLyogejExICovCglwc3Vid19yMnIobW01LCBtbTMpOwkJCQkJCS8qIHoxMyAqLwoKCS8qIHN0YWdlIDYgKi8KCgltb3ZxX3IycihtbTMsIG1tNSk7CQkJCQkJLyogY29weSB6MTMgKi8KCXBzdWJ3X3IycihtbTQsIG1tMyk7CQkJCQkJLyogeTM9ejEzIC0gejIgKi8KCglwYWRkd19yMnIobW00LCBtbTUpOwkJCQkJCS8qIHk1PXoxMyArIHoyICovCgltb3ZxX3IycihtbTAsIG1tNik7CQkJCQkJLyogY29weSB6MTEgKi8KCiAgIG1vdnFfcjJtKG1tMywgKihkYXRhcHRyKzYpKTsgCQkJLypzYXZlIHkzICovCglwc3Vid19yMnIobW0yLCBtbTApOwkJCQkJCS8qIHk3PXoxMSAtIHo0ICovCgogICBtb3ZxX3IybShtbTUsICooZGF0YXB0cisxMCkpOyAJCS8qc2F2ZSB5NSAqLwoJcGFkZHdfcjJyKG1tMiwgbW02KTsJCQkJCQkvKiB5MT16MTEgKyB6NCAqLwoKICAgbW92cV9yMm0obW0wLCAqKGRhdGFwdHIrMTQpKTsgCQkvKnNhdmUgeTcgKi8KCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkgKiAgRW5kIG9mIDFzdCA0IHJvd3MKCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICBtb3ZxX20ycigqKGRhdGFwdHIrMyksIG1tMSk7IAkJCS8qIGxvYWQgeDEgIDogc3RhZ2UgMSAqLwoJbW92cV9yMnIobW03LCBtbTApOwkJCQkJCS8qIGNvcHkgeDAgKi8KCiAgIG1vdnFfcjJtKG1tNiwgKihkYXRhcHRyKzIpKTsgCQkJLypzYXZlIHkxICovCgogICBtb3ZxX20ycigqKGRhdGFwdHIrNSksIG1tMik7IAkJCS8qIGxvYWQgeDIgIDogc3RhZ2UgMSAqLwoJbW92cV9yMnIobW0xLCBtbTYpOwkJCQkJCS8qIGNvcHkgeDEgKi8KCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrMTUpLCBtbTApOyAgCQkvKiB0bXAwMCA9IHgwICsgeDcgKi8KCiAgIG1vdnFfbTJyKCooZGF0YXB0cis3KSwgbW0zKTsgCQkJLyogbG9hZCB4MyAgOiBzdGFnZSAxICovCgltb3ZxX3IycihtbTIsIG1tNSk7CQkJCQkJLyogY29weSB4MiAqLwoKICAgcHN1YndfbTJyKCooZGF0YXB0cisxNSksIG1tNyk7ICAJCS8qIHRtcDA3ID0geDAgLSB4NyAqLwoJbW92cV9yMnIobW0zLCBtbTQpOwkJCQkJCS8qIGNvcHkgeDMgKi8KCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrMTMpLCBtbTEpOyAgCQkvKiB0bXAwMSA9IHgxICsgeDYgKi8KCgltb3ZxX3IybShtbTcsIHRtcDcpOwkJCQkJCS8qIHNhdmUgdG1wMDcgKi8KCW1vdnFfcjJyKG1tMCwgbW03KTsJCQkJCQkvKiBjb3B5IHRtcDAwICovCgogICBwc3Vid19tMnIoKihkYXRhcHRyKzEzKSwgbW02KTsgIAkJLyogdG1wMDYgPSB4MSAtIHg2ICovCgogICAvKiBzdGFnZSAyLCBFdmVuIFBhcnQgKi8KCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrOSksIG1tMyk7ICAJCS8qIHRtcDAzID0geDMgKyB4NCAqLwoKCW1vdnFfcjJtKG1tNiwgdG1wNik7CQkJCQkJLyogc2F2ZSB0bXAwNyAqLwoJbW92cV9yMnIobW0xLCBtbTYpOwkJCQkJCS8qIGNvcHkgdG1wMDEgKi8KCiAgIHBhZGR3X20ycigqKGRhdGFwdHIrMTEpLCBtbTIpOyAgCQkvKiB0bXAwMiA9IHgyICsgeDUgKi8KCXBhZGR3X3IycihtbTMsIG1tMCk7ICAgICAgICAgICAgICAJLyogdG1wMTAgPSB0bXAwMCArIHRtcDAzICovCgoJcHN1YndfcjJyKG1tMywgbW03KTsgICAgICAgICAgICAgIAkvKiB0bXAxMyA9IHRtcDAwIC0gdG1wMDMgKi8KCiAgIHBzdWJ3X20ycigqKGRhdGFwdHIrOSksIG1tNCk7ICAJCS8qIHRtcDA0ID0geDMgLSB4NCAqLwoJcHN1YndfcjJyKG1tMiwgbW02KTsgICAgICAgICAgICAgIAkvKiB0bXAxMiA9IHRtcDAxIC0gdG1wMDIgKi8KCglwYWRkd19yMnIobW0yLCBtbTEpOyAgICAgICAgICAgICAgCS8qIHRtcDExID0gdG1wMDEgKyB0bXAwMiAqLwoKICAgcHN1YndfbTJyKCooZGF0YXB0cisxMSksIG1tNSk7ICAJCS8qIHRtcDA1ID0geDIgLSB4NSAqLwoJcGFkZHdfcjJyKG1tNywgbW02KTsgICAgICAgICAgICAgIAkvKiAgdG1wMTIgKyB0bXAxMyAqLwoKICAgLyogc3RhZ2UgMywgRXZlbiBhbmQgc3RhZ2UgNCAmIDUgZXZlbiAqLwoKCW1vdnFfbTJyKHRtcDYsIG1tMik7ICAgICAgICAgICAgCQkvKiBsb2FkIHRtcDYgKi8KCW1vdnFfcjJyKG1tMCwgbW0zKTsJCQkJCQkvKiBjb3B5IHRtcDEwICovCgoJcHNsbHdfaTJyKDIsIG1tNik7CQkJLyogc2hpZnQgejEgKi8KCXBhZGR3X3IycihtbTEsIG1tMCk7ICAgIAkJCQkvKiB5MD10bXAxMCArIHRtcDExICovCgoJcG11bGh3X20ycihSVGpwZWdfQzQsIG1tNik7ICAgIAkJLyogejEgKi8KCXBzdWJ3X3IycihtbTEsIG1tMyk7ICAgIAkJCQkvKiB5ND10bXAxMCAtIHRtcDExICovCgogICBtb3ZxX3IybShtbTAsICooZGF0YXB0cisxKSk7IAkJCS8qc2F2ZSB5MCAqLwoJbW92cV9yMnIobW03LCBtbTApOwkJCQkJCS8qIGNvcHkgdG1wMTMgKi8KICAKCS8qIG9kZCBwYXJ0ICovCgogICBtb3ZxX3IybShtbTMsICooZGF0YXB0cis5KSk7IAkJCS8qc2F2ZSB5NCAqLwoJcGFkZHdfcjJyKG1tNSwgbW00KTsgICAgICAgICAgICAgIAkvKiB0bXAxMCA9IHRtcDQgKyB0bXA1ICovCgoJbW92cV9tMnIodG1wNywgbW0zKTsgICAgICAgICAgICAJCS8qIGxvYWQgdG1wNyAqLwoJcGFkZHdfcjJyKG1tNiwgbW0wKTsgICAgICAgICAgICAgIAkvKiB0bXAzMiA9IHRtcDEzICsgejEgKi8KCglwYWRkd19yMnIobW0yLCBtbTUpOyAgICAgICAgICAgICAgCS8qIHRtcDExID0gdG1wNSArIHRtcDYgKi8KCXBzdWJ3X3IycihtbTYsIG1tNyk7ICAgICAgICAgICAgICAJLyogdG1wMzMgPSB0bXAxMyAtIHoxICovCgogICBtb3ZxX3IybShtbTAsICooZGF0YXB0cis1KSk7IAkJCS8qc2F2ZSB5MiAqLwoJcGFkZHdfcjJyKG1tMywgbW0yKTsgICAgICAgICAgICAgIAkvKiB0bXAxMiA9IHRtcDYgKyB0bXA3ICovCgoJLyogc3RhZ2UgNCAqLwoKICAgbW92cV9yMm0obW03LCAqKGRhdGFwdHIrMTMpKTsgCQkvKnNhdmUgeTYgKi8KCW1vdnFfcjJyKG1tNCwgbW0xKTsJCQkJCQkvKiBjb3B5IHRtcDEwICovCgoJcHN1YndfcjJyKG1tMiwgbW0xKTsgICAgCQkJCS8qIHRtcDEwIC0gdG1wMTIgKi8KCXBzbGx3X2kycigyLCBtbTQpOwkJCS8qIHNoaWZ0IHRtcDEwICovCgoJbW92cV9tMnIoUlRqcGVnX0MybUM2LCBtbTApOwkJCS8qIGxvYWQgQzJtQzYgKi8KCXBzbGx3X2kycigyLCBtbTEpOwkJCS8qIHNoaWZ0ICh0bXAxMC10bXAxMikgKi8KCglwbXVsaHdfbTJyKFJUanBlZ19DNiwgbW0xKTsgICAgCQkvKiB6NSAqLwoJcHNsbHdfaTJyKDIsIG1tNSk7CQkJLyogcHJlcGFyZSBmb3IgbXVsdGlwbHkgICovCgoJcG11bGh3X3IycihtbTAsIG1tNCk7CQkJCQkvKiBtdWx0aXBseSBieSBjb252ZXJ0ZWQgcmVhbCAqLwoKCS8qIHN0YWdlIDUgKi8KCglwbXVsaHdfbTJyKFJUanBlZ19DNCwgbW01KTsJCQkvKiB6MyAqLwoJcHNsbHdfaTJyKDIsIG1tMik7CQkJLyogcHJlcGFyZSBmb3IgbXVsdGlwbHkgICovCgoJcG11bGh3X20ycihSVGpwZWdfQzJwQzYsIG1tMik7CQkvKiBtdWx0aXBseSAqLwoJbW92cV9yMnIobW0zLCBtbTApOwkJCQkJCS8qIGNvcHkgdG1wNyAqLwoKCW1vdnFfbTJyKCooZGF0YXB0cis5KSwgbW03KTsJCSAJLyogbTAzOm0wMnxtMDE6bTAwIC0gZmlyc3QgbGluZSAobGluZSA0KWFuZCBjb3B5IGludG8gbW03ICovCglwYWRkd19yMnIobW0xLCBtbTQpOwkJCQkJCS8qIHoyICovCgoJcGFkZHdfcjJyKG1tNSwgbW0wKTsJCQkJCQkvKiB6MTEgKi8KCXBzdWJ3X3IycihtbTUsIG1tMyk7CQkJCQkJLyogejEzICovCgoJLyogc3RhZ2UgNiAqLwoKCW1vdnFfcjJyKG1tMywgbW01KTsJCQkJCQkvKiBjb3B5IHoxMyAqLwoJcGFkZHdfcjJyKG1tMSwgbW0yKTsJCQkJCQkvKiB6NCAqLwoKCW1vdnFfcjJyKG1tMCwgbW02KTsJCQkJCQkvKiBjb3B5IHoxMSAqLwoJcHN1YndfcjJyKG1tNCwgbW01KTsJCQkJCQkvKiB5MyAqLwoKCXBhZGR3X3IycihtbTIsIG1tNik7CQkJCQkJLyogeTEgKi8KCXBhZGR3X3IycihtbTQsIG1tMyk7CQkJCQkJLyogeTUgKi8KCiAgIG1vdnFfcjJtKG1tNSwgKihkYXRhcHRyKzcpKTsgCQkJLypzYXZlIHkzICovCglwc3Vid19yMnIobW0yLCBtbTApOwkJCQkJCS8qIHnoPXoxMSAtIHo0ICovCgogICBtb3ZxX3IybShtbTMsICooZGF0YXB0cisxMSkpOyAJCS8qc2F2ZSB5NSAqLwoKICAgbW92cV9yMm0obW02LCAqKGRhdGFwdHIrMykpOyAJCQkvKnNhdmUgeTEgKi8KCiAgIG1vdnFfcjJtKG1tMCwgKihkYXRhcHRyKzE1KSk7IAkJLypzYXZlIHk3ICovCgkKCiNlbmRpZgp9CgojZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgKChfX3MzMikgIDI3NykJCS8qIEZJWCgxLjA4MjM5MjIwMCkgKi8KI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgICgoX19zMzIpICAzNjIpCQkvKiBGSVgoMS40MTQyMTM1NjIpICovCiNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKF9fczMyKSAgNDczKQkJLyogRklYKDEuODQ3NzU5MDY1KSAqLwojZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgKChfX3MzMikgIDY2OSkJCS8qIEZJWCgyLjYxMzEyNTkzMCkgKi8KCiNkZWZpbmUgREVTQ0FMRSh4KSAoX19zMTYpKCAoKHgpKzQpID4+IDMpCgovKiBjbGlwIHl1diB0byAxNi4uMjM1IChzaG91bGQgYmUgMTYuLjI0MCBmb3IgY3IvY2IgYnV0IC4uLiAqLwoKI2RlZmluZSBSTCh4KSAoKHgpPjIzNSkgPyAyMzUgOiAoKCh4KTwxNikgPyAxNiA6ICh4KSkKI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKChfX3MzMikgKCh2YXIpICogKGNvbnN0KSkgKyAxMjgpPj44KQoKdm9pZCBSVGpwZWdfaWRjdF9pbml0KHZvaWQpCnsKIGludCBpOwogCiBmb3IoaT0wOyBpPDY0OyBpKyspCiB7CiAgUlRqcGVnX2xpcXRbaV09KChfX3U2NClSVGpwZWdfbGlxdFtpXSpSVGpwZWdfYWFuX3RhYltpXSk+PjMyOwogIFJUanBlZ19jaXF0W2ldPSgoX191NjQpUlRqcGVnX2NpcXRbaV0qUlRqcGVnX2Fhbl90YWJbaV0pPj4zMjsKIH0KfQoKdm9pZCBSVGpwZWdfaWRjdChfX3U4ICpvZGF0YSwgX19zMTYgKmRhdGEsIGludCByc2tpcCkKewojaWZkZWYgSEFWRV9MSUJNTVgKCnN0YXRpYyBtbXhfdCBmaXhfMTQxCQkJPSAobW14X3QpKGxvbmcgbG9uZykweDVhODI1YTgyNWE4MjVhODJMTDsKc3RhdGljIG1teF90IGZpeF8xODRuMjYxCT0gKG1teF90KShsb25nIGxvbmcpMHhjZjA0Y2YwNGNmMDRjZjA0TEw7CnN0YXRpYyBtbXhfdCBmaXhfMTg0CQkJPSAobW14X3QpKGxvbmcgbG9uZykweDc2NDE3NjQxNzY0MTc2NDFMTDsKc3RhdGljIG1teF90IGZpeF9uMTg0CQk9IChtbXhfdCkobG9uZyBsb25nKTB4ODk2Zjg5NmY4OTZmODk2ZkxMOwpzdGF0aWMgbW14X3QgZml4XzEwOG4xODQJPSAobW14X3QpKGxvbmcgbG9uZykweGNmMDRjZjA0Y2YwNGNmMDRMTDsKCiAgbW14X3Qgd29ya3NwYWNlWzY0XTsKICBtbXhfdCAqd3NwdHIgPSB3b3Jrc3BhY2U7CiAgcmVnaXN0ZXIgbW14X3QgKmRhdGFwdHIgPSAobW14X3QgKilvZGF0YTsKICBtbXhfdCAqaWRhdGEgPSAobW14X3QgKilkYXRhOwoKICByc2tpcCA9IHJza2lwPj4zOwovKgogKiBQZXJmb3JtIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCiAqLwoKICAgIC8qIE9kZCBwYXJ0ICovCgoJbW92cV9tMnIoKihpZGF0YSsxMCksIG1tMSk7CS8qIGxvYWQgaWRhdGFbRENUU0laRSo1XSAqLwoKCW1vdnFfbTJyKCooaWRhdGErNiksIG1tMCk7CQkvKiBsb2FkIGlkYXRhW0RDVFNJWkUqM10gKi8KCgltb3ZxX20ycigqKGlkYXRhKzIpLCBtbTMpOwkJLyogbG9hZCBpZGF0YVtEQ1RTSVpFKjFdICovCgoJbW92cV9yMnIobW0xLCBtbTIpOwkJCQkvKiBjb3B5IHRtcDYJOiBwaGFzZSA2ICovICovCgoJbW92cV9tMnIoKihpZGF0YSsxNCksIG1tNCk7CS8qIGxvYWQgaWRhdGFbRENUU0laRSo3XSAqLwoKCXBhZGR3X3IycihtbTAsIG1tMSk7CQkJCS8qIHoxMyA9IHRtcDYgKyB0bXA1OyAqLwoKCXBzdWJ3X3IycihtbTAsIG1tMik7CQkJCS8qIHoxMCA9IHRtcDYgLSB0bXA1ICAgICovCgoJcHNsbHdfaTJyKDIsIG1tMik7CQkJCS8qIHNoaWZ0IHoxMCAqLwoJbW92cV9yMnIobW0yLCBtbTApOyAJCQkJLyogY29weSB6MTAgKi8KCglwbXVsaHdfbTJyKGZpeF8xODRuMjYxLCBtbTIpOwkvKiBNVUxUSVBMWSggejEyLCBGSVhfMV84NDc3NTkwNjUpOyA6IDIqYzIgKi8KCW1vdnFfcjJyKG1tMywgbW01KTsJCQkJLyogY29weSB0bXA0ICovCgoJcG11bGh3X20ycihmaXhfbjE4NCwgbW0wKTsJCS8qIE1VTFRJUExZKHoxMCwgLUZJWF8xXzg0Nzc1OTA2NSk7IDogMipjMiAqLwoJcGFkZHdfcjJyKG1tNCwgbW0zKTsJCQkJLyogejExID0gdG1wNCArIHRtcDc7ICovCgoJbW92cV9yMnIobW0zLCBtbTYpOwkJCQkvKiBjb3B5IHoxMQkJCTogcGhhc2UgNSAqLwoJcHN1YndfcjJyKG1tNCwgbW01KTsJCQkJLyogejEyID0gdG1wNCAtIHRtcDc7ICovCgoJcHN1YndfcjJyKG1tMSwgbW02KTsJCQkJLyogejExLXoxMyAqLwoJcHNsbHdfaTJyKDIsIG1tNSk7CQkJCS8qCXNoaWZ0IHoxMiAqLwoKCW1vdnFfbTJyKCooaWRhdGErMTIpLCBtbTQpOwkvKiBsb2FkIGlkYXRhW0RDVFNJWkUqNl0sIGV2ZW4gcGFydCAqLwogCW1vdnFfcjJyKG1tNSwgbW03KTsJCQkJLyoJY29weSB6MTIgKi8KCglwbXVsaHdfbTJyKGZpeF8xMDhuMTg0LCBtbTUpOyAvKglNVUxUKHoxMiwgKEZJWF8xXzA4LUZJWF8xXzg0KSkgLy8tIHo1OyAyKihjMi1jNik6IGV2ZW4gcGFydCAqLwoJcGFkZHdfcjJyKG1tMSwgbW0zKTsJCQkJLyogdG1wNyA9IHoxMSArIHoxMzsJICovCgoJLypvayAqLwoKICAgIC8qIEV2ZW4gcGFydCAqLwoJcG11bGh3X20ycihmaXhfMTg0LCBtbTcpOwkJLyogTVVMVElQTFkoejEwLChGSVhfMV84NDc3NTkwNjUgLSBGSVhfMl82MTMxMjU5MzApKSAvLysgejU7IC0yKihjMitjNikgKi8KCXBzbGx3X2kycigyLCBtbTYpOwoKCW1vdnFfbTJyKCooaWRhdGErNCksIG1tMSk7CQkvKiBsb2FkIGlkYXRhW0RDVFNJWkUqMl0gKi8KCglwYWRkd19yMnIobW01LCBtbTApOwkJCQkvKgl0bXAxMCAqLwoKCXBhZGR3X3IycihtbTcsIG1tMik7CQkJCS8qIHRtcDEyICovCgoJcG11bGh3X20ycihmaXhfMTQxLCBtbTYpOwkJLyogdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IDIqYzQgKi8KCXBzdWJ3X3IycihtbTMsIG1tMik7CQkJCS8qIHRtcDYgPSB0bXAxMiAtIHRtcDcgKi8KCgltb3ZxX3IycihtbTEsIG1tNSk7CQkJCS8qIGNvcHkgdG1wMSAqLwoJcGFkZHdfcjJyKG1tNCwgbW0xKTsJCQkJLyogdG1wMTM9IHRtcDEgKyB0bXAzOyBwaGFzZXMgNS0zICovCgoJcHN1YndfcjJyKG1tNCwgbW01KTsJCQkJLyogdG1wMS10bXAzICovCglwc3Vid19yMnIobW0yLCBtbTYpOwkJCQkvKiB0bXA1ID0gdG1wMTEgLSB0bXA2OyAqLwoKCW1vdnFfcjJtKG1tMSwgKih3c3B0cikpOwkJLyogc2F2ZSB0bXAxMyBpbiB3b3Jrc3BhY2UgKi8KCXBzbGx3X2kycigyLCBtbTUpOwkvKiBzaGlmdCB0bXAxLXRtcDMgKi8KICAgIAoJbW92cV9tMnIoKihpZGF0YSksIG1tNyk7IAkJLyogbG9hZCBpZGF0YVtEQ1RTSVpFKjBdICovCgoJcG11bGh3X20ycihmaXhfMTQxLCBtbTUpOwkJLyogTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWF8xXzQxNDIxMzU2MikgKi8KCXBhZGR3X3IycihtbTYsIG1tMCk7CQkJCS8qIHRtcDQgPSB0bXAxMCArIHRtcDU7ICovCgoJbW92cV9tMnIoKihpZGF0YSs4KSwgbW00KTsgCS8qIGxvYWQgaWRhdGFbRENUU0laRSo0XSAqLwoJCglwc3Vid19yMnIobW0xLCBtbTUpOwkJCQkvKiB0bXAxMiA9IE1VTFRJUExZKHRtcDEgLSB0bXAzLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7IDIqYzQgKi8KCgltb3ZxX3IybShtbTAsICood3NwdHIrNCkpOwkJLyogc2F2ZSB0bXA0IGluIHdvcmtzcGFjZSAqLwoJbW92cV9yMnIobW03LCBtbTEpOwkJCSAJLyogY29weSB0bXAwCTogcGhhc2UgMyAqLwoKCW1vdnFfcjJtKG1tNSwgKih3c3B0cisyKSk7CQkvKiBzYXZlIHRtcDEyIGluIHdvcmtzcGFjZSAqLwoJcHN1YndfcjJyKG1tNCwgbW0xKTsJCQkJLyogdG1wMTEgPSB0bXAwIC0gdG1wMjsgICovCgoJcGFkZHdfcjJyKG1tNCwgbW03KTsJCQkJLyogdG1wMTAgPSB0bXAwICsgdG1wMjsgKi8KICAgbW92cV9yMnIobW0xLCBtbTUpOwkJCQkvKiBjb3B5IHRtcDExICovCgkKCXBhZGR3X20ycigqKHdzcHRyKzIpLCBtbTEpOwkvKiB0bXAxID0gdG1wMTEgKyB0bXAxMjsgKi8KCW1vdnFfcjJyKG1tNywgbW00KTsJCQkJLyogY29weSB0bXAxMAkJOiBwaGFzZSAyICovCgoJcGFkZHdfbTJyKCood3NwdHIpLCBtbTcpOwkJLyogdG1wMCA9IHRtcDEwICsgdG1wMTM7CSAqLwoKCXBzdWJ3X20ycigqKHdzcHRyKSwgbW00KTsJCS8qIHRtcDMgPSB0bXAxMCAtIHRtcDEzOyAqLwoJbW92cV9yMnIobW03LCBtbTApOwkJCQkvKgljb3B5IHRtcDAgKi8KCglwc3Vid19tMnIoKih3c3B0cisyKSwgbW01KTsJLyogdG1wMiA9IHRtcDExIC0gdG1wMTI7ICovCglwYWRkd19yMnIobW0zLCBtbTcpOwkJCQkvKgl3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsgKi8KCQoJcHN1YndfcjJyKG1tMywgbW0wKTsJCQkJLyogd3NwdHJbRENUU0laRSo3XSA9IChpbnQpICh0bXAwIC0gdG1wNyk7ICovCgoJbW92cV9yMm0obW03LCAqKHdzcHRyKSk7CQkvKgl3c3B0cltEQ1RTSVpFKjBdICovCgltb3ZxX3IycihtbTEsIG1tMyk7CQkJCS8qCWNvcHkgdG1wMSAqLwoKCW1vdnFfcjJtKG1tMCwgKih3c3B0cisxNCkpOwkJLyogd3NwdHJbRENUU0laRSo3XSAqLwoJcGFkZHdfcjJyKG1tMiwgbW0xKTsJCQkJLyogd3NwdHJbRENUU0laRSoxXSA9IChpbnQpICh0bXAxICsgdG1wNik7ICovCgoJcHN1YndfcjJyKG1tMiwgbW0zKTsJCQkJLyogd3NwdHJbRENUU0laRSo2XSA9IChpbnQpICh0bXAxIC0gdG1wNik7ICovCgoJbW92cV9yMm0obW0xLCAqKHdzcHRyKzIpKTsJCS8qIHdzcHRyW0RDVFNJWkUqMV0gKi8KCW1vdnFfcjJyKG1tNCwgbW0xKTsJCQkJLyoJY29weSB0bXAzICovCgoJbW92cV9yMm0obW0zLCAqKHdzcHRyKzEyKSk7CQkvKiB3c3B0cltEQ1RTSVpFKjZdICovCgoJcGFkZHdfbTJyKCood3NwdHIrNCksIG1tNCk7CS8qIHdzcHRyW0RDVFNJWkUqNF0gPSAoaW50KSAodG1wMyArIHRtcDQpOyAqLwoKCXBzdWJ3X20ycigqKHdzcHRyKzQpLCBtbTEpOyAJLyogd3NwdHJbRENUU0laRSozXSA9IChpbnQpICh0bXAzIC0gdG1wNCk7ICovCgoJbW92cV9yMm0obW00LCAqKHdzcHRyKzgpKTsJCQoJbW92cV9yMnIobW01LCBtbTcpOwkJCQkvKiBjb3B5IHRtcDIgKi8KCglwYWRkd19yMnIobW02LCBtbTUpOwkJCQkvKiB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KSAqLwoKCW1vdnFfcjJtKG1tMSwgKih3c3B0cis2KSk7CQoJcHN1YndfcjJyKG1tNiwgbW03KTsJCQkJLyoJd3NwdHJbRENUU0laRSo1XSA9IChpbnQpICh0bXAyIC0gdG1wNSk7ICovCgoJbW92cV9yMm0obW01LCAqKHdzcHRyKzQpKTsJCgoJbW92cV9yMm0obW03LCAqKHdzcHRyKzEwKSk7CQkKCgkvKm9rICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCWlkYXRhKys7Cgl3c3B0cisrOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCW1vdnFfbTJyKCooaWRhdGErMTApLCBtbTEpOwkvKiBsb2FkIGlkYXRhW0RDVFNJWkUqNV0gKi8KCgltb3ZxX20ycigqKGlkYXRhKzYpLCBtbTApOwkJLyogbG9hZCBpZGF0YVtEQ1RTSVpFKjNdICovCgoJbW92cV9tMnIoKihpZGF0YSsyKSwJbW0zKTsJCS8qIGxvYWQgaWRhdGFbRENUU0laRSoxXSAqLwoJbW92cV9yMnIobW0xLCBtbTIpOwkJCQkvKgljb3B5IHRtcDYJOiBwaGFzZSA2ICovICovCgoJbW92cV9tMnIoKihpZGF0YSsxNCksCW1tNCk7CQkvKiBsb2FkIGlkYXRhW0RDVFNJWkUqN10gKi8KCXBhZGR3X3IycihtbTAsIG1tMSk7CQkJCS8qCXoxMyA9IHRtcDYgKyB0bXA1OyAqLwoKCXBzdWJ3X3IycihtbTAsIG1tMik7CQkJCS8qCXoxMCA9IHRtcDYgLSB0bXA1ICAgICovCgoJcHNsbHdfaTJyKDIsIG1tMik7CQkJCS8qCXNoaWZ0IHoxMCAqLwoJbW92cV9yMnIobW0yLCBtbTApOwkJCQkvKgljb3B5IHoxMCAqLwoKCXBtdWxod19tMnIoZml4XzE4NG4yNjEsIG1tMik7CS8qIE1VTFRJUExZKCB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IDogMipjMiAqLwoJbW92cV9yMnIobW0zLCBtbTUpOwkJCQkvKgljb3B5IHRtcDQgKi8KCglwbXVsaHdfbTJyKGZpeF9uMTg0LCBtbTApOwkJLyogTVVMVElQTFkoejEwLCAtRklYXzFfODQ3NzU5MDY1KTsgOiAyKmMyICovCglwYWRkd19yMnIobW00LCBtbTMpOwkJCQkvKiB6MTEgPSB0bXA0ICsgdG1wNzsgKi8KCgltb3ZxX3IycihtbTMsIG1tNik7CQkJCS8qIGNvcHkgejExCQkJOiBwaGFzZSA1ICovCglwc3Vid19yMnIobW00LCBtbTUpOwkJCQkvKgl6MTIgPSB0bXA0IC0gdG1wNzsgKi8KCglwc3Vid19yMnIobW0xLCBtbTYpOwkJCQkvKiB6MTEtejEzICovCglwc2xsd19pMnIoMiwgbW01KTsJCQkJLyoJc2hpZnQgejEyICovCgoJbW92cV9tMnIoKihpZGF0YSsxMiksIG1tNCk7CS8qIGxvYWQgaWRhdGFbRENUU0laRSo2XSwgZXZlbiBwYXJ0ICovCiAJbW92cV9yMnIobW01LCBtbTcpOwkJCQkvKiBjb3B5IHoxMiAqLwoKCXBtdWxod19tMnIoZml4XzEwOG4xODQsIG1tNSk7CS8qIE1VTFQoejEyLCAoRklYXzFfMDgtRklYXzFfODQpKSAvLy0gejU7IDIqKGMyLWM2KSBldmVuIHBhcnQgKi8KCXBhZGR3X3IycihtbTEsIG1tMyk7CQkJCS8qIHRtcDcgPSB6MTEgKyB6MTM7CSAqLwoKCS8qb2sgKi8KCiAgICAvKiBFdmVuIHBhcnQgKi8KCXBtdWxod19tMnIoZml4XzE4NCwgbW03KTsJCS8qIE1VTFRJUExZKHoxMCwoRklYXzFfODQ3NzU5MDY1IC0gRklYXzJfNjEzMTI1OTMwKSkgLy8rIHo1OyAtMiooYzIrYzYpICovCglwc2xsd19pMnIoMiwgbW02KTsKCgltb3ZxX20ycigqKGlkYXRhKzQpLCBtbTEpOwkJLyogbG9hZCBpZGF0YVtEQ1RTSVpFKjJdICovCgoJcGFkZHdfcjJyKG1tNSwgbW0wKTsJCQkJLyoJdG1wMTAgKi8KCglwYWRkd19yMnIobW03LCBtbTIpOwkJCQkvKiB0bXAxMiAqLwoKCXBtdWxod19tMnIoZml4XzE0MSwgbW02KTsJCS8qIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOyAyKmM0ICovCglwc3Vid19yMnIobW0zLCBtbTIpOwkJCQkvKiB0bXA2ID0gdG1wMTIgLSB0bXA3ICovCgoJbW92cV9yMnIobW0xLCBtbTUpOwkJCQkvKiBjb3B5IHRtcDEgKi8KCXBhZGR3X3IycihtbTQsIG1tMSk7CQkJCS8qIHRtcDEzPSB0bXAxICsgdG1wMzsJcGhhc2VzIDUtMyAqLwoKCXBzdWJ3X3IycihtbTQsIG1tNSk7CQkJCS8qIHRtcDEtdG1wMyAqLwoJcHN1YndfcjJyKG1tMiwgbW02KTsJCQkJLyogdG1wNSA9IHRtcDExIC0gdG1wNjsgKi8KCgltb3ZxX3IybShtbTEsICood3NwdHIpKTsJCS8qIHNhdmUgdG1wMTMgaW4gd29ya3NwYWNlICovCglwc2xsd19pMnIoMiwgbW01KTsgCQkJCS8qIHNoaWZ0IHRtcDEtdG1wMyAqLwogICAgCgltb3ZxX20ycigqKGlkYXRhKSwgbW03KTsJCS8qIGxvYWQgaWRhdGFbRENUU0laRSowXSAqLwoJcGFkZHdfcjJyKG1tNiwgbW0wKTsJCQkJLyogdG1wNCA9IHRtcDEwICsgdG1wNTsgKi8KCglwbXVsaHdfbTJyKGZpeF8xNDEsIG1tNSk7CQkvKiBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAqLwoKCW1vdnFfbTJyKCooaWRhdGErOCksIG1tNCk7ICAgIC8qIGxvYWQgaWRhdGFbRENUU0laRSo0XSAqLwoJCglwc3Vid19yMnIobW0xLCBtbTUpOwkJCQkvKiB0bXAxMiA9IE1VTFRJUExZKHRtcDEgLSB0bXAzLCBGSVhfMV80MTQyMTM1NjIpIC0gdG1wMTM7IDIqYzQgKi8KCgltb3ZxX3IybShtbTAsICood3NwdHIrNCkpOwkJLyogc2F2ZSB0bXA0IGluIHdvcmtzcGFjZSAqLwoJbW92cV9yMnIobW03LCBtbTEpOwkJCQkvKiBjb3B5IHRtcDA6IHBoYXNlIDMgKi8KCgltb3ZxX3IybShtbTUsICood3NwdHIrMikpOwkJLyogc2F2ZSB0bXAxMiBpbiB3b3Jrc3BhY2UgKi8KCXBzdWJ3X3IycihtbTQsIG1tMSk7CQkJCS8qIHRtcDExID0gdG1wMCAtIHRtcDI7ICAqLwoKCXBhZGR3X3IycihtbTQsIG1tNyk7CQkJCS8qIHRtcDEwID0gdG1wMCArIHRtcDI7ICovCiAgIG1vdnFfcjJyKG1tMSwgbW01KTsJCQkJLyogY29weSB0bXAxMSAqLwoJCglwYWRkd19tMnIoKih3c3B0cisyKSwgbW0xKTsJLyogdG1wMSA9IHRtcDExICsgdG1wMTI7ICovCgltb3ZxX3IycihtbTcsIG1tNCk7CQkJCS8qIGNvcHkgdG1wMTA6IHBoYXNlIDIgKi8KCglwYWRkd19tMnIoKih3c3B0ciksIG1tNyk7CQkvKiB0bXAwID0gdG1wMTAgKyB0bXAxMzsJICovCgoJcHN1YndfbTJyKCood3NwdHIpLCBtbTQpOwkJLyogdG1wMyA9IHRtcDEwIC0gdG1wMTM7ICovCgltb3ZxX3IycihtbTcsIG1tMCk7CQkJCS8qIGNvcHkgdG1wMCAqLwoKCXBzdWJ3X20ycigqKHdzcHRyKzIpLCBtbTUpOwkvKiB0bXAyID0gdG1wMTEgLSB0bXAxMjsgKi8KCXBhZGR3X3IycihtbTMsIG1tNyk7CQkJCS8qIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSAodG1wMCArIHRtcDcpOyAqLwoJCglwc3Vid19yMnIobW0zLCBtbTApOwkJCQkvKiB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsgKi8KCgltb3ZxX3IybShtbTcsICood3NwdHIpKTsJCS8qIHdzcHRyW0RDVFNJWkUqMF0gKi8KCW1vdnFfcjJyKG1tMSwgbW0zKTsJCQkJLyogY29weSB0bXAxICovCgoJbW92cV9yMm0obW0wLCAqKHdzcHRyKzE0KSk7CQkvKiB3c3B0cltEQ1RTSVpFKjddICovCglwYWRkd19yMnIobW0yLCBtbTEpOwkJCQkvKiB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsgKi8KCglwc3Vid19yMnIobW0yLCBtbTMpOwkJCQkvKiB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsgKi8KCgltb3ZxX3IybShtbTEsICood3NwdHIrMikpOwkJLyogd3NwdHJbRENUU0laRSoxXSAqLwoJbW92cV9yMnIobW00LCBtbTEpOwkJCQkvKiBjb3B5IHRtcDMgKi8KCgltb3ZxX3IybShtbTMsICood3NwdHIrMTIpKTsJCS8qIHdzcHRyW0RDVFNJWkUqNl0gKi8KCglwYWRkd19tMnIoKih3c3B0cis0KSwgbW00KTsJLyogd3NwdHJbRENUU0laRSo0XSA9IChpbnQpICh0bXAzICsgdG1wNCk7ICovCgoJcHN1YndfbTJyKCood3NwdHIrNCksIG1tMSk7CS8qIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSAodG1wMyAtIHRtcDQpOyAqLwoKCW1vdnFfcjJtKG1tNCwgKih3c3B0cis4KSk7CQkKCW1vdnFfcjJyKG1tNSwgbW03KTsJCQkJLyogY29weSB0bXAyICovCgoJcGFkZHdfcjJyKG1tNiwgbW01KTsJCQkJLyogd3NwdHJbRENUU0laRSoyXSA9IChpbnQpICh0bXAyICsgdG1wNSkgKi8KCgltb3ZxX3IybShtbTEsICood3NwdHIrNikpOwkJCglwc3Vid19yMnIobW02LCBtbTcpOwkJCQkvKiB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsgKi8KCgltb3ZxX3IybShtbTUsICood3NwdHIrNCkpOwkKCgltb3ZxX3IybShtbTcsICood3NwdHIrMTApKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvKiBFdmVuIHBhcnQgKi8KCgl3c3B0ci0tOwoKLyogICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsgKi8KLyogICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsgKi8KLyogICAgdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsgKi8KLyogICAgdG1wMTQgPSAoKERDVEVMRU0pIHdzcHRyWzJdIC0gKERDVEVMRU0pIHdzcHRyWzZdKTsgKi8KCW1vdnFfbTJyKCood3NwdHIpLCBtbTApOwkJLyogd3NwdHJbMCwwXSxbMCwxXSxbMCwyXSxbMCwzXSAqLwoKCW1vdnFfbTJyKCood3NwdHIrMSksCW1tMSk7CQkvKiB3c3B0clswLDRdLFswLDVdLFswLDZdLFswLDddICovCgltb3ZxX3IycihtbTAsIG1tMik7CgkKCW1vdnFfbTJyKCood3NwdHIrMiksIG1tMyk7CQkvKiB3c3B0clsxLDBdLFsxLDFdLFsxLDJdLFsxLDNdICovCglwYWRkd19yMnIobW0xLCBtbTApOwkJCQkvKiB3c3B0clswLHRtcDEwXSxbeHh4XSxbMCx0bXAxM10sW3h4eF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzMpLCBtbTQpOwkJLyogd3NwdHJbMSw0XSxbMSw1XSxbMSw2XSxbMSw3XSAqLwoJcHN1YndfcjJyKG1tMSwgbW0yKTsJCQkJLyogd3NwdHJbMCx0bXAxMV0sW3h4eF0sWzAsdG1wMTRdLFt4eHhdICovCgoJbW92cV9yMnIobW0wLCBtbTYpOwoJbW92cV9yMnIobW0zLCBtbTUpOwoJCglwYWRkd19yMnIobW00LCBtbTMpOwkJCQkvKiB3c3B0clsxLHRtcDEwXSxbeHh4XSxbMSx0bXAxM10sW3h4eF0gKi8KCW1vdnFfcjJyKG1tMiwgbW0xKTsKCglwc3Vid19yMnIobW00LCBtbTUpOwkJCQkvKiB3c3B0clsxLHRtcDExXSxbeHh4XSxbMSx0bXAxNF0sW3h4eF0gKi8KCXB1bnBja2x3ZF9yMnIobW0zLCBtbTApOwkJLyogd3NwdHJbMCx0bXAxMF0sWzEsdG1wMTBdLFt4eHhdLFt4eHhdICovCgoJbW92cV9tMnIoKih3c3B0cis3KSwgbW03KTsJCS8qIHdzcHRyWzMsNF0sWzMsNV0sWzMsNl0sWzMsN10gKi8KCXB1bnBja2h3ZF9yMnIobW0zLCBtbTYpOwkJLyogd3NwdHJbMCx0bXAxM10sWzEsdG1wMTNdLFt4eHhdLFt4eHhdICovCgoJbW92cV9tMnIoKih3c3B0cis0KSwgbW0zKTsJCS8qIHdzcHRyWzIsMF0sWzIsMV0sWzIsMl0sWzIsM10gKi8KCXB1bnBja2xkcV9yMnIobW02LCBtbTApOwkJLyogd3NwdHJbMCx0bXAxMF0sWzEsdG1wMTBdLFswLHRtcDEzXSxbMSx0bXAxM10gKi8KCglwdW5wY2tsd2RfcjJyKG1tNSwgbW0xKTsJCS8qIHdzcHRyWzAsdG1wMTFdLFsxLHRtcDExXSxbeHh4XSxbeHh4XSAqLwoJbW92cV9yMnIobW0zLCBtbTQpOwoKCW1vdnFfbTJyKCood3NwdHIrNiksIG1tNik7CQkvKiB3c3B0clszLDBdLFszLDFdLFszLDJdLFszLDNdICovCglwdW5wY2tod2RfcjJyKG1tNSwgbW0yKTsJCS8qIHdzcHRyWzAsdG1wMTRdLFsxLHRtcDE0XSxbeHh4XSxbeHh4XSAqLwoKCW1vdnFfbTJyKCood3NwdHIrNSksIG1tNSk7CQkvKiB3c3B0clsyLDRdLFsyLDVdLFsyLDZdLFsyLDddICovCglwdW5wY2tsZHFfcjJyKG1tMiwgbW0xKTsJCS8qIHdzcHRyWzAsdG1wMTFdLFsxLHRtcDExXSxbMCx0bXAxNF0sWzEsdG1wMTRdICovCgoJCglwYWRkd19yMnIobW01LCBtbTMpOwkJCQkvKiB3c3B0clsyLHRtcDEwXSxbeHh4XSxbMix0bXAxM10sW3h4eF0gKi8KCW1vdnFfcjJyKG1tNiwgbW0yKTsKCglwc3Vid19yMnIobW01LCBtbTQpOwkJCQkvKiB3c3B0clsyLHRtcDExXSxbeHh4XSxbMix0bXAxNF0sW3h4eF0gKi8KCXBhZGR3X3IycihtbTcsIG1tNik7CQkJCS8qIHdzcHRyWzMsdG1wMTBdLFt4eHhdLFszLHRtcDEzXSxbeHh4XSAqLwoKCW1vdnFfcjJyKG1tMywgbW01KTsKCXB1bnBja2x3ZF9yMnIobW02LCBtbTMpOwkJLyogd3NwdHJbMix0bXAxMF0sWzMsdG1wMTBdLFt4eHhdLFt4eHhdICovCgkKCXBzdWJ3X3IycihtbTcsIG1tMik7CQkJCS8qIHdzcHRyWzMsdG1wMTFdLFt4eHhdLFszLHRtcDE0XSxbeHh4XSAqLwoJcHVucGNraHdkX3IycihtbTYsIG1tNSk7CQkvKiB3c3B0clsyLHRtcDEzXSxbMyx0bXAxM10sW3h4eF0sW3h4eF0gKi8KCgltb3ZxX3IycihtbTQsIG1tNyk7CglwdW5wY2tsZHFfcjJyKG1tNSwgbW0zKTsJCS8qIHdzcHRyWzIsdG1wMTBdLFszLHRtcDEwXSxbMix0bXAxM10sWzMsdG1wMTNdICovCgkJCQkJCSAKCXB1bnBja2x3ZF9yMnIobW0yLCBtbTQpOwkJLyogd3NwdHJbMix0bXAxMV0sWzMsdG1wMTFdLFt4eHhdLFt4eHhdICovCgoJcHVucGNraHdkX3IycihtbTIsIG1tNyk7CQkvKiB3c3B0clsyLHRtcDE0XSxbMyx0bXAxNF0sW3h4eF0sW3h4eF0gKi8KCglwdW5wY2tsZHFfcjJyKG1tNywgbW00KTsJCS8qIHdzcHRyWzIsdG1wMTFdLFszLHRtcDExXSxbMix0bXAxNF0sWzMsdG1wMTRdICovCgltb3ZxX3IycihtbTEsIG1tNik7CgoJLypvayAqLwoKLyoJbW0wID0gCTt3c3B0clswLHRtcDEwXSxbMSx0bXAxMF0sWzAsdG1wMTNdLFsxLHRtcDEzXSAqLwovKgltbTEgPQk7d3NwdHJbMCx0bXAxMV0sWzEsdG1wMTFdLFswLHRtcDE0XSxbMSx0bXAxNF0gKi8KCgoJbW92cV9yMnIobW0wLCBtbTIpOwoJcHVucGNraGRxX3IycihtbTQsIG1tNik7CQkvKiB3c3B0clswLHRtcDE0XSxbMSx0bXAxNF0sWzIsdG1wMTRdLFszLHRtcDE0XSAqLwoKCXB1bnBja2xkcV9yMnIobW00LCBtbTEpOwkJLyogd3NwdHJbMCx0bXAxMV0sWzEsdG1wMTFdLFsyLHRtcDExXSxbMyx0bXAxMV0gKi8KCXBzbGx3X2kycigyLCBtbTYpOwoKCXBtdWxod19tMnIoZml4XzE0MSwgbW02KTsKCXB1bnBja2xkcV9yMnIobW0zLCBtbTApOwkJLyogd3NwdHJbMCx0bXAxMF0sWzEsdG1wMTBdLFsyLHRtcDEwXSxbMyx0bXAxMF0gKi8KCglwdW5wY2toZHFfcjJyKG1tMywgbW0yKTsJCS8qIHdzcHRyWzAsdG1wMTNdLFsxLHRtcDEzXSxbMix0bXAxM10sWzMsdG1wMTNdICovCgltb3ZxX3IycihtbTAsIG1tNyk7CgovKiAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsgKi8KLyogICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7ICovCglwYWRkd19yMnIobW0yLCBtbTApOwkJCQkvKiBbMCx0bXAwXSxbMSx0bXAwXSxbMix0bXAwXSxbMyx0bXAwXSAqLwoJcHN1YndfcjJyKG1tMiwgbW03KTsJCQkJLyogWzAsdG1wM10sWzEsdG1wM10sWzIsdG1wM10sWzMsdG1wM10gKi8KCi8qICAgIHRtcDEyID0gTVVMVElQTFkodG1wMTQsIEZJWF8xXzQxNDIxMzU2MikgLSB0bXAxMzsgKi8KCXBzdWJ3X3IycihtbTIsIG1tNik7CQkJCS8qIHdzcHRyWzAsdG1wMTJdLFsxLHRtcDEyXSxbMix0bXAxMl0sWzMsdG1wMTJdICovCi8qICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOyAqLwovKiAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsgKi8KCW1vdnFfcjJyKG1tMSwgbW01KTsKCgkvKk9LICovCgogICAgLyogT2RkIHBhcnQgKi8KCi8qICAgIHoxMyA9IChEQ1RFTEVNKSB3c3B0cls1XSArIChEQ1RFTEVNKSB3c3B0clszXTsgKi8KLyogICAgejEwID0gKERDVEVMRU0pIHdzcHRyWzVdIC0gKERDVEVMRU0pIHdzcHRyWzNdOyAqLwovKiAgICB6MTEgPSAoRENURUxFTSkgd3NwdHJbMV0gKyAoRENURUxFTSkgd3NwdHJbN107ICovCi8qICAgIHoxMiA9IChEQ1RFTEVNKSB3c3B0clsxXSAtIChEQ1RFTEVNKSB3c3B0cls3XTsgKi8KCW1vdnFfbTJyKCood3NwdHIpLCBtbTMpOwkJLyogd3NwdHJbMCwwXSxbMCwxXSxbMCwyXSxbMCwzXSAqLwoJcGFkZHdfcjJyKG1tNiwgbW0xKTsJCQkJLyogWzAsdG1wMV0sWzEsdG1wMV0sWzIsdG1wMV0sWzMsdG1wMV0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzEpLCBtbTQpOwkJLyogd3NwdHJbMCw0XSxbMCw1XSxbMCw2XSxbMCw3XSAqLwoJcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJLyogWzAsdG1wMl0sWzEsdG1wMl0sWzIsdG1wMl0sWzMsdG1wMl0gKi8KCgltb3ZxX3IycihtbTMsIG1tNik7CglwdW5wY2tsZHFfcjJyKG1tNCwgbW0zKTsJCS8qIHdzcHRyWzAsMF0sWzAsMV0sWzAsNF0sWzAsNV0gKi8KCglwdW5wY2toZHFfcjJyKG1tNiwgbW00KTsJCS8qIHdzcHRyWzAsNl0sWzAsN10sWzAsMl0sWzAsM10gKi8KCW1vdnFfcjJyKG1tMywgbW0yKTsKCi8qU2F2ZSB0bXAwIGFuZCB0bXAxIGluIHdzcHRyICovCgltb3ZxX3IybShtbTAsICood3NwdHIpKTsJCS8qIHNhdmUgdG1wMCAqLwoJcGFkZHdfcjJyKG1tNCwgbW0yKTsJCQkJLyogd3NwdHJbeHh4XSxbMCx6MTFdLFt4eHhdLFswLHoxM10gKi8KCgkKLypDb250aW51ZSB3aXRoIHoxMCAtLS0gejEzICovCgltb3ZxX20ycigqKHdzcHRyKzIpLCBtbTYpOwkJLyogd3NwdHJbMSwwXSxbMSwxXSxbMSwyXSxbMSwzXSAqLwoJcHN1YndfcjJyKG1tNCwgbW0zKTsJCQkJLyogd3NwdHJbeHh4XSxbMCx6MTJdLFt4eHhdLFswLHoxMF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzMpLCBtbTApOwkJLyogd3NwdHJbMSw0XSxbMSw1XSxbMSw2XSxbMSw3XSAqLwoJbW92cV9yMnIobW02LCBtbTQpOwoKCW1vdnFfcjJtKG1tMSwgKih3c3B0cisxKSk7CQkvKiBzYXZlIHRtcDEgKi8KCXB1bnBja2xkcV9yMnIobW0wLCBtbTYpOwkJLyogd3NwdHJbMSwwXSxbMSwxXSxbMSw0XSxbMSw1XSAqLwoKCXB1bnBja2hkcV9yMnIobW00LCBtbTApOwkJLyogd3NwdHJbMSw2XSxbMSw3XSxbMSwyXSxbMSwzXSAqLwoJbW92cV9yMnIobW02LCBtbTEpOwoJCi8qU2F2ZSB0bXAyIGFuZCB0bXAzIGluIHdzcHRyICovCglwYWRkd19yMnIobW0wLCBtbTYpOwkJCQkvKiB3c3B0clt4eHhdLFsxLHoxMV0sW3h4eF0sWzEsejEzXSAqLwoJbW92cV9yMnIobW0yLCBtbTQpOwoJCi8qQ29udGludWUgd2l0aCB6MTAgLS0tIHoxMyAqLwoJbW92cV9yMm0obW01LCAqKHdzcHRyKzIpKTsJCS8qIHNhdmUgdG1wMiAqLwoJcHVucGNrbHdkX3IycihtbTYsIG1tMik7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFswLHoxMV0sWzEsejExXSAqLwoKCXBzdWJ3X3IycihtbTAsIG1tMSk7CQkJCS8qIHdzcHRyW3h4eF0sWzEsejEyXSxbeHh4XSxbMSx6MTBdICovCglwdW5wY2tod2RfcjJyKG1tNiwgbW00KTsJCS8qIHdzcHRyW3h4eF0sW3h4eF0sWzAsejEzXSxbMSx6MTNdICovCgoJbW92cV9yMnIobW0zLCBtbTApOwoJcHVucGNrbHdkX3IycihtbTEsIG1tMyk7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFswLHoxMl0sWzEsejEyXSAqLwoKCW1vdnFfcjJtKG1tNywgKih3c3B0ciszKSk7CQkvKiBzYXZlIHRtcDMgKi8KCXB1bnBja2h3ZF9yMnIobW0xLCBtbTApOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMCx6MTBdLFsxLHoxMF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzQpLCBtbTYpOwkJLyogd3NwdHJbMiwwXSxbMiwxXSxbMiwyXSxbMiwzXSAqLwoJcHVucGNraGRxX3IycihtbTIsIG1tMCk7CQkvKiB3c3B0clswLHoxMF0sWzEsejEwXSxbMCx6MTFdLFsxLHoxMV0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzUpLCBtbTcpOwkvKiB3c3B0clsyLDRdLFsyLDVdLFsyLDZdLFsyLDddICovCglwdW5wY2toZHFfcjJyKG1tNCwgbW0zKTsJCS8qIHdzcHRyWzAsejEyXSxbMSx6MTJdLFswLHoxM10sWzEsejEzXSAqLwoKCW1vdnFfbTJyKCood3NwdHIrNiksIG1tMSk7CS8qIHdzcHRyWzMsMF0sWzMsMV0sWzMsMl0sWzMsM10gKi8KCW1vdnFfcjJyKG1tNiwgbW00KTsKCglwdW5wY2tsZHFfcjJyKG1tNywgbW02KTsJCS8qIHdzcHRyWzIsMF0sWzIsMV0sWzIsNF0sWzIsNV0gKi8KCW1vdnFfcjJyKG1tMSwgbW01KTsKCglwdW5wY2toZHFfcjJyKG1tNCwgbW03KTsJCS8qIHdzcHRyWzIsNl0sWzIsN10sWzIsMl0sWzIsM10gKi8KCW1vdnFfcjJyKG1tNiwgbW0yKTsKCQoJbW92cV9tMnIoKih3c3B0cis3KSwgbW00KTsJLyogd3NwdHJbMyw0XSxbMyw1XSxbMyw2XSxbMyw3XSAqLwoJcGFkZHdfcjJyKG1tNywgbW02KTsJCQkJLyogd3NwdHJbeHh4XSxbMix6MTFdLFt4eHhdLFsyLHoxM10gKi8KCglwc3Vid19yMnIobW03LCBtbTIpOwkJCQkvKiB3c3B0clt4eHhdLFsyLHoxMl0sW3h4eF0sWzIsejEwXSAqLwoJcHVucGNrbGRxX3IycihtbTQsIG1tMSk7CQkvKiB3c3B0clszLDBdLFszLDFdLFszLDRdLFszLDVdICovCgoJcHVucGNraGRxX3IycihtbTUsIG1tNCk7CQkvKiB3c3B0clszLDZdLFszLDddLFszLDJdLFszLDNdICovCgltb3ZxX3IycihtbTEsIG1tNyk7CgoJcGFkZHdfcjJyKG1tNCwgbW0xKTsJCQkJLyogd3NwdHJbeHh4XSxbMyx6MTFdLFt4eHhdLFszLHoxM10gKi8KCXBzdWJ3X3IycihtbTQsIG1tNyk7CQkJCS8qIHdzcHRyW3h4eF0sWzMsejEyXSxbeHh4XSxbMyx6MTBdICovCgoJbW92cV9yMnIobW02LCBtbTUpOwoJcHVucGNrbHdkX3IycihtbTEsIG1tNik7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFsyLHoxMV0sWzMsejExXSAqLwoKCXB1bnBja2h3ZF9yMnIobW0xLCBtbTUpOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMix6MTNdLFszLHoxM10gKi8KCW1vdnFfcjJyKG1tMiwgbW00KTsKCglwdW5wY2tsd2RfcjJyKG1tNywgbW0yKTsJCS8qIHdzcHRyW3h4eF0sW3h4eF0sWzIsejEyXSxbMyx6MTJdICovCgoJcHVucGNraHdkX3IycihtbTcsIG1tNCk7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFsyLHoxMF0sWzMsejEwXSAqLwoKCXB1bnBja2hkcV9yMnIobW02LCBtbTQpOwkJLyovIHdzcHRyWzIsejEwXSxbMyx6MTBdLFsyLHoxMV0sWzMsejExXSAqLwoKCXB1bnBja2hkcV9yMnIobW01LCBtbTIpOwkJLyogd3NwdHJbMix6MTJdLFszLHoxMl0sWzIsejEzXSxbMyx6MTNdICovCgltb3ZxX3IycihtbTAsIG1tNSk7CgoJcHVucGNrbGRxX3IycihtbTQsIG1tMCk7CQkvKiB3c3B0clswLHoxMF0sWzEsejEwXSxbMix6MTBdLFszLHoxMF0gKi8KCglwdW5wY2toZHFfcjJyKG1tNCwgbW01KTsJCS8qIHdzcHRyWzAsejExXSxbMSx6MTFdLFsyLHoxMV0sWzMsejExXSAqLwoJbW92cV9yMnIobW0zLCBtbTQpOwoKCXB1bnBja2hkcV9yMnIobW0yLCBtbTQpOwkJLyogd3NwdHJbMCx6MTNdLFsxLHoxM10sWzIsejEzXSxbMyx6MTNdICovCgltb3ZxX3IycihtbTUsIG1tMSk7CgoJcHVucGNrbGRxX3IycihtbTIsIG1tMyk7CQkvKiB3c3B0clswLHoxMl0sWzEsejEyXSxbMix6MTJdLFszLHoxMl0gKi8KLyogICAgdG1wNyA9IHoxMSArIHoxMzsJCTogcGhhc2UgNSAqLwovKiAgICB0bXA4ID0gejExIC0gejEzOwkJOiBwaGFzZSA1ICovCglwc3Vid19yMnIobW00LCBtbTEpOwkJCQkvKiB0bXA4ICovCgoJcGFkZHdfcjJyKG1tNCwgbW01KTsJCQkJLyogdG1wNyAqLwovKiAgICB0bXAyMSA9IE1VTFRJUExZKHRtcDgsIEZJWF8xXzQxNDIxMzU2Mik7IDIqYzQgICovCglwc2xsd19pMnIoMiwgbW0xKTsKCglwc2xsd19pMnIoMiwgbW0wKTsKCglwbXVsaHdfbTJyKGZpeF8xNDEsIG1tMSk7CQkvKiB0bXAyMSAqLwovKiAgICB0bXAyMCA9IE1VTFRJUExZKHoxMiwgKEZJWF8xXzA4MjM5MjIwMC0gRklYXzFfODQ3NzU5MDY1KSkgIDIqKGMyLWM2KSAqLwovKgkJCSsgTVVMVElQTFkoejEwLCAtIEZJWF8xXzg0Nzc1OTA2NSk7IDogMipjMiAqLwoJcHNsbHdfaTJyKDIsIG1tMyk7Cgltb3ZxX3IycihtbTAsIG1tNyk7CgoJcG11bGh3X20ycihmaXhfbjE4NCwgbW03KTsKCW1vdnFfcjJyKG1tMywgbW02KTsKCgltb3ZxX20ycigqKHdzcHRyKSwgbW0yKTsJCS8qIHRtcDAsZmluYWwxICovCgoJcG11bGh3X20ycihmaXhfMTA4bjE4NCwgbW02KTsKLyoJIHRtcDIyID0gTVVMVElQTFkoejEwLChGSVhfMV84NDc3NTkwNjUgLSBGSVhfMl82MTMxMjU5MzApKSA6IC0yKihjMitjNikgKi8KLyoJCQkrIE1VTFRJUExZKHoxMiwgRklYXzFfODQ3NzU5MDY1KTsgMipjMiAqLwoJbW92cV9yMnIobW0yLCBtbTQpOwkJCQkvKiBmaW5hbDEgKi8KICAKCXBtdWxod19tMnIoZml4XzE4NG4yNjEsIG1tMCk7CglwYWRkd19yMnIobW01LCBtbTIpOwkJCQkvKiB0bXAwK3RtcDcsZmluYWwxICovCgoJcG11bGh3X20ycihmaXhfMTg0LCBtbTMpOwoJcHN1YndfcjJyKG1tNSwgbW00KTsJCQkJLyogdG1wMC10bXA3LGZpbmFsMSAqLwoKLyogICAgdG1wNiA9IHRtcDIyIC0gdG1wNzsJcGhhc2UgMiAqLwoJcHNyYXdfaTJyKDMsIG1tMik7CQkJCS8qIG91dHB0clswLDBdLFsxLDBdLFsyLDBdLFszLDBdLGZpbmFsMSAqLwoKCXBhZGR3X3IycihtbTYsIG1tNyk7CQkJCS8qIHRtcDIwICovCglwc3Jhd19pMnIoMywgbW00KTsJCQkJLyogb3V0cHRyWzAsN10sWzEsN10sWzIsN10sWzMsN10sZmluYWwxICovCgoJcGFkZHdfcjJyKG1tMCwgbW0zKTsJCQkJLyogdG1wMjIgKi8KCi8qICAgIHRtcDUgPSB0bXAyMSAtIHRtcDY7ICovCglwc3Vid19yMnIobW01LCBtbTMpOwkJCQkvKiB0bXA2ICovCgovKiAgICB0bXA0ID0gdG1wMjAgKyB0bXA1OyAqLwoJbW92cV9tMnIoKih3c3B0cisxKSwgbW0wKTsJCS8qIHRtcDEsZmluYWwyICovCglwc3Vid19yMnIobW0zLCBtbTEpOwkJCQkvKiB0bXA1ICovCgoJbW92cV9yMnIobW0wLCBtbTYpOwkJCQkvKiBmaW5hbDIgKi8KCXBhZGR3X3IycihtbTMsIG1tMCk7CQkJCS8qIHRtcDErdG1wNixmaW5hbDIgKi8KCiAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KCgovKiAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwICsgdG1wNywgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDEgKi8KCgovKiAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxICsgdG1wNiwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxIC0gdG1wNiwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDIgKi8KCXBzdWJ3X3IycihtbTMsIG1tNik7CQkJCS8qIHRtcDEtdG1wNixmaW5hbDIgKi8KCXBzcmF3X2kycigzLCBtbTApOwkJCQkvKiBvdXRwdHJbMCwxXSxbMSwxXSxbMiwxXSxbMywxXSAqLwoKCXBzcmF3X2kycigzLCBtbTYpOwkJCQkvKiBvdXRwdHJbMCw2XSxbMSw2XSxbMiw2XSxbMyw2XSAqLwoJCglwYWNrdXN3Yl9yMnIobW00LCBtbTApOwkJCS8qIG91dFswLDFdLFsxLDFdLFsyLDFdLFszLDFdLFswLDddLFsxLDddLFsyLDddLFszLDddICovCgkKCW1vdnFfbTJyKCood3NwdHIrMiksIG1tNSk7CQkvKiB0bXAyLGZpbmFsMyAqLwoJcGFja3Vzd2JfcjJyKG1tNiwgbW0yKTsJCQkvKiBvdXRbMCwwXSxbMSwwXSxbMiwwXSxbMywwXSxbMCw2XSxbMSw2XSxbMiw2XSxbMyw2XSAqLwoKLyogICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykgKi8KLyoJCQkgICAgJiBSQU5HRV9NQVNLXTsgKi8KLyogICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykgKi8KLyoJCQkgICAgJiBSQU5HRV9NQVNLXTsJZmluYWwzICovCglwYWRkd19yMnIobW0xLCBtbTcpOwkJCQkvKiB0bXA0ICovCgltb3ZxX3IycihtbTUsIG1tMyk7CgoJcGFkZHdfcjJyKG1tMSwgbW01KTsJCQkJLyogdG1wMit0bXA1ICovCglwc3Vid19yMnIobW0xLCBtbTMpOwkJCQkvKiB0bXAyLXRtcDUgKi8KCglwc3Jhd19pMnIoMywgbW01KTsJCQkJLyogb3V0cHRyWzAsMl0sWzEsMl0sWzIsMl0sWzMsMl0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzMpLCBtbTQpOwkJLyogdG1wMyxmaW5hbDQgKi8KCXBzcmF3X2kycigzLCBtbTMpOwkJCQkvKiBvdXRwdHJbMCw1XSxbMSw1XSxbMiw1XSxbMyw1XSAqLwoKCgovKiAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzICsgdG1wNCwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDQgKi8KCW1vdnFfcjJyKG1tNCwgbW02KTsKCXBhZGR3X3IycihtbTcsIG1tNCk7CQkJCS8qIHRtcDMrdG1wNCAqLwoKCXBzdWJ3X3IycihtbTcsIG1tNik7CQkJCS8qIHRtcDMtdG1wNCAqLwoJcHNyYXdfaTJyKDMsIG1tNCk7CQkJCS8qIG91dHB0clswLDRdLFsxLDRdLFsyLDRdLFszLDRdICovCgoJLyogbW92CQkJZWN4LCBbZGF0YXB0cl0gKi8KCglwc3Jhd19pMnIoMywgbW02KTsJCQkJLyogb3V0cHRyWzAsM10sWzEsM10sWzIsM10sWzMsM10gKi8KCglwYWNrdXN3Yl9yMnIobW00LCBtbTUpOwkJCS8qIG91dFswLDJdLFsxLDJdLFsyLDJdLFszLDJdLFswLDRdLFsxLDRdLFsyLDRdLFszLDRdICovCgoJcGFja3Vzd2JfcjJyKG1tMywgbW02KTsJCQkvKiBvdXRbMCwzXSxbMSwzXSxbMiwzXSxbMywzXSxbMCw1XSxbMSw1XSxbMiw1XSxbMyw1XSAqLwoJbW92cV9yMnIobW0yLCBtbTQpOwoKCW1vdnFfcjJyKG1tNSwgbW03KTsKCXB1bnBja2xid19yMnIobW0wLCBtbTIpOwkJLyogb3V0WzAsMF0sWzAsMV0sWzEsMF0sWzEsMV0sWzIsMF0sWzIsMV0sWzMsMF0sWzMsMV0gKi8KCglwdW5wY2toYndfcjJyKG1tMCwgbW00KTsJCS8qIG91dFswLDZdLFswLDddLFsxLDZdLFsxLDddLFsyLDZdLFsyLDddLFszLDZdLFszLDddICovCgltb3ZxX3IycihtbTIsIG1tMSk7CgoJcHVucGNrbGJ3X3IycihtbTYsIG1tNSk7CQkvKiBvdXRbMCwyXSxbMCwzXSxbMSwyXSxbMSwzXSxbMiwyXSxbMiwzXSxbMywyXSxbMywzXSAqLwoKCS8qIGFkZAkJIAlkYXRhcHRyLCA0ICovCgoJcHVucGNraGJ3X3IycihtbTYsIG1tNyk7CQkvKiBvdXRbMCw0XSxbMCw1XSxbMSw0XSxbMSw1XSxbMiw0XSxbMiw1XSxbMyw0XSxbMyw1XSAqLwoKCXB1bnBja2x3ZF9yMnIobW01LCBtbTIpOwkJLyogb3V0WzAsMF0sWzAsMV0sWzAsMl0sWzAsM10sWzEsMF0sWzEsMV0sWzEsMl0sWzEsM10gKi8KCQoJLyogYWRkCQkJZWN4LCBvdXRwdXRfY29sICovCgoJbW92cV9yMnIobW03LCBtbTYpOwoJcHVucGNraHdkX3IycihtbTUsIG1tMSk7CQkvKiBvdXRbMiwwXSxbMiwxXSxbMiwyXSxbMiwzXSxbMywwXSxbMywxXSxbMywyXSxbMywzXSAqLwoKCW1vdnFfcjJyKG1tMiwgbW0wKTsKCXB1bnBja2x3ZF9yMnIobW00LCBtbTYpOwkJLyogb3V0WzAsNF0sWzAsNV0sWzAsNl0sWzAsN10sWzEsNF0sWzEsNV0sWzEsNl0sWzEsN10gKi8KCgkvKiBtb3YJCQlpZGF0YSwgW2RhdGFwdHJdICovCgkKCXB1bnBja2xkcV9yMnIobW02LCBtbTIpOwkJLyogb3V0WzAsMF0sWzAsMV0sWzAsMl0sWzAsM10sWzAsNF0sWzAsNV0sWzAsNl0sWzAsN10gKi8KCgkvKiBhZGQJCSAJZGF0YXB0ciwgNCAqLwoJIAoJbW92cV9yMnIobW0xLCBtbTMpOwoKCS8qIGFkZAkJCWlkYXRhLCBvdXRwdXRfY29sICAqLwoJCglwdW5wY2tod2RfcjJyKG1tNCwgbW03KTsJCS8qIG91dFsyLDRdLFsyLDVdLFsyLDZdLFsyLDddLFszLDRdLFszLDVdLFszLDZdLFszLDddICovCgkKCW1vdnFfcjJtKG1tMiwgKihkYXRhcHRyKSk7CgkKCXB1bnBja2hkcV9yMnIobW02LCBtbTApOwkJLyogb3V0WzEsMF0sWzEsMV0sWzEsMl0sWzEsM10sWzEsNF0sWzEsNV0sWzEsNl0sWzEsN10gKi8KCglkYXRhcHRyICs9IHJza2lwOwoJbW92cV9yMm0obW0wLCAqKGRhdGFwdHIpKTsKCglwdW5wY2tsZHFfcjJyKG1tNywgbW0xKTsJCS8qIG91dFsyLDBdLFsyLDFdLFsyLDJdLFsyLDNdLFsyLDRdLFsyLDVdLFsyLDZdLFsyLDddICovCglwdW5wY2toZHFfcjJyKG1tNywgbW0zKTsJCS8qIG91dFszLDBdLFszLDFdLFszLDJdLFszLDNdLFszLDRdLFszLDVdLFszLDZdLFszLDddICovCgkKCWRhdGFwdHIgKz0gcnNraXA7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cikpOwoKCWRhdGFwdHIgKz0gcnNraXA7Cgltb3ZxX3IybShtbTMsICooZGF0YXB0cikpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJd3NwdHIgKz0gODsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsgKi8KLyogICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsgKi8KLyogICAgdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsgKi8KLyogICAgdG1wMTQgPSAoKERDVEVMRU0pIHdzcHRyWzJdIC0gKERDVEVMRU0pIHdzcHRyWzZdKTsgKi8KCW1vdnFfbTJyKCood3NwdHIpLCBtbTApOwkJLyogd3NwdHJbMCwwXSxbMCwxXSxbMCwyXSxbMCwzXSAqLwoKCW1vdnFfbTJyKCood3NwdHIrMSksIG1tMSk7CQkvKiB3c3B0clswLDRdLFswLDVdLFswLDZdLFswLDddICovCgltb3ZxX3IycihtbTAsIG1tMik7CgkKCW1vdnFfbTJyKCood3NwdHIrMiksIG1tMyk7CQkvKiB3c3B0clsxLDBdLFsxLDFdLFsxLDJdLFsxLDNdICovCglwYWRkd19yMnIobW0xLCBtbTApOwkJCQkvKiB3c3B0clswLHRtcDEwXSxbeHh4XSxbMCx0bXAxM10sW3h4eF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzMpLCBtbTQpOwkJLyogd3NwdHJbMSw0XSxbMSw1XSxbMSw2XSxbMSw3XSAqLwoJcHN1YndfcjJyKG1tMSwgbW0yKTsJCQkJLyogd3NwdHJbMCx0bXAxMV0sW3h4eF0sWzAsdG1wMTRdLFt4eHhdICovCgoJbW92cV9yMnIobW0wLCBtbTYpOwoJbW92cV9yMnIobW0zLCBtbTUpOwoJCglwYWRkd19yMnIobW00LCBtbTMpOwkJCQkvKiB3c3B0clsxLHRtcDEwXSxbeHh4XSxbMSx0bXAxM10sW3h4eF0gKi8KCW1vdnFfcjJyKG1tMiwgbW0xKTsKCglwc3Vid19yMnIobW00LCBtbTUpOwkJCQkvKiB3c3B0clsxLHRtcDExXSxbeHh4XSxbMSx0bXAxNF0sW3h4eF0gKi8KCXB1bnBja2x3ZF9yMnIobW0zLCBtbTApOwkJLyogd3NwdHJbMCx0bXAxMF0sWzEsdG1wMTBdLFt4eHhdLFt4eHhdICovCgoJbW92cV9tMnIoKih3c3B0cis3KSwgbW03KTsJLyogd3NwdHJbMyw0XSxbMyw1XSxbMyw2XSxbMyw3XSAqLwoJcHVucGNraHdkX3IycihtbTMsIG1tNik7CQkvKiB3c3B0clswLHRtcDEzXSxbMSx0bXAxM10sW3h4eF0sW3h4eF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzQpLAltbTMpOwkJLyogd3NwdHJbMiwwXSxbMiwxXSxbMiwyXSxbMiwzXSAqLwoJcHVucGNrbGRxX3IycihtbTYsIG1tMCk7CQkvKiB3c3B0clswLHRtcDEwXSxbMSx0bXAxMF0sWzAsdG1wMTNdLFsxLHRtcDEzXSAqLwoKCXB1bnBja2x3ZF9yMnIobW01LCBtbTEpOwkJLyogd3NwdHJbMCx0bXAxMV0sWzEsdG1wMTFdLFt4eHhdLFt4eHhdICovCgltb3ZxX3IycihtbTMsIG1tNCk7CgoJbW92cV9tMnIoKih3c3B0cis2KSwgbW02KTsJLyogd3NwdHJbMywwXSxbMywxXSxbMywyXSxbMywzXSAqLwoJcHVucGNraHdkX3IycihtbTUsIG1tMik7CQkvKiB3c3B0clswLHRtcDE0XSxbMSx0bXAxNF0sW3h4eF0sW3h4eF0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzUpLCBtbTUpOwkvKiB3c3B0clsyLDRdLFsyLDVdLFsyLDZdLFsyLDddICovCglwdW5wY2tsZHFfcjJyKG1tMiwgbW0xKTsJCS8qIHdzcHRyWzAsdG1wMTFdLFsxLHRtcDExXSxbMCx0bXAxNF0sWzEsdG1wMTRdICovCgoJcGFkZHdfcjJyKG1tNSwgbW0zKTsJCQkJLyogd3NwdHJbMix0bXAxMF0sW3h4eF0sWzIsdG1wMTNdLFt4eHhdICovCgltb3ZxX3IycihtbTYsIG1tMik7CgoJcHN1YndfcjJyKG1tNSwgbW00KTsJCQkJLyogd3NwdHJbMix0bXAxMV0sW3h4eF0sWzIsdG1wMTRdLFt4eHhdICovCglwYWRkd19yMnIobW03LCBtbTYpOwkJCQkvKiB3c3B0clszLHRtcDEwXSxbeHh4XSxbMyx0bXAxM10sW3h4eF0gKi8KCgltb3ZxX3IycihtbTMsIG1tNSk7CglwdW5wY2tsd2RfcjJyKG1tNiwgbW0zKTsJCS8qIHdzcHRyWzIsdG1wMTBdLFszLHRtcDEwXSxbeHh4XSxbeHh4XSAqLwoJCglwc3Vid19yMnIobW03LCBtbTIpOwkJCQkvKiB3c3B0clszLHRtcDExXSxbeHh4XSxbMyx0bXAxNF0sW3h4eF0gKi8KCXB1bnBja2h3ZF9yMnIobW02LCBtbTUpOwkJLyogd3NwdHJbMix0bXAxM10sWzMsdG1wMTNdLFt4eHhdLFt4eHhdICovCgoJbW92cV9yMnIobW00LCBtbTcpOwoJcHVucGNrbGRxX3IycihtbTUsIG1tMyk7CQkvKiB3c3B0clsyLHRtcDEwXSxbMyx0bXAxMF0sWzIsdG1wMTNdLFszLHRtcDEzXSAqLwoKCXB1bnBja2x3ZF9yMnIobW0yLCBtbTQpOwkJLyogd3NwdHJbMix0bXAxMV0sWzMsdG1wMTFdLFt4eHhdLFt4eHhdICovCgoJcHVucGNraHdkX3IycihtbTIsIG1tNyk7CQkvKiB3c3B0clsyLHRtcDE0XSxbMyx0bXAxNF0sW3h4eF0sW3h4eF0gKi8KCglwdW5wY2tsZHFfcjJyKG1tNywgbW00KTsJCS8qIHdzcHRyWzIsdG1wMTFdLFszLHRtcDExXSxbMix0bXAxNF0sWzMsdG1wMTRdICovCgltb3ZxX3IycihtbTEsIG1tNik7CgoJLypPSyAqLwoKLyoJbW0wID0gCTt3c3B0clswLHRtcDEwXSxbMSx0bXAxMF0sWzAsdG1wMTNdLFsxLHRtcDEzXSAqLwovKgltbTEgPQk7d3NwdHJbMCx0bXAxMV0sWzEsdG1wMTFdLFswLHRtcDE0XSxbMSx0bXAxNF0gKi8KCgltb3ZxX3IycihtbTAsIG1tMik7CglwdW5wY2toZHFfcjJyKG1tNCwgbW02KTsJCS8qIHdzcHRyWzAsdG1wMTRdLFsxLHRtcDE0XSxbMix0bXAxNF0sWzMsdG1wMTRdICovCgoJcHVucGNrbGRxX3IycihtbTQsIG1tMSk7CQkvKiB3c3B0clswLHRtcDExXSxbMSx0bXAxMV0sWzIsdG1wMTFdLFszLHRtcDExXSAqLwoJcHNsbHdfaTJyKDIsIG1tNik7CgoJcG11bGh3X20ycihmaXhfMTQxLCBtbTYpOwoJcHVucGNrbGRxX3IycihtbTMsIG1tMCk7CQkvKiB3c3B0clswLHRtcDEwXSxbMSx0bXAxMF0sWzIsdG1wMTBdLFszLHRtcDEwXSAqLwoKCXB1bnBja2hkcV9yMnIobW0zLCBtbTIpOwkJLyogd3NwdHJbMCx0bXAxM10sWzEsdG1wMTNdLFsyLHRtcDEzXSxbMyx0bXAxM10gKi8KCW1vdnFfcjJyKG1tMCwgbW03KTsKCi8qICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOyAqLwovKiAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsgKi8KCXBhZGR3X3IycihtbTIsIG1tMCk7CQkJCS8qIFswLHRtcDBdLFsxLHRtcDBdLFsyLHRtcDBdLFszLHRtcDBdICovCglwc3Vid19yMnIobW0yLCBtbTcpOwkJCQkvKiBbMCx0bXAzXSxbMSx0bXAzXSxbMix0bXAzXSxbMyx0bXAzXSAqLwoKLyogICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxNCwgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOyAqLwoJcHN1YndfcjJyKG1tMiwgbW02KTsJCQkJLyogd3NwdHJbMCx0bXAxMl0sWzEsdG1wMTJdLFsyLHRtcDEyXSxbMyx0bXAxMl0gKi8KLyogICAgdG1wMSA9IHRtcDExICsgdG1wMTI7ICovCi8qICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOyAqLwoJbW92cV9yMnIobW0xLCBtbTUpOwoKCSAvKk9LICovCgoKICAgIC8qIE9kZCBwYXJ0ICovCgovKiAgICB6MTMgPSAoRENURUxFTSkgd3NwdHJbNV0gKyAoRENURUxFTSkgd3NwdHJbM107ICovCi8qICAgIHoxMCA9IChEQ1RFTEVNKSB3c3B0cls1XSAtIChEQ1RFTEVNKSB3c3B0clszXTsgKi8KLyogICAgejExID0gKERDVEVMRU0pIHdzcHRyWzFdICsgKERDVEVMRU0pIHdzcHRyWzddOyAqLwovKiAgICB6MTIgPSAoRENURUxFTSkgd3NwdHJbMV0gLSAoRENURUxFTSkgd3NwdHJbN107ICovCgltb3ZxX20ycigqKHdzcHRyKSwgbW0zKTsJCS8qIHdzcHRyWzAsMF0sWzAsMV0sWzAsMl0sWzAsM10gKi8KCXBhZGR3X3IycihtbTYsIG1tMSk7CQkJCS8qIFswLHRtcDFdLFsxLHRtcDFdLFsyLHRtcDFdLFszLHRtcDFdICovCgoJbW92cV9tMnIoKih3c3B0cisxKSwJbW00KTsJCS8qIHdzcHRyWzAsNF0sWzAsNV0sWzAsNl0sWzAsN10gKi8KCXBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCS8qIFswLHRtcDJdLFsxLHRtcDJdLFsyLHRtcDJdLFszLHRtcDJdICovCgoJbW92cV9yMnIobW0zLCBtbTYpOwoJcHVucGNrbGRxX3IycihtbTQsIG1tMyk7CQkvKiB3c3B0clswLDBdLFswLDFdLFswLDRdLFswLDVdICovCgoJcHVucGNraGRxX3IycihtbTYsIG1tNCk7CQkvKiB3c3B0clswLDZdLFswLDddLFswLDJdLFswLDNdICovCgltb3ZxX3IycihtbTMsIG1tMik7CgovKlNhdmUgdG1wMCBhbmQgdG1wMSBpbiB3c3B0ciAqLwoJbW92cV9yMm0obW0wLCAqKHdzcHRyKSk7CQkvKiBzYXZlIHRtcDAgKi8KCXBhZGR3X3IycihtbTQsIG1tMik7CQkJCS8qIHdzcHRyW3h4eF0sWzAsejExXSxbeHh4XSxbMCx6MTNdICovCgoJCi8qQ29udGludWUgd2l0aCB6MTAgLS0tIHoxMyAqLwoJbW92cV9tMnIoKih3c3B0cisyKSwgbW02KTsJCS8qIHdzcHRyWzEsMF0sWzEsMV0sWzEsMl0sWzEsM10gKi8KCXBzdWJ3X3IycihtbTQsIG1tMyk7CQkJCS8qIHdzcHRyW3h4eF0sWzAsejEyXSxbeHh4XSxbMCx6MTBdICovCgoJbW92cV9tMnIoKih3c3B0ciszKSwgbW0wKTsJCS8qIHdzcHRyWzEsNF0sWzEsNV0sWzEsNl0sWzEsN10gKi8KCW1vdnFfcjJyKG1tNiwgbW00KTsKCgltb3ZxX3IybShtbTEsICood3NwdHIrMSkpOwkJLyogc2F2ZSB0bXAxICovCglwdW5wY2tsZHFfcjJyKG1tMCwgbW02KTsJCS8qIHdzcHRyWzEsMF0sWzEsMV0sWzEsNF0sWzEsNV0gKi8KCglwdW5wY2toZHFfcjJyKG1tNCwgbW0wKTsJCS8qIHdzcHRyWzEsNl0sWzEsN10sWzEsMl0sWzEsM10gKi8KCW1vdnFfcjJyKG1tNiwgbW0xKTsKCQovKlNhdmUgdG1wMiBhbmQgdG1wMyBpbiB3c3B0ciAqLwoJcGFkZHdfcjJyKG1tMCwgbW02KTsJCQkJLyogd3NwdHJbeHh4XSxbMSx6MTFdLFt4eHhdLFsxLHoxM10gKi8KCW1vdnFfcjJyKG1tMiwgbW00KTsKCQovKkNvbnRpbnVlIHdpdGggejEwIC0tLSB6MTMgKi8KCW1vdnFfcjJtKG1tNSwgKih3c3B0cisyKSk7CQkvKiBzYXZlIHRtcDIgKi8KCXB1bnBja2x3ZF9yMnIobW02LCBtbTIpOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMCx6MTFdLFsxLHoxMV0gKi8KCglwc3Vid19yMnIobW0wLCBtbTEpOwkJCQkvKiB3c3B0clt4eHhdLFsxLHoxMl0sW3h4eF0sWzEsejEwXSAqLwoJcHVucGNraHdkX3IycihtbTYsIG1tNCk7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFswLHoxM10sWzEsejEzXSAqLwoKCW1vdnFfcjJyKG1tMywgbW0wKTsKCXB1bnBja2x3ZF9yMnIobW0xLCBtbTMpOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMCx6MTJdLFsxLHoxMl0gKi8KCgltb3ZxX3IybShtbTcsICood3NwdHIrMykpOwkJLyogc2F2ZSB0bXAzICovCglwdW5wY2tod2RfcjJyKG1tMSwgbW0wKTsJCS8qIHdzcHRyW3h4eF0sW3h4eF0sWzAsejEwXSxbMSx6MTBdICovCgoJbW92cV9tMnIoKih3c3B0cis0KSwgbW02KTsJCS8qIHdzcHRyWzIsMF0sWzIsMV0sWzIsMl0sWzIsM10gKi8KCXB1bnBja2hkcV9yMnIobW0yLCBtbTApOwkJLyogd3NwdHJbMCx6MTBdLFsxLHoxMF0sWzAsejExXSxbMSx6MTFdICovCgoJbW92cV9tMnIoKih3c3B0cis1KSwgbW03KTsJLyogd3NwdHJbMiw0XSxbMiw1XSxbMiw2XSxbMiw3XSAqLwoJcHVucGNraGRxX3IycihtbTQsIG1tMyk7CQkvKiB3c3B0clswLHoxMl0sWzEsejEyXSxbMCx6MTNdLFsxLHoxM10gKi8KCgltb3ZxX20ycigqKHdzcHRyKzYpLCBtbTEpOwkvKiB3c3B0clszLDBdLFszLDFdLFszLDJdLFszLDNdICovCgltb3ZxX3IycihtbTYsIG1tNCk7CgoJcHVucGNrbGRxX3IycihtbTcsIG1tNik7CQkvKiB3c3B0clsyLDBdLFsyLDFdLFsyLDRdLFsyLDVdICovCgltb3ZxX3IycihtbTEsIG1tNSk7CgoJcHVucGNraGRxX3IycihtbTQsIG1tNyk7CQkvKiB3c3B0clsyLDZdLFsyLDddLFsyLDJdLFsyLDNdICovCgltb3ZxX3IycihtbTYsIG1tMik7CgkKCW1vdnFfbTJyKCood3NwdHIrNyksIG1tNCk7CS8qIHdzcHRyWzMsNF0sWzMsNV0sWzMsNl0sWzMsN10gKi8KCXBhZGR3X3IycihtbTcsIG1tNik7CQkJCS8qIHdzcHRyW3h4eF0sWzIsejExXSxbeHh4XSxbMix6MTNdICovCgoJcHN1YndfcjJyKG1tNywgbW0yKTsJCQkJLyogd3NwdHJbeHh4XSxbMix6MTJdLFt4eHhdLFsyLHoxMF0gKi8KCXB1bnBja2xkcV9yMnIobW00LCBtbTEpOwkJLyogd3NwdHJbMywwXSxbMywxXSxbMyw0XSxbMyw1XSAqLwoKCXB1bnBja2hkcV9yMnIobW01LCBtbTQpOwkJLyogd3NwdHJbMyw2XSxbMyw3XSxbMywyXSxbMywzXSAqLwoJbW92cV9yMnIobW0xLCBtbTcpOwoKCXBhZGR3X3IycihtbTQsIG1tMSk7CQkJCS8qIHdzcHRyW3h4eF0sWzMsejExXSxbeHh4XSxbMyx6MTNdICovCglwc3Vid19yMnIobW00LCBtbTcpOwkJCQkvKiB3c3B0clt4eHhdLFszLHoxMl0sW3h4eF0sWzMsejEwXSAqLwoKCW1vdnFfcjJyKG1tNiwgbW01KTsKCXB1bnBja2x3ZF9yMnIobW0xLCBtbTYpOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMix6MTFdLFszLHoxMV0gKi8KCglwdW5wY2tod2RfcjJyKG1tMSwgbW01KTsJCS8qIHdzcHRyW3h4eF0sW3h4eF0sWzIsejEzXSxbMyx6MTNdICovCgltb3ZxX3IycihtbTIsIG1tNCk7CgoJcHVucGNrbHdkX3IycihtbTcsIG1tMik7CQkvKiB3c3B0clt4eHhdLFt4eHhdLFsyLHoxMl0sWzMsejEyXSAqLwoKCXB1bnBja2h3ZF9yMnIobW03LCBtbTQpOwkJLyogd3NwdHJbeHh4XSxbeHh4XSxbMix6MTBdLFszLHoxMF0gKi8KCglwdW5wY2toZHFfcjJyKG1tNiwgbW00KTsJCS8qIHdzcHRyWzIsejEwXSxbMyx6MTBdLFsyLHoxMV0sWzMsejExXSAqLwoKCXB1bnBja2hkcV9yMnIobW01LCBtbTIpOwkJLyogd3NwdHJbMix6MTJdLFszLHoxMl0sWzIsejEzXSxbMyx6MTNdICovCgltb3ZxX3IycihtbTAsIG1tNSk7CgoJcHVucGNrbGRxX3IycihtbTQsIG1tMCk7CQkvKiB3c3B0clswLHoxMF0sWzEsejEwXSxbMix6MTBdLFszLHoxMF0gKi8KCglwdW5wY2toZHFfcjJyKG1tNCwgbW01KTsJCS8qIHdzcHRyWzAsejExXSxbMSx6MTFdLFsyLHoxMV0sWzMsejExXSAqLwoJbW92cV9yMnIobW0zLCBtbTQpOwoKCXB1bnBja2hkcV9yMnIobW0yLCBtbTQpOwkJLyogd3NwdHJbMCx6MTNdLFsxLHoxM10sWzIsejEzXSxbMyx6MTNdICovCgltb3ZxX3IycihtbTUsIG1tMSk7CgoJcHVucGNrbGRxX3IycihtbTIsIG1tMyk7CQkvKiB3c3B0clswLHoxMl0sWzEsejEyXSxbMix6MTJdLFszLHoxMl0gKi8KLyogICAgdG1wNyA9IHoxMSArIHoxMzsJCTogcGhhc2UgNSAqLwovKiAgICB0bXA4ID0gejExIC0gejEzOwkJOiBwaGFzZSA1ICovCglwc3Vid19yMnIobW00LCBtbTEpOwkJCQkvKiB0bXA4ICovCgoJcGFkZHdfcjJyKG1tNCwgbW01KTsJCQkJLyogdG1wNyAqLwovKiAgICB0bXAyMSA9IE1VTFRJUExZKHRtcDgsIEZJWF8xXzQxNDIxMzU2Mik7ICAyKmM0ICovCglwc2xsd19pMnIoMiwgbW0xKTsKCglwc2xsd19pMnIoMiwgbW0wKTsKCglwbXVsaHdfbTJyKGZpeF8xNDEsIG1tMSk7CQkvKiB0bXAyMSAqLwovKiAgICB0bXAyMCA9IE1VTFRJUExZKHoxMiwgKEZJWF8xXzA4MjM5MjIwMC0gRklYXzFfODQ3NzU5MDY1KSkgOiAgMiooYzItYzYpICovCi8qCQkJKyBNVUxUSVBMWSh6MTAsIC0gRklYXzFfODQ3NzU5MDY1KTsgOiAyKmMyICovCglwc2xsd19pMnIoMiwgbW0zKTsKCW1vdnFfcjJyKG1tMCwgbW03KTsKCglwbXVsaHdfbTJyKGZpeF9uMTg0LCBtbTcpOwoJbW92cV9yMnIobW0zLCBtbTYpOwoKCW1vdnFfbTJyKCood3NwdHIpLCBtbTIpOwkJLyogdG1wMCxmaW5hbDEgKi8KCglwbXVsaHdfbTJyKGZpeF8xMDhuMTg0LCBtbTYpOwovKgkgdG1wMjIgPSBNVUxUSVBMWSh6MTAsKEZJWF8xXzg0Nzc1OTA2NSAtIEZJWF8yXzYxMzEyNTkzMCkpIDogLTIqKGMyK2M2KSAqLwovKgkJCSsgTVVMVElQTFkoejEyLCBGSVhfMV84NDc3NTkwNjUpOyA6IDIqYzIgKi8KCW1vdnFfcjJyKG1tMiwgbW00KTsJCQkJLyogZmluYWwxICovCiAgCglwbXVsaHdfbTJyKGZpeF8xODRuMjYxLCBtbTApOwoJcGFkZHdfcjJyKG1tNSwgbW0yKTsJCQkJLyogdG1wMCt0bXA3LGZpbmFsMSAqLwoKCXBtdWxod19tMnIoZml4XzE4NCwgbW0zKTsKCXBzdWJ3X3IycihtbTUsIG1tNCk7CQkJCS8qIHRtcDAtdG1wNyxmaW5hbDEgKi8KCi8qICAgIHRtcDYgPSB0bXAyMiAtIHRtcDc7CXBoYXNlIDIgKi8KCXBzcmF3X2kycigzLCBtbTIpOwkJCQkvKiBvdXRwdHJbMCwwXSxbMSwwXSxbMiwwXSxbMywwXSxmaW5hbDEgKi8KCglwYWRkd19yMnIobW02LCBtbTcpOwkJCQkvKiB0bXAyMCAqLwoJcHNyYXdfaTJyKDMsIG1tNCk7CQkJCS8qIG91dHB0clswLDddLFsxLDddLFsyLDddLFszLDddLGZpbmFsMSAqLwoKCXBhZGR3X3IycihtbTAsIG1tMyk7CQkJCS8qIHRtcDIyICovCgovKiAgICB0bXA1ID0gdG1wMjEgLSB0bXA2OyAqLwoJcHN1YndfcjJyKG1tNSwgbW0zKTsJCQkJLyogdG1wNiAqLwoKLyogICAgdG1wNCA9IHRtcDIwICsgdG1wNTsgKi8KCW1vdnFfbTJyKCood3NwdHIrMSksIG1tMCk7CQkvKiB0bXAxLGZpbmFsMiAqLwoJcHN1YndfcjJyKG1tMywgbW0xKTsJCQkJLyogdG1wNSAqLwoKCW1vdnFfcjJyKG1tMCwgbW02KTsJCQkJLyogZmluYWwyICovCglwYWRkd19yMnIobW0zLCBtbTApOwkJCQkvKiB0bXAxK3RtcDYsZmluYWwyICovCgogICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCgovKiAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwICsgdG1wNywgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDEgKi8KCgovKiAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxICsgdG1wNiwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxIC0gdG1wNiwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDIgKi8KCXBzdWJ3X3IycihtbTMsIG1tNik7CQkJCS8qIHRtcDEtdG1wNixmaW5hbDIgKi8KCXBzcmF3X2kycigzLCBtbTApOwkJCQkvKiBvdXRwdHJbMCwxXSxbMSwxXSxbMiwxXSxbMywxXSAqLwoKCXBzcmF3X2kycigzLCBtbTYpOwkJCQkvKiBvdXRwdHJbMCw2XSxbMSw2XSxbMiw2XSxbMyw2XSAqLwoJCglwYWNrdXN3Yl9yMnIobW00LCBtbTApOwkJCS8qIG91dFswLDFdLFsxLDFdLFsyLDFdLFszLDFdLFswLDddLFsxLDddLFsyLDddLFszLDddICovCgkKCW1vdnFfbTJyKCood3NwdHIrMiksIG1tNSk7CQkvKiB0bXAyLGZpbmFsMyAqLwoJcGFja3Vzd2JfcjJyKG1tNiwgbW0yKTsJCQkvKiBvdXRbMCwwXSxbMSwwXSxbMiwwXSxbMywwXSxbMCw2XSxbMSw2XSxbMiw2XSxbMyw2XSAqLwoKLyogICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykgKi8KLyoJCQkgICAgJiBSQU5HRV9NQVNLXTsgKi8KLyogICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykgKi8KLyoJCQkgICAgJiBSQU5HRV9NQVNLXTsJZmluYWwzICovCglwYWRkd19yMnIobW0xLCBtbTcpOwkJCQkvKiB0bXA0ICovCgltb3ZxX3IycihtbTUsIG1tMyk7CgoJcGFkZHdfcjJyKG1tMSwgbW01KTsJCQkJLyogdG1wMit0bXA1ICovCglwc3Vid19yMnIobW0xLCBtbTMpOwkJCQkvKiB0bXAyLXRtcDUgKi8KCglwc3Jhd19pMnIoMywgbW01KTsJCQkJLyogb3V0cHRyWzAsMl0sWzEsMl0sWzIsMl0sWzMsMl0gKi8KCgltb3ZxX20ycigqKHdzcHRyKzMpLCBtbTQpOwkJLyogdG1wMyxmaW5hbDQgKi8KCXBzcmF3X2kycigzLCBtbTMpOwkJCQkvKiBvdXRwdHJbMCw1XSxbMSw1XSxbMiw1XSxbMyw1XSAqLwoKCgovKiAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzICsgdG1wNCwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOyAqLwovKiAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKSAqLwovKgkJCSAgICAmIFJBTkdFX01BU0tdOwlmaW5hbDQgKi8KCW1vdnFfcjJyKG1tNCwgbW02KTsKCXBhZGR3X3IycihtbTcsIG1tNCk7CQkJCS8qIHRtcDMrdG1wNCAqLwoKCXBzdWJ3X3IycihtbTcsIG1tNik7CQkJCS8qIHRtcDMtdG1wNCAqLwoJcHNyYXdfaTJyKDMsIG1tNCk7CQkJCS8qIG91dHB0clswLDRdLFsxLDRdLFsyLDRdLFszLDRdICovCgoJcHNyYXdfaTJyKDMsIG1tNik7CQkJCS8qIG91dHB0clswLDNdLFsxLDNdLFsyLDNdLFszLDNdICovCgoJLyoKICAgbW92cV9yMm0obW00LCAqZHVtbXkpOwoJZnByaW50ZihzdGRlcnIsICIzLTQgJTAxNmxseFxuIiwgZHVtbXkpOwogICBtb3ZxX3IybShtbTQsICpkdW1teSk7CglmcHJpbnRmKHN0ZGVyciwgIjMrNCAlMDE2bGx4XG4iLCBkdW1teSk7CgkqLwoJCgoJcGFja3Vzd2JfcjJyKG1tNCwgbW01KTsJCQkvKiBvdXRbMCwyXSxbMSwyXSxbMiwyXSxbMywyXSxbMCw0XSxbMSw0XSxbMiw0XSxbMyw0XSAqLwoKCXBhY2t1c3diX3IycihtbTMsIG1tNik7CQkJLyogb3V0WzAsM10sWzEsM10sWzIsM10sWzMsM10sWzAsNV0sWzEsNV0sWzIsNV0sWzMsNV0gKi8KCW1vdnFfcjJyKG1tMiwgbW00KTsKCgltb3ZxX3IycihtbTUsIG1tNyk7CglwdW5wY2tsYndfcjJyKG1tMCwgbW0yKTsJCS8qIG91dFswLDBdLFswLDFdLFsxLDBdLFsxLDFdLFsyLDBdLFsyLDFdLFszLDBdLFszLDFdICovCgoJcHVucGNraGJ3X3IycihtbTAsIG1tNCk7CQkvKiBvdXRbMCw2XSxbMCw3XSxbMSw2XSxbMSw3XSxbMiw2XSxbMiw3XSxbMyw2XSxbMyw3XSAqLwoJbW92cV9yMnIobW0yLCBtbTEpOwoKCXB1bnBja2xid19yMnIobW02LCBtbTUpOwkJLyogb3V0WzAsMl0sWzAsM10sWzEsMl0sWzEsM10sWzIsMl0sWzIsM10sWzMsMl0sWzMsM10gKi8KCQoJcHVucGNraGJ3X3IycihtbTYsIG1tNyk7CQkvKiBvdXRbMCw0XSxbMCw1XSxbMSw0XSxbMSw1XSxbMiw0XSxbMiw1XSxbMyw0XSxbMyw1XSAqLwoKCXB1bnBja2x3ZF9yMnIobW01LCBtbTIpOwkJLyogb3V0WzAsMF0sWzAsMV0sWzAsMl0sWzAsM10sWzEsMF0sWzEsMV0sWzEsMl0sWzEsM10gKi8KCQoJbW92cV9yMnIobW03LCBtbTYpOwoJcHVucGNraHdkX3IycihtbTUsIG1tMSk7CQkvKiBvdXRbMiwwXSxbMiwxXSxbMiwyXSxbMiwzXSxbMywwXSxbMywxXSxbMywyXSxbMywzXSAqLwoKCW1vdnFfcjJyKG1tMiwgbW0wKTsKCXB1bnBja2x3ZF9yMnIobW00LCBtbTYpOwkJLyogb3V0WzAsNF0sWzAsNV0sWzAsNl0sWzAsN10sWzEsNF0sWzEsNV0sWzEsNl0sWzEsN10gKi8KCglwdW5wY2tsZHFfcjJyKG1tNiwgbW0yKTsJCS8qIG91dFswLDBdLFswLDFdLFswLDJdLFswLDNdLFswLDRdLFswLDVdLFswLDZdLFswLDddICovCgoJbW92cV9yMnIobW0xLCBtbTMpOwoKCXB1bnBja2h3ZF9yMnIobW00LCBtbTcpOwkJLyogb3V0WzIsNF0sWzIsNV0sWzIsNl0sWzIsN10sWzMsNF0sWzMsNV0sWzMsNl0sWzMsN10gKi8KCQoJZGF0YXB0ciArPSByc2tpcDsKCW1vdnFfcjJtKG1tMiwgKihkYXRhcHRyKSk7CgoJcHVucGNraGRxX3IycihtbTYsIG1tMCk7CQkvKiBvdXRbMSwwXSxbMSwxXSxbMSwyXSxbMSwzXSxbMSw0XSxbMSw1XSxbMSw2XSxbMSw3XSAqLwoKCWRhdGFwdHIgKz0gcnNraXA7Cgltb3ZxX3IybShtbTAsICooZGF0YXB0cikpOwoKCXB1bnBja2xkcV9yMnIobW03LCBtbTEpOwkJLyogb3V0WzIsMF0sWzIsMV0sWzIsMl0sWzIsM10sWzIsNF0sWzIsNV0sWzIsNl0sWzIsN10gKi8KCQoJcHVucGNraGRxX3IycihtbTcsIG1tMyk7CQkvKiBvdXRbMywwXSxbMywxXSxbMywyXSxbMywzXSxbMyw0XSxbMyw1XSxbMyw2XSxbMyw3XSAqLwoKCWRhdGFwdHIgKz0gcnNraXA7Cgltb3ZxX3IybShtbTEsICooZGF0YXB0cikpOwoKCWRhdGFwdHIgKz0gcnNraXA7Cgltb3ZxX3IybShtbTMsICooZGF0YXB0cikpOwoKI2Vsc2UKICBfX3MzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwogIF9fczMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwogIF9fczMyIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7CiAgX19zMTYgKmlucHRyOwogIF9fczMyICp3c3B0cjsKICBfX3U4ICpvdXRwdHI7CiAgaW50IGN0cjsKICBfX3MzMiBkY3ZhbDsKICBfX3MzMiB3b3Jrc3BhY2VbNjRdOwoKICBpbnB0ciA9IGRhdGE7CiAgd3NwdHIgPSB3b3Jrc3BhY2U7CiAgZm9yIChjdHIgPSA4OyBjdHIgPiAwOyBjdHItLSkgewogICAgCiAgICBpZiAoKGlucHRyWzhdIHwgaW5wdHJbMTZdIHwgaW5wdHJbMjRdIHwKCSBpbnB0clszMl0gfCBpbnB0cls0MF0gfCBpbnB0cls0OF0gfCBpbnB0cls1Nl0pID09IDApIHsKICAgICAgZGN2YWwgPSBpbnB0clswXTsKICAgICAgd3NwdHJbMF0gPSBkY3ZhbDsKICAgICAgd3NwdHJbOF0gPSBkY3ZhbDsKICAgICAgd3NwdHJbMTZdID0gZGN2YWw7CiAgICAgIHdzcHRyWzI0XSA9IGRjdmFsOwogICAgICB3c3B0clszMl0gPSBkY3ZhbDsKICAgICAgd3NwdHJbNDBdID0gZGN2YWw7CiAgICAgIHdzcHRyWzQ4XSA9IGRjdmFsOwogICAgICB3c3B0cls1Nl0gPSBkY3ZhbDsKICAgICAgCiAgICAgIGlucHRyKys7CQogICAgICB3c3B0cisrOwogICAgICBjb250aW51ZTsKICAgIH0gCiAgICAKICAgIHRtcDAgPSBpbnB0clswXTsKICAgIHRtcDEgPSBpbnB0clsxNl07CiAgICB0bXAyID0gaW5wdHJbMzJdOwogICAgdG1wMyA9IGlucHRyWzQ4XTsKCiAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOwogICAgdG1wMTEgPSB0bXAwIC0gdG1wMjsKCiAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwogICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOwoKICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwogICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CiAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwogICAgCiAgICB0bXA0ID0gaW5wdHJbOF07CiAgICB0bXA1ID0gaW5wdHJbMjRdOwogICAgdG1wNiA9IGlucHRyWzQwXTsKICAgIHRtcDcgPSBpbnB0cls1Nl07CgogICAgejEzID0gdG1wNiArIHRtcDU7CiAgICB6MTAgPSB0bXA2IC0gdG1wNTsKICAgIHoxMSA9IHRtcDQgKyB0bXA3OwogICAgejEyID0gdG1wNCAtIHRtcDc7CgogICAgdG1wNyA9IHoxMSArIHoxMzsKICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOwoKICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOwogICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsKICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsKCiAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwogICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CgogICAgd3NwdHJbMF0gPSAoX19zMzIpICh0bXAwICsgdG1wNyk7CiAgICB3c3B0cls1Nl0gPSAoX19zMzIpICh0bXAwIC0gdG1wNyk7CiAgICB3c3B0cls4XSA9IChfX3MzMikgKHRtcDEgKyB0bXA2KTsKICAgIHdzcHRyWzQ4XSA9IChfX3MzMikgKHRtcDEgLSB0bXA2KTsKICAgIHdzcHRyWzE2XSA9IChfX3MzMikgKHRtcDIgKyB0bXA1KTsKICAgIHdzcHRyWzQwXSA9IChfX3MzMikgKHRtcDIgLSB0bXA1KTsKICAgIHdzcHRyWzMyXSA9IChfX3MzMikgKHRtcDMgKyB0bXA0KTsKICAgIHdzcHRyWzI0XSA9IChfX3MzMikgKHRtcDMgLSB0bXA0KTsKCiAgICBpbnB0cisrOwogICAgd3NwdHIrKzsKICB9CgogIHdzcHRyID0gd29ya3NwYWNlOwogIGZvciAoY3RyID0gMDsgY3RyIDwgODsgY3RyKyspIHsKICAgIG91dHB0ciA9ICYob2RhdGFbY3RyKnJza2lwXSk7CgogICAgdG1wMTAgPSB3c3B0clswXSArIHdzcHRyWzRdOwogICAgdG1wMTEgPSB3c3B0clswXSAtIHdzcHRyWzRdOwoKICAgIHRtcDEzID0gd3NwdHJbMl0gKyB3c3B0cls2XTsKICAgIHRtcDEyID0gTVVMVElQTFkod3NwdHJbMl0gLSB3c3B0cls2XSwgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOwoKICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwogICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CiAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwoKICAgIHoxMyA9IHdzcHRyWzVdICsgd3NwdHJbM107CiAgICB6MTAgPSB3c3B0cls1XSAtIHdzcHRyWzNdOwogICAgejExID0gd3NwdHJbMV0gKyB3c3B0cls3XTsKICAgIHoxMiA9IHdzcHRyWzFdIC0gd3NwdHJbN107CgogICAgdG1wNyA9IHoxMSArIHoxMzsKICAgIHRtcDExID0gTVVMVElQTFkoejExIC0gejEzLCBGSVhfMV80MTQyMTM1NjIpOwoKICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOwogICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsKICAgIHRtcDEyID0gTVVMVElQTFkoejEwLCAtIEZJWF8yXzYxMzEyNTkzMCkgKyB6NTsKCiAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwogICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CgogICAgb3V0cHRyWzBdID0gUkwoREVTQ0FMRSh0bXAwICsgdG1wNykpOwogICAgb3V0cHRyWzddID0gUkwoREVTQ0FMRSh0bXAwIC0gdG1wNykpOwogICAgb3V0cHRyWzFdID0gUkwoREVTQ0FMRSh0bXAxICsgdG1wNikpOwogICAgb3V0cHRyWzZdID0gUkwoREVTQ0FMRSh0bXAxIC0gdG1wNikpOwogICAgb3V0cHRyWzJdID0gUkwoREVTQ0FMRSh0bXAyICsgdG1wNSkpOwogICAgb3V0cHRyWzVdID0gUkwoREVTQ0FMRSh0bXAyIC0gdG1wNSkpOwogICAgb3V0cHRyWzRdID0gUkwoREVTQ0FMRSh0bXAzICsgdG1wNCkpOwogICAgb3V0cHRyWzNdID0gUkwoREVTQ0FMRSh0bXAzIC0gdG1wNCkpOwoKICAgIHdzcHRyICs9IDg7CiAgfQojZW5kaWYKfQovKgoKTWFpbiBSb3V0aW5lcwoKVGhpcyBmaWxlIGNvbnRhaW5zIG1vc3Qgb2YgdGhlIGluaXRpYWxpc2F0aW9uIGFuZCBjb250cm9sIGZ1bmN0aW9ucwoKKEMpIEp1c3RpbiBTY2hvZW1hbiAxOTk4CgoqLwoKLyoKClByaXZhdGUgZnVuY3Rpb24KCkluaXRpYWxpc2UgYWxsIHRoZSBjYWNoZS1hbGlnZWQgZGF0YSBibG9ja3MKCiovCgp2b2lkIFJUanBlZ19pbml0X2RhdGEodm9pZCkKewogdW5zaWduZWQgbG9uZyBkcHRyOwogCiBkcHRyPSh1bnNpZ25lZCBsb25nKSYoUlRqcGVnX2FsbGRhdGFbMF0pOwogZHB0cis9MzI7CiBkcHRyPWRwdHI+PjU7CiBkcHRyPWRwdHI8PDU7IC8qIGNhY2hlIGFsaWduIGRhdGEgKi8KIAogUlRqcGVnX2Jsb2NrPShfX3MxNiAqKWRwdHI7CiBkcHRyKz1zaXplb2YoX19zMTYpKjY0OwogUlRqcGVnX2xxdD0oX19zMzIgKilkcHRyOwogZHB0cis9c2l6ZW9mKF9fczMyKSo2NDsKIFJUanBlZ19jcXQ9KF9fczMyICopZHB0cjsKIGRwdHIrPXNpemVvZihfX3MzMikqNjQ7CiBSVGpwZWdfbGlxdD0oX191MzIgKilkcHRyOwogZHB0cis9c2l6ZW9mKF9fdTMyKSo2NDsKIFJUanBlZ19jaXF0PShfX3UzMiAqKWRwdHI7Cn0KCi8qCgpFeHRlcm5hbCBGdW5jdGlvbgoKUmUtc2V0IHF1YWxpdHkgZmFjdG9yCgpJbnB1dDogYnVmIC0+IHBvaW50ZXIgdG8gMTI4IGludHMgZm9yIHF1YW50IHZhbHVlcyBzdG9yZSB0byBwYXNzIGJhY2sgdG8KICAgICAgICAgICAgICBpbml0X2RlY29tcHJlc3MuCiAgICAgICBRIC0+IHF1YWxpdHkgZmFjdG9yICgxOTI9YmVzdCwgMzI9d29yc3QpCiovCgp2b2lkIFJUanBlZ19pbml0X1EoX191OCBRKQp7CiBpbnQgaTsKIF9fdTY0IHF1YWw7CiAKIHF1YWw9KF9fdTY0KVE8PCgzMi03KTsgLyogMzIgYml0IEZQLCAyNTU9MiwgMD0wICovCgogZm9yKGk9MDsgaTw2NDsgaSsrKQogewogIFJUanBlZ19scXRbaV09KF9fczMyKSgocXVhbC8oKF9fdTY0KVJUanBlZ19sdW1fcXVhbnRfdGJsW2ldPDwxNikpPj4zKTsKICBpZihSVGpwZWdfbHF0W2ldPT0wKVJUanBlZ19scXRbaV09MTsKICBSVGpwZWdfY3F0W2ldPShfX3MzMikoKHF1YWwvKChfX3U2NClSVGpwZWdfY2hyb21fcXVhbnRfdGJsW2ldPDwxNikpPj4zKTsKICBpZihSVGpwZWdfY3F0W2ldPT0wKVJUanBlZ19jcXRbaV09MTsKICBSVGpwZWdfbGlxdFtpXT0oMTw8MTYpLyhSVGpwZWdfbHF0W2ldPDwzKTsKICBSVGpwZWdfY2lxdFtpXT0oMTw8MTYpLyhSVGpwZWdfY3F0W2ldPDwzKTsKICBSVGpwZWdfbHF0W2ldPSgoMTw8MTYpL1JUanBlZ19saXF0W2ldKT4+MzsKICBSVGpwZWdfY3F0W2ldPSgoMTw8MTYpL1JUanBlZ19jaXF0W2ldKT4+MzsKIH0KIAogUlRqcGVnX2xiOD0wOwogd2hpbGUoUlRqcGVnX2xpcXRbUlRqcGVnX1paWysrUlRqcGVnX2xiOF1dPD04KTsKIFJUanBlZ19sYjgtLTsKIFJUanBlZ19jYjg9MDsKIHdoaWxlKFJUanBlZ19jaXF0W1JUanBlZ19aWlsrK1JUanBlZ19jYjhdXTw9OCk7CiBSVGpwZWdfY2I4LS07CgogUlRqcGVnX2RjdF9pbml0KCk7CiBSVGpwZWdfaWRjdF9pbml0KCk7CiBSVGpwZWdfcXVhbnRfaW5pdCgpOwp9CgovKgoKRXh0ZXJuYWwgRnVuY3Rpb24KCkluaXRpYWxpc2UgY29tcHJlc3Npb24uCgpJbnB1dDogYnVmIC0+IHBvaW50ZXIgdG8gMTI4IGludHMgZm9yIHF1YW50IHZhbHVlcyBzdG9yZSB0byBwYXNzIGJhY2sgdG8gCiAgICAgICAgICAgICAgICBpbml0X2RlY29tcHJlc3MuCiAgICAgICB3aWR0aCAtPiB3aWR0aCBvZiBpbWFnZQogICAgICAgaGVpZ2h0IC0+IGhlaWdodCBvZiBpbWFnZQogICAgICAgUSAtPiBxdWFsaXR5IGZhY3RvciAoMTkyPWJlc3QsIDMyPXdvcnN0KQogICAgICAgCiovCgp2b2lkIFJUanBlZ19pbml0X2NvbXByZXNzKF9fdTMyICpidWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgX191OCBRKQp7CiBpbnQgaTsKIF9fdTY0IHF1YWw7CiAKIFJUanBlZ19pbml0X2RhdGEoKTsKIAogUlRqcGVnX3dpZHRoPXdpZHRoOwogUlRqcGVnX2hlaWdodD1oZWlnaHQ7CiBSVGpwZWdfWXdpZHRoID0gUlRqcGVnX3dpZHRoPj4zOwogUlRqcGVnX1lzaXplPXdpZHRoICogaGVpZ2h0OwogUlRqcGVnX0N3aWR0aCA9IFJUanBlZ193aWR0aD4+NDsKIFJUanBlZ19Dc2l6ZT0gKHdpZHRoPj4xKSAqIGhlaWdodDsKCiBxdWFsPShfX3U2NClRPDwoMzItNyk7IC8qIDMyIGJpdCBGUCwgMjU1PTIsIDA9MCAqLwoKIGZvcihpPTA7IGk8NjQ7IGkrKykKIHsKICBSVGpwZWdfbHF0W2ldPShfX3MzMikoKHF1YWwvKChfX3U2NClSVGpwZWdfbHVtX3F1YW50X3RibFtpXTw8MTYpKT4+Myk7CiAgaWYoUlRqcGVnX2xxdFtpXT09MClSVGpwZWdfbHF0W2ldPTE7CiAgUlRqcGVnX2NxdFtpXT0oX19zMzIpKChxdWFsLygoX191NjQpUlRqcGVnX2Nocm9tX3F1YW50X3RibFtpXTw8MTYpKT4+Myk7CiAgaWYoUlRqcGVnX2NxdFtpXT09MClSVGpwZWdfY3F0W2ldPTE7CiAgUlRqcGVnX2xpcXRbaV09KDE8PDE2KS8oUlRqcGVnX2xxdFtpXTw8Myk7CiAgUlRqcGVnX2NpcXRbaV09KDE8PDE2KS8oUlRqcGVnX2NxdFtpXTw8Myk7CiAgUlRqcGVnX2xxdFtpXT0oKDE8PDE2KS9SVGpwZWdfbGlxdFtpXSk+PjM7CiAgUlRqcGVnX2NxdFtpXT0oKDE8PDE2KS9SVGpwZWdfY2lxdFtpXSk+PjM7CiB9CiAKIFJUanBlZ19sYjg9MDsKIHdoaWxlKFJUanBlZ19saXF0W1JUanBlZ19aWlsrK1JUanBlZ19sYjhdXTw9OCk7CiBSVGpwZWdfbGI4LS07CiBSVGpwZWdfY2I4PTA7CiB3aGlsZShSVGpwZWdfY2lxdFtSVGpwZWdfWlpbKytSVGpwZWdfY2I4XV08PTgpOwogUlRqcGVnX2NiOC0tOwogCiBSVGpwZWdfZGN0X2luaXQoKTsKIFJUanBlZ19xdWFudF9pbml0KCk7CgogZm9yKGk9MDsgaTw2NDsgaSsrKQogIGJ1ZltpXT1SVGpwZWdfbGlxdFtpXTsKIGZvcihpPTA7IGk8NjQ7IGkrKykKICBidWZbNjQraV09UlRqcGVnX2NpcXRbaV07Cn0KCnZvaWQgUlRqcGVnX2luaXRfZGVjb21wcmVzcyhfX3UzMiAqYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCnsKIGludCBpOwoKIFJUanBlZ19pbml0X2RhdGEoKTsKIAogUlRqcGVnX3dpZHRoPXdpZHRoOwogUlRqcGVnX2hlaWdodD1oZWlnaHQ7CiBSVGpwZWdfWXdpZHRoID0gUlRqcGVnX3dpZHRoPj4zOwogUlRqcGVnX1lzaXplPXdpZHRoICogaGVpZ2h0OwogUlRqcGVnX0N3aWR0aCA9IFJUanBlZ193aWR0aD4+NDsKIFJUanBlZ19Dc2l6ZT0gKHdpZHRoPj4xKSAqIGhlaWdodDsKCiBmb3IoaT0wOyBpPDY0OyBpKyspCiB7CiAgUlRqcGVnX2xpcXRbaV09YnVmW2ldOwogIFJUanBlZ19jaXF0W2ldPWJ1ZltpKzY0XTsKIH0KCiBSVGpwZWdfbGI4PTA7CiB3aGlsZShSVGpwZWdfbGlxdFtSVGpwZWdfWlpbKytSVGpwZWdfbGI4XV08PTgpOwogUlRqcGVnX2xiOC0tOwogUlRqcGVnX2NiOD0wOwogd2hpbGUoUlRqcGVnX2NpcXRbUlRqcGVnX1paWysrUlRqcGVnX2NiOF1dPD04KTsKIFJUanBlZ19jYjgtLTsKCiBSVGpwZWdfaWRjdF9pbml0KCk7CgovKiBSVGpwZWdfY29sb3JfaW5pdCgpOyAqLwp9CgppbnQgUlRqcGVnX2NvbXByZXNzWVVWNDIwKF9fczggKnNwLCB1bnNpZ25lZCBjaGFyICpicCkKewogX19zOCAqIHNiOwogcmVnaXN0ZXIgX19zOCAqIGJwMSA9IGJwICsgKFJUanBlZ193aWR0aDw8Myk7CiByZWdpc3RlciBfX3M4ICogYnAyID0gYnAgKyBSVGpwZWdfWXNpemU7CiByZWdpc3RlciBfX3M4ICogYnAzID0gYnAyICsgKFJUanBlZ19Dc2l6ZT4+MSk7CiByZWdpc3RlciBpbnQgaSwgaiwgazsKCiNpZmRlZiBIQVZFX0xJQk1NWAogZW1tcygpOwojZW5kaWYKIHNiPXNwOwovKiBZICovCiBmb3IoaT1SVGpwZWdfaGVpZ2h0Pj4xOyBpOyBpLT04KQogewogIGZvcihqPTAsIGs9MDsgajxSVGpwZWdfd2lkdGg7IGorPTE2LCBrKz04KQogIHsKICAgUlRqcGVnX2RjdFkoYnAraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfWXdpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgpOwoKICAgUlRqcGVnX2RjdFkoYnArais4LCBSVGpwZWdfYmxvY2ssIFJUanBlZ19Zd2lkdGgpOwogICBSVGpwZWdfcXVhbnQoUlRqcGVnX2Jsb2NrLCBSVGpwZWdfbHF0KTsKICAgc3ArPVJUanBlZ19iMnMoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCk7CgogICBSVGpwZWdfZGN0WShicDEraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfWXdpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgpOwoKICAgUlRqcGVnX2RjdFkoYnAxK2orOCwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfWXdpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgpOwoKICAgUlRqcGVnX2RjdFkoYnAyK2ssIFJUanBlZ19ibG9jaywgUlRqcGVnX0N3aWR0aCk7CiAgIFJUanBlZ19xdWFudChSVGpwZWdfYmxvY2ssIFJUanBlZ19jcXQpOwogICBzcCs9UlRqcGVnX2IycyhSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfY2I4KTsKCiAgIFJUanBlZ19kY3RZKGJwMytrLCBSVGpwZWdfYmxvY2ssIFJUanBlZ19Dd2lkdGgpOwogICBSVGpwZWdfcXVhbnQoUlRqcGVnX2Jsb2NrLCBSVGpwZWdfY3F0KTsKICAgc3ArPVJUanBlZ19iMnMoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2NiOCk7CgogIH0KICBicCs9UlRqcGVnX3dpZHRoPDw0OwogIGJwMSs9UlRqcGVnX3dpZHRoPDw0OwogIGJwMis9UlRqcGVnX3dpZHRoPDwyOwogIGJwMys9UlRqcGVnX3dpZHRoPDwyOwoJCQkgCiB9CiNpZmRlZiBIQVZFX0xJQk1NWAogZW1tcygpOwojZW5kaWYKIHJldHVybiAoc3Atc2IpOwp9CgppbnQgUlRqcGVnX2NvbXByZXNzWVVWNDIyKF9fczggKnNwLCB1bnNpZ25lZCBjaGFyICpicCkKewogX19zOCAqIHNiOwogcmVnaXN0ZXIgX19zOCAqIGJwMiA9IGJwICsgUlRqcGVnX1lzaXplOwogcmVnaXN0ZXIgX19zOCAqIGJwMyA9IGJwMiArIFJUanBlZ19Dc2l6ZTsKIHJlZ2lzdGVyIGludCBpLCBqLCBrOwoKI2lmZGVmIEhBVkVfTElCTU1YCiBlbW1zKCk7CiNlbmRpZgogc2I9c3A7Ci8qIFkgKi8KIGZvcihpPVJUanBlZ19oZWlnaHQ7IGk7IGktPTgpCiB7CiAgZm9yKGo9MCwgaz0wOyBqPFJUanBlZ193aWR0aDsgais9MTYsIGsrPTgpCiAgewogICBSVGpwZWdfZGN0WShicCtqLCBSVGpwZWdfYmxvY2ssIFJUanBlZ19Zd2lkdGgpOwogICBSVGpwZWdfcXVhbnQoUlRqcGVnX2Jsb2NrLCBSVGpwZWdfbHF0KTsKICAgc3ArPVJUanBlZ19iMnMoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCk7CgogICBSVGpwZWdfZGN0WShicCtqKzgsIFJUanBlZ19ibG9jaywgUlRqcGVnX1l3aWR0aCk7CiAgIFJUanBlZ19xdWFudChSVGpwZWdfYmxvY2ssIFJUanBlZ19scXQpOwogICBzcCs9UlRqcGVnX2IycyhSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfbGI4KTsKCiAgIFJUanBlZ19kY3RZKGJwMitrLCBSVGpwZWdfYmxvY2ssIFJUanBlZ19Dd2lkdGgpOwogICBSVGpwZWdfcXVhbnQoUlRqcGVnX2Jsb2NrLCBSVGpwZWdfY3F0KTsKICAgc3ArPVJUanBlZ19iMnMoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2NiOCk7CgogICBSVGpwZWdfZGN0WShicDMraywgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfQ3dpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2NxdCk7CiAgIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19jYjgpOwoKICB9CiAgYnArPVJUanBlZ193aWR0aDw8MzsKICBicDIrPVJUanBlZ193aWR0aDw8MjsKICBicDMrPVJUanBlZ193aWR0aDw8MjsKCQkJIAogfQojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKI2VuZGlmCiByZXR1cm4gKHNwLXNiKTsKfQoKaW50IFJUanBlZ19jb21wcmVzczgoX19zOCAqc3AsIHVuc2lnbmVkIGNoYXIgKmJwKQp7CiBfX3M4ICogc2I7CiBpbnQgaSwgajsKCiNpZmRlZiBIQVZFX0xJQk1NWAogZW1tcygpOwojZW5kaWYKIAogc2I9c3A7Ci8qIFkgKi8KIGZvcihpPTA7IGk8UlRqcGVnX2hlaWdodDsgaSs9OCkKIHsKICBmb3Ioaj0wOyBqPFJUanBlZ193aWR0aDsgais9OCkKICB7CiAgIFJUanBlZ19kY3RZKGJwK2osIFJUanBlZ19ibG9jaywgUlRqcGVnX3dpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgpOwogIH0KICBicCs9UlRqcGVnX3dpZHRoOwogfQoKI2lmZGVmIEhBVkVfTElCTU1YCiBlbW1zKCk7CiNlbmRpZgogcmV0dXJuIChzcC1zYik7Cn0KCnZvaWQgUlRqcGVnX2RlY29tcHJlc3NZVVY0MjIoX19zOCAqc3AsIF9fdTggKmJwKQp7CiByZWdpc3RlciBfX3M4ICogYnAyID0gYnAgKyBSVGpwZWdfWXNpemU7CiByZWdpc3RlciBfX3M4ICogYnAzID0gYnAyICsgKFJUanBlZ19Dc2l6ZSk7CiBpbnQgaSwgaixrOwoKI2lmZGVmIEhBVkVfTElCTU1YCiBlbW1zKCk7CiNlbmRpZgoKLyogWSAqLwogZm9yKGk9UlRqcGVnX2hlaWdodDsgaTsgaS09OCkKIHsKICBmb3Ioaz0wLCBqPTA7IGo8UlRqcGVnX3dpZHRoOyBqKz0xNiwgays9OCkgewogICBpZigqc3A9PS0xKXNwKys7CiAgIGVsc2UKICAgeyAKICAgIHNwKz1SVGpwZWdfczJiKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgsIFJUanBlZ19saXF0KTsKICAgIFJUanBlZ19pZGN0KGJwK2osIFJUanBlZ19ibG9jaywgUlRqcGVnX3dpZHRoKTsKICAgfQogICBpZigqc3A9PS0xKXNwKys7CiAgIGVsc2UKICAgeyAKICAgIHNwKz1SVGpwZWdfczJiKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgsIFJUanBlZ19saXF0KTsKICAgIFJUanBlZ19pZGN0KGJwK2orOCwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGgpOwogICB9CiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2NiOCwgUlRqcGVnX2NpcXQpOwogICAgUlRqcGVnX2lkY3QoYnAyK2ssIFJUanBlZ19ibG9jaywgUlRqcGVnX3dpZHRoPj4xKTsKICAgfSAKICAgaWYoKnNwPT0tMSlzcCsrOwogICBlbHNlCiAgIHsgCiAgICBzcCs9UlRqcGVnX3MyYihSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfY2I4LCBSVGpwZWdfY2lxdCk7CiAgICBSVGpwZWdfaWRjdChicDMraywgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGg+PjEpOwogICB9IAogIH0KICBicCs9UlRqcGVnX3dpZHRoPDwzOwogIGJwMis9UlRqcGVnX3dpZHRoPDwyOwogIGJwMys9UlRqcGVnX3dpZHRoPDwyOwogfQojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKI2VuZGlmCn0KCnZvaWQgUlRqcGVnX2RlY29tcHJlc3NZVVY0MjAoX19zOCAqc3AsIF9fdTggKmJwKQp7CiByZWdpc3RlciBfX3M4ICogYnAxID0gYnAgKyAoUlRqcGVnX3dpZHRoPDwzKTsKIHJlZ2lzdGVyIF9fczggKiBicDIgPSBicCArIFJUanBlZ19Zc2l6ZTsKIHJlZ2lzdGVyIF9fczggKiBicDMgPSBicDIgKyAoUlRqcGVnX0NzaXplPj4xKTsKIGludCBpLCBqLGs7CgojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKI2VuZGlmCgovKiBZICovCiBmb3IoaT1SVGpwZWdfaGVpZ2h0Pj4xOyBpOyBpLT04KQogewogIGZvcihrPTAsIGo9MDsgajxSVGpwZWdfd2lkdGg7IGorPTE2LCBrKz04KSB7CiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCwgUlRqcGVnX2xpcXQpOwogICAgUlRqcGVnX2lkY3QoYnAraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGgpOwogICB9CiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCwgUlRqcGVnX2xpcXQpOwogICAgUlRqcGVnX2lkY3QoYnArais4LCBSVGpwZWdfYmxvY2ssIFJUanBlZ193aWR0aCk7CiAgIH0KICAgaWYoKnNwPT0tMSlzcCsrOwogICBlbHNlCiAgIHsgCiAgICBzcCs9UlRqcGVnX3MyYihSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfbGI4LCBSVGpwZWdfbGlxdCk7CiAgICBSVGpwZWdfaWRjdChicDEraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGgpOwogICB9CiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCwgUlRqcGVnX2xpcXQpOwogICAgUlRqcGVnX2lkY3QoYnAxK2orOCwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGgpOwogICB9CiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2NiOCwgUlRqcGVnX2NpcXQpOwogICAgUlRqcGVnX2lkY3QoYnAyK2ssIFJUanBlZ19ibG9jaywgUlRqcGVnX3dpZHRoPj4xKTsKICAgfSAKICAgaWYoKnNwPT0tMSlzcCsrOwogICBlbHNlCiAgIHsgCiAgICBzcCs9UlRqcGVnX3MyYihSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfY2I4LCBSVGpwZWdfY2lxdCk7CiAgICBSVGpwZWdfaWRjdChicDMraywgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGg+PjEpOwogICB9IAogIH0KICBicCs9UlRqcGVnX3dpZHRoPDw0OwogIGJwMSs9UlRqcGVnX3dpZHRoPDw0OwogIGJwMis9UlRqcGVnX3dpZHRoPDwyOwogIGJwMys9UlRqcGVnX3dpZHRoPDwyOwogfQojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKI2VuZGlmCn0KCnZvaWQgUlRqcGVnX2RlY29tcHJlc3M4KF9fczggKnNwLCBfX3U4ICpicCkKewogaW50IGksIGo7CgojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKI2VuZGlmCgovKiBZICovCiBmb3IoaT0wOyBpPFJUanBlZ19oZWlnaHQ7IGkrPTgpCiB7CiAgZm9yKGo9MDsgajxSVGpwZWdfd2lkdGg7IGorPTgpCiAgIGlmKCpzcD09LTEpc3ArKzsKICAgZWxzZQogICB7IAogICAgc3ArPVJUanBlZ19zMmIoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCwgUlRqcGVnX2xpcXQpOwogICAgUlRqcGVnX2lkY3QoYnAraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfd2lkdGgpOwogICB9CiAgYnArPVJUanBlZ193aWR0aDw8MzsKIH0KfQoKLyoKRXh0ZXJuYWwgRnVuY3Rpb24KCkluaXRpYWxpc2UgYWRkaXRpb25hbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG1vdGlvbiBjb21wZW5zYXRpb24KCiovCgp2b2lkIFJUanBlZ19pbml0X21jb21wcmVzcyh2b2lkKQp7CiB1bnNpZ25lZCBsb25nIHRtcDsKCiBpZighUlRqcGVnX29sZCkKIHsKICBSVGpwZWdfb2xkPW1hbGxvYygoNCpSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCkrMzIpOwogIHRtcD0odW5zaWduZWQgbG9uZylSVGpwZWdfb2xkOwogIHRtcCs9MzI7CiAgdG1wPXRtcD4+NTsKICBSVGpwZWdfb2xkPShfX3MxNiAqKSh0bXA8PDUpOwogfQogaWYgKCFSVGpwZWdfb2xkKQogewogIGZwcmludGYoc3RkZXJyLCAiUlRqcGVnOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKICBleGl0KC0xKTsKIH0KIGJ6ZXJvKFJUanBlZ19vbGQsICgoNCpSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCkpKTsKfQoKI2lmZGVmIEhBVkVfTElCTU1YCgppbnQgUlRqcGVnX2Jjb21wKF9fczE2ICpvbGQsIG1teF90ICptYXNrKQp7CiBpbnQgaTsKIG1teF90ICptb2xkPShtbXhfdCAqKW9sZDsKIG1teF90ICptYmxvY2s9KG1teF90ICopUlRqcGVnX2Jsb2NrOwogbW14X3QgcmVzdWx0Owogc3RhdGljIG1teF90IG5lZz0obW14X3QpKHVuc2lnbmVkIGxvbmcgbG9uZykweGZmZmZmZmZmZmZmZmZmZmZVTEw7CiAKIG1vdnFfbTJyKCptYXNrLCBtbTcpOwogbW92cV9tMnIobmVnLCBtbTYpOwogcHhvcl9yMnIobW01LCBtbTUpOwogCiBmb3IoaT0wOyBpPDg7IGkrKykKIHsKICBtb3ZxX20ycigqKG1ibG9jaysrKSwgbW0wKTsKICAJCQltb3ZxX20ycigqKG1ibG9jaysrKSwgbW0yKTsKICBtb3ZxX20ycigqKG1vbGQrKyksIG1tMSk7CiAgCQkJbW92cV9tMnIoKihtb2xkKyspLCBtbTMpOwogIHBzdWJzd19yMnIobW0xLCBtbTApOwogIAkJCXBzdWJzd19yMnIobW0zLCBtbTIpOwogIG1vdnFfcjJyKG1tMCwgbW0xKTsKICAJCQltb3ZxX3IycihtbTIsIG1tMyk7CiAgcGNtcGd0d19yMnIobW03LCBtbTApOwogIAkJCXBjbXBndHdfcjJyKG1tNywgbW0yKTsKICBweG9yX3IycihtbTYsIG1tMSk7CiAgCQkJcHhvcl9yMnIobW02LCBtbTMpOwogIHBjbXBndHdfcjJyKG1tNywgbW0xKTsKICAJCQlwY21wZ3R3X3IycihtbTcsIG1tMyk7CiAgcG9yX3IycihtbTAsIG1tNSk7CiAgCQkJcG9yX3IycihtbTIsIG1tNSk7CiAgcG9yX3IycihtbTEsIG1tNSk7CiAgCQkJcG9yX3IycihtbTMsIG1tNSk7CiB9CiBtb3ZxX3IybShtbTUsIHJlc3VsdCk7CiAKIGlmKHJlc3VsdC5xKQogewogIGlmKCFSVGpwZWdfbXRlc3QpCiAgIGZvcihpPTA7IGk8MTY7IGkrKykoKF9fdTY0ICopb2xkKVtpXT0oKF9fdTY0ICopUlRqcGVnX2Jsb2NrKVtpXTsKICByZXR1cm4gMDsKIH0KLyogcHJpbnRmKCIuIik7ICovCiByZXR1cm4gMTsKfQoKI2Vsc2UKaW50IFJUanBlZ19iY29tcChfX3MxNiAqb2xkLCBfX3UxNiAqbWFzaykKewogaW50IGk7CgogZm9yKGk9MDsgaTw2NDsgaSsrKQogIGlmKGFicyhvbGRbaV0tUlRqcGVnX2Jsb2NrW2ldKT4qbWFzaykKICB7CiAgIGlmKCFSVGpwZWdfbXRlc3QpCiAgICBmb3IoaT0wOyBpPDE2OyBpKyspKChfX3U2NCAqKW9sZClbaV09KChfX3U2NCAqKVJUanBlZ19ibG9jaylbaV07CiAgIHJldHVybiAwOwogIH0KIHJldHVybiAxOwp9CiNlbmRpZgoKdm9pZCBSVGpwZWdfc2V0X3Rlc3QoaW50IGkpCnsKIFJUanBlZ19tdGVzdD1pOwp9CgppbnQgUlRqcGVnX21jb21wcmVzcyhfX3M4ICpzcCwgdW5zaWduZWQgY2hhciAqYnAsIF9fdTE2IGxtYXNrLCBfX3UxNiBjbWFzaykKewogX19zOCAqIHNiOwogX19zMTYgKmJsb2NrOwogcmVnaXN0ZXIgX19zOCAqIGJwMjsKIHJlZ2lzdGVyIF9fczggKiBicDM7CiByZWdpc3RlciBpbnQgaSwgaiwgazsKCiNpZmRlZiBIQVZFX0xJQk1NWAogZW1tcygpOwogUlRqcGVnX2xtYXNrPShtbXhfdCkoKChfX3U2NClsbWFzazw8NDgpfCgoX191NjQpbG1hc2s8PDMyKXwoKF9fdTY0KWxtYXNrPDwxNil8bG1hc2spOwogUlRqcGVnX2NtYXNrPShtbXhfdCkoKChfX3U2NCljbWFzazw8NDgpfCgoX191NjQpY21hc2s8PDMyKXwoKF9fdTY0KWNtYXNrPDwxNil8Y21hc2spOwojZWxzZQogUlRqcGVnX2xtYXNrPWxtYXNrOwogUlRqcGVnX2NtYXNrPWNtYXNrOwojZW5kaWYKIAogYnAgPSBicCAtIFJUanBlZ193aWR0aCowOwogYnAyID0gYnAgKyBSVGpwZWdfWXNpemUtUlRqcGVnX3dpZHRoKjA7CiBicDMgPSBicDIgKyBSVGpwZWdfQ3NpemU7Cgogc2I9c3A7CiBibG9jaz1SVGpwZWdfb2xkOwovKiBZICovCiBmb3IoaT1SVGpwZWdfaGVpZ2h0OyBpOyBpLT04KQogewogIGZvcihqPTAsIGs9MDsgajxSVGpwZWdfd2lkdGg7IGorPTE2LCBrKz04KQogIHsKICAgUlRqcGVnX2RjdFkoYnAraiwgUlRqcGVnX2Jsb2NrLCBSVGpwZWdfWXdpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIGlmKFJUanBlZ19iY29tcChibG9jaywgJlJUanBlZ19sbWFzaykpCiAgIHsKICAgICooKF9fdTggKilzcCsrKT0yNTU7CiAgIH0gCgllbHNlIHNwKz1SVGpwZWdfYjJzKFJUanBlZ19ibG9jaywgc3AsIFJUanBlZ19sYjgpOwogICBibG9jays9NjQ7CgogICBSVGpwZWdfZGN0WShicCtqKzgsIFJUanBlZ19ibG9jaywgUlRqcGVnX1l3aWR0aCk7CiAgIFJUanBlZ19xdWFudChSVGpwZWdfYmxvY2ssIFJUanBlZ19scXQpOwogICBpZihSVGpwZWdfYmNvbXAoYmxvY2ssICZSVGpwZWdfbG1hc2spKQogICB7CiAgICAqKChfX3U4ICopc3ArKyk9MjU1OwogICB9IAoJZWxzZSBzcCs9UlRqcGVnX2IycyhSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfbGI4KTsKICAgYmxvY2srPTY0OwoKICAgUlRqcGVnX2RjdFkoYnAyK2ssIFJUanBlZ19ibG9jaywgUlRqcGVnX0N3aWR0aCk7CiAgIFJUanBlZ19xdWFudChSVGpwZWdfYmxvY2ssIFJUanBlZ19jcXQpOwogICBpZihSVGpwZWdfYmNvbXAoYmxvY2ssICZSVGpwZWdfY21hc2spKQogICB7CiAgICAqKChfX3U4ICopc3ArKyk9MjU1OwogICB9IAoJZWxzZSBzcCs9UlRqcGVnX2IycyhSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfY2I4KTsKICAgYmxvY2srPTY0OwoKICAgUlRqcGVnX2RjdFkoYnAzK2ssIFJUanBlZ19ibG9jaywgUlRqcGVnX0N3aWR0aCk7CiAgIFJUanBlZ19xdWFudChSVGpwZWdfYmxvY2ssIFJUanBlZ19jcXQpOwogICBpZihSVGpwZWdfYmNvbXAoYmxvY2ssICZSVGpwZWdfY21hc2spKQogICB7CiAgICAqKChfX3U4ICopc3ArKyk9MjU1OwogICB9IAoJZWxzZSBzcCs9UlRqcGVnX2IycyhSVGpwZWdfYmxvY2ssIHNwLCBSVGpwZWdfY2I4KTsKICAgYmxvY2srPTY0OwoKICB9CiAgYnArPVJUanBlZ193aWR0aDw8MzsKICBicDIrPVJUanBlZ193aWR0aDw8MjsKICBicDMrPVJUanBlZ193aWR0aDw8MjsKIH0KIC8qcHJpbnRmICgiJWRcbiIsIGJsb2NrIC0gUlRqcGVnX29sZCk7ICovCiNpZmRlZiBIQVZFX0xJQk1NWAogZW1tcygpOwojZW5kaWYKIHJldHVybiAoc3Atc2IpOwp9CgppbnQgUlRqcGVnX21jb21wcmVzczgoX19zOCAqc3AsIHVuc2lnbmVkIGNoYXIgKmJwLCBfX3UxNiBsbWFzaykKewogX19zOCAqIHNiOwogX19zMTYgKmJsb2NrOwogaW50IGksIGo7CgojaWZkZWYgSEFWRV9MSUJNTVgKIGVtbXMoKTsKIFJUanBlZ19sbWFzaz0obW14X3QpKCgoX191NjQpbG1hc2s8PDQ4KXwoKF9fdTY0KWxtYXNrPDwzMil8KChfX3U2NClsbWFzazw8MTYpfGxtYXNrKTsKI2Vsc2UKIFJUanBlZ19sbWFzaz1sbWFzazsKI2VuZGlmCgogCiBzYj1zcDsKIGJsb2NrPVJUanBlZ19vbGQ7Ci8qIFkgKi8KIGZvcihpPTA7IGk8UlRqcGVnX2hlaWdodDsgaSs9OCkKIHsKICBmb3Ioaj0wOyBqPFJUanBlZ193aWR0aDsgais9OCkKICB7CiAgIFJUanBlZ19kY3RZKGJwK2osIFJUanBlZ19ibG9jaywgUlRqcGVnX3dpZHRoKTsKICAgUlRqcGVnX3F1YW50KFJUanBlZ19ibG9jaywgUlRqcGVnX2xxdCk7CiAgIGlmKFJUanBlZ19iY29tcChibG9jaywgJlJUanBlZ19sbWFzaykpCiAgIHsKICAgICooKF9fdTggKilzcCsrKT0yNTU7Ci8qICAgIHByaW50ZigiKiAlZCAiLCBzcFstMV0pOyAqLwogICB9IGVsc2Ugc3ArPVJUanBlZ19iMnMoUlRqcGVnX2Jsb2NrLCBzcCwgUlRqcGVnX2xiOCk7CiAgIGJsb2NrKz02NDsKICB9CiAgYnArPVJUanBlZ193aWR0aDw8MzsKIH0KI2lmZGVmIEhBVkVfTElCTU1YCiBlbW1zKCk7CiNlbmRpZgogcmV0dXJuIChzcC1zYik7Cn0KCnZvaWQgUlRqcGVnX2NvbG9yX2luaXQodm9pZCkKewp9ICAKCiNkZWZpbmUgS2NyUiA3NjI4NAojZGVmaW5lIEtjckcgNTMyODEKI2RlZmluZSBLY2JHIDI1NjI1CiNkZWZpbmUgS2NiQiAxMzIyNTIKI2RlZmluZSBLeSA3NjI4NAoKdm9pZCBSVGpwZWdfeXV2NDIycmdiKF9fdTggKmJ1ZiwgX191OCAqcmdiKQp7CiBpbnQgdG1wOwogaW50IGksIGo7CiBfX3MzMiB5LCBjclIsIGNyRywgY2JHLCBjYkI7CiBfX3U4ICpidWZjciwgKmJ1ZmNiLCAqYnVmeSwgKmJ1Zm91dGU7CiBpbnQgeXNraXA7CiAKIHlza2lwPVJUanBlZ193aWR0aDsKIAogYnVmY2I9JmJ1ZltSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodF07CiBidWZjcj0mYnVmW1JUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KyhSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCkvMl07CiBidWZ5PSZidWZbMF07CiBidWZvdXRlPXJnYjsKIAogZm9yKGk9MDsgaTwoUlRqcGVnX2hlaWdodCk7IGkrKykKIHsKICBmb3Ioaj0wOyBqPFJUanBlZ193aWR0aDsgais9MikKICB7CiAgIGNyUj0oKmJ1ZmNyLTEyOCkqS2NyUjsKICAgY3JHPSgqKGJ1ZmNyKyspLTEyOCkqS2NyRzsKICAgY2JHPSgqYnVmY2ItMTI4KSpLY2JHOwogICBjYkI9KCooYnVmY2IrKyktMTI4KSpLY2JCOwogIAogICB5PShidWZ5W2pdLTE2KSpLeTsKICAgCiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwoKICAgeT0oYnVmeVtqKzFdLTE2KSpLeTsKCiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwoKICB9CiAgYnVmeSs9eXNraXA7CiB9Cn0KCgp2b2lkIFJUanBlZ195dXY0MjByZ2IoX191OCAqYnVmLCBfX3U4ICpyZ2IpCnsKIGludCB0bXA7CiBpbnQgaSwgajsKIF9fczMyIHksIGNyUiwgY3JHLCBjYkcsIGNiQjsKIF9fdTggKmJ1ZmNyLCAqYnVmY2IsICpidWZ5LCAqYnVmb3V0ZSwgKmJ1Zm91dG87CiBpbnQgb3NraXAsIHlza2lwOwogCiBvc2tpcD1SVGpwZWdfd2lkdGgqMzsKIHlza2lwPVJUanBlZ193aWR0aDsKIAogYnVmY2I9JmJ1ZltSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodF07CiBidWZjcj0mYnVmW1JUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KyhSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCkvNF07CiBidWZ5PSZidWZbMF07CiBidWZvdXRlPXJnYjsKIGJ1Zm91dG89cmdiK29za2lwOwogCiBmb3IoaT0wOyBpPChSVGpwZWdfaGVpZ2h0Pj4xKTsgaSsrKQogewogIGZvcihqPTA7IGo8UlRqcGVnX3dpZHRoOyBqKz0yKQogIHsKICAgY3JSPSgqYnVmY3ItMTI4KSpLY3JSOwogICBjckc9KCooYnVmY3IrKyktMTI4KSpLY3JHOwogICBjYkc9KCpidWZjYi0xMjgpKktjYkc7CiAgIGNiQj0oKihidWZjYisrKS0xMjgpKktjYkI7CiAgCiAgIHk9KGJ1Znlbal0tMTYpKkt5OwogICAKICAgdG1wPSh5K2NyUik+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NiQik+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CgogICB5PShidWZ5W2orMV0tMTYpKkt5OwoKICAgdG1wPSh5K2NyUik+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NiQik+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CgogICB5PShidWZ5W2oreXNraXBdLTE2KSpLeTsKCiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwoKICAgeT0oYnVmeVtqKzEreXNraXBdLTE2KSpLeTsKCiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICAKICB9CiAgYnVmb3V0ZSs9b3NraXA7CiAgYnVmb3V0bys9b3NraXA7CiAgYnVmeSs9eXNraXA8PDE7CiB9Cn0KCgp2b2lkIFJUanBlZ195dXZyZ2IzMihfX3U4ICpidWYsIF9fdTggKnJnYikKewogaW50IHRtcDsKIGludCBpLCBqOwogX19zMzIgeSwgY3JSLCBjckcsIGNiRywgY2JCOwogX191OCAqYnVmY3IsICpidWZjYiwgKmJ1ZnksICpidWZvdXRlLCAqYnVmb3V0bzsKIGludCBvc2tpcCwgeXNraXA7CiAKIG9za2lwPVJUanBlZ193aWR0aCo0OwogeXNraXA9UlRqcGVnX3dpZHRoOwogCiBidWZjYj0mYnVmW1JUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0XTsKIGJ1ZmNyPSZidWZbUlRqcGVnX3dpZHRoKlJUanBlZ19oZWlnaHQrKFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KS8yXTsKIGJ1Znk9JmJ1ZlswXTsKIGJ1Zm91dGU9cmdiOwogYnVmb3V0bz1yZ2Irb3NraXA7CiAKIGZvcihpPTA7IGk8KFJUanBlZ19oZWlnaHQ+PjEpOyBpKyspCiB7CiAgZm9yKGo9MDsgajxSVGpwZWdfd2lkdGg7IGorPTIpCiAgewogICBjclI9KCpidWZjci0xMjgpKktjclI7CiAgIGNyRz0oKihidWZjcisrKS0xMjgpKktjckc7CiAgIGNiRz0oKmJ1ZmNiLTEyOCkqS2NiRzsKICAgY2JCPSgqKGJ1ZmNiKyspLTEyOCkqS2NiQjsKICAKICAgeT0oYnVmeVtqXS0xNikqS3k7CiAgIAogICB0bXA9KHkrY2JCKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5LWNyRy1jYkcpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHkrY3JSKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgYnVmb3V0ZSsrOwoKICAgeT0oYnVmeVtqKzFdLTE2KSpLeTsKCiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dGUrKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICBidWZvdXRlKys7CgogICB5PShidWZ5W2oreXNraXBdLTE2KSpLeTsKCiAgIHRtcD0oeStjYkIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjclIpPj4xNjsKICAgKihidWZvdXRvKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICBidWZvdXRvKys7CgogICB5PShidWZ5W2orMSt5c2tpcF0tMTYpKkt5OwoKICAgdG1wPSh5K2NiQik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgICooYnVmb3V0bysrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NyUik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIGJ1Zm91dG8rKzsKICAgCiAgfQogIGJ1Zm91dGUrPW9za2lwOwogIGJ1Zm91dG8rPW9za2lwOwogIGJ1ZnkrPXlza2lwPDwxOwogfQp9Cgp2b2lkIFJUanBlZ195dXZyZ2IyNChfX3U4ICpidWYsIF9fdTggKnJnYikKewogaW50IHRtcDsKIGludCBpLCBqOwogX19zMzIgeSwgY3JSLCBjckcsIGNiRywgY2JCOwogX191OCAqYnVmY3IsICpidWZjYiwgKmJ1ZnksICpidWZvdXRlLCAqYnVmb3V0bzsKIGludCBvc2tpcCwgeXNraXA7CiAKIG9za2lwPVJUanBlZ193aWR0aCozOwogeXNraXA9UlRqcGVnX3dpZHRoOwogCiBidWZjYj0mYnVmW1JUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0XTsKIGJ1ZmNyPSZidWZbUlRqcGVnX3dpZHRoKlJUanBlZ19oZWlnaHQrKFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KS80XTsKIGJ1Znk9JmJ1ZlswXTsKIGJ1Zm91dGU9cmdiOwogYnVmb3V0bz1yZ2Irb3NraXA7CiAKIGZvcihpPTA7IGk8KFJUanBlZ19oZWlnaHQ+PjEpOyBpKyspCiB7CiAgZm9yKGo9MDsgajxSVGpwZWdfd2lkdGg7IGorPTIpCiAgewogICBjclI9KCpidWZjci0xMjgpKktjclI7CiAgIGNyRz0oKihidWZjcisrKS0xMjgpKktjckc7CiAgIGNiRz0oKmJ1ZmNiLTEyOCkqS2NiRzsKICAgY2JCPSgqKGJ1ZmNiKyspLTEyOCkqS2NiQjsKICAKICAgeT0oYnVmeVtqXS0xNikqS3k7CiAgIAogICB0bXA9KHkrY2JCKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5LWNyRy1jYkcpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHkrY3JSKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKCiAgIHk9KGJ1ZnlbaisxXS0xNikqS3k7CgogICB0bXA9KHkrY2JCKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5LWNyRy1jYkcpPj4xNjsKICAgKihidWZvdXRlKyspPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHkrY3JSKT4+MTY7CiAgICooYnVmb3V0ZSsrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKCiAgIHk9KGJ1Znlbait5c2tpcF0tMTYpKkt5OwoKICAgdG1wPSh5K2NiQik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgICooYnVmb3V0bysrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NyUik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CgogICB5PShidWZ5W2orMSt5c2tpcF0tMTYpKkt5OwoKICAgdG1wPSh5K2NiQik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgICooYnVmb3V0bysrKT0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NyUik+PjE2OwogICAqKGJ1Zm91dG8rKyk9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIAogIH0KICBidWZvdXRlKz1vc2tpcDsKICBidWZvdXRvKz1vc2tpcDsKICBidWZ5Kz15c2tpcDw8MTsKIH0KfQoKdm9pZCBSVGpwZWdfeXV2cmdiMTYoX191OCAqYnVmLCBfX3U4ICpyZ2IpCnsKIGludCB0bXA7CiBpbnQgaSwgajsKIF9fczMyIHksIGNyUiwgY3JHLCBjYkcsIGNiQjsKIF9fdTggKmJ1ZmNyLCAqYnVmY2IsICpidWZ5LCAqYnVmb3V0ZSwgKmJ1Zm91dG87CiBpbnQgb3NraXAsIHlza2lwOwogdW5zaWduZWQgY2hhciByLCBnLCBiOwogCiBvc2tpcD1SVGpwZWdfd2lkdGgqMjsKIHlza2lwPVJUanBlZ193aWR0aDsKIAogYnVmY2I9JmJ1ZltSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodF07CiBidWZjcj0mYnVmW1JUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KyhSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCkvNF07CiBidWZ5PSZidWZbMF07CiBidWZvdXRlPXJnYjsKIGJ1Zm91dG89cmdiK29za2lwOwogCiBmb3IoaT0wOyBpPChSVGpwZWdfaGVpZ2h0Pj4xKTsgaSsrKQogewogIGZvcihqPTA7IGo8UlRqcGVnX3dpZHRoOyBqKz0yKQogIHsKICAgY3JSPSgqYnVmY3ItMTI4KSpLY3JSOwogICBjckc9KCooYnVmY3IrKyktMTI4KSpLY3JHOwogICBjYkc9KCpidWZjYi0xMjgpKktjYkc7CiAgIGNiQj0oKihidWZjYisrKS0xMjgpKktjYkI7CiAgCiAgIHk9KGJ1Znlbal0tMTYpKkt5OwogICAKICAgdG1wPSh5K2NiQik+PjE2OwogICBiPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHktY3JHLWNiRyk+PjE2OwogICBnPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KHkrY3JSKT4+MTY7CiAgIHI9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oaW50KSgoaW50KWIgPj4gMyk7CiAgIHRtcHw9KGludCkoKChpbnQpZyA+PiAyKSA8PCA1KTsKICAgdG1wfD0oaW50KSgoKGludClyID4+IDMpIDw8IDExKTsKICAgKihidWZvdXRlKyspPXRtcCYweGZmOwogICAqKGJ1Zm91dGUrKyk9dG1wPj44OwogICAKCiAgIHk9KGJ1ZnlbaisxXS0xNikqS3k7CgogICB0bXA9KHkrY2JCKT4+MTY7CiAgIGI9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgIGc9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjclIpPj4xNjsKICAgcj0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPShpbnQpKChpbnQpYiA+PiAzKTsKICAgdG1wfD0oaW50KSgoKGludClnID4+IDIpIDw8IDUpOwogICB0bXB8PShpbnQpKCgoaW50KXIgPj4gMykgPDwgMTEpOwogICAqKGJ1Zm91dGUrKyk9dG1wJjB4ZmY7CiAgICooYnVmb3V0ZSsrKT10bXA+Pjg7CgogICB5PShidWZ5W2oreXNraXBdLTE2KSpLeTsKCiAgIHRtcD0oeStjYkIpPj4xNjsKICAgYj0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5LWNyRy1jYkcpPj4xNjsKICAgZz0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPSh5K2NyUik+PjE2OwogICByPSh0bXA+MjU1KT8yNTU6KCh0bXA8MCk/MDp0bXApOwogICB0bXA9KGludCkoKGludCliID4+IDMpOwogICB0bXB8PShpbnQpKCgoaW50KWcgPj4gMikgPDwgNSk7CiAgIHRtcHw9KGludCkoKChpbnQpciA+PiAzKSA8PCAxMSk7CiAgICooYnVmb3V0bysrKT10bXAmMHhmZjsKICAgKihidWZvdXRvKyspPXRtcD4+ODsKCiAgIHk9KGJ1ZnlbaisxK3lza2lwXS0xNikqS3k7CgogICB0bXA9KHkrY2JCKT4+MTY7CiAgIGI9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeS1jckctY2JHKT4+MTY7CiAgIGc9KHRtcD4yNTUpPzI1NTooKHRtcDwwKT8wOnRtcCk7CiAgIHRtcD0oeStjclIpPj4xNjsKICAgcj0odG1wPjI1NSk/MjU1OigodG1wPDApPzA6dG1wKTsKICAgdG1wPShpbnQpKChpbnQpYiA+PiAzKTsKICAgdG1wfD0oaW50KSgoKGludClnID4+IDIpIDw8IDUpOwogICB0bXB8PShpbnQpKCgoaW50KXIgPj4gMykgPDwgMTEpOwogICAqKGJ1Zm91dG8rKyk9dG1wJjB4ZmY7CiAgICooYnVmb3V0bysrKT10bXA+Pjg7CgogIH0KICBidWZvdXRlKz1vc2tpcDsKICBidWZvdXRvKz1vc2tpcDsKICBidWZ5Kz15c2tpcDw8MTsKIH0KfQoKdm9pZCBSVGpwZWdfeXV2cmdiOChfX3U4ICpidWYsIF9fdTggKnJnYikKewogYmNvcHkoYnVmLCByZ2IsIFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KTsKfQoKdm9pZCBSVGpwZWdfZG91YmxlMzIoX191MzIgKmJ1ZikKewogaW50IGksIGo7CiAKIF9fdTMyICppcHRyLCAqb3B0cjEsICpvcHRyMjsKIAogaXB0cj1idWYrKFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KS0xOwogb3B0cjE9YnVmKyhSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCo0KS0xOwogb3B0cjI9b3B0cjEtKDIqUlRqcGVnX3dpZHRoKTsKIAogZm9yKGk9MDsgaTxSVGpwZWdfaGVpZ2h0OyBpKyspCiB7CiAgZm9yKGo9MDsgajxSVGpwZWdfd2lkdGg7IGorKykKICB7CiAgICoob3B0cjEtLSk9KmlwdHI7CiAgICoob3B0cjEtLSk9KmlwdHI7CiAgICoob3B0cjItLSk9KmlwdHI7CiAgICoob3B0cjItLSk9KihpcHRyLS0pOwogIH0KICBvcHRyMj1vcHRyMi0yKlJUanBlZ193aWR0aDsKICBvcHRyMT1vcHRyMS0yKlJUanBlZ193aWR0aDsKIH0gCn0KCnZvaWQgUlRqcGVnX2RvdWJsZTI0KF9fdTggKmJ1ZikKewp9Cgp2b2lkIFJUanBlZ19kb3VibGUxNihfX3UxNiAqYnVmKQp7CiBpbnQgaSwgajsKIAogX191MTYgKmlwdHIsICpvcHRyMSwgKm9wdHIyOwogCiBpcHRyPWJ1ZisoUlRqcGVnX3dpZHRoKlJUanBlZ19oZWlnaHQpLTE7CiBvcHRyMT1idWYrKFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KjQpLTE7CiBvcHRyMj1vcHRyMS0oMipSVGpwZWdfd2lkdGgpOwogCiBmb3IoaT0wOyBpPFJUanBlZ19oZWlnaHQ7IGkrKykKIHsKICBmb3Ioaj0wOyBqPFJUanBlZ193aWR0aDsgaisrKQogIHsKICAgKihvcHRyMS0tKT0qaXB0cjsKICAgKihvcHRyMS0tKT0qaXB0cjsKICAgKihvcHRyMi0tKT0qaXB0cjsKICAgKihvcHRyMi0tKT0qKGlwdHItLSk7CiAgfQogIG9wdHIyPW9wdHIyLTIqUlRqcGVnX3dpZHRoOwogIG9wdHIxPW9wdHIxLTIqUlRqcGVnX3dpZHRoOwogfSAKfQoKdm9pZCBSVGpwZWdfZG91YmxlOChfX3U4ICpidWYpCnsKIGludCBpLCBqOwogCiBfX3U4ICppcHRyLCAqb3B0cjEsICpvcHRyMjsKIAogaXB0cj1idWYrKFJUanBlZ193aWR0aCpSVGpwZWdfaGVpZ2h0KS0xOwogb3B0cjE9YnVmKyhSVGpwZWdfd2lkdGgqUlRqcGVnX2hlaWdodCo0KS0xOwogb3B0cjI9b3B0cjEtKDIqUlRqcGVnX3dpZHRoKTsKIAogZm9yKGk9MDsgaTxSVGpwZWdfaGVpZ2h0OyBpKyspCiB7CiAgZm9yKGo9MDsgajxSVGpwZWdfd2lkdGg7IGorKykKICB7CiAgICoob3B0cjEtLSk9KmlwdHI7CiAgICoob3B0cjEtLSk9KmlwdHI7CiAgICoob3B0cjItLSk9KmlwdHI7CiAgICoob3B0cjItLSk9KihpcHRyLS0pOwogIH0KICBvcHRyMj1vcHRyMi0yKlJUanBlZ193aWR0aDsKICBvcHRyMT1vcHRyMS0yKlJUanBlZ193aWR0aDsKIH0gCn0KCg==