LyoKICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDcKICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDYKICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CiAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwcGM0eHguaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgInNkcmFtLmgiCiNpbmNsdWRlICJlY2MuaCIKCiNpZmRlZiBDT05GSUdfU0RSQU1fQkFOSzAKCiNpZm5kZWYgQ09ORklHXzQ0MAoKI2lmbmRlZiBDRkdfU0RSQU1fVEFCTEUKc2RyYW1fY29uZl90IG1iMGNmW10gPSB7Cgl7KDEyOCA8PCAyMCksIDEzLCAweDAwMEE0MDAxfSwJICAgIC8qICgwLTEyOE1CKSBBZGRyZXNzIE1vZGUgMywgMTN4MTAoNCkgKi8KCXsoNjQgPDwgMjApLCAgMTMsIDB4MDAwODQwMDF9LAkgICAgLyogKDAtNjRNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDkoNCkJICAqLwoJeygzMiA8PCAyMCksICAxMiwgMHgwMDA2MjAwMX0sCSAgICAvKiAoMC0zMk1CKSBBZGRyZXNzIE1vZGUgMiwgMTJ4OSg0KQkgICovCgl7KDE2IDw8IDIwKSwgIDEyLCAweDAwMDQ2MDAxfSwJICAgIC8qICgwLTE2TUIpIEFkZHJlc3MgTW9kZSA0LCAxMng4KDQpCSAgKi8KCXsoNCA8PCAyMCksICAgMTEsIDB4MDAwMDgwMDF9LAkgICAgLyogKDAtNE1CKSBBZGRyZXNzIE1vZGUgNSwgMTF4OCgyKQkgICovCn07CiNlbHNlCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gQ0ZHX1NEUkFNX1RBQkxFOwojZW5kaWYKCiNkZWZpbmUgTl9NQjBDRiAoc2l6ZW9mKG1iMGNmKSAvIHNpemVvZihtYjBjZlswXSkpCgojaWZkZWYgQ0ZHX1NEUkFNX0NBU0wKc3RhdGljIHVsb25nIG5zMmNsa3ModWxvbmcgbnMpCnsKCXVsb25nIGJ1c19wZXJpb2RfeF8xMCA9IE9ORV9CSUxMSU9OIC8gKGdldF9idXNfZnJlcSgwKSAvIDEwKTsKCglyZXR1cm4gKChucyAqIDEwKSArIGJ1c19wZXJpb2RfeF8xMCkgLyBidXNfcGVyaW9kX3hfMTA7Cn0KI2VuZGlmIC8qIENGR19TRFJBTV9DQVNMICovCgpzdGF0aWMgdWxvbmcgY29tcHV0ZV9zZHRyMSh1bG9uZyBzcGVlZCkKewojaWZkZWYgQ0ZHX1NEUkFNX0NBU0wKCXVsb25nIHRtcDsKCXVsb25nIHNkdHIxID0gMDsKCgkvKiBDQVNMICovCglpZiAoQ0ZHX1NEUkFNX0NBU0wgPCAyKQoJCXNkdHIxIHw9ICgxIDw8IFNEUkFNMF9UUl9DQVNMKTsKCWVsc2UKCQlpZiAoQ0ZHX1NEUkFNX0NBU0wgPiA0KQoJCQlzZHRyMSB8PSAoMyA8PCBTRFJBTTBfVFJfQ0FTTCk7CgkJZWxzZQoJCQlzZHRyMSB8PSAoKENGR19TRFJBTV9DQVNMLTEpIDw8IFNEUkFNMF9UUl9DQVNMKTsKCgkvKiBQVEEgKi8KCXRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX1BUQSk7CglpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQoJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9QVEEpOwoJZWxzZQoJCXNkdHIxIHw9ICgoNC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKCgkvKiBDVFAgKi8KCXRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX0NUUCk7CglpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQoJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9DVFApOwoJZWxzZQoJCXNkdHIxIHw9ICgoNC0xKSA8PCBTRFJBTTBfVFJfQ1RQKTsKCgkvKiBMREYgKi8KCXRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX0xERik7CglpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQoJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9MREYpOwoJZWxzZQoJCXNkdHIxIHw9ICgoMi0xKSA8PCBTRFJBTTBfVFJfTERGKTsKCgkvKiBSRlRBICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9SRlRBKTsKCWlmICgodG1wID49IDQpICYmICh0bXAgPD0gMTApKQoJCXNkdHIxIHw9ICgodG1wLTQpIDw8IFNEUkFNMF9UUl9SRlRBKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDEwLTQpIDw8IFNEUkFNMF9UUl9SRlRBKTsKCgkvKiBSQ0QgKi8KCXRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX1JDRCk7CglpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQoJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9SQ0QpOwoJZWxzZQoJCXNkdHIxIHw9ICgoNC0xKSA8PCBTRFJBTTBfVFJfUkNEKTsKCglyZXR1cm4gc2R0cjE7CiNlbHNlIC8qIENGR19TRFJBTV9DQVNMICovCgkvKgoJICogSWYgbm8gdmFsdWVzIGFyZSBjb25maWd1cmVkIGluIHRoZSBib2FyZCBjb25maWcgZmlsZQoJICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlcywgd2hpY2ggc2VlbSB0byBiZSBvayBmb3IgbW9zdAoJICogYm9hcmRzLgoJICoKCSAqIFJFTUFSSzoKCSAqIEZvciBuZXcgYm9hcmQgcG9ydHMgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIGRlZmluZSB0aGUKCSAqIGNvcnJlY3QgdmFsdWVzIGZvciB0aGUgdXNlZCBTRFJBTSBjaGlwcyBpbiB5b3VyIGJvYXJkCgkgKiBjb25maWcgZmlsZSAoc2VlIFBQQ2hhbWVsZW9uRVZCLmgpCgkgKi8KCWlmIChzcGVlZCA+IDEwMDAwMDAwMCkgewoJCS8qCgkJICogMTMzIE1IeiBTRFJBTQoJCSAqLwoJCXJldHVybiAweDAxMDc0MDE1OwoJfSBlbHNlIHsKCQkvKgoJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwMDg2NDAwZDsKCX0KI2VuZGlmIC8qIENGR19TRFJBTV9DQVNMICovCn0KCi8qIHJlZnJlc2ggaXMgZXhwcmVzc2VkIGluIG1zICovCnN0YXRpYyB1bG9uZyBjb21wdXRlX3J0cih1bG9uZyBzcGVlZCwgdWxvbmcgcm93cywgdWxvbmcgcmVmcmVzaCkKewojaWZkZWYgQ0ZHX1NEUkFNX0NBU0wKCXVsb25nIHRtcDsKCgl0bXAgPSAoKHJlZnJlc2gqMTAwMCoxMDAwKSAvICgxIDw8IHJvd3MpKSAqIChzcGVlZCAvIDEwMDApOwoJdG1wIC89IDEwMDAwMDA7CgoJcmV0dXJuICgodG1wICYgMHgwMDAwM0ZGOCkgPDwgMTYpOwojZWxzZSAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoJaWYgKHNwZWVkID4gMTAwMDAwMDAwKSB7CgkJLyoKCQkgKiAxMzMgTUh6IFNEUkFNCgkJICovCgkJcmV0dXJuIDB4MDdmMDAwMDA7Cgl9IGVsc2UgewoJCS8qCgkJICogZGVmYXVsdDogMTAwIE1IeiBTRFJBTQoJCSAqLwoJCXJldHVybiAweDA1ZjAwMDAwOwoJfQojZW5kaWYgLyogQ0ZHX1NEUkFNX0NBU0wgKi8KfQoKLyoKICogQXV0b2RldGVjdCBvbmJvYXJkIFNEUkFNIG9uIDQwNSBwbGF0Zm9ybXMKICovCnBoeXNfc2l6ZV90IGluaXRkcmFtKGludCBib2FyZF90eXBlKQp7Cgl1bG9uZyBzcGVlZDsKCXVsb25nIHNkdHIxOwoJaW50IGk7CgoJLyoKCSAqIERldGVybWluZSBTRFJBTSBzcGVlZAoJICovCglzcGVlZCA9IGdldF9idXNfZnJlcSgwKTsgLyogcGFyYW1ldGVyIG5vdCB1c2VkIG9uIHBwYzR4eCAqLwoKCS8qCgkgKiBzZHRyMSAocmVnaXN0ZXIgU0RSQU0wX1RSKSBtdXN0IHRha2UgaW50byBhY2NvdW50IHRpbWluZ3MgbGlzdGVkCgkgKiBpbiBTRFJBTSBjaGlwIGRhdGFzaGVldC4gcnRyIChyZWdpc3RlciBTRFJBTTBfUlRSKSBtdXN0IHRha2UgaW50bwoJICogYWNjb3VudCBhY3R1YWwgU0RSQU0gc2l6ZS4gU28gd2UgY2FuIHNldCB1cCBzZHRyMSBhY2NvcmRpbmcgdG8gd2hhdAoJICogaXMgc3BlY2lmaWVkIGluIGJvYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSB3aGlsZSBydHIgZGVwZW5kZHMgb24gU0RSQU0KCSAqIHNpemUgd2UgYXJlIGFzc3VtaW5nIGJlZm9yZSBkZXRlY3Rpb24uCgkgKi8KCXNkdHIxID0gY29tcHV0ZV9zZHRyMShzcGVlZCk7CgoJZm9yIChpPTA7IGk8Tl9NQjBDRjsgaSsrKSB7CgkJLyoKCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgoJCSAqLwoJCW10c2RyYW0obWVtX21jb3B0MSwgMHgwMDAwMDAwMCk7CgoJCS8qCgkJICogU2V0IE1CMENGIGZvciBiYW5rIDAuCgkJICovCgkJbXRzZHJhbShtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbShtZW1fc2R0cjEsIHNkdHIxKTsKCQltdHNkcmFtKG1lbV9ydHIsIGNvbXB1dGVfcnRyKHNwZWVkLCBtYjBjZltpXS5yb3dzLCA2NCkpOwoKCQl1ZGVsYXkoMjAwKTsKCgkJLyoKCQkgKiBTZXQgbWVtb3J5IGNvbnRyb2xsZXIgb3B0aW9ucyByZWcsIE1DT1BUMS4KCQkgKiBTZXQgRENfRU4gdG8gJzEnIGFuZCBCUkRfUFJGIHRvICcwMScgZm9yIDE2IGJ5dGUgUExCIEJ1cnN0CgkJICogcmVhZC9wcmVmZXRjaC4KCQkgKi8KCQltdHNkcmFtKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOwoKCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQuICBFbmFibGUgc2Vjb25kIGJhbmsgaWYKCQkJICogZGVmaW5lZCAoYXNzdW1lcyBzYW1lIHR5cGUgYXMgYmFuayAwKQoJCQkgKi8KI2lmZGVmIENPTkZJR19TRFJBTV9CQU5LMQoJCQl1MzIgYjFjciA9IG1iMGNmW2ldLnNpemUgfCBtYjBjZltpXS5yZWc7CgoJCQltdHNkcmFtKG1lbV9tY29wdDEsIDB4MDAwMDAwMDApOwoJCQltdHNkcmFtKG1lbV9tYjFjZiwgYjFjcik7IC8qIFNEUkFNMF9CMUNSICovCgkJCW10c2RyYW0obWVtX21jb3B0MSwgMHg4MDgwMDAwMCk7CgkJCXVkZWxheSgxMDAwMCk7CgoJCQkvKgoJCQkgKiBDaGVjayBpZiAybmQgYmFuayBpcyByZWFsbHkgYXZhaWxhYmxlLgoJCQkgKiBJZiB0aGUgc2l6ZSBub3QgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGZpcnN0CgkJCSAqIGJhbmssIHRoZW4gZGlzYWJsZSB0aGUgMm5kIGJhbmsgY29tcGxldGVseS4KCQkJICovCgkJCWlmIChnZXRfcmFtX3NpemUoKGxvbmcgKiltYjBjZltpXS5zaXplLCBtYjBjZltpXS5zaXplKSAhPQoJCQkgICAgbWIwY2ZbaV0uc2l6ZSkgewoJCQkJbXRzZHJhbShtZW1fbWIxY2YsIDApOwoJCQkJbXRzZHJhbShtZW1fbWNvcHQxLCAwKTsKCQkJfQojZW5kaWYKCgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm4gbWIwY2ZbaV0uc2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbHNlIC8qIENPTkZJR180NDAgKi8KCi8qCiAqIERlZmluZSBzb21lIGRlZmF1bHQgdmFsdWVzLiBUaG9zZSBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4gdGhlCiAqIGJvYXJkIGNvbmZpZyBmaWxlLgogKi8KCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygyNTYgPDwgMjApLCAxMywgMHgwMDBDNDAwMX0sCS8qIDI1Nk1CIG1vZGUgMywgMTN4MTAoNCkJKi8KCXsoNjQgPDwgMjApLCAgMTIsIDB4MDAwODIwMDF9CS8qIDY0TUIgbW9kZSAyLCAxMng5KDQpCQkqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojaWZuZGVmIENGR19TRFJBTTBfVFIwCiNkZWZpbmUJQ0ZHX1NEUkFNMF9UUjAJCTB4NDEwOTQwMTIKI2VuZGlmCgojZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKI2RlZmluZSBOVU1fVFJJRVMgNjQKI2RlZmluZSBOVU1fUkVBRFMgMTAKCnN0YXRpYyB2b2lkIHNkcmFtX3RyMV9zZXQoaW50IHJhbV9hZGRyZXNzLCBpbnQqIHRyMV92YWx1ZSkKewoJaW50IGk7CglpbnQgaiwgazsKCXZvbGF0aWxlIHVuc2lnbmVkIGludCogcmFtX3BvaW50ZXIgPSAodW5zaWduZWQgaW50ICopcmFtX2FkZHJlc3M7CglpbnQgZmlyc3RfZ29vZCA9IC0xLCBsYXN0X2JhZCA9IDB4MWZmOwoKCXVuc2lnbmVkIGxvbmcgdGVzdFtOVU1fVFJJRVNdID0gewoJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCgkJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAoJCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCgkJMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAoJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCgkJMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAoJCTB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCgkJMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAoJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCgkJMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAoJCTB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUgfTsKCgkvKiBnbyB0aHJvdWdoIGFsbCBwb3NzaWJsZSBTRFJBTTBfVFIxW1JEQ1RdIHZhbHVlcyAqLwoJZm9yIChpPTA7IGk8PTB4MWZmOyBpKyspIHsKCQkvKiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIFRSMSAqLwoJCW10c2RyYW0obWVtX3RyMSwgKDB4ODA4MDA4MDAgfCBpKSk7CgoJCS8qIHdyaXRlIHZhbHVlcyAqLwoJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CgkJCXJhbV9wb2ludGVyW2pdID0gdGVzdFtqXTsKCgkJCS8qIGNsZWFyIGFueSBjYWNoZSBhdCByYW0gbG9jYXRpb24gKi8KCQkJX19hc21fXygiZGNiZiAwLCUwIjogOiJyIiAoJnJhbV9wb2ludGVyW2pdKSk7CgkJfQoKCQkvKiByZWFkIHZhbHVlcyBiYWNrICovCgkJZm9yIChqPTA7IGo8TlVNX1RSSUVTOyBqKyspIHsKCQkJZm9yIChrPTA7IGs8TlVNX1JFQURTOyBrKyspIHsKCQkJCS8qIGNsZWFyIGFueSBjYWNoZSBhdCByYW0gbG9jYXRpb24gKi8KCQkJCV9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIgKCZyYW1fcG9pbnRlcltqXSkpOwoKCQkJCWlmIChyYW1fcG9pbnRlcltqXSAhPSB0ZXN0W2pdKQoJCQkJCWJyZWFrOwoJCQl9CgoJCQkvKiByZWFkIGVycm9yICovCgkJCWlmIChrICE9IE5VTV9SRUFEUykKCQkJCWJyZWFrOwoJCX0KCgkJLyogd2UgaGF2ZSBhIFNEUkFNMF9UUjFbUkRDVF0gdGhhdCBpcyBwYXJ0IG9mIHRoZSB3aW5kb3cgKi8KCQlpZiAoaiA9PSBOVU1fVFJJRVMpIHsKCQkJaWYgKGZpcnN0X2dvb2QgPT0gLTEpCgkJCQlmaXJzdF9nb29kID0gaTsJCS8qIGZvdW5kIGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KCQl9IGVsc2UgeyAvKiBiYWQgcmVhZCAqLwoJCQkvKiBpZiB3ZSBoYXZlIG5vdCBoYWQgYSBnb29kIHJlYWQgdGhlbiBkb24ndCBjYXJlICovCgkJCWlmIChmaXJzdF9nb29kICE9IC0xKSB7CgkJCQkvKiBmaXJzdCBmYWlsdXJlIGFmdGVyIGEgZ29vZCByZWFkICovCgkJCQlsYXN0X2JhZCA9IGktMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8qIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmb3IgVFIxICovCgkqdHIxX3ZhbHVlID0gKGZpcnN0X2dvb2QgKyBsYXN0X2JhZCkgLyAyOwp9CgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgRERSIFNEUkFNIG9uIDQ0MCBwbGF0Zm9ybXMKICoKICogTk9URTogU29tZSBvZiB0aGUgaGFyZGNvZGVkIHZhbHVlcyBhcmUgaGFyZHdhcmUgZGVwZW5kYW50LAogKgkgc28gdGhpcyBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGZ1dHVyZSBib2FyZHMKICoJIHVzaW5nIHRoaXMgcm91dGluZSEKICovCnBoeXNfc2l6ZV90IGluaXRkcmFtKGludCBib2FyZF90eXBlKQp7CglpbnQgaTsKCWludCB0cjFfYmFuazE7CgojaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBcCiAgICBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwU1ApCgkvKgoJICogU29mdC1yZXNldCBTRFJBTSBjb250cm9sbGVyLgoJICovCgltdHNkcihzZHJfc3JzdCwgU0RSMF9TUlNUX0RNQyk7CgltdHNkcihzZHJfc3JzdCwgMHgwMDAwMDAwMCk7CiNlbmRpZgoKCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgewoJCS8qCgkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KCQkgKi8KCQltdHNkcmFtKG1lbV9jZmcwLCAweDAwMDAwMDAwKTsKCgkJLyoKCQkgKiBTZXR1cCBzb21lIGRlZmF1bHQKCQkgKi8KCQltdHNkcmFtKG1lbV91YWJiYSwgMHgwMDAwMDAwMCk7IC8qIHViYmE9MCAoZGVmYXVsdCkJCSovCgkJbXRzZHJhbShtZW1fc2xpbywgMHgwMDAwMDAwMCk7CS8qIHJkcmU9MCB3cnJlPTAgcmFydz0wCQkqLwoJCW10c2RyYW0obWVtX2Rldm9wdCwgMHgwMDAwMDAwMCk7IC8qIGRsbD0wIGRzPTAgKG5vcm1hbCkJCSovCgkJbXRzZHJhbShtZW1fd2RkY3RyLCAweDAwMDAwMDAwKTsgLyogd3JjcD0wIGRjZD0wCQkqLwoJCW10c2RyYW0obWVtX2Nsa3RyLCAweDQwMDAwMDAwKTsgLyogY2xrcD0xICg5MCBkZWcgd3IpIGRjZHQ9MAkqLwoKCQkvKgoJCSAqIEZvbGxvd2luZyBmb3IgQ0FTIExhdGVuY3kgPSAyLjUgQCAxMzMgTUh6IFBMQgoJCSAqLwoJCW10c2RyYW0obWVtX2IwY3IsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbShtZW1fdHIwLCBDRkdfU0RSQU0wX1RSMCk7CgkJbXRzZHJhbShtZW1fdHIxLCAweDgwODAwODAwKTsJLyogU1M9VDIgU0w9U1RBR0UgMyBDRD0xIENUPTB4MDAqLwoJCW10c2RyYW0obWVtX3J0ciwgMHgwNDEwMDAwMCk7CS8qIEludGVydmFsIDcuOLVzIEAgMTMzTUh6IFBMQgkqLwoJCW10c2RyYW0obWVtX2NmZzEsIDB4MDAwMDAwMDApOwkvKiBTZWxmLXJlZnJlc2ggZXhpdCwgZGlzYWJsZSBQTSovCgkJdWRlbGF5KDQwMCk7CQkJLyogRGVsYXkgMjAwIHVzZWNzIChtaW4pCSovCgoJCS8qCgkJICogRW5hYmxlIHRoZSBjb250cm9sbGVyLCB0aGVuIHdhaXQgZm9yIERDRU4gdG8gY29tcGxldGUKCQkgKi8KCQltdHNkcmFtKG1lbV9jZmcwLCAweDgyMDAwMDAwKTsJLyogRENFTj0xLCBQTVVEPTAsIDY0LWJpdAkqLwoJCXVkZWxheSgxMDAwMCk7CgoJCWlmIChnZXRfcmFtX3NpemUoMCwgbWIwY2ZbaV0uc2l6ZSkgPT0gbWIwY2ZbaV0uc2l6ZSkgewoJCQkvKgoJCQkgKiBPcHRpbWl6ZSBUUjEgdG8gY3VycmVudCBoYXJkd2FyZSBlbnZpcm9ubWVudAoJCQkgKi8KCQkJc2RyYW1fdHIxX3NldCgweDAwMDAwMDAwLCAmdHIxX2JhbmsxKTsKCQkJbXRzZHJhbShtZW1fdHIxLCAodHIxX2JhbmsxIHwgMHg4MDgwMDgwMCkpOwoKI2lmZGVmIENPTkZJR19TRFJBTV9FQ0MKCQkJZWNjX2luaXQoMCwgbWIwY2ZbaV0uc2l6ZSk7CiNlbmRpZgoKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKCQkJICovCgkJCXJldHVybiBtYjBjZltpXS5zaXplOwoJCX0KCX0KCglyZXR1cm4gMDsJCQkJLyogbm90aGluZyBmb3VuZCAhCQkqLwp9CgojZW5kaWYgLyogQ09ORklHXzQ0MCAqLwoKI2VuZGlmIC8qIENPTkZJR19TRFJBTV9CQU5LMCAqLwo=