LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qIDMyYml0IC0+IDE2Yml0IC0+IDMyYml0IG1vZGUgc3dpdGNoIGNvZGUgKi8KCi8qCiAqIFN0YWNrIGZyYW1lIGF0IDB4ZTAwCiAqCWUwMCBlYng7CiAqCWUwNCBlY3g7CiAqCWUwOCBlZHg7CiAqCWUwYyBlc2k7CiAqCWUxMCBlZGk7CiAqCWUxNCBlYnA7CiAqCWUxOCBlYXg7CiAqCWUxYyBkczsKICoJZTIwIGVzOwogKgllMjQgZnM7CiAqCWUyOCBnczsKICoJZTJjIG9yaWdfZWF4OwogKgllMzAgZWlwOwogKgllMzQgY3M7CiAqCWUzOCBlZmxhZ3M7CiAqCWUzYyBlc3A7CiAqCWU0MCBzczsKICovCgojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsJCS8qIGFkZHJlc3Mgc2l6ZSBwcmVmaXggMzIgKi8KI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7CQkvKiBvcGVyYW5kIHNpemUgcHJlZml4IDMyICovCgouc2VjdGlvbiAucmVhbG1vZGUsICJheCIKLmNvZGUxNgoJCQkJCQkvKiAxNmJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIGhlcmUgKi8KLmdsb2JsIHJlYWxtb2RlX2VudGVyCnJlYWxtb2RlX2VudGVyOgpvMzIJcHVzaGEKbzMyCXB1c2hmCgljbGkKCXNpZHQJc2F2ZWRfaWR0CglzZ2R0CXNhdmVkX2dkdAoJbW92bAklZXNwLCAlZWF4Cgltb3ZsCSVlYXgsIHNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcAoKCW1vdmwJJDB4MTAsICVlYXgKCW1vdmwJJWVheCwgJWVzcAoJbW92dwkkMHgyOCwgJWF4Cgltb3Z3CSVheCwgJWRzCgltb3Z3CSVheCwgJWVzCgltb3Z3CSVheCwgJWZzCgltb3Z3CSVheCwgJWdzCgoJbGlkdAlyZWFsbW9kZV9pZHRfcHRyCgltb3ZsCSVjcjAsICVlYXgJCQkvKiBHbyBiYWNrIGludG8gcmVhbCBtb2RlIGJ5ICovCglhbmRsCSQweDdmZmZmZmZlLCAlZWF4CQkvKiBjbGVhcmluZyBQRSB0byAwICovCgltb3ZsCSVlYXgsICVjcjAKCWxqbXAJJDB4MCwkZG9fcmVhbG1vZGUJCS8qIHN3aXRjaCB0byByZWFsIG1vZGUgKi8KCmRvX3JlYWxtb2RlOgkJCQkJLyogcmVhbG1vZGUgY29kZSBmcm9tIGhlcmUgKi8KCW1vdncJJWNzLCVheAoJbW92dwklYXgsJWRzCgltb3Z3CSVheCwlZXMKCW1vdncJJWF4LCVmcwoJbW92dwklYXgsJWdzCgoJCQkJCQkvKiBjcmVhdGUgYSB0ZW1wb3Jhcnkgc3RhY2sgKi8KCgltb3Z3CSQweGMwLCAlYXgKCW1vdncJJWF4LCAlc3MKCW1vdncJJDB4MjAwLCAlYXgKCW1vdncJJWF4LCAlc3AKCglwb3BsCSVlYngKCXBvcGwJJWVjeAoJcG9wbAklZWR4Cglwb3BsCSVlc2kKCXBvcGwJJWVkaQoJcG9wbAklZWJwCglwb3BsCSVlYXgKCW1vdmwJJWVheCwgdGVtcF9lYXgKCXBvcGwJJWVheAoJbW92dwklYXgsICVkcwoJcG9wbAklZWF4Cgltb3Z3CSVheCwgJWVzCglwb3BsCSVlYXgKCW1vdncJJWF4LCAlZnMKCXBvcGwJJWVheAoJbW92dwklYXgsICVncwoJcG9wbAklZWF4CQkJCS8qIG9yaWdfZWF4ICovCglwb3BsCSVlYXgKY3MJbW92dwklYXgsIHRlbXBfaXAKCXBvcGwJJWVheApjcwltb3Z3CSVheCwgdGVtcF9jcwpvMzIJcG9wZgoJcG9wbAklZWF4Cglwb3B3CSVzcwoJbW92bAklZWF4LCAlZXNwCmNzCW1vdmwJdGVtcF9lYXgsICVlYXgKCXdiaW52ZAkJCQkJLyogc2VsZi1tb2RpZnlpbmcgY29kZSwKCQkJCQkJICogYmV0dGVyIGZsdXNoIHRoZSBjYWNoZSAqLwoKCS5ieXRlCTB4OWEJCQkJLyogbGNhbGwgKi8KdGVtcF9pcDoKCS53b3JkCTAJCQkJLyogbmV3IGlwICovCnRlbXBfY3M6Cgkud29yZAkwCQkJCS8qIG5ldyBjcyAqLwpyZWFsbW9kZV9yZXQ6CgkJCQkJCS8qIHNhdmUgZWF4LCBlc3AgYW5kIHNzICovCmNzCW1vdmwJJWVheCwgc2F2ZWRfZWF4Cgltb3ZsCSVlc3AsICVlYXgKY3MJbW92bAklZWF4LCBzYXZlZF9lc3AKCW1vdncJJXNzLCAlYXgKY3MJbW92dwklYXgsIHNhdmVkX3NzCgoJLyogcmVzdG9yZSB0aGUgc3RhY2ssIG5vdGUgdGhhdCB3ZSBzZXQgc3AgdG8gMHgyNDQ7CgkgKiBwdF9yZWdzIGlzIDB4NDQgYnl0ZXMgbG9uZyBhbmQgd2UgcHVzaCB0aGUgc3RydWN0dXJlCgkgKiBiYWNrd2FyZHMgb24gdG8gdGhlIHN0YWNrLCBib3R0b20gZmlyc3QgKi8KCgltb3Z3CSQweGMwLCAlYXgKCW1vdncJJWF4LCAlc3MKCW1vdncJJDB4MjQ0LCAlYXgKCW1vdncJJWF4LCAlc3AKCgl4b3JsCSVlYXgsJWVheApjcwltb3Z3CXNhdmVkX3NzLCAlYXgKCXB1c2hsCSVlYXgKY3MJbW92bAlzYXZlZF9lc3AsICVlYXgKCXB1c2hsCSVlYXgKbzMyCXB1c2hmCgl4b3JsCSVlYXgsJWVheApjcwltb3Z3CXRlbXBfY3MsICVheAoJcHVzaGwJJWVheApjcwltb3Z3CXRlbXBfaXAsICVheAoJcHVzaGwJJWVheAoJcHVzaGwJJDAKCW1vdncJJWdzLCAlYXgKCXB1c2hsCSVlYXgKCW1vdncJJWZzLCAlYXgKCXB1c2hsCSVlYXgKCW1vdncJJWVzLCAlYXgKCXB1c2hsCSVlYXgKCW1vdncJJWRzLCAlYXgKCXB1c2hsCSVlYXgKCW1vdmwJc2F2ZWRfZWF4LCAlZWF4CglwdXNobAklZWF4CglwdXNobAklZWJwCglwdXNobAklZWRpCglwdXNobAklZXNpCglwdXNobAklZWR4CglwdXNobAklZWN4CglwdXNobAklZWJ4CgpvMzIgY3MJbGlkdAlzYXZlZF9pZHQKbzMyIGNzCWxnZHQJc2F2ZWRfZ2R0CQkJLyogU2V0IEdEVFIgKi8KCgltb3ZsCSVjcjAsICVlYXgJCQkvKiBHbyBiYWNrIGludG8gcHJvdGVjdGVkIG1vZGUgKi8KCW9ybAkkMSwlZWF4CS8qIHJlc2V0IFBFIHRvIDEgKi8KCW1vdmwJJWVheCwgJWNyMAoJam1wCW5leHRfbGluZQkJCS8qIGZsdXNoIHByZWZldGNoIHF1ZXVlICovCm5leHRfbGluZToKCW1vdncJJHJldHVybl9wdHIsICVheAoJbW92dwklYXgsJWJwCm8zMiBjcwlsam1wCSooJWJwKQoKLmNvZGUzMgpwcm90ZWN0ZWRfbW9kZToKCW1vdmwJJDB4MTgsJWVheAkJCS8qIHJlbG9hZCBHRFRbM10gKi8KCW1vdncJJWF4LCVmcwkJCQkvKiByZXNldCBGUyAqLwoJbW92dwklYXgsJWRzCQkJCS8qIHJlc2V0IERTICovCgltb3Z3CSVheCwlZ3MJCQkJLyogcmVzZXQgR1MgKi8KCW1vdncJJWF4LCVlcwkJCQkvKiByZXNldCBFUyAqLwoJbW92dwklYXgsJXNzCQkJCS8qIHJlc2V0IFNTICovCgltb3ZsCXNhdmVkX3Byb3RlY3RlZF9tb2RlX2VzcCwgJWVheAoJbW92bAklZWF4LCAlZXNwCglwb3BmCglwb3BhCglyZXQKCnRlbXBfZWF4OgoJLmxvbmcJMAoKc2F2ZWRfc3M6Cgkud29yZAkwCnNhdmVkX2VzcDoKCS5sb25nCTAKc2F2ZWRfZWF4OgoJLmxvbmcJMAoKcmVhbG1vZGVfaWR0X3B0cjoKCS53b3JkCTB4NDAwCgkud29yZAkweDAsIDB4MAoKc2F2ZWRfZ2R0OgoJLndvcmQJMCwgMCwgMCwgMApzYXZlZF9pZHQ6Cgkud29yZAkwLCAwLCAwLCAwCgpzYXZlZF9wcm90ZWN0ZWRfbW9kZV9lc3A6CgkubG9uZwkwCgpyZXR1cm5fcHRyOgoJLmxvbmcJcHJvdGVjdGVkX21vZGUKCS53b3JkCTB4MTAK