LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCgovKiAzMmJpdCAtPiAxNmJpdCAtPiAzMmJpdCBtb2RlIHN3aXRjaCBjb2RlICovCgovKgogKiBTdGFjayBmcmFtZSBhdCAweGUwMAogKgllMDAgZWJ4OwogKgllMDQgZWN4OwogKgllMDggZWR4OwogKgllMGMgZXNpOwogKgllMTAgZWRpOwogKgllMTQgZWJwOwogKgllMTggZWF4OwogKgllMWMgZHM7CiAqCWUyMCBlczsKICoJZTI0IGZzOwogKgllMjggZ3M7CiAqCWUyYyBvcmlnX2VheDsKICoJZTMwIGVpcDsKICoJZTM0IGNzOwogKgllMzggZWZsYWdzOwogKgllM2MgZXNwOwogKgllNDAgc3M7CiAqLwoKI2RlZmluZSBhMzIJCS5ieXRlIDB4Njc7CQkvKiBhZGRyZXNzIHNpemUgcHJlZml4IDMyICovCiNkZWZpbmUgbzMyCQkuYnl0ZSAweDY2OwkJLyogb3BlcmFuZCBzaXplIHByZWZpeCAzMiAqLwoKLnNlY3Rpb24gLnJlYWxtb2RlLCAiYXgiCi5jb2RlMTYKCQkJCQkJLyogMTZiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSBoZXJlICovCi5nbG9ibCByZWFsbW9kZV9lbnRlcgpyZWFsbW9kZV9lbnRlcjoKbzMyCXB1c2hhCm8zMglwdXNoZgoJY2xpCglzaWR0CXNhdmVkX2lkdAoJc2dkdAlzYXZlZF9nZHQKCW1vdmwJJWVzcCwgJWVheAoJbW92bAklZWF4LCBzYXZlZF9wcm90ZWN0ZWRfbW9kZV9lc3AKCgltb3ZsCSQweDEwLCAlZWF4Cgltb3ZsCSVlYXgsICVlc3AKCW1vdncJJDB4MjgsICVheAoJbW92dwklYXgsICVkcwoJbW92dwklYXgsICVlcwoJbW92dwklYXgsICVmcwoJbW92dwklYXgsICVncwoKCWxpZHQJcmVhbG1vZGVfaWR0X3B0cgoJbW92bAklY3IwLCAlZWF4CQkJLyogR28gYmFjayBpbnRvIHJlYWwgbW9kZSBieSAqLwoJYW5kbAkkMHg3ZmZmZmZmZSwgJWVheAkJLyogY2xlYXJpbmcgUEUgdG8gMCAqLwoJbW92bAklZWF4LCAlY3IwCglsam1wCSQweDAsJGRvX3JlYWxtb2RlCQkvKiBzd2l0Y2ggdG8gcmVhbCBtb2RlICovCgpkb19yZWFsbW9kZToJCQkJCS8qIHJlYWxtb2RlIGNvZGUgZnJvbSBoZXJlICovCgltb3Z3CSVjcywlYXgKCW1vdncJJWF4LCVkcwoJbW92dwklYXgsJWVzCgltb3Z3CSVheCwlZnMKCW1vdncJJWF4LCVncwoKCQkJCQkJLyogY3JlYXRlIGEgdGVtcG9yYXJ5IHN0YWNrICovCgoJbW92dwkkMHhjMCwgJWF4Cgltb3Z3CSVheCwgJXNzCgltb3Z3CSQweDIwMCwgJWF4Cgltb3Z3CSVheCwgJXNwCgoJcG9wbAklZWJ4Cglwb3BsCSVlY3gKCXBvcGwJJWVkeAoJcG9wbAklZXNpCglwb3BsCSVlZGkKCXBvcGwJJWVicAoJcG9wbAklZWF4Cgltb3ZsCSVlYXgsIHRlbXBfZWF4Cglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZHMKCXBvcGwJJWVheAoJbW92dwklYXgsICVlcwoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWZzCglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZ3MKCXBvcGwJJWVheAkJCQkvKiBvcmlnX2VheCAqLwoJcG9wbAklZWF4CmNzCW1vdncJJWF4LCB0ZW1wX2lwCglwb3BsCSVlYXgKY3MJbW92dwklYXgsIHRlbXBfY3MKbzMyCXBvcGYKCXBvcGwJJWVheAoJcG9wdwklc3MKCW1vdmwJJWVheCwgJWVzcApjcwltb3ZsCXRlbXBfZWF4LCAlZWF4Cgl3YmludmQJCQkJCS8qIHNlbGYtbW9kaWZ5aW5nIGNvZGUsCgkJCQkJCSAqIGJldHRlciBmbHVzaCB0aGUgY2FjaGUgKi8KCgkuYnl0ZQkweDlhCQkJCS8qIGxjYWxsICovCnRlbXBfaXA6Cgkud29yZAkwCQkJCS8qIG5ldyBpcCAqLwp0ZW1wX2NzOgoJLndvcmQJMAkJCQkvKiBuZXcgY3MgKi8KcmVhbG1vZGVfcmV0OgoJCQkJCQkvKiBzYXZlIGVheCwgZXNwIGFuZCBzcyAqLwpjcwltb3ZsCSVlYXgsIHNhdmVkX2VheAoJbW92bAklZXNwLCAlZWF4CmNzCW1vdmwJJWVheCwgc2F2ZWRfZXNwCgltb3Z3CSVzcywgJWF4CmNzCW1vdncJJWF4LCBzYXZlZF9zcwoKCS8qIHJlc3RvcmUgdGhlIHN0YWNrLCBub3RlIHRoYXQgd2Ugc2V0IHNwIHRvIDB4MjQ0OwoJICogcHRfcmVncyBpcyAweDQ0IGJ5dGVzIGxvbmcgYW5kIHdlIHB1c2ggdGhlIHN0cnVjdHVyZQoJICogYmFja3dhcmRzIG9uIHRvIHRoZSBzdGFjaywgYm90dG9tIGZpcnN0ICovCgoJbW92dwkkMHhjMCwgJWF4Cgltb3Z3CSVheCwgJXNzCgltb3Z3CSQweDI0NCwgJWF4Cgltb3Z3CSVheCwgJXNwCgoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwlzYXZlZF9zcywgJWF4CglwdXNobAklZWF4CmNzCW1vdmwJc2F2ZWRfZXNwLCAlZWF4CglwdXNobAklZWF4Cm8zMglwdXNoZgoJeG9ybAklZWF4LCVlYXgKY3MJbW92dwl0ZW1wX2NzLCAlYXgKCXB1c2hsCSVlYXgKY3MJbW92dwl0ZW1wX2lwLCAlYXgKCXB1c2hsCSVlYXgKCXB1c2hsCSQwCgltb3Z3CSVncywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVmcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVlcywgJWF4CglwdXNobAklZWF4Cgltb3Z3CSVkcywgJWF4CglwdXNobAklZWF4Cgltb3ZsCXNhdmVkX2VheCwgJWVheAoJcHVzaGwJJWVheAoJcHVzaGwJJWVicAoJcHVzaGwJJWVkaQoJcHVzaGwJJWVzaQoJcHVzaGwJJWVkeAoJcHVzaGwJJWVjeAoJcHVzaGwJJWVieAoKbzMyIGNzCWxpZHQJc2F2ZWRfaWR0Cm8zMiBjcwlsZ2R0CXNhdmVkX2dkdAkJCS8qIFNldCBHRFRSICovCgoJbW92bAklY3IwLCAlZWF4CQkJLyogR28gYmFjayBpbnRvIHByb3RlY3RlZCBtb2RlICovCglvcmwJJDEsJWVheAkvKiByZXNldCBQRSB0byAxICovCgltb3ZsCSVlYXgsICVjcjAKCWptcAluZXh0X2xpbmUJCQkvKiBmbHVzaCBwcmVmZXRjaCBxdWV1ZSAqLwpuZXh0X2xpbmU6Cgltb3Z3CSRyZXR1cm5fcHRyLCAlYXgKCW1vdncJJWF4LCVicApvMzIgY3MJbGptcAkqKCVicCkKCi5jb2RlMzIKcHJvdGVjdGVkX21vZGU6Cgltb3ZsCSQweDE4LCVlYXgJCQkvKiByZWxvYWQgR0RUWzNdICovCgltb3Z3CSVheCwlZnMJCQkJLyogcmVzZXQgRlMgKi8KCW1vdncJJWF4LCVkcwkJCQkvKiByZXNldCBEUyAqLwoJbW92dwklYXgsJWdzCQkJCS8qIHJlc2V0IEdTICovCgltb3Z3CSVheCwlZXMJCQkJLyogcmVzZXQgRVMgKi8KCW1vdncJJWF4LCVzcwkJCQkvKiByZXNldCBTUyAqLwoJbW92bAlzYXZlZF9wcm90ZWN0ZWRfbW9kZV9lc3AsICVlYXgKCW1vdmwJJWVheCwgJWVzcAoJcG9wZgoJcG9wYQoJcmV0Cgp0ZW1wX2VheDoKCS5sb25nCTAKCnNhdmVkX3NzOgoJLndvcmQJMApzYXZlZF9lc3A6CgkubG9uZwkwCnNhdmVkX2VheDoKCS5sb25nCTAKCnJlYWxtb2RlX2lkdF9wdHI6Cgkud29yZAkweDQwMAoJLndvcmQJMHgwLCAweDAKCnNhdmVkX2dkdDoKCS53b3JkCTAsIDAsIDAsIDAKc2F2ZWRfaWR0OgoJLndvcmQJMCwgMCwgMCwgMAoKc2F2ZWRfcHJvdGVjdGVkX21vZGVfZXNwOgoJLmxvbmcJMAoKcmV0dXJuX3B0cjoKCS5sb25nCXByb3RlY3RlZF9tb2RlCgkud29yZAkweDEwCg==