LyoKICogQ29weXJpZ2h0IChDKSAyMDA3IEhhYWtvbiBTcG9yc2hlaW0gPGhha29uLnNwb3JzaGVpbUB0YW5kYmVyZy5jb20+CiAqICAgICAgICAgICAgICAgMjAwOCBPbGUgQW5kcukgVmFkbGEgUmF2buVzIDxvbGUuYW5kcmUucmF2bmFzQHRhbmRiZXJnLmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLAogKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICovCgojaWZuZGVmIF9fS1NWSURFT0hFTFBFUlNfSF9fCiNkZWZpbmUgX19LU1ZJREVPSEVMUEVSU19IX18KCiNpbmNsdWRlIDxnc3QvZ3N0Lmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxrcy5oPgojaW5jbHVkZSA8a3NtZWRpYS5oPgoKR19CRUdJTl9ERUNMUwoKREVGSU5FX0dVSUQoTUVESUFTVUJUWVBFX0k0MjAsIDB4MzAzMjM0NDksIDB4MDAwMCwgMHgwMDEwLCAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxKTsKCnR5cGVkZWYgc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlIEtzVmlkZW9NZWRpYVR5cGU7CgovKioKICogQSBzdHJ1Y3R1cmUgdGhhdCBjb250YWluIG1ldGFkYXRhIGFib3V0IGNhcGFiaWxpdGllcwogKiBmb3IgYm90aCBLUyBhbmQgR1N0cmVhbWVyIGZvciB2aWRlbyBvbmx5LgogKi8Kc3RydWN0IF9Lc1ZpZGVvTWVkaWFUeXBlCnsKICBndWludCBwaW5faWQ7CgogIGNvbnN0IEtTREFUQVJBTkdFICogcmFuZ2U7CiAgY29uc3QgS1NfVklERU9fU1RSRUFNX0NPTkZJR19DQVBTIHZzY2M7CgogIGd1aW50OCAqIGZvcm1hdDsKICBndWludCBmb3JtYXRfc2l6ZTsKCiAgZ3VpbnQgc2FtcGxlX3NpemU7CgogIEdzdENhcHMgKiB0cmFuc2xhdGVkX2NhcHM7Cn07CgpHTGlzdCAqIGtzX3ZpZGVvX2RldmljZV9saXN0X3NvcnRfY2FtZXJhc19maXJzdCAoR0xpc3QgKiBkZXZpY2VzKTsKCktzVmlkZW9NZWRpYVR5cGUgKiBrc192aWRlb19tZWRpYV90eXBlX2R1cCAoS3NWaWRlb01lZGlhVHlwZSAqIG1lZGlhX3R5cGUpOwp2b2lkIGtzX3ZpZGVvX21lZGlhX3R5cGVfZnJlZSAoS3NWaWRlb01lZGlhVHlwZSAqIG1lZGlhX3R5cGUpOwpHTGlzdCAqIGtzX3ZpZGVvX3Byb2JlX2ZpbHRlcl9mb3JfY2FwcyAoSEFORExFIGZpbHRlcl9oYW5kbGUpOwpLU1BJTl9DT05ORUNUICoga3NfdmlkZW9fY3JlYXRlX3Bpbl9jb25uX2Zyb21fbWVkaWFfdHlwZSAoS3NWaWRlb01lZGlhVHlwZSAqIG1lZGlhX3R5cGUpOwpnYm9vbGVhbiBrc192aWRlb19maXhhdGVfbWVkaWFfdHlwZSAoY29uc3QgS1NEQVRBUkFOR0UgKiByYW5nZSwgZ3VpbnQ4ICogZm9ybWF0LCBnaW50IHdpZHRoLCBnaW50IGhlaWdodCwgZ2ludCBmcHNfbiwgZ2ludCBmcHNfZCk7CgpHc3RDYXBzICoga3NfdmlkZW9fZ2V0X2FsbF9jYXBzICh2b2lkKTsKCkdfRU5EX0RFQ0xTCgojZW5kaWYgLyogX19LU1ZJREVPSEVMUEVSU19IX18gKi8K