LyoKICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKgogKiBcZmlsZSAgcGhOZmNUeXBlcy5oCiAqIFxicmllZiBCYXNpYyB0eXBlIGRlZmluaXRpb25zLgogKgogKiBQcm9qZWN0OiBORkMgTVcgLyBIQUwKICoKICogJERhdGU6IFRodSBKdW4gMjUgMjE6MjQ6NTMgMjAwOSAkCiAqICRBdXRob3I6IGluZzA0ODgwICQKICogJFJldmlzaW9uOiAxLjEzICQKICogJEFsaWFzZXM6IE5GQ19GUkkxLjFfV0s5MjZfUjI4XzEsTkZDX0ZSSTEuMV9XSzkyOF9SMjlfMSxORkNfRlJJMS4xX1dLOTMwX1IzMF8xLE5GQ19GUkkxLjFfV0s5MzRfUFJFUF8xLE5GQ19GUkkxLjFfV0s5MzRfUjMxXzEsTkZDX0ZSSTEuMV9XSzk0MV9QUkVQMSxORkNfRlJJMS4xX1dLOTQxX1BSRVAyLE5GQ19GUkkxLjFfV0s5NDFfMSxORkNfRlJJMS4xX1dLOTQzX1IzMl8xLE5GQ19GUkkxLjFfV0s5NDlfUFJFUDEsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTAsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTMsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTQsTkZDX0ZSSTEuMV9XSzEwMDdfUjMzXzEsTkZDX0ZSSTEuMV9XSzEwMDdfUjMzXzQsTkZDX0ZSSTEuMV9XSzEwMTdfUFJFUDEsTkZDX0ZSSTEuMV9XSzEwMTdfUjM0XzEsTkZDX0ZSSTEuMV9XSzEwMTdfUjM0XzIsTkZDX0ZSSTEuMV9XSzEwMjNfUjM1XzEgJAogKgogKi8KCiNpZm5kZWYgUEhORkNUWVBFUyAvKiAqLwojZGVmaW5lIFBITkZDVFlQRVMgLyogKi8KCi8qKgogKiAgXG5hbWUgTkZDIFR5cGVzCiAqCiAqIEZpbGU6IFxyZWYgcGhOZmNUeXBlcy5oCiAqCiAqLwovKkB7Ki8KI2RlZmluZSBQSE5GQ1RZUEVTX0ZJTEVSRVZJU0lPTiAiJFJldmlzaW9uOiAxLjEzICQiIC8qKjwgXGluZ3JvdXAgZ3JwX2ZpbGVfYXR0cmlidXRlcyAqLwojZGVmaW5lIFBITkZDVFlQRVNfRklMRUFMSUFTRVMgICIkQWxpYXNlczogTkZDX0ZSSTEuMV9XSzkyNl9SMjhfMSxORkNfRlJJMS4xX1dLOTI4X1IyOV8xLE5GQ19GUkkxLjFfV0s5MzBfUjMwXzEsTkZDX0ZSSTEuMV9XSzkzNF9QUkVQXzEsTkZDX0ZSSTEuMV9XSzkzNF9SMzFfMSxORkNfRlJJMS4xX1dLOTQxX1BSRVAxLE5GQ19GUkkxLjFfV0s5NDFfUFJFUDIsTkZDX0ZSSTEuMV9XSzk0MV8xLE5GQ19GUkkxLjFfV0s5NDNfUjMyXzEsTkZDX0ZSSTEuMV9XSzk0OV9QUkVQMSxORkNfRlJJMS4xX1dLOTQzX1IzMl8xMCxORkNfRlJJMS4xX1dLOTQzX1IzMl8xMyxORkNfRlJJMS4xX1dLOTQzX1IzMl8xNCxORkNfRlJJMS4xX1dLMTAwN19SMzNfMSxORkNfRlJJMS4xX1dLMTAwN19SMzNfNCxORkNfRlJJMS4xX1dLMTAxN19QUkVQMSxORkNfRlJJMS4xX1dLMTAxN19SMzRfMSxORkNfRlJJMS4xX1dLMTAxN19SMzRfMixORkNfRlJJMS4xX1dLMTAyM19SMzVfMSAkIiAgICAgLyoqPCBcaW5ncm91cCBncnBfZmlsZV9hdHRyaWJ1dGVzICovCi8qQH0qLwoKI2lmbmRlZiBfV0lOMzIKI2luY2x1ZGUgPHN0ZGludC5oPgojZWxzZQojaW5jbHVkZSA8V2luZG93cy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKCiNpZm5kZWYgbGludXgKLyoqCiAqICBcbmFtZSBCYXNpYyBUeXBlIERlZmluaXRpb25zCiAqCiAqICBDb25zdGFudC1sZW5ndGgtdHlwZSBkZWZpbml0aW9uICgnQzk5KS4KICoKICovCi8qQHsqLwojaWZuZGVmIF9faW50OF90X2RlZmluZWQgLyogKi8KI2RlZmluZSBfX2ludDhfdF9kZWZpbmVkIC8qICovCnR5cGVkZWYgc2lnbmVkICAgY2hhciAgIGludDhfdDsgICAgICAgICAvKio8ICBcaW5ncm91cCBncnBfbmZjX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggYml0IHNpZ25lZCBpbnRlZ2VyICovCiNlbmRpZgoKI2lmbmRlZiBfX2ludDE2X3RfZGVmaW5lZCAvKiAqLwojZGVmaW5lIF9faW50MTZfdF9kZWZpbmVkIC8qICovCnR5cGVkZWYgc2lnbmVkICAgc2hvcnQgIGludDE2X3Q7ICAgICAgICAvKio8IFxpbmdyb3VwIGdycF9uZmNfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2IGJpdCBzaWduZWQgaW50ZWdlciAqLwojZW5kaWYKCiNpZm5kZWYgX19zdGRpbnRfaAojaWZuZGVmIF9faW50MzJfdF9kZWZpbmVkIC8qICovCiNkZWZpbmUgX19pbnQzMl90X2RlZmluZWQgLyogKi8KdHlwZWRlZiBzaWduZWQgICBsb25nICAgaW50MzJfdDsgICAgICAgIC8qKjwgXGluZ3JvdXAgZ3JwX25mY19jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgYml0IHNpZ25lZCBpbnRlZ2VyICovCiNlbmRpZgojZW5kaWYKCiNpZm5kZWYgX191aW50OF90X2RlZmluZWQgLyogKi8KI2RlZmluZSBfX3VpbnQ4X3RfZGVmaW5lZCAvKiAqLwp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OyAgICAgICAgLyoqPCAgXGluZ3JvdXAgZ3JwX25mY19jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggYml0IHVuc2lnbmVkIGludGVnZXIgKi8KI2VuZGlmCgojaWZuZGVmIF9fdWludDE2X3RfZGVmaW5lZCAvKiAqLwojZGVmaW5lIF9fdWludDE2X3RfZGVmaW5lZCAvKiAqLwp0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1aW50MTZfdDsgICAgICAgLyoqPCBcaW5ncm91cCBncnBfbmZjX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiBiaXQgdW5zaWduZWQgaW50ZWdlciAqLwojZW5kaWYKCiNpZm5kZWYgX19zdGRpbnRfaAojaWZuZGVmIF9fdWludDMyX3RfZGVmaW5lZCAvKiAqLwojZGVmaW5lIF9fdWludDMyX3RfZGVmaW5lZCAvKiAqLwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1aW50MzJfdDsgICAgICAgLyoqPCBcaW5ncm91cCBncnBfbmZjX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciAqLwojZW5kaWYKI2VuZGlmCgojZW5kaWYgLyogbGludXggKi8KCiNlbmRpZiAvKiBfV0lOMzIgKi8KCiNpZm5kZWYgVFJVRQojZGVmaW5lIFRSVUUJCQkoMHgwMSkJCQkgIC8qKjwgXGluZ3JvdXAgZ3JwX25mY19jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2ljYWwgVHJ1ZSBWYWx1ZSAqLwojZW5kaWYKCiNpZm5kZWYgRkFMU0UKI2RlZmluZSBGQUxTRQkJCSgweDAwKQkJCSAgLyoqPCBcaW5ncm91cCBncnBfbmZjX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naWNhbCBGYWxzZSBWYWx1ZSAqLwojZW5kaWYKCnR5cGVkZWYgdWludDhfdAkJCXV0ZjhfdDsJCQkvKio8IFxpbmdyb3VwIGdycF9uZmNfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURjggQ2hhcmFjdGVyIFN0cmluZyAqLwoKdHlwZWRlZiB1aW50OF90CQkJYm9vbF90OwkJCS8qKjwgXGluZ3JvdXAgZ3JwX25mY19jb21tb24KCQkJCQkJCQkJCQkJYm9vbGVhbiBkYXRhIHR5cGUgKi8KCnR5cGVkZWYgdWludDE2X3QgICAgICAgIE5GQ1NUQVRVUzsgICAgICAvKio8IFxpbmdyb3VwIGdycF9uZmNfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQyByZXR1cm4gdmFsdWVzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyZWYgcGhOZmNTdGF0dXMuaCBmb3IgZGlmZmVyZW50IHN0YXR1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgKi8KCiNpZm5kZWYgTlVMTAojZGVmaW5lIE5VTEwgICgodm9pZCAqKTApCiNlbmRpZgoKLyogVGhpcyBNYWNybyB0byBiZSB1c2VkIHRvIHJlc29sdmUgVW51c2VkIGFuZCB1bnJlZmVyZW5jZQogKiBjb21waWxlciB3YXJuaW5ncy4gCiAqLwoKI2RlZmluZSBQSE5GQ19VTlVTRURfVkFSSUFCTEUoeCkgZm9yKCh4KT0oeCk7KHgpIT0oeCk7KQoKLypAfSovCgovKioKICoKICogIFxuYW1lIEhBTCBPdmVyYWxsIERlZmluaXRpb25zCiAqCiAqICBEZWZpbml0aW9ucyBhcHBsaWNhYmxlIHRvIGEgdmFyaWV0eSBvZiBwdXJwb3NlcyBhbmQgZnVuY3Rpb25zL2ZlYXR1cmVzLgogKgogKi8KIC8qQHsqLwoKI2RlZmluZSBQSEhBTF9DT01NT05fTUFYX1NUUklOR19MRU5HVEggIDB4NDBVICAgICAvKio8IFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSB2ZW5kb3IgbmFtZSBsZW5ndGggaW4gYnl0ZXMuICovCiNkZWZpbmUgUEhIQUxfVU5LTk9XTl9ERVZJQ0VfVFlQRSAgICAgICAweDAwVSAgIC8qKjwgXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duIGRldmljZSB0eXBlLiAqLwojZGVmaW5lIFBISEFMX1NFUklBTF9ERVZJQ0UgICAgICAgICAgICAgMHgwMVUgIC8qKjwgXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWwgZGV2aWNlIHR5cGUuICAqLwojZGVmaW5lIFBISEFMX1VTQl9ERVZJQ0UgICAgICAgICAgICAgICAgMHgwMlUgICAvKio8IFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCIGRldmljZSB0eXBlLiAqLwojZGVmaW5lIFBISEFMX0kyQ19ERVZJQ0UgICAgICAgICAgICAgICAgMHgwM1UgICAvKio8IFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDIGRldmljZSB0eXBlLiAqLwojZGVmaW5lIFBISEFMX1NQSV9ERVZJQ0UgICAgICAgICAgICAgICAgMHgwNFUgICAvKio8IFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJIGRldmljZSB0eXBlLiAqLwojZGVmaW5lIFBISEFMX1BBUkFMTEVMX0RFVklDRSAgICAgICAgICAgMHgwNVUgICAvKio8IFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWxsZWwgZGV2aWNlIHR5cGUuICovCiNkZWZpbmUgUEhIQUxfTkZDSURfTEVOR1RIICAgICAgICAgICAgICAweDBBVSAgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIE5GQ0lEIDEuLjMuICovCgojZGVmaW5lIFBISEFMX01BWF9EQVRBU0laRSAgICAgICAgICAgICAgMHhGQlUgICAgICAgLyogMjU2ICogTWF4aW11bSBEYXRhIHNpemUgc2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnkgdGhlIEhBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojZGVmaW5lIFBISEFMX0FUUUFfTEVOR1RIICAgICAgICAgICAgICAgMHgwMlUgICAgICAgLyoqPCBBVFFBIGxlbmd0aCAqLwojZGVmaW5lIFBISEFMX01BWF9VSURfTEVOR1RIICAgICAgICAgICAgMHgwQVUgICAgICAgLyoqPCBNYXhpbXVtIFVJRCBsZW5ndGggZXhwZWN0ZWQgKi8KI2RlZmluZSBQSEhBTF9NQVhfQVRSX0xFTkdUSCAgICAgICAgICAgIDB4MzBVICAgICAgIC8qKjwgTWF4aW11bSBBVFJfUkVTIChHZW5lcmFsIEJ5dGVzKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbGVuZ3RoIGV4cGVjdGVkICovCgojZGVmaW5lIFBISEFMX0FUUUJfTEVOR1RIICAgICAgICAgICAgICAgMHgwQlUgICAgICAgLyoqPCBBVFFCIGxlbmd0aCAqLwoKI2RlZmluZSBQSEhBTF9QVVBJX0xFTkdUSCAgICAgICAgICAgICAgIDB4MDRVICAgICAgIC8qKjwgUFVQSSBsZW5ndGggKi8KI2RlZmluZSBQSEhBTF9BUFBfREFUQV9CX0xFTkdUSCAgICAgICAgIDB4MDRVICAgICAgIC8qKjwgQXBwbGljYXRpb24gRGF0YSBsZW5ndGggZm9yIFR5cGUgQiAqLwojZGVmaW5lIFBISEFMX1BST1RfSU5GT19CX0xFTkdUSCAgICAgICAgMHgwM1UgICAgICAgLyoqPCBQcm90b2NvbCBpbmZvIGxlbmd0aCBmb3IgVHlwZSBCICovCiNkZWZpbmUgUEhIQUxfRkVMX1NZU19DT0RFX0xFTiAgICAgICAgICAweDAyVSAgICAgICAvKio8IEZlbGljYSBTeXN0ZW0gQ29kZSBMZW5ndGggKi8KI2RlZmluZSBQSEhBTF9GRUxfSURfTEVOICAgICAgICAgICAgICAgIDB4MDhVICAgICAgIC8qKjwgRmVsaWNhIGN1cnJlbnQgSUQgTGVuZ3RoICovCiNkZWZpbmUgUEhIQUxfRkVMX1BNX0xFTiAgICAgICAgICAgICAgICAweDA4VSAgICAgICAvKio8IEZlbGljYSBjdXJyZW50IFBNIExlbmd0aCAqLwojZGVmaW5lIFBISEFMXzE1NjkzX1VJRF9MRU5HVEggICAgICAgICAgMHgwOFUgICAgICAgLyoqPCBMZW5ndGggb2YgdGhlIEludmVudG9yeSBieXRlcyBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPMTU2OTMgVGFnICovCgojZGVmaW5lIFZFTkRPUl9OQU1FX0xFTiAgICAgICAgICAgICAgICAgMHgxNFUKI2RlZmluZSBNQVhfVFJBTlNGRVJfVU5JVCAgICAgICAgICAgICAgIDB4MjFVIAojZGVmaW5lIFNFU1NJT05JRF9TSVpFICAgICAgICAgICAgICAgICAgMHgwOFUKI2RlZmluZSBNQVhfQUlEX0xFTiAgICAgICAgICAgICAgICAgICAgIDB4MTBVCiNkZWZpbmUgTUFYX1VJQ0NfUEFSQU1fTEVOICAgICAgICAgICAgICAweEZGVQoKI2RlZmluZSBNSUZBUkVfQklUTUFTSyAgICAgICAgICAgICAgICAgIDB4MDhVCiNkZWZpbmUgSVNPXzE0NDQzX0JJVE1BU0sgICAgICAgICAgICAgICAweDIwVQojZGVmaW5lIElTT18xNDQ0M19ERVRFQ1RFRCAgICAgICAgICAgICAgMHgyMFUKI2RlZmluZSBORkNJUF9CSVRNQVNLICAgICAgICAgICAgICAgICAgIDB4NDBVCiNkZWZpbmUgTkZDSVBfREVURUNURUQgICAgICAgICAgICAgICAgICAweDQwVQoKI2RlZmluZSBNQVhfVEFSR0VUX1NVUFBPUlRFRCAgICAgICAgICAgIE1BWF9SRU1PVEVfREVWSUNFUwoKI2RlZmluZSBORkNfSFdfUE42NU4gICAgICAgICAgICAgICAgICAgIDB4MTBVCgojZGVmaW5lIE5YUF9ORkNJUF9ORkNJRDJfSUQgICAgICAgICAgICAgMHgwMUZFVQoKI2RlZmluZSBOWFBfRlVMTF9WRVJTSU9OX0xFTiAgICAgICAgICAgIDB4MEJVCgoKLypAfSovCgoKLyoqCiAqICBcbmFtZSBORkMgc3BlY2lmaWMgVHlwZSBEZWZpbml0aW9ucwogKgogKi8KLypAeyovCgovKioKICogRGF0YSBCdWZmZXIgU3RydWN0dXJlIHRvIGhvbGQgdGhlIERhdGEgQnVmZmVyCiAqCiAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIHRoZSBEYXRhIGluIHRoZSBCdWZmZXIgb2YgdGhlIHNwZWNpZmllZCAKICogc2l6ZS4KICogCiAqLwp0eXBlZGVmIHN0cnVjdCBwaE5mY19zRGF0YV90CnsKICAgIHVpbnQ4X3QgICAgICAgICAgICAgKmJ1ZmZlcjsKICAgIHVpbnQzMl90ICAgICAgICAgICAgbGVuZ3RoOwp9IHBoTmZjX3NEYXRhX3Q7CgovKioKICogXGJyaWVmIFBvc3NpYmxlIEhhcmR3YXJlIENvbmZpZ3VyYXRpb24gZXhwb3NlZCB0byB1cHBlciBsYXllci4KICogVHlwaWNhbGx5IHRoaXMgc2hvdWxkIGJlIGF0IGxlYXN0IHRoZSBjb21tdW5pY2F0aW9uIGxpbmsgKEV4OiJDT00xIiwiQ09NMiIpCiAqIHRoZSBjb250cm9sbGVyIGlzIGNvbm5lY3RlZCB0by4KICovICAgCnR5cGVkZWYgc3RydWN0IHBoTGliTmZjX3NDb25maWdfdAp7CiAgIC8qKiBEZXZpY2Ugbm9kZSBvZiB0aGUgY29udHJvbGxlciAqLwogICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgIGRldmljZU5vZGU7CiAgIC8qKiBUaGUgY2xpZW50IElEICh0aHJlYWQgSUQgb3IgbWVzc2FnZSBxdWV1ZSBJRCkgKi8KICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBuQ2xpZW50SWQ7Cn0gcGhMaWJOZmNfc0NvbmZpZ190LCAqcHBoTGliTmZjX3NDb25maWdfdDsKCgovKiEKICogTkZDIE1lc3NhZ2Ugc3RydWN0dXJlIGNvbnRhaW5zIG1lc3NhZ2Ugc3BlY2lmaWMgZGV0YWlscyBsaWtlCiAqIG1lc3NhZ2UgdHlwZSwgbWVzc2FnZSBzcGVjaWZpYyBkYXRhIGJsb2NrIGRldGFpbHMsIGV0Yy4KICovCnR5cGVkZWYgc3RydWN0IHBoTGliTmZjX01lc3NhZ2VfdAp7CiAgICB1aW50MzJfdCBlTXNnVHlwZTsvKio8IFR5cGUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgcG9zdGVkKi8KICAgIHZvaWQgICAqIHBNc2dEYXRhOy8qKjwgUG9pbnRlciB0byBtZXNzYWdlIHNwZWNpZmljIGRhdGEgYmxvY2sgaW4gY2FzZSBhbnkqLwogICAgdWludDMyX3QgU2l6ZTsvKio8IFNpemUgb2YgdGhlIGRhdGFibG9jayovCn0gcGhMaWJOZmNfTWVzc2FnZV90LCpwcGhMaWJOZmNfTWVzc2FnZV90OwoKCiNpZmRlZiBXSU4zMgojZGVmaW5lIFBIX0xJQk5GQ19NRVNTQUdFX0JBU0UgIChXTV9VU0VSKzB4M0ZGKQojZW5kaWYKLyoqCiAqIERlZmVycmVkIG1lc3NhZ2UuIFRoaXMgbWVzc2FnZSB0eXBlIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdGhyZWFkCiAqIHRvIG5vdGlmeSB0aGF0IGEgZGVmZXJyZWQgY2FsbCBtdXN0IGJlIGludm9rZWQuCiAqLwojZGVmaW5lIFBIX0xJQk5GQ19ERUZFUlJFRENBTExfTVNHCQkJICAoMHgzMTEpCgovKioKICpcYnJpZWYgRGVmZXJyZWQgY2FsbCBkZWNsYXJhdGlvbi4KICogVGhpcyB0eXBlIG9mIEFQSSBpcyBjYWxsZWQgZnJvbSBDbGllbnRBcHBsaWNhdGlvbiAoIG1haW4gdGhyZWFkKSB0byBub3RpZnkgCiAqIHNwZWNpZmljIGNhbGxiYWNrLgogKi8KdHlwZWRlZiAgdm9pZCAoKnBwaExpYk5mY19EZWZlcnJlZENhbGxiYWNrX3QpICh2b2lkKik7Ci8qKgogKlxicmllZiBEZWZlcnJlZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uCiAqIFRoaXMgdHlwZSBvZiBkYXRhIGlzIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZnJvbSBDbGllbnRBcHBsaWNhdGlvbiAobWFpbiB0aHJlYWQpIHRvIHRoZSAKICogY2FsbGJhY2suCiAqLwp0eXBlZGVmICB2b2lkICpwcGhMaWJOZmNfRGVmZXJyZWRQYXJhbWV0ZXJfdDsKLyoqCiAqXGJyaWVmIERlZmVycmVkIG1lc3NhZ2Ugc3BlY2lmaWMgaW5mbyBkZWNsYXJhdGlvbi4KICogVGhpcyB0eXBlIG9mIGluZm9ybWF0aW9uIGlzIHBhY2tlZCBhcyBtZXNzYWdlIGRhdGEgd2hlbiBccmVmIFBIX0xJQk5GQ19ERUZFUlJFRENBTExfTVNHIAogKiB0eXBlIG1lc3NhZ2UgaXMgcG9zdGVkIHRvIG1lc3NhZ2UgaGFuZGxlciB0aHJlYWQuCiAqLyAKdHlwZWRlZiBzdHJ1Y3QgcGhMaWJOZmNfRGVmZXJyZWRDYWxsX3QKewoJCXBwaExpYk5mY19EZWZlcnJlZENhbGxiYWNrX3QgIHBDYWxsYmFjazsvKio8IHBvaW50ZXIgdG8gRGVmZXJyZWQgY2FsbGJhY2sgKi8KCQlwcGhMaWJOZmNfRGVmZXJyZWRQYXJhbWV0ZXJfdCBwUGFyYW1ldGVyOy8qKjwgcG9pbnRlciB0byBEZWZlcnJlZCBwYXJhbWV0ZXIgKi8KfSBwaExpYk5mY19EZWZlcnJlZENhbGxfdDsKCgovKiogXGluZ3JvdXAgIGdycF9oYWxfY29tbW9uCiAqCiAqICBcYnJpZWYgUHJvdG9jb2wgU3VwcG9ydCBJbmZvcm1hdGlvbgogKgogKiAgVGhlIDxlbT4gU3VwcG9ydGVkIFByb3RvY29scyBTdHJ1Y3R1cmUgPC9lbT4gaG9sZHMgYWxsIHByb3RvY29sIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBORkMKICogIGRldmljZS4KICoKICogIFxub3RlIEFsbCBtZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBvdXRwdXQgcGFyYW1ldGVycyBbb3V0XS4KICoKICovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NTdXBQcm90b2NvbF90CnsKICAgIHVuc2lnbmVkIGludCBNaWZhcmVVTCAgICA6IDE7ICAvKio8IFByb3RvY29sIE1pZmFyZSBVbHRyYSBMaWdodCBvciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgTkZDIEZvcnVtIFR5cGUtMiB0YWdzICovCiAgICB1bnNpZ25lZCBpbnQgTWlmYXJlU3RkICAgOiAxOyAgLyoqPCBQcm90b2NvbCBNaWZhcmUgU3RhbmRhcmQuICovCiAgICB1bnNpZ25lZCBpbnQgSVNPMTQ0NDNfNEEgOiAxOyAgLyoqPCBQcm90b2NvbCBJU08xNDQ0My00IFR5cGUgQS4gICovCiAgICB1bnNpZ25lZCBpbnQgSVNPMTQ0NDNfNEIgOiAxOyAgLyoqPCBQcm90b2NvbCBJU08xNDQ0My00IFR5cGUgQi4gICovCiAgICB1bnNpZ25lZCBpbnQgSVNPMTU2OTMgICAgOiAxOyAgLyoqPCBQcm90b2NvbCBJU08xNTY5MyBIaVRhZy4gICovCiAgICB1bnNpZ25lZCBpbnQgRmVsaWNhICAgICAgOiAxOyAgLyoqPCBQcm90b2NvbCBGZWxpY2EuICovCiAgICB1bnNpZ25lZCBpbnQgTkZDICAgICAgICAgOiAxOyAgLyoqPCBQcm90b2NvbCBORkMuICovCiAgICB1bnNpZ25lZCBpbnQgSmV3ZWwgICAgICAgOiAxOyAgLyoqPCBQcm90b2NvbCBJbm5vdmlzaW9uIEpld2VsIFRhZy4gKi8KICAgIC8qKiogVE9ETzogQWRkIFNXUCwgRVRTSSBIQ0kgdG8gdGhpcyBsaXN0ICoqLwp9IHBoTmZjX3NTdXBQcm90b2NvbF90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogKgogKgogKiAgXGJyaWVmIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIE5GQyBEZXZpY2UKICoKICogIFRoZSA8ZW0+IERldmljZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUgPC9lbT4gaG9sZHMgaW5mb3JtYXRpb24KICogIHJlbGF0ZWQgdG8gdGhlIE5GQyBJQyByZWFkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0aW1lLiAKICogIEl0IGFsbG93cyB0aGUgY2FsbGVyIGZpcndhcmUsIGhhcmR3YXJlIHZlcnNpb24sIHRoZSBtb2RlbCBpZCwKICogIEhDSSB2ZXJpc29uIHN1cHBvcnRlZCBhbmQgdmVuZG9yIG5hbWUuIFJlZmVyIHRvIHRoZSBORkMgRGV2aWNlIAogKiAgVXNlciBNYW51YWwgb24gaG93IHRvIGludGVycHJldCBlYWNoIG9mIHRoZSB2YWx1ZXMuIEluIGFkZGl0aW9uCiAqICBpdCBhbHNvIGNvbnRhaW5zIGNhcGFiaWxpdGllcyBvZiB0aGUgTkZDIERldmljZSBzdWNoIGFzIHRoZSAKICogIHByb3RvY29scyBzdXBwb3J0ZWQgaW4gUmVhZGVyIGFuZCBlbXVsYXRpb24gbW9kZQogKgogKi8KdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc0RldmljZUNhcGFiaWxpdGllc190CnsKICAgIC8qICovCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBoYWxfdmVyc2lvbjsgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMIDQuMCBWZXJzaW9uIEluZm9ybWF0aW9uLiAqLwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgZndfdmVyc2lvbjsgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlybXdhcmUgVmVyc2lvbiBJbmZvLiAqLwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgaHdfdmVyc2lvbjsgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmUgVmVyc2lvbiBJbmZvLiAqLwogICAgdWludDhfdCAgICAgICAgICAgICAgICAgbW9kZWxfaWQ7ICAgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUMgVmFyaWFudCAuICovCiAgICB1aW50OF90ICAgICAgICAgICAgICAgICBoY2lfdmVyc2lvbjsgLyoqPCBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRTSSBIQ0kgVmVyc2lvbiBTdXBwb3J0ZWQgKi8KICAgIHV0ZjhfdCAgICAgICAgICAgICAgICAgIHZlbmRvcl9uYW1lW1ZFTkRPUl9OQU1FX0xFTl07IC8qKjwgXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvciBuYW1lIChOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nKSovCiAgICB1aW50OF90ICAgICAgICAgICAgICAgICBmdWxsX3ZlcnNpb25bTlhQX0ZVTExfVkVSU0lPTl9MRU5dOwoKICAgIHBoTmZjX3NTdXBQcm90b2NvbF90ICAgIFJlYWRlclN1cFByb3RvY29sOyAvKio8IFN1cHBvcnRlZCBwcm90b2NvbHMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCaXRtYXBwZWQpIGluIFJlYWRlciBtb2RlLiAqLwogICAgcGhOZmNfc1N1cFByb3RvY29sX3QgICAgRW11bGF0aW9uU3VwUHJvdG9jb2w7ICAgIC8qKjwgU3VwcG9ydGVkIHByb3RvY29scwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJpdG1hcHBlZCkgaW4gRW11bGF0aW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuICovCiAgICBjaGFyICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZV91cGRhdGVfaW5mbzsgLyoqICovCn0gcGhOZmNfc0RldmljZUNhcGFiaWxpdGllc190OwoKCi8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAqCiAqICBcYnJpZWYgRW51bWVyYXRlZCBNSUZBUkUgQ29tbWFuZHMKICoKICogIFRoZSA8ZW0+IE1pZmFyZSBDb21tYW5kIExpc3QgRW51bWVyYXRvciA8L2VtPiBsaXN0cyBhbGwgYXZhaWxhYmxlIE1pZmFyZSBuYXRpdmUgY29tbWFuZHMuCiAqCiAqIFxub3RlIE5vbmUuCiAqCiAqLwp0eXBlZGVmIGVudW0gcGhOZmNfZU1pZmFyZUNtZExpc3RfdAp7CiAgICBwaE5mY19lTWlmYXJlUmF3ICAgICAgICA9IDB4MDBVLCAgICAgLyoqPCBUaGlzIGNvbW1hbmQgcGVyZm9ybXMgcmF3IHRyYW5zY2F0aW9ucyAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb2YgdGhlIHBoTGliTmZjX3NUcmFuc2NlaXZlSW5mb190IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCBpbiB0aGlzIGNhc2Ugc2hhbGwgYmUgYXMgYmVsb3c6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgY21kOiBmaWxlZCBzaGFsbCBzZXQgdG8gIHBoSGFsX2VNaWZhcmVSYXcgLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAglSAgIGFkZHIgOiBkb2Vzbid0IGNhcnJ5IGFueSBzaWduaWZpY2FuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICBzU2VuZERhdGEgOiBTaGFsbCBjb250YWluIGZvcm1hdHRlZCByYXcgYnVmZmVyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gTUlGQVJFIGNvbW1hbmRzIHR5cGUgdXNlZC4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZWQgYnVmZmVyIHNoYWxsIGZvbGxvdyBiZWxvdyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdGluZyBzY2hlbWUuCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtZFR5cGUrIEJsb2NrIE5vICsgQ29tbWFuZFNwZWNpZmljIGRhdGEgKyAyIGJ5dGUgQ1JDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeDogV2l0aCAgV3JpdGUgIDQgYnl0ZSBjb21tYW5kICBvbiBibG9jayA4ICBsb29rcyBhcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgMHhBMiwweDA4LDB4MDEsMHgwMiwweDAzLDB4MDQsQ1JDMSxDUkMyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSA6ICBGb3IgTUlGQVJFIFN0ZCBjYXJkIHdlIHJlY29tbWVuZCB1c2UgTUlGQVJFIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyBkaXJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBwaE5mY19lTWlmYXJlQXV0aGVudEEgICA9IDB4NjBVLCAgICAgLyoqPCBNaWZhcmUgU3RhbmRhcmQ6XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29tbWFuZCBwZXJmb3JtcyBhbiBhdXRoZW50aWNhdGlvbiB3aXRoIEtFWSBBIGZvciBhIHNlY3Rvci5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IG9mIHRoZSBwaExpYk5mY19zVHJhbnNjZWl2ZUluZm9fdCBjb250ZW50IGluIHRoaXMgY2FzZSBpcyA6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgICAgIGNtZDogZmllbGQgc2hhbGwgc2V0IHRvICBwaEhhbF9lTWlmYXJlQXV0aGVudEEgLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAglSAgICAgICBhZGRyIDogaW5kaWNhdGVzIE1JRkFSRSBibG9jayBhZGRyZXNzLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeDogMHgwOCBpbmRpY2F0ZXMgYmxvY2sgOCBuZWVkcyB0byBiZSBhdXRoZW50aWNhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgICAgIHNTZW5kRGF0YSA6IFNoYWxsIGNvbnRhaW4gYXV0aGVudGljYXRpb24ga2V5IHZhbHVlcy4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1NlbmREYXRhICxidWZmZXIgc2hhbGwgY29udGFpbiBhdXRoZW50aWNhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgdmFsdWVzIDAxIDAyIDAzIDA0IDA1IDA2IGF1dGhlbnRpY2F0ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgMDggd2l0aCB0aGUga2V5IDB4MDFbLi5dMDYuIElmIHRoaXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmYWlscywgdGhlbiAgdXNlciBuZWVkcyB0byByZWFjdGl2YXRlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZW1vdGUgTWlmYXJlIGNhcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHBoTmZjX2VNaWZhcmVBdXRoZW50QiAgID0gMHg2MVUsICAgICAvKio8IE1pZmFyZSBTdGFuZGFyZDpcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21tYW5kIHBlcmZvcm1zIGFuIGF1dGhlbnRpY2F0aW9uIHdpdGggS0VZIEIgZm9yIGEgc2VjdG9yLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb2YgdGhlIHBoTGliTmZjX3NUcmFuc2NlaXZlSW5mb190IGNvbnRlbnQgaW4gdGhpcyBjYXNlIGlzIDogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgY21kOiBmaWVsZCBzaGFsbCBzZXQgdG8gIHBoSGFsX2VNaWZhcmVBdXRoZW50QiAuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgICAgIGFkZHIgOiBpbmRpY2F0ZXMgTUlGQVJFIGJsb2NrIGFkZHJlc3MuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4OiAweDA4IGluZGljYXRlcyBibG9jayA4IG5lZWRzIHRvIGJlIGF1dGhlbnRpY2F0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgc1NlbmREYXRhIDogU2hhbGwgY29udGFpbiBhdXRoZW50aWNhdGlvbiBrZXkgdmFsdWVzLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzU2VuZERhdGEgLGJ1ZmZlciBzaGFsbCBjb250YWluIGF1dGhlbnRpY2F0aW9uIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSB2YWx1ZXMgMDEgMDIgMDMgMDQgMDUgMDYgYXV0aGVudGljYXRlcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayAwOCB3aXRoIHRoZSBrZXkgMHgwMVsuLl0wNi4gSWYgdGhpcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZhaWxzLCB0aGVuICB1c2VyIG5lZWRzIHRvIHJlYWN0aXZhdGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlbW90ZSBNaWZhcmUgY2FyZC4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHBoTmZjX2VNaWZhcmVSZWFkMTYgICAgID0gMHgzMFUsICAgICAvKio8IE1pZmFyZSBTdGFuZGFyZCBhbmQgVWx0cmEgTGlnaHQ6XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgMTYgQnl0ZXMgZnJvbSBhIE1pZmFyZSBTdGFuZGFyZCBibG9jayBvciA0IE1pZmFyZSBVbHRyYSBMaWdodCBwYWdlcy5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IG9mIHRoZSBwaExpYk5mY19zVHJhbnNjZWl2ZUluZm9fdCBjb250ZW50IGluIHRoaXMgY2FzZSBpcyA6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgICAgIGNtZDogZmllbGQgc2hhbGwgc2V0IHRvICBwaEhhbF9lTWlmYXJlUmVhZDE2IC4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgYWRkciA6IG1lbW9yeSBhZHJlc3MgdG8gcmVhZC4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAglSAgICAgICBzUmVjdkRhdGEgOiBTaGFsbCBjb250YWluIGJ1ZmZlciBvZiBzaXplIDE2IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlYWQgdGhlIGRhdGEgaW50by4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGNvbW1hbmQgZmFpbHMsIHRoZSB1c2VyIG5lZWRzIHRvIHJlYWN0aXZhdGUgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlbW90ZSBNaWZhcmUgY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgcGhOZmNfZU1pZmFyZVJlYWQgICAgICAgPSAweDMwVSwKICAgIHBoTmZjX2VNaWZhcmVXcml0ZTE2ICAgID0gMHhBMFUsICAgICAvKio8IE1pZmFyZSBTdGFuZGFyZCBhbmQgVWx0cmEgTGlnaHQ6XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIDE2IEJ5dGVzIHRvIGEgTWlmYXJlIFN0YW5kYXJkIGJsb2NrIG9yIDQgTWlmYXJlIFVsdHJhIExpZ2h0IHBhZ2VzLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb2YgdGhlIHBoTGliTmZjX3NUcmFuc2NlaXZlSW5mb190IGNvbnRlbnQgaW4gdGhpcyBjYXNlIGlzIDogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgY21kOiBmaWVsZCBzaGFsbCBzZXQgdG8gIHBoSGFsX2VNaWZhcmVXcml0ZTE2IC4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgYWRkciA6IHN0YXJ0aW5nIG1lbW9yeSBhZHJlc3MgdG8gd3JpdGUgZnJvbS4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAglSAgICAgICBzU2VuZERhdGEgOiBTaGFsbCBjb250YWluIGJ1ZmZlciBvZiBzaXplIDE2IGNvbnRhaW5pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSBieXRlcyB0byBiZSB3cml0dGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgY29tbWFuZCBmYWlscywgdGhlIHVzZXIgbmVlZHMgdG8gcmVhY3RpdmF0ZSB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVtb3RlIE1pZmFyZSBjYXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgcGhOZmNfZU1pZmFyZVdyaXRlNCAgICAgPSAweEEyVSwgICAgIC8qKjwgTWlmYXJlIFVsdHJhIExpZ2h0OlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZSA0IGJ5dGVzLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb2YgdGhlIHBoTGliTmZjX3NUcmFuc2NlaXZlSW5mb190IGNvbnRlbnQgaW4gdGhpcyBjYXNlIGlzIDogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIJUgICAgICAgY21kOiBmaWVsZCBzaGFsbCBzZXQgdG8gIHBoSGFsX2VNaWZhcmVXcml0ZTQgLiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAglSAgICAgICBhZGRyIDogc3RhcnRpbmcgbWVtb3J5IGFkcmVzcyB0byB3cml0ZSBmcm9tLiAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCVICAgICAgIHNTZW5kRGF0YSA6IFNoYWxsIGNvbnRhaW4gYnVmZmVyIG9mIHNpemUgNCBjb250YWluaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgYnl0ZXMgdG8gYmUgd3JpdHRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGNvbW1hbmQgZmFpbHMsIHRoZSB1c2VyIG5lZWRzIHRvIHJlYWN0aXZhdGUgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlbW90ZSBNaWZhcmUgY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgcGhOZmNfZU1pZmFyZUluYyAgICAgICAgPSAweEMxVSwgICAgIC8qKjwgSW5jcmVtZW50LiAqLwogICAgcGhOZmNfZU1pZmFyZURlYyAgICAgICAgPSAweEMwVSwgICAgIC8qKjwgRGVjcmVtZW50LiAqLwogICAgcGhOZmNfZU1pZmFyZVRyYW5zZmVyICAgPSAweEIwVSwgICAgIC8qKjwgVHJhbmZlci4gICAqLwogICAgcGhOZmNfZU1pZmFyZVJlc3RvcmUgICAgPSAweEMyVSwgICAgIC8qKjwgUmVzdG9yZS4gICAqLwogICAgcGhOZmNfZU1pZmFyZVJlYWRTZWN0b3IgPSAweDM4VSwgICAgIC8qKjwgUmVhZCBTZWN0b3IuICAgKi8KICAgIHBoTmZjX2VNaWZhcmVXcml0ZVNlY3Rvcj0gMHhBOFUsICAgICAvKio8IFdyaXRlIFNlY3Rvci4gICAqLwogICAgcGhOZmNfZU1pZmFyZUludmFsaWRDbWQgPSAweEZGVSAgICAgIC8qKjwgSW52YWxpZCBDb21tYW5kICovCn0gcGhOZmNfZU1pZmFyZUNtZExpc3RfdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICoKICogIFRoZSA8ZW0+IFQ9Q2wgQ29tbWFuZCBMaXN0IEVudW1lcmF0b3IgPC9lbT4gbGlzdHMgYWxsIGF2YWlsYWJsZSBUPUNsIENvbW1hbmRzLgogKgogKiBcbm90ZSBOb25lLgogKgogKi8KdHlwZWRlZiBlbnVtIHBoTmZjX2VJc28xNDQ0M180X0NtZExpc3RfdAp7CiAgICBwaE5mY19lSXNvMTQ0NDNfNF9SYXcgICAgICAgICAgICAgPSAweDAwVSAvKio8IElTTyAxNDQ0My00IEV4Y2hhbmdlIGNvbW1hbmQ6XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBjb21tYW5kIHNlbmRzIHRoZSBkYXRhIGJ1ZmZlciBkaXJlY3RseSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSByZW1vdGUgZGV2aWNlICovCgp9IHBoTmZjX2VJc28xNDQ0M180X0NtZExpc3RfdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICoKICogIFRoZSA8ZW0+IE5GQ0lQMSBDb21tYW5kIExpc3QgRW51bWVyYXRvciA8L2VtPiBsaXN0cyBhbGwgYXZhaWxhYmxlIE5GQ0lQMSBDb21tYW5kcy4KICoKICogXG5vdGUgTm9uZS4KICoKICovCnR5cGVkZWYgZW51bSBwaE5mY19lTmZjSVAxQ21kTGlzdF90CnsKICAgICAgIHBoTmZjX2VOZmNJUDFfUmF3ICAgICAgICAgICAgID0gMHgwMFUgLyoqPCBOZmNJUCBFeGNoYW5nZSBjb21tYW5kOlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgY29tbWFuZCBzZW5kcyB0aGUgZGF0YSBidWZmZXIgZGlyZWN0bHkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlbW90ZSBkZXZpY2UgKi8KfXBoTmZjX2VOZmNJUDFDbWRMaXN0X3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCiAqCiAqICBUaGUgPGVtPiBJU08xNTY5MyBDb21tYW5kIExpc3QgRW51bWVyYXRvciA8L2VtPiBsaXN0cyBhbGwgYXZhaWxhYmxlIElTTzE1NjkzIENvbW1hbmRzLgogKgogKiBcbm90ZSBOb25lLgogKgogKi8KdHlwZWRlZiBlbnVtIHBoTmZjX2VJc28xNTY5M19DbWRMaXN0X3QKewojaWYgMAogICAgcGhOZmNfZUlzbzE1NjkzX1JhdyAgICAgICAgICAgICA9IDB4MDBVLCAvKio8IElTTyAxNTY5MyBFeGNoYW5nZSBSYXcgY29tbWFuZDpcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIGNvbW1hbmQgc2VuZHMgdGhlIGRhdGEgYnVmZmVyIGRpcmVjdGx5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlbW90ZSBkZXZpY2UgKi8KI2VuZGlmCiAgICBwaE5mY19lSXNvMTU2OTNfQ21kICAgICAgICAgICAgID0gMHgyMFUsIC8qKjwgSVNPIDE1NjkzIEV4Y2hhbmdlIGNvbW1hbmQ6XG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBjYXJkIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlbW90ZSBkZXZpY2UgKi8KICAgIHBoTmZjX2VJc28xNTY5M19JbnZhbGlkICAgICAgICAgPSAweEZGVSAgICAgIC8qKjwgSW52YWxpZCBDb21tYW5kICovCn0gcGhOZmNfZUlzbzE1NjkzX0NtZExpc3RfdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9jb21tb24KICoKICogIFRoZSA8ZW0+IEZlbGljYSBDb21tYW5kIExpc3QgRW51bWVyYXRvciA8L2VtPiBsaXN0cyBhbGwgYXZhaWxhYmxlIEZlbGljYSBDb21tYW5kcy4KICoKICogXG5vdGUgTm9uZS4KICoKICovCnR5cGVkZWYgZW51bSBwaE5mY19lRmVsaWNhQ21kTGlzdF90CnsKICAgIHBoTmZjX2VGZWxpY2FfUmF3ICAgICAgICAgICAgID0gMHhGMFUsIC8qKjwgRmVsaWNhIFJhdyBjb21tYW5kOlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgY29tbWFuZCBzZW5kcyB0aGUgZGF0YSBidWZmZXIgZGlyZWN0bHkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcmVtb3RlIGRldmljZSAqLwogICAgcGhOZmNfZUZlbGljYV9DaGVjayAgICAgICAgICAgPSAweDAwLCAvKio8IEZlbGljYSBDaGVjayBjb21tYW5kOlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRoaXMgY29tbWFuZCBjaGVja3MgdGhlIGRhdGEgZnJvbSB0aGUgRmVsaWNhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlIGRldmljZSAqLwogICAgcGhOZmNfZUZlbGljYV9VcGRhdGUgICAgICAgICAgPSAweDAxLCAvKio8IEZlbGljYSBVcGRhdGUgY29tbWFuZDpcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIGNvbW1hbmQgdXBkYXRlcyB0aGUgZGF0YSBvbnRvIHRoZSBGZWxpY2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUgZGV2aWNlICovCiAgICBwaE5mY19lRmVsaWNhX0ludmFsaWQgICAgICAgICA9IDB4RkZVICAgICAgLyoqPCBJbnZhbGlkIENvbW1hbmQgKi8KfSBwaE5mY19lRmVsaWNhQ21kTGlzdF90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogKgogKiAgVGhlIDxlbT4gSmV3ZWwgQ29tbWFuZCBMaXN0IEVudW1lcmF0b3IgPC9lbT4gbGlzdHMgYWxsIGF2YWlsYWJsZSBKZXdlbCBDb21tYW5kcy4KICoKICogXG5vdGUgTm9uZS4KICoKICovCnR5cGVkZWYgZW51bSBwaE5mY19lSmV3ZWxDbWRMaXN0X3QKewogICAgcGhOZmNfZUpld2VsX1JhdyAgICAgICAgICAgID0gMHgwMFUsIC8qKjwgSmV3ZWwgY29tbWFuZDpcbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGlzIGNvbW1hbmQgc2VuZHMgdGhlIGRhdGEgYnVmZmVyIGRpcmVjdGx5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlbW90ZSBkZXZpY2UgKi8KICAgIHBoTmZjX2VKZXdlbF9JbnZhbGlkICAgICAgICA9IDB4RkZVICAvKio8IEludmFsaWQgamV3ZWwgY29tbWFuZCAqLwp9cGhOZmNfZUpld2VsQ21kTGlzdF90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKKgoqICBcYnJpZWYgUmVtb3RlIERldmljZSBSZWFkZXIgQSBSRiBHYXRlIEluZm9ybWF0aW9uIENvbnRhaW5lciAKKgoqICBUaGUgPGVtPiBSZWFkZXIgQSBzdHJ1Y3R1cmUgPC9lbT4gaW5jbHVkZXMgdGhlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgoqICByZWxhdGVkIHRvIHRoZSBkaXNjb3ZlcmVkIElTTzE0NDQzQSByZW1vdGUgZGV2aWNlLiBUaGlzIGluZm9ybWF0aW9uIAoqICBpcyB1cGRhdGVkIGZvciBldmVyeSBkZXZpY2UgZGlzY292ZXJ5LgoqICBcbm90ZSBOb25lLgoqCiovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NJc28xNDQ0M0FJbmZvX3QKewogICAgdWludDhfdCAgICAgICAgIFVpZFtQSEhBTF9NQVhfVUlEX0xFTkdUSF07ICAgICAgLyoqPCBVSUQgaW5mb3JtYXRpb24gb2YgdGhlIFRZUEUgQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIERpc2NvdmVyZWQgKi8KICAgIHVpbnQ4X3QgICAgICAgICBVaWRMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVUlEIGluZm9ybWF0aW9uIGxlbmd0aCwgc2hhbGwgbm90IGJlIGdyZWF0ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIFBISEFMX01BWF9VSURfTEVOR1RIIGkuZS4sIDEwICovCiAgICB1aW50OF90ICAgICAgICAgQXBwRGF0YVtQSEhBTF9NQVhfQVRSX0xFTkdUSF07IC8qKjwgQXBwbGljYXRpb24gZGF0YSBpbmZvcm1hdGlvbiBvZiB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnIGRpc2NvdmVyZWQgKD0gSGlzdG9yaWNhbCBieXRlcyBmb3IgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBBKSAqLyAgCiAgICB1aW50OF90ICAgICAgICAgQXBwRGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIGRhdGEgbGVuZ3RoICovCiAgICB1aW50OF90ICAgICAgICAgU2FrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNBSyBpbmZvcm1hdGlvbm9mIHRoZSBUWVBFIEEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBEaXNjb3ZlcmVkICovCiAgICB1aW50OF90ICAgICAgICAgQXRxQVtQSEhBTF9BVFFBX0xFTkdUSF07ICAgICAgICAvKio8IEFUUUEgaW5mb3JtYXRpb25vZiB0aGUgVFlQRSBBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgRGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIE1heERhdGFSYXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIGRhdGEgcmF0ZSBzdXBwb3J0ZWQgYnkgdGhlIFRZUEUgQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIERpc2NvdmVyZWQgKi8KICAgIHVpbnQ4X3QgICAgICAgICBGd2lfU2ZndDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgd2FpdGluZyB0aW1lIGFuZCBzdGFydCB1cCBmcmFtZSBndWFyZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgYXMgZGVmaW5lZCBpbiBJU08vSUVDIDE0NDQzLTRbN10gZm9yIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBBICovCn0gcGhOZmNfc0lzbzE0NDQzQUluZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFJlbW90ZSBEZXZpY2UgUmVhZGVyIEIgUkYgR2F0ZSBJbmZvcm1hdGlvbiBDb250YWluZXIgCioKKiAgVGhlIDxlbT4gUmVhZGVyIEIgc3RydWN0dXJlIDwvZW0+IGluY2x1ZGVzIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24KKiAgcmVsYXRlZCB0byB0aGUgZGlzY292ZXJlZCBJU08xNDQ0M0IgcmVtb3RlIGRldmljZS4gVGhpcyBpbmZvcm1hdGlvbiAKKiAgaXMgdXBkYXRlZCBmb3IgZXZlcnkgZGV2aWNlIGRpc2NvdmVyeS4KKiAgXG5vdGUgTm9uZS4KKgoqLwp0eXBlZGVmIHN0cnVjdCBwaE5mY19zSXNvMTQ0NDNCSW5mb190IAp7CiAgICB1bmlvbiBwaE5mY191QXRxQkluZm8KICAgIHsKICAgICAgICBzdHJ1Y3QgcGhOZmNfc0F0cUJJbmZvCiAgICAgICAgewogICAgICAgICAgICB1aW50OF90ICAgICAgICAgUHVwaVtQSEhBTF9QVVBJX0xFTkdUSF07ICAgICAgICAgICAgLyoqPCBQVVBJIGluZm9ybWF0aW9uICBvZiB0aGUgVFlQRSBCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIERpc2NvdmVyZWQgKi8KICAgICAgICAgICAgdWludDhfdCAgICAgICAgIEFwcERhdGFbUEhIQUxfQVBQX0RBVEFfQl9MRU5HVEhdOyAgIC8qKjwgQXBwbGljYXRpb24gRGF0YSAgb2YgdGhlIFRZUEUgQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBEaXNjb3ZlcmVkICovCiAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICBQcm90SW5mb1tQSEhBTF9QUk9UX0lORk9fQl9MRU5HVEhdOyAvKio8IFByb3RvY29sIEluZm9ybWF0aW9uICBvZiB0aGUgVFlQRSBCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnIERpc2NvdmVyZWQgKi8KICAgICAgICB9IEF0cVJlc0luZm87CiAgICAgICAgdWludDhfdCAgICAgICAgIEF0cVJlc1tQSEhBTF9BVFFCX0xFTkdUSF07ICAgICAgICAgIC8qKjwgQVRRQiBSZXNwb25zZSBJbmZvcm1hdGlvbiBvZiBUWVBFIEIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBEaXNjb3ZlcmVkICovCiAgICB9IEF0cUI7CiAgICB1aW50OF90ICAgICAgICAgSGlMYXllclJlc3BbUEhIQUxfTUFYX0FUUl9MRU5HVEhdOyAgLyoqPCBIaWdoZXIgTGF5ZXIgUmVzcG9uc2UgaW5mb3JtYXRpb24gIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW5zd2VyIHRvIEFUUlJJQiBDb21tYW5kIGZvciBUeXBlIEIgKi8gIAogICAgdWludDhfdCAgICAgICAgIEhpTGF5ZXJSZXNwTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qKjwgSGlnaGVyIExheWVyIFJlc3BvbnNlIGxlbmd0aCAqLwogICAgdWludDhfdCAgICAgICAgIEFmaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gRmFtaWx5IElkZW50aWZpZXIgb2YgVFlQRSBCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgRGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIE1heERhdGFSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBkYXRhIHJhdGUgc3VwcG9ydGVkIGJ5IHRoZSBUWVBFIEIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBEaXNjb3ZlcmVkICovCn0gcGhOZmNfc0lzbzE0NDQzQkluZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFJlbW90ZSBEZXZpY2UgUmVhZGVyIEIgcHJpbWUgUkYgR2F0ZSBJbmZvcm1hdGlvbiBDb250YWluZXIgCioKKi8KdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc0lzbzE0NDQzQlByaW1lSW5mb190IAp7CiAgICAvKiBUT0RPOiBUaGlzIHdpbGwgYmUgdXBkYXRlZCBsYXRlciAqLwogICAgdm9pZCAqQlByaW1lQ3R4dDsKfSBwaE5mY19zSXNvMTQ0NDNCUHJpbWVJbmZvX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfbmZjaQoqCiogIFxicmllZiBSZW1vdGUgRGV2aWNlIEpld2VsIFJlYWRlciBSRiBHYXRlIEluZm9ybWF0aW9uIENvbnRhaW5lciAKKgoqICBUaGUgPGVtPiBKZXdlbCBSZWFkZXIgc3RydWN0dXJlIDwvZW0+IGluY2x1ZGVzIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24KKiAgcmVsYXRlZCB0byB0aGUgZGlzY292ZXJlZCBKZXdlbCByZW1vdGUgZGV2aWNlLiBUaGlzIGluZm9ybWF0aW9uIAoqICBpcyB1cGRhdGVkIGZvciBldmVyeSBkZXZpY2UgZGlzY292ZXJ5LgoqICBcbm90ZSBOb25lLgoqCiovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NKZXdlbEluZm9fdCAKewogICAgdWludDhfdCAgICAgICAgIFVpZFtQSEhBTF9NQVhfVUlEX0xFTkdUSF07ICAgICAgLyoqPCBVSUQgaW5mb3JtYXRpb24gb2YgdGhlIFRZUEUgQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgRGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIFVpZExlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVSUQgaW5mb3JtYXRpb24gbGVuZ3RoLCBzaGFsbCBub3QgYmUgZ3JlYXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gUEhIQUxfTUFYX1VJRF9MRU5HVEggaS5lLiwgMTAgKi8KICAgIHVpbnQ4X3QgICAgICAgICBIZWFkZXJSb20wOyAvKio8IEhlYWRlciBSb20gYnl0ZSB6ZXJvICovCiAgICB1aW50OF90ICAgICAgICAgSGVhZGVyUm9tMTsgLyoqPCBIZWFkZXIgUm9tIGJ5dGUgb25lICovCgp9IHBoTmZjX3NKZXdlbEluZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFJlbW90ZSBEZXZpY2UgRmVsaWNhIFJlYWRlciBSRiBHYXRlIEluZm9ybWF0aW9uIENvbnRhaW5lciAKKgoqICBUaGUgPGVtPiBGZWxpY2EgUmVhZGVyIHN0cnVjdHVyZSA8L2VtPiBpbmNsdWRlcyB0aGUgYXZhaWxhYmxlIGluZm9ybWF0aW9uCiogIHJlbGF0ZWQgdG8gdGhlIGRpc2NvdmVyZWQgRmVsaWNhIHJlbW90ZSBkZXZpY2UuIFRoaXMgaW5mb3JtYXRpb24gCiogIGlzIHVwZGF0ZWQgZm9yIGV2ZXJ5IGRldmljZSBkaXNjb3ZlcnkuCiogIFxub3RlIE5vbmUuCioKKi8KdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc0ZlbGljYUluZm9fdAp7CiAgICB1aW50OF90ICAgICBJRG1bKFBISEFMX0ZFTF9JRF9MRU4gKyAyKV07ICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgSUQgb2YgRmVsaWNhIHRhZyAqLwogICAgdWludDhfdCAgICAgSURtTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJRG0gbGVuZ3RoLCBzaGFsbCBub3QgYmUgZ3JlYXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gUEhIQUxfRkVMX0lEX0xFTiBpLmUuLCA4ICovCiAgICB1aW50OF90ICAgICBQTW1bUEhIQUxfRkVMX1BNX0xFTl07ICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgUE0gb2YgRmVsaWNhIHRhZyAqLwogICAgdWludDhfdCAgICAgU3lzdGVtQ29kZVtQSEhBTF9GRUxfU1lTX0NPREVfTEVOXTsgLyoqPCBTeXN0ZW0gY29kZSBvZiBGZWxpY2EgdGFnICovCn0gcGhOZmNfc0ZlbGljYUluZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFJlbW90ZSBEZXZpY2UgUmVhZGVyIDE1NjkzIFJGIEdhdGUgSW5mb3JtYXRpb24gQ29udGFpbmVyIAoqCiogIFRoZSA8ZW0+IFJlYWRlciBBIHN0cnVjdHVyZSA8L2VtPiBpbmNsdWRlcyB0aGUgYXZhaWxhYmxlIGluZm9ybWF0aW9uCiogIHJlbGF0ZWQgdG8gdGhlIGRpc2NvdmVyZWQgSVNPMTU2OTMgcmVtb3RlIGRldmljZS4gVGhpcyBpbmZvcm1hdGlvbiAKKiAgaXMgdXBkYXRlZCBmb3IgZXZlcnkgZGV2aWNlIGRpc2NvdmVyeS4KKiAgXG5vdGUgTm9uZS4KKgoqLwoKdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc0lzbzE1NjkzSW5mb190CnsKICAgIHVpbnQ4X3QgICAgICAgICBVaWRbUEhIQUxfMTU2OTNfVUlEX0xFTkdUSF07ICAgICAgLyoqPCBVSUQgaW5mb3JtYXRpb24gb2YgdGhlIDE1NjkzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWcgRGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIFVpZExlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVSUQgaW5mb3JtYXRpb24gbGVuZ3RoLCBzaGFsbCBub3QgYmUgZ3JlYXRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gUEhIQUxfMTU2OTNfVUlEX0xFTkdUSCBpLmUuLCA4ICovCiAgICB1aW50OF90ICAgICAgICAgRHNmaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERTRiBpbmZvcm1hdGlvbiBvZiB0aGUgMTU2OTMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyBEaXNjb3ZlcmVkICovCiAgICB1aW50OF90ICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZm9ybWF0aW9uIGFib3V0IHRoZSBGbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSAxNTY5MyBUYWcgRGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIEFmaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBGYW1pbHkgSWRlbnRpZmllciBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU2OTMgVGFnIERpc2NvdmVyZWQgKi8KfSBwaE5mY19zSXNvMTU2OTNJbmZvX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfbmZjaQoqCiogIFxicmllZiBORkMgRGF0YSBSYXRlIFN1cHBvcnRlZCBiZXR3ZWVuIHRoZSBSZWFkZXIgYW5kIHRoZSBUYXJnZXQKKgoqICBUaGUgPGVtPiBccmVmIHBoSGFsTmZjX2VEYXRhUmF0ZSBlbnVtIDwvZW0+IGxpc3RzIGFsbCB0aGUgRGF0YSBSYXRlIAoqICB2YWx1ZXMgdG8gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIGRhdGEgaXMgdHJhbnNtaXR0ZWQKKiAgdG8gdGhlIHRhcmdldC4KKgoqICBcbm90ZSBOb25lLgoqLwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKKgoqICBcYnJpZWYgTkZDSVAxIERhdGEgcmF0ZXMgCioKKi8KdHlwZWRlZiBlbnVtIHBoTmZjX2VEYXRhUmF0ZV90ewogICAgcGhOZmNfZURhdGFSYXRlXzEwNiAgICA9IDB4MDBVLCAKICAgIHBoTmZjX2VEYXRhUmF0ZV8yMTIsIAogICAgcGhOZmNfZURhdGFSYXRlXzQyNCwgCiAgICAvKiBwaE5mY19lRGF0YVJhdGVfODQ4LCAKICAgIHBoTmZjX2VEYXRhUmF0ZV8xNjk2LCAKICAgIHBoTmZjX2VEYXRhUmF0ZV8zMzkyLCAKICAgIHBoTmZjX2VEYXRhUmF0ZV82Nzg0LCovCiAgICBwaE5mY19lRGF0YVJhdGVfUkZVIAp9IHBoTmZjX2VEYXRhUmF0ZV90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKKgoqICBcYnJpZWYgTkZDSVAxIEdhdGUgSW5mb3JtYXRpb24gQ29udGFpbmVyIAoqCiogIFRoZSA8ZW0+IE5GQ0lQMSBzdHJ1Y3R1cmUgPC9lbT4gaW5jbHVkZXMgdGhlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgoqICByZWxhdGVkIHRvIHRoZSBkaXNjb3ZlcmVkIE5GQ0lQMSByZW1vdGUgZGV2aWNlLiBUaGlzIGluZm9ybWF0aW9uIAoqICBpcyB1cGRhdGVkIGZvciBldmVyeSBkZXZpY2UgZGlzY292ZXJ5LgoqICBcbm90ZSBOb25lLgoqCiovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NOZmNJUEluZm9fdCAKewogICAgLyogQ29udGFpbnMgdGhlIHJhbmRvbSBORkNJRDNJIGNvbnZleWVkIHdpdGggdGhlIEFUUl9SRVEuIAogICAgICAgIGFsd2F5cyAxMCBieXRlcyBsZW5ndGggCiAgICAgICAgb3IgY29udGFpbnMgdGhlIHJhbmRvbSBORkNJRDNUIGNvbnZleWVkIHdpdGggdGhlIEFUUl9SRVMuCiAgICAgICAgYWx3YXlzIDEwIGJ5dGVzIGxlbmd0aCAqLwogICAgdWludDhfdCAgICAgICAgIE5GQ0lEW1BISEFMX01BWF9VSURfTEVOR1RIXTsgICAgCiAgICB1aW50OF90ICAgICAgICAgTkZDSURfTGVuZ3RoOwogICAgLyogQVRSX1JFUyA9IEdlbmVyYWwgYnl0ZXMgbGVuZ3RoLCBNYXggbGVuZ3RoID0gNDggYnl0ZXMgKi8KICAgIHVpbnQ4X3QgICAgICAgICBBVFJJbmZvW1BISEFMX01BWF9BVFJfTEVOR1RIXTsgIAogICAgdWludDhfdCAgICAgICAgIEFUUkluZm9fTGVuZ3RoOwogICAgLyoqPCBTQUsgaW5mb3JtYXRpb24gb2YgdGhlIHRhZyBkaXNjb3ZlcmVkICovCiAgICB1aW50OF90ICAgICAgICAgU2VsUmVzOwogICAgLyoqPCBBVFFBIGluZm9ybWF0aW9uIG9mIHRoZSB0YWcgZGlzY292ZXJlZCAqLwogICAgdWludDhfdCAgICAgICAgIFNlbnNlUmVzW1BISEFMX0FUUUFfTEVOR1RIXTsKICAgIC8qKjwgSXMgRGV0ZWN0aW9uIE1vZGUgb2YgdGhlIE5GQ0lQIFRhcmdldCBBY3RpdmUgKi8KICAgIHVpbnQ4X3QgICAgICAgICBOZmNpcF9BY3RpdmU7CiAgICAvKio8IE1heGltdW0gZnJhbWUgbGVuZ3RoIHN1cHBvcnRlZCBieSB0aGUgTkZDSVAgZGV2aWNlICovICAKICAgIHVpbnQxNl90ICAgICAgICBNYXhGcmFtZUxlbmd0aDsKICAgIC8qKjwgRGF0YSByYXRlIHN1cHBvcnRlZCBieSB0aGUgTkZDSVAgZGV2aWNlICovCiAgICBwaE5mY19lRGF0YVJhdGVfdCAgICAgICAgIE5mY2lwX0RhdGFyYXRlOwoKfSBwaE5mY19zTmZjSVBJbmZvX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfbmZjaQoqCiogIFxicmllZiBSZW1vdGUgRGV2aWNlIFNwZWNpZmljIEluZm9ybWF0aW9uIENvbnRhaW5lcgoqCiogIFRoZSA8ZW0+IFJlbW90ZSBEZXZpY2UgSW5mb3JtYXRpb24gVW5pb24gPC9lbT4gaW5jbHVkZXMgdGhlIGF2YWlsYWJsZSBSZW1vdGUgRGV2aWNlIEluZm9ybWF0aW9uCiogIHN0cnVjdHVyZXMuIEZvbGxvd2luZyB0aGUgZGV2aWNlIGRldGVjdGVkLCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkLgoqCiogIFxub3RlIE5vbmUuCioKKi8KdHlwZWRlZiB1bmlvbiBwaE5mY191UmVtb3RlRGV2SW5mb190CnsKICAgIHBoTmZjX3NJc28xNDQ0M0FJbmZvX3QgICAgICAgICAgSXNvMTQ0NDNBX0luZm87CiAgICBwaE5mY19zSXNvMTQ0NDNCSW5mb190ICAgICAgICAgIElzbzE0NDQzQl9JbmZvOwogICAgcGhOZmNfc0lzbzE0NDQzQlByaW1lSW5mb190ICAgICBJc28xNDQ0M0JQcmltZV9JbmZvOwogICAgcGhOZmNfc05mY0lQSW5mb190ICAgICAgICAgICAgICBOZmNJUF9JbmZvOwogICAgcGhOZmNfc0ZlbGljYUluZm9fdCAgICAgICAgICAgICBGZWxpY2FfSW5mbzsKICAgIHBoTmZjX3NKZXdlbEluZm9fdCAgICAgICAgICAgICAgSmV3ZWxfSW5mbzsKICAgIHBoTmZjX3NJc28xNTY5M0luZm9fdCAgICAgICAgICAgSXNvMTU2OTNfSW5mbzsKfSBwaE5mY191UmVtb3RlRGV2SW5mb190OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKKgoqICBcYnJpZWYgUkYgRGV2aWNlIFR5cGUgTGlzdGluZwoqCiogIFRoZSA8ZW0+IFJGIERldmljZSBUeXBlIExpc3QgPC9lbT4gaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgdHlwZSBvZgoqICByZW1vdGUgZGV2aWNlIHRoYXQgaXMgZGlzY292ZXJlZC9jb25uZWN0ZWQuIFRoZXJlIHNlcGVyYXRlCiogIHR5cGVzIHRvIGlkZW50aWZ5IGEgUmVtb3RlIFJlYWRlciAoZGVub3RlZCBieSBfUENEKSBhbmQgCiogIFJlbW90ZSBUYWcgKGRlbm90ZWQgYnkgX1BJQ0MpCiogIFxub3RlIE5vbmUuCioKKi8KdHlwZWRlZiBlbnVtIHBoTmZjX2VSRkRldlR5cGVfdAp7CiAgICBwaE5mY19lVW5rbm93bl9EZXZUeXBlICAgICAgICA9IDB4MDBVLAoKICAgIC8qIFNwZWNpZmljIFBDRCBEZXZpY2VzICovCiAgICBwaE5mY19lSVNPMTQ0NDNfQV9QQ0QsCiAgICBwaE5mY19lSVNPMTQ0NDNfQl9QQ0QsCiAgICBwaE5mY19lSVNPMTQ0NDNfQlByaW1lX1BDRCwKICAgIHBoTmZjX2VGZWxpY2FfUENELAogICAgcGhOZmNfZUpld2VsX1BDRCwKICAgIHBoTmZjX2VJU08xNTY5M19QQ0QsCiAgICAvKiBHZW5lcmljIFBDRCBUeXBlICovCiAgICBwaE5mY19lUENEX0RldlR5cGUsCgogICAgLyogR2VuZXJpYyBQSUNDIFR5cGUgKi8KICAgIHBoTmZjX2VQSUNDX0RldlR5cGUsCiAgICAvKiBTcGVjaWZpYyBQSUNDIERldmljZXMgKi8KICAgIHBoTmZjX2VJU08xNDQ0M19BX1BJQ0MsCiAgICBwaE5mY19lSVNPMTQ0NDNfNEFfUElDQywKICAgIHBoTmZjX2VJU08xNDQ0M18zQV9QSUNDLAogICAgcGhOZmNfZU1pZmFyZV9QSUNDLAogICAgcGhOZmNfZUlTTzE0NDQzX0JfUElDQywKICAgIHBoTmZjX2VJU08xNDQ0M180Ql9QSUNDLAogICAgcGhOZmNfZUlTTzE0NDQzX0JQcmltZV9QSUNDLAogICAgcGhOZmNfZUZlbGljYV9QSUNDLAogICAgcGhOZmNfZUpld2VsX1BJQ0MsCiAgICBwaE5mY19lSVNPMTU2OTNfUElDQywKCiAgICAvKiBORkMtSVAxIERldmljZSBUeXBlcyAqLwogICAgcGhOZmNfZU5mY0lQMV9UYXJnZXQsIAogICAgcGhOZmNfZU5mY0lQMV9Jbml0aWF0b3IsIAoKICAgIC8qIE90aGVyIFNvdXJjZXMgKi8KICAgIHBoTmZjX2VJbnZhbGlkX0RldlR5cGUKCn0gcGhOZmNfZVJGRGV2VHlwZV90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKKgoqICBcYnJpZWYgUmVtb3RlIERldmljZSBUeXBlIExpc3RpbmcKKgoqICBUaGUgPGVtPiBSZW1vdGUgRGV2aWNlIFR5cGUgTGlzdCA8L2VtPiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mCiogIHJlbW90ZSBkZXZpY2UgdGhhdCBpcyBkaXNjb3ZlcmVkL2Nvbm5lY3RlZAoqICBcbm90ZSBUaGlzIGlzIHNhbWUgYXMgUkYgRGV2aWNlIFR5cGUgTGlzdC4KKgoqLwp0eXBlZGVmIHBoTmZjX2VSRkRldlR5cGVfdCBwaE5mY19lUmVtRGV2VHlwZV90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgogKgogKgogKiAgXGJyaWVmIENvbW1vbiBDb21tYW5kIEF0dHJpYnV0ZQogKgogKiAgVGhlIDxlbT4gSGFsIENvbW1hbmQgVW5pb24gPC9lbT4gaW5jbHVkZXMgZWFjaCBhdmFpbGFibGUgdHlwZSBvZiBDb21tYW5kcy4KICoKICogXG5vdGUgTm9uZS4KICoKICovCnR5cGVkZWYgdW5pb24gcGhOZmNfdUNvbW1hbmRfdAp7CiAgcGhOZmNfZU1pZmFyZUNtZExpc3RfdCAgICAgICAgIE1mQ21kOyAgICAgICAgIC8qKjwgTWlmYXJlIGNvbW1hbmQgc3RydWN0dXJlLiAgKi8KICBwaE5mY19lSXNvMTQ0NDNfNF9DbWRMaXN0X3QgICAgSXNvMTQ0NDM0Q21kOyAgLyoqPCBJU08gMTQ0NDMtNCBjb21tYW5kIHN0cnVjdHVyZS4gICovCiAgcGhOZmNfZUZlbGljYUNtZExpc3RfdCAgICAgICAgIEZlbENtZDsgICAgICAgIC8qKjwgRmVsaWNhIGNvbW1hbmQgc3RydWN0dXJlLiAgKi8KICBwaE5mY19lSmV3ZWxDbWRMaXN0X3QgICAgICAgICAgSmV3ZWxDbWQ7ICAgICAgLyoqPCBKZXdlbCBjb21tYW5kIHN0cnVjdHVyZS4gICovCiAgcGhOZmNfZUlzbzE1NjkzX0NtZExpc3RfdCAgICAgIElzbzE1NjkzQ21kOyAgIC8qKjwgSVNPIDE1NjkzIGNvbW1hbmQgc3RydWN0dXJlLiAgKi8KICBwaE5mY19lTmZjSVAxQ21kTGlzdF90ICAgICAgICAgTmZjSVAxQ21kOyAgICAgLyoqPCBJU08gMTgwOTIgKE5GQ0lQMSkgY29tbWFuZCBzdHJ1Y3R1cmUgKi8KfSBwaE5mY191Q21kTGlzdF90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX25mY2kKICoKICogIFxicmllZiBSZW1vdGUgRGV2aWNlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQogKgogKiAgVGhlIDxlbT4gUmVtb3RlIERldmljZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUgPC9lbT4gaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgb25lIHNpbmdsZSBSZW1vdGUKICogIERldmljZSBkZXRlY3RlZCBieSB0aGUgcG9sbGluZyBmdW5jdGlvbiAuXG4KICogIEl0IGxpc3RzIHBhcmFtZXRlcnMgY29tbW9uIHRvIGFsbCBzdXBwb3J0ZWQgcmVtb3RlIGRldmljZXMuCiAqCiAqICBcbm90ZSAKICoKICogIFxzYSBccmVmIHBoSGFsNE5mY19Db25maWd1cmVEaXNjb3ZlcnkgYW5kIFxyZWYgcGhIYWw0TmZjX0Nvbm5lY3QKICoKICovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NSZW1vdGVEZXZJbmZvcm1hdGlvbl90CnsKICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgIFNlc3Npb25PcGVuZWQ7ICAgICAgIC8qKjwgW291dF0gQm9vbGVhbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRmxhZyBpbmRpY2F0aW5nIHRoZSB2YWxpZGl0eSBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGUgaGFuZGxlIG9mIHRoZSByZW1vdGUgZGV2aWNlLiAqLwogICAgcGhOZmNfZVJlbURldlR5cGVfdCAgICAgICAgUmVtRGV2VHlwZTsgICAgICAgICAgLyoqPCBbb3V0XSBSZW1vdGUgZGV2aWNlIHR5cGUgd2hpY2ggc2F5cyB0aGF0IHJlbW90ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJlYWRlciBBIG9yIFJlYWRlciBCIG9yIE5GQ0lQIG9yIEZlbGljYSBvciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRlciBCIFByaW1lIG9yIEpld2VsKi8KICAgIHBoTmZjX3VSZW1vdGVEZXZJbmZvX3QgICAgIFJlbW90ZURldkluZm87ICAgICAgIC8qKjwgVW5pb24gb2YgYXZhaWxhYmxlIFJlbW90ZSBEZXZpY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFxyZWYgcGhOZmNfdVJlbW90ZURldkluZm9fdCBJbmZvcm1hdGlvbi4gICovCn0gcGhOZmNfc1JlbW90ZURldkluZm9ybWF0aW9uX3Q7CgoKLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KLyogICAgVEFSR0VUIFNUUlVDVFVSRVMgKi8KCgovKiogXGluZ3JvdXAgIGdycF9oYWxfY29tbW9uCiAqCiAqICBcYnJpZWYgVHJhbnNjZWl2ZSBJbmZvcm1hdGlvbiBEYXRhIFN0cnVjdHVyZSBmb3Igc2VuZGluZyBjb21tYW5kcy9yZXNwb25zZSAKICogICAgICAgICB0byB0aGUgcmVtb3RlIGRldmljZQogKgogKiAgVGhlIDxlbT4gVHJhbnNjZWl2ZSBJbmZvcm1hdGlvbiBEYXRhIFN0cnVjdHVyZSA8L2VtPiBpcyB1c2VkIHRvIHBhc3MgdGhlIAogKiAgQ29tbWFuZCwgQWRkcmVzcyAob25seSByZXF1aXJlZCBmb3IgTUlGQVJFKSBhbmQgdGhlIHNlbmQgYW5kIHJlY2VpdmUgZGF0YQogKiAgZGF0YSBzdHJ1Y3R1cmUgKGJ1ZmZlciBhbmQgbGVuZ3RoKSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHJlbW90ZSBkZXZpY2UKICoKICoKICovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NUcmFuc2NlaXZlSW5mb190CnsKICAgIHBoTmZjX3VDbWRMaXN0X3QgICAgICAgICAgICAgICAgY21kOwoKICAgIC8qKiBcaW50ZXJuYWwgQWRkcmVzcyBGaWVsZCByZXF1aXJlZCBmb3Igb25seSBNaWZhcmUKICAgICAqICBGYW1pbHkgUHJvcHJpZXRhcnkgQ2FyZHMuCiAgICAgKiAgVGhlIEFkZHJlc3MgU2l6ZSBpcyBWYWxpZCBvbmx5IHVwdG8gMjU1IEJsb2NrcyBsaW1pdAogICAgICogIGk6ZSBmb3IgTWlmYXJlIDRLCiAgICAgKi8KICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjsKICAgIHBoTmZjX3NEYXRhX3QgICAgICAgICAgICAgICAgICAgc1NlbmREYXRhOwogICAgcGhOZmNfc0RhdGFfdCAgICAgICAgICAgICAgICAgICBzUmVjdkRhdGE7Cn0gcGhOZmNfc1RyYW5zY2VpdmVJbmZvX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfbmZjaQoqCiogIFxicmllZiBQb2xsIERldmljZSBJbmZvcm1hdGlvbiBmb3IgY29uaWZpZ3VyaW5nIHRoZSBkaXNjb3Zlcnkgd2hlZWwKICAgICAgICAgIFJlYWRlciBhbmQgQ2FyZCBFbXVsYXRpb24gUGhhc2VzCioKKiAgVGhlIDxlbT4gXHJlZiBwaE5mY19zUG9sbERldkluZm9fdCBlbnVtIDwvZW0+IGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgCiogIHBoYXNlcyBvZiB0aGUgZGlzY292ZXJ5IHdoZWVsIHJlbGF0ZWQgdG8gc3BlY2lmaWMgcmVhZGVyIHR5cGVzIGFuZCAKKiAgY2FyZCBlbXVsYXRpb24gcGhhc2UKKiAgXG5vdGUgRW5hYmxpbmcgc3BlY2lmaWMgUmVhZGVyIHRlY2hub2xvZ3kgd2hlbiBORkNJUDEgc3BlZWQgaXMgc2V0IGluIHRoZQoqICAgICAgICBwaE5mY19zQUREX0NmZ190IGlzIGltcGxpY2l0bHkgZG9uZSBpbiBIQUwuIFVzZSB0aGlzIHN0cnVjdHVyZSB0byBvbmx5CiogICAgICAgIGVuYWJsZS9kaXNhYmxlIENhcmQgUmVhZGVyIEZ1bmN0aW9uYWxpdHkKKi8KdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc1BvbGxEZXZJbmZvX3QKewogICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIEVuYWJsZUlzbzE0NDQzQSA6IDE7ICAgICAgLyoqPCBGbGFnIHRvIGVuYWJsZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXIgQSBkaXNjb3ZlcnkgKi8KICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBFbmFibGVJc28xNDQ0M0IgOiAxOyAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGVyIEIgZGlzY292ZXJ5ICovCiAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgRW5hYmxlRmVsaWNhMjEyIDogMTsgICAvKio8IEZsYWcgdG8gZW5hYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVsaWNhIDIxMiBkaXNjb3ZlcnkgKi8KICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBFbmFibGVGZWxpY2E0MjQgOiAxOyAgIC8qKjwgRmxhZyB0byBlbmFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZWxpY2EgNDI0IGRpc2NvdmVyeSAqLwogICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIEVuYWJsZUlzbzE1NjkzIDogMTsgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNPIDE1NjkzIGRpc2NvdmVyeSAqLwogICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIEVuYWJsZU5mY0FjdGl2ZSA6IDE7IC8qKjwgRmxhZyB0byBlbmFibGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlIE1vZGUgb2YgTkZDLUlQIGRpc2NvdmVyeS4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1cGRhdGVkIGludGVybmFsbHkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIE5GQy1JUCBzcGVlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIFJGVSA6IDE7ICAgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICBEaXNhYmxlQ2FyZEVtdWxhdGlvbiA6IDE7ICAgIC8qKjwgRmxhZyB0byAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB0aGUgY2FyZCBlbXVsYXRpb24gKi8KfSBwaE5mY19zUG9sbERldkluZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFAyUCBzcGVlZCBmb3IgdGhlIEluaXRpYXRvcgoqCiogIFRoZSA8ZW0+IFxyZWYgcGhOZmNfZVAyUE1vZGVfdCBlbnVtIDwvZW0+IGxpc3RzIGFsbCB0aGUgTkZDSVAxIHNwZWVkcyAKKiAgdG8gYmUgdXNlZCBmb3IgY29uZmlndXJpbmcgdGhlIE5GQ0lQMSBkaXNjb3ZlcnkKKgoqICBcbm90ZSBOb25lLgoqLwp0eXBlZGVmIGVudW0gcGhOZmNfZVAyUE1vZGVfdAp7CiAgICBwaE5mY19lRGVmYXVsdFAyUE1vZGUgID0gMHgwMFUsCiAgICBwaE5mY19lUGFzc2l2ZTEwNiA9IDB4MDFVLAogICAgcGhOZmNfZVBhc3NpdmUyMTIgPSAweDAyVSwKICAgIHBoTmZjX2VQYXNzaXZlNDI0ID0gMHgwNFUsCiAgICBwaE5mY19lQWN0aXZlMTA2ID0gMHgwOFUsCiAgICBwaE5mY19lQWN0aXZlMjEyID0gMHgxMFUsCiAgICBwaE5mY19lQWN0aXZlNDI0ID0gMHgyMFUsCiAgICBwaE5mY19lUDJQX0FMTCAgID0gMHgyN1UsICAvKiBBbGwgUGFzc2l2ZSBhbmQgNDI0IEFjdGl2ZSAqLwogICAgcGhOZmNfZUludmFsaWRQMlBNb2RlID0gMHhGRlUKfSBwaE5mY19lUDJQTW9kZV90OwoKCi8qKiBcaW5ncm91cCBncnBfaGFsX2NvbW1vbgoqCiogIFxicmllZiBJZGVudGl0aWVzIHRoZSB0eXBlIG9mIE5vdGlmaWNhdGlvbgoqCiogIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG5vdGlmaWNhdGlvbiBub3RpZmllZAoqICB0byB0aGUgdXBwZXIgbGF5ZXIuIFRoaXMgY2xhc3NpZmllcyB0aGUgbm90aWZpY2F0aW9uIGludG8gdHdvIHR5cGVzCiogIG9uZSBmb3IgdGhlIGRpc2NvdmVyeSBub3RpZmljYXRpb25zIGFuZCB0aGUgb3RoZXIgZm9yIGFsbCB0aGUgcmVtYWluaW5nCiogIGV2ZW50IG5vdGlmaWNhdGlvbnMKKiAgXG5vdGUgTm9uZS4KKi8KdHlwZWRlZiBlbnVtIHBoTmZjX2VOb3RpZmljYXRpb25UeXBlX3QKewogICAgSU5WQUxJRF9ORkNfTk9USUZJQ0FUSU9OICAgID0gMHgwMFUsIC8qIEludmFsaWQgTm90aWZpY2F0aW9uICovCiAgICBORkNfRElTQ09WRVJZX05PVElGSUNBVElPTiwgICAgICAgICAvKiBSZW1vdGUgRGV2aWNlIERpc2NvdmVyeSBOb3RpZmljYXRpb24gKi8KICAgIE5GQ19FVkVOVF9OT1RJRklDQVRJT04gICAgICAgICAgICAgIC8qIEV2ZW50IE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBvdGhlciBob3N0cyAqLwp9IHBoTmZjX2VOb3RpZmljYXRpb25UeXBlX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCioKKiAgXGJyaWVmIAoqCiogIFxub3RlIE5vbmUuCiovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NVaWNjSW5mb190CnsKICAgIC8qIEFJRCBhbmQgUGFyYW1ldGVyIEluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGlmIHRoZQogICAgICogZXZlbnRUeXBlIGlzIE5GQ19FVlRfVFJBTlNBQ1RJT04uCiAgICAgKi8KICAgIHBoTmZjX3NEYXRhX3QgICAgICAgICAgIGFpZDsKICAgIHBoTmZjX3NEYXRhX3QgICAgICAgICAgIHBhcmFtOwoKfSBwaE5mY19zVWljY0luZm9fdDsKCgovKiogXGluZ3JvdXAgZ3JwX2hhbF9uZmNpCioKKiAgXGJyaWVmIFAyUCBJbmZvcm1hdGlvbiBmb3IgdGhlIEluaXRpYXRvcgoqCiogIFRoZSA8ZW0+IFxyZWYgcGhOZmNfc05mY0lQQ2ZnX3QgPC9lbT4gaG9sZHMgdGhlIFAyUCByZWxhdGVkIGluZm9ybWF0aW9uCiogIHVzZSBieSB0aGUgTkZDIERldmljZSBkdXJpbmcgUDJQIERpc2NvdmVyeSBhbmQgY29ubmVjdGlvbgoqCiogIFxub3RlIE5vbmUuCiovCnR5cGVkZWYgc3RydWN0IHBoTmZjX3NOZmNJUENmZ190IAp7CiAgICAvKiBBVFJfUkVTID0gR2VuZXJhbCBieXRlcyBsZW5ndGgsIE1heCBsZW5ndGggPSA0OCBieXRlcyAqLwogICAgdWludDhfdCAgICAgICAgIGdlbmVyYWxCeXRlc0xlbmd0aDsKICAgIHVpbnQ4X3QgICAgICAgICBnZW5lcmFsQnl0ZXNbUEhIQUxfTUFYX0FUUl9MRU5HVEhdOyAgCgogICAgLyogVE9ETzogVGhpcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZm9yIGFueSBhZGRpdGlvbmFsIHBhcmFtcyovCn0gcGhOZmNfc05mY0lQQ2ZnX3Q7CgoKLyoqIFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCioKKiAgXGJyaWVmIERpc2NvdmVyeSBDb25maWd1cmF0aW9uIE1vZGUKKgoqICBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gY2hvb3NlIHRoZSBEaXNjb3ZlcnkgQ29uZmlndXJhdGlvbgoqICBNb2RlIDotIENvbmZpZ3VyZSBhbmQgU3RhcnQsIFN0b3Agb3IgU3RhcnQgd2l0aCBsYXN0IHNldCAKKiAgY29uZmlndXJhdGlvbgoqICBcbm90ZSBOb25lLgoqLwp0eXBlZGVmIGVudW0gcGhOZmNfZURpc2NvdmVyeUNvbmZpZ01vZGVfdAp7CiAgICBORkNfRElTQ09WRVJZX0NPTkZJRyAgPSAweDAwVSwvKio8IENvbmZpZ3VyZSBkaXNjb3Zlcnkgd2l0aCB2YWx1ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBoTmZjX3NBRERfQ2ZnX3QgYW5kIHN0YXJ0IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcnkgKi8KICAgIE5GQ19ESVNDT1ZFUllfU1RBUlQsICAgICAgICAgLyoqPCBTdGFydCBEaXNjb3Zlcnkgd2l0aCBwcmV2aW91c2x5IHNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gKi8KICAgIE5GQ19ESVNDT1ZFUllfU1RPUCwgICAgICAgICAgLyoqPCBTdG9wIHRoZSBEaXNjb3ZlcnkgKi8KICAgIE5GQ19ESVNDT1ZFUllfUkVTVU1FICAgICAgIC8qKjwgUmVzdW1lIHRoZSBEaXNjb3Zlcnkgd2l0aCBwcmV2aW91c2x5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNldCBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFRoaXMgaXMgdmFsaWQgb25seSB3aGVuIHRoZSBUYXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBpcyBub3QgY29ubmVjdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCn1waE5mY19lRGlzY292ZXJ5Q29uZmlnTW9kZV90OwoKLyoqIFxpbmdyb3VwIGdycF9oYWxfY29tbW9uCioKKiAgXGJyaWVmIFRhcmdldCBvciBUYWcgUmVsZWFzZSBNb2RlCioKKiAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHZhcmlvdXMgbW9kZXMgb2YgcmVsZWFzaW5nIGFuIGFjcXVpcmVkIHRhcmdldCAKKiAgb3IgdGFnLgoqICBcbm90ZSBOb25lLgoqLwp0eXBlZGVmIGVudW0gcGhOZmNfZVJlbGVhc2VUeXBlX3QKewogICAgTkZDX0lOVkFMSURfUkVMRUFTRV9UWVBFICAgID0weDAwVSwvKio8SW52YWxpZCByZWxlYXNlIHR5cGUgKi8KICAgIE5GQ19ESVNDT1ZFUllfUkVTVEFSVCwgICAgICAvKio8IFJlbGVhc2UgY3VycmVudCB0YXJnZXQgYW5kIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydCBkaXNjb3Zlcnkgd2l0aGluIHNhbWUgdGVjaG5vbG9neSovCiAgICBORkNfRElTQ09WRVJZX0NPTlRJTlVFLCAgICAvKio8IFJlbGVhc2UgY3VycmVudCB0YXJnZXQgYW5kIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyeSB3aXRoIG5leHQgdGVjaG5vbG9neSBpbiB0aGUgd2hlZWwgKi8KICAgIE5GQ19TTUFSVE1YX1JFTEVBU0UgICAgLyoqPCBSZWxlYXNlIFNtYXJ0TVggZnJvbSB3aXJlZCBtb2RlIHRvIHByZXZpb3VzIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmlydHVhbCBvciBPZmYpICovCn0gcGhOZmNfZVJlbGVhc2VUeXBlX3Q7CgovKiogXGluZ3JvdXAgIGdycF9oYWxfY29tbW9uCioKKiAgXGJyaWVmIFBvbGwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKgoqICBUaGUgPGVtPiBQb2xsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIDwvZW0+IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSAKKiAgZW5hYmxpbmcgdGhlIHRoZSB0eXBlIG9mIGRpc2NvdmVyeSByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24uIFRoaXMgCiogIHN0cnVjdHVyZSBpcyB0aGUgaW5wdXQgcGFyYW1ldGVyIGZvciB0aGUgZGlzY292ZXJ5IGNhbGwKKgoqICBcbm90ZSBBbGwgbWVtYmVycyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgaW5wdXQgcGFyYW1ldGVycyBbb3V0XS4KKgoqICBcc2EgXHJlZiBwaE5mY19lUDJQTW9kZV90CioKKi8KdHlwZWRlZiBzdHJ1Y3QgcGhOZmNfc0FERF9DZmdfdAp7CiAgICB1bmlvbiAKICAgIHsKICAgICAgICBwaE5mY19zUG9sbERldkluZm9fdCAgICAgICAgUG9sbENmZ0luZm87ICAgICAgICAvKio8ICBFbmFibGUvRGlzYWJsZSBTcGVjaWZpYyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXIgRnVuY3Rpb25hbGl0eSBhbmQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZCBFbXVsYXRpb24gKi8gCiAgICAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIFBvbGxFbmFibGVkOyAgICAgLyoqIENhbiBiZSB1c2VkIHRvIHNldCBwb2xsaW5nICdPZmYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHNldHRpbmcgUG9sbEVuYWJsZWQgdG8gemVybyAqLwoKICAgIH0gUG9sbERldkluZm87CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgRHVyYXRpb247ICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHZpcnR1YWwgb3IgaWRsZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMgaW4gdGhlIHN0ZXAgc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgNDggbWljcm9zZWNvbmRzLklmIGR1cmF0aW9uIGlzIHNldCBsZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuICA0OCBtaWNyb3NlY29uZHMgdGhlbiBkZWZhdWx0IHZhbHVlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLkZvciBtb3JlIGRldGFpbHMgcGxlYXNlIHJlZmVyIFBOIDU0NCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgbWFudWFsKi8KICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICBOZmNJUF9Nb2RlIDsgICAgICAvKio8IFNlbGVjdCB0aGUgUDJQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHMgdXNpbmcgcGhOZmNfZVAyUE1vZGVfdCB0eXBlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGVuYWJsZSBORkMtSVAgRGlzY292ZXJ5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlbGF0ZWQgUmVhZGVyIFR5cGUgd2lsbCBiZSBpbXBsaWNpdGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCAqLwogICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgIE5mY0lQX1RhcmdldF9Nb2RlIDsKICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICBOZmNJUF9UZ3RfRGlzYWJsZTsgICAvKio8IEZsYWcgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIE5GQ0lQMSBUQVJHRVQgKi8KfSBwaE5mY19zQUREX0NmZ190OwoKLypAfSovCgojZW5kaWYgLyogUEhORkNUWVBFUyAqLwoK