LyogJCBEVkNTIElEOiAkamVyfCw1MjMvbGhvcyxLWVRQITQxMDIzMTYxXGIiPyIgPDw9IERPIE5PVCBERUxFVEUhICovCgovKiBkZGF0ZS5jIC4uIGNvbnZlcnRzIGJvcmluZyBub3JtYWwgZGF0ZXMgdG8gZnVuIERpc2NvcmRpYW4gRGF0ZSAtPjwtCiAgIHdyaXR0ZW4gIHRoZSA2NXRoIGRheSBvZiBUaGUgQWZ0ZXJtYXRoIGluIHRoZSBZZWFyIG9mIE91ciBMYWR5IG9mIAogICBEaXNjb3JkIDMxNTcgYnkgRHJ1ZWwgdGhlIENoYW90aWMgYWthIEplcmVteSBKb2huc29uIGFrYQogICBtcHl0aG9uQGdudS5haS5taXQuZWR1ICAKICAgICAgMjggU2V2ZXIgU3QgQXB0ICMzCiAgICAgIFdvcmNlc3RlciBNQSAwMTYwOQoKICAgYW5kIEknbSBub3QgcmVzcG9uc2libGUgaWYgdGhpcyBwcm9ncmFtIG1lc3NlcyBhbnl0aGluZyB1cCAoZXhjZXB0IHlvdXIgCiAgIG1pbmQsIEknbSByZXNwb25zaWJsZSBmb3IgdGhhdCkKCiAgIChrKSBZT0xEIDMxNjEgYW5kIGFsbCB0aW1lIGJlZm9yZSBhbmQgYWZ0ZXIuCiAgIFJlcHJpbnQsIHJldXNlLCBhbmQgcmVjeWNsZSB3aGF0IHlvdSB3aXNoLgogICBUaGlzIHByb2dyYW0gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICBEaXN0cmlidXRlIGZyZWVseS4gIE9yIG5vdC4KCiAgIE1ham9ybHkgaGFja2VkLCBleHRlbmRlZCBhbmQgYm9nb3RpZmllZC9kZWJvZ290aWZpZWQgb24gCiAgIFN3ZWV0bW9ybiwgQnVyZWF1Y3JhY3kgNDIsIDMxNjEgWU9MRCwgYnkgTGVlIEg6LiBPOi4gU21pdGgsIEtZVFAsIAogICBha2EgQW5kcmV3IEJ1bGhhaywgYWthIGFjYkBkZXYubnVsbC5vcmcKCiAgIGFuZCBJJ20gbm90IHJlc3BvbnNpYmxlIGlmIHRoaXMgcHJvZ3JhbSBtZXNzZXMgYW55dGhpbmcgdXAgKGV4Y2VwdCB5b3VyIAogICBtaW5kLCBJJ20gcmVzcG9uc2libGUgZm9yIHRoYXQpIChhbmQgdGhhdCBnb2VzIGZvciBtZSBhcyB3ZWxsIC0tbGhvcykKCiAgIFZlcnNpb24gaGlzdG9yeToKICAgQnVyZWZsdXggMzE2MTogICAgICBGaXJzdCByZWxlYXNlIG9mIGVuaGFuY2VkIGRkYXRlIHdpdGggZm9ybWF0IHN0cmluZ3MKICAgNTkgQmN5LCAzMTYxOiAgICAgICBQUkFJU0VfQk9CIGFuZCBLSUxMX0JPQiBvcHRpb25zIHNwbGl0LCBvdGhlciBtaW5vcgogICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuCgogICAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICAgLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAoKICAgMjAwMC0wMy0xNyBCdXJ0IEhvbHptYW4gPGJuaEBpbmFtZS5jb20+CiAgIC0gYWRkZWQgcmFuZ2UgY2hlY2tzIGZvciBkYXRlcwoqLwoKLyogY29uZmlndXJhdGlvbiBvcHRpb25zICBWVlZWViAgIFJFQUQgVEhJUyEhISAqLwoKLyogSWYgeW91IHdpc2ggZGRhdGUoMSkgdG8gcHJpbnQgdGhlIGRhdGUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIERydWVsJ3MgCiAqIG9yaWdpbmFsIGRkYXRlIHdoZW4gY2FsbGVkIGluIGltbWVkaWF0ZSBtb2RlLCBkZWZpbmUgT0xEX0lNTUVESUFURV9GTVQgCiAqLwoKI2RlZmluZSBPTERfSU1NRURJQVRFX0ZNVAoKLyogSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBVUyBmb3JtYXQgZm9yIGFuZXJpc3RpYyBkYXRlcyAobS1kLXkpLCBhcyBvcHBvc2VkIHRvCiAqIHRoZSBDb21tb253ZWFsdGggZm9ybWF0LCBkZWZpbmUgVVNfRk9STUFULgogKi8KCi8qICNkZWZpbmUgVVNfRk9STUFUICovCgovKiBJZiB5b3UgYXJlIGlkZW9sb2dpY2FsbHksIHRoZW9sb2dpY2FsbHkgb3Igb3RoZXJ3aXNlIG9wcG9zZWQgdG8gdGhlIAogKiBDaHVyY2ggb2YgdGhlIFN1Ykdlbml1cyBhbmQgZG8gbm90IHdpc2ggeW91ciBjb3B5IG9mIGRkYXRlKDEpIHRvIGNvbnRhaW4KICogY29kZSBmb3IgY291bnRpbmcgZG93biB0byBYLURheSwgdW5kZWZpbmUgS0lMTF9CT0IgKi8KCiNkZWZpbmUgS0lMTF9CT0IgMTMwMTMKCi8qIElmIHlvdSB3aXNoIGRkYXRlKDEpIHRvIGNvbnRhaW4gU3ViR2VuaXVzIHNsb2dhbnMsIGRlZmluZSBQUkFJU0VfQk9CICovCgovKiNkZWZpbmUgUFJBSVNFX0JPQiAxMzAxMyovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJubHMuaCIKCiNpZm5kZWYgX19HTlVDX18KI2RlZmluZSBpbmxpbmUgLyogZm9vICovCiNlbmRpZgoKI2lmZGVmIEtJTExfQk9CCmludCB4ZGF5X2NvdW50ZG93bihpbnQgeWRheSwgaW50IHllYXIpOwojZW5kaWYKCgovKiBzdHJpbmcgY29uc3RhbnRzICovCgpjaGFyICpkYXlfbG9uZ1s1XSA9IHsgCiAgICAiU3dlZXRtb3JuIiwgIkJvb210aW1lIiwgIlB1bmdlbmRheSIsICJQcmlja2xlLVByaWNrbGUiLCAiU2V0dGluZyBPcmFuZ2UiCn07CgpjaGFyICpkYXlfc2hvcnRbNV0gPSB7IlNNIiwiQlQiLCJQRCIsIlBQIiwiU08ifTsKCmNoYXIgKnNlYXNvbl9sb25nWzVdID0geyAKICAgICJDaGFvcyIsICJEaXNjb3JkIiwgIkNvbmZ1c2lvbiIsICJCdXJlYXVjcmFjeSIsICJUaGUgQWZ0ZXJtYXRoIgp9OwoKY2hhciAqc2Vhc29uX3Nob3J0WzVdID0geyJDaHMiLCAiRHNjIiwgIkNmbiIsICJCY3kiLCAiQWZtIn07CgpjaGFyICpob2x5ZGF5WzVdWzJdID0geyAKICAgIHsgIk11bmdkYXkiLCAiQ2hhb2ZsdXgiIH0sCiAgICB7ICJNb2pvZGF5IiwgIkRpc2NvZmx1eCIgfSwKICAgIHsgIlN5YWRheSIsICAiQ29uZnVmbHV4IiB9LAogICAgeyAiWmFyYWRheSIsICJCdXJlZmx1eCIgfSwKICAgIHsgIk1hbGFkYXkiLCAiQWZmbHV4IiB9Cn07CgpzdHJ1Y3QgZGlzY190aW1lIHsKICAgIGludCBzZWFzb247IC8qIDAtNCAqLwogICAgaW50IGRheTsgLyogMC03MiAqLwogICAgaW50IHlkYXk7IC8qIDAtMzY1ICovCiAgICBpbnQgeWVhcjsgLyogMzA2Ni0gKi8KfTsKCmNoYXIgKmV4Y2xbXSA9IHsKICAgICJIYWlsIEVyaXMhIiwgIkFsbCBIYWlsIERpc2NvcmRpYSEiLCAiS2FsbGlzdGkhIiwgIkZub3JkLiIsICJPciBub3QuIiwKICAgICJXaWJibGUuIiwgIlB6YXQhIiwgIlAndGFuZyEiLCAiRnJpbmshIiwgCiNpZmRlZiBQUkFJU0VfQk9CCiAgICAiU2xhY2shIiwgIlByYWlzZSBcIkJvYlwiISIsICJPciBraWxsIG1lLiIsCiNlbmRpZiAvKiBQUkFJU0VfQk9CICovCiAgICAvKiByYW5kb21uZXNzLCBmcm9tIHRoZSBOZXQgYW5kIG90aGVyIHBsYWNlcy4gRmVlbCBmcmVlIHRvIGFkZCAoYWZ0ZXIKICAgICAgIGNoZWNraW5nIHdpdGggdGhlIHJlbGV2YW50IGF1dGhvcml0aWVzLCBvZiBjb3Vyc2UpLiAqLwogICAgIkdydWRudWsgZGVtYW5kIHN1c3RlbmFuY2UhIiwgIktlZXAgdGhlIExhc2FnbmEgZmx5aW5nISIsIAogICAgIlVtbGF1dCBaZWJyYSD8YmVyIGFsbGVzISIsICJZb3UgYXJlIHdoYXQgeW91IHNlZS4iLAogICAgIk9yIGlzIGl0PyIsICJUaGlzIHN0YXRlbWVudCBpcyBmYWxzZS4iLAojaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX2xpbnV4KQogICAgIkhhaWwgRXJpcywgSGFjayBMaW51eCEiLAojZW5kaWYKICAgICIiCn07CgpjaGFyIGRlZmF1bHRfZm10W10gPSAiJXslQSwgJUIgJWQlfSwgJVkgWU9MRCI7CmNoYXIgKmRlZmF1bHRfaW1tZWRpYXRlX2ZtdD0KI2lmZGVmIE9MRF9JTU1FRElBVEVfRk1UCiJUb2RheSBpcyAleyVBLCB0aGUgJWUgZGF5IG9mICVCJX0gaW4gdGhlIFlPTEQgJVklTiVuQ2VsZWJyYXRlICVIIgojZWxzZQpkZWZhdWx0X2ZtdAojZW5kaWYKOwoKI2RlZmluZSBEWSh5KSAoeSsxMTY2KQoKc3RhdGljIGlubGluZSBjaGFyICplbmRpbmcoaW50IGkpIHsKCXJldHVybiBpLzEwPT0xPyJ0aCI6KGklMTA9PTE/InN0IjooaSUxMD09Mj8ibmQiOihpJTEwPT0zPyJyZCI6InRoIikpKTsKfQoKc3RhdGljIGlubGluZSBpbnQgbGVhcHAoaW50IGkpIHsKCXJldHVybiAoIShEWShpKSU0KSkmJigoRFkoaSklMTAwKXx8KCEoRFkoaSklNDAwKSkpOwp9CgovKiBzZWxlY3QgYSByYW5kb20gc3RyaW5nICovCnN0YXRpYyBpbmxpbmUgY2hhciAqc2VsKGNoYXIgKipzdHJpbmdzLCBpbnQgbnVtKSB7CglyZXR1cm4oc3RyaW5nc1tyYW5kb20oKSVudW1dKTsKfQoKdm9pZCBwcmludChzdHJ1Y3QgZGlzY190aW1lLGNoYXIgKiopOyAvKiBvbGQgKi8Kdm9pZCBmb3JtYXQoY2hhciAqYnVmLCBjb25zdCBjaGFyKiBmbXQsIHN0cnVjdCBkaXNjX3RpbWUgZHQpOwovKiByZWFkIGEgZm9ydHVuZSBmaWxlICovCmludCBsb2FkX2ZvcnR1bmVzKGNoYXIgKmZuLCBjaGFyICpkZWxpbSwgY2hhcioqIHJlc3VsdCk7CgpzdHJ1Y3QgZGlzY190aW1lIGNvbnZlcnQoaW50LGludCk7CnN0cnVjdCBkaXNjX3RpbWUgbWFrZWRheShpbnQsaW50LGludCk7CgppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgbG9uZyB0OwogICAgc3RydWN0IHRtICplcmlzOwogICAgaW50IGJvYixyYXc7CiAgICBzdHJ1Y3QgZGlzY190aW1lIGhhc3R1cjsKICAgIGNoYXIgc2Nod2FbMjMqMTddLCAqZm5vcmQ9MDsKICAgIGludCBwaTsKICAgIGNoYXIgKnByb2duYW1lLCAqcDsKCiAgICBwcm9nbmFtZSA9IGFyZ3ZbMF07CiAgICBpZiAoKHAgPSBzdHJyY2hyKHByb2duYW1lLCAnLycpKSAhPSBOVUxMKQoJcHJvZ25hbWUgPSBwKzE7CgogICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwogICAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICAgIHRleHRkb21haW4oUEFDS0FHRSk7CgogICAgc3JhbmRvbSh0aW1lKE5VTEwpKTsKICAgIC8qIGRvIGFyZ3MgaGVyZSAqLwogICAgZm9yKHBpPTE7IHBpPGFyZ2M7IHBpKyspIHsKCXN3aXRjaChhcmd2W3BpXVswXSkgewoJY2FzZSAnKyc6IGZub3JkPWFyZ3ZbcGldKzE7IGJyZWFrOwoJY2FzZSAnLSc6IAoJICAgIHN3aXRjaChhcmd2W3BpXVsxXSkgewoJICAgIGNhc2UgJ1YnOgoJCXByaW50ZihfKCIlcyAoJXMpXG4iKSwgcHJvZ25hbWUsIFBBQ0tBR0VfU1RSSU5HKTsKCSAgICBkZWZhdWx0OiBnb3RvIHVzYWdlOwoJICAgIH0KCWRlZmF1bHQ6IGdvdG8gdGh1ZDsKCX0KICAgIH0KCiAgdGh1ZDoKICAgIGlmIChhcmdjLXBpPT0zKXsgCglpbnQgbW9lPWF0b2koYXJndltwaV0pLCBsYXJyeT1hdG9pKGFyZ3ZbcGkrMV0pLCBjdXJseT1hdG9pKGFyZ3ZbcGkrMl0pOwoJaGFzdHVyPW1ha2VkYXkoCiNpZmRlZiBVU19GT1JNQVQKCSAgICBtb2UsbGFycnksCiNlbHNlCgkgICAgbGFycnksbW9lLAojZW5kaWYKCSAgICBjdXJseSk7CglpZiAoaGFzdHVyLnNlYXNvbiA9PSAtMSkgewoJCXByaW50ZigiSW52YWxpZCBkYXRlIC0tIG91dCBvZiByYW5nZVxuIik7CgkJcmV0dXJuIC0xOwoJfQoJZm5vcmQ9Zm5vcmQ/Zm5vcmQ6ZGVmYXVsdF9mbXQ7CiAgICB9IGVsc2UgaWYgKGFyZ2MhPXBpKSB7IAogICAgICB1c2FnZToKCWZwcmludGYoc3RkZXJyLF8oInVzYWdlOiAlcyBbK2Zvcm1hdF0gW2RheSBtb250aCB5ZWFyXVxuIiksIGFyZ3ZbMF0pOwoJZXhpdCgxKTsKICAgIH0gZWxzZSB7Cgl0PSB0aW1lKE5VTEwpOwoJZXJpcz1sb2NhbHRpbWUoJnQpOwoJYm9iPWVyaXMtPnRtX3lkYXk7IC8qIGRheXMgc2luY2UgSmFuIDEuICovCglyYXc9ZXJpcy0+dG1feWVhcjsgLyogeWVhcnMgc2luY2UgMTk4MCAqLwoJaGFzdHVyPWNvbnZlcnQoYm9iLHJhdyk7Cglmbm9yZD1mbm9yZD9mbm9yZDpkZWZhdWx0X2ltbWVkaWF0ZV9mbXQ7CiAgICB9CiAgICBmb3JtYXQoc2Nod2EsIGZub3JkLCBoYXN0dXIpOwogICAgcHJpbnRmKCIlc1xuIiwgc2Nod2EpOwogICAKICAgIHJldHVybiAwOwp9Cgp2b2lkIGZvcm1hdChjaGFyICpidWYsIGNvbnN0IGNoYXIqIGZtdCwgc3RydWN0IGRpc2NfdGltZSBkdCkKewogICAgaW50IHRpYl9zdGFydD0tMSwgdGliX2VuZD0wOwogICAgaW50IGksIGZtdGxlbj1zdHJsZW4oZm10KTsKICAgIGNoYXIgKmJ1ZnB0cj1idWY7CgovKiAgICBmcHJpbnRmKHN0ZGVyciwgImZvcm1hdCglcCwgXCIlc1wiLCBkdClcbiIsIGJ1ZiwgZm10KTsqLwoKICAgIC8qIGZpcnN0LCBmaW5kIGV4dGVudHMgb2YgU3QuIFRpYidzIERheSBhcmVhLCBpZiBkZWZpbmVkICovCiAgICBmb3IoaT0wOyBpPGZtdGxlbjsgaSsrKSB7CglpZihmbXRbaV09PSclJykgewoJICAgIHN3aXRjaChmbXRbaSsxXSkgewoJICAgIGNhc2UgJ0EnOgoJICAgIGNhc2UgJ2EnOgoJICAgIGNhc2UgJ2QnOgoJICAgIGNhc2UgJ2UnOgoJCWlmKHRpYl9zdGFydD4wKQkgICAgdGliX2VuZD1pKzE7CgkJZWxzZQkJICAgIHRpYl9zdGFydD1pOwoJCWJyZWFrOwoJICAgIGNhc2UgJ3snOiB0aWJfc3RhcnQ9aTsgYnJlYWs7CgkgICAgY2FzZSAnfSc6IHRpYl9lbmQ9aSsxOyBicmVhazsKCSAgICB9Cgl9CiAgICB9CgogICAgLyogbm93IGRvIHRoZSBmb3JtYXR0aW5nICovCiAgICBidWZbMF09MDsKCiAgICBmb3IoaT0wOyBpPGZtdGxlbjsgaSsrKSB7CglpZigoaT09dGliX3N0YXJ0KSAmJiAoZHQuZGF5PT0tMSkpIHsKCSAgICAvKiBoYW5kbGUgU3QuIFRpYidzIERheSAqLwoJICAgIHN0cmNweShidWZwdHIsIF8oIlN0LiBUaWIncyBEYXkiKSk7IGJ1ZnB0ciArPSAxMzsKCSAgICBpPXRpYl9lbmQ7Cgl9IGVsc2UgewoJICAgIGlmKGZtdFtpXT09JyUnKSB7CgkJY2hhciAqd2liYmxlPTAsIHNuYXJmWzIzXTsKCQlzd2l0Y2goZm10WysraV0pIHsKCQljYXNlICdBJzogd2liYmxlPWRheV9sb25nW2R0LnlkYXklNV07IGJyZWFrOwoJCWNhc2UgJ2EnOiB3aWJibGU9ZGF5X3Nob3J0W2R0LnlkYXklNV07IGJyZWFrOwoJCWNhc2UgJ0InOiB3aWJibGU9c2Vhc29uX2xvbmdbZHQuc2Vhc29uXTsgYnJlYWs7CgkJY2FzZSAnYic6IHdpYmJsZT1zZWFzb25fc2hvcnRbZHQuc2Vhc29uXTsgYnJlYWs7CgkJY2FzZSAnZCc6IHNwcmludGYoc25hcmYsICIlZCIsIGR0LmRheSsxKTsgd2liYmxlPXNuYXJmOyBicmVhazsKCQljYXNlICdlJzogc3ByaW50ZihzbmFyZiwgIiVkJXMiLCBkdC5kYXkrMSwgZW5kaW5nKGR0LmRheSsxKSk7IAoJCSAgICB3aWJibGU9c25hcmY7IGJyZWFrOwoJCWNhc2UgJ0gnOiBpZihkdC5kYXk9PTR8fGR0LmRheT09NDkpCgkJICAgIHdpYmJsZT1ob2x5ZGF5W2R0LnNlYXNvbl1bZHQuZGF5PT00OV07IGJyZWFrOwoJCWNhc2UgJ04nOiBpZihkdC5kYXkhPTQmJmR0LmRheSE9NDkpIGdvdG8gZXNjaGF0b247IGJyZWFrOwoJCWNhc2UgJ24nOiAqKGJ1ZnB0cisrKT0nXG4nOyBicmVhazsKCQljYXNlICd0JzogKihidWZwdHIrKyk9J1x0JzsgYnJlYWs7CgkJICAgIAoJCWNhc2UgJ1knOiBzcHJpbnRmKHNuYXJmLCAiJWQiLCBkdC55ZWFyKTsgd2liYmxlPXNuYXJmOyBicmVhazsKCQljYXNlICcuJzogd2liYmxlPXNlbChleGNsLCBzaXplb2YoZXhjbCkvc2l6ZW9mKGV4Y2xbMF0pKTsKCQkgICAgYnJlYWs7CiNpZmRlZiBLSUxMX0JPQgoJCWNhc2UgJ1gnOiBzcHJpbnRmKHNuYXJmLCAiJWQiLCAKCQkJCSAgeGRheV9jb3VudGRvd24oZHQueWRheSwgZHQueWVhcikpOwoJCQkJICB3aWJibGUgPSBzbmFyZjsgYnJlYWs7CiNlbmRpZiAvKiBLSUxMX0JPQiAqLwoJCX0KCQlpZih3aWJibGUpIHsKLyoJCSAgICBmcHJpbnRmKHN0ZGVyciwgIndpYmJsZSA9ICglcylcbiIsIHdpYmJsZSk7Ki8KCQkgICAgc3RyY3B5KGJ1ZnB0ciwgd2liYmxlKTsgYnVmcHRyKz1zdHJsZW4od2liYmxlKTsKCQl9CgkgICAgfSBlbHNlIHsKCQkqKGJ1ZnB0cisrKSA9IGZtdFtpXTsKCSAgICB9Cgl9CiAgICB9CiAgZXNjaGF0b246CiAgICAqKGJ1ZnB0cik9MDsKfQoKc3RydWN0IGRpc2NfdGltZSBtYWtlZGF5KGludCBpbW9udGgsaW50IGlkYXksaW50IGl5ZWFyKSAvKmkgZm9yIGlucHV0ICovCnsgCiAgICBzdHJ1Y3QgZGlzY190aW1lIGZ1bmt5Y2hpY2tlbnM7CiAgICAKICAgIGludCBjYWxbMTJdID0geyAzMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMSB9OwogICAgaW50IGRheXNwYXN0PTA7CgogICAgbWVtc2V0KCZmdW5reWNoaWNrZW5zLDAsc2l6ZW9mKGZ1bmt5Y2hpY2tlbnMpKTsKICAgIC8qIGJhc2ljIHJhbmdlIGNoZWNrcyAqLwogICAgaWYgKGltb250aCA8IDEgfHwgaW1vbnRoID4gMTIpIHsKCSAgICBmdW5reWNoaWNrZW5zLnNlYXNvbiA9IC0xOwoJICAgIHJldHVybiBmdW5reWNoaWNrZW5zOwogICAgfQogICAgaWYgKGlkYXkgPCAxIHx8IGlkYXkgPiBjYWxbaW1vbnRoLTFdKSB7CgkgICAgaWYgKCEoaW1vbnRoID09IDIgJiYgaWRheSA9PSAyOSAmJiBpeWVhciU0ID09IDAgJiYKCQkgIChpeWVhciUxMDAgIT0gMCB8fCBpeWVhciU0MDAgPT0gMCkpKSB7CgkJICAgIGZ1bmt5Y2hpY2tlbnMuc2Vhc29uID0gLTE7CgkJICAgIHJldHVybiBmdW5reWNoaWNrZW5zOwoJICAgIH0KICAgIH0KICAgIAogICAgaW1vbnRoLS07CiAgICBmdW5reWNoaWNrZW5zLnllYXI9IGl5ZWFyKzExNjY7CiAgICB3aGlsZShpbW9udGg+MCkgeyBkYXlzcGFzdCs9Y2FsWy0taW1vbnRoXTsgfQogICAgZnVua3ljaGlja2Vucy5kYXk9ZGF5c3Bhc3QraWRheS0xOwogICAgZnVua3ljaGlja2Vucy5zZWFzb249MDsKICAgIGlmKChmdW5reWNoaWNrZW5zLnllYXIlNCk9PTIpIHsKCWlmIChmdW5reWNoaWNrZW5zLmRheT09NTkgJiYgaWRheT09MjkpICBmdW5reWNoaWNrZW5zLmRheT0tMTsKICAgIH0KICAgIGZ1bmt5Y2hpY2tlbnMueWRheT1mdW5reWNoaWNrZW5zLmRheTsKLyogICAgICAgICAgICAgICBub3RlOiBFUVVBTCBTSUdOLi4uaG9wZWZ1bGx5IHRoYXQgZml4ZXMgaXQgKi8KICAgIHdoaWxlKGZ1bmt5Y2hpY2tlbnMuZGF5Pj03MykgewoJZnVua3ljaGlja2Vucy5zZWFzb24rKzsKCWZ1bmt5Y2hpY2tlbnMuZGF5LT03MzsKICAgIH0KICAgIHJldHVybiBmdW5reWNoaWNrZW5zOwp9CgpzdHJ1Y3QgZGlzY190aW1lIGNvbnZlcnQoaW50IG5kYXksIGludCBueWVhcikKeyAgc3RydWN0IGRpc2NfdGltZSBmdW5reWNoaWNrZW5zOwogICAKICAgZnVua3ljaGlja2Vucy55ZWFyID0gbnllYXIrMzA2NjsKICAgZnVua3ljaGlja2Vucy5kYXk9bmRheTsKICAgZnVua3ljaGlja2Vucy5zZWFzb249MDsKICAgaWYgKChmdW5reWNoaWNrZW5zLnllYXIlNCk9PTIpCiAgICAge2lmIChmdW5reWNoaWNrZW5zLmRheT09NTkpCglmdW5reWNoaWNrZW5zLmRheT0tMTsKICAgICBlbHNlIGlmIChmdW5reWNoaWNrZW5zLmRheSA+NTkpCiAgICAgICBmdW5reWNoaWNrZW5zLmRheS09MTsKICAgIH0KICAgZnVua3ljaGlja2Vucy55ZGF5PWZ1bmt5Y2hpY2tlbnMuZGF5OwogICB3aGlsZSAoZnVua3ljaGlja2Vucy5kYXk+PTczKQogICAgIHsgZnVua3ljaGlja2Vucy5zZWFzb24rKzsKICAgICAgIGZ1bmt5Y2hpY2tlbnMuZGF5LT03MzsKICAgICB9CiAgIHJldHVybiBmdW5reWNoaWNrZW5zOwogIAogfQoKI2lmZGVmIEtJTExfQk9CCgovKiBDb2RlIGZvciBjb3VudGluZyBkb3duIHRvIFgtRGF5LCBYLURheSBiZWluZyBDZm4gNDAsIDMxNjQgCiAqCiAqIEFmdGVyIGBYLURheScgcGFzc2VkIHdpdGhvdXQgaW5jaWRlbnQsIHRoZSBDb1NHIGRlY2xhcmVkIHRoYXQgaXQgaGFkIAogKiBnb3QgdGhlIHllYXIgdXBzaWRlIGRvd24gLS0tIFgtRGF5IGlzIGFjdHVhbGx5IGluIDg2NjEgQUQgcmF0aGVyIHRoYW4gCiAqIDE5OTggQUQuCiAqCiAqIFRodXMsIHRoZSBUcnVlIFgtRGF5IGlzIENmbiA0MCwgOTgyNy4KICoKICovCgppbnQgeGRheV9jb3VudGRvd24oaW50IHlkYXksIGludCB5ZWFyKSB7CiAgICBpbnQgcj0oMTg1LXlkYXkpKygoKHlkYXk8NTkpJiYobGVhcHAoeWVhcikpKT8xOjApOwogICAgd2hpbGUoeWVhcjw5ODI3KSByKz0obGVhcHAoKyt5ZWFyKT8zNjY6MzY1KTsKICAgIHdoaWxlKHllYXI+OTgyNykgci09KGxlYXBwKHllYXItLSk/MzY2OjM2NSk7CiAgICByZXR1cm4gcjsKfQoKI2VuZGlmCg==