LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwY2kuaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgoKc3RhdGljIHN0cnVjdCB7Cgl1OCBwcmlvcml0eTsKCXUxNiBsZXZlbF9yZWc7Cgl1OCBsZXZlbF9iaXQ7Cn0gc2M1MjBfaXJxW10gPSB7Cgl7IFNDNTIwX0lSUTAsICBTQzUyMF9NUElDTU9ERSwgIDB4MDEgfSwKCXsgU0M1MjBfSVJRMSwgIFNDNTIwX01QSUNNT0RFLCAgMHgwMiB9LAoJeyBTQzUyMF9JUlEyLCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMiB9LAoJeyBTQzUyMF9JUlEzLCAgU0M1MjBfTVBJQ01PREUsICAweDA4IH0sCgl7IFNDNTIwX0lSUTQsICBTQzUyMF9NUElDTU9ERSwgIDB4MTAgfSwKCXsgU0M1MjBfSVJRNSwgIFNDNTIwX01QSUNNT0RFLCAgMHgyMCB9LAoJeyBTQzUyMF9JUlE2LCAgU0M1MjBfTVBJQ01PREUsICAweDQwIH0sCgl7IFNDNTIwX0lSUTcsICBTQzUyMF9NUElDTU9ERSwgIDB4ODAgfSwKCgl7IFNDNTIwX0lSUTgsICBTQzUyMF9TTDFQSUNNT0RFLCAweDAxIH0sCgl7IFNDNTIwX0lSUTksICBTQzUyMF9TTDFQSUNNT0RFLCAweDAyIH0sCgl7IFNDNTIwX0lSUTEwLCBTQzUyMF9TTDFQSUNNT0RFLCAweDA0IH0sCgl7IFNDNTIwX0lSUTExLCBTQzUyMF9TTDFQSUNNT0RFLCAweDA4IH0sCgl7IFNDNTIwX0lSUTEyLCBTQzUyMF9TTDFQSUNNT0RFLCAweDEwIH0sCgl7IFNDNTIwX0lSUTEzLCBTQzUyMF9TTDFQSUNNT0RFLCAweDIwIH0sCgl7IFNDNTIwX0lSUTE0LCBTQzUyMF9TTDFQSUNNT0RFLCAweDQwIH0sCgl7IFNDNTIwX0lSUTE1LCBTQzUyMF9TTDFQSUNNT0RFLCAweDgwIH0KfTsKCgovKiBUaGUgaW50ZXJydXB0IHVzZWQgZm9yIFBDSSBJTlRBLUlOVEQgICovCmludCBzYzUyMF9wY2lfaW50c1sxNV0gPSB7CgktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCgkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKfTsKCi8qIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29uZmlndXJlIGEgcGNpIGludGVycnVwdCAqLwppbnQgcGNpX3NjNTIwX3NldF9pcnEoaW50IHBjaV9waW4sIGludCBpcnEpCnsKCWludCBpOwoKIyBpZiAxCglwcmludGYoInNldF9pcnEoKTogbWFwIElOVCVjIHRvIElSUSVkXG4iLCBwY2lfcGluICsgJ0EnLCBpcnEpOwojZW5kaWYKCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7CgkJcmV0dXJuIC0xOyAvKiBpbGxlZ2FsIGlycSAqLwoJfQoKCWlmIChwY2lfcGluIDwgMCB8fCBwY2lfcGluID4gMTUpIHsKCQlyZXR1cm4gLTE7IC8qIGlsbGVnYWwgcGNpIGludCBwaW4gKi8KCX0KCgkvKiBmaXJzdCBkaXNhYmxlIGFueSBub24tcGNpIGludGVycnVwdCBzb3VyY2UgdGhhdCB1c2UKCSAqIHRoaXMgbGV2ZWwgKi8KCWZvciAoaT1TQzUyMF9HUFRNUjBNQVA7aTw9U0M1MjBfR1AxMElNQVA7aSsrKSB7CgkJaWYgKGk+PVNDNTIwX1BDSUlOVEFNQVAmJmk8PVNDNTIwX1BDSUlOVERNQVApIHsKCQkJY29udGludWU7CgkJfQoJCWlmIChyZWFkX21tY3JfYnl0ZShpKSA9PSBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSkgewoJCQl3cml0ZV9tbWNyX2J5dGUoaSwgU0M1MjBfSVJRX0RJU0FCTEVEKTsKCQl9Cgl9CgoJLyogU2V0IHRoZSB0cmlnZ2VyIHRvIGxldmVsICovCgl3cml0ZV9tbWNyX2J5dGUoc2M1MjBfaXJxW2lycV0ubGV2ZWxfcmVnLAoJCQlyZWFkX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcpIHwgc2M1MjBfaXJxW2lycV0ubGV2ZWxfYml0KTsKCgoJaWYgKHBjaV9waW4gPCA0KSB7CgkJLyogUENJIElOVEEtSU5URCAqLwoJCS8qIHJvdXRlIHRoZSBpbnRlcnJ1cHQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQU1BUCArIHBjaV9waW4sIHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KTsKCgoJfSBlbHNlIHsKCQkvKiBHUElSUTAtR1BJUlExMCB1c2VkIGZvciBhZGRpdGlvbmFsIFBDSSBJTlRTICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAgKyBwY2lfcGluIC0gNCwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOwoKCQkvKiBhbHNvIHNldCB0aGUgcG9sYXJpdHkgaW4gdGhpcyBjYXNlICovCgkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwKCQkJCXJlYWRfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCkgfCAoMSA8PCAocGNpX3Bpbi00KSkpOwoKCX0KCgkvKiByZWdpc3RlciB0aGUgcGluICovCglzYzUyMF9wY2lfaW50c1twY2lfcGluXSA9IGlycTsKCgoJcmV0dXJuIDA7IC8qIE9LICovCn0KCnZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQp7Cglob3NlLT5maXJzdF9idXNubyA9IDA7Cglob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKCgkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9CVVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfUEhZUywKCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fTUVNT1JZKTsKCgkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKCQkgICAgICAgU0M1MjBfUENJX01FTV9CVVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1fUEhZUywKCQkgICAgICAgU0M1MjBfUENJX01FTV9TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CgoJLyogSVNBL1BDSSBtZW1vcnkgc3BhY2UgKi8KCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKCQkgICAgICAgU0M1MjBfSVNBX01FTV9QSFlTLAoJCSAgICAgICBTQzUyMF9JU0FfTUVNX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKCgkvKiBQQ0kgSS9PIHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKCQkgICAgICAgU0M1MjBfUENJX0lPX0JVUywKCQkgICAgICAgU0M1MjBfUENJX0lPX1BIWVMsCgkJICAgICAgIFNDNTIwX1BDSV9JT19TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKCgkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDQsCgkJICAgICAgIFNDNTIwX0lTQV9JT19CVVMsCgkJICAgICAgIFNDNTIwX0lTQV9JT19QSFlTLAoJCSAgICAgICBTQzUyMF9JU0FfSU9fU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CgoJaG9zZS0+cmVnaW9uX2NvdW50ID0gNTsKCglwY2lfc2V0dXBfdHlwZTEoaG9zZSwKCQkJU0M1MjBfUkVHX0FERFIsCgkJCVNDNTIwX1JFR19EQVRBKTsKCglwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKCglob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKCgkvKiBlbmFibGUgdGFyZ2V0IG1lbW9yeSBhY2Nlc2VzIG9uIGhvc3QgYnJpZ2UgKi8KCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwKCQkJICAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKCn0K