LyoKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIEhhY2tlZCBmb3IgdGhlIEh5bW9kIGJvYXJkIGJ5IE11cnJheS5KZW5zZW5AY3Npcm8uYXUsIDIwLU9jdC0wMAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzgyNjAuaD4KI2luY2x1ZGUgPG1wYzgyNjBfaXJxLmg+CiNpbmNsdWRlIDxpb3BvcnRzLmg+CiNpbmNsdWRlIDxpMmMuaD4KI2luY2x1ZGUgPGFzbS9pb3Bpbl84MjYwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIGltcG9ydHMgZnJvbSBlZXByb20uYyAqLwpleHRlcm4gaW50IGh5bW9kX2VlcHJvbV9yZWFkIChpbnQsIGh5bW9kX2VlcHJvbV90ICopOwpleHRlcm4gdm9pZCBoeW1vZF9lZXByb21fcHJpbnQgKGh5bW9kX2VlcHJvbV90ICopOwoKLyogaW1wb3J0cyBmcm9tIGVudi5jICovCmV4dGVybiB2b2lkIGh5bW9kX2NoZWNrX2VudiAodm9pZCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBJL08gUG9ydCBjb25maWd1cmF0aW9uIHRhYmxlCiAqCiAqIGlmIGNvbmYgaXMgMSwgdGhlbiB0aGF0IHBvcnQgcGluIHdpbGwgYmUgY29uZmlndXJlZCBhdCBib290IHRpbWUKICogYWNjb3JkaW5nIHRvIHRoZSBmaXZlIHZhbHVlcyBwb2RyL3BkaXIvcHBhci9wc29yL3BkYXQgZm9yIHRoYXQgZW50cnkKICovCgpjb25zdCBpb3BfY29uZl90IGlvcF9jb25mX3RhYls0XVszMl0gPSB7CgoJLyogUG9ydCBBIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQTMxOiBGQ0MxIE1JSSBDT0wgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEEzMDogRkNDMSBNSUkgQ1JTICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjk6IEZDQzEgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjg6IEZDQzEgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjc6IEZDQzEgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjY6IEZDQzEgTUlJIFJYX0VSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjU6IEZDQzIgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyNDogRkNDMiBNSUkgTURDICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjM6IEZDQzMgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyMjogRkNDMyBNSUkgTURDICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjE6IEZDQzEgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTIwOiBGQ0MxIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExOTogRkNDMSBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTg6IEZDQzEgTUlJIFR4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE3OiBGQ0MxIE1JSSBSeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEExNjogRkNDMSBNSUkgUnhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTU6IEZDQzEgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE0OiBGQ0MxIE1JSSBSeERbMF0gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMzogRkNDMSBNSUkgTURJTyAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTEyOiBGQ0MxIE1JSSBNREMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMTogU0VMX0NEICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTA6IEZMQVNIIFNUUzEgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwOTogRkxBU0ggU1RTMCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTA4OiBGTEFTSCB+UEUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwNzogV0FUQ0ggfkhSRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMSwgIDAgICB9LAkvKiBQQTA2OiBWQyBET05FICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCAgIH0sCS8qIFBBMDU6IFZDIElOSVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwNDogVkMgflBST0cgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwMzogVk0gRU5BQkxFICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAxLCAgMCAgIH0sCS8qIFBBMDI6IFZNIERPTkUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDEsICAwICAgfSwJLyogUEEwMTogVk0gSU5JVCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9CS8qIFBBMDA6IFZNIH5QUk9HICovCgl9LAoKCS8qIFBvcnQgQiBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIzMTogRkNDMiBNSUkgVFhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIzMDogRkNDMiBNSUkgUlhfRFYgKi8KCQl7ICAgMSwgIDEsICAxLCAgMSwgIDAsICAwICAgfSwJLyogUEIyOTogRkNDMiBNSUkgVFhfRU4gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyODogRkNDMiBNSUkgUlhfRVIgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyNzogRkNDMiBNSUkgQ09MICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjY6IEZDQzIgTUlJIENSUyAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjI1OiBGQ0MyIE1JSSBUeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIyNDogRkNDMiBNSUkgVHhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjM6IEZDQzIgTUlJIFR4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjIyOiBGQ0MyIE1JSSBUeERbMF0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIyMTogRkNDMiBNSUkgUnhEWzBdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjA6IEZDQzIgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjE5OiBGQ0MyIE1JSSBSeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxODogRkNDMiBNSUkgUnhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTc6IEZDQzMgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTY6IEZDQzMgTUlJIFJYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMTU6IEZDQzMgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMTQ6IEZDQzMgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTM6IEZDQzMgTUlJIENPTCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjEyOiBGQ0MzIE1JSSBDUlMgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxMTogRkNDMyBNSUkgUnhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTA6IEZDQzMgTUlJIFJ4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjA5OiBGQ0MzIE1JSSBSeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwODogRkNDMyBNSUkgUnhEWzBdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDc6IEZDQzMgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjA2OiBGQ0MzIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIwNTogRkNDMyBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDQ6IEZDQzMgTUlJIFR4RFswXSAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAzOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAyOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjAxOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9CS8qIFBCMDA6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgl9LAoKCS8qIFBvcnQgQyBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMzMTogTUVaIH5JQUNLICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMzA6ID8gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyOTogQ0xLIFNDQ3ggKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyODogQ0xLNCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI3OiBDTEsgU0NDRiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI2OiBDTEsgMzJLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjU6IEJSRzQvQ0xLNyAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI0OiA/ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjM6IENMSyBTQ0N4ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjI6IEZDQzEgTUlJIFJYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzIxOiBGQ0MxIE1JSSBUWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyMDogQ0xLIFNDQ0YgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxOTogRkNDMiBNSUkgUlhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTg6IEZDQzIgTUlJIFRYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE3OiBGQ0MzIE1JSSBSWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxNjogRkNDMyBNSUkgVFhfQ0xLICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTU6IFNDQzEgVUFSVCB+Q1RTICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTQ6IFNDQzEgVUFSVCB+Q0QgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxMzogU0NDMiBVQVJUIH5DVFMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxMjogU0NDMiBVQVJUIH5DRCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzExOiBTQ0MxIFVBUlQgfkRUUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzEwOiBTQ0MxIFVBUlQgfkRTUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzA5OiBTQ0MyIFVBUlQgfkRUUiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQzA4OiBTQ0MyIFVBUlQgfkRTUiAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA3OiBURU1QIH5BTEVSVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA2OiBGQ0MzIElOVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA1OiBGQ0MyIElOVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzA0OiBGQ0MxIElOVCAqLwoJCXsgICAwLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQQzAzOiBTRE1BIElETUEyIH5EQUNLICovCgkJeyAgIDAsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDI6IFNETUEgSURNQTIgfkRPTkUgKi8KCQl7ICAgMCwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwMTogU0RNQSBJRE1BMiB+RFJFUSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9CS8qIFBDMDA6IEJSRzcgKi8KCX0sCgoJLyogUG9ydCBEIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDMxOiBTQ0MxIFVBUlQgUnhEICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMzA6IFNDQzEgVUFSVCBUeEQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEQyOTogU0NDMSBVQVJUIH5SVFMgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyODogU0NDMiBVQVJUIFJ4RCAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDI3OiBTQ0MyIFVBUlQgVHhEICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMjY6IFNDQzIgVUFSVCB+UlRTICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjU6IFNDQzEgVUFSVCB+UkkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyNDogU0NDMiBVQVJUIH5SSSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDIzOiBDTEtHRU4gUEQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMjogVVNFUjMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMTogVVNFUjIgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQyMDogVVNFUjEgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxOTogU1BJIH5TRUwgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxODogU1BJIENMSyAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE3OiBTUEkgTU9TSSAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQRDE2OiBTUEkgTUlTTyAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMSwgIDAgICB9LAkvKiBQRDE1OiBJMkMgU0RBICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCAgIH0sCS8qIFBEMTQ6IEkyQyBTQ0wgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMzogVEVNUCB+U1REQlkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMjogRkNDMyB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMTogRkNDMiB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQxMDogRkNDMSB+UkVTRVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwOTogUEQ5ICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDg6IFBEOCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA3OiBQRDcgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQwNjogUEQ2ICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMDU6IFBENSAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA0OiBQRDQgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMzogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMjogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQwMTogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfQkvKiBQRDAwOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogQU1JIEZTNjM3NyBDbG9jayBHZW5lcmF0b3IgY29uZmlndXJhdGlvbiB0YWJsZQogKgogKiB0aGUgImZzNjM3N19yZWdzW10iIHRhYmxlIGVudHJpZXMgY29ycmVzcG9uZCB0byBGUzYzNzcgcmVnaXN0ZXJzCiAqIDAgLSAxNSAodG90YWwgb2YgMTYgYnl0ZXMpLgogKgogKiB0aGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBGUzYzNzcgdmlhIHRoZSBpMmMgYnVzIHVzaW5nIGFkZHJlc3MgaW4KICogImZzNjM3N19hZGRyIiAoYWRkcmVzcyBpcyA3IGJpdHMgLSBSL1cgYml0IG5vdCBpbmNsdWRlZCkuCiAqCiAqIFRoZSBmczYzNzcgaGFzIGZvdXIgY2xvY2sgb3V0cHV0czogQSwgQiwgQyBhbmQgRC4KICoKICogT3V0cHV0cyBDIGFuZCBEIGNhbiBlYWNoIHByb3ZpZGUgdHdvIGRpZmZlcmVudCBjbG9jayBvdXRwdXRzIEMxL0QxIG9yCiAqIEMyL0QyIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIFNFTF9DRCBpbnB1dCB3aGljaCBpcyBjb25uZWN0ZWQgdG8KICogdGhlIE1QQzgyNjAgSS9PIHBvcnQgcGluIFBBMTEuIFBBMTEgb3V0cHV0IChTRUxfQ0QgaW5wdXQpIGxvdyAob3IgMCkKICogc2VsZWN0cyBDMS9EMSBhbmQgUEExMSBvdXRwdXQgKFNFTF9DRCBpbnB1dCkgaGlnaCAob3IgMSkgc2VsZWN0cyBDMi9EMi4KICoKICogUEExMSBkZWZhdWx0cyB0byBvdXRwdXQgbG93IChvciAwKSBpbiB0aGUgaS9vIHBvcnQgY29uZmlnIHRhYmxlIGFib3ZlLgogKgogKiBPdXRwdXQgQSBwcm92aWRlcyBhIDEwME1IeiBmb3IgdGhlIEhpZ2ggU3BlZWQgU2VyaWFsIGNoaXBzLiBPdXRwdXQgQgogKiBwcm92aWRlcyBhIDMuNjg2NE1IeiBjbG9jayBmb3IgbW9yZSBhY2N1cmF0ZSBhc3luY2hyb25vdXMgc2VyaWFsIGJpdAogKiByYXRlcy4gT3V0cHV0IEMgaXMgcm91dGVkIHRvIHRoZSBtZXp6YW5pbmUgY29ubmVjdG9yIGJ1dCBpcyBjdXJyZW50bHkKICogdW51c2VkIC0gYm90aCBDMSBhbmQgQzIgYXJlIHNldCB0byAxNk1Iei4gT3V0cHV0IEQgaXMgdXNlZCBieSBib3RoIHRoZQogKiBhbHQtaW5wdXQgYW5kIGRpc3BsYXkgbWV6emFuaW5lIGJvYXJkcyBmb3IgdGhlaXIgdmlkZW8gY2hpcHMuIFRoZQogKiBhbHQtaW5wdXQgYm9hcmQgcmVxdWlyZXMgYSBjbG9jayBvZiAyNC41NzZNSHogYW5kIHRoaXMgaXMgYXZhaWxhYmxlIG9uCiAqIEQxIChQQTExPVNFTF9DRD0wKS4gVGhlIGRpc3BsYXkgYm9hcmQgcmVxdWlyZXMgYSBjbG9jayBvZiAyN01IeiBhbmQgdGhpcwogKiBpcyBhdmFpbGFibGUgb24gRDIgKFBBMTE9U0VMX0NEPTEpLgogKgogKiBTbyB0aGUgZGVmYXVsdCBpcyBhIGNsb2NrIHN1aXRhYmxlIGZvciB0aGUgYWx0LWlucHV0IGJvYXJkLiBQQTExIGlzIHRvZ2dsZWQKICogbGF0ZXIgaW4gbWlzY19pbml0X3IoKSwgaWYgYSBkaXNwbGF5IGJvYXJkIGlzIGRldGVjdGVkLgogKi8KCnVjaGFyIGZzNjM3N19hZGRyID0gMHg1YzsKCnVjaGFyIGZzNjM3N19yZWdzWzE2XSA9IHsKCSAxMiwgIDc1LCAgNjQsICAyNSwgMTQ0LCAxMjgsICAyNSwgMTkyLAoJICAwLCAgMTYsIDEzNSwgMTkyLCAyMjQsICA2NCwgIDY0LCAxOTIKfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIHNwZWNpYWwgYm9hcmQgaW5pdGlhbGlzYXRpb24sIGFmdGVyIGNsb2NrcyBhbmQgdGltZWJhc2UgaGF2ZSBiZWVuCiAqIHNldCB1cCBidXQgYmVmb3JlIGVudmlyb25tZW50IGFuZCBzZXJpYWwgYXJlIGluaXRpYWxpc2VkLgogKgogKiBhZGRlZCBzbyB0aGF0IHZlcnkgZWFybHkgaW5pdGlhbGlzYXRpb25zIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBpMmMKICogZHJpdmVyICh3aGljaCByZXF1aXJlcyB0aGUgY2xvY2tzLCB0byBjYWxjdWxhdGUgdGhlIGRpdmlkZXJzLCBhbmQKICogdGhlIHRpbWViYXNlLCBmb3IgdWRlbGF5KCkpCiAqLwoKaW50CmJvYXJkX3Bvc3RjbGtfaW5pdCAodm9pZCkKewoJaTJjX2luaXQgKENPTkZJR19TWVNfSTJDX1NQRUVELCBDT05GSUdfU1lTX0kyQ19TTEFWRSk7CgoJLyoKCSAqIEluaXRpYWxpc2UgdGhlIEZTNjM3NyBjbG9jayBjaGlwCgkgKgoJICogdGhlIHNlY29uZGFyeSBhZGRyZXNzIGlzIHRoZSByZWdpc3RlciBudW1iZXIgZnJvbSB3aGVyZSB0bwoJICogc3RhcnQgdGhlIHdyaXRlIC0gSSB3YW50IHRvIHdyaXRlIGFsbCB0aGUgcmVnaXN0ZXJzCgkgKgoJICogZG9uJ3QgYm90aGVyIGNoZWNraW5nIHJldHVybiBzdGF0dXMgLSB3ZSBoYXZlIG5vIGNvbnNvbGUgeWV0CgkgKiB0byBwcmludCBpdCBvbiwgbm9yIGFueSBSQU0gdG8gc3RvcmUgaXQgaW4gLSBpdCB3aWxsIGJlIG9idmlvdXMKCSAqIGlmIHRoaXMgZG9lc24ndCB3b3JrCgkgKi8KCSh2b2lkKSBpMmNfd3JpdGUgKGZzNjM3N19hZGRyLCAwLCAxLCBmczYzNzdfcmVncywKCQkJCQlzaXplb2YgKGZzNjM3N19yZWdzKSk7CgoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6IEhhcmR3aXJlZCB0byBIWU1PRAogKi8KCmludApjaGVja2JvYXJkICh2b2lkKQp7CglwdXRzICgiQm9hcmQ6IEhZTU9EXG4iKTsKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIG1pc2NlbGxhbmVvdXMgKGVhcmx5IC0gd2hpbGUgcnVubmluZyBpbiBmbGFzaCkgaW5pdGlhbGlzYXRpb25zLgogKi8KCiNkZWZpbmUgX05PVF9VU0VEXwkweEZGRkZGRkZGCgp1aW50IHVwbWJfdGFibGVbXSA9IHsKCS8qIFJlYWQgU2luZ2xlIEJlYXQgKFJTUykgLSBvZmZzZXQgMHgwMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWFkIEJ1cnN0IChSQlMpIC0gb2Zmc2V0IDB4MDggKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBTaW5nbGUgQmVhdCAoV1NTKSAtIG9mZnNldCAweDE4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIEJ1cnN0IChXU1MpIC0gb2Zmc2V0IDB4MjAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWZyZXNoIFRpbWVyIChQVFMpIC0gb2Zmc2V0IDB4MzAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIEV4Y2VwdGlvbiBDb25kaXRpb24gKEVYUykgLSBvZmZzZXQgMHgzYyAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXwp9OwoKdWludCB1cG1jX3RhYmxlW10gPSB7CgkvKiBSZWFkIFNpbmdsZSBCZWF0IChSU1MpIC0gb2Zmc2V0IDB4MDAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVhZCBCdXJzdCAoUkJTKSAtIG9mZnNldCAweDA4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgU2luZ2xlIEJlYXQgKFdTUykgLSBvZmZzZXQgMHgxOCAqLwoJMHhGMEUwMDAwMCwgMHhGMEEwMDAwMCwgMHgwMEEwMDAwMCwgMHgzMEEwMDAwMCwKCTB4RjBGNDAwMDcsIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBCdXJzdCAoV1NTKSAtIG9mZnNldCAweDIwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVmcmVzaCBUaW1lciAoUFRTKSAtIG9mZnNldCAweDMwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBFeGNlcHRpb24gQ29uZGl0aW9uIChFWFMpIC0gb2Zmc2V0IDB4M2MgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8KfTsKCmludAptaXNjX2luaXRfZiAodm9pZCkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOwoKCXByaW50ZiAoIlVQTXM6ICAiKTsKCgl1cG1jb25maWcgKFVQTUIsIHVwbWJfdGFibGUsIHNpemVvZiB1cG1iX3RhYmxlIC8gc2l6ZW9mIHVwbWJfdGFibGVbMF0pOwoJbWVtY3RsLT5tZW1jX21ibXIgPSBDT05GSUdfU1lTX01CTVI7CgoJdXBtY29uZmlnIChVUE1DLCB1cG1jX3RhYmxlLCBzaXplb2YgdXBtY190YWJsZSAvIHNpemVvZiB1cG1jX3RhYmxlWzBdKTsKCW1lbWN0bC0+bWVtY19tY21yID0gQ09ORklHX1NZU19NQ01SOwoKCXByaW50ZiAoImNvbmZpZ3VyZWRcbiIpOwoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKcGh5c19zaXplX3QKaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKCXZvbGF0aWxlIG1lbWN0bDgyNjBfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7Cgl2b2xhdGlsZSB1Y2hhciBjID0gMCwgKnJhbWFkZHIgPSAodWNoYXIgKikgKENPTkZJR19TWVNfU0RSQU1fQkFTRSArIDB4OCk7Cgl1bG9uZyBwc2RtciA9IENPTkZJR19TWVNfUFNETVI7CglpbnQgaTsKCgkvKgoJICogUXVvdGUgZnJvbSA4MjYwIFVNICgxMC40LjIgU0RSQU0gUG93ZXItT24gSW5pdGlhbGl6YXRpb24sIDEwLTM1KToKCSAqCgkgKiAiQXQgc3lzdGVtIHJlc2V0LCBpbml0aWFsaXphdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCB1cCB0aGUKCSAqICBwcm9ncmFtbWFibGUgcGFyYW1ldGVycyBpbiB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgYmFua3MgcmVnaXN0ZXJzCgkgKiAgKE9SeCwgQlJ4LCBQL0xTRE1SKS4gQWZ0ZXIgYWxsIG1lbW9yeSBwYXJhbWV0ZXJzIGFyZSBjb27eZ3VyZWQsCgkgKiAgc3lzdGVtIHNvZnR3YXJlIHNob3VsZCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKCSAqICBmb3IgZWFjaCBTRFJBTSBkZXZpY2UuCgkgKgoJICogIDEuIElzc3VlIGEgUFJFQ0hBUkdFLUFMTC1CQU5LUyBjb21tYW5kCgkgKiAgMi4gSXNzdWUgZWlnaHQgQ0JSIFJFRlJFU0ggY29tbWFuZHMKCSAqICAzLiBJc3N1ZSBhIE1PREUtU0VUIGNvbW1hbmQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZSByZWdpc3RlcgoJICoKCSAqICBUaGUgaW5pdGlhbCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgYnkgc2V0dGluZyBQL0xTRE1SW09QXSBhbmQKCSAqICBhY2Nlc3NpbmcgdGhlIFNEUkFNIHdpdGggYSBzaW5nbGUtYnl0ZSB0cmFuc2FjdGlvbi4iCgkgKgoJICogVGhlIGFwcHJvcHJpYXRlIEJSeC9PUnggcmVnaXN0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aGVuIHdlCgkgKiBnZXQgaGVyZS4gVGhlIFNEUkFNIGNhbiBiZSBhY2Nlc3NlZCBhdCB0aGUgYWRkcmVzcyBDT05GSUdfU1lTX1NEUkFNX0JBU0UuCgkgKi8KCgltZW1jdGwtPm1lbWNfcHNydCA9IENPTkZJR19TWVNfUFNSVDsKCW1lbWN0bC0+bWVtY19tcHRwciA9IENPTkZJR19TWVNfTVBUUFI7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9QUkVBOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfQ0JSUjsKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCgkJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTVJXOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTk9STSB8IFBTRE1SX1JGRU47CgkqcmFtYWRkciA9IGM7CgoJcmV0dXJuIChDT05GSUdfU1lTX1NEUkFNX1NJWkUgPDwgMjApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGlzYXRpb25zIGFmdGVyIHJlbG9jYXRpb24gaW50byByYW0gKG1pc2NfaW5pdF9yKSAgICAgKi8KLyoJCQkJCQkJCQkgICAgICovCi8qIGxvYWRzIHRoZSBkYXRhIGluIHRoZSBtYWluIGJvYXJkIGFuZCBtZXp6YW5pbmUgYm9hcmQgZWVwcm9tcyBpbnRvCSAgICAgKi8KLyogdGhlIGh5bW9kIGNvbmZpZ3VyYXRpb24gc3RydWN0IHN0b3JlZCBpbiB0aGUgYm9hcmQgaW5mb3JtYXRpb24gYXJlYS4JICAgICAqLwovKgkJCQkJCQkJCSAgICAgKi8KLyogaWYgdGhlIGNvbnRlbnRzIG9mIGVpdGhlciBlZXByb20gaXMgaW52YWxpZCwgcHJvbXB0cyBmb3IgYSBzZXJpYWwJICAgICAqLwovKiBudW1iZXIgKGFuZCBhbiBldGhlcm5ldCBhZGRyZXNzIGlmIHJlcXVpcmVkKSB0aGVuIGZldGNoZXMgYSBmaWxlCSAgICAgKi8KLyogY29udGFpbmluZyBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIGVlcHJvbSBmcm9tIHRoZSB0ZnRwIHNlcnZlciAgICAqLwovKiAodGhlIGZpbGUgbmFtZSBpcyBiYXNlZCBvbiB0aGUgc2VyaWFsIG51bWJlciBhbmQgYSBidWlsdC1pbiBwYXRoKQkgICAgICovCgppbnQKbGFzdF9zdGFnZV9pbml0ICh2b2lkKQp7CgloeW1vZF9jb25mX3QgKmNwID0gJmdkLT5iZC0+YmlfaHltb2RfY29uZjsKCWludCByYzsKCiNpZmRlZiBDT05GSUdfQk9PVF9SRVRSWV9USU1FCgkvKgoJICogd2UgdXNlIHRoZSByZWFkbGluZSAoKSBmdW5jdGlvbiwgYnV0IHdlIGFsc28gd2FudAoJICogY29tbWFuZCB0aW1lb3V0IGVuYWJsZWQKCSAqLwoJaW5pdF9jbWRfdGltZW91dCAoKTsKI2VuZGlmCgoJbWVtc2V0ICgodm9pZCAqKSBjcCwgMCwgc2l6ZW9mICgqY3ApKTsKCgkvKiBzZXQgdXAgbWFpbiBib2FyZCBjb25maWcgaW5mbyAqLwoKCXJjID0gaHltb2RfZWVwcm9tX3JlYWQgKDAsICZjcC0+bWFpbi5lZXByb20pOwoKCXB1dHMgKCJFRVBST006bWFpbi4uLiIpOwoJaWYgKHJjIDwgMCkKCQlwdXRzICgiTk9UIFBSRVNFTlRcbiIpOwoJZWxzZSBpZiAocmMgPT0gMCkKCQlwdXRzICgiSU5WQUxJRFxuIik7CgllbHNlIHsKCQljcC0+bWFpbi5lZXByb20udmFsaWQgPSAxOwoKCQlwcmludGYgKCJPSyAodmVyICV1KVxuIiwgY3AtPm1haW4uZWVwcm9tLnZlcik7CgkJaHltb2RfZWVwcm9tX3ByaW50ICgmY3AtPm1haW4uZWVwcm9tKTsKCgkJLyoKCQkgKiBoYXJkLXdpcmVkIGFzc3VtcHRpb24gaGVyZTogYWxsIGh5bW9kIG1haW4gYm9hcmRzIHdpbGwgaGF2ZQoJCSAqIG9uZSB4aWxpbnggZnBnYSwgd2l0aCB0aGUgaW50ZXJydXB0IGxpbmUgY29ubmVjdGVkIHRvIElSUTIKCQkgKgoJCSAqIE9uZSBkYXksIHRoaXMgbWlnaHQgYmUgYmFzZWQgb24gdGhlIGJvYXJkIHR5cGUKCQkgKi8KCgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucHJvZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnByb2cuc2l6ZSA9IEZQR0FfTUFJTl9DRkdfU0laRTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wcm9nLmJhc2UgPSBGUEdBX01BSU5fQ0ZHX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5zaXplID0gRlBHQV9NQUlOX1JFR19TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnJlZy5iYXNlID0gRlBHQV9NQUlOX1JFR19CQVNFOwoKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucG9ydC5zaXplID0gRlBHQV9NQUlOX1BPUlRfU0laRTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LmJhc2UgPSBGUEdBX01BSU5fUE9SVF9CQVNFOwoKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLnByb2dfcGluLnBvcnQgPSBGUEdBX01BSU5fUFJPR19QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4ucGluID0gRlBHQV9NQUlOX1BST0dfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4uZmxhZyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5pbml0X3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0lOSVRfUE9SVDsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLnBpbiA9IEZQR0FfTUFJTl9JTklUX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLmZsYWcgPSAxOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZG9uZV9waW4ucG9ydCA9IEZQR0FfTUFJTl9ET05FX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5waW4gPSBGUEdBX01BSU5fRE9ORV9QSU47CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5mbGFnID0gMTsKI2lmZGVmIEZQR0FfTUFJTl9FTkFCTEVfUE9SVAoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0VOQUJMRV9QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5waW4gPSBGUEdBX01BSU5fRU5BQkxFX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmVuYWJsZV9waW4uZmxhZyA9IDE7CiNlbmRpZgoKCQljcC0+bWFpbi54bHhbMF0uaXJxID0gRlBHQV9NQUlOX0lSUTsKCX0KCgkvKiBzZXQgdXAgbWV6emFuaW5lIGJvYXJkIGNvbmZpZyBpbmZvICovCgoJcmMgPSBoeW1vZF9lZXByb21fcmVhZCAoMSwgJmNwLT5tZXp6LmVlcHJvbSk7CgoJcHV0cyAoIkVFUFJPTTptZXp6Li4uIik7CglpZiAocmMgPCAwKQoJCXB1dHMgKCJOT1QgUFJFU0VOVFxuIik7CgllbHNlIGlmIChyYyA9PSAwKQoJCXB1dHMgKCJJTlZBTElEXG4iKTsKCWVsc2UgewoJCWNwLT5tYWluLmVlcHJvbS52YWxpZCA9IDE7CgoJCXByaW50ZiAoIk9LICh2ZXIgJXUpXG4iLCBjcC0+bWV6ei5lZXByb20udmVyKTsKCQloeW1vZF9lZXByb21fcHJpbnQgKCZjcC0+bWV6ei5lZXByb20pOwoJfQoKCWNwLT5jcmMgPSBjcmMzMiAoMCwgKHVuc2lnbmVkIGNoYXIgKiljcCwgb2Zmc2V0b2YgKGh5bW9kX2NvbmZfdCwgY3JjKSk7CgoJaHltb2RfY2hlY2tfZW52ICgpOwoKCXJldHVybiAoMCk7Cn0KCiNpZmRlZiBDT05GSUdfU0hPV19BQ1RJVklUWQp2b2lkIGJvYXJkX3Nob3dfYWN0aXZpdHkgKHVsb25nIHRpbWViYXNlKQp7CiNpZmRlZiBDT05GSUdfU1lTX0hZTU9EX0RCTEVEUwoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKCXZvbGF0aWxlIGlvcDgyNjBfdCAqaW9wID0gJmltbXItPmltX2lvcG9ydDsKCXN0YXRpYyBpbnQgc2hpZnQgPSAwOwoKCWlmICgodGltZXN0YW1wICUgQ09ORklHX1NZU19IWikgPT0gMCkgewoJCWlmICgrK3NoaWZ0ID4gMykKCQkJc2hpZnQgPSAwOwoJCWlvcC0+aW9wX3BkYXRkID0KCQkJCShpb3AtPmlvcF9wZGF0ZCAmIH4weDBmMDAwMDAwKSB8ICgxIDw8ICgyNCArIHNoaWZ0KSk7Cgl9CiNlbmRpZiAvKiBDT05GSUdfU1lTX0hZTU9EX0RCTEVEUyAqLwp9Cgp2b2lkIHNob3dfYWN0aXZpdHkoaW50IGFyZykKewp9CiNlbmRpZiAvKiBDT05GSUdfU0hPV19BQ1RJVklUWSAqLwo=