LyoKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIEhhY2tlZCBmb3IgdGhlIEh5bW9kIGJvYXJkIGJ5IE11cnJheS5KZW5zZW5AY3Npcm8uYXUsIDIwLU9jdC0wMAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzgyNjAuaD4KI2luY2x1ZGUgPG1wYzgyNjBfaXJxLmg+CiNpbmNsdWRlIDxpb3BvcnRzLmg+CiNpbmNsdWRlIDxpMmMuaD4KI2luY2x1ZGUgPGFzbS9pb3Bpbl84MjYwLmg+CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBpbXBvcnRzIGZyb20gZWVwcm9tLmMgKi8KZXh0ZXJuIGludCBoeW1vZF9lZXByb21fcmVhZCAoaW50LCBoeW1vZF9lZXByb21fdCAqKTsKZXh0ZXJuIHZvaWQgaHltb2RfZWVwcm9tX3ByaW50IChoeW1vZF9lZXByb21fdCAqKTsKCi8qIGltcG9ydHMgZnJvbSBlbnYuYyAqLwpleHRlcm4gdm9pZCBoeW1vZF9jaGVja19lbnYgKHZvaWQpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogSS9PIFBvcnQgY29uZmlndXJhdGlvbiB0YWJsZQogKgogKiBpZiBjb25mIGlzIDEsIHRoZW4gdGhhdCBwb3J0IHBpbiB3aWxsIGJlIGNvbmZpZ3VyZWQgYXQgYm9vdCB0aW1lCiAqIGFjY29yZGluZyB0byB0aGUgZml2ZSB2YWx1ZXMgcG9kci9wZGlyL3BwYXIvcHNvci9wZGF0IGZvciB0aGF0IGVudHJ5CiAqLwoKY29uc3QgaW9wX2NvbmZfdCBpb3BfY29uZl90YWJbNF1bMzJdID0gewoKCS8qIFBvcnQgQSBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEEzMTogRkNDMSBNSUkgQ09MICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMzA6IEZDQzEgTUlJIENSUyAqLwoJCXsgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQQTI5OiBGQ0MxIE1JSSBUWF9FUiAqLwoJCXsgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQQTI4OiBGQ0MxIE1JSSBUWF9FTiAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQTI3OiBGQ0MxIE1JSSBSWF9EViAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQTI2OiBGQ0MxIE1JSSBSWF9FUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTI1OiBGQ0MyIE1JSSBNRElPICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjQ6IEZDQzIgTUlJIE1EQyAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTIzOiBGQ0MzIE1JSSBNRElPICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjI6IEZDQzMgTUlJIE1EQyAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTIxOiBGQ0MxIE1JSSBUeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyMDogRkNDMSBNSUkgVHhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTk6IEZDQzEgTUlJIFR4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTE4OiBGQ0MxIE1JSSBUeERbMF0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEExNzogRkNDMSBNSUkgUnhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTY6IEZDQzEgTUlJIFJ4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE1OiBGQ0MxIE1JSSBSeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEExNDogRkNDMSBNSUkgUnhEWzBdICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTM6IEZDQzEgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMjogRkNDMSBNSUkgTURDICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTE6IFNFTF9DRCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTEwOiBGTEFTSCBTVFMxICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMDk6IEZMQVNIIFNUUzAgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwODogRkxBU0ggflBFICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMDc6IFdBVENIIH5IUkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDEsICAwICAgfSwJLyogUEEwNjogVkMgRE9ORSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMSwgIDAgICB9LAkvKiBQQTA1OiBWQyBJTklUICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMDQ6IFZDIH5QUk9HICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMDM6IFZNIEVOQUJMRSAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMSwgIDAgICB9LAkvKiBQQTAyOiBWTSBET05FICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCAgIH0sCS8qIFBBMDE6IFZNIElOSVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSAJLyogUEEwMDogVk0gflBST0cgKi8KCX0sCgoJLyogUG9ydCBCIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjMxOiBGQ0MyIE1JSSBUWF9FUiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjMwOiBGQ0MyIE1JSSBSWF9EViAqLwoJCXsgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQQjI5OiBGQ0MyIE1JSSBUWF9FTiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjI4OiBGQ0MyIE1JSSBSWF9FUiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjI3OiBGQ0MyIE1JSSBDT0wgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyNjogRkNDMiBNSUkgQ1JTICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjU6IEZDQzIgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjI0OiBGQ0MyIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIyMzogRkNDMiBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjI6IEZDQzIgTUlJIFR4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjIxOiBGQ0MyIE1JSSBSeERbMF0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyMDogRkNDMiBNSUkgUnhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTk6IEZDQzIgTUlJIFJ4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjE4OiBGQ0MyIE1JSSBSeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxNzogRkNDMyBNSUkgUlhfRFYgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxNjogRkNDMyBNSUkgUlhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIxNTogRkNDMyBNSUkgVFhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIxNDogRkNDMyBNSUkgVFhfRU4gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxMzogRkNDMyBNSUkgQ09MICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTI6IEZDQzMgTUlJIENSUyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjExOiBGQ0MzIE1JSSBSeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxMDogRkNDMyBNSUkgUnhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMDk6IEZDQzMgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjA4OiBGQ0MzIE1JSSBSeERbMF0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIwNzogRkNDMyBNSUkgVHhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDY6IEZDQzMgTUlJIFR4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjA1OiBGQ0MzIE1JSSBUeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIwNDogRkNDMyBNSUkgVHhEWzBdICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMDM6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMDI6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMDE6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0JLyogUEIwMDogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCX0sCgoJLyogUG9ydCBDIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzMxOiBNRVogfklBQ0sgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMzMDogPyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI5OiBDTEsgU0NDeCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI4OiBDTEs0ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjc6IENMSyBTQ0NGICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjY6IENMSyAzMksgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyNTogQlJHNC9DTEs3ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjQ6ID8gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyMzogQ0xLIFNDQ3ggKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyMjogRkNDMSBNSUkgUlhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjE6IEZDQzEgTUlJIFRYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzIwOiBDTEsgU0NDRiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE5OiBGQ0MyIE1JSSBSWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxODogRkNDMiBNSUkgVFhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTc6IEZDQzMgTUlJIFJYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE2OiBGQ0MzIE1JSSBUWF9DTEsgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxNTogU0NDMSBVQVJUIH5DVFMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxNDogU0NDMSBVQVJUIH5DRCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzEzOiBTQ0MyIFVBUlQgfkNUUyAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzEyOiBTQ0MyIFVBUlQgfkNEICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBDMTE6IFNDQzEgVUFSVCB+RFRSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBDMTA6IFNDQzEgVUFSVCB+RFNSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBDMDk6IFNDQzIgVUFSVCB+RFRSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBDMDg6IFNDQzIgVUFSVCB+RFNSICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDc6IFRFTVAgfkFMRVJUICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDY6IEZDQzMgSU5UICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDU6IEZDQzIgSU5UICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDQ6IEZDQzEgSU5UICovCgkJeyAgIDAsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBDMDM6IFNETUEgSURNQTIgfkRBQ0sgKi8KCQl7ICAgMCwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEMwMjogU0RNQSBJRE1BMiB+RE9ORSAqLwoJCXsgICAwLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzAxOiBTRE1BIElETUEyIH5EUkVRICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0JLyogUEMwMDogQlJHNyAqLwoJfSwKCgkvKiBQb3J0IEQgY29uZmlndXJhdGlvbiAqLwoJewoJCS8qIGNuZiBwYXIgc29yIGRpciBvZHIgZGF0ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMzE6IFNDQzEgVUFSVCBSeEQgKi8KCQl7ICAgMSwgIDEsICAxLCAgMSwgIDAsICAwICAgfSwJLyogUEQzMDogU0NDMSBVQVJUIFR4RCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDI5OiBTQ0MxIFVBUlQgflJUUyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDI4OiBTQ0MyIFVBUlQgUnhEICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMjc6IFNDQzIgVUFSVCBUeEQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEQyNjogU0NDMiBVQVJUIH5SVFMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyNTogU0NDMSBVQVJUIH5SSSAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDI0OiBTQ0MyIFVBUlQgflJJICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMjM6IENMS0dFTiBQRCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDIyOiBVU0VSMyAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDIxOiBVU0VSMiAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDIwOiBVU0VSMSAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE5OiBTUEkgflNFTCAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE4OiBTUEkgQ0xLICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMTc6IFNQSSBNT1NJICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMTY6IFNQSSBNSVNPICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCAgIH0sCS8qIFBEMTU6IEkyQyBTREEgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDEsICAwICAgfSwJLyogUEQxNDogSTJDIFNDTCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDEzOiBURU1QIH5TVERCWSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDEyOiBGQ0MzIH5SRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDExOiBGQ0MyIH5SRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDEwOiBGQ0MxIH5SRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDA5OiBQRDkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwODogUEQ4ICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMDc6IFBENyAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA2OiBQRDYgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQwNTogUEQ1ICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMDQ6IFBENCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDAzOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDAyOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDAxOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9CS8qIFBEMDA6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgl9Cn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBBTUkgRlM2Mzc3IENsb2NrIEdlbmVyYXRvciBjb25maWd1cmF0aW9uIHRhYmxlCiAqCiAqIHRoZSAiZnM2Mzc3X3JlZ3NbXSIgdGFibGUgZW50cmllcyBjb3JyZXNwb25kIHRvIEZTNjM3NyByZWdpc3RlcnMKICogMCAtIDE1ICh0b3RhbCBvZiAxNiBieXRlcykuCiAqCiAqIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIEZTNjM3NyB2aWEgdGhlIGkyYyBidXMgdXNpbmcgYWRkcmVzcyBpbgogKiAiZnM2Mzc3X2FkZHIiIChhZGRyZXNzIGlzIDcgYml0cyAtIFIvVyBiaXQgbm90IGluY2x1ZGVkKS4KICoKICogVGhlIGZzNjM3NyBoYXMgZm91ciBjbG9jayBvdXRwdXRzOiBBLCBCLCBDIGFuZCBELgogKgogKiBPdXRwdXRzIEMgYW5kIEQgY2FuIGVhY2ggcHJvdmlkZSB0d28gZGlmZmVyZW50IGNsb2NrIG91dHB1dHMgQzEvRDEgb3IKICogQzIvRDIgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgU0VMX0NEIGlucHV0IHdoaWNoIGlzIGNvbm5lY3RlZCB0bwogKiB0aGUgTVBDODI2MCBJL08gcG9ydCBwaW4gUEExMS4gUEExMSBvdXRwdXQgKFNFTF9DRCBpbnB1dCkgbG93IChvciAwKQogKiBzZWxlY3RzIEMxL0QxIGFuZCBQQTExIG91dHB1dCAoU0VMX0NEIGlucHV0KSBoaWdoIChvciAxKSBzZWxlY3RzIEMyL0QyLgogKgogKiBQQTExIGRlZmF1bHRzIHRvIG91dHB1dCBsb3cgKG9yIDApIGluIHRoZSBpL28gcG9ydCBjb25maWcgdGFibGUgYWJvdmUuCiAqCiAqIE91dHB1dCBBIHByb3ZpZGVzIGEgMTAwTUh6IGZvciB0aGUgSGlnaCBTcGVlZCBTZXJpYWwgY2hpcHMuIE91dHB1dCBCCiAqIHByb3ZpZGVzIGEgMy42ODY0TUh6IGNsb2NrIGZvciBtb3JlIGFjY3VyYXRlIGFzeW5jaHJvbm91cyBzZXJpYWwgYml0CiAqIHJhdGVzLiBPdXRwdXQgQyBpcyByb3V0ZWQgdG8gdGhlIG1lenphbmluZSBjb25uZWN0b3IgYnV0IGlzIGN1cnJlbnRseQogKiB1bnVzZWQgLSBib3RoIEMxIGFuZCBDMiBhcmUgc2V0IHRvIDE2TUh6LiBPdXRwdXQgRCBpcyB1c2VkIGJ5IGJvdGggdGhlCiAqIGFsdC1pbnB1dCBhbmQgZGlzcGxheSBtZXp6YW5pbmUgYm9hcmRzIGZvciB0aGVpciB2aWRlbyBjaGlwcy4gVGhlCiAqIGFsdC1pbnB1dCBib2FyZCByZXF1aXJlcyBhIGNsb2NrIG9mIDI0LjU3Nk1IeiBhbmQgdGhpcyBpcyBhdmFpbGFibGUgb24KICogRDEgKFBBMTE9U0VMX0NEPTApLiBUaGUgZGlzcGxheSBib2FyZCByZXF1aXJlcyBhIGNsb2NrIG9mIDI3TUh6IGFuZCB0aGlzCiAqIGlzIGF2YWlsYWJsZSBvbiBEMiAoUEExMT1TRUxfQ0Q9MSkuCiAqCiAqIFNvIHRoZSBkZWZhdWx0IGlzIGEgY2xvY2sgc3VpdGFibGUgZm9yIHRoZSBhbHQtaW5wdXQgYm9hcmQuIFBBMTEgaXMgdG9nZ2xlZAogKiBsYXRlciBpbiBtaXNjX2luaXRfcigpLCBpZiBhIGRpc3BsYXkgYm9hcmQgaXMgZGV0ZWN0ZWQuCiAqLwoKdWNoYXIgZnM2Mzc3X2FkZHIgPSAweDVjOwoKdWNoYXIgZnM2Mzc3X3JlZ3NbMTZdID0gewoJIDEyLCAgNzUsICA2NCwgIDI1LCAxNDQsIDEyOCwgIDI1LCAxOTIsCgkgIDAsICAxNiwgMTM1LCAxOTIsIDIyNCwgIDY0LCAgNjQsIDE5Mgp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogc3BlY2lhbCBib2FyZCBpbml0aWFsaXNhdGlvbiwgYWZ0ZXIgY2xvY2tzIGFuZCB0aW1lYmFzZSBoYXZlIGJlZW4KICogc2V0IHVwIGJ1dCBiZWZvcmUgZW52aXJvbm1lbnQgYW5kIHNlcmlhbCBhcmUgaW5pdGlhbGlzZWQuCiAqCiAqIGFkZGVkIHNvIHRoYXQgdmVyeSBlYXJseSBpbml0aWFsaXNhdGlvbnMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIGkyYwogKiBkcml2ZXIgKHdoaWNoIHJlcXVpcmVzIHRoZSBjbG9ja3MsIHRvIGNhbGN1bGF0ZSB0aGUgZGl2aWRlcnMsIGFuZAogKiB0aGUgdGltZWJhc2UsIGZvciB1ZGVsYXkoKSkKICovCgppbnQKYm9hcmRfcG9zdGNsa19pbml0ICh2b2lkKQp7CglpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CgoJLyoKCSAqIEluaXRpYWxpc2UgdGhlIEZTNjM3NyBjbG9jayBjaGlwCgkgKgoJICogdGhlIHNlY29uZGFyeSBhZGRyZXNzIGlzIHRoZSByZWdpc3RlciBudW1iZXIgZnJvbSB3aGVyZSB0bwoJICogc3RhcnQgdGhlIHdyaXRlIC0gSSB3YW50IHRvIHdyaXRlIGFsbCB0aGUgcmVnaXN0ZXJzCgkgKgoJICogZG9uJ3QgYm90aGVyIGNoZWNraW5nIHJldHVybiBzdGF0dXMgLSB3ZSBoYXZlIG5vIGNvbnNvbGUgeWV0CgkgKiB0byBwcmludCBpdCBvbiwgbm9yIGFueSBSQU0gdG8gc3RvcmUgaXQgaW4gLSBpdCB3aWxsIGJlIG9idmlvdXMKCSAqIGlmIHRoaXMgZG9lc24ndCB3b3JrCgkgKi8KCSh2b2lkKSBpMmNfd3JpdGUgKGZzNjM3N19hZGRyLCAwLCAxLCBmczYzNzdfcmVncywKCQkJCQlzaXplb2YgKGZzNjM3N19yZWdzKSk7CgoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6IEhhcmR3aXJlZCB0byBIWU1PRAogKi8KCmludApjaGVja2JvYXJkICh2b2lkKQp7CglwdXRzICgiQm9hcmQ6IEhZTU9EXG4iKTsKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIG1pc2NlbGxhbmVvdXMgKGVhcmx5IC0gd2hpbGUgcnVubmluZyBpbiBmbGFzaCkgaW5pdGlhbGlzYXRpb25zLgogKi8KCiNkZWZpbmUgX05PVF9VU0VEXwkweEZGRkZGRkZGCgp1aW50IHVwbWJfdGFibGVbXSA9IHsKCS8qIFJlYWQgU2luZ2xlIEJlYXQgKFJTUykgLSBvZmZzZXQgMHgwMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWFkIEJ1cnN0IChSQlMpIC0gb2Zmc2V0IDB4MDggKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBTaW5nbGUgQmVhdCAoV1NTKSAtIG9mZnNldCAweDE4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIEJ1cnN0IChXU1MpIC0gb2Zmc2V0IDB4MjAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWZyZXNoIFRpbWVyIChQVFMpIC0gb2Zmc2V0IDB4MzAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIEV4Y2VwdGlvbiBDb25kaXRpb24gKEVYUykgLSBvZmZzZXQgMHgzYyAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXwp9OwoKdWludCB1cG1jX3RhYmxlW10gPSB7CgkvKiBSZWFkIFNpbmdsZSBCZWF0IChSU1MpIC0gb2Zmc2V0IDB4MDAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVhZCBCdXJzdCAoUkJTKSAtIG9mZnNldCAweDA4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgU2luZ2xlIEJlYXQgKFdTUykgLSBvZmZzZXQgMHgxOCAqLwoJMHhGMEUwMDAwMCwgMHhGMEEwMDAwMCwgMHgwMEEwMDAwMCwgMHgzMEEwMDAwMCwKCTB4RjBGNDAwMDcsIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBCdXJzdCAoV1NTKSAtIG9mZnNldCAweDIwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVmcmVzaCBUaW1lciAoUFRTKSAtIG9mZnNldCAweDMwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBFeGNlcHRpb24gQ29uZGl0aW9uIChFWFMpIC0gb2Zmc2V0IDB4M2MgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8KfTsKCmludAptaXNjX2luaXRfZiAodm9pZCkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKCXZvbGF0aWxlIG1lbWN0bDgyNjBfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7CgoJcHJpbnRmICgiVVBNczogICIpOwoKCXVwbWNvbmZpZyAoVVBNQiwgdXBtYl90YWJsZSwgc2l6ZW9mIHVwbWJfdGFibGUgLyBzaXplb2YgdXBtYl90YWJsZVswXSk7CgltZW1jdGwtPm1lbWNfbWJtciA9IENGR19NQk1SOwoKCXVwbWNvbmZpZyAoVVBNQywgdXBtY190YWJsZSwgc2l6ZW9mIHVwbWNfdGFibGUgLyBzaXplb2YgdXBtY190YWJsZVswXSk7CgltZW1jdGwtPm1lbWNfbWNtciA9IENGR19NQ01SOwoKCXByaW50ZiAoImNvbmZpZ3VyZWRcbiIpOwoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKbG9uZwppbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCnsKCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOwoJdm9sYXRpbGUgdWNoYXIgYyA9IDAsICpyYW1hZGRyID0gKHVjaGFyICopIChDRkdfU0RSQU1fQkFTRSArIDB4OCk7Cgl1bG9uZyBwc2RtciA9IENGR19QU0RNUjsKCWludCBpOwoKCS8qCgkgKiBRdW90ZSBmcm9tIDgyNjAgVU0gKDEwLjQuMiBTRFJBTSBQb3dlci1PbiBJbml0aWFsaXphdGlvbiwgMTAtMzUpOgoJICoKCSAqICJBdCBzeXN0ZW0gcmVzZXQsIGluaXRpYWxpemF0aW9uIHNvZnR3YXJlIG11c3Qgc2V0IHVwIHRoZQoJICogIHByb2dyYW1tYWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBtZW1vcnkgY29udHJvbGxlciBiYW5rcyByZWdpc3RlcnMKCSAqICAoT1J4LCBCUngsIFAvTFNETVIpLiBBZnRlciBhbGwgbWVtb3J5IHBhcmFtZXRlcnMgYXJlIGNvbt5ndXJlZCwKCSAqICBzeXN0ZW0gc29mdHdhcmUgc2hvdWxkIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQoJICogIGZvciBlYWNoIFNEUkFNIGRldmljZS4KCSAqCgkgKiAgMS4gSXNzdWUgYSBQUkVDSEFSR0UtQUxMLUJBTktTIGNvbW1hbmQKCSAqICAyLiBJc3N1ZSBlaWdodCBDQlIgUkVGUkVTSCBjb21tYW5kcwoJICogIDMuIElzc3VlIGEgTU9ERS1TRVQgY29tbWFuZCB0byBpbml0aWFsaXplIHRoZSBtb2RlIHJlZ2lzdGVyCgkgKgoJICogIFRoZSBpbml0aWFsIGNvbW1hbmRzIGFyZSBleGVjdXRlZCBieSBzZXR0aW5nIFAvTFNETVJbT1BdIGFuZAoJICogIGFjY2Vzc2luZyB0aGUgU0RSQU0gd2l0aCBhIHNpbmdsZS1ieXRlIHRyYW5zYWN0aW9uLiIKCSAqCgkgKiBUaGUgYXBwcm9wcmlhdGUgQlJ4L09SeCByZWdpc3RlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gd2UKCSAqIGdldCBoZXJlLiBUaGUgU0RSQU0gY2FuIGJlIGFjY2Vzc2VkIGF0IHRoZSBhZGRyZXNzIENGR19TRFJBTV9CQVNFLgoJICovCgoJbWVtY3RsLT5tZW1jX3BzcnQgPSBDRkdfUFNSVDsKCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUjsKCgltZW1jdGwtPm1lbWNfcHNkbXIgPSBwc2RtciB8IFBTRE1SX09QX1BSRUE7CgkqcmFtYWRkciA9IGM7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9DQlJSOwoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKCQkqcmFtYWRkciA9IGM7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9NUlc7CgkqcmFtYWRkciA9IGM7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9OT1JNIHwgUFNETVJfUkZFTjsKCSpyYW1hZGRyID0gYzsKCglyZXR1cm4gKENGR19TRFJBTV9TSVpFIDw8IDIwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtaXNjZWxsYW5lb3VzIGluaXRpYWxpc2F0aW9ucyBhZnRlciByZWxvY2F0aW9uIGludG8gcmFtIChtaXNjX2luaXRfcikgICAgICovCi8qIAkJCQkJCQkJCSAgICAgKi8KLyogbG9hZHMgdGhlIGRhdGEgaW4gdGhlIG1haW4gYm9hcmQgYW5kIG1lenphbmluZSBib2FyZCBlZXByb21zIGludG8JICAgICAqLwovKiB0aGUgaHltb2QgY29uZmlndXJhdGlvbiBzdHJ1Y3Qgc3RvcmVkIGluIHRoZSBib2FyZCBpbmZvcm1hdGlvbiBhcmVhLgkgICAgICovCi8qIAkJCQkJCQkJCSAgICAgKi8KLyogaWYgdGhlIGNvbnRlbnRzIG9mIGVpdGhlciBlZXByb20gaXMgaW52YWxpZCwgcHJvbXB0cyBmb3IgYSBzZXJpYWwJICAgICAqLwovKiBudW1iZXIgKGFuZCBhbiBldGhlcm5ldCBhZGRyZXNzIGlmIHJlcXVpcmVkKSB0aGVuIGZldGNoZXMgYSBmaWxlCSAgICAgKi8KLyogY29udGFpbmluZyBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIGVlcHJvbSBmcm9tIHRoZSB0ZnRwIHNlcnZlciAgICAqLwovKiAodGhlIGZpbGUgbmFtZSBpcyBiYXNlZCBvbiB0aGUgc2VyaWFsIG51bWJlciBhbmQgYSBidWlsdC1pbiBwYXRoKQkgICAgICovCgppbnQKbGFzdF9zdGFnZV9pbml0ICh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCgloeW1vZF9jb25mX3QgKmNwID0gJmdkLT5iZC0+YmlfaHltb2RfY29uZjsKCWludCByYzsKCiNpZmRlZiBDT05GSUdfQk9PVF9SRVRSWV9USU1FCgkvKgoJICogd2UgdXNlIHRoZSByZWFkbGluZSAoKSBmdW5jdGlvbiwgYnV0IHdlIGFsc28gd2FudAoJICogY29tbWFuZCB0aW1lb3V0IGVuYWJsZWQKCSAqLwoJaW5pdF9jbWRfdGltZW91dCAoKTsKI2VuZGlmCgoJbWVtc2V0ICgodm9pZCAqKSBjcCwgMCwgc2l6ZW9mICgqY3ApKTsKCgkvKiBzZXQgdXAgbWFpbiBib2FyZCBjb25maWcgaW5mbyAqLwoKCXJjID0gaHltb2RfZWVwcm9tX3JlYWQgKDAsICZjcC0+bWFpbi5lZXByb20pOwoKCXB1dHMgKCJFRVBST006bWFpbi4uLiIpOwoJaWYgKHJjIDwgMCkKCQlwdXRzICgiTk9UIFBSRVNFTlRcbiIpOwoJZWxzZSBpZiAocmMgPT0gMCkKCQlwdXRzICgiSU5WQUxJRFxuIik7CgllbHNlIHsKCQljcC0+bWFpbi5lZXByb20udmFsaWQgPSAxOwoKCQlwcmludGYgKCJPSyAodmVyICV1KVxuIiwgY3AtPm1haW4uZWVwcm9tLnZlcik7CgkJaHltb2RfZWVwcm9tX3ByaW50ICgmY3AtPm1haW4uZWVwcm9tKTsKCgkJLyoKCQkgKiBoYXJkLXdpcmVkIGFzc3VtcHRpb24gaGVyZTogYWxsIGh5bW9kIG1haW4gYm9hcmRzIHdpbGwgaGF2ZQoJCSAqIG9uZSB4aWxpbnggZnBnYSwgd2l0aCB0aGUgaW50ZXJydXB0IGxpbmUgY29ubmVjdGVkIHRvIElSUTIKCQkgKgoJCSAqIE9uZSBkYXksIHRoaXMgbWlnaHQgYmUgYmFzZWQgb24gdGhlIGJvYXJkIHR5cGUKCQkgKi8KCgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucHJvZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnByb2cuc2l6ZSA9IEZQR0FfTUFJTl9DRkdfU0laRTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wcm9nLmJhc2UgPSBGUEdBX01BSU5fQ0ZHX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5zaXplID0gRlBHQV9NQUlOX1JFR19TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5iYXNlID0gRlBHQV9NQUlOX1JFR19CQVNFOwoKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucG9ydC5zaXplID0gRlBHQV9NQUlOX1BPUlRfU0laRTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LmJhc2UgPSBGUEdBX01BSU5fUE9SVF9CQVNFOwoKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLnByb2dfcGluLnBvcnQgPSBGUEdBX01BSU5fUFJPR19QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4ucGluID0gRlBHQV9NQUlOX1BST0dfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4uZmxhZyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5pbml0X3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0lOSVRfUE9SVDsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLnBpbiA9IEZQR0FfTUFJTl9JTklUX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLmZsYWcgPSAxOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZG9uZV9waW4ucG9ydCA9IEZQR0FfTUFJTl9ET05FX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5waW4gPSBGUEdBX01BSU5fRE9ORV9QSU47CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5mbGFnID0gMTsKI2lmZGVmIEZQR0FfTUFJTl9FTkFCTEVfUE9SVAoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0VOQUJMRV9QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5waW4gPSBGUEdBX01BSU5fRU5BQkxFX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmVuYWJsZV9waW4uZmxhZyA9IDE7CiNlbmRpZgoKCQljcC0+bWFpbi54bHhbMF0uaXJxID0gRlBHQV9NQUlOX0lSUTsKCX0KCgkvKiBzZXQgdXAgbWV6emFuaW5lIGJvYXJkIGNvbmZpZyBpbmZvICovCgoJcmMgPSBoeW1vZF9lZXByb21fcmVhZCAoMSwgJmNwLT5tZXp6LmVlcHJvbSk7CgoJcHV0cyAoIkVFUFJPTTptZXp6Li4uIik7CglpZiAocmMgPCAwKQoJCXB1dHMgKCJOT1QgUFJFU0VOVFxuIik7CgllbHNlIGlmIChyYyA9PSAwKQoJCXB1dHMgKCJJTlZBTElEXG4iKTsKCWVsc2UgewoJCWNwLT5tYWluLmVlcHJvbS52YWxpZCA9IDE7CgoJCXByaW50ZiAoIk9LICh2ZXIgJXUpXG4iLCBjcC0+bWV6ei5lZXByb20udmVyKTsKCQloeW1vZF9lZXByb21fcHJpbnQgKCZjcC0+bWV6ei5lZXByb20pOwoJfQoKCWNwLT5jcmMgPSBjcmMzMiAoMCwgKHVuc2lnbmVkIGNoYXIgKiljcCwgb2Zmc2V0b2YgKGh5bW9kX2NvbmZfdCwgY3JjKSk7CgoJaHltb2RfY2hlY2tfZW52ICgpOwoKCXJldHVybiAoMCk7Cn0KCiNpZmRlZiBDT05GSUdfU0hPV19BQ1RJVklUWQp2b2lkIGJvYXJkX3Nob3dfYWN0aXZpdHkgKHVsb25nIHRpbWViYXNlKQp7CiNpZmRlZiBDRkdfSFlNT0RfREJMRURTCgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBpb3A4MjYwX3QgKmlvcCA9ICZpbW1yLT5pbV9pb3BvcnQ7CglzdGF0aWMgaW50IHNoaWZ0ID0gMDsKCglpZiAoKHRpbWVzdGFtcCAlIENGR19IWikgPT0gMCkgewoJCWlmICgrK3NoaWZ0ID4gMykKCQkJc2hpZnQgPSAwOwoJCWlvcC0+aW9wX3BkYXRkID0KCQkJCShpb3AtPmlvcF9wZGF0ZCAmIH4weDBmMDAwMDAwKSB8ICgxIDw8ICgyNCArIHNoaWZ0KSk7Cgl9CiNlbmRpZiAvKiBDRkdfSFlNT0RfREJMRURTICovCn0KCnZvaWQgc2hvd19hY3Rpdml0eShpbnQgYXJnKQp7Cn0KI2VuZGlmIC8qIENPTkZJR19TSE9XX0FDVElWSVRZICovCg==