LyoKICogQ29weXJpZ2h0IChDKSAyMDA4IE9sZSBBbmRy6SBWYWRsYSBSYXZu5XMgPG9sZS5hbmRyZS5yYXZuYXNAdGFuZGJlcmcuY29tPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsCiAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogKi8KCiNpZm5kZWYgX19LU0hFTFBFUlNfSF9fCiNkZWZpbmUgX19LU0hFTFBFUlNfSF9fCgojaW5jbHVkZSA8Z2xpYi5oPgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8bW1zeXN0ZW0uaD4KI2luY2x1ZGUgPGtzLmg+CgpHX0JFR0lOX0RFQ0xTCgp0eXBlZGVmIHN0cnVjdCBfS3NEZXZpY2VFbnRyeSBLc0RldmljZUVudHJ5OwoKc3RydWN0IF9Lc0RldmljZUVudHJ5CnsKICBndWludCBpbmRleDsKICBnY2hhciAqIG5hbWU7CiAgZ2NoYXIgKiBwYXRoOwp9OwoKZ2Jvb2xlYW4ga3NfaXNfdmFsaWRfaGFuZGxlIChIQU5ETEUgaCk7CgpHTGlzdCAqIGtzX2VudW1lcmF0ZV9kZXZpY2VzIChjb25zdCBHVUlEICogZGV2dHlwZSwgY29uc3QgR1VJRCAqIGRpcmVjdGlvbl9jYXRlZ29yeSk7CnZvaWQga3NfZGV2aWNlX2VudHJ5X2ZyZWUgKEtzRGV2aWNlRW50cnkgKiBlbnRyeSk7CnZvaWQga3NfZGV2aWNlX2xpc3RfZnJlZSAoR0xpc3QgKiBkZXZpY2VzKTsKCmdib29sZWFuIGtzX2ZpbHRlcl9nZXRfcGluX3Byb3BlcnR5IChIQU5ETEUgZmlsdGVyX2hhbmRsZSwgZ3Vsb25nIHBpbl9pZCwgR1VJRCBwcm9wX3NldCwgZ3Vsb25nIHByb3BfaWQsIGdwb2ludGVyIHZhbHVlLCBndWxvbmcgdmFsdWVfc2l6ZSwgZ3Vsb25nICogZXJyb3IpOwpnYm9vbGVhbiBrc19maWx0ZXJfZ2V0X3Bpbl9wcm9wZXJ0eV9tdWx0aSAoSEFORExFIGZpbHRlcl9oYW5kbGUsIGd1bG9uZyBwaW5faWQsIEdVSUQgcHJvcF9zZXQsIGd1bG9uZyBwcm9wX2lkLCBLU01VTFRJUExFX0lURU0gKiogaXRlbXMsIGd1bG9uZyAqIGVycm9yKTsKCmdib29sZWFuIGtzX29iamVjdF9xdWVyeV9wcm9wZXJ0eSAoSEFORExFIGhhbmRsZSwgR1VJRCBwcm9wX3NldCwgZ3Vsb25nIHByb3BfaWQsIGd1bG9uZyBwcm9wX2ZsYWdzLCBncG9pbnRlciAqIHZhbHVlLCBndWxvbmcgKiB2YWx1ZV9zaXplLCBndWxvbmcgKiBlcnJvcik7Cmdib29sZWFuIGtzX29iamVjdF9nZXRfcHJvcGVydHkgKEhBTkRMRSBoYW5kbGUsIEdVSUQgcHJvcF9zZXQsIGd1bG9uZyBwcm9wX2lkLCBncG9pbnRlciAqIHZhbHVlLCBndWxvbmcgKiB2YWx1ZV9zaXplLCBndWxvbmcgKiBlcnJvcik7Cmdib29sZWFuIGtzX29iamVjdF9zZXRfcHJvcGVydHkgKEhBTkRMRSBoYW5kbGUsIEdVSUQgcHJvcF9zZXQsIGd1bG9uZyBwcm9wX2lkLCBncG9pbnRlciB2YWx1ZSwgZ3Vsb25nIHZhbHVlX3NpemUsIGd1bG9uZyAqIGVycm9yKTsKCmdib29sZWFuIGtzX29iamVjdF9nZXRfc3VwcG9ydGVkX3Byb3BlcnR5X3NldHMgKEhBTkRMRSBoYW5kbGUsIEdVSUQgKiogcHJvcHNldHMsIGd1bG9uZyAqIGxlbik7CgpnYm9vbGVhbiBrc19vYmplY3Rfc2V0X2Nvbm5lY3Rpb25fc3RhdGUgKEhBTkRMRSBoYW5kbGUsIEtTU1RBVEUgc3RhdGUsIGd1bG9uZyAqIGVycm9yKTsKCmdjaGFyICoga3NfZ3VpZF90b19zdHJpbmcgKGNvbnN0IEdVSUQgKiBndWlkKTsKY29uc3QgZ2NoYXIgKiBrc19zdGF0ZV90b19zdHJpbmcgKEtTU1RBVEUgc3RhdGUpOwpnY2hhciAqIGtzX29wdGlvbnNfZmxhZ3NfdG9fc3RyaW5nIChndWxvbmcgZmxhZ3MpOwpnY2hhciAqIGtzX3Byb3BlcnR5X3NldF90b19zdHJpbmcgKGNvbnN0IEdVSUQgKiBndWlkKTsKCkdfRU5EX0RFQ0xTCgojZW5kaWYgLyogX19LU0hFTFBFUlNfSF9fICovCg==