LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCk0qIE1vZHVsOiAgICAgICAgIGx3bW9uLmMKTSoKTSogQ29udGVudDogICAgICAgTFdNT04gc3BlY2lmaWMgVS1Cb290IGNvbW1hbmRzLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDEsIDIwMDIKICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZwogKiBXb2xmZ2FuZyBEZW5rLCB3ZEBkZW54LmRlCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCkQqIERlc2lnbjogICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246ICBkenVAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVhZGVyZmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1wYzh4eC5oPgojaW5jbHVkZSA8Y29tbXByb2MuaD4KI2luY2x1ZGUgPGkyYy5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8Y21kX2JzcC5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlIDxwb3N0Lmg+CgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBmb3Igc3RyZHVwICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NhbCBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50LCBsb25nIGludCAqLCBsb25nIGludCk7CnN0YXRpYyB2b2lkIGtiZF9pbml0ICh2b2lkKTsKc3RhdGljIGludCBjb21wYXJlX21hZ2ljICh1Y2hhciAqa2JkX2RhdGEsIHVjaGFyICpzdHIpOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvY2FsIG1hY3JvcyBhbmQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZQlfTk9UX1VTRURfCTB4RkZGRkZGRkYKCiNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVApzdGF0aWMgaW50IGtleV9wcmVzc2VkKHZvaWQpOwpleHRlcm4gdm9pZCBkaXNhYmxlX3B1dGModm9pZCk7CiNlbmRpZiAvKiBDT05GSUdfTU9ERU1fU1VQUE9SVCAqLwoKLyoKICogNjYgTUh6IFNEUkFNIGFjY2VzcyB1c2luZyBVUE0gQQogKi8KY29uc3QgdWludCBzZHJhbV90YWJsZVtdID0KewojaWYgZGVmaW5lZChDRkdfTUVNT1JZXzc1KSB8fCBkZWZpbmVkKENGR19NRU1PUllfOEUpCgkvKgoJICogU2luZ2xlIFJlYWQuIChPZmZzZXQgMCBpbiBVUE0gUkFNKQoJICovCgkweDFGMERGQzA0LCAweEVFQUZCQzA0LCAweDExQUY3QzA0LCAweEVGQkFGQzAwLAoJMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJLyoKCSAqIFNEUkFNIEluaXRpYWxpemF0aW9uIChvZmZzZXQgNSBpbiBVUE0gUkFNKQoJICoKICAgICAgICAgKiBUaGlzIGlzIG5vIFVQTSBlbnRyeSBwb2ludC4gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIHVzZXMKICAgICAgICAgKiB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIGVzdGFibGlzaCBhbiBpbml0aWFsaXphdGlvbgogICAgICAgICAqIHNlcXVlbmNlLCB3aGljaCBpcyBleGVjdXRlZCBieSBhIFJVTiBjb21tYW5kLgoJICoKCSAqLwoJCSAgICAweDFGRjVGQzM0LCAweEVGRUFCQzM0LCAweDFGQjU3QzM1LCAvKiBsYXN0ICovCgkvKgoJICogQnVyc3QgUmVhZC4gKE9mZnNldCA4IGluIFVQTSBSQU0pCgkgKi8KCTB4MUYwREZDMDQsIDB4RUVBRkJDMDQsIDB4MTBBRjdDMDQsIDB4RjBBRkZDMDAsCgkweEYwQUZGQzAwLCAweEYxQUZGQzAwLCAweEVGQkFGQzAwLCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBTaW5nbGUgV3JpdGUuIChPZmZzZXQgMTggaW4gVVBNIFJBTSkKCSAqLwoJMHgxRjJERkMwNCwgMHhFRUFCQkMwMCwgMHgwMUIyN0MwNCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qCgkgKiBCdXJzdCBXcml0ZS4gKE9mZnNldCAyMCBpbiBVUE0gUkFNKQoJICovCgkweDFGMERGQzA0LCAweEVFQUJCQzAwLCAweDEwQTc3QzAwLCAweEYwQUZGQzAwLAoJMHhGMEFGRkMwMCwgMHhFMUJBRkMwNCwgMHgwMUZGNUZDNDcsIC8qIGxhc3QgKi8KCQkJCQkgICAgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFJlZnJlc2ggIChPZmZzZXQgMzAgaW4gVVBNIFJBTSkKCSAqLwoJMHgxRkZEN0M4NCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwKCTB4RkZGRkZDODQsIDB4RkZGRkZDMDcsIC8qIGxhc3QgKi8KCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEV4Y2VwdGlvbi4gKE9mZnNldCAzYyBpbiBVUE0gUkFNKQoJICovCgkweDdGRkZGQzA3LCAvKiBsYXN0ICovCgkJICAgIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsCiNlbmRpZgojaWZkZWYgQ0ZHX01FTU9SWV83RQoJLyoKCSAqIFNpbmdsZSBSZWFkLiAoT2Zmc2V0IDAgaW4gVVBNIFJBTSkKCSAqLwoJMHgwRTJEQkMwNCwgMHgxMUFGN0MwNCwgMHhFRkJBRkMwMCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJX05PVF9VU0VEXywKCS8qCgkgKiBTRFJBTSBJbml0aWFsaXphdGlvbiAob2Zmc2V0IDUgaW4gVVBNIFJBTSkKCSAqCiAgICAgICAgICogVGhpcyBpcyBubyBVUE0gZW50cnkgcG9pbnQuIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiB1c2VzCiAgICAgICAgICogdGhlIHJlbWFpbmluZyBzcGFjZSB0byBlc3RhYmxpc2ggYW4gaW5pdGlhbGl6YXRpb24KICAgICAgICAgKiBzZXF1ZW5jZSwgd2hpY2ggaXMgZXhlY3V0ZWQgYnkgYSBSVU4gY29tbWFuZC4KCSAqCgkgKi8KCQkgICAgMHgxRkY1RkMzNCwgMHhFRkVBQkMzNCwgMHgxRkI1N0MzNSwgLyogbGFzdCAqLwoJLyoKCSAqIEJ1cnN0IFJlYWQuIChPZmZzZXQgOCBpbiBVUE0gUkFNKQoJICovCgkweDBFMkRCQzA0LCAweDEwQUY3QzA0LCAweEYwQUZGQzAwLCAweEYwQUZGQzAwLAoJMHhGMUFGRkMwMCwgMHhFRkJBRkMwMCwgMHgxRkY1RkM0NywgLyogbGFzdCAqLwoJCQkJIAkgICAgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFNpbmdsZSBXcml0ZS4gKE9mZnNldCAxOCBpbiBVUE0gUkFNKQoJICovCgkweDBFMjlCQzA0LCAweDAxQjI3QzA0LCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCgkJCQkJICAgIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEJ1cnN0IFdyaXRlLiAoT2Zmc2V0IDIwIGluIFVQTSBSQU0pCgkgKi8KCTB4MEUyOUJDMDQsIDB4MTBBNzdDMDAsIDB4RjBBRkZDMDAsIDB4RjBBRkZDMDAsCgkweEUxQkFGQzA0LCAweDFGRjVGQzQ3LCAvKiBsYXN0ICovCgkJCSAgICAgICAgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIFJlZnJlc2ggIChPZmZzZXQgMzAgaW4gVVBNIFJBTSkKCSAqLwoJMHgxRkZEN0M4NCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwgMHhGRkZGRkMwNCwKCTB4RkZGRkZDODQsIDB4RkZGRkZDMDcsIC8qIGxhc3QgKi8KCQkJCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyoKCSAqIEV4Y2VwdGlvbi4gKE9mZnNldCAzYyBpbiBVUE0gUkFNKQoJICovCgkweDdGRkZGQzA3LCAvKiBsYXN0ICovCgkJICAgIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsIDB4RkZGRkZDRkYsCiNlbmRpZgp9OwoKLyoKICogQ2hlY2sgQm9hcmQgSWRlbnRpdHk6CiAqCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGNoZWNrYm9hcmQgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQgLSAwIGlzIGFsd2F5cyByZXR1cm5lZAogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNoZWNrYm9hcmQoKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLiAgT25seSBhIHN0YW5kYXJkIG1lc3NhZ2UgaXMgcHJpbnRlZC4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGNoZWNrYm9hcmQgKHZvaWQpCnsKCXB1dHMgKCJCb2FyZDogTGl0cm9uaWMgTW9uaXRvciBJVlxuIik7CglyZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIGludCBib2FyZF90eXBlClAqICAgICAgICAgICAgICAgIC0gVXN1YWxseSB0eXBlIG9mIHRoZSBib2FyZCAtIGlnbm9yZWQgaGVyZS4KUCoKUCogUmV0dXJudmFsdWU6ICBsb25nIGludApQKiAgICAgICAgICAgICAgICAtIFNpemUgb2YgaW5pdGlhbGl6ZWQgbWVtb3J5CiAqCloqIEludGVudGlvbjogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW5pdGRyYW0oKSBtZXRob2QgaW1wbGVtZW50YXRpb24KWiogICAgICAgICAgICAgICBmb3IgdGhlIGx3bW9uIGJvYXJkLgpaKiAgICAgICAgICAgICAgIFRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBpbml0aWFsaXplZCB0byBhY2Nlc3MgdGhlCloqICAgICAgICAgICAgICAgRFJBTS4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbXItPmltX21lbWN0bDsKCWxvbmcgaW50IHNpemVfYjA7Cglsb25nIGludCBzaXplOCwgc2l6ZTk7CglpbnQgaTsKCgkvKgoJICogQ29uZmlndXJlIFVQTUEgZm9yIFNEUkFNCgkgKi8KCXVwbWNvbmZpZyAoVVBNQSwgKHVpbnQgKilzZHJhbV90YWJsZSwgc2l6ZW9mKHNkcmFtX3RhYmxlKS9zaXplb2YodWludCkpOwoKCW1lbWN0bC0+bWVtY19tcHRwciA9IENGR19NUFRQUjsKCgkvKiBidXJzdCBsZW5ndGg9NCwgYnVyc3QgdHlwZT1zZXF1ZW50aWFsLCBDQVMgbGF0ZW5jeT0yICovCgltZW1jdGwtPm1lbWNfbWFyID0gQ0ZHX01BUjsKCgkvKgoJICogTWFwIGNvbnRyb2xsZXIgYmFuayAzIHRvIHRoZSBTRFJBTSBiYW5rIGF0IHByZWxpbWluYXJ5IGFkZHJlc3MuCgkgKi8KCW1lbWN0bC0+bWVtY19vcjMgPSBDRkdfT1IzX1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjMgPSBDRkdfQlIzX1BSRUxJTTsKCgkvKiBpbml0aWFsaXplIG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICovCgltZW1jdGwtPm1lbWNfbWFtciA9IENGR19NQU1SXzhDT0w7CS8qIHJlZnJlc2ggbm90IGVuYWJsZWQgeWV0ICovCgoJLyogbW9kZSBpbml0aWFsaXphdGlvbiAob2Zmc2V0IDUpICovCgl1ZGVsYXkgKDIwMCk7CQkJCS8qIDB4ODAwMDYxMDUgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MDUpOwoKCS8qIHJ1biAyIHJlZnJlc2ggc2VxdWVuY2Ugd2l0aCA0LWJlYXQgcmVmcmVzaCBidXJzdCAob2Zmc2V0IDB4MzApICovCgl1ZGVsYXkgKDEpOwkJCQkvKiAweDgwMDA2MTMwICovCgltZW1jdGwtPm1lbWNfbWNyID0gTUNSX09QX1JVTiB8IE1DUl9NQl9DUzMgfCBNQ1JfTUxDRiAoMSkgfCBNQ1JfTUFEICgweDMwKTsKCXVkZWxheSAoMSk7CQkJCS8qIDB4ODAwMDYxMzAgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MzApOwoKCXVkZWxheSAoMSk7CQkJCS8qIDB4ODAwMDYxMDYgKi8KCW1lbWN0bC0+bWVtY19tY3IgPSBNQ1JfT1BfUlVOIHwgTUNSX01CX0NTMyB8IE1DUl9NTENGICgxKSB8IE1DUl9NQUQgKDB4MDYpOwoKCW1lbWN0bC0+bWVtY19tYW1yIHw9IE1BTVJfUFRCRTsJLyogcmVmcmVzaCBlbmFibGVkICovCgoJdWRlbGF5ICgyMDApOwoKCS8qIE5lZWQgYXQgbGVhc3QgMTAgRFJBTSBhY2Nlc3NlcyB0byBzdGFiaWxpemUgKi8KCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CgkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciA9CgkJCSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIFNEUkFNX0JBU0UzX1BSRUxJTTsKCQl1bnNpZ25lZCBsb25nIHZhbDsKCgkJdmFsID0gKihhZGRyICsgaSk7CgkJKihhZGRyICsgaSkgPSB2YWw7Cgl9CgoJLyoKCSAqIENoZWNrIEJhbmsgMCBNZW1vcnkgU2l6ZSBmb3IgcmUtY29uZmlndXJhdGlvbgoJICoKCSAqIHRyeSA4IGNvbHVtbiBtb2RlCgkgKi8KCXNpemU4ID0gZHJhbV9zaXplIChDRkdfTUFNUl84Q09MLCAodWxvbmcgKilTRFJBTV9CQVNFM19QUkVMSU0sIFNEUkFNX01BWF9TSVpFKTsKCgl1ZGVsYXkgKDEwMDApOwoKCS8qCgkgKiB0cnkgOSBjb2x1bW4gbW9kZQoJICovCglzaXplOSA9IGRyYW1fc2l6ZSAoQ0ZHX01BTVJfOUNPTCwgKHVsb25nICopU0RSQU1fQkFTRTNfUFJFTElNLCBTRFJBTV9NQVhfU0laRSk7CgoJaWYgKHNpemU4IDwgc2l6ZTkpIHsJCS8qIGxlYXZlIGNvbmZpZ3VyYXRpb24gYXQgOSBjb2x1bW5zICovCgkJc2l6ZV9iMCA9IHNpemU5OwoJCW1lbWN0bC0+bWVtY19tYW1yID0gQ0ZHX01BTVJfOUNPTCB8IE1BTVJfUFRCRTsKCQl1ZGVsYXkgKDUwMCk7Cgl9IGVsc2UgewkJCS8qIGJhY2sgdG8gOCBjb2x1bW5zICAgICAgICAgICAgKi8KCQlzaXplX2IwID0gc2l6ZTg7CgkJbWVtY3RsLT5tZW1jX21hbXIgPSBDRkdfTUFNUl84Q09MIHwgTUFNUl9QVEJFOwoJCXVkZWxheSAoNTAwKTsKCX0KCgkvKgoJICogRmluYWwgbWFwcGluZzoKCSAqLwoKCW1lbWN0bC0+bWVtY19vcjMgPSAoKC1zaXplX2IwKSAmIDB4RkZGRjAwMDApIHwKCQkJT1JfQ1NOVF9TQU0gfCBPUl9HNUxTIHwgU0RSQU1fVElNSU5HOwoJbWVtY3RsLT5tZW1jX2JyMyA9IChDRkdfU0RSQU1fQkFTRSAmIEJSX0JBX01TSykgfCBCUl9NU19VUE1BIHwgQlJfVjsKCXVkZWxheSAoMTAwMCk7CgoJcmV0dXJuIChzaXplX2IwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgc3RhdGljIGxvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQgbWFtcl92YWx1ZSwKRiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludCAqYmFzZSwKRiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludCBtYXhzaXplKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBsb25nIGludCBtYW1yX3ZhbHVlClAqICAgICAgICAgICAgICAgIC0gVmFsdWUgZm9yIE1BTVIgZm9yIHRoZSB0ZXN0ClAqICAgICAgICAgICAgICAgbG9uZyBpbnQgKmJhc2UKUCogICAgICAgICAgICAgICAgLSBCYXNlIGFkZHJlc3MgZm9yIHRoZSB0ZXN0ClAqICAgICAgICAgICAgICAgbG9uZyBpbnQgbWF4c2l6ZQpQKiAgICAgICAgICAgICAgICAtIE1heGltdW0gc2l6ZSB0byB0ZXN0IGZvcgpQKgpQKiBSZXR1cm52YWx1ZTogIGxvbmcgaW50ClAqICAgICAgICAgICAgICAgIC0gU2l6ZSBvZiBwcm9iZWQgbWVtb3J5CiAqCloqIEludGVudGlvbjogICAgQ2hlY2sgbWVtb3J5IHJhbmdlIGZvciB2YWxpZCBSQU0uIEEgc2ltcGxlIG1lbW9yeSB0ZXN0CloqICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsbHkgYXZhaWxhYmxlIFJBTSBzaXplIGJldHdlZW4KWiogICAgICAgICAgICAgICBhZGRyZXNzZXMgYGJhc2UnIGFuZCBgYmFzZSArIG1heHNpemUnLiBTb21lIChub3QgYWxsKQpaKiAgICAgICAgICAgICAgIGhhcmR3YXJlIGVycm9ycyBhcmUgZGV0ZWN0ZWQ6CloqICAgICAgICAgICAgICAgIC0gc2hvcnQgYmV0d2VlbiBhZGRyZXNzIGxpbmVzCloqICAgICAgICAgICAgICAgIC0gc2hvcnQgYmV0d2VlbiBkYXRhIGxpbmVzCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50IG1hbXJfdmFsdWUsIGxvbmcgaW50ICpiYXNlLCBsb25nIGludCBtYXhzaXplKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbXItPmltX21lbWN0bDsKCXZvbGF0aWxlIGxvbmcgaW50ICphZGRyOwoJdWxvbmcgY250LCB2YWw7Cgl1bG9uZyBzYXZlWzMyXTsJCQkJLyogdG8gbWFrZSB0ZXN0IG5vbi1kZXN0cnVjdGl2ZSAqLwoJdW5zaWduZWQgY2hhciBpID0gMDsKCgltZW1jdGwtPm1lbWNfbWFtciA9IG1hbXJfdmFsdWU7CgoJZm9yIChjbnQgPSBtYXhzaXplIC8gc2l6ZW9mIChsb25nKTsgY250ID4gMDsgY250ID4+PSAxKSB7CgkJYWRkciA9IGJhc2UgKyBjbnQ7CQkvKiBwb2ludGVyIGFyaXRoISAqLwoKCQlzYXZlW2krK10gPSAqYWRkcjsKCQkqYWRkciA9IH5jbnQ7Cgl9CgoJLyogd3JpdGUgMCB0byBiYXNlIGFkZHJlc3MgKi8KCWFkZHIgPSBiYXNlOwoJc2F2ZVtpXSA9ICphZGRyOwoJKmFkZHIgPSAwOwoKCS8qIGNoZWNrIGF0IGJhc2UgYWRkcmVzcyAqLwoJaWYgKCh2YWwgPSAqYWRkcikgIT0gMCkgewoJCSphZGRyID0gc2F2ZVtpXTsKCQlyZXR1cm4gKDApOwoJfQoKCWZvciAoY250ID0gMTsgY250IDw9IG1heHNpemUgLyBzaXplb2YgKGxvbmcpOyBjbnQgPDw9IDEpIHsKCQlhZGRyID0gYmFzZSArIGNudDsJCS8qIHBvaW50ZXIgYXJpdGghICovCgoJCXZhbCA9ICphZGRyOwoJCSphZGRyID0gc2F2ZVstLWldOwoKCQlpZiAodmFsICE9ICh+Y250KSkgewoJCQlyZXR1cm4gKGNudCAqIHNpemVvZiAobG9uZykpOwoJCX0KCX0KCXJldHVybiAobWF4c2l6ZSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNpZm5kZWYJUEJfRU5FVF9URU5BCiMgZGVmaW5lIFBCX0VORVRfVEVOQQkoKHVpbnQpMHgwMDAwMjAwMCkJLyogUEIgMTggKi8KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgYm9hcmRfcHJlX2luaXQgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwIGlzIGFsd2F5cyByZXR1cm5lZC4KICoKWiogSW50ZW50aW9uOiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBib2FyZF9wcmVfaW5pdCgpIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgpaKiAgICAgICAgICAgICAgIGZvciB0aGUgbHdtb24gYm9hcmQuCloqICAgICAgICAgICAgICAgRGlzYWJsZSBFdGhlcm5ldCBURU5BIG9uIFBvcnQgQi4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGJvYXJkX3ByZV9pbml0ICh2b2lkKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CgoJLyogRGlzYWJsZSBFdGhlcm5ldCBURU5BIG9uIFBvcnQgQgoJICogTmVjZXNzYXJ5IGJlY2F1c2Ugb2YgcHVsbCB1cCBpbiBDT00zIHBvcnQuCgkgKgoJICogVGhpcyBpcyBqdXN0IGEgcHJlbGltaW5hcnkgZml4LCBpbnRlbmRlZCB0byB0dXJuIG9mZiBURU5BCgkgKiBhcyBzb29uIGFzIHBvc3NpYmxlIHRvIGF2b2lkIG5vaXNlIG9uIHRoZSBuZXR3b3JrLiBPbmNlCgkgKiBJskMgaXMgcnVubmluZyB3ZSB3aWxsIG1ha2Ugc3VyZSB0aGUgaW50ZXJmYWNlIGlzCgkgKiBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuCgkgKi8KCWltbXItPmltX2NwbS5jcF9wYnBhciAmPSB+UEJfRU5FVF9URU5BOwoJaW1tci0+aW1fY3BtLmNwX3Bib2RyICY9IH5QQl9FTkVUX1RFTkE7CglpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJj0gflBCX0VORVRfVEVOQTsJLyogc2V0IHRvIDAgPSBkaXNhYmxlZCAqLwoJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9IFBCX0VORVRfVEVOQTsKCglyZXR1cm4gKDApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICB2b2lkIHJlc2V0X3BoeSAodm9pZCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbm9uZQpQKgpQKiBSZXR1cm52YWx1ZTogIG5vbmUKICoKWiogSW50ZW50aW9uOiAgICBSZXNldCB0aGUgUEhZLiAgSW4gdGhlIGx3bW9uIGNhc2Ugd2UgZG8gdGhpcyBieSB0aGUKWiogICAgICAgICAgICAgICBzaWduYWxpbmcgdGhlIFBJQyBJL08gZXhwYW5kZXIuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgcmVzZXRfcGh5ICh2b2lkKQp7Cgl1Y2hhciBjOwoKI2lmZGVmIERFQlVHCglwcmludGYgKCIjIyMgU3dpdGNoIG9uIEV0aGVybmV0IGZvciBTQ0MyICMjI1xuIik7CiNlbmRpZgoJYyA9IHBpY19yZWFkICgweDYxKTsKI2lmZGVmIERFQlVHCglwcmludGYgKCJPbGQgUElDIHJlYWQ6IHJlZ182MSA9IDB4JTAyeFxuIiwgYyk7CiNlbmRpZgoJYyB8PSAweDQwOwkJCQkJLyogZGlzYWJsZSBDT00zICovCgljICY9IH4weDgwOwkJCQkJLyogZW5hYmxlIEV0aGVybmV0ICovCglwaWNfd3JpdGUgKDB4NjEsIGMpOwojaWZkZWYgREVCVUcKCWMgPSBwaWNfcmVhZCAoMHg2MSk7CglwcmludGYgKCJOZXcgUElDIHJlYWQ6IHJlZ182MSA9IDB4JTAyeFxuIiwgYyk7CiNlbmRpZgoJdWRlbGF5ICgxMDAwKTsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBLZXlib2FyZCBjb250cm9sbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogY29tbWFuZCBjb2RlcyAqLwojZGVmaW5lCUtFWUJEX0NNRF9SRUFEX0tFWVMJMHgwMQojZGVmaW5lIEtFWUJEX0NNRF9SRUFEX1ZFUlNJT04JMHgwMgojZGVmaW5lIEtFWUJEX0NNRF9SRUFEX1NUQVRVUwkweDAzCiNkZWZpbmUgS0VZQkRfQ01EX1JFU0VUX0VSUk9SUwkweDEwCgovKiBzdGF0dXMgY29kZXMgKi8KI2RlZmluZSBLRVlCRF9TVEFUVVNfTUFTSwkweDNGCiNkZWZpbmUJS0VZQkRfU1RBVFVTX0hfUkVTRVQJMHgyMAojZGVmaW5lIEtFWUJEX1NUQVRVU19CUk9XTk9VVAkweDEwCiNkZWZpbmUgS0VZQkRfU1RBVFVTX1dEX1JFU0VUCTB4MDgKI2RlZmluZSBLRVlCRF9TVEFUVVNfT1ZFUkxPQUQJMHgwNAojZGVmaW5lIEtFWUJEX1NUQVRVU19JTExFR0FMX1dSCTB4MDIKI2RlZmluZSBLRVlCRF9TVEFUVVNfSUxMRUdBTF9SRAkweDAxCgovKiBOdW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBLZXlib2FyZCBDb250cm9sbGVyICovCiNkZWZpbmUgS0VZQkRfVkVSU0lPTkxFTgkyCS8qIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KI2RlZmluZQlLRVlCRF9EQVRBTEVOCQk5CS8qIG5vcm1hbCBrZXkgc2NhbiBkYXRhICovCgovKiBtYXhpbXVtIG51bWJlciBvZiAibWFnaWMiIGtleSBjb2RlcyB0aGF0IGNhbiBiZSBhc3NpZ25lZCAqLwoKc3RhdGljIHVjaGFyIGtiZF9hZGRyID0gQ0ZHX0kyQ19LRVlCRF9BRERSOwoKc3RhdGljIHVjaGFyICprZXlfbWF0Y2ggKHVjaGFyICopOwoKI2RlZmluZQlLRVlCRF9TRVRfREVCVUdNT0RFCScjJwkvKiBNYWdpYyBrZXkgdG8gZW5hYmxlIGRlYnVnIG91dHB1dCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGJvYXJkX3Bvc3RjbGtfaW5pdCAodm9pZCkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgbm9uZQpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgaXMgYWx3YXlzIHJldHVybmVkLgogKgpaKiBJbnRlbnRpb246ICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGJvYXJkX3Bvc3RjbGtfaW5pdCgpIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgpaKiAgICAgICAgICAgICAgIGZvciB0aGUgbHdtb24gYm9hcmQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGJvYXJkX3Bvc3RjbGtfaW5pdCAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJa2JkX2luaXQoKTsKCiNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAoJaWYgKGtleV9wcmVzc2VkKCkpIHsKCQlkaXNhYmxlX3B1dGMoKTsJLyogbW9kZW0gZG9lc24ndCB1bmRlcnN0YW5kIGJhbm5lciBldGMgKi8KCQlnZC0+ZG9fbWRtX2luaXQgPSAxOwoJfQojZW5kaWYKCglyZXR1cm4gKDApOwp9CgpzdGF0aWMgdm9pZCBrYmRfaW5pdCAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciB0bXBfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIHZhbCwgZXJyY2Q7CglpbnQgaTsKCglpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CgkKCWdkLT5rYmRfc3RhdHVzID0gMDsKCgkvKiBSZWFkIGluaXRpYWwga2V5Ym9hcmQgZXJyb3IgY29kZSAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfU1RBVFVTOwoJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CglpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsICZlcnJjZCwgMSk7CgkvKiBjbGVhciB1bnVzZWQgYml0cyAqLwoJZXJyY2QgJj0gS0VZQkRfU1RBVFVTX01BU0s7CgkvKiBjbGVhciAiaXJyZWxldmFudCIgYml0cy4gUmVjb21tZW5kZWQgYnkgTWFydGluIFJhamVrLCBMV04gKi8KCWVycmNkICY9IH4oS0VZQkRfU1RBVFVTX0hfUkVTRVR8S0VZQkRfU1RBVFVTX0JST1dOT1VUKTsKCWlmIChlcnJjZCkgewoJCWdkLT5rYmRfc3RhdHVzIHw9IGVycmNkIDw8IDg7Cgl9CgkvKiBSZXNldCBlcnJvciBjb2RlIGFuZCB2ZXJpZnkgKi8KCXZhbCA9IEtFWUJEX0NNRF9SRVNFVF9FUlJPUlM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCXVkZWxheSgxMDAwKTsJLyogZGVsYXkgTkVFREVEIGJ5IGtleWJvYXJkIFBJQyAhISEgKi8KCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9TVEFUVVM7CglpMmNfd3JpdGUgKGtiZF9hZGRyLCAwLCAwLCAmdmFsLCAxKTsKCWkyY19yZWFkIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CgoJdmFsICY9IEtFWUJEX1NUQVRVU19NQVNLOwkvKiBjbGVhciB1bnVzZWQgYml0cyAqLwoJaWYgKHZhbCkgewkJCS8qIHBlcm1hbmVudCBlcnJvciwgcmVwb3J0IGl0ICovCgkJZ2QtPmtiZF9zdGF0dXMgfD0gdmFsOwoJCXJldHVybjsKCX0KCgkvKgoJICogUmVhZCBjdXJyZW50IGtleWJvYXJkIHN0YXRlLgoJICoKICAgICAgICAgKiBBZnRlciB0aGUgZXJyb3IgcmVzZXQgaXQgbWF5IHRha2Ugc29tZSB0aW1lIGJlZm9yZSB0aGUKICAgICAgICAgKiBrZXlib2FyZCBQSUMgcGlja3MgdXAgYSB2YWxpZCBrZXlib2FyZCBzY2FuIC0gdGhlIHRvdGFsCiAgICAgICAgICogc2NhbiB0aW1lIGlzIGFwcHJveC4gMS42IG1zIChpbmZvcm1hdGlvbiBieSBNYXJ0aW4gUmFqZWssCiAgICAgICAgICogMjggU2VwIDIwMDIpLiBXZSByZWFkIGEgY291cGxlIG9mIHRpbWVzIGZvciB0aGUga2V5Ym9hcmQKICAgICAgICAgKiB0byBzdGFiaWxpemUsIHVzaW5nIGEgYmlnIGVub3VnaCBkZWxheS4KICAgICAgICAgKiAxMCB0aW1lcyBzaG91bGQgYmUgZW5vdWdoLiBJZiB0aGUgZGF0YSBpcyBzdGlsbCBjaGFuZ2luZywKICAgICAgICAgKiB3ZSB1c2Ugd2hhdCB3ZSBnZXQgOi0oCgkgKi8KCgltZW1zZXQgKHRtcF9kYXRhLCAweEZGLCBLRVlCRF9EQVRBTEVOKTsJLyogaW1wb3NzaWJsZSB2YWx1ZSAqLwoJZm9yIChpPTA7IGk8MTA7ICsraSkgewoJCXZhbCA9IEtFWUJEX0NNRF9SRUFEX0tFWVM7CgkJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CgkJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgoJCWlmIChtZW1jbXAoa2JkX2RhdGEsIHRtcF9kYXRhLCBLRVlCRF9EQVRBTEVOKSA9PSAwKSB7CgkJCS8qIGNvbnNpc3RlbnQgc3RhdGUsIGRvbmUgKi8KCQkJYnJlYWs7CgkJfQoJCS8qIHJlbWViZXIgbGFzdCBzdGF0ZSwgZGVsYXksIGFuZCByZXRyeSAqLwoJCW1lbWNweSAodG1wX2RhdGEsIGtiZF9kYXRhLCBLRVlCRF9EQVRBTEVOKTsKCQl1ZGVsYXkgKDUwMDApOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgbWlzY19pbml0X3IgKHZvaWQpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIG5vbmUKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwIGlzIGFsd2F5cyByZXR1cm5lZCwgZXZlbiBpbiB0aGUgY2FzZSBvZiBhIGtleWJvYXJkClAqICAgICAgICAgICAgICAgICAgICBlcnJvci4KICoKWiogSW50ZW50aW9uOiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBtaXNjX2luaXRfcigpIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgpaKiAgICAgICAgICAgICAgIGZvciB0aGUgbHdtb24gYm9hcmQuCloqICAgICAgICAgICAgICAgVGhlIGtleWJvYXJkIGNvbnRyb2xsZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHRoZSByZXN1bHQKWiogICAgICAgICAgICAgICBvZiBhIHJlYWQgY29waWVkIHRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAia2V5YmQiLgpaKiAgICAgICAgICAgICAgIElmIEtFWUJEX1NFVF9ERUJVR01PREUgaXMgZGVmaW5lZCwgYSBjaGVjayBpcyBtYWRlIGZvcgpaKiAgICAgICAgICAgICAgIHRoaXMga2V5LCBhbmQgaWYgZm91bmQgZGlzcGxheSB0byB0aGUgTENEIHdpbGwgYmUgZW5hYmxlZC4KWiogICAgICAgICAgICAgICBUaGUga2V5cyBpbiAia2V5YmQiIGFyZSBjaGVja2VkIGFnYWluc3QgdGhlIG1hZ2ljCloqICAgICAgICAgICAgICAga2V5Y29tbWFuZHMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQuCloqICAgICAgICAgICAgICAgU2VlIGFsc28ga2V5X21hdGNoKCkuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBtaXNjX2luaXRfciAodm9pZCkKewoJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgoJdWNoYXIga2JkX2RhdGFbS0VZQkRfREFUQUxFTl07Cgl1Y2hhciBrZXliZF9lbnZbMiAqIEtFWUJEX0RBVEFMRU4gKyAxXTsKCXVjaGFyIGtiZF9pbml0X3N0YXR1cyA9IGdkLT5rYmRfc3RhdHVzID4+IDg7Cgl1Y2hhciBrYmRfc3RhdHVzID0gZ2QtPmtiZF9zdGF0dXM7Cgl1Y2hhciB2YWw7Cgl1Y2hhciAqc3RyOwoJaW50IGk7CgoJaWYgKGtiZF9pbml0X3N0YXR1cykgewoJCXByaW50ZiAoIktFWUJEOiBFcnJvciAlMDJYXG4iLCBrYmRfaW5pdF9zdGF0dXMpOwoJfQoJaWYgKGtiZF9zdGF0dXMpIHsJCS8qIHBlcm1hbmVudCBlcnJvciwgcmVwb3J0IGl0ICovCgkJcHJpbnRmICgiKioqIEtleWJvYXJkIGVycm9yIGNvZGUgJTAyWCAqKipcbiIsIGtiZF9zdGF0dXMpOwoJCXNwcmludGYgKGtleWJkX2VudiwgIiUwMlgiLCBrYmRfc3RhdHVzKTsKCQlzZXRlbnYgKCJrZXliZCIsIGtleWJkX2Vudik7CgkJcmV0dXJuIDA7Cgl9CgoJLyoKCSAqIE5vdyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhIHdvcmtpbmcgIGtleWJvYXJkLCAgc28gIGRpc2FibGUKCSAqIGFsbCBvdXRwdXQgdG8gdGhlIExDRCBleGNlcHQgd2hlbiBhIGtleSBwcmVzcyBpcyBkZXRlY3RlZC4KCSAqLwoKCWlmICgoY29uc29sZV9hc3NpZ24gKHN0ZG91dCwgInNlcmlhbCIpIDwgMCkgfHwKCQkoY29uc29sZV9hc3NpZ24gKHN0ZGVyciwgInNlcmlhbCIpIDwgMCkpIHsKCQlwcmludGYgKCJDYW4ndCBhc3NpZ24gc2VyaWFsIHBvcnQgYXMgb3V0cHV0IGRldmljZVxuIik7Cgl9CgoJLyogUmVhZCBWZXJzaW9uICovCgl2YWwgPSBLRVlCRF9DTURfUkVBRF9WRVJTSU9OOwoJaTJjX3dyaXRlIChrYmRfYWRkciwgMCwgMCwgJnZhbCwgMSk7CglpMmNfcmVhZCAoa2JkX2FkZHIsIDAsIDAsIGtiZF9kYXRhLCBLRVlCRF9WRVJTSU9OTEVOKTsKCXByaW50ZiAoIktFWUJEOiBWZXJzaW9uICVkLiVkXG4iLCBrYmRfZGF0YVswXSwga2JkX2RhdGFbMV0pOwoKCS8qIFJlYWQgY3VycmVudCBrZXlib2FyZCBzdGF0ZSAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfS0VZUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgoJZm9yIChpID0gMDsgaSA8IEtFWUJEX0RBVEFMRU47ICsraSkgewoJCXNwcmludGYgKGtleWJkX2VudiArIGkgKyBpLCAiJTAyWCIsIGtiZF9kYXRhW2ldKTsKCX0KCXNldGVudiAoImtleWJkIiwga2V5YmRfZW52KTsKCglzdHIgPSBzdHJkdXAgKGtleV9tYXRjaCAoa2JkX2RhdGEpKTsJLyogZGVjb2RlIGtleXMgKi8KI2lmZGVmIEtFWUJEX1NFVF9ERUJVR01PREUKCWlmIChrYmRfZGF0YVswXSA9PSBLRVlCRF9TRVRfREVCVUdNT0RFKSB7CS8qIHNldCBkZWJ1ZyBtb2RlICovCgkJaWYgKChjb25zb2xlX2Fzc2lnbiAoc3Rkb3V0LCAibGNkIikgPCAwKSB8fAoJCQkoY29uc29sZV9hc3NpZ24gKHN0ZGVyciwgImxjZCIpIDwgMCkpIHsKCQkJcHJpbnRmICgiQ2FuJ3QgYXNzaWduIExDRCBkaXNwbGF5IGFzIG91dHB1dCBkZXZpY2VcbiIpOwoJCX0KCX0KI2VuZGlmIC8qIEtFWUJEX1NFVF9ERUJVR01PREUgKi8KI2lmZGVmIENPTkZJR19QUkVCT09UCS8qIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlICJwcmVib290IiBjb21tYW5kIG9uIGtleSBtYXRjaCAqLwoJc2V0ZW52ICgicHJlYm9vdCIsIHN0cik7CS8qIHNldCBvciBkZWxldGUgZGVmaW5pdGlvbiAqLwojZW5kaWYgLyogQ09ORklHX1BSRUJPT1QgKi8KCWlmIChzdHIgIT0gTlVMTCkgewoJCWZyZWUgKHN0cik7Cgl9CglyZXR1cm4gKDApOwp9CgojaWZkZWYgQ09ORklHX1BSRUJPT1QKCnN0YXRpYyB1Y2hhciBrYmRfbWFnaWNfcHJlZml4W10gPSAia2V5X21hZ2ljIjsKc3RhdGljIHVjaGFyIGtiZF9jb21tYW5kX3ByZWZpeFtdID0gImtleV9jbWQiOwoKc3RhdGljIGludCBjb21wYXJlX21hZ2ljICh1Y2hhciAqa2JkX2RhdGEsIHVjaGFyICpzdHIpCnsKCXVjaGFyIGNvbXBhcmVbS0VZQkRfREFUQUxFTi0xXTsKCXVjaGFyICpueHQ7CglpbnQgaTsKCgkvKiBEb24ndCBpbmNsdWRlIG1vZGlmaWVyIGJ5dGUgKi8KCW1lbWNweSAoY29tcGFyZSwga2JkX2RhdGErMSwgS0VZQkRfREFUQUxFTi0xKTsKCglmb3IgKDsgc3RyICE9IE5VTEw7IHN0ciA9ICgqbnh0KSA/IG54dCsxIDogbnh0KSB7CgkJdWNoYXIgYzsKCQlpbnQgazsKCgkJYyA9ICh1Y2hhcikgc2ltcGxlX3N0cnRvdWwgKHN0ciwgKGNoYXIgKiopICgmbnh0KSwgMTYpOwoKCQlpZiAoc3RyID09IG54dCkgewkvKiBpbnZhbGlkIGNoYXJhY3RlciAqLwoJCQlicmVhazsKCQl9CgoJCS8qCgkJICogQ2hlY2sgaWYgdGhpcyBrZXkgbWF0Y2hlcyB0aGUgaW5wdXQuCgkJICogU2V0IG1hdGNoZXMgdG8gemVybywgc28gdGhleSBtYXRjaCBvbmx5IG9uY2UKCQkgKiBhbmQgd2UgY2FuIGZpbmQgZHVwbGljYXRlcyBvciBleHRyYSBrZXlzCgkJICovCgkJZm9yIChrID0gMDsgayA8IHNpemVvZihjb21wYXJlKTsgKytrKSB7CgkJCWlmIChjb21wYXJlW2tdID09ICdcMCcpCS8qIG9ubHkgbm9uLXplcm8gZW50cmllcyAqLwoJCQkJY29udGludWU7CgkJCWlmIChjID09IGNvbXBhcmVba10pIHsJLyogZm91bmQgbWF0Y2hpbmcga2V5ICovCgkJCQljb21wYXJlW2tdID0gJ1wwJzsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChrID09IHNpemVvZihjb21wYXJlKSkgewoJCQlyZXR1cm4gLTE7CQkvKiB1bm1hdGNoZWQga2V5ICovCgkJfQoJfQoKCS8qCgkgKiBBIGZ1bGwgbWF0Y2ggbGVhdmVzIG5vIGtleXMgaW4gdGhlIGBjb21wYXJlJyBhcnJheSwKCSAqLwoJZm9yIChpID0gMDsgaSA8IHNpemVvZihjb21wYXJlKTsgKytpKSB7CgkJaWYgKGNvbXBhcmVbaV0pCgkJewoJCQlyZXR1cm4gLTE7CgkJfQoJfQoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBzdGF0aWMgdWNoYXIgKmtleV9tYXRjaCAodWNoYXIgKmtiZF9kYXRhKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICB1Y2hhciAqa2JkX2RhdGEKUCogICAgICAgICAgICAgICAgLSBUaGUga2V5cyB0byBtYXRjaCBhZ2FpbnN0IG91ciBtYWdpYyBkZWZpbml0aW9ucwpQKgpQKiBSZXR1cm52YWx1ZTogIHVjaGFyICoKUCogICAgICAgICAgICAgICAgLSAhPSBOVUxMOiBQb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQocykKUCogICAgICAgICAgICAgICAgICAgICBOVUxMOiBObyBtYWdpYyBpcyBhYm91dCB0byBoYXBwZW4KICoKWiogSW50ZW50aW9uOiAgICBDaGVjayBpZiBwcmVzc2VkIGtleShzKSBtYXRjaCBtYWdpYyBzZXF1ZW5jZSwKWiogICAgICAgICAgICAgICBhbmQgcmV0dXJuIHRoZSBjb21tYW5kIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkocykuCloqCloqICAgICAgICAgICAgICAgSWYgbm8ga2V5IHByZXNzIHdhcyBkZWNvZGVkLCBOVUxMIGlzIHJldHVybmVkLgpaKgpaKiAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGFyZ3VtZW50IHdpbGwgYmUKWiogICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiB3aXRoIHRoZSAibWFnaWMgY2hhcmN0ZXIgY29kZSIgb2YgdGhlCloqICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBrZXkocyksIG9yICdcMCcuCloqCloqICAgICAgICAgICAgICAgTm90ZTogdGhlIHN0cmluZyBwb2ludHMgdG8gc3RhdGljIGVudmlyb25tZW50IGRhdGEKWiogICAgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBiZSBzYXZlZCBiZWZvcmUgeW91IGNhbGwgYW55IGZ1bmN0aW9uIHRoYXQKWiogICAgICAgICAgICAgICAgICAgICBtb2RpZmllcyB0aGUgZW52aXJvbm1lbnQuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB1Y2hhciAqa2V5X21hdGNoICh1Y2hhciAqa2JkX2RhdGEpCnsKCXVjaGFyIG1hZ2ljW3NpemVvZiAoa2JkX21hZ2ljX3ByZWZpeCkgKyAxXTsKCXVjaGFyICpzdWZmaXg7Cgl1Y2hhciAqa2JkX21hZ2ljX2tleXM7CgoJLyoKCSAqIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGRlZmluZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCBjYW4gcGUgYXBwZW5kZWQKCSAqIHRvICJrZXlfbWFnaWMiIHRvIGZvcm0gdGhlIG5hbWVzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CgkgKiBob2xkICJtYWdpYyIga2V5IGNvZGVzLCBpLiBlLiBzdWNoIGtleSBjb2RlcyB0aGF0IGNhbiBjYXVzZQoJICogcHJlLWJvb3QgYWN0aW9ucy4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoIiIpLCB0aGVuIG9ubHkKCSAqICJrZXlfbWFnaWMiIGlzIGNoZWNrZWQgKG9sZCBiZWhhdmlvdXIpOyB0aGUgc3RyaW5nICIxMjUiIGNhdXNlcwoJICogY2hlY2tzIGZvciAia2V5X21hZ2ljMSIsICJrZXlfbWFnaWMyIiBhbmQgImtleV9tYWdpYzUiLCBldGMuCgkgKi8KCWlmICgoa2JkX21hZ2ljX2tleXMgPSBnZXRlbnYgKCJtYWdpY19rZXlzIikpID09IE5VTEwpCgkJa2JkX21hZ2ljX2tleXMgPSAiIjsKCgkvKiBsb29wIG92ZXIgYWxsIG1hZ2ljIGtleXM7CgkgKiB1c2UgJ1wwJyBzdWZmaXggaW4gY2FzZSBvZiBlbXB0eSBzdHJpbmcKCSAqLwoJZm9yIChzdWZmaXg9a2JkX21hZ2ljX2tleXM7ICpzdWZmaXggfHwgc3VmZml4PT1rYmRfbWFnaWNfa2V5czsgKytzdWZmaXgpIHsKCQlzcHJpbnRmIChtYWdpYywgIiVzJWMiLCBrYmRfbWFnaWNfcHJlZml4LCAqc3VmZml4KTsKI2lmIDAKCQlwcmludGYgKCIjIyMgQ2hlY2sgbWFnaWMgXCIlc1wiXG4iLCBtYWdpYyk7CiNlbmRpZgoJCWlmIChjb21wYXJlX21hZ2ljKGtiZF9kYXRhLCBnZXRlbnYobWFnaWMpKSA9PSAwKSB7CgkJCXVjaGFyIGNtZF9uYW1lW3NpemVvZiAoa2JkX2NvbW1hbmRfcHJlZml4KSArIDFdOwoJCQljaGFyICpjbWQ7CgoJCQlzcHJpbnRmIChjbWRfbmFtZSwgIiVzJWMiLCBrYmRfY29tbWFuZF9wcmVmaXgsICpzdWZmaXgpOwoKCQkJY21kID0gZ2V0ZW52IChjbWRfbmFtZSk7CiNpZiAwCgkJCXByaW50ZiAoIiMjIyBTZXQgUFJFQk9PVCB0byAkKCVzKTogXCIlc1wiXG4iLAoJCQkJCWNtZF9uYW1lLCBjbWQgPyBjbWQgOiAiPDxOVUxMPj4iKTsKI2VuZGlmCgkJCSprYmRfZGF0YSA9ICpzdWZmaXg7CgkJCXJldHVybiAoY21kKTsKCQl9Cgl9CiNpZiAwCglwcmludGYgKCIjIyMgRGVsZXRlIFBSRUJPT1RcbiIpOwojZW5kaWYKCSprYmRfZGF0YSA9ICdcMCc7CglyZXR1cm4gKE5VTEwpOwp9CiNlbmRpZiAvKiBDT05GSUdfUFJFQk9PVCAqLwoKLyotLS0tLS0tLS0tLS0tLS1Cb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBQSUMgcmVhZC93cml0ZSAtLS0tLS0tLS0tLS0tLS0qLwoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgaW50IGRvX3BpYyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsCkYqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgUCpBKloqCiAqClAqIFBhcmFtZXRlcnM6ICAgY21kX3RibF90ICpjbWR0cApQKiAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gb3VyIGNvbW1hbmQgdGFibGUgZW50cnkKUCogICAgICAgICAgICAgICBpbnQgZmxhZwpQKiAgICAgICAgICAgICAgICAtIElmIHRoZSBDTURfRkxBR19SRVBFQVQgYml0IGlzIHNldCwgdGhlbiB0aGlzIGNhbGwgaXMKUCogICAgICAgICAgICAgICAgICBhIHJlcGV0aXRpb24KUCogICAgICAgICAgICAgICBpbnQgYXJnYwpQKiAgICAgICAgICAgICAgICAtIEFyZ3VtZW50IGNvdW50ClAqICAgICAgICAgICAgICAgY2hhciAqYXJndltdClAqICAgICAgICAgICAgICAgIC0gQXJyYXkgb2YgdGhlIGFjdHVhbCBhcmd1bWVudHMKUCoKUCogUmV0dXJudmFsdWU6ICBpbnQKUCogICAgICAgICAgICAgICAgLSAwICBUaGUgY29tbWFuZCB3YXMgaGFuZGxlZCBzdWNjZXNzZnVsbHkKUCogICAgICAgICAgICAgICAgICAxICBBbiBlcnJvciBvY2N1cnJlZAogKgpaKiBJbnRlbnRpb246ICAgIEltcGxlbWVudCB0aGUgInBpYyBbcmVhZHx3cml0ZV0iIGNvbW1hbmRzLgpaKiAgICAgICAgICAgICAgIFRoZSByZWFkIHN1YmNvbW1hbmQgdGFrZXMgb25lIGFyZ3VtZW50LCB0aGUgcmVnaXN0ZXIsCloqICAgICAgICAgICAgICAgd2hlcmVhcyB0aGUgd3JpdGUgY29tbWFuZCB0YWtlcyB0d28sIHRoZSByZWdpc3RlciBhbmQKWiogICAgICAgICAgICAgICB0aGUgbmV3IHZhbHVlLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgZG9fcGljIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJdWNoYXIgcmVnLCB2YWw7CgoJc3dpdGNoIChhcmdjKSB7CgljYXNlIDM6CQkJCQkvKiBQSUMgcmVhZCByZWcgKi8KCQlpZiAoc3RyY21wIChhcmd2WzFdLCAicmVhZCIpICE9IDApCgkJCWJyZWFrOwoKCQlyZWcgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwoKCQlwcmludGYgKCJQSUMgcmVhZDogcmVnICUwMng6ICUwMnhcblxuIiwgcmVnLCBwaWNfcmVhZCAocmVnKSk7CgoJCXJldHVybiAwOwoJY2FzZSA0OgkJCQkJLyogUElDIHdyaXRlIHJlZyB2YWwgKi8KCQlpZiAoc3RyY21wIChhcmd2WzFdLCAid3JpdGUiKSAhPSAwKQoJCQlicmVhazsKCgkJcmVnID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKCQl2YWwgPSBzaW1wbGVfc3RydG91bCAoYXJndlszXSwgTlVMTCwgMTYpOwoKCQlwcmludGYgKCJQSUMgd3JpdGU6IHJlZyAlMDJ4IHZhbCAweCUwMng6ICUwMnggPT4gIiwKCQkJCXJlZywgdmFsLCBwaWNfcmVhZCAocmVnKSk7CgkJcGljX3dyaXRlIChyZWcsIHZhbCk7CgkJcHJpbnRmICgiJTAyeFxuXG4iLCBwaWNfcmVhZCAocmVnKSk7CgkJcmV0dXJuIDA7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICBpbnQgZG9fa2JkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKRiogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBjbWRfdGJsX3QgKmNtZHRwClAqICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgY29tbWFuZCB0YWJsZSBlbnRyeQpQKiAgICAgICAgICAgICAgIGludCBmbGFnClAqICAgICAgICAgICAgICAgIC0gSWYgdGhlIENNRF9GTEFHX1JFUEVBVCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgY2FsbCBpcwpQKiAgICAgICAgICAgICAgICAgIGEgcmVwZXRpdGlvbgpQKiAgICAgICAgICAgICAgIGludCBhcmdjClAqICAgICAgICAgICAgICAgIC0gQXJndW1lbnQgY291bnQKUCogICAgICAgICAgICAgICBjaGFyICphcmd2W10KUCogICAgICAgICAgICAgICAgLSBBcnJheSBvZiB0aGUgYWN0dWFsIGFyZ3VtZW50cwpQKgpQKiBSZXR1cm52YWx1ZTogIGludApQKiAgICAgICAgICAgICAgICAtIDAgaXMgYWx3YXlzIHJldHVybmVkLgogKgpaKiBJbnRlbnRpb246ICAgIEltcGxlbWVudCB0aGUgImtiZCIgY29tbWFuZC4KWiogICAgICAgICAgICAgICBUaGUga2V5Ym9hcmQgc3RhdHVzIGlzIHJlYWQuICBUaGUgcmVzdWx0IGlzIHByaW50ZWQgb24KWiogICAgICAgICAgICAgICB0aGUgY29uc29sZSBhbmQgd3JpdHRlbiBpbnRvIHRoZSAia2V5YmQiIGVudmlyb25tZW50CloqICAgICAgICAgICAgICAgdmFyaWFibGUuCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkb19rYmQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQp7Cgl1Y2hhciBrYmRfZGF0YVtLRVlCRF9EQVRBTEVOXTsKCXVjaGFyIGtleWJkX2VudlsyICogS0VZQkRfREFUQUxFTiArIDFdOwoJdWNoYXIgdmFsOwoJaW50IGk7CgojaWYgMCAvKiBEb25lIGluIGtiZF9pbml0ICovCglpMmNfaW5pdCAoQ0ZHX0kyQ19TUEVFRCwgQ0ZHX0kyQ19TTEFWRSk7CiNlbmRpZgoKCS8qIFJlYWQga2V5cyAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfS0VZUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgoJcHV0cyAoIktleXM6Iik7Cglmb3IgKGkgPSAwOyBpIDwgS0VZQkRfREFUQUxFTjsgKytpKSB7CgkJc3ByaW50ZiAoa2V5YmRfZW52ICsgaSArIGksICIlMDJYIiwga2JkX2RhdGFbaV0pOwoJCXByaW50ZiAoIiAlMDJ4Iiwga2JkX2RhdGFbaV0pOwoJfQoJcHV0YyAoJ1xuJyk7CglzZXRlbnYgKCJrZXliZCIsIGtleWJkX2Vudik7CglyZXR1cm4gMDsKfQoKLyogUmVhZCBhbmQgc2V0IExTQiBzd2l0Y2ggKi8KI2RlZmluZSBDRkdfUENfVFhEMV9FTkEJCTB4MDAwOAkJLyogUEMuMTIgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIGludCBkb19sc2IgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLApGKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCBjaGFyICphcmd2W10pIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIGNtZF90YmxfdCAqY21kdHAKUCogICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIG91ciBjb21tYW5kIHRhYmxlIGVudHJ5ClAqICAgICAgICAgICAgICAgaW50IGZsYWcKUCogICAgICAgICAgICAgICAgLSBJZiB0aGUgQ01EX0ZMQUdfUkVQRUFUIGJpdCBpcyBzZXQsIHRoZW4gdGhpcyBjYWxsIGlzClAqICAgICAgICAgICAgICAgICAgYSByZXBldGl0aW9uClAqICAgICAgICAgICAgICAgaW50IGFyZ2MKUCogICAgICAgICAgICAgICAgLSBBcmd1bWVudCBjb3VudApQKiAgICAgICAgICAgICAgIGNoYXIgKmFyZ3ZbXQpQKiAgICAgICAgICAgICAgICAtIEFycmF5IG9mIHRoZSBhY3R1YWwgYXJndW1lbnRzClAqClAqIFJldHVybnZhbHVlOiAgaW50ClAqICAgICAgICAgICAgICAgIC0gMCAgVGhlIGNvbW1hbmQgd2FzIGhhbmRsZWQgc3VjY2Vzc2Z1bGx5ClAqICAgICAgICAgICAgICAgICAgMSAgQW4gZXJyb3Igb2NjdXJyZWQKICoKWiogSW50ZW50aW9uOiAgICBJbXBsZW1lbnQgdGhlICJsc2IgW29ufG9mZl0iIGNvbW1hbmRzLgpaKiAgICAgICAgICAgICAgIFRoZSBsc2IgaXMgc3dpdGNoZWQgYWNjb3JkaW5nIHRvIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYnkKWiogICAgICAgICAgICAgICBieSBzaWduYWxpbmcgdGhlIFBJQyBJL08gZXhwYW5kZXIuCloqICAgICAgICAgICAgICAgQ2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgY3VycmVudCBzZXR0aW5nIGlzCloqICAgICAgICAgICAgICAgcHJpbnRlZC4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRvX2xzYiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCXVjaGFyIHZhbDsKCWltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKCglzd2l0Y2ggKGFyZ2MpIHsKCWNhc2UgMToJCQkJCS8qIGxzYiAtIHByaW50IHNldHRpbmcgKi8KCQl2YWwgPSBwaWNfcmVhZCAoMHg2MCk7CgkJcHJpbnRmICgiTFNCIGlzIG8lc1xuIiwgKHZhbCAmIDB4MjApID8gIm4iIDogImZmIik7CgkJcmV0dXJuIDA7CgljYXNlIDI6CQkJCQkvKiBsc2Igb24gb3IgbHNiIG9mZiAtIHNldCBzd2l0Y2ggKi8KCQl2YWwgPSBwaWNfcmVhZCAoMHg2MCk7CgoJCWlmIChzdHJjbXAgKGFyZ3ZbMV0sICJvbiIpID09IDApIHsKCQkJdmFsIHw9IDB4MjA7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfihDRkdfUENfVFhEMV9FTkEpOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0IHw9IENGR19QQ19UWEQxX0VOQTsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSBDRkdfUENfVFhEMV9FTkE7CgkJfSBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICJvZmYiKSA9PSAwKSB7CgkJCXZhbCAmPSB+MHgyMDsKCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+KENGR19QQ19UWEQxX0VOQSk7CgkJCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gfihDRkdfUENfVFhEMV9FTkEpOwoJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9IENGR19QQ19UWEQxX0VOQTsKCQl9IGVsc2UgewoJCQlicmVhazsKCQl9CgkJcGljX3dyaXRlICgweDYwLCB2YWwpOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CglyZXR1cm4gMTsKfQoKI2VuZGlmIC8qIENGR19DTURfQlNQICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpGKiBGdW5jdGlvbjogICAgIHVjaGFyIHBpY19yZWFkICh1Y2hhciByZWcpIFAqQSpaKgogKgpQKiBQYXJhbWV0ZXJzOiAgIHVjaGFyIHJlZwpQKiAgICAgICAgICAgICAgICAtIFJlZ2lzdGVyIHRvIHJlYWQKUCoKUCogUmV0dXJudmFsdWU6ICB1Y2hhcgpQKiAgICAgICAgICAgICAgICAtIFZhbHVlIHJlYWQgZnJvbSByZWdpc3RlcgogKgpaKiBJbnRlbnRpb246ICAgIFJlYWQgYSByZWdpc3RlciBmcm9tIHRoZSBQSUMgSS9PIGV4cGFuZGVyLgogKgpEKiBEZXNpZ246ICAgICAgIHdkQGRlbnguZGUKQyogQ29kaW5nOiAgICAgICB3ZEBkZW54LmRlClYqIFZlcmlmaWNhdGlvbjogZHp1QGRlbnguZGUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1Y2hhciBwaWNfcmVhZCAodWNoYXIgcmVnKQp7CglyZXR1cm4gKGkyY19yZWdfcmVhZCAoQ0ZHX0kyQ19QSUNJT19BRERSLCByZWcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkYqIEZ1bmN0aW9uOiAgICAgdm9pZCBwaWNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICB1Y2hhciByZWcKUCogICAgICAgICAgICAgICAgLSBSZWdpc3RlciB0byByZWFkClAqICAgICAgICAgICAgICAgdWNoYXIgdmFsClAqICAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gd3JpdGUKUCoKUCogUmV0dXJudmFsdWU6ICBub25lCiAqCloqIEludGVudGlvbjogICAgV3JpdGUgdG8gYSByZWdpc3RlciBvbiB0aGUgUElDIEkvTyBleHBhbmRlci4KICoKRCogRGVzaWduOiAgICAgICB3ZEBkZW54LmRlCkMqIENvZGluZzogICAgICAgd2RAZGVueC5kZQpWKiBWZXJpZmljYXRpb246IGR6dUBkZW54LmRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBwaWNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKQp7CglpMmNfcmVnX3dyaXRlIChDRkdfSTJDX1BJQ0lPX0FERFIsIHJlZywgdmFsKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJvYXJkIENvbnRyb2wgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKRiogRnVuY3Rpb246ICAgICB2b2lkIGJvYXJkX3Bvd2Vyb2ZmICh2b2lkKSBQKkEqWioKICoKUCogUGFyYW1ldGVyczogICBub25lClAqClAqIFJldHVybnZhbHVlOiAgbm9uZQogKgpaKiBJbnRlbnRpb246ICAgIFR1cm4gb2ZmIHRoZSBiYXR0ZXJ5IHBvd2VyIGFuZCBsb29wIGVuZGxlc3MsIHNvIHRoaXMKWiogICAgICAgICAgICAgICBzaG91bGQgYmV0dGVyIGJlIHRoZSBsYXN0IGZ1bmN0aW9uIHlvdSBjYWxsLi4uCiAqCkQqIERlc2lnbjogICAgICAgd2RAZGVueC5kZQpDKiBDb2Rpbmc6ICAgICAgIHdkQGRlbnguZGUKViogVmVyaWZpY2F0aW9uOiBkenVAZGVueC5kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgYm9hcmRfcG93ZXJvZmYgKHZvaWQpCnsKICAgIC8qIFR1cm4gYmF0dGVyeSBvZmYgKi8KICAgICgodm9sYXRpbGUgaW1tYXBfdCAqKUNGR19JTU1SKS0+aW1faW9wb3J0LmlvcF9wY2RhdCAmPSB+KDEgPDwgKDMxIC0gMTMpKTsKCiAgICB3aGlsZSAoMSk7Cn0KCiNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVApzdGF0aWMgaW50IGtleV9wcmVzc2VkKHZvaWQpCnsKCXVjaGFyIGtiZF9kYXRhW0tFWUJEX0RBVEFMRU5dOwoJdWNoYXIgdmFsOwoKCS8qIFJlYWQga2V5cyAqLwoJdmFsID0gS0VZQkRfQ01EX1JFQURfS0VZUzsKCWkyY193cml0ZSAoa2JkX2FkZHIsIDAsIDAsICZ2YWwsIDEpOwoJaTJjX3JlYWQgKGtiZF9hZGRyLCAwLCAwLCBrYmRfZGF0YSwgS0VZQkRfREFUQUxFTik7CgoJcmV0dXJuIChjb21wYXJlX21hZ2ljKGtiZF9kYXRhLCBDT05GSUdfTU9ERU1fS0VZX01BR0lDKSA9PSAwKTsKfQojZW5kaWYJLyogQ09ORklHX01PREVNX1NVUFBPUlQgKi8K