LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBDT05GSUdfU0M1MjAKCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxzc2kuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3BjaS5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CgovKiAKICogdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJvYXJkcyBiYXNlZCBvbiB0aGUgQU1EIHNjNTIwIAogKiAKICogdm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCiAqIHZvaWQgd3JpdGVfbW1jcl93b3JkKHUxNiBtbWNyLCB1MTYgZGF0YSkKICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQogKiAKICogdTggICByZWFkX21tY3JfYnl0ZSh1MTYgbW1jcikKICogdTE2ICByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKICogdTMyICByZWFkX21tY3JfbG9uZyh1MTYgbW1jcikKICogCiAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQogKiB1bnNpZ25lZCBsb25nIGluaXRfc2M1MjBfZHJhbSh2b2lkKQogKiB2b2lkIHBjaV9zYzUyMF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKICogCiAqIHZvaWQgcmVzZXRfdGltZXIodm9pZCkKICogdWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCiAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCiAqIHZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKICogCiAqLwoKc3RhdGljIHUzMiBtbWNyX2Jhc2U9IDB4ZmZmZWYwMDA7Cgp2b2lkIHdyaXRlX21tY3JfYnl0ZSh1MTYgbW1jciwgdTggZGF0YSkKewoJd3JpdGViKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKfQoKdm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQp7Cgl3cml0ZXcoZGF0YSwgbW1jcittbWNyX2Jhc2UpOwkKfQoKdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQp7Cgl3cml0ZWwoZGF0YSwgbW1jcittbWNyX2Jhc2UpOwp9Cgp1OCByZWFkX21tY3JfYnl0ZSh1MTYgbW1jcikKewoJcmV0dXJuIHJlYWRiKG1tY3IrbW1jcl9iYXNlKTsKfQoKdTE2IHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQp7CglyZXR1cm4gcmVhZHcobW1jcittbWNyX2Jhc2UpOwkKfQoKdTMyIHJlYWRfbW1jcl9sb25nKHUxNiBtbWNyKQp7CglyZXR1cm4gcmVhZGwobW1jcittbWNyX2Jhc2UpOwp9CgoKdm9pZCBpbml0X3NjNTIwKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoJCgkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAoJICogYmF1ZCBjbG9jayBnaXZpbmcgdXMgYSAxLjg0MzIgTUh6IHJlZmVyZW5jZSAKCSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxQ1RMLCA3KTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMkNUTCwgNyk7CgkKCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DTEtTRUwsIDB4NzIpOwkvKiBubyBjbG9jayBmcmVxdWVuY3kgc2VsZWN0ZWQsIHVzZSAxLjE4OTJNSHogKi8KCQoJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TWVNBUkJDVEwsMHgwMik7ICAvKiBlbmFibGUgY29uY3VycmVudCBtb2RlICovCgkKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9TWVNBUkJNRU5CLDB4MWYpOyAvKiBlbmFibGUgZXh0ZXJuYWwgZ3JhbnRzICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSEJDVEwsMHgwNCk7ICAgICAgLyogZW5hYmxlIHBvc3RlZC13cml0ZXMgKi8KCgoJaWYgKENGR19TQzUyMF9ISUdIX1NQRUVEKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NQVUNUTCwgMHgyKTsJLyogc2V0IGl0IHRvIDEzMyBNSHogYW5kIHdyaXRlIGJhY2sgKi8KCQlnZC0+Y3B1X2NsayA9IDEzMzAwMDAwMDsKCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTMzTUh6XG4iKTsKCX0gZWxzZSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NQVUNUTCwgMSk7CS8qIHNldCBDUFUgdG8gMTAwIE1IeiBhbmQgd3JpdGUgYmFjayBjYWNoZSAqLwoJCXByaW50ZigiIyMgQ1BVIFNwZWVkIHNldCB0byAxMDBNSHpcbiIpOwoJCWdkLT5jcHVfY2xrID0gMTAwMDAwMDAwOwoJfQoJCgoJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KICAgICAgICBhc20oIm1vdmwJJDB4MjAwMCwlJWVjeFxuIgoJICAgICJ3YWl0X2xvb3A6CXB1c2hsICUlZWN4XG4iCgkgICAgInBvcGwJJSVlY3hcbiIKCSAgICAibG9vcCB3YWl0X2xvb3BcbiI6IDogOiAiZWN4Iik7CgoJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfREJDVEwsIDB4MTEpOwoKCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KCWFzbSgibW92bAklJWNyMCwgJSVlYXhcbiIKCSAgICAiYW5kbAkkMHg5ZmZmZmZmZiwgJSVlYXhcbiIKCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKfQoKdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgliZF90ICpiZCA9IGdkLT5iZDsKCQoJdTMyIGRyYW1fcHJlc2VudD0wOwoJdTMyIGRyYW1fY3RybDsKCglpbnQgdmFsOwoJCglpbnQgY2FzX3ByZWNoYXJnZV9kZWxheSA9IENGR19TRFJBTV9QUkVDSEFSR0VfREVMQVk7CQoJaW50IHJlZnJlc2hfcmF0ZSAgICAgICAgPSBDRkdfU0RSQU1fUkVGUkVTSF9SQVRFOwkKCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ0ZHX1NEUkFNX1JBU19DQVNfREVMQVk7CgkKCS8qIHNldCBTRFJBTSBzcGVlZCBoZXJlICovCgkKCXJlZnJlc2hfcmF0ZS89Nzg7CQoJaWYgKHJlZnJlc2hfcmF0ZTw9MSkgewoJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLwoJfSBlbHNlIGlmIChyZWZyZXNoX3JhdGU9PTIpIHsKCQl2YWwgPSAxOyAgLyogMTUuNnVzICovCgl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKCQl2YWwgPSAyOyAgLyogMzEuMnVzICovCgl9IGVsc2UgewoJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KCX0KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9EUkNDVEwsIChyZWFkX21tY3JfYnl0ZShTQzUyMF9EUkNDVEwpICYgMHhjZikgfCAodmFsPDw0KSk7CgkKCXZhbCA9IHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ1RNQ1RMKTsKCXZhbCAmPSAweGYwOwoJCglpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09MykgewkJCgkJdmFsIHw9IDB4MDQ7ICAgLyogM1QgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewkJCgkJdmFsIHw9IDB4MDg7ICAgLyogNFQgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT40KSB7CQkKCQl2YWwgfD0gMHgwYzsKCX0gCgkKCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewoJCXZhbCB8PSAyOyAKCX0gZWxzZSB7CgkJdmFsIHw9IDE7IAoJfQoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RSQ1RNQ1RMLCB2YWwpOwoKCgkvKiBXZSByZWFkLWJhY2sgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRyYW0KCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLwoJZHJhbV9jdHJsID0gcmVhZF9tbWNyX2xvbmcoU0M1MjBfRFJDQkVOREFEUik7CgkKCgliZC0+YmlfZHJhbVswXS5zdGFydCA9IDA7CglpZiAoZHJhbV9jdHJsICYgMHg4MCkgewoJCS8qIGJhbmsgMCBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZikgPDwgMjI7CgkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OyAKCgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzBdLnNpemUgPSAwOwoJCWJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMF0uc3RhcnQ7Cgl9CgkKCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKCQkvKiBiYW5rIDEgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMCkgPDwgMTQ7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OyAKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCX0KCQoJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CgkJLyogYmFuayAyIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVszXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDAwMCkgPDwgNjsKCQliZC0+YmlfZHJhbVsyXS5zaXplID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMl0uc3RhcnQ7IAoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVsyXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwoJfSAKCQoJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwMDApIHsKCQkvKiBiYW5rIDMgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCAgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDAwMCkgPj4gMjsKCQliZC0+YmlfZHJhbVszXS5zaXplID0gZHJhbV9wcmVzZW50IC0gIGJkLT5iaV9kcmFtWzNdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVszXS5zaXplID0gMDsKCX0KCgkKI2lmIDAJCglwcmludGYoIkNvbmZpZ3VyZWQgJWQgYnl0ZXMgb2YgZHJhbVxuIiwgZHJhbV9wcmVzZW50KTsKI2VuZGlmCQoJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OwoJCglyZXR1cm4gZHJhbV9wcmVzZW50Owp9CgoKI2lmZGVmIENPTkZJR19QQ0kKCgpzdGF0aWMgc3RydWN0IHsKCXU4IHByaW9yaXR5OwoJdTE2IGxldmVsX3JlZzsKCXU4IGxldmVsX2JpdDsKfSBzYzUyMF9pcnFbXSA9IHsKCXsgU0M1MjBfSVJRMCwgIFNDNTIwX01QSUNNT0RFLCAgMHgwMSB9LAoJeyBTQzUyMF9JUlExLCAgU0M1MjBfTVBJQ01PREUsICAweDAyIH0sCgl7IFNDNTIwX0lSUTIsICBTQzUyMF9TTDFQSUNNT0RFLCAweDAyIH0sCgl7IFNDNTIwX0lSUTMsICBTQzUyMF9NUElDTU9ERSwgIDB4MDggfSwKCXsgU0M1MjBfSVJRNCwgIFNDNTIwX01QSUNNT0RFLCAgMHgxMCB9LAoJeyBTQzUyMF9JUlE1LCAgU0M1MjBfTVBJQ01PREUsICAweDIwIH0sCgl7IFNDNTIwX0lSUTYsICBTQzUyMF9NUElDTU9ERSwgIDB4NDAgfSwKCXsgU0M1MjBfSVJRNywgIFNDNTIwX01QSUNNT0RFLCAgMHg4MCB9LAoKCXsgU0M1MjBfSVJROCwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDEgfSwKCXsgU0M1MjBfSVJROSwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKCXsgU0M1MjBfSVJRMTAsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDQgfSwKCXsgU0M1MjBfSVJRMTEsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDggfSwKCXsgU0M1MjBfSVJRMTIsIFNDNTIwX1NMMVBJQ01PREUsIDB4MTAgfSwKCXsgU0M1MjBfSVJRMTMsIFNDNTIwX1NMMVBJQ01PREUsIDB4MjAgfSwKCXsgU0M1MjBfSVJRMTQsIFNDNTIwX1NMMVBJQ01PREUsIDB4NDAgfSwKCXsgU0M1MjBfSVJRMTUsIFNDNTIwX1NMMVBJQ01PREUsIDB4ODAgfQp9OwoKCi8qIFRoZSBpbnRlcnJ1cHQgdXNlZCBmb3IgUENJIElOVEEtSU5URCAgKi8KaW50IHNjNTIwX3BjaV9pbnRzWzE1XSA9IHsgCgktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCgkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKfTsKCi8qIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29uZmlndXJlIGEgcGNpIGludGVycnVwdCAqLwppbnQgcGNpX3NjNTIwX3NldF9pcnEoaW50IHBjaV9waW4sIGludCBpcnEpIAp7CglpbnQgaTsKCQojIGlmIDAKCXByaW50Zigic2V0X2lycSgpOiBtYXAgSU5UJWMgdG8gSVJRJWRcbiIsIHBjaV9waW4gKyAnQScsIGlycSk7CiNlbmRpZgkKCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7CgkJcmV0dXJuIC0xOyAvKiBpbGxlZ2FsIGlycSAqLwoJfQoKCWlmIChwY2lfcGluIDwgMCB8fCBwY2lfcGluID4gMTUpIHsKCQlyZXR1cm4gLTE7IC8qIGlsbGVnYWwgcGNpIGludCBwaW4gKi8KCX0KCgkvKiBmaXJzdCBkaXNhYmxlIGFueSBub24tcGNpIGludGVycnVwdCBzb3VyY2UgdGhhdCB1c2UgCgkgKiB0aGlzIGxldmVsICovCglmb3IgKGk9U0M1MjBfR1BUTVIwTUFQO2k8PVNDNTIwX0dQMTBJTUFQO2krKykgewoJCWlmIChpPj1TQzUyMF9QQ0lJTlRBTUFQJiZpPD1TQzUyMF9QQ0lJTlRETUFQKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocmVhZF9tbWNyX2J5dGUoaSkgPT0gc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpIHsKCQkJd3JpdGVfbW1jcl9ieXRlKGksIFNDNTIwX0lSUV9ESVNBQkxFRCk7CgkJfQoJfQoJCgkvKiBTZXQgdGhlIHRyaWdnZXIgdG8gbGV2ZWwgKi8KCXdyaXRlX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcsIAoJCQlyZWFkX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcpIHwgc2M1MjBfaXJxW2lycV0ubGV2ZWxfYml0KTsKCQoJCglpZiAocGNpX3BpbiA8IDQpIHsKCQkvKiBQQ0kgSU5UQS1JTlREICovCgkJLyogcm91dGUgdGhlIGludGVycnVwdCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQICsgcGNpX3Bpbiwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOwoJCQoJCQoJfSBlbHNlIHsKCQkvKiBHUElSUTAtR1BJUlExMCB1c2VkIGZvciBhZGRpdGlvbmFsIFBDSSBJTlRTICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAgKyBwY2lfcGluIC0gNCwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOwoJCQoJCS8qIGFsc28gc2V0IHRoZSBwb2xhcml0eSBpbiB0aGlzIGNhc2UgKi8KCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MLCAKCQkJCXJlYWRfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCkgfCAoMSA8PCAocGNpX3Bpbi00KSkpOwoJCQoJfQoJCgkvKiByZWdpc3RlciB0aGUgcGluICovCQkKCXNjNTIwX3BjaV9pbnRzW3BjaV9waW5dID0gaXJxOwoJCgoJcmV0dXJuIDA7IC8qIE9LICovCn0KCnZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQp7Cglob3NlLT5maXJzdF9idXNubyA9IDA7Cglob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKCgkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwgCgkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfQlVTLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX1BIWVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CgoJLyogUENJIG1lbW9yeSBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsIAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNX0JVUywKCQkgICAgICAgU0M1MjBfUENJX01FTV9QSFlTLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKCgkvKiBJU0EvUENJIG1lbW9yeSBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsIAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKCQkgICAgICAgU0M1MjBfSVNBX01FTV9QSFlTLAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKCgkvKiBQQ0kgSS9PIHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywgCgkJICAgICAgIFNDNTIwX1BDSV9JT19CVVMsCgkJICAgICAgIFNDNTIwX1BDSV9JT19QSFlTLAoJCSAgICAgICBTQzUyMF9QQ0lfSU9fU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CgoJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LCAKCQkgICAgICAgU0M1MjBfSVNBX0lPX0JVUywKCQkgICAgICAgU0M1MjBfSVNBX0lPX1BIWVMsCgkJICAgICAgIFNDNTIwX0lTQV9JT19TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKCglob3NlLT5yZWdpb25fY291bnQgPSA1OwoKCXBjaV9zZXR1cF90eXBlMShob3NlLAoJCQlTQzUyMF9SRUdfQUREUiwKCQkJU0M1MjBfUkVHX0RBVEEpOwoKCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOwoKCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOwoJCgkvKiBlbmFibGUgdGFyZ2V0IG1lbW9yeSBhY2Nlc2VzIG9uIGhvc3QgYnJpZ2UgKi8KCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwgCgkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7Cgp9CgoKCiNlbmRpZgoKI2lmZGVmIENGR19USU1FUl9TQzUyMAoKCnZvaWQgcmVzZXRfdGltZXIodm9pZCkKewoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgMCk7Cgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDYwMDEpOwoJCn0KCnVsb25nIGdldF90aW1lcih1bG9uZyBiYXNlKQp7CgkvKiBmaXhtZTogMzAgb3IgMzMgKi8KCXJldHVybiAJcmVhZF9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05UKSAvIDMzOwp9Cgp2b2lkIHNldF90aW1lcih1bG9uZyB0KQp7CgkvKiBGaXhNZTogdXNlIHR3byBjYXNjYWRlIGNvdXBsZWQgdGltZXJzICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDQwMDEpOwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgdCozMyk7Cgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDYwMDEpOwp9CgoKdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQp7CglpbnQgbT0wOwoJbG9uZyB1OwoJCglyZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKCXJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pOwoJICAgICAKI2lmIDAKCS8qIGRvIG5vdCBlbmFibGUgdGhpcyBsaW5lLCB1ZGVsYXkgaXMgdXNlZCBpbiB0aGUgc2VyaWFsIGRyaXZlciAtPiByZWN1cnNpb24gKi8KCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKI2VuZGlmCQoJd2hpbGUgKDEpIHsKCQkKCQltICs9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlMTEkpOwoJCXUgPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JQ1JPKSArIChtICogMTAwMCk7CgkJCgkJaWYgKHVzZWMgPD0gdSkgewoJCQlicmVhazsKCQl9Cgl9Cn0KCiNlbmRpZgoKaW50IHNzaV9zZXRfaW50ZXJmYWNlKGludCBmcmVxLCBpbnQgbHNiX2ZpcnN0LCBpbnQgaW52X2Nsb2NrLCBpbnQgaW52X3BoYXNlKQp7Cgl1OCB0ZW1wPTA7CgoJaWYgKGZyZXEgPj0gODE5MikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsgCgl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfODsgICAgICAgIAoJfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzE2OyAgCgl9IGVsc2UgaWYgKGZyZXEgPj0gMTAyNCkgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMzI7ICAKCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzY0OwoJfSBlbHNlIGlmIChmcmVxID49IDI1NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OwoJfSBlbHNlIGlmIChmcmVxID49IDEyOCkgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMjU2OwoJfSBlbHNlIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzUxMjsKCX0KCQoJaWYgKCFsc2JfZmlyc3QpIHsKCQl0ZW1wIHw9IE1TQkZfRU5COwoJfQoJCQoJaWYgKGludl9jbG9jaykgewoJCXRlbXAgfD0gQ0xLX0lOVl9FTkI7Cgl9CgkKCWlmIChpbnZfcGhhc2UpIHsKCQl0ZW1wIHw9IFBIU19JTlZfRU5COwoJfQoJCQoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNUTCwgdGVtcCk7CgkKCXJldHVybiAwOwp9Cgp1OCBzc2lfdHhyeF9ieXRlKHU4IGRhdGEpIAp7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUUkNWKTsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXJldHVybiByZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lSQ1YpOwkKfSAgICAgIAoKCnZvaWQgc3NpX3R4X2J5dGUodTggZGF0YSkgCnsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lYTUlULCBkYXRhKTsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsgCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUKTsKfQoKdTggc3NpX3J4X2J5dGUodm9pZCkgCnsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1JDVik7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CglyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKfSAKCiNlbmRpZiAvKiBDT05GSUdfU0M1MjAgKi8K