Lyogd2luZHVuaS5jIC0tIHVuaWNvZGUgc3VwcG9ydCBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4KICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDcsIDIwMDkKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCiAgIFJld3JpdHRlbiBieSBLYWkgVGlldHosIE9uZXZpc2lvbi4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKICAgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCgovKiBUaGlzIGZpbGUgY29udGFpbnMgdW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgd2luZHJlcwogICBwcm9ncmFtLiAgSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBnZW5lcmljIHVuaWNvZGUgc3VwcG9ydCB3aGljaAogICB3b3VsZCB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgSG93ZXZlciwgd2UgZG9uJ3QuICBJbnN0ZWFkLCBvbiBhCiAgIFdpbmRvd3MgaG9zdCwgd2UgYXJlIHByZXBhcmVkIHRvIGNhbGwgc29tZSBXaW5kb3dzIHJvdXRpbmVzLiAgVGhpcwogICBtZWFucyB0aGF0IHdlIHdpbGwgZ2VuZXJhdGUgZGlmZmVyZW50IG91dHB1dCBvbiBXaW5kb3dzIGFuZCBVbml4CiAgIGhvc3RzLCBidXQgdGhhdCBzZWVtcyBiZXR0ZXIgdGhhbiBub3QgcmVhbGx5IHN1cHBvcnRpbmcgdW5pY29kZSBhdAogICBhbGwuICAqLwoKI2luY2x1ZGUgInN5c2RlcC5oIgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJsaWJpYmVydHkuaCIgLyogZm9yIHhzdHJkdXAgKi8KI2luY2x1ZGUgImJ1Y29tbS5oIgovKiBNdXN0IGJlIGluY2x1ZGUgYmVmb3JlIHdpbmRvd3MuaCBhbmQgd2lubmxzLmguICAqLwojaWYgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKQojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8d2lubmxzLmg+CiNlbmRpZgojaW5jbHVkZSAid2luZHVuaS5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgoKI2lmIEhBVkVfSUNPTlYKI2luY2x1ZGUgPGljb252Lmg+CiNlbmRpZgoKc3RhdGljIHJjX3VpbnRfdHlwZSB3aW5kX1dpZGVDaGFyVG9NdWx0aUJ5dGUgKHJjX3VpbnRfdHlwZSwgY29uc3QgdW5pY2hhciAqLCBjaGFyICosIHJjX3VpbnRfdHlwZSk7CnN0YXRpYyByY191aW50X3R5cGUgd2luZF9NdWx0aUJ5dGVUb1dpZGVDaGFyIChyY191aW50X3R5cGUsIGNvbnN0IGNoYXIgKiwgdW5pY2hhciAqLCByY191aW50X3R5cGUpOwpzdGF0aWMgaW50IHVuaWNoYXJfaXNhc2NpaSAoY29uc3QgdW5pY2hhciAqLCByY191aW50X3R5cGUpOwoKLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gIFdlIGp1c3QgY29weSBpdCwKICAgZXhwYW5kaW5nIGNoYXJzIHRvIHNob3J0cywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LiAgKi8KIAojaWYgIWRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCgovKiBDb2RlcGFnZXMgbWFwcGVkLiAgKi8Kc3RhdGljIGxvY2FsX2ljb252X21hcCBjb2RlcGFnZXNbXSA9CnsKICB7IDAsICJNUy1BTlNJIiB9LAogIHsgMSwgIldJTkRPV1MtMTI1MiIgfSwKICB7IDQzNywgIk1TLUFOU0kiIH0sCiAgeyA3MzcsICJNUy1HUkVFSyIgfSwKICB7IDc3NSwgIldJTkJBTFRSSU0iIH0sCiAgeyA4NTAsICJNUy1BTlNJIiB9LAogIHsgODUyLCAiTVMtRUUiIH0sCiAgeyA4NTcsICJNUy1UVVJLIiB9LAogIHsgODYyLCAiQ1A4NjIiIH0sCiAgeyA4NjQsICJDUDg2NCIgfSwKICB7IDg2NiwgIk1TLUNZUkwiIH0sCiAgeyA4NzQsICJXSU5ET1dTLTg3NCIgfSwKICB7IDkzMiwgIkNQOTMyIiB9LAogIHsgOTM2LCAiQ1A5MzYiIH0sCiAgeyA5NDksICJDUDk0OSIgfSwKICB7IDk1MCwgIkNQOTUwIiB9LAogIHsgMTI1MCwgIldJTkRPV1MtMTI1MCIgfSwKICB7IDEyNTEsICJXSU5ET1dTLTEyNTEiIH0sCiAgeyAxMjUyLCAiV0lORE9XUy0xMjUyIiB9LAogIHsgMTI1MywgIldJTkRPV1MtMTI1MyIgfSwKICB7IDEyNTQsICJXSU5ET1dTLTEyNTQiIH0sCiAgeyAxMjU1LCAiV0lORE9XUy0xMjU1IiB9LAogIHsgMTI1NiwgIldJTkRPV1MtMTI1NiIgfSwKICB7IDEyNTcsICJXSU5ET1dTLTEyNTciIH0sCiAgeyAxMjU4LCAiV0lORE9XUy0xMjU4IiB9LAogIHsgQ1BfVVRGNywgIlVURi03IiB9LAogIHsgQ1BfVVRGOCwgIlVURi04IiB9LAogIHsgQ1BfVVRGMTYsICJVVEYtMTYiIH0sCiAgeyAocmNfdWludF90eXBlKSAtMSwgTlVMTCB9Cn07CgovKiBMYW5ndWFnZXMgc3VwcG9ydGVkLiAgKi8Kc3RhdGljIGNvbnN0IHdpbmRfbGFuZ3VhZ2VfdCBsYW5ndWFnZXNbXSA9CnsKICB7IDB4MDAwMCwgNDM3LCAxMjUyLCAiTmV1dHJhbCIsICJOZXV0cmFsIiB9LAogIHsgMHgwNDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiU2F1ZGkgQXJhYmlhIiB9LCAgICB7IDB4MDQwMiwgODY2LCAxMjUxLCAiQnVsZ2FyaWFuIiwgIkJ1bGdhcmlhIiB9LAogIHsgMHgwNDAzLCA4NTAsIDEyNTIsICJDYXRhbGFuIiwgIlNwYWluIiB9LAkgICAgICB7IDB4MDQwNCwgOTUwLCAgOTUwLCAiQ2hpbmVzZSIsICJUYWl3YW4iIH0sCiAgeyAweDA0MDUsIDg1MiwgMTI1MCwgIkN6ZWNoIiwgIkN6ZWNoIFJlcHVibGljIiB9LCAgIHsgMHgwNDA2LCA4NTAsIDEyNTIsICJEYW5pc2giLCAiRGVubWFyayIgfSwKICB7IDB4MDQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkdlcm1hbnkiIH0sCSAgICAgIHsgMHgwNDA4LCA3MzcsIDEyNTMsICJHcmVlayIsICJHcmVlY2UiIH0sCiAgeyAweDA0MDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIFN0YXRlcyIgfSwgIHsgMHgwNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gVHJhZGl0aW9uYWwgU29ydCIsICJTcGFpbiIgfSwKICB7IDB4MDQwQiwgODUwLCAxMjUyLCAiRmlubmlzaCIsICJGaW5sYW5kIiB9LAkgICAgICB7IDB4MDQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkZyYW5jZSIgfSwKICB7IDB4MDQwRCwgODYyLCAxMjU1LCAiSGVicmV3IiwgIklzcmFlbCIgfSwJICAgICAgeyAweDA0MEUsIDg1MiwgMTI1MCwgIkh1bmdhcmlhbiIsICJIdW5nYXJ5IiB9LAogIHsgMHgwNDBGLCA4NTAsIDEyNTIsICJJY2VsYW5kaWMiLCAiSWNlbGFuZCIgfSwgICAgICB7IDB4MDQxMCwgODUwLCAxMjUyLCAiSXRhbGlhbiIsICJJdGFseSIgfSwKICB7IDB4MDQxMSwgOTMyLCAgOTMyLCAiSmFwYW5lc2UiLCAiSmFwYW4iIH0sCSAgICAgIHsgMHgwNDEyLCA5NDksICA5NDksICJLb3JlYW4iLCAiS29yZWEgKHNvdXRoKSIgfSwKICB7IDB4MDQxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiTmV0aGVybGFuZHMiIH0sICAgICAgeyAweDA0MTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoQm9rbeVsKSIsICJOb3J3YXkiIH0sCiAgeyAweDA0MTUsIDg1MiwgMTI1MCwgIlBvbGlzaCIsICJQb2xhbmQiIH0sCSAgICAgIHsgMHgwNDE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIkJyYXppbCIgfSwKICB7IDB4MDQxOCwgODUyLCAxMjUwLCAiUm9tYW5pYW4iLCAiUm9tYW5pYSIgfSwJICAgICAgeyAweDA0MTksIDg2NiwgMTI1MSwgIlJ1c3NpYW4iLCAiUnVzc2lhIiB9LAogIHsgMHgwNDFBLCA4NTIsIDEyNTAsICJDcm9hdGlhbiIsICJDcm9hdGlhIiB9LAkgICAgICB7IDB4MDQxQiwgODUyLCAxMjUwLCAiU2xvdmFrIiwgIlNsb3Zha2lhIiB9LAogIHsgMHgwNDFDLCA4NTIsIDEyNTAsICJBbGJhbmlhbiIsICJBbGJhbmlhIiB9LAkgICAgICB7IDB4MDQxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCIsICJTd2VkZW4iIH0sCiAgeyAweDA0MUUsIDg3NCwgIDg3NCwgIlRoYWkiLCAiVGhhaWxhbmQiIH0sCSAgICAgIHsgMHgwNDFGLCA4NTcsIDEyNTQsICJUdXJraXNoIiwgIlR1cmtleSIgfSwKICB7IDB4MDQyMSwgODUwLCAxMjUyLCAiSW5kb25lc2lhbiIsICJJbmRvbmVzaWEiIH0sICAgeyAweDA0MjIsIDg2NiwgMTI1MSwgIlVrcmFpbmlhbiIsICJVa3JhaW5lIiB9LAogIHsgMHgwNDIzLCA4NjYsIDEyNTEsICJCZWxhcnVzaWFuIiwgIkJlbGFydXMiIH0sICAgICB7IDB4MDQyNCwgODUyLCAxMjUwLCAiU2xvdmVuZSIsICJTbG92ZW5pYSIgfSwKICB7IDB4MDQyNSwgNzc1LCAxMjU3LCAiRXN0b25pYW4iLCAiRXN0b25pYSIgfSwJICAgICAgeyAweDA0MjYsIDc3NSwgMTI1NywgIkxhdHZpYW4iLCAiTGF0dmlhIiB9LAogIHsgMHgwNDI3LCA3NzUsIDEyNTcsICJMaXRodWFuaWFuIiwgIkxpdGh1YW5pYSIgfSwKICB7IDB4MDQyOSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkZhcnNpIiB9LAkgICAgICB7IDB4MDQyQSwxMjU4LCAxMjU4LCAiVmlldG5hbWVzZSIsICJWaWV0bmFtIiB9LAogIHsgMHgwNDJELCA4NTAsIDEyNTIsICJCYXNxdWUiLCAiU3BhaW4iIH0sCiAgeyAweDA0MkYsIDg2NiwgMTI1MSwgIk1hY2Vkb25pYW4iLCAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSIgfSwKICB7IDB4MDQzNiwgODUwLCAxMjUyLCAiQWZyaWthYW5zIiwgIlNvdXRoIEFmcmljYSIgfSwKICB7IDB4MDQzOCwgODUwLCAxMjUyLCAiRmFyb2VzZSIsICJGYXJvZSBJc2xhbmRzIiB9LAogIHsgMHgwNDNDLCA0MzcsIDEyNTIsICJJcmlzaCIsICJJcmVsYW5kIiB9LAogIHsgMHgwNDNFLCA4NTAsIDEyNTIsICJNYWxheSIsICJNYWxheXNpYSIgfSwKICB7IDB4MDgwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIklyYXEiIH0sCiAgeyAweDA4MDQsIDkzNiwgIDkzNiwgIkNoaW5lc2UgKFBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hKSIsICJQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSIgfSwKICB7IDB4MDgwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIlN3aXR6ZXJsYW5kIiB9LAogIHsgMHgwODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIlVuaXRlZCBLaW5nZG9tIiB9LCB7IDB4MDgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJNZXhpY28iIH0sCiAgeyAweDA4MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJCZWxnaXVtIiB9LAogIHsgMHgwODEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIlN3aXR6ZXJsYW5kIiB9LAogIHsgMHgwODEzLCA4NTAsIDEyNTIsICJEdXRjaCIsICJCZWxnaXVtIiB9LAkgICAgICB7IDB4MDgxNCwgODUwLCAxMjUyLCAiTm9yd2VnaWFuIChOeW5vcnNrKSIsICJOb3J3YXkiIH0sCiAgeyAweDA4MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiUG9ydHVnYWwiIH0sCiAgeyAweDA4MUEsIDg1MiwgMTI1MiwgIlNlcmJpYW4gKGxhdGluKSIsICJZdWdvc2xhdmlhIiB9LAogIHsgMHgwODFELCA4NTAsIDEyNTIsICJTd2VkaXNoIChGaW5sYW5kKSIsICJGaW5sYW5kIiB9LAogIHsgMHgwQzAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiRWd5cHQiIH0sCiAgeyAweDBDMDQsIDk1MCwgIDk1MCwgIkNoaW5lc2UiLCAiSG9uZyBLb25nIiB9LAogIHsgMHgwQzA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiQXVzdHJpYSIgfSwKICB7IDB4MEMwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJBdXN0cmFsaWEiIH0sICAgICAgeyAweDBDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2ggLSBJbnRlcm5hdGlvbmFsIFNvcnQiLCAiU3BhaW4iIH0sCiAgeyAweDBDMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJDYW5hZGEifSwKICB7IDB4MEMxQSwgODU1LCAxMjUxLCAiU2VyYmlhbiAoQ3lyaWxsaWMpIiwgIlNlcmJpYSIgfSwKICB7IDB4MTAwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkxpYnlhIiB9LAogIHsgMHgxMDA0LCA5MzYsICA5MzYsICJDaGluZXNlIiwgIlNpbmdhcG9yZSIgfSwKICB7IDB4MTAwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkx1eGVtYm91cmciIH0sCiAgeyAweDEwMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQ2FuYWRhIiB9LAogIHsgMHgxMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkd1YXRlbWFsYSIgfSwKICB7IDB4MTAwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIlN3aXR6ZXJsYW5kIiB9LAogIHsgMHgxNDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiQWxnZXJpYSIgfSwKICB7IDB4MTQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkxpZWNodGVuc3RlaW4iIH0sCiAgeyAweDE0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiTmV3IFplYWxhbmQiIH0sICAgIHsgMHgxNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkNvc3RhIFJpY2EiIH0sCiAgeyAweDE0MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJMdXhlbWJvdXJnIiB9LAogIHsgMHgxODAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiTW9yb2NjbyIgfSwKICB7IDB4MTgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJJcmVsYW5kIiB9LAkgICAgICB7IDB4MTgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYW5hbWEiIH0sCiAgeyAweDE4MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJNb25hY28iIH0sCiAgeyAweDFDMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJUdW5pc2lhIiB9LAogIHsgMHgxQzA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlNvdXRoIEFmcmljYSIgfSwgICB7IDB4MUMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJEb21pbmljYW4gUmVwdWJsaWMiIH0sCiAgeyAweDIwMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJPbWFuIiB9LAogIHsgMHgyMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkphbWFpY2EiIH0sCSAgICAgIHsgMHgyMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlZlbmV6dWVsYSIgfSwKICB7IDB4MjQwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlllbWVuIiB9LAogIHsgMHgyNDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhcmliYmVhbiIgfSwgICAgICB7IDB4MjQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDb2xvbWJpYSIgfSwKICB7IDB4MjgwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlN5cmlhIiB9LAogIHsgMHgyODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkJlbGl6ZSIgfSwJICAgICAgeyAweDI4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGVydSIgfSwKICB7IDB4MkMwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkpvcmRhbiIgfSwKICB7IDB4MkMwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJUcmluaWRhZCAmIFRvYmFnbyIgfSx7IDB4MkMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJBcmdlbnRpbmEiIH0sCiAgeyAweDMwMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJMZWJhbm9uIiB9LAogIHsgMHgzMDA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlppbWJhYndlIiB9LAkgICAgICB7IDB4MzAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJFY3VhZG9yIiB9LAogIHsgMHgzNDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiS3V3YWl0IiB9LAogIHsgMHgzNDA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlBoaWxpcHBpbmVzIiB9LCAgICB7IDB4MzQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDaGlsZSIgfSwKICB7IDB4MzgwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiB9LAogIHsgMHgzODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlVydWd1YXkiIH0sCiAgeyAweDNDMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJCYWhyYWluIiB9LAogIHsgMHgzQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBhcmFndWF5IiB9LAogIHsgMHg0MDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiUWF0YXIiIH0sCiAgeyAweDQwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQm9saXZpYSIgfSwKICB7IDB4NDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJFbCBTYWx2YWRvciIgfSwKICB7IDB4NDgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJIb25kdXJhcyIgfSwKICB7IDB4NEMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJOaWNhcmFndWEiIH0sCiAgeyAweDUwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUHVlcnRvIFJpY28iIH0sCiAgeyAodW5zaWduZWQpIC0xLCAgMCwgICAgICAwLCBOVUxMLCBOVUxMIH0KfTsKCiNlbmRpZgoKLyogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGNvZGVwYWdlIHRvIGJlIHVzZWQgZm9yIHVuaWNvZGUKICAgdHJhbnNmb3JtYXRpb25zLiAgQnkgZGVmYXVsdCB0aGlzIGlzIENQX0FDUC4gICovCnJjX3VpbnRfdHlwZSB3aW5kX2RlZmF1bHRfY29kZXBhZ2UgPSBDUF9BQ1A7CgovKiBTcGVjaWZpZXMgdGhlIGN1cnJlbnRseSB1c2VkIGNvZGVwYWdlIGZvciB1bmljb2RlCiAgIHRyYW5zZm9ybWF0aW9ucy4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBDUF9BQ1AuICAqLwpyY191aW50X3R5cGUgd2luZF9jdXJyZW50X2NvZGVwYWdlID0gQ1BfQUNQOwoKLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gIFdlIGp1c3QgY29weSBpdCwKICAgZXhwYW5kaW5nIGNoYXJzIHRvIHNob3J0cywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LiAgKi8KCnZvaWQKdW5pY29kZV9mcm9tX2FzY2lpIChyY191aW50X3R5cGUgKmxlbmd0aCwgdW5pY2hhciAqKnVuaWNvZGUsIGNvbnN0IGNoYXIgKmFzY2lpKQp7CiAgdW5pY29kZV9mcm9tX2NvZGVwYWdlIChsZW5ndGgsIHVuaWNvZGUsIGFzY2lpLCB3aW5kX2N1cnJlbnRfY29kZXBhZ2UpOwp9CgovKiBDb252ZXJ0IGFuIHVuaWNvZGUgc3RyaW5nIHRvIGFuIEFTQ0lJIHN0cmluZy4gIFdlIGp1c3QgY29weSBpdCwKICAgc2hyaW5rIHNob3J0cyB0byBjaGFycywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LgogICBTaG9ydHMgd2l0aCBub3Qgd2l0aGluIHRoZSBjaGFyIHJhbmdlIGFyZSByZXBsYWNlZCBieSAnXycuICAqLwoKdm9pZAphc2NpaV9mcm9tX3VuaWNvZGUgKHJjX3VpbnRfdHlwZSAqbGVuZ3RoLCBjb25zdCB1bmljaGFyICp1bmljb2RlLCBjaGFyICoqYXNjaWkpCnsKICBjb2RlcGFnZV9mcm9tX3VuaWNvZGUgKGxlbmd0aCwgdW5pY29kZSwgYXNjaWksIHdpbmRfY3VycmVudF9jb2RlcGFnZSk7Cn0KCi8qIFByaW50IHRoZSB1bmljb2RlIHN0cmluZyBVTklDT0RFIHRvIHRoZSBmaWxlIEUuICBMRU5HVEggaXMgdGhlCiAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByaW50LCBvciAtMSBpZiB3ZSBzaG91bGQgcHJpbnQgdW50aWwgdGhlCiAgIGVuZCBvZiB0aGUgc3RyaW5nLiAgRklYTUU6IE9uIGEgV2luZG93cyBob3N0LCB3ZSBzaG91bGQgYmUgY2FsbGluZwogICBzb21lIFdpbmRvd3MgZnVuY3Rpb24sIHByb2JhYmx5IFdpZGVDaGFyVG9NdWx0aUJ5dGUuICAqLwoKdm9pZAp1bmljb2RlX3ByaW50IChGSUxFICplLCBjb25zdCB1bmljaGFyICp1bmljb2RlLCByY191aW50X3R5cGUgbGVuZ3RoKQp7CiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIHVuaWNoYXIgY2g7CgogICAgICBpZiAobGVuZ3RoID09IDApCglyZXR1cm47CiAgICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIGxlbmd0aCA+IDApCgktLWxlbmd0aDsKCiAgICAgIGNoID0gKnVuaWNvZGU7CgogICAgICBpZiAoY2ggPT0gMCAmJiAoYmZkX3NpZ25lZF92bWEpIGxlbmd0aCA8IDApCglyZXR1cm47CgogICAgICArK3VuaWNvZGU7CgogICAgICBpZiAoKGNoICYgMHg3ZikgPT0gY2gpCgl7CgkgIGlmIChjaCA9PSAnXFwnKQoJICAgIGZwdXRzICgiXFxcXCIsIGUpOwoJICBlbHNlIGlmIChjaCA9PSAnIicpCgkgICAgZnB1dHMgKCJcIlwiIiwgZSk7CgkgIGVsc2UgaWYgKElTUFJJTlQgKGNoKSkKCSAgICBwdXRjIChjaCwgZSk7CgkgIGVsc2UKCSAgICB7CgkgICAgICBzd2l0Y2ggKGNoKQoJCXsKCQljYXNlIEVTQ0FQRV9BOgoJCSAgZnB1dHMgKCJcXGEiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9COgoJCSAgZnB1dHMgKCJcXGIiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9GOgoJCSAgZnB1dHMgKCJcXGYiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9OOgoJCSAgZnB1dHMgKCJcXG4iLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9SOgoJCSAgZnB1dHMgKCJcXHIiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9UOgoJCSAgZnB1dHMgKCJcXHQiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9WOgoJCSAgZnB1dHMgKCJcXHYiLCBlKTsKCQkgIGJyZWFrOwoKCQlkZWZhdWx0OgoJCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKCQkgIGJyZWFrOwoJCX0KCSAgICB9Cgl9CiAgICAgIGVsc2UgaWYgKChjaCAmIDB4ZmYpID09IGNoKQoJZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKICAgICAgZWxzZQoJZnByaW50ZiAoZSwgIlxceCUwNHgiLCAodW5zaWduZWQgaW50KSBjaCk7CiAgICB9Cn0KCi8qIFByaW50IGEgdW5pY29kZSBzdHJpbmcgdG8gYSBmaWxlLiAgKi8KCnZvaWQKYXNjaWlfcHJpbnQgKEZJTEUgKmUsIGNvbnN0IGNoYXIgKnMsIHJjX3VpbnRfdHlwZSBsZW5ndGgpCnsKICB3aGlsZSAoMSkKICAgIHsKICAgICAgY2hhciBjaDsKCiAgICAgIGlmIChsZW5ndGggPT0gMCkKCXJldHVybjsKICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgbGVuZ3RoID4gMCkKCS0tbGVuZ3RoOwoKICAgICAgY2ggPSAqczsKCiAgICAgIGlmIChjaCA9PSAwICYmIChiZmRfc2lnbmVkX3ZtYSkgbGVuZ3RoIDwgMCkKCXJldHVybjsKCiAgICAgICsrczsKCiAgICAgIGlmICgoY2ggJiAweDdmKSA9PSBjaCkKCXsKCSAgaWYgKGNoID09ICdcXCcpCgkgICAgZnB1dHMgKCJcXFxcIiwgZSk7CgkgIGVsc2UgaWYgKGNoID09ICciJykKCSAgICBmcHV0cyAoIlwiXCIiLCBlKTsKCSAgZWxzZSBpZiAoSVNQUklOVCAoY2gpKQoJICAgIHB1dGMgKGNoLCBlKTsKCSAgZWxzZQoJICAgIHsKCSAgICAgIHN3aXRjaCAoY2gpCgkJewoJCWNhc2UgRVNDQVBFX0E6CgkJICBmcHV0cyAoIlxcYSIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX0I6CgkJICBmcHV0cyAoIlxcYiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX0Y6CgkJICBmcHV0cyAoIlxcZiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX046CgkJICBmcHV0cyAoIlxcbiIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1I6CgkJICBmcHV0cyAoIlxcciIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1Q6CgkJICBmcHV0cyAoIlxcdCIsIGUpOwoJCSAgYnJlYWs7CgoJCWNhc2UgRVNDQVBFX1Y6CgkJICBmcHV0cyAoIlxcdiIsIGUpOwoJCSAgYnJlYWs7CgoJCWRlZmF1bHQ6CgkJICBmcHJpbnRmIChlLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgY2gpOwoJCSAgYnJlYWs7CgkJfQoJICAgIH0KCX0KICAgICAgZWxzZQoJZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoICYgMHhmZik7CiAgICB9Cn0KCnJjX3VpbnRfdHlwZQp1bmljaGFyX2xlbiAoY29uc3QgdW5pY2hhciAqdW5pY29kZSkKewogIHJjX3VpbnRfdHlwZSByID0gMDsKCiAgaWYgKHVuaWNvZGUpCiAgICB3aGlsZSAodW5pY29kZVtyXSAhPSAwKQogICAgICByKys7CiAgZWxzZQogICAgLS1yOwogIHJldHVybiByOwp9Cgp1bmljaGFyICoKdW5pY2hhcl9kdXAgKGNvbnN0IHVuaWNoYXIgKnVuaWNvZGUpCnsKICB1bmljaGFyICpyOwogIGludCBsZW47CgogIGlmICghIHVuaWNvZGUpCiAgICByZXR1cm4gTlVMTDsKICBmb3IgKGxlbiA9IDA7IHVuaWNvZGVbbGVuXSAhPSAwOyArK2xlbikKICAgIDsKICArK2xlbjsKICByID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAobGVuICogc2l6ZW9mICh1bmljaGFyKSkpOwogIG1lbWNweSAociwgdW5pY29kZSwgbGVuICogc2l6ZW9mICh1bmljaGFyKSk7CiAgcmV0dXJuIHI7Cn0KCnVuaWNoYXIgKgp1bmljaGFyX2R1cF91cHBlcmNhc2UgKGNvbnN0IHVuaWNoYXIgKnUpCnsKICB1bmljaGFyICpyID0gdW5pY2hhcl9kdXAgKHUpOwogIGludCBpOwoKICBpZiAoISByKQogICAgcmV0dXJuIE5VTEw7CgogIGZvciAoaSA9IDA7IHJbaV0gIT0gMDsgKytpKQogICAgewogICAgICBpZiAocltpXSA+PSAnYScgJiYgcltpXSA8PSAneicpCglyW2ldICY9IDB4ZGY7CiAgICB9CiAgcmV0dXJuIHI7Cn0KCnN0YXRpYyBpbnQKdW5pY2hhcl9pc2FzY2lpIChjb25zdCB1bmljaGFyICp1LCByY191aW50X3R5cGUgbGVuKQp7CiAgcmNfdWludF90eXBlIGk7CgogIGlmICgoYmZkX3NpZ25lZF92bWEpIGxlbiA8IDApCiAgICB7CiAgICAgIGlmICh1KQoJbGVuID0gKHJjX3VpbnRfdHlwZSkgdW5pY2hhcl9sZW4gKHUpOwogICAgICBlbHNlCglsZW4gPSAwOwogICAgfQoKICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICBpZiAoKHVbaV0gJiAweGZmODApICE9IDApCiAgICAgIHJldHVybiAwOwogIHJldHVybiAxOwp9Cgp2b2lkCnVuaWNvZGVfcHJpbnRfcXVvdGVkIChGSUxFICplLCBjb25zdCB1bmljaGFyICp1LCByY191aW50X3R5cGUgbGVuKQp7CiAgaWYgKCEgdW5pY2hhcl9pc2FzY2lpICh1LCBsZW4pKQogICAgZnB1dGMgKCdMJywgZSk7CiAgZnB1dGMgKCciJywgZSk7CiAgdW5pY29kZV9wcmludCAoZSwgdSwgbGVuKTsKICBmcHV0YyAoJyInLCBlKTsKfQoKaW50CnVuaWNvZGVfaXNfdmFsaWRfY29kZXBhZ2UgKHJjX3VpbnRfdHlwZSBjcCkKewogIGlmICgoY3AgJiAweGZmZmYpICE9IGNwKQogICAgcmV0dXJuIDA7CiAgaWYgKGNwID09IENQX1VURjE2IHx8IGNwID09IENQX0FDUCkKICAgIHJldHVybiAxOwoKI2lmICFkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTl9fKQogIGlmICghIHdpbmRfZmluZF9jb2RlcGFnZV9pbmZvIChjcCkpCiAgICByZXR1cm4gMDsKICByZXR1cm4gMTsKI2Vsc2UKICByZXR1cm4gISEgSXNWYWxpZENvZGVQYWdlICgoVUlOVCkgY3ApOwojZW5kaWYKfQoKI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKCiNkZWZpbmUgbWF4X2NwX3N0cmluZ19sZW4gNgoKc3RhdGljIHVuc2lnbmVkIGludApjb2RlcGFnZV9mcm9tX2xhbmdpZCAodW5zaWduZWQgc2hvcnQgbGFuZ2lkKQp7CiAgY2hhciBjcF9zdHJpbmcgW21heF9jcF9zdHJpbmdfbGVuXTsKICBpbnQgYzsKCiAgbWVtc2V0IChjcF9zdHJpbmcsIDAsIG1heF9jcF9zdHJpbmdfbGVuKTsKICAvKiBMT0NBTEVfUkVUVVJOX05VTUJFUiBmbGFnIHdvdWxkIGF2b2lkIHN0cnRvdWwgY29udmVyc2lvbiwKICAgICBidXQgaXMgdW5hdmFpbGFibGUgb24gV2luOTUuICAqLwogIGMgPSBHZXRMb2NhbGVJbmZvQSAoTUFLRUxDSUQgKGxhbmdpZCwgU09SVF9ERUZBVUxUKSwKICAJCSAgICAgIExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwKICAJCSAgICAgIGNwX3N0cmluZywgbWF4X2NwX3N0cmluZ19sZW4pOwogIC8qIElmIGNvZGVwYWdlIGRhdGEgZm9yIGFuIExDSUQgaXMgbm90IGluc3RhbGxlZCBvbiB1c2VycydzIHN5c3RlbSwKICAgICBHZXRMb2NhbGVJbmZvIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgRmFsbCBiYWNrIHRvIHN5c3RlbSBBTlNJCiAgICAgZGVmYXVsdC4gKi8KICBpZiAoYyA9PSAwKQogICAgcmV0dXJuIENQX0FDUDsKICByZXR1cm4gc3RydG91bCAoY3Bfc3RyaW5nLCAwLCAxMCk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQKd2luY29kZXBhZ2VfZnJvbV9sYW5naWQgKHVuc2lnbmVkIHNob3J0IGxhbmdpZCkKewogIGNoYXIgY3Bfc3RyaW5nIFttYXhfY3Bfc3RyaW5nX2xlbl07CiAgaW50IGM7CgogIG1lbXNldCAoY3Bfc3RyaW5nLCAwLCBtYXhfY3Bfc3RyaW5nX2xlbik7CiAgLyogTE9DQUxFX1JFVFVSTl9OVU1CRVIgZmxhZyB3b3VsZCBhdm9pZCBzdHJ0b3VsIGNvbnZlcnNpb24sCiAgICAgYnV0IGlzIHVuYXZhaWxhYmxlIG9uIFdpbjk1LiAgKi8KICBjID0gR2V0TG9jYWxlSW5mb0EgKE1BS0VMQ0lEIChsYW5naWQsIFNPUlRfREVGQVVMVCksCgkJICAgICAgTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsCgkJICAgICAgY3Bfc3RyaW5nLCBtYXhfY3Bfc3RyaW5nX2xlbik7CiAgLyogSWYgY29kZXBhZ2UgZGF0YSBmb3IgYW4gTENJRCBpcyBub3QgaW5zdGFsbGVkIG9uIHVzZXJzJ3Mgc3lzdGVtLAogICAgIEdldExvY2FsZUluZm8gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuICBGYWxsIGJhY2sgdG8gc3lzdGVtIEFOU0kKICAgICBkZWZhdWx0LiAqLwogIGlmIChjID09IDApCiAgICByZXR1cm4gQ1BfT0VNOwogIHJldHVybiBzdHJ0b3VsIChjcF9zdHJpbmcsIDAsIDEwKTsKfQoKc3RhdGljIGNoYXIgKgpsYW5nX2Zyb21fbGFuZ2lkICh1bnNpZ25lZCBzaG9ydCBsYW5naWQpCnsKICBjaGFyIGNwX3N0cmluZ1syNjFdOwogIGludCBjOwoKICBtZW1zZXQgKGNwX3N0cmluZywgMCwgMjYxKTsKICBjID0gR2V0TG9jYWxlSW5mb0EgKE1BS0VMQ0lEIChsYW5naWQsIFNPUlRfREVGQVVMVCksCiAgCQkgICAgICBMT0NBTEVfU0VOR0xBTkdVQUdFLAogIAkJICAgICAgY3Bfc3RyaW5nLCAyNjApOwogIC8qIElmIGNvZGVwYWdlIGRhdGEgZm9yIGFuIExDSUQgaXMgbm90IGluc3RhbGxlZCBvbiB1c2VycydzIHN5c3RlbSwKICAgICBHZXRMb2NhbGVJbmZvIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgRmFsbCBiYWNrIHRvIHN5c3RlbSBBTlNJCiAgICAgZGVmYXVsdC4gKi8KICBpZiAoYyA9PSAwKQogICAgc3RyY3B5IChjcF9zdHJpbmcsICJOZXV0cmFsIik7CiAgcmV0dXJuIHhzdHJkdXAgKGNwX3N0cmluZyk7Cn0KCnN0YXRpYyBjaGFyICoKY291bnRyeV9mcm9tX2xhbmdpZCAodW5zaWduZWQgc2hvcnQgbGFuZ2lkKQp7CiAgY2hhciBjcF9zdHJpbmdbMjYxXTsKICBpbnQgYzsKCiAgbWVtc2V0IChjcF9zdHJpbmcsIDAsIDI2MSk7CiAgYyA9IEdldExvY2FsZUluZm9BIChNQUtFTENJRCAobGFuZ2lkLCBTT1JUX0RFRkFVTFQpLAogIAkJICAgICAgTE9DQUxFX1NFTkdDT1VOVFJZLAogIAkJICAgICAgY3Bfc3RyaW5nLCAyNjApOwogIC8qIElmIGNvZGVwYWdlIGRhdGEgZm9yIGFuIExDSUQgaXMgbm90IGluc3RhbGxlZCBvbiB1c2VycydzIHN5c3RlbSwKICAgICBHZXRMb2NhbGVJbmZvIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgRmFsbCBiYWNrIHRvIHN5c3RlbSBBTlNJCiAgICAgZGVmYXVsdC4gKi8KICBpZiAoYyA9PSAwKQogICAgc3RyY3B5IChjcF9zdHJpbmcsICJOZXV0cmFsIik7CiAgcmV0dXJuIHhzdHJkdXAgKGNwX3N0cmluZyk7Cn0KCiNlbmRpZgoKY29uc3Qgd2luZF9sYW5ndWFnZV90ICoKd2luZF9maW5kX2xhbmd1YWdlX2J5X2lkICh1bnNpZ25lZCBpZCkKewojaWYgIWRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCiAgaW50IGk7CgogIGlmICghIGlkKQogICAgcmV0dXJuIE5VTEw7CiAgZm9yIChpID0gMDsgbGFuZ3VhZ2VzW2ldLmlkICE9ICh1bnNpZ25lZCkgLTEgJiYgbGFuZ3VhZ2VzW2ldLmlkICE9IGlkOyBpKyspCiAgICA7CiAgaWYgKGxhbmd1YWdlc1tpXS5pZCA9PSBpZCkKICAgIHJldHVybiAmbGFuZ3VhZ2VzW2ldOwogIHJldHVybiBOVUxMOwojZWxzZQogIHN0YXRpYyB3aW5kX2xhbmd1YWdlX3Qgd2w7CgogIHdsLmlkID0gaWQ7CiAgd2wuZG9zY3AgPSBjb2RlcGFnZV9mcm9tX2xhbmdpZCAoKHVuc2lnbmVkIHNob3J0KSBpZCk7CiAgd2wud2luY3AgPSB3aW5jb2RlcGFnZV9mcm9tX2xhbmdpZCAoKHVuc2lnbmVkIHNob3J0KSBpZCk7CiAgd2wubmFtZSA9IGxhbmdfZnJvbV9sYW5naWQgKCh1bnNpZ25lZCBzaG9ydCkgaWQpOwogIHdsLmNvdW50cnkgPSBjb3VudHJ5X2Zyb21fbGFuZ2lkICgodW5zaWduZWQgc2hvcnQpIGlkKTsKCiAgcmV0dXJuICYgd2w7CiNlbmRpZgp9Cgpjb25zdCBsb2NhbF9pY29udl9tYXAgKgp3aW5kX2ZpbmRfY29kZXBhZ2VfaW5mbyAodW5zaWduZWQgY3ApCnsKI2lmICFkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTl9fKQogIGludCBpOwoKICBmb3IgKGkgPSAwOyBjb2RlcGFnZXNbaV0uY29kZXBhZ2UgIT0gKHJjX3VpbnRfdHlwZSkgLTEgJiYgY29kZXBhZ2VzW2ldLmNvZGVwYWdlICE9IGNwOyBpKyspCiAgICA7CiAgaWYgKGNvZGVwYWdlc1tpXS5jb2RlcGFnZSA9PSAocmNfdWludF90eXBlKSAtMSkKICAgIHJldHVybiBOVUxMOwogIHJldHVybiAmY29kZXBhZ2VzW2ldOwojZWxzZQogIHN0YXRpYyBsb2NhbF9pY29udl9tYXAgbGltOwogIGlmICghdW5pY29kZV9pc192YWxpZF9jb2RlcGFnZSAoY3ApKQogIAlyZXR1cm4gTlVMTDsKICBsaW0uY29kZXBhZ2UgPSBjcDsKICBsaW0uaWNvbnZfbmFtZSA9ICIiOwogIHJldHVybiAmIGxpbTsKI2VuZGlmCn0KCi8qIENvbnZlcnQgYW4gQ29kZXBhZ2Ugc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICAqLwoKdm9pZAp1bmljb2RlX2Zyb21fY29kZXBhZ2UgKHJjX3VpbnRfdHlwZSAqbGVuZ3RoLCB1bmljaGFyICoqdSwgY29uc3QgY2hhciAqc3JjLCByY191aW50X3R5cGUgY3ApCnsKICByY191aW50X3R5cGUgbGVuOwoKICBsZW4gPSB3aW5kX011bHRpQnl0ZVRvV2lkZUNoYXIgKGNwLCBzcmMsIE5VTEwsIDApOwogIGlmIChsZW4pCiAgICB7CiAgICAgICp1ID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAobGVuKSk7CiAgICAgIHdpbmRfTXVsdGlCeXRlVG9XaWRlQ2hhciAoY3AsIHNyYywgKnUsIGxlbik7CiAgICB9CiAgLyogRGlzY291bnQgdGhlIHRyYWlsaW5nICcvMCcuICBJZiBNdWx0aUJ5dGVUb1dpZGVDaGFyIGZhaWxlZCwKICAgICB0aGlzIHdpbGwgc2V0ICpsZW5ndGggdG8gLTEuICAqLwogIGxlbiAtPSBzaXplb2YgKHVuaWNoYXIpOwoKICBpZiAobGVuZ3RoICE9IE5VTEwpCiAgICAqbGVuZ3RoID0gbGVuIC8gc2l6ZW9mICh1bmljaGFyKTsKfQoKLyogQ29udmVydCBhbiB1bmljb2RlIHN0cmluZyB0byBhbiBjb2RlcGFnZSBzdHJpbmcuICAqLwoKdm9pZApjb2RlcGFnZV9mcm9tX3VuaWNvZGUgKHJjX3VpbnRfdHlwZSAqbGVuZ3RoLCBjb25zdCB1bmljaGFyICp1bmljb2RlLCBjaGFyICoqYXNjaWksIHJjX3VpbnRfdHlwZSBjcCkKewogIHJjX3VpbnRfdHlwZSBsZW47CgogIGxlbiA9IHdpbmRfV2lkZUNoYXJUb011bHRpQnl0ZSAoY3AsIHVuaWNvZGUsIE5VTEwsIDApOwogIGlmIChsZW4pCiAgICB7CiAgICAgICphc2NpaSA9IChjaGFyICopIHJlc19hbGxvYyAobGVuICogc2l6ZW9mIChjaGFyKSk7CiAgICAgIHdpbmRfV2lkZUNoYXJUb011bHRpQnl0ZSAoY3AsIHVuaWNvZGUsICphc2NpaSwgbGVuKTsKICAgIH0KICAvKiBEaXNjb3VudCB0aGUgdHJhaWxpbmcgJy8wJy4gIElmIE11bHRpQnl0ZVRvV2lkZUNoYXIgZmFpbGVkLAogICAgIHRoaXMgd2lsbCBzZXQgKmxlbmd0aCB0byAtMS4gICovCiAgbGVuLS07CgogIGlmIChsZW5ndGggIT0gTlVMTCkKICAgICpsZW5ndGggPSBsZW47Cn0KCiNpZiBkZWZpbmVkIChIQVZFX0lDT05WKSAmJiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKc3RhdGljIGludAppY29udl9vbmVjaGFyIChpY29udl90IGNkLCBJQ09OVl9DT05TVCBjaGFyICpzLCBjaGFyICpkLCBpbnQgZF9sZW4sIGNvbnN0IGNoYXIgKipuX3MsIGNoYXIgKipuX2QpCnsKICBpbnQgaTsKCiAgZm9yIChpID0gMTsgaSA8PSAzMjsgaSsrKQogICAgewogICAgICBjaGFyICp0bXBfZCA9IGQ7CiAgICAgIElDT05WX0NPTlNUIGNoYXIgKnRtcF9zID0gczsKICAgICAgc2l6ZV90IHJldDsKICAgICAgc2l6ZV90IHNfbGVmdCA9IChzaXplX3QpIGk7CiAgICAgIHNpemVfdCBkX2xlZnQgPSAoc2l6ZV90KSBkX2xlbjsKCiAgICAgIHJldCA9IGljb252IChjZCwgJiB0bXBfcywgJiBzX2xlZnQsICYgdG1wX2QsICYgZF9sZWZ0KTsKCiAgICAgIGlmIChyZXQgIT0gKHNpemVfdCkgLTEpCgl7CgkgICpuX3MgPSB0bXBfczsKCSAgKm5fZCA9IHRtcF9kOwoJICByZXR1cm4gMDsKCX0KICAgIH0KCiAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICoKd2luZF9pY29udl9jcCAocmNfdWludF90eXBlIGNwKQp7CiAgY29uc3QgbG9jYWxfaWNvbnZfbWFwICpsaW0gPSB3aW5kX2ZpbmRfY29kZXBhZ2VfaW5mbyAoY3ApOwoKICBpZiAoIWxpbSkKICAgIHJldHVybiBOVUxMOwogIHJldHVybiBsaW0tPmljb252X25hbWU7Cn0KI2VuZGlmIC8qIEhBVkVfSUNPTlYgKi8KCnN0YXRpYyByY191aW50X3R5cGUKd2luZF9NdWx0aUJ5dGVUb1dpZGVDaGFyIChyY191aW50X3R5cGUgY3AsIGNvbnN0IGNoYXIgKm1iLAoJCQkgIHVuaWNoYXIgKnUsIHJjX3VpbnRfdHlwZSB1X2xlbikKewogIHJjX3VpbnRfdHlwZSByZXQgPSAwOwoKI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKICByY191aW50X3R5cGUgY29udl9mbGFncyA9IE1CX1BSRUNPTVBPU0VEOwoKICAvKiBNQl9QUkVDT01QT1NFRCBpcyBub3QgYWxsb3dlZCBmb3IgVVRGLTcgb3IgVVRGLTguICAKICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyIHdpbGwgc2V0IHRoZSBsYXN0IGVycm9yIHRvCiAgICAgRVJST1JfSU5WQUxJRF9GTEFHUyBpZiB3ZSBkby4gKi8KICBpZiAoY3AgPT0gQ1BfVVRGOCB8fCBjcCA9PSBDUF9VVEY3KQogICAgY29udl9mbGFncyA9IDA7CgogIHJldCA9IChyY191aW50X3R5cGUpIE11bHRpQnl0ZVRvV2lkZUNoYXIgKGNwLCBjb252X2ZsYWdzLAoJCQkJCSAgICBtYiwgLTEsIHUsIHVfbGVuKTsKICAvKiBDb252ZXJ0IHRvIGJ5dGVzLiAqLwogIHJldCAqPSBzaXplb2YgKHVuaWNoYXIpOwoKI2VsaWYgZGVmaW5lZCAoSEFWRV9JQ09OVikKICBpbnQgZmlyc3QgPSAxOwogIGNoYXIgdG1wWzMyXTsKICBjaGFyICpwX3RtcDsKICBjb25zdCBjaGFyICppY29udl9uYW1lID0gd2luZF9pY29udl9jcCAoY3ApOwoKICBpZiAoIW1iIHx8ICFpY29udl9uYW1lKQogICAgcmV0dXJuIDA7CiAgaWNvbnZfdCBjZCA9IGljb252X29wZW4gKCJVVEYtMTYiLCBpY29udl9uYW1lKTsKCiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIGludCBpcmV0OwogICAgICBjb25zdCBjaGFyICpuX21iID0gIiI7CiAgICAgIGNoYXIgKm5fdG1wID0gIiI7CgogICAgICBwX3RtcCA9IHRtcDsKICAgICAgaXJldCA9IGljb252X29uZWNoYXIgKGNkLCAoSUNPTlZfQ09OU1QgY2hhciAqKSBtYiwgcF90bXAsIDMyLCAmIG5fbWIsICYgbl90bXApOwogICAgICBpZiAoZmlyc3QpCgl7CgkgIGZpcnN0ID0gMDsKCSAgY29udGludWU7Cgl9CiAgICAgIGlmICghaXJldCkKCXsKCSAgc2l6ZV90IGxfdG1wID0gKHNpemVfdCkgKG5fdG1wIC0gcF90bXApOwoKCSAgaWYgKHUpCgkgICAgewoJICAgICAgaWYgKChzaXplX3QpIHVfbGVuIDwgbF90bXApCgkJYnJlYWs7CgkgICAgICBtZW1jcHkgKHUsIHRtcCwgbF90bXApOwoJICAgICAgdSArPSBsX3RtcC8yOwoJICAgICAgdV9sZW4gLT0gbF90bXA7CgkgICAgfQoJICByZXQgKz0gbF90bXA7Cgl9CiAgICAgIGVsc2UKCWJyZWFrOwogICAgICBpZiAodG1wWzBdID09IDAgJiYgdG1wWzFdID09IDApCglicmVhazsKICAgICAgbWIgPSBuX21iOwogICAgfQogIGljb252X2Nsb3NlIChjZCk7CiNlbHNlCiAgaWYgKGNwKQogICAgcmV0ID0gMDsKICByZXQgPSBzdHJsZW4gKG1iKSArIDE7CiAgcmV0ICo9IHNpemVvZiAodW5pY2hhcik7CiAgaWYgKHUgIT0gTlVMTCAmJiB1X2xlbiAhPSAwKQogICAgewogICAgICBkbwoJewoJICAqdSsrID0gKCh1bmljaGFyKSAqbWIpICYgMHhmZjsKCSAgLS11X2xlbjsgbWIrKzsKCX0KICAgICAgd2hpbGUgKHVfbGVuICE9IDAgJiYgbWJbLTFdICE9IDApOwogICAgfQogIGlmICh1ICE9IE5VTEwgJiYgdV9sZW4gIT0gMCkKICAgICp1ID0gMDsKI2VuZGlmCiAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHJjX3VpbnRfdHlwZQp3aW5kX1dpZGVDaGFyVG9NdWx0aUJ5dGUgKHJjX3VpbnRfdHlwZSBjcCwgY29uc3QgdW5pY2hhciAqdSwgY2hhciAqbWIsIHJjX3VpbnRfdHlwZSBtYl9sZW4pCnsKICByY191aW50X3R5cGUgcmV0ID0gMDsKI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKICBXSU5CT09MIHVzZWRfZGVmID0gRkFMU0U7CgogIHJldCA9IChyY191aW50X3R5cGUpIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKGNwLCAwLCB1LCAtMSwgbWIsIG1iX2xlbiwKCQkJCSAgICAgIAkgICAgTlVMTCwgJiB1c2VkX2RlZik7CiNlbGlmIGRlZmluZWQgKEhBVkVfSUNPTlYpCiAgaW50IGZpcnN0ID0gMTsKICBjaGFyIHRtcFszMl07CiAgY2hhciAqcF90bXA7CiAgY29uc3QgY2hhciAqaWNvbnZfbmFtZSA9IHdpbmRfaWNvbnZfY3AgKGNwKTsKCiAgaWYgKCF1IHx8ICFpY29udl9uYW1lKQogICAgcmV0dXJuIDA7CiAgaWNvbnZfdCBjZCA9IGljb252X29wZW4gKGljb252X25hbWUsICJVVEYtMTYiKTsKCiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIGludCBpcmV0OwogICAgICBjb25zdCBjaGFyICpuX3UgPSAiIjsKICAgICAgY2hhciAqbl90bXAgPSAiIjsKCiAgICAgIHBfdG1wID0gdG1wOwogICAgICBpcmV0ID0gaWNvbnZfb25lY2hhciAoY2QsIChJQ09OVl9DT05TVCBjaGFyICopIHUsIHBfdG1wLCAzMiwgJm5fdSwgJiBuX3RtcCk7CiAgICAgIGlmIChmaXJzdCkKCXsKCSAgZmlyc3QgPSAwOwoJICBjb250aW51ZTsKCX0KICAgICAgaWYgKCFpcmV0KQoJewoJICBzaXplX3QgbF90bXAgPSAoc2l6ZV90KSAobl90bXAgLSBwX3RtcCk7CgoJICBpZiAobWIpCgkgICAgewoJICAgICAgaWYgKChzaXplX3QpIG1iX2xlbiA8IGxfdG1wKQoJCWJyZWFrOwoJICAgICAgbWVtY3B5IChtYiwgdG1wLCBsX3RtcCk7CgkgICAgICBtYiArPSBsX3RtcDsKCSAgICAgIG1iX2xlbiAtPSBsX3RtcDsKCSAgICB9CgkgIHJldCArPSBsX3RtcDsKCX0KICAgICAgZWxzZQoJYnJlYWs7CiAgICAgIGlmICh1WzBdID09IDApCglicmVhazsKICAgICAgdSA9IChjb25zdCB1bmljaGFyICopIG5fdTsKICAgIH0KICBpY29udl9jbG9zZSAoY2QpOwojZWxzZQogIGlmIChjcCkKICAgIHJldCA9IDA7CgogIHdoaWxlICh1W3JldF0gIT0gMCkKICAgICsrcmV0OwoKICArK3JldDsKCiAgaWYgKG1iKQogICAgewogICAgICB3aGlsZSAoKnUgIT0gMCAmJiBtYl9sZW4gIT0gMCkKCXsKCSAgaWYgKHVbMF0gPT0gKHVbMF0gJiAweDdmKSkKCSAgICAqbWIrKyA9IChjaGFyKSB1WzBdOwoJICBlbHNlCgkgICAgKm1iKysgPSAnXyc7CgkgICsrdTsgLS1tYl9sZW47Cgl9CiAgICAgIGlmIChtYl9sZW4gIT0gMCkKCSptYiA9IDA7CiAgICB9CiNlbmRpZgogIHJldHVybiByZXQ7Cn0K