LyoKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIEhhY2tlZCBmb3IgdGhlIEh5bW9kIGJvYXJkIGJ5IE11cnJheS5KZW5zZW5AY3Npcm8uYXUsIDIwLU9jdC0wMAogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzgyNjAuaD4KI2luY2x1ZGUgPG1wYzgyNjBfaXJxLmg+CiNpbmNsdWRlIDxpb3BvcnRzLmg+CiNpbmNsdWRlIDxpMmMuaD4KI2luY2x1ZGUgPGFzbS9pb3Bpbl84MjYwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIGltcG9ydHMgZnJvbSBlZXByb20uYyAqLwpleHRlcm4gaW50IGh5bW9kX2VlcHJvbV9yZWFkIChpbnQsIGh5bW9kX2VlcHJvbV90ICopOwpleHRlcm4gdm9pZCBoeW1vZF9lZXByb21fcHJpbnQgKGh5bW9kX2VlcHJvbV90ICopOwoKLyogaW1wb3J0cyBmcm9tIGVudi5jICovCmV4dGVybiB2b2lkIGh5bW9kX2NoZWNrX2VudiAodm9pZCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBJL08gUG9ydCBjb25maWd1cmF0aW9uIHRhYmxlCiAqCiAqIGlmIGNvbmYgaXMgMSwgdGhlbiB0aGF0IHBvcnQgcGluIHdpbGwgYmUgY29uZmlndXJlZCBhdCBib290IHRpbWUKICogYWNjb3JkaW5nIHRvIHRoZSBmaXZlIHZhbHVlcyBwb2RyL3BkaXIvcHBhci9wc29yL3BkYXQgZm9yIHRoYXQgZW50cnkKICovCgpjb25zdCBpb3BfY29uZl90IGlvcF9jb25mX3RhYls0XVszMl0gPSB7CgoJLyogUG9ydCBBIGNvbmZpZ3VyYXRpb24gKi8KCXsKCQkvKiBjbmYgcGFyIHNvciBkaXIgb2RyIGRhdCAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQTMxOiBGQ0MxIE1JSSBDT0wgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEEzMDogRkNDMSBNSUkgQ1JTICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjk6IEZDQzEgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjg6IEZDQzEgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjc6IEZDQzEgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMjY6IEZDQzEgTUlJIFJYX0VSICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjU6IEZDQzIgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyNDogRkNDMiBNSUkgTURDICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjM6IEZDQzMgTUlJIE1ESU8gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEyMjogRkNDMyBNSUkgTURDICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMjE6IEZDQzEgTUlJIFR4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTIwOiBGQ0MxIE1JSSBUeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExOTogRkNDMSBNSUkgVHhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBBMTg6IEZDQzEgTUlJIFR4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE3OiBGQ0MxIE1JSSBSeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEExNjogRkNDMSBNSUkgUnhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTU6IEZDQzEgTUlJIFJ4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTE0OiBGQ0MxIE1JSSBSeERbMF0gKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMzogRkNDMSBNSUkgTURJTyAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQTEyOiBGQ0MxIE1JSSBNREMgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEExMTogU0VMX0NEICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBBMTA6IEZMQVNIIFNUUzEgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwOTogRkxBU0ggU1RTMCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQTA4OiBGTEFTSCB+UEUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEEwNzogV0FUQ0ggfkhSRVNFVCAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMSwgIDAgICB9LAkvKiBQQTA2OiBWQyBET05FICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCAgIH0sCS8qIFBBMDU6IFZDIElOSVQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwNDogVkMgflBST0cgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEEwMzogVk0gRU5BQkxFICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAxLCAgMCAgIH0sCS8qIFBBMDI6IFZNIERPTkUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDEsICAwICAgfSwJLyogUEEwMTogVk0gSU5JVCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9IAkvKiBQQTAwOiBWTSB+UFJPRyAqLwoJfSwKCgkvKiBQb3J0IEIgY29uZmlndXJhdGlvbiAqLwoJewoJCS8qIGNuZiBwYXIgc29yIGRpciBvZHIgZGF0ICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMzE6IEZDQzIgTUlJIFRYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMzA6IEZDQzIgTUlJIFJYX0RWICovCgkJeyAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjk6IEZDQzIgTUlJIFRYX0VOICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjg6IEZDQzIgTUlJIFJYX0VSICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjc6IEZDQzIgTUlJIENPTCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjI2OiBGQ0MyIE1JSSBDUlMgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIyNTogRkNDMiBNSUkgVHhEWzNdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMjQ6IEZDQzIgTUlJIFR4RFsyXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjIzOiBGQ0MyIE1JSSBUeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIyMjogRkNDMiBNSUkgVHhEWzBdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMjE6IEZDQzIgTUlJIFJ4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjIwOiBGQ0MyIE1JSSBSeERbMV0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxOTogRkNDMiBNSUkgUnhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTg6IEZDQzIgTUlJIFJ4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjE3OiBGQ0MzIE1JSSBSWF9EViAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjE2OiBGQ0MzIE1JSSBSWF9FUiAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjE1OiBGQ0MzIE1JSSBUWF9FUiAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjE0OiBGQ0MzIE1JSSBUWF9FTiAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjEzOiBGQ0MzIE1JSSBDT0wgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIxMjogRkNDMyBNSUkgQ1JTICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMTE6IEZDQzMgTUlJIFJ4RFszXSAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQjEwOiBGQ0MzIE1JSSBSeERbMl0gKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwOTogRkNDMyBNSUkgUnhEWzFdICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBCMDg6IEZDQzMgTUlJIFJ4RFswXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjA3OiBGQ0MzIE1JSSBUeERbM10gKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEIwNjogRkNDMyBNSUkgVHhEWzJdICovCgkJeyAgIDEsICAxLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBCMDU6IEZDQzMgTUlJIFR4RFsxXSAqLwoJCXsgICAxLCAgMSwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQQjA0OiBGQ0MzIE1JSSBUeERbMF0gKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwMzogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwMjogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEIwMTogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfQkvKiBQQjAwOiBwaW4gZG9lc24ndCBleGlzdCAqLwoJfSwKCgkvKiBQb3J0IEMgY29uZmlndXJhdGlvbiAqLwoJewoJCS8qIGNuZiBwYXIgc29yIGRpciBvZHIgZGF0ICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMzE6IE1FWiB+SUFDSyAqLwoJCXsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzMwOiA/ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjk6IENMSyBTQ0N4ICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjg6IENMSzQgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyNzogQ0xLIFNDQ0YgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyNjogQ0xLIDMySyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzI1OiBCUkc0L0NMSzcgKi8KCQl7ICAgMCwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyNDogPyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzIzOiBDTEsgU0NDeCAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzIyOiBGQ0MxIE1JSSBSWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMyMTogRkNDMSBNSUkgVFhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMjA6IENMSyBTQ0NGICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTk6IEZDQzIgTUlJIFJYX0NMSyAqLwoJCXsgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE4OiBGQ0MyIE1JSSBUWF9DTEsgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMxNzogRkNDMyBNSUkgUlhfQ0xLICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTY6IEZDQzMgTUlJIFRYX0NMSyAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE1OiBTQ0MxIFVBUlQgfkNUUyAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQQzE0OiBTQ0MxIFVBUlQgfkNEICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTM6IFNDQzIgVUFSVCB+Q1RTICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMTI6IFNDQzIgVUFSVCB+Q0QgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEMxMTogU0NDMSBVQVJUIH5EVFIgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEMxMDogU0NDMSBVQVJUIH5EU1IgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEMwOTogU0NDMiBVQVJUIH5EVFIgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEMwODogU0NDMiBVQVJUIH5EU1IgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwNzogVEVNUCB+QUxFUlQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwNjogRkNDMyBJTlQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwNTogRkNDMiBJTlQgKi8KCQl7ICAgMSwgIDAsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEMwNDogRkNDMSBJTlQgKi8KCQl7ICAgMCwgIDEsICAxLCAgMSwgIDAsICAwICAgfSwJLyogUEMwMzogU0RNQSBJRE1BMiB+REFDSyAqLwoJCXsgICAwLCAgMSwgIDEsICAwLCAgMCwgIDAgICB9LAkvKiBQQzAyOiBTRE1BIElETUEyIH5ET05FICovCgkJeyAgIDAsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBDMDE6IFNETUEgSURNQTIgfkRSRVEgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfQkvKiBQQzAwOiBCUkc3ICovCgl9LAoKCS8qIFBvcnQgRCBjb25maWd1cmF0aW9uICovCgl7CgkJLyogY25mIHBhciBzb3IgZGlyIG9kciBkYXQgKi8KCQl7ICAgMSwgIDEsICAwLCAgMCwgIDAsICAwICAgfSwJLyogUEQzMTogU0NDMSBVQVJUIFJ4RCAqLwoJCXsgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAgICB9LAkvKiBQRDMwOiBTQ0MxIFVBUlQgVHhEICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMCAgIH0sCS8qIFBEMjk6IFNDQzEgVUFSVCB+UlRTICovCgkJeyAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjg6IFNDQzIgVUFSVCBSeEQgKi8KCQl7ICAgMSwgIDEsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEQyNzogU0NDMiBVQVJUIFR4RCAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDAgICB9LAkvKiBQRDI2OiBTQ0MyIFVBUlQgflJUUyAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDI1OiBTQ0MxIFVBUlQgflJJICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjQ6IFNDQzIgVUFSVCB+UkkgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAwICAgfSwJLyogUEQyMzogQ0xLR0VOIFBEICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjI6IFVTRVIzICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjE6IFVTRVIyICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMjA6IFVTRVIxICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMTk6IFNQSSB+U0VMICovCgkJeyAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMTg6IFNQSSBDTEsgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxNzogU1BJIE1PU0kgKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDAsICAwICAgfSwJLyogUEQxNjogU1BJIE1JU08gKi8KCQl7ICAgMSwgIDEsICAxLCAgMCwgIDEsICAwICAgfSwJLyogUEQxNTogSTJDIFNEQSAqLwoJCXsgICAxLCAgMSwgIDEsICAwLCAgMSwgIDAgICB9LAkvKiBQRDE0OiBJMkMgU0NMICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMTM6IFRFTVAgflNUREJZICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMTI6IEZDQzMgflJFU0VUICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMTE6IEZDQzIgflJFU0VUICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMTA6IEZDQzEgflJFU0VUICovCgkJeyAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDk6IFBEOSAqLwoJCXsgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAgICB9LAkvKiBQRDA4OiBQRDggKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQwNzogUEQ3ICovCgkJeyAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSAgIH0sCS8qIFBEMDY6IFBENiAqLwoJCXsgICAxLCAgMCwgIDAsICAxLCAgMCwgIDEgICB9LAkvKiBQRDA1OiBQRDUgKi8KCQl7ICAgMSwgIDAsICAwLCAgMSwgIDAsICAxICAgfSwJLyogUEQwNDogUEQ0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDM6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDI6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0sCS8qIFBEMDE6IHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJeyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCAgIH0JLyogUEQwMDogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCX0KfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIEFNSSBGUzYzNzcgQ2xvY2sgR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gdGFibGUKICoKICogdGhlICJmczYzNzdfcmVnc1tdIiB0YWJsZSBlbnRyaWVzIGNvcnJlc3BvbmQgdG8gRlM2Mzc3IHJlZ2lzdGVycwogKiAwIC0gMTUgKHRvdGFsIG9mIDE2IGJ5dGVzKS4KICoKICogdGhlIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgRlM2Mzc3IHZpYSB0aGUgaTJjIGJ1cyB1c2luZyBhZGRyZXNzIGluCiAqICJmczYzNzdfYWRkciIgKGFkZHJlc3MgaXMgNyBiaXRzIC0gUi9XIGJpdCBub3QgaW5jbHVkZWQpLgogKgogKiBUaGUgZnM2Mzc3IGhhcyBmb3VyIGNsb2NrIG91dHB1dHM6IEEsIEIsIEMgYW5kIEQuCiAqCiAqIE91dHB1dHMgQyBhbmQgRCBjYW4gZWFjaCBwcm92aWRlIHR3byBkaWZmZXJlbnQgY2xvY2sgb3V0cHV0cyBDMS9EMSBvcgogKiBDMi9EMiBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBTRUxfQ0QgaW5wdXQgd2hpY2ggaXMgY29ubmVjdGVkIHRvCiAqIHRoZSBNUEM4MjYwIEkvTyBwb3J0IHBpbiBQQTExLiBQQTExIG91dHB1dCAoU0VMX0NEIGlucHV0KSBsb3cgKG9yIDApCiAqIHNlbGVjdHMgQzEvRDEgYW5kIFBBMTEgb3V0cHV0IChTRUxfQ0QgaW5wdXQpIGhpZ2ggKG9yIDEpIHNlbGVjdHMgQzIvRDIuCiAqCiAqIFBBMTEgZGVmYXVsdHMgdG8gb3V0cHV0IGxvdyAob3IgMCkgaW4gdGhlIGkvbyBwb3J0IGNvbmZpZyB0YWJsZSBhYm92ZS4KICoKICogT3V0cHV0IEEgcHJvdmlkZXMgYSAxMDBNSHogZm9yIHRoZSBIaWdoIFNwZWVkIFNlcmlhbCBjaGlwcy4gT3V0cHV0IEIKICogcHJvdmlkZXMgYSAzLjY4NjRNSHogY2xvY2sgZm9yIG1vcmUgYWNjdXJhdGUgYXN5bmNocm9ub3VzIHNlcmlhbCBiaXQKICogcmF0ZXMuIE91dHB1dCBDIGlzIHJvdXRlZCB0byB0aGUgbWV6emFuaW5lIGNvbm5lY3RvciBidXQgaXMgY3VycmVudGx5CiAqIHVudXNlZCAtIGJvdGggQzEgYW5kIEMyIGFyZSBzZXQgdG8gMTZNSHouIE91dHB1dCBEIGlzIHVzZWQgYnkgYm90aCB0aGUKICogYWx0LWlucHV0IGFuZCBkaXNwbGF5IG1lenphbmluZSBib2FyZHMgZm9yIHRoZWlyIHZpZGVvIGNoaXBzLiBUaGUKICogYWx0LWlucHV0IGJvYXJkIHJlcXVpcmVzIGEgY2xvY2sgb2YgMjQuNTc2TUh6IGFuZCB0aGlzIGlzIGF2YWlsYWJsZSBvbgogKiBEMSAoUEExMT1TRUxfQ0Q9MCkuIFRoZSBkaXNwbGF5IGJvYXJkIHJlcXVpcmVzIGEgY2xvY2sgb2YgMjdNSHogYW5kIHRoaXMKICogaXMgYXZhaWxhYmxlIG9uIEQyIChQQTExPVNFTF9DRD0xKS4KICoKICogU28gdGhlIGRlZmF1bHQgaXMgYSBjbG9jayBzdWl0YWJsZSBmb3IgdGhlIGFsdC1pbnB1dCBib2FyZC4gUEExMSBpcyB0b2dnbGVkCiAqIGxhdGVyIGluIG1pc2NfaW5pdF9yKCksIGlmIGEgZGlzcGxheSBib2FyZCBpcyBkZXRlY3RlZC4KICovCgp1Y2hhciBmczYzNzdfYWRkciA9IDB4NWM7Cgp1Y2hhciBmczYzNzdfcmVnc1sxNl0gPSB7CgkgMTIsICA3NSwgIDY0LCAgMjUsIDE0NCwgMTI4LCAgMjUsIDE5MiwKCSAgMCwgIDE2LCAxMzUsIDE5MiwgMjI0LCAgNjQsICA2NCwgMTkyCn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBzcGVjaWFsIGJvYXJkIGluaXRpYWxpc2F0aW9uLCBhZnRlciBjbG9ja3MgYW5kIHRpbWViYXNlIGhhdmUgYmVlbgogKiBzZXQgdXAgYnV0IGJlZm9yZSBlbnZpcm9ubWVudCBhbmQgc2VyaWFsIGFyZSBpbml0aWFsaXNlZC4KICoKICogYWRkZWQgc28gdGhhdCB2ZXJ5IGVhcmx5IGluaXRpYWxpc2F0aW9ucyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgaTJjCiAqIGRyaXZlciAod2hpY2ggcmVxdWlyZXMgdGhlIGNsb2NrcywgdG8gY2FsY3VsYXRlIHRoZSBkaXZpZGVycywgYW5kCiAqIHRoZSB0aW1lYmFzZSwgZm9yIHVkZWxheSgpKQogKi8KCmludApib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpCnsKCWkyY19pbml0IChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKCgkvKgoJICogSW5pdGlhbGlzZSB0aGUgRlM2Mzc3IGNsb2NrIGNoaXAKCSAqCgkgKiB0aGUgc2Vjb25kYXJ5IGFkZHJlc3MgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciBmcm9tIHdoZXJlIHRvCgkgKiBzdGFydCB0aGUgd3JpdGUgLSBJIHdhbnQgdG8gd3JpdGUgYWxsIHRoZSByZWdpc3RlcnMKCSAqCgkgKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgcmV0dXJuIHN0YXR1cyAtIHdlIGhhdmUgbm8gY29uc29sZSB5ZXQKCSAqIHRvIHByaW50IGl0IG9uLCBub3IgYW55IFJBTSB0byBzdG9yZSBpdCBpbiAtIGl0IHdpbGwgYmUgb2J2aW91cwoJICogaWYgdGhpcyBkb2Vzbid0IHdvcmsKCSAqLwoJKHZvaWQpIGkyY193cml0ZSAoZnM2Mzc3X2FkZHIsIDAsIDEsIGZzNjM3N19yZWdzLAoJCQkJCXNpemVvZiAoZnM2Mzc3X3JlZ3MpKTsKCglyZXR1cm4gKDApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBDaGVjayBCb2FyZCBJZGVudGl0eTogSGFyZHdpcmVkIHRvIEhZTU9ECiAqLwoKaW50CmNoZWNrYm9hcmQgKHZvaWQpCnsKCXB1dHMgKCJCb2FyZDogSFlNT0RcbiIpOwoJcmV0dXJuICgwKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWlzY2VsbGFuZW91cyAoZWFybHkgLSB3aGlsZSBydW5uaW5nIGluIGZsYXNoKSBpbml0aWFsaXNhdGlvbnMuCiAqLwoKI2RlZmluZSBfTk9UX1VTRURfCTB4RkZGRkZGRkYKCnVpbnQgdXBtYl90YWJsZVtdID0gewoJLyogUmVhZCBTaW5nbGUgQmVhdCAoUlNTKSAtIG9mZnNldCAweDAwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlYWQgQnVyc3QgKFJCUykgLSBvZmZzZXQgMHgwOCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIFNpbmdsZSBCZWF0IChXU1MpIC0gb2Zmc2V0IDB4MTggKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgQnVyc3QgKFdTUykgLSBvZmZzZXQgMHgyMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlZnJlc2ggVGltZXIgKFBUUykgLSBvZmZzZXQgMHgzMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogRXhjZXB0aW9uIENvbmRpdGlvbiAoRVhTKSAtIG9mZnNldCAweDNjICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfCn07Cgp1aW50IHVwbWNfdGFibGVbXSA9IHsKCS8qIFJlYWQgU2luZ2xlIEJlYXQgKFJTUykgLSBvZmZzZXQgMHgwMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWFkIEJ1cnN0IChSQlMpIC0gb2Zmc2V0IDB4MDggKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBTaW5nbGUgQmVhdCAoV1NTKSAtIG9mZnNldCAweDE4ICovCgkweEYwRTAwMDAwLCAweEYwQTAwMDAwLCAweDAwQTAwMDAwLCAweDMwQTAwMDAwLAoJMHhGMEY0MDAwNywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIEJ1cnN0IChXU1MpIC0gb2Zmc2V0IDB4MjAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBSZWZyZXNoIFRpbWVyIChQVFMpIC0gb2Zmc2V0IDB4MzAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIEV4Y2VwdGlvbiBDb25kaXRpb24gKEVYUykgLSBvZmZzZXQgMHgzYyAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXwp9OwoKaW50Cm1pc2NfaW5pdF9mICh2b2lkKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOwoJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKCglwcmludGYgKCJVUE1zOiAgIik7CgoJdXBtY29uZmlnIChVUE1CLCB1cG1iX3RhYmxlLCBzaXplb2YgdXBtYl90YWJsZSAvIHNpemVvZiB1cG1iX3RhYmxlWzBdKTsKCW1lbWN0bC0+bWVtY19tYm1yID0gQ0ZHX01CTVI7CgoJdXBtY29uZmlnIChVUE1DLCB1cG1jX3RhYmxlLCBzaXplb2YgdXBtY190YWJsZSAvIHNpemVvZiB1cG1jX3RhYmxlWzBdKTsKCW1lbWN0bC0+bWVtY19tY21yID0gQ0ZHX01DTVI7CgoJcHJpbnRmICgiY29uZmlndXJlZFxuIik7CglyZXR1cm4gKDApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpsb25nCmluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKewoJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKCXZvbGF0aWxlIG1lbWN0bDgyNjBfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7Cgl2b2xhdGlsZSB1Y2hhciBjID0gMCwgKnJhbWFkZHIgPSAodWNoYXIgKikgKENGR19TRFJBTV9CQVNFICsgMHg4KTsKCXVsb25nIHBzZG1yID0gQ0ZHX1BTRE1SOwoJaW50IGk7CgoJLyoKCSAqIFF1b3RlIGZyb20gODI2MCBVTSAoMTAuNC4yIFNEUkFNIFBvd2VyLU9uIEluaXRpYWxpemF0aW9uLCAxMC0zNSk6CgkgKgoJICogIkF0IHN5c3RlbSByZXNldCwgaW5pdGlhbGl6YXRpb24gc29mdHdhcmUgbXVzdCBzZXQgdXAgdGhlCgkgKiAgcHJvZ3JhbW1hYmxlIHBhcmFtZXRlcnMgaW4gdGhlIG1lbW9yeSBjb250cm9sbGVyIGJhbmtzIHJlZ2lzdGVycwoJICogIChPUngsIEJSeCwgUC9MU0RNUikuIEFmdGVyIGFsbCBtZW1vcnkgcGFyYW1ldGVycyBhcmUgY29u3md1cmVkLAoJICogIHN5c3RlbSBzb2Z0d2FyZSBzaG91bGQgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCgkgKiAgZm9yIGVhY2ggU0RSQU0gZGV2aWNlLgoJICoKCSAqICAxLiBJc3N1ZSBhIFBSRUNIQVJHRS1BTEwtQkFOS1MgY29tbWFuZAoJICogIDIuIElzc3VlIGVpZ2h0IENCUiBSRUZSRVNIIGNvbW1hbmRzCgkgKiAgMy4gSXNzdWUgYSBNT0RFLVNFVCBjb21tYW5kIHRvIGluaXRpYWxpemUgdGhlIG1vZGUgcmVnaXN0ZXIKCSAqCgkgKiAgVGhlIGluaXRpYWwgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGJ5IHNldHRpbmcgUC9MU0RNUltPUF0gYW5kCgkgKiAgYWNjZXNzaW5nIHRoZSBTRFJBTSB3aXRoIGEgc2luZ2xlLWJ5dGUgdHJhbnNhY3Rpb24uIgoJICoKCSAqIFRoZSBhcHByb3ByaWF0ZSBCUngvT1J4IHJlZ2lzdGVycyBoYXZlIGFscmVhZHkgYmVlbiBzZXQgd2hlbiB3ZQoJICogZ2V0IGhlcmUuIFRoZSBTRFJBTSBjYW4gYmUgYWNjZXNzZWQgYXQgdGhlIGFkZHJlc3MgQ0ZHX1NEUkFNX0JBU0UuCgkgKi8KCgltZW1jdGwtPm1lbWNfcHNydCA9IENGR19QU1JUOwoJbWVtY3RsLT5tZW1jX21wdHByID0gQ0ZHX01QVFBSOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfUFJFQTsKCSpyYW1hZGRyID0gYzsKCgltZW1jdGwtPm1lbWNfcHNkbXIgPSBwc2RtciB8IFBTRE1SX09QX0NCUlI7Cglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQoJCSpyYW1hZGRyID0gYzsKCgltZW1jdGwtPm1lbWNfcHNkbXIgPSBwc2RtciB8IFBTRE1SX09QX01SVzsKCSpyYW1hZGRyID0gYzsKCgltZW1jdGwtPm1lbWNfcHNkbXIgPSBwc2RtciB8IFBTRE1SX09QX05PUk0gfCBQU0RNUl9SRkVOOwoJKnJhbWFkZHIgPSBjOwoKCXJldHVybiAoQ0ZHX1NEUkFNX1NJWkUgPDwgMjApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGlzYXRpb25zIGFmdGVyIHJlbG9jYXRpb24gaW50byByYW0gKG1pc2NfaW5pdF9yKSAgICAgKi8KLyogCQkJCQkJCQkJICAgICAqLwovKiBsb2FkcyB0aGUgZGF0YSBpbiB0aGUgbWFpbiBib2FyZCBhbmQgbWV6emFuaW5lIGJvYXJkIGVlcHJvbXMgaW50bwkgICAgICovCi8qIHRoZSBoeW1vZCBjb25maWd1cmF0aW9uIHN0cnVjdCBzdG9yZWQgaW4gdGhlIGJvYXJkIGluZm9ybWF0aW9uIGFyZWEuCSAgICAgKi8KLyogCQkJCQkJCQkJICAgICAqLwovKiBpZiB0aGUgY29udGVudHMgb2YgZWl0aGVyIGVlcHJvbSBpcyBpbnZhbGlkLCBwcm9tcHRzIGZvciBhIHNlcmlhbAkgICAgICovCi8qIG51bWJlciAoYW5kIGFuIGV0aGVybmV0IGFkZHJlc3MgaWYgcmVxdWlyZWQpIHRoZW4gZmV0Y2hlcyBhIGZpbGUJICAgICAqLwovKiBjb250YWluaW5nIGluZm9ybWF0aW9uIHRvIGJlIHN0b3JlZCBpbiB0aGUgZWVwcm9tIGZyb20gdGhlIHRmdHAgc2VydmVyICAgICovCi8qICh0aGUgZmlsZSBuYW1lIGlzIGJhc2VkIG9uIHRoZSBzZXJpYWwgbnVtYmVyIGFuZCBhIGJ1aWx0LWluIHBhdGgpCSAgICAgKi8KCmludApsYXN0X3N0YWdlX2luaXQgKHZvaWQpCnsKCWh5bW9kX2NvbmZfdCAqY3AgPSAmZ2QtPmJkLT5iaV9oeW1vZF9jb25mOwoJaW50IHJjOwoKI2lmZGVmIENPTkZJR19CT09UX1JFVFJZX1RJTUUKCS8qCgkgKiB3ZSB1c2UgdGhlIHJlYWRsaW5lICgpIGZ1bmN0aW9uLCBidXQgd2UgYWxzbyB3YW50CgkgKiBjb21tYW5kIHRpbWVvdXQgZW5hYmxlZAoJICovCglpbml0X2NtZF90aW1lb3V0ICgpOwojZW5kaWYKCgltZW1zZXQgKCh2b2lkICopIGNwLCAwLCBzaXplb2YgKCpjcCkpOwoKCS8qIHNldCB1cCBtYWluIGJvYXJkIGNvbmZpZyBpbmZvICovCgoJcmMgPSBoeW1vZF9lZXByb21fcmVhZCAoMCwgJmNwLT5tYWluLmVlcHJvbSk7CgoJcHV0cyAoIkVFUFJPTTptYWluLi4uIik7CglpZiAocmMgPCAwKQoJCXB1dHMgKCJOT1QgUFJFU0VOVFxuIik7CgllbHNlIGlmIChyYyA9PSAwKQoJCXB1dHMgKCJJTlZBTElEXG4iKTsKCWVsc2UgewoJCWNwLT5tYWluLmVlcHJvbS52YWxpZCA9IDE7CgoJCXByaW50ZiAoIk9LICh2ZXIgJXUpXG4iLCBjcC0+bWFpbi5lZXByb20udmVyKTsKCQloeW1vZF9lZXByb21fcHJpbnQgKCZjcC0+bWFpbi5lZXByb20pOwoKCQkvKgoJCSAqIGhhcmQtd2lyZWQgYXNzdW1wdGlvbiBoZXJlOiBhbGwgaHltb2QgbWFpbiBib2FyZHMgd2lsbCBoYXZlCgkJICogb25lIHhpbGlueCBmcGdhLCB3aXRoIHRoZSBpbnRlcnJ1cHQgbGluZSBjb25uZWN0ZWQgdG8gSVJRMgoJCSAqCgkJICogT25lIGRheSwgdGhpcyBtaWdodCBiZSBiYXNlZCBvbiB0aGUgYm9hcmQgdHlwZQoJCSAqLwoKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wcm9nLmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucHJvZy5zaXplID0gRlBHQV9NQUlOX0NGR19TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnByb2cuYmFzZSA9IEZQR0FfTUFJTl9DRkdfQkFTRTsKCgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLnNpemUgPSBGUEdBX01BSU5fUkVHX1NJWkU7CgkJY3AtPm1haW4ueGx4WzBdLm1tYXAucmVnLmJhc2UgPSBGUEdBX01BSU5fUkVHX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5tbWFwLnBvcnQuZXhpc3RzID0gMTsKCQljcC0+bWFpbi54bHhbMF0ubW1hcC5wb3J0LnNpemUgPSBGUEdBX01BSU5fUE9SVF9TSVpFOwoJCWNwLT5tYWluLnhseFswXS5tbWFwLnBvcnQuYmFzZSA9IEZQR0FfTUFJTl9QT1JUX0JBU0U7CgoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMucHJvZ19waW4ucG9ydCA9IEZQR0FfTUFJTl9QUk9HX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5wcm9nX3Bpbi5waW4gPSBGUEdBX01BSU5fUFJPR19QSU47CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5wcm9nX3Bpbi5mbGFnID0gMTsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmluaXRfcGluLnBvcnQgPSBGUEdBX01BSU5fSU5JVF9QT1JUOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuaW5pdF9waW4ucGluID0gRlBHQV9NQUlOX0lOSVRfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuaW5pdF9waW4uZmxhZyA9IDE7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5kb25lX3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0RPTkVfUE9SVDsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmRvbmVfcGluLnBpbiA9IEZQR0FfTUFJTl9ET05FX1BJTjsKCQljcC0+bWFpbi54bHhbMF0uaW9waW5zLmRvbmVfcGluLmZsYWcgPSAxOwojaWZkZWYgRlBHQV9NQUlOX0VOQUJMRV9QT1JUCgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5lbmFibGVfcGluLnBvcnQgPSBGUEdBX01BSU5fRU5BQkxFX1BPUlQ7CgkJY3AtPm1haW4ueGx4WzBdLmlvcGlucy5lbmFibGVfcGluLnBpbiA9IEZQR0FfTUFJTl9FTkFCTEVfUElOOwoJCWNwLT5tYWluLnhseFswXS5pb3BpbnMuZW5hYmxlX3Bpbi5mbGFnID0gMTsKI2VuZGlmCgoJCWNwLT5tYWluLnhseFswXS5pcnEgPSBGUEdBX01BSU5fSVJROwoJfQoKCS8qIHNldCB1cCBtZXp6YW5pbmUgYm9hcmQgY29uZmlnIGluZm8gKi8KCglyYyA9IGh5bW9kX2VlcHJvbV9yZWFkICgxLCAmY3AtPm1lenouZWVwcm9tKTsKCglwdXRzICgiRUVQUk9NOm1lenouLi4iKTsKCWlmIChyYyA8IDApCgkJcHV0cyAoIk5PVCBQUkVTRU5UXG4iKTsKCWVsc2UgaWYgKHJjID09IDApCgkJcHV0cyAoIklOVkFMSURcbiIpOwoJZWxzZSB7CgkJY3AtPm1haW4uZWVwcm9tLnZhbGlkID0gMTsKCgkJcHJpbnRmICgiT0sgKHZlciAldSlcbiIsIGNwLT5tZXp6LmVlcHJvbS52ZXIpOwoJCWh5bW9kX2VlcHJvbV9wcmludCAoJmNwLT5tZXp6LmVlcHJvbSk7Cgl9CgoJY3AtPmNyYyA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKWNwLCBvZmZzZXRvZiAoaHltb2RfY29uZl90LCBjcmMpKTsKCgloeW1vZF9jaGVja19lbnYgKCk7CgoJcmV0dXJuICgwKTsKfQoKI2lmZGVmIENPTkZJR19TSE9XX0FDVElWSVRZCnZvaWQgYm9hcmRfc2hvd19hY3Rpdml0eSAodWxvbmcgdGltZWJhc2UpCnsKI2lmZGVmIENGR19IWU1PRF9EQkxFRFMKCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKCXZvbGF0aWxlIGlvcDgyNjBfdCAqaW9wID0gJmltbXItPmltX2lvcG9ydDsKCXN0YXRpYyBpbnQgc2hpZnQgPSAwOwoKCWlmICgodGltZXN0YW1wICUgQ0ZHX0haKSA9PSAwKSB7CgkJaWYgKCsrc2hpZnQgPiAzKQoJCQlzaGlmdCA9IDA7CgkJaW9wLT5pb3BfcGRhdGQgPQoJCQkJKGlvcC0+aW9wX3BkYXRkICYgfjB4MGYwMDAwMDApIHwgKDEgPDwgKDI0ICsgc2hpZnQpKTsKCX0KI2VuZGlmIC8qIENGR19IWU1PRF9EQkxFRFMgKi8KfQoKdm9pZCBzaG93X2FjdGl2aXR5KGludCBhcmcpCnsKfQojZW5kaWYgLyogQ09ORklHX1NIT1dfQUNUSVZJVFkgKi8K