LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KI2luY2x1ZGUgPHNwaS5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgojdW5kZWYgU0M1MjBfQ0RQX0RFQlVHCgojaWZkZWYJU0M1MjBfQ0RQX0RFQlVHCiNkZWZpbmUJUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQojZWxzZQojZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKI2VuZGlmCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKLyoKICogVGhlb3J5OgogKiBXZSBmaXJzdCBzZXQgdXAgYWxsIElSUXMgdG8gYmUgbm9uLXBjaSwgZWRnZSB0cmlnZ2VyZWQsCiAqIHdoZW4gd2UgbGF0ZXIgZW51bWVyYXRlIHRoZSBwY2kgYnVzIGFuZCBwY2lfc2M1MjBfZml4dXBfaXJxKCkgZ2V0cwogKiBjYWxsZWQgd2UgcmVhbGxvY2F0ZSBpcnFzIHRvIHRoZSBwY2kgYnVzIHdpdGggc2M1MjBfcGNpX3NldF9pcnEoKQogKiBhcyBuZWVkZWQuIFdoZSBjaG9vc2UgdGhlIGlycXMgdG8gZ3JhbSBmcm9tIGEgY29uZmlndXJhYmxlIGxpc3QKICogaW5zaWRlIHBjaV9zYzUyMF9maXh1cF9pcnEoKSAoSWYgdGhpcyBsaXN0IGNvbnRhaW5zIHN0dXBpZCBpcnEncwogKiBzdWNoIGFzIDAgdGhuZ2FzIHdpbGwgbm90IHdvcmspCiAqLwoKc3RhdGljIHZvaWQgaXJxX2luaXQodm9pZCkKewoJLyogZGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0IG1vZGUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSUNJQ1IsIDB4NDApOwoKCS8qIHNldCBhbGwgaXJxcyB0byBlZGdlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfTVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMlBJQ01PREUsIDB4MDApOwoKCS8qIGFjdGl2ZSBsb3cgcG9sYXJpdHkgb24gUElDIGludGVycnVwdCBwaW5zLAoJICogIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IG9uIGFsbCBvdGhlciBpcnEgcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwgMHgwMDAwKTsKCgkvKiBzZXQgaXJxIG51bWJlciBtYXBwaW5nICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIwTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDIgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUME1BUCwgU0M1MjBfSVJRMCk7ICAgICAgICAgICAgIC8qIFNldCBQSVQgdGltZXIgMCBJTlQgdG8gSVJRMCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAyIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVENNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVERNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgRCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RNQUJDSU5UTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIERNQSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSBTeW5jaHJvbml1cyBzZXJpYWwgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV0RUTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgV2F0Y2hkb2cgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUlRDTUFQLCBTQzUyMF9JUlE4KTsgICAgICAgICAgICAgIC8qIFNldCBSVEMgaW50IHRvIDggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9XUFZNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSB3cml0ZSBwcm90ZWN0IElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0lDRU1BUCwgU0M1MjBfSVJRMSk7ICAgICAgICAgICAgICAvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9GRVJSTUFQLFNDNTIwX0lSUTEzKTsgICAgICAgICAgICAgLyogU2V0IEZQIGVycm9yIElOVCB0byBJUlExMyAqLwoKCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIGludGVybmFsIFVBUlQxIElOVCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMiBJTlQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AzSU1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgIC8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgICAvKiBTZXQgR1BJUlE0IChJU0EgSVJRNCkgdG8gSVJRNCAqLwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDFNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQM0lNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRMyAoSVNBIElSUTMpICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRNCAoSVNBIElSUTQpICovCgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMUlNQVAsIFNDNTIwX0lSUTEpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlExIChTSU8gSVJRMSkgdG8gSVJRMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNUlNQVAsIFNDNTIwX0lSUTUpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE1IChJU0EgSVJRNSkgdG8gSVJRNSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNklNQVAsIFNDNTIwX0lSUTYpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE2IChJU0EgSVJRNikgdG8gSVJRNiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQN0lNQVAsIFNDNTIwX0lSUTcpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE3IChJU0EgSVJRNykgdG8gSVJRNyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOElNQVAsIFNDNTIwX0lSUTgpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE4IChTSU8gSVJROCkgdG8gSVJROCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOUlNQVAsIFNDNTIwX0lSUTkpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE5IChJU0EgSVJRMikgdG8gSVJROSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAsIFNDNTIwX0lSUTExKTsgICAgICAgICAgICAvKiBTZXQgR1BJUlEwIChJU0EgSVJRMTEpIHRvIElSUTEwICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AySU1BUCwgU0M1MjBfSVJRMTIpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTIgKElTQSBJUlExMikgdG8gSVJRMTIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDEwSU1BUCxTQzUyMF9JUlExNCk7ICAgICAgICAgICAgLyogU2V0IEdQSVJRMTAgKElTQSBJUlExNCkgdG8gSVJRMTQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUENJSE9TVE1BUCwgMHgxMWYpOyAgICAgICAgICAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0VDQ01BUCwgMHgxMDApOyAgICAgICAgICAgICAgICAgICAgLyogTWFwIFNEUkFNIEVDQyBmYWlsdXJlIElOVCB0byBOTUkgKi8KCn0KCgovKiBQQ0kgc3R1ZmYgKi8Kc3RhdGljIHZvaWQgcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQp7CgkvKiBhIGNvbmZpZ3VyYWJsZSBsaXN0cyBvZiBpcnFzIHRvIHN0ZWFsCgkgKiB3aGVuIHdlIG5lZWQgb25lIChhIGJvYXJkIHdpdGggbW9yZSBwY2kgaW50ZXJydXB0IHBpbnMKCSAqIHdvdWxkIHVzZSBhIGxhcmdlciB0YWJsZSAqLwoJc3RhdGljIGludCBpcnFfbGlzdFtdID0gewoJCUNGR19GSVJTVF9QQ0lfSVJRLAoJCUNGR19TRUNPTkRfUENJX0lSUSwKCQlDRkdfVEhJUkRfUENJX0lSUSwKCQlDRkdfRk9SVEhfUENJX0lSUQoJfTsKCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKCgljaGFyIHRtcF9waW47CglpbnQgcGluOwoKCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOwoJcGluID0gdG1wX3BpbjsKCglwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCglpZiAoLTEgPT0gcGluKSB7CgkJcmV0dXJuOyAvKiBkZXZpY2UgdXNlIG5vIGlycSAqLwoJfQoKCgkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCglzd2l0Y2ggKFBDSV9ERVYoZGV2KSkgewoJY2FzZSAyMDoKCQlwaW4rPVNDNTIwX1BDSV9JTlRBOwoJCWJyZWFrOwoKCWNhc2UgMTk6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQjsKCQlicmVhazsKCgljYXNlIDE4OgoJCXBpbis9U0M1MjBfUENJX0lOVEM7CgkJYnJlYWs7CgoJY2FzZSAxNzoKCQlwaW4rPVNDNTIwX1BDSV9JTlREOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCXBpbiY9MzsgLyogd3JhcCBhcm91bmQgKi8KCglpZiAoc2M1MjBfcGNpX2ludHNbcGluXSA9PSAtMSkgewoJCS8qIHJlLXJvdXRlIG9uZSBpbnRlcnJ1cHQgZm9yIHVzICovCgkJaWYgKG5leHRfaXJxX2luZGV4ID4gMykgewoJCQlyZXR1cm47CgkJfQoJCWlmIChwY2lfc2M1MjBfc2V0X2lycShwaW4sIGlycV9saXN0W25leHRfaXJxX2luZGV4XSkpIHsKCQkJcmV0dXJuOwoJCX0KCQluZXh0X2lycV9pbmRleCsrOwoJfQoKCglpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgewoJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLAoJCQkJCSAgIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOwoJfQoJUFJJTlRGKCJmaXh1cF9pcnE6IGRldmljZSAlZCBwaW4gJWMgaXJxICVkXG4iLAoJICAgICAgIFBDSV9ERVYoZGV2KSwgJ0EnICsgcGluLCBzYzUyMF9wY2lfaW50c1twaW5dKTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9jZHBfaG9zZSA9IHsKCWZpeHVwX2lycTogcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEsCn07Cgp2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCnsKCXBjaV9zYzUyMF9pbml0KCZzYzUyMF9jZHBfaG9zZSk7Cn0KCgpzdGF0aWMgdm9pZCBzaWxlbmNlX3VhcnQoaW50IHBvcnQpCnsKCW91dGIoMCwgcG9ydCsxKTsKfQoKdm9pZCBzZXR1cF9hbGlfc2lvKGludCB1YXJ0X3ByaW1hcnkpCnsKCWFsaTUxMnhfaW5pdCgpOwoKCWFsaTUxMnhfc2V0X2ZkYyhBTElfRU5BQkxFRCwgMHgzZjIsIDYsIDApOwoJYWxpNTEyeF9zZXRfcHAoQUxJX0VOQUJMRUQsIDB4Mjc4LCA3LCAzKTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMSwgdWFydF9wcmltYXJ5PzB4M2Y4OjB4M2U4LCA0KTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMiwgdWFydF9wcmltYXJ5PzB4MmY4OjB4MmU4LCAzKTsKCWFsaTUxMnhfc2V0X3J0YyhBTElfRElTQUJMRUQsIDAsIDApOwoJYWxpNTEyeF9zZXRfa2JjKEFMSV9FTkFCTEVELCAxLCAxMik7CglhbGk1MTJ4X3NldF9jaW8oQUxJX0VOQUJMRUQpOwoKCS8qIElyRGEgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTMsIDEsIDAsIDApOwoKCS8qIFNTSSBjaGlwIHNlbGVjdCBwaW5zICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNCwgMCwgMCwgMCk7ICAvKiBTU0lfQ1MgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE1LCAwLCAwLCAwKTsgIC8qIFNTSV9NViAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTYsIDAsIDAsIDApOyAgLyogU1NJX1NQSSMgKi8KCgkvKiBCb2FyZCBSRVYgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjAsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjEsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjIsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjMsIDAsIDAsIDEpOwp9CgoKLyogc2V0IHVwIHRoZSBJU0EgYnVzIHRpbWluZyBhbmQgc3lzdGVtIGFkZHJlc3MgbWFwcGluZ3MgKi8Kc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKewoKCS8qIHNldCB1cCB0aGUgR1AgSU8gcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzMxXzE2LCAweGY3ZmYpOyAJLyogc2V0IHRoZSBHUElPIHBpbiBmdW5jdGlvbiAzMS0xNiByZWcgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMxNV8wLCAweGZmZmYpOyAgCS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMTUtMCByZWcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DU1BGUywgMHhmOCk7ICAJCS8qIHNldCB0aGUgQ1MgcGluIGZ1bmN0aW9uICByZWcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DTEtTRUwsIDB4NzApOwoKCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BDU1JULCAxKTsgICAvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NQVywgMyk7ICAgLyogc2V0IHRoZSBHUCBDUyBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFJEVywgMyk7ICAgIC8qIHNldCB0aGUgUkQgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFJET0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgUkQgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BXUlcsIDMpOyAgICAvKiBzZXQgdGhlIEdQIFdSIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BXUk9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFdSIG9mZnNldCAqLwoKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9CT09UQ1NDVEwsIDB4MTgyMyk7CQkvKiBzZXQgdXAgdGltaW5nIG9mIEJPT1RDUyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMUNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MxICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUk9NQ1MyQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBST01DUzIgKi8KCgkvKiBhZGp1c3QgdGhlIG1lbW9yeSBtYXA6CgkgKiBieSBkZWZhdWx0IHRoZSBmaXJzdCAyNTZNQiAoMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmYpIGlzIG1hcHBlZCB0byBTRFJBTQoJICogYW5kIDI1Nk1CIHRvIDFHLTEyOGsgICgweDEwMDAwMDAgLSAweDM3ZmZmZmZmKSBpcyBtYXBwZWQgdG8gUENJIG1taW8KCSAqIHdlIG5lZWQgdG8gbWFwIDFHLTEyOGsgLSAxRyAoMHgzODAwMDAwMCAtIDB4M2ZmZmZmZmYpIHRvIENTMSAqLwoKCgkvKiBTUkFNID0gR1BDUzMgMTI4ayBAIGQwMDAwLWVmZmZmKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIyLCAgMHg0ZTAwNDAwZCk7CgoJLyogSURFMCA9IEdQQ1M2IDFmMC0xZjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIzLCAgMHgzODA4MDFmMCk7CgoJLyogSURFMSA9IEdQQ1M3IDNmNiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjQsICAweDNjMDAwM2Y2KTsKCS8qIGJvb3RjcyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEyLCAweDhiZmZlODAwKTsKCS8qIHJvbWNzMiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEzLCAweGNiZmZmMDAwKTsKCS8qIHJvbWNzMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE0LCAweGFiZmZmODAwKTsKCS8qIDY4MCBMRURTICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTUsIDB4MzAwMDA2NDApOwoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIDApOwoKCWFzbSAoIndiaW52ZFxuIik7IC8qIEZsdXNoIGNhY2hlLCByZXEuIGFmdGVyIHNldHRpbmcgdGhlIHVuY2hhY2hlZCBhdHRyaWJ1dGUgb25hIFBBUiAqLwoKCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwgcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSB8IFVBUlQyX0RJU3xVQVJUMV9ESVMpOwoJCXNldHVwX2FsaV9zaW8oMSk7Cgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgJiB+KFVBUlQyX0RJU3xVQVJUMV9ESVMpKTsKCQlzZXR1cF9hbGlfc2lvKDApOwoJCXNpbGVuY2VfdWFydCgweDNlOCk7CgkJc2lsZW5jZV91YXJ0KDB4MmU4KTsKCX0KCn0KCi8qIEdQQ1MgdXNhZ2UKICogR1BDUzAgICAgICAgUElPMjcgKE5NSSkKICogR1BDUzEgICAgICAgUk9NQ1MxCiAqIEdQQ1MyICAgICAgIFJPTUNTMgogKiBHUENTMyAgICAgICBTUkFNQ1MgICAgICAgUEFSMgogKiBHUENTNCAgICAgICB1bnVzZWQgICAgICAgUEFSMwogKiBHUENTNSAgICAgICB1bnVzZWQgICAgICAgUEFSNAogKiBHUENTNiAgICAgICBJREUKICogR1BDUzcgICAgICAgSURFCiAqLwoKCi8qIHBhciB1c2FnZToKICogUEFSMCAgIGxlZ2FjeV92aWRlbwogKiBQQVIxICAgUENJIFJPTSBtYXBwaW5nCiAqIFBBUjIgICBTUkFNCiAqIFBBUjMgICBJREUKICogUEFSNCAgIElERQogKiBQQVI1ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjYgICBsZWdhY3lfdmlkZW8KICogUEFSNyAgIGxlZ2FjeV92aWRlbwogKiBQQVI4ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjkgICBsZWdhY3lfdmlkZW8KICogUEFSMTAgIGxlZ2FjeV92aWRlbwogKiBQQVIxMSAgSVNBUk9NCiAqIFBBUjEyICBCT09UQ1MKICogUEFSMTMgIFJPTUNTMQogKiBQQVIxNCAgUk9NQ1MyCiAqIFBBUjE1ICBQb3J0IDB4NjgwIExFRCBkaXNwbGF5CiAqLwoKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIElTQSBidXMKICoKICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBtZW1vcnkgYWRkcmVzcwogKiBhcyBzZWVuIGJ5IHRoZSBob3N0ICh3aGljaCBtYXkgdmVyeSB3aWxsIGJlIHRoZQogKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKICovCnUzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCVBSSU5URigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAoJICAgICAgIHNpemUsIGJ1c19hZGRyKTsKCglwYXIgPSBzaXplOwoJaWYgKHBhciA8IDB4ODAwMDApIHsKCQlwYXIgPSAweDgwMDAwOwoJfQoJcGFyID4+PSAxMjsKCXBhci0tOwoJcGFyJj0weDdmOwoJcGFyIDw8PSAxODsKCXBhciB8PSAoYnVzX2FkZHI+PjEyKTsKCXBhciB8PSAweDUwMDAwMDAwOwoKCVBSSU5URiAoInNldHRpbmcgUEFSMTEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAgcGFyKTsKCglyZXR1cm4gYnVzX2FkZHI7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcikKewoJUFJJTlRGKCJpc2FfdW5tYXBfcm9tIGFza2VkIHRvIHVubWFwICV4IiwgYWRkcik7CglpZiAoKGFkZHI+PjEyKSA9PSAocmVhZF9tbWNyX2xvbmcoU0M1MjBfUEFSMTEpJjB4M2ZmZmYpKSB7CgkJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAwKTsKCQlQUklOVEYoIiBkb25lXG4iKTsKCQlyZXR1cm47Cgl9CglQUklOVEYoIiBub3Qgb3Vyc1xuIik7Cn0KCiNpZmRlZiBDT05GSUdfUENJCiNkZWZpbmUgUENJX1JPTV9URU1QX1NQQUNFIDB4MTAwMDAKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIFBDSSBidXMsCiAqIHN1aXRhYmxlIHRvIG1hcCBQQ0kgUk9NUyAoYnVzIGFkZHJlc3MgPCAxNk0pCiAqIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaG9zdCBtZW1vcnkgYWRkcmVzcwogKiB3aGljaCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBidXMgYWRkcmVzcwogKiBiZWZvcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFBDSSByb20gYWRkcmVzcwogKiBkZWNvZGVyCiAqLwp1MzIgcGNpX2dldF9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHNpemUpCnsKCXUzMiBwYXI7CgoJcGFyID0gc2l6ZTsKCWlmIChwYXIgPCAweDgwMDAwKSB7CgkJcGFyID0gMHg4MDAwMDsKCX0KCXBhciA+Pj0gMTY7CglwYXItLTsKCXBhciY9MHg3ZmY7CglwYXIgPDw9IDE0OwoJcGFyIHw9IChQQ0lfUk9NX1RFTVBfU1BBQ0U+PjE2KTsKCXBhciB8PSAweDcyMDAwMDAwOwoKCVBSSU5URiAoInNldHRpbmcgUEFSMSB0byAleFxuIiwgcGFyKTsKCgkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgIHBhcik7CgoJcmV0dXJuIFBDSV9ST01fVEVNUF9TUEFDRTsKfQoKLyoKICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKICogd2l0aCBwY2lfZ2V0X3JvbV93aW5kb3coKQogKi8Kdm9pZCBwY2lfcmVtb3ZlX3JvbV93aW5kb3coc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgYWRkcikKewoJUFJJTlRGKCJwY2lfcmVtb3ZlX3JvbV93aW5kb3c6ICV4IiwgYWRkcik7CglpZiAoYWRkciA9PSBQQ0lfUk9NX1RFTVBfU1BBQ0UpIHsKCQl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgMCk7CgkJUFJJTlRGKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJUFJJTlRGKCIgbm90IG91cnNcbiIpOwoKfQoKLyoKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhY2NlcyB0byB0aGUKICogbGVnYWN5IHZpZGVvIEkvTyBwb3J0cyBvbiB0aGUgUENJIGJ1cy4KICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBhY2Nlc3NlcyB0byBJL08gcG9ydHMgMHgzYjAtMHgzYmIgYW5kCiAqIDB4M2MwLTB4M2RmIHNodWxkIHJlc3VsdCBpbiB0cmFuc2FjdGlvbnMgb24gdGhlIFBDSSBidXMuCiAqCiAqLwppbnQgcGNpX2VuYWJsZV9sZWdhY3lfdmlkZW9fcG9ydHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQp7CgkvKiBNYXAgdmlkZW8gbWVtb3J5IHRvIDB4YTAwMDAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjAsICAweDcyMDA0MDBhKTsKCgkvKiBmb3J3YXJkIGFsbCBJL08gYWNjZXNzZXMgdG8gUENJICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLAoJCQlyZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpIHwgSU9fSE9MRV9ERVNUX1BDSSk7CgoKCS8qIHNvIHdlIG1hcCBhd2F5IGFsbCBpbyBwb3J0cyB0byBwY2kgKG9ubHkgd2F5IHRvIGFjY2VzcyBwY2kgaW8KCSAqIGJlbG93IDB4NDAwLiBCdXQgdGhlbiB3ZSBoYXZlIHRvIG1hcCBiYWNrIHRoZSBwb3J0aW9ucyB0aGF0IHdlIGRvbnQKCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCgkgKiBJU0Egc2xvdHMgYXJlIGNvbm5lY3RlZCwgdGhpcyByZXF1cmUgdGhlIHVzZSBvZiBzZXZlcmFsIFBBUiByZWdpc3RlcnMKCSAqLwoKCS8qIGJyaW5nIDB4MTAwIC0gMHgxZWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjUsIDB4MzBlZjAxMDApOwoKCS8qIElERSB1c2UgMWYwLTFmNyAqLwoKCS8qIGJyaW5nIDB4MWY4IC0gMHgyZjcgYmFjayB0byBJU0EgdXNpbmcgUEFSNiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjYsIDB4MzBmZjAxZjgpOwoKCS8qIGNvbTIgdXNlIDJmOC0yZmYgKi8KCgkvKiBicmluZyAweDMwMCAtIDB4M2FmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI3LCAweDMwYWYwMzAwKTsKCgkvKiB2Z2EgdXNlIDNiMC0zYmIgKi8KCgkvKiBicmluZyAweDNiYyAtIDB4M2JmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjggKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI4LCAweDMwMDMwM2JjKTsKCgkvKiB2Z2EgdXNlIDNjMC0zZGYgKi8KCgkvKiBicmluZyAweDNlMCAtIDB4M2Y1IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjkgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI5LCAweDMwMTUwM2UwKTsKCgkvKiBpZGUgdXNlIDNmNiAqLwoKCS8qIGJyaW5nIDB4M2Y3ICBiYWNrIHRvIElTQSB1c2luZyBQQVIxMCAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEwLCAweDMwMDAwM2Y3KTsKCgkvKiBjb20xIHVzZSAzZjgtM2ZmICovCgoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogKi8KCmludCBib2FyZF9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjAoKTsKCWJ1c19pbml0KCk7CglpcnFfaW5pdCgpOwoKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfRFNDVEwsIDB4MDEwMCk7CgoJLyogZW50ZXIgZGVidWcgbW9kZSBhZnRlciBuZXh0IHJlc2V0IChvbmx5IGlmIGp1bXBlciBpcyBhbHNvIHNldCkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9SRVNDRkcsIDB4MDgpOwoJLyogY29uZmlndXJlIHRoZSBzb2Z0d2FyZSB0aW1lciB0byAzMy4zMzNNSHogKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TV1RNUkNGRywgMCk7CglnZC0+YnVzX2NsayA9IDMzMzMzMDAwOwoKCXJldHVybiAwOwp9CgppbnQgZHJhbV9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjBfZHJhbSgpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCnsKCW91dGIodmFsJjB4ZmYsIDB4ODApOwoJb3V0YigodmFsJjB4ZmYwMCk+PjgsIDB4NjgwKTsKfQoKCmludCBsYXN0X3N0YWdlX2luaXQodm9pZCkKewoJaW50IG1pbm9yOwoJaW50IG1ham9yOwoKCW1ham9yID0gbWlub3IgPSAwOwoJbWFqb3IgfD0gYWxpNTEyeF9jaW9faW4oMjMpPzI6MDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIyKT8xOjA7CgltaW5vciB8PSBhbGk1MTJ4X2Npb19pbigyMSk/MjowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjApPzE6MDsKCglwcmludGYoIkFNRCBTQzUyMCBDRFAgcmV2aXNpb24gJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7CgoJcmV0dXJuIDA7Cn0KCgp2b2lkIHNzaV9jaGlwX3NlbGVjdChpbnQgZGV2KQp7CgoJLyogU3B1bmsgYm9hcmQ6IFNQSSBFRVBST00gaXMgYWN0aXZlLWxvdywgTVcgRUVQUk9NIGFuZCBBVVggYXJlIGFjdGl2ZSBoaWdoICovCglzd2l0Y2ggKGRldikgewoJY2FzZSAxOiAvKiBTUEkgRUVQUk9NICovCgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAwKTsKCQlicmVhazsKCgljYXNlIDI6IC8qIE1XIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNSwgMSk7CgkJYnJlYWs7CgoJY2FzZSAzOiAvKiBBVVggKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTQsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMDoKCQlhbGk1MTJ4X2Npb19vdXQoMTYsIDEpOwoJCWFsaTUxMnhfY2lvX291dCgxNSwgMCk7CgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAwKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCXByaW50ZigiSWxsZWdhbCBTU0kgZGV2aWNlIHJlcXVlc3RlZDogJWRcbiIsIGRldik7Cgl9Cn0KCnZvaWQgc3BpX2VlcHJvbV9wcm9iZShpbnQgeCkKewp9CgppbnQgc3BpX2VlcHJvbV9yZWFkKGludCB4LCBpbnQgb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW4pCnsKICAgICAgIHJldHVybiAwOwp9CgppbnQgc3BpX2VlcHJvbV93cml0ZShpbnQgeCwgaW50IG9mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKdm9pZCBzcGlfaW5pdF9mKHZvaWQpCnsKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJc3BpX2VlcHJvbV9wcm9iZSgxKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVwoJbXdfZWVwcm9tX3Byb2JlKDIpOwojZW5kaWYKfQoKc3NpemVfdCBzcGlfcmVhZCh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fcmVhZCgyLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZiAhZGVmaW5lZChDT05GSUdfU0M1MjBfQ0RQX1VTRV9TUEkpICYmICFkZWZpbmVkKENPTkZJR19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV93cml0ZSgxLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVwoJcmVzID0gbXdfZWVwcm9tX3dyaXRlKDIsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmICFkZWZpbmVkKENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NDNTIwX0NEUF9VU0VfTVcpCglyZXMgPSAwOwojZW5kaWYKCXJldHVybiByZXM7Cn0K