LyoKICogKEMpIENvcHlyaWdodCAyMDA1CiAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDQKICogU3RlZmFuIFJvZXNlLCBlc2QgZ21iaCBnZXJtYW55LCBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHBwYzR4eC5oPgojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgoKCiNpZmRlZiBDT05GSUdfU0RSQU1fQkFOSzAKCgojZGVmaW5lIG10c2RyYW0wKHJlZywgZGF0YSkgIG10ZGNyKG1lbWNmZ2EscmVnKTttdGRjcihtZW1jZmdkLGRhdGEpCgoKc3RydWN0IHNkcmFtX2NvbmZfcyB7Cgl1bnNpZ25lZCBsb25nIHNpemU7Cgl1bnNpZ25lZCBsb25nIHJlZzsKfTsKCnR5cGVkZWYgc3RydWN0IHNkcmFtX2NvbmZfcyBzZHJhbV9jb25mX3Q7CgojaWZuZGVmIENGR19TRFJBTV9UQUJMRQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IHsKCXsoMTI4IDw8IDIwKSwgMHgwMDBBNDAwMX0sICAgICAgLyogKDAtMTI4TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3gxMCg0KSAqLwoJeyg2NCA8PCAyMCksICAweDAwMDg0MDAxfSwgICAgICAvKiAoMC02NE1CKSBBZGRyZXNzIE1vZGUgMywgMTN4OSg0KSAgICovCgl7KDMyIDw8IDIwKSwgIDB4MDAwNjIwMDF9LCAgICAgIC8qICgwLTMyTUIpIEFkZHJlc3MgTW9kZSAyLCAxMng5KDQpICAgKi8KCXsoMTYgPDwgMjApLCAgMHgwMDA0NjAwMX0sICAgICAgLyogKDAtMTZNQikgQWRkcmVzcyBNb2RlIDQsIDEyeDgoNCkgICAqLwoJeyg0IDw8IDIwKSwgICAweDAwMDA4MDAxfSwgICAgICAvKiAoMC00TUIpIEFkZHJlc3MgTW9kZSA1LCAxMXg4KDIpICAgICovCn07CiNlbHNlCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gQ0ZHX1NEUkFNX1RBQkxFOwojZW5kaWYKCiNkZWZpbmUJTl9NQjBDRiAoc2l6ZW9mKG1iMGNmKSAvIHNpemVvZihtYjBjZlswXSkpCgoKI2lmbmRlZiBDT05GSUdfNDQwCgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgU0RSQU0gb24gNDA1IHBsYXRmb3JtcwogKi8Kdm9pZCBzZHJhbV9pbml0KHZvaWQpCnsKCXVsb25nIHNkdHIxOwoJdWxvbmcgcnRyOwoJaW50IGk7CgoJLyoKCSAqIFN1cHBvcnQgZm9yIDEwME1IeiBhbmQgMTMzTUh6IFNEUkFNCgkgKi8KCWlmIChnZXRfYnVzX2ZyZXEoMCkgPiAxMDAwMDAwMDApIHsKCQkvKgoJCSAqIDEzMyBNSHogU0RSQU0KCQkgKi8KCQlzZHRyMSA9IDB4MDEwNzQwMTU7CgkJcnRyID0gMHgwN2YwMDAwMDsKCX0gZWxzZSB7CgkJLyoKCQkgKiBkZWZhdWx0OiAxMDAgTUh6IFNEUkFNCgkJICovCgkJc2R0cjEgPSAweDAwODY0MDBkOwoJCXJ0ciA9IDB4MDVmMDAwMDA7Cgl9CgoJZm9yIChpPTA7IGk8Tl9NQjBDRjsgaSsrKSB7CgkJLyoKCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgoJCSAqLwoJCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4MDAwMDAwMDApOwoKCQkvKgoJCSAqIFNldCBNQjBDRiBmb3IgYmFuayAwLgoJCSAqLwoJCW10c2RyYW0wKG1lbV9tYjBjZiwgbWIwY2ZbaV0ucmVnKTsKCQltdHNkcmFtMChtZW1fc2R0cjEsIHNkdHIxKTsKCQltdHNkcmFtMChtZW1fcnRyLCBydHIpOwoKCQl1ZGVsYXkoMjAwKTsKCgkJLyoKCQkgKiBTZXQgbWVtb3J5IGNvbnRyb2xsZXIgb3B0aW9ucyByZWcsIE1DT1BUMS4KCQkgKiBTZXQgRENfRU4gdG8gJzEnIGFuZCBCUkRfUFJGIHRvICcwMScgZm9yIDE2IGJ5dGUgUExCIEJ1cnN0CgkJICogcmVhZC9wcmVmZXRjaC4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWNvcHQxLCAweDgwODAwMDAwKTsKCgkJdWRlbGF5KDEwMDAwKTsKCgkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm47CgkJfQoJfQp9CgojZWxzZSAvKiBDT05GSUdfNDQwICovCgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgRERSIFNEUkFNIG9uIDQ0MCBwbGF0Zm9ybXMKICoKICogTk9URTogU29tZSBvZiB0aGUgaGFyZGNvZGVkIHZhbHVlcyBhcmUgaGFyZHdhcmUgZGVwZW5kYW50LAogKiAgICAgICBzbyB0aGlzIHNob3VsZCBiZSBleHRlbmRlZCBmb3Igb3RoZXIgZnV0dXJlIGJvYXJkcwogKiAgICAgICB1c2luZyB0aGlzIHJvdXRpbmUhCiAqLwpsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKewoJaW50IGk7CgoJZm9yIChpPTA7IGk8Tl9NQjBDRjsgaSsrKSB7CgkJLyoKCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgoJCSAqLwoJCW10c2RyYW0obWVtX2NmZzAsIDB4MDAwMDAwMDApOwoKCQkvKgoJCSAqIFNldHVwIHNvbWUgZGVmYXVsdAoJCSAqLwoJCW10c2RyYW0obWVtX3VhYmJhLCAweDAwMDAwMDAwKTsJLyogdWJiYT0wIChkZWZhdWx0KSAgICAgICAgICAgICAqLwoJCW10c2RyYW0obWVtX3NsaW8sIDB4MDAwMDAwMDApOwkvKiByZHJlPTAgd3JyZT0wIHJhcnc9MCAgICAgICAgICovCgkJbXRzZHJhbShtZW1fZGV2b3B0LCAweDAwMDAwMDAwKTsgLyogZGxsPTAgZHM9MCAobm9ybWFsKQkJKi8KCQltdHNkcmFtKG1lbV93ZGRjdHIsIDB4MDAwMDAwMDApOyAvKiB3cmNwPTAgZGNkPTAJCSovCgkJbXRzZHJhbShtZW1fY2xrdHIsIDB4NDAwMDAwMDApOwkvKiBjbGtwPTEgKDkwIGRlZyB3cikgZGNkdD0wICAgICovCgoJCS8qCgkJICogRm9sbG93aW5nIGZvciBDQVMgTGF0ZW5jeSA9IDIuNSBAIDEzMyBNSHogUExCCgkJICovCgkJbXRzZHJhbShtZW1fYjBjciwgbWIwY2ZbaV0ucmVnKTsKCQltdHNkcmFtKG1lbV90cjAsIDB4NDEwOTQwMTIpOwoJCW10c2RyYW0obWVtX3RyMSwgMHg4MDgwMDgwMCk7CS8qIFNTPVQyIFNMPVNUQUdFIDMgQ0Q9MSBDVD0weDAwKi8KCQltdHNkcmFtKG1lbV9ydHIsIDB4N2UwMDAwMDApOwkvKiBJbnRlcnZhbCAxNS4yMLVzIEAgMTMzTUh6IFBMQiovCgkJbXRzZHJhbShtZW1fY2ZnMSwgMHgwMDAwMDAwMCk7CS8qIFNlbGYtcmVmcmVzaCBleGl0LCBkaXNhYmxlIFBNKi8KCQl1ZGVsYXkoNDAwKTsJCQkvKiBEZWxheSAyMDAgdXNlY3MgKG1pbikJKi8KCgkJLyoKCQkgKiBFbmFibGUgdGhlIGNvbnRyb2xsZXIsIHRoZW4gd2FpdCBmb3IgRENFTiB0byBjb21wbGV0ZQoJCSAqLwoJCW10c2RyYW0obWVtX2NmZzAsIDB4ODYwMDAwMDApOwkvKiBEQ0VOPTEsIFBNVUQ9MSwgNjQtYml0ICAgICAgICovCgkJdWRlbGF5KDEwMDAwKTsKCgkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm4gbWIwY2ZbaV0uc2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIDA7CQkJCS8qIG5vdGhpbmcgZm91bmQgIQkJKi8KfQoKI2VuZGlmIC8qIENPTkZJR180NDAgKi8KCiNlbmRpZiAvKiBDT05GSUdfU0RSQU1fQkFOSzAgKi8K